oj 3.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +104 -0
  4. data/ext/oj/buf.h +103 -0
  5. data/ext/oj/cache8.c +107 -0
  6. data/ext/oj/cache8.h +48 -0
  7. data/ext/oj/circarray.c +68 -0
  8. data/ext/oj/circarray.h +23 -0
  9. data/ext/oj/code.c +235 -0
  10. data/ext/oj/code.h +42 -0
  11. data/ext/oj/compat.c +299 -0
  12. data/ext/oj/custom.c +1218 -0
  13. data/ext/oj/dump.c +1249 -0
  14. data/ext/oj/dump.h +96 -0
  15. data/ext/oj/dump_compat.c +975 -0
  16. data/ext/oj/dump_leaf.c +252 -0
  17. data/ext/oj/dump_object.c +844 -0
  18. data/ext/oj/dump_strict.c +434 -0
  19. data/ext/oj/encode.h +45 -0
  20. data/ext/oj/err.c +57 -0
  21. data/ext/oj/err.h +70 -0
  22. data/ext/oj/extconf.rb +53 -0
  23. data/ext/oj/fast.c +1771 -0
  24. data/ext/oj/hash.c +163 -0
  25. data/ext/oj/hash.h +46 -0
  26. data/ext/oj/hash_test.c +512 -0
  27. data/ext/oj/mimic_json.c +890 -0
  28. data/ext/oj/object.c +775 -0
  29. data/ext/oj/odd.c +231 -0
  30. data/ext/oj/odd.h +44 -0
  31. data/ext/oj/oj.c +1723 -0
  32. data/ext/oj/oj.h +387 -0
  33. data/ext/oj/parse.c +1134 -0
  34. data/ext/oj/parse.h +112 -0
  35. data/ext/oj/rails.c +1528 -0
  36. data/ext/oj/rails.h +21 -0
  37. data/ext/oj/reader.c +231 -0
  38. data/ext/oj/reader.h +151 -0
  39. data/ext/oj/resolve.c +102 -0
  40. data/ext/oj/resolve.h +14 -0
  41. data/ext/oj/rxclass.c +147 -0
  42. data/ext/oj/rxclass.h +27 -0
  43. data/ext/oj/saj.c +714 -0
  44. data/ext/oj/scp.c +224 -0
  45. data/ext/oj/sparse.c +924 -0
  46. data/ext/oj/stream_writer.c +363 -0
  47. data/ext/oj/strict.c +212 -0
  48. data/ext/oj/string_writer.c +534 -0
  49. data/ext/oj/trace.c +79 -0
  50. data/ext/oj/trace.h +28 -0
  51. data/ext/oj/util.c +136 -0
  52. data/ext/oj/util.h +19 -0
  53. data/ext/oj/val_stack.c +118 -0
  54. data/ext/oj/val_stack.h +185 -0
  55. data/ext/oj/wab.c +631 -0
  56. data/lib/oj.rb +21 -0
  57. data/lib/oj/active_support_helper.rb +41 -0
  58. data/lib/oj/bag.rb +88 -0
  59. data/lib/oj/easy_hash.rb +52 -0
  60. data/lib/oj/error.rb +22 -0
  61. data/lib/oj/json.rb +176 -0
  62. data/lib/oj/mimic.rb +267 -0
  63. data/lib/oj/saj.rb +66 -0
  64. data/lib/oj/schandler.rb +142 -0
  65. data/lib/oj/state.rb +131 -0
  66. data/lib/oj/version.rb +5 -0
  67. data/pages/Advanced.md +22 -0
  68. data/pages/Compatibility.md +25 -0
  69. data/pages/Custom.md +23 -0
  70. data/pages/Encoding.md +65 -0
  71. data/pages/JsonGem.md +79 -0
  72. data/pages/Modes.md +155 -0
  73. data/pages/Options.md +287 -0
  74. data/pages/Rails.md +155 -0
  75. data/pages/Security.md +20 -0
  76. data/pages/WAB.md +13 -0
  77. data/test/_test_active.rb +76 -0
  78. data/test/_test_active_mimic.rb +96 -0
  79. data/test/_test_mimic_rails.rb +126 -0
  80. data/test/activerecord/result_test.rb +27 -0
  81. data/test/activesupport4/decoding_test.rb +108 -0
  82. data/test/activesupport4/encoding_test.rb +531 -0
  83. data/test/activesupport4/test_helper.rb +41 -0
  84. data/test/activesupport5/abstract_unit.rb +45 -0
  85. data/test/activesupport5/decoding_test.rb +133 -0
  86. data/test/activesupport5/encoding_test.rb +500 -0
  87. data/test/activesupport5/encoding_test_cases.rb +98 -0
  88. data/test/activesupport5/test_helper.rb +72 -0
  89. data/test/activesupport5/time_zone_test_helpers.rb +39 -0
  90. data/test/activesupport6/abstract_unit.rb +44 -0
  91. data/test/activesupport6/decoding_test.rb +133 -0
  92. data/test/activesupport6/encoding_test.rb +507 -0
  93. data/test/activesupport6/encoding_test_cases.rb +98 -0
  94. data/test/activesupport6/test_common.rb +17 -0
  95. data/test/activesupport6/test_helper.rb +163 -0
  96. data/test/activesupport6/time_zone_test_helpers.rb +39 -0
  97. data/test/bar.rb +35 -0
  98. data/test/baz.rb +16 -0
  99. data/test/files.rb +29 -0
  100. data/test/foo.rb +52 -0
  101. data/test/helper.rb +26 -0
  102. data/test/isolated/shared.rb +308 -0
  103. data/test/isolated/test_mimic_after.rb +13 -0
  104. data/test/isolated/test_mimic_alone.rb +12 -0
  105. data/test/isolated/test_mimic_as_json.rb +45 -0
  106. data/test/isolated/test_mimic_before.rb +13 -0
  107. data/test/isolated/test_mimic_define.rb +28 -0
  108. data/test/isolated/test_mimic_rails_after.rb +22 -0
  109. data/test/isolated/test_mimic_rails_before.rb +21 -0
  110. data/test/isolated/test_mimic_redefine.rb +15 -0
  111. data/test/json_gem/json_addition_test.rb +216 -0
  112. data/test/json_gem/json_common_interface_test.rb +148 -0
  113. data/test/json_gem/json_encoding_test.rb +107 -0
  114. data/test/json_gem/json_ext_parser_test.rb +20 -0
  115. data/test/json_gem/json_fixtures_test.rb +35 -0
  116. data/test/json_gem/json_generator_test.rb +383 -0
  117. data/test/json_gem/json_generic_object_test.rb +90 -0
  118. data/test/json_gem/json_parser_test.rb +470 -0
  119. data/test/json_gem/json_string_matching_test.rb +42 -0
  120. data/test/json_gem/test_helper.rb +18 -0
  121. data/test/perf.rb +107 -0
  122. data/test/perf_compat.rb +130 -0
  123. data/test/perf_fast.rb +164 -0
  124. data/test/perf_file.rb +64 -0
  125. data/test/perf_object.rb +138 -0
  126. data/test/perf_saj.rb +109 -0
  127. data/test/perf_scp.rb +151 -0
  128. data/test/perf_simple.rb +287 -0
  129. data/test/perf_strict.rb +145 -0
  130. data/test/perf_wab.rb +131 -0
  131. data/test/prec.rb +23 -0
  132. data/test/sample.rb +54 -0
  133. data/test/sample/change.rb +14 -0
  134. data/test/sample/dir.rb +19 -0
  135. data/test/sample/doc.rb +36 -0
  136. data/test/sample/file.rb +48 -0
  137. data/test/sample/group.rb +16 -0
  138. data/test/sample/hasprops.rb +16 -0
  139. data/test/sample/layer.rb +12 -0
  140. data/test/sample/line.rb +20 -0
  141. data/test/sample/oval.rb +10 -0
  142. data/test/sample/rect.rb +10 -0
  143. data/test/sample/shape.rb +35 -0
  144. data/test/sample/text.rb +20 -0
  145. data/test/sample_json.rb +37 -0
  146. data/test/test_compat.rb +502 -0
  147. data/test/test_custom.rb +527 -0
  148. data/test/test_debian.rb +53 -0
  149. data/test/test_fast.rb +470 -0
  150. data/test/test_file.rb +239 -0
  151. data/test/test_gc.rb +49 -0
  152. data/test/test_hash.rb +29 -0
  153. data/test/test_integer_range.rb +72 -0
  154. data/test/test_null.rb +376 -0
  155. data/test/test_object.rb +1027 -0
  156. data/test/test_rails.rb +26 -0
  157. data/test/test_saj.rb +186 -0
  158. data/test/test_scp.rb +433 -0
  159. data/test/test_strict.rb +433 -0
  160. data/test/test_various.rb +719 -0
  161. data/test/test_wab.rb +307 -0
  162. data/test/test_writer.rb +380 -0
  163. data/test/tests.rb +25 -0
  164. data/test/tests_mimic.rb +14 -0
  165. data/test/tests_mimic_addition.rb +7 -0
  166. data/test/zoo.rb +13 -0
  167. metadata +381 -0
@@ -0,0 +1,26 @@
1
+ # Ubuntu does not accept arguments to ruby when called using env. To get warnings to show up the -w options is
2
+ # required. That can be set in the RUBYOPT environment variable.
3
+ # export RUBYOPT=-w
4
+
5
+ $VERBOSE = true
6
+
7
+ %w(lib ext test).each do |dir|
8
+ $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
9
+ end
10
+
11
+ require 'minitest'
12
+ require 'minitest/autorun'
13
+ require 'stringio'
14
+ require 'date'
15
+ require 'bigdecimal'
16
+ require 'pp'
17
+ require 'oj'
18
+
19
+ $ruby = RUBY_DESCRIPTION.split(' ')[0]
20
+ $ruby = 'ree' if 'ruby' == $ruby && RUBY_DESCRIPTION.include?('Ruby Enterprise Edition')
21
+
22
+ class Range
23
+ def to_hash()
24
+ { 'begin' => self.begin, 'end' => self.end, 'exclude_end' => self.exclude_end? }
25
+ end
26
+ end
@@ -0,0 +1,308 @@
1
+ # encoding: UTF-8
2
+
3
+ # The rails tests set this to true. Both Rails and the JSON gem monkey patch the
4
+ # as_json methods on several base classes. Depending on which one replaces the
5
+ # method last the behavior will be different. Oj.mimic_JSON abides by the same
6
+ # conflicting behavior and the tests reflect that.
7
+ $rails_monkey = false unless defined?($rails_monkey)
8
+
9
+ class SharedMimicTest < Minitest::Test
10
+ class Jam
11
+ attr_accessor :x, :y
12
+
13
+ def initialize(x, y)
14
+ @x = x
15
+ @y = y
16
+ end
17
+
18
+ def eql?(o)
19
+ self.class == o.class && @x == o.x && @y == o.y
20
+ end
21
+ alias == eql?
22
+
23
+ def as_json()
24
+ {"json_class" => self.class.to_s,"x" => @x,"y" => @y}
25
+ end
26
+
27
+ def self.json_create(h)
28
+ self.new(h['x'], h['y'])
29
+ end
30
+
31
+ end # Jam
32
+
33
+ def setup
34
+ @default_options = Oj.default_options
35
+ @time = Time.at(1400000000).utc
36
+ @expected_time_string =
37
+ if defined?(Rails)
38
+ %{"2014-05-13T16:53:20.000Z"}
39
+ else
40
+ %{"2014-05-13 16:53:20 UTC"}
41
+ end
42
+ end
43
+
44
+ def teardown
45
+ Oj.default_options = @default_options
46
+ end
47
+
48
+ # exception
49
+ def test_exception
50
+ begin
51
+ JSON.parse("{")
52
+ puts "Failed"
53
+ rescue JSON::ParserError
54
+ assert(true)
55
+ rescue Exception
56
+ assert(false, 'Expected a JSON::ParserError')
57
+ end
58
+ end
59
+
60
+ # dump
61
+ def test_dump_string
62
+ json = JSON.dump([1, true, nil, @time])
63
+ if $rails_monkey
64
+ assert_equal(%{[1,true,null,#{@expected_time_string}]}, json)
65
+ else
66
+ assert_equal(%{[1,true,null,{"json_class":"Time","s":1400000000,"n":0}]}, json)
67
+ end
68
+ end
69
+
70
+ def test_dump_with_options
71
+ Oj.default_options= {:indent => 2} # JSON this will not change anything
72
+ json = JSON.dump([1, true, nil, @time])
73
+ if $rails_monkey
74
+ assert_equal(%{[
75
+ 1,
76
+ true,
77
+ null,
78
+ #{@expected_time_string}
79
+ ]
80
+ }, json)
81
+ else
82
+ assert_equal(%{[
83
+ 1,
84
+ true,
85
+ null,
86
+ {
87
+ "json_class":"Time",
88
+ "s":1400000000,
89
+ "n\":0
90
+ }
91
+ ]
92
+ }, json)
93
+ end
94
+ end
95
+
96
+ def test_dump_io
97
+ s = StringIO.new()
98
+ json = JSON.dump([1, true, nil, @time], s)
99
+ assert_equal(s, json)
100
+ if $rails_monkey
101
+ assert_equal(%{[1,true,null,#{@expected_time_string}]}, s.string)
102
+ else
103
+ assert_equal(%{[1,true,null,{"json_class":"Time","s":1400000000,"n":0}]}, s.string)
104
+ end
105
+ end
106
+ # TBD options
107
+
108
+ def test_dump_struct
109
+ # anonymous Struct not supported by json so name it
110
+ if Object.const_defined?("Struct::Abc")
111
+ s = Struct::Abc
112
+ else
113
+ s = Struct.new("Abc", :a, :b, :c)
114
+ end
115
+ o = s.new(1, 'two', [true, false])
116
+ json = JSON.dump(o)
117
+ if o.respond_to?(:as_json)
118
+ if $rails_monkey
119
+ assert_equal(%|{"a":1,"b":"two","c":[true,false]}|, json)
120
+ else
121
+ assert_equal(%|{"json_class":"Struct::Abc","v":[1,"two",[true,false]]}|, json)
122
+ end
123
+ else
124
+ j = '"' + o.to_s.gsub('"', '\\"') + '"'
125
+ assert_equal(j, json)
126
+ end
127
+ end
128
+
129
+ # load
130
+ def test_load_string
131
+ json = %{{"a":1,"b":[true,false]}}
132
+ obj = JSON.load(json)
133
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
134
+ end
135
+
136
+ def test_load_io
137
+ json = %{{"a":1,"b":[true,false]}}
138
+ obj = JSON.load(StringIO.new(json))
139
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
140
+ end
141
+
142
+ def test_load_proc
143
+ Oj.mimic_JSON
144
+ children = []
145
+ json = %{{"a":1,"b":[true,false]}}
146
+ if 'rubinius' == $ruby
147
+ obj = JSON.load(json) {|x| children << x }
148
+ else
149
+ p = Proc.new {|x| children << x }
150
+ obj = JSON.load(json, p)
151
+ end
152
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
153
+ assert([1, true, false, [true, false], { 'a' => 1, 'b' => [true, false]}] == children ||
154
+ [true, false, [true, false], 1, { 'a' => 1, 'b' => [true, false]}] == children,
155
+ "children don't match")
156
+ end
157
+
158
+ def test_parse_with_quirks_mode
159
+ json = %{null}
160
+ assert_equal(nil, JSON.parse(json, :quirks_mode => true))
161
+ assert_raises(JSON::ParserError) { JSON.parse(json, :quirks_mode => false) }
162
+ assert_raises(JSON::ParserError) { JSON.parse(json) }
163
+ end
164
+
165
+ def test_parse_with_empty_string
166
+ Oj.mimic_JSON
167
+ assert_raises(JSON::ParserError) { JSON.parse(' ') }
168
+ assert_raises(JSON::ParserError) { JSON.parse("\t\t\n ") }
169
+ end
170
+
171
+ # []
172
+ def test_bracket_load
173
+ json = %{{"a":1,"b":[true,false]}}
174
+ obj = JSON[json]
175
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
176
+ end
177
+
178
+ def test_bracket_dump
179
+ json = JSON[[1, true, nil]]
180
+ assert_equal(%{[1,true,null]}, json)
181
+ end
182
+
183
+ # generate
184
+ def test_generate
185
+ json = JSON.generate({ 'a' => 1, 'b' => [true, false]})
186
+ assert(%{{"a":1,"b":[true,false]}} == json ||
187
+ %{{"b":[true,false],"a":1}} == json)
188
+ end
189
+ def test_generate_options
190
+ json = JSON.generate({ 'a' => 1, 'b' => [true, false]},
191
+ :indent => "--",
192
+ :array_nl => "\n",
193
+ :object_nl => "#\n",
194
+ :space => "*",
195
+ :space_before => "~")
196
+ assert(%{{#
197
+ --"a"~:*1,#
198
+ --"b"~:*[
199
+ ----true,
200
+ ----false
201
+ --]#
202
+ }} == json ||
203
+ %{{#
204
+ --"b"~:*[
205
+ ----true,
206
+ ----false
207
+ --],#
208
+ --"a"~:*1#
209
+ }} == json)
210
+
211
+ end
212
+
213
+ # fast_generate
214
+ def test_fast_generate
215
+ json = JSON.generate({ 'a' => 1, 'b' => [true, false]})
216
+ assert(%{{"a":1,"b":[true,false]}} == json ||
217
+ %{{"b":[true,false],"a":1}} == json)
218
+ end
219
+
220
+ # pretty_generate
221
+ def test_pretty_generate
222
+ json = JSON.pretty_generate({ 'a' => 1, 'b' => [true, false]})
223
+ assert(%{{
224
+ "a": 1,
225
+ "b": [
226
+ true,
227
+ false
228
+ ]
229
+ }} == json ||
230
+ %{{
231
+ "b": [
232
+ true,
233
+ false
234
+ ],
235
+ "a": 1
236
+ }} == json)
237
+ end
238
+
239
+ # parse
240
+ def test_parse
241
+ json = %{{"a":1,"b":[true,false]}}
242
+ obj = JSON.parse(json)
243
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
244
+ end
245
+ def test_parse_sym_names
246
+ json = %{{"a":1,"b":[true,false]}}
247
+ obj = JSON.parse(json, :symbolize_names => true)
248
+ assert_equal({ :a => 1, :b => [true, false]}, obj)
249
+ end
250
+ def test_parse_additions
251
+ jam = Jam.new(true, 58)
252
+ json = Oj.dump(jam, :mode => :compat, :use_to_json => true)
253
+ obj = JSON.parse(json)
254
+ assert_equal(jam, obj)
255
+ obj = JSON.parse(json, :create_additions => true)
256
+ assert_equal(jam, obj)
257
+ obj = JSON.parse(json, :create_additions => false)
258
+ assert_equal({'json_class' => 'SharedMimicTest::Jam', 'x' => true, 'y' => 58}, obj)
259
+ json.gsub!('json_class', 'kson_class')
260
+ JSON.create_id = 'kson_class'
261
+ obj = JSON.parse(json, :create_additions => true)
262
+ JSON.create_id = 'json_class'
263
+ assert_equal(jam, obj)
264
+ end
265
+ def test_parse_bang
266
+ json = %{{"a":1,"b":[true,false]}}
267
+ obj = JSON.parse!(json)
268
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
269
+ end
270
+
271
+ # recurse_proc
272
+ def test_recurse_proc
273
+ children = []
274
+ JSON.recurse_proc({ 'a' => 1, 'b' => [true, false]}) { |x| children << x }
275
+ # JRuby 1.7.0 rb_yield() is broken and converts the [true, false] array into true
276
+ unless 'jruby' == $ruby
277
+ assert([1, true, false, [true, false], { 'a' => 1, 'b' => [true, false]}] == children ||
278
+ [true, false, [true, false], 1, { 'b' => [true, false], 'a' => 1}] == children)
279
+ end
280
+ end
281
+
282
+ # make sure to_json is defined for object.
283
+ def test_mimic_to_json
284
+ {'a' => 1}.to_json()
285
+ Object.new().to_json()
286
+ end
287
+ end # SharedMimicTest
288
+
289
+ if defined?(ActiveSupport)
290
+ class SharedMimicRailsTest < SharedMimicTest
291
+ def test_activesupport_exception
292
+ begin
293
+ ActiveSupport::JSON.decode("{")
294
+ puts "Failed"
295
+ rescue ActiveSupport::JSON.parse_error
296
+ assert(true)
297
+ rescue Exception
298
+ assert(false, 'Expected a JSON::ParserError')
299
+ end
300
+ end
301
+
302
+ def test_activesupport_encode
303
+ Oj.default_options= {:indent => 0}
304
+ json = ActiveSupport::JSON.encode([1, true, nil])
305
+ assert_equal(%{[1,true,null]}, json)
306
+ end
307
+ end # SharedMimicRailsTest
308
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+ require 'isolated/shared'
8
+
9
+ require 'json'
10
+ Oj.mimic_JSON
11
+
12
+ class MimicAfter < SharedMimicTest
13
+ end # MimicAfter
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+ require 'isolated/shared'
8
+
9
+ Oj.mimic_JSON
10
+
11
+ class MimicAlone < SharedMimicTest
12
+ end # MimicAlone
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+
6
+ require 'helper'
7
+ require 'oj'
8
+
9
+ class ObjectFolder < Minitest::Test
10
+ class Raccoon
11
+ attr_accessor :name
12
+
13
+ def initialize(name)
14
+ @name = name
15
+ end
16
+
17
+ def as_json(options={})
18
+ {:name => @name}.merge(options)
19
+ end
20
+ end
21
+
22
+ def setup
23
+ @default_options = Oj.default_options
24
+ end
25
+
26
+ def teardown
27
+ Oj.default_options = @default_options
28
+ end
29
+
30
+ def test_as_json_options
31
+ Oj.mimic_JSON()
32
+ raccoon = Raccoon.new('Rocket')
33
+ json = raccoon.to_json()
34
+ assert_equal(json, '{"name":"Rocket"}')
35
+
36
+ json = raccoon.to_json(:occupation => 'bounty hunter')
37
+ # depending on the ruby version the order of the hash members maybe different.
38
+ if (json.start_with?('{"name'))
39
+ assert_equal(json, '{"name":"Rocket","occupation":"bounty hunter"}')
40
+ else
41
+ assert_equal(json, '{"occupation":"bounty hunter","name":"Rocket"}')
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+ require 'isolated/shared'
8
+
9
+ Oj.mimic_JSON
10
+ require 'json'
11
+
12
+ class MimicBefore < SharedMimicTest
13
+ end # MimicBefore
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+
8
+ class MimicDefine < Minitest::Test
9
+ def test_mimic_define
10
+ assert(defined?(JSON).nil?)
11
+ Oj.mimic_JSON
12
+
13
+ # Test constants
14
+ assert(!defined?(JSON).nil?)
15
+ assert(!defined?(JSON::ParserError).nil?)
16
+ assert(Object.respond_to?(:to_json))
17
+
18
+ # Test loaded features
19
+ assert(!require('json'))
20
+
21
+ begin
22
+ require('json_spec')
23
+ assert(false, '** should raise LoadError')
24
+ rescue LoadError
25
+ assert(true)
26
+ end
27
+ end
28
+ end # MimicSingle