json-maglev- 1.5.4

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 (139) hide show
  1. data/CHANGES +200 -0
  2. data/COPYING +58 -0
  3. data/COPYING-json-jruby +57 -0
  4. data/GPL +340 -0
  5. data/Gemfile +7 -0
  6. data/README-json-jruby.markdown +33 -0
  7. data/README.rdoc +358 -0
  8. data/Rakefile +407 -0
  9. data/TODO +1 -0
  10. data/VERSION +1 -0
  11. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +52 -0
  12. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
  13. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
  14. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
  15. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
  16. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
  17. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
  18. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +261 -0
  19. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
  20. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
  21. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
  22. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
  23. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
  24. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
  25. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +262 -0
  26. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
  27. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
  28. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +82 -0
  29. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +34 -0
  30. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
  31. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
  32. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +81 -0
  33. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
  34. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
  35. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +82 -0
  36. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
  37. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
  38. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +82 -0
  39. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
  40. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
  41. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +82 -0
  42. data/benchmarks/generator2_benchmark.rb +222 -0
  43. data/benchmarks/generator_benchmark.rb +224 -0
  44. data/benchmarks/ohai.json +1216 -0
  45. data/benchmarks/ohai.ruby +1 -0
  46. data/benchmarks/parser2_benchmark.rb +251 -0
  47. data/benchmarks/parser_benchmark.rb +259 -0
  48. data/bin/edit_json.rb +9 -0
  49. data/bin/prettify_json.rb +48 -0
  50. data/data/example.json +1 -0
  51. data/data/index.html +38 -0
  52. data/data/prototype.js +4184 -0
  53. data/ext/json/ext/generator/extconf.rb +20 -0
  54. data/ext/json/ext/generator/generator.c +1414 -0
  55. data/ext/json/ext/generator/generator.h +196 -0
  56. data/ext/json/ext/parser/extconf.rb +16 -0
  57. data/ext/json/ext/parser/parser.c +1996 -0
  58. data/ext/json/ext/parser/parser.h +82 -0
  59. data/ext/json/ext/parser/parser.rl +853 -0
  60. data/install.rb +26 -0
  61. data/java/lib/bytelist-1.0.6.jar +0 -0
  62. data/java/lib/jcodings.jar +0 -0
  63. data/java/src/json/ext/ByteListTranscoder.java +167 -0
  64. data/java/src/json/ext/Generator.java +437 -0
  65. data/java/src/json/ext/GeneratorMethods.java +232 -0
  66. data/java/src/json/ext/GeneratorService.java +43 -0
  67. data/java/src/json/ext/GeneratorState.java +473 -0
  68. data/java/src/json/ext/OptionsReader.java +119 -0
  69. data/java/src/json/ext/Parser.java +2314 -0
  70. data/java/src/json/ext/Parser.rl +844 -0
  71. data/java/src/json/ext/ParserService.java +35 -0
  72. data/java/src/json/ext/RuntimeInfo.java +121 -0
  73. data/java/src/json/ext/StringDecoder.java +166 -0
  74. data/java/src/json/ext/StringEncoder.java +106 -0
  75. data/java/src/json/ext/Utils.java +89 -0
  76. data/json-java.gemspec +22 -0
  77. data/json.gemspec +41 -0
  78. data/json_pure.gemspec +46 -0
  79. data/lib/json.rb +62 -0
  80. data/lib/json/Array.xpm +21 -0
  81. data/lib/json/FalseClass.xpm +21 -0
  82. data/lib/json/Hash.xpm +21 -0
  83. data/lib/json/Key.xpm +73 -0
  84. data/lib/json/NilClass.xpm +21 -0
  85. data/lib/json/Numeric.xpm +28 -0
  86. data/lib/json/String.xpm +96 -0
  87. data/lib/json/TrueClass.xpm +21 -0
  88. data/lib/json/add/core.rb +243 -0
  89. data/lib/json/add/rails.rb +8 -0
  90. data/lib/json/common.rb +423 -0
  91. data/lib/json/editor.rb +1369 -0
  92. data/lib/json/ext.rb +28 -0
  93. data/lib/json/json.xpm +1499 -0
  94. data/lib/json/pure.rb +15 -0
  95. data/lib/json/pure/generator.rb +442 -0
  96. data/lib/json/pure/parser.rb +320 -0
  97. data/lib/json/version.rb +8 -0
  98. data/tests/fixtures/fail1.json +1 -0
  99. data/tests/fixtures/fail10.json +1 -0
  100. data/tests/fixtures/fail11.json +1 -0
  101. data/tests/fixtures/fail12.json +1 -0
  102. data/tests/fixtures/fail13.json +1 -0
  103. data/tests/fixtures/fail14.json +1 -0
  104. data/tests/fixtures/fail18.json +1 -0
  105. data/tests/fixtures/fail19.json +1 -0
  106. data/tests/fixtures/fail2.json +1 -0
  107. data/tests/fixtures/fail20.json +1 -0
  108. data/tests/fixtures/fail21.json +1 -0
  109. data/tests/fixtures/fail22.json +1 -0
  110. data/tests/fixtures/fail23.json +1 -0
  111. data/tests/fixtures/fail24.json +1 -0
  112. data/tests/fixtures/fail25.json +1 -0
  113. data/tests/fixtures/fail27.json +2 -0
  114. data/tests/fixtures/fail28.json +2 -0
  115. data/tests/fixtures/fail3.json +1 -0
  116. data/tests/fixtures/fail4.json +1 -0
  117. data/tests/fixtures/fail5.json +1 -0
  118. data/tests/fixtures/fail6.json +1 -0
  119. data/tests/fixtures/fail7.json +1 -0
  120. data/tests/fixtures/fail8.json +1 -0
  121. data/tests/fixtures/fail9.json +1 -0
  122. data/tests/fixtures/pass1.json +56 -0
  123. data/tests/fixtures/pass15.json +1 -0
  124. data/tests/fixtures/pass16.json +1 -0
  125. data/tests/fixtures/pass17.json +1 -0
  126. data/tests/fixtures/pass2.json +1 -0
  127. data/tests/fixtures/pass26.json +1 -0
  128. data/tests/fixtures/pass3.json +6 -0
  129. data/tests/setup_variant.rb +11 -0
  130. data/tests/test_json.rb +424 -0
  131. data/tests/test_json_addition.rb +167 -0
  132. data/tests/test_json_encoding.rb +65 -0
  133. data/tests/test_json_fixtures.rb +35 -0
  134. data/tests/test_json_generate.rb +180 -0
  135. data/tests/test_json_string_matching.rb +40 -0
  136. data/tests/test_json_unicode.rb +72 -0
  137. data/tools/fuzz.rb +139 -0
  138. data/tools/server.rb +61 -0
  139. metadata +265 -0
@@ -0,0 +1 @@
1
+ ["Illegal backslash escape: \x15"]
@@ -0,0 +1 @@
1
+ ["Illegal backslash escape: \'"]
@@ -0,0 +1 @@
1
+ ["Illegal backslash escape: \017"]
@@ -0,0 +1 @@
1
+ [[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
@@ -0,0 +1 @@
1
+ ["tab\ character\ in\ string\ "]
@@ -0,0 +1,6 @@
1
+ {
2
+ "JSON Test Pattern pass3": {
3
+ "The outermost value": "must be an object or array.",
4
+ "In this test": "It is an object."
5
+ }
6
+ }
@@ -0,0 +1,11 @@
1
+ case ENV['JSON']
2
+ when 'pure'
3
+ $:.unshift 'lib'
4
+ require 'json/pure'
5
+ when 'ext'
6
+ $:.unshift 'ext', 'lib'
7
+ require 'json/ext'
8
+ else
9
+ $:.unshift 'ext', 'lib'
10
+ require 'json'
11
+ end
@@ -0,0 +1,424 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ require 'test/unit'
5
+ require File.join(File.dirname(__FILE__), 'setup_variant')
6
+ require 'stringio'
7
+
8
+ unless Array.method_defined?(:permutation)
9
+ begin
10
+ require 'enumerator'
11
+ require 'permutation'
12
+ class Array
13
+ def permutation
14
+ Permutation.for(self).to_enum.map { |x| x.project }
15
+ end
16
+ end
17
+ rescue LoadError
18
+ warn "Skipping permutation tests."
19
+ end
20
+ end
21
+
22
+ class TC_JSON < Test::Unit::TestCase
23
+ include JSON
24
+
25
+ def setup
26
+ @ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
27
+ |x| [x]
28
+ end
29
+ @ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
30
+ "[1,-2,3]", "false", "true"].map do
31
+ |x| "[#{x}]"
32
+ end
33
+ @hash = {
34
+ 'a' => 2,
35
+ 'b' => 3.141,
36
+ 'c' => 'c',
37
+ 'd' => [ 1, "b", 3.14 ],
38
+ 'e' => { 'foo' => 'bar' },
39
+ 'g' => "\"\0\037",
40
+ 'h' => 1000.0,
41
+ 'i' => 0.001
42
+ }
43
+ @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
44
+ '"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
45
+ end
46
+
47
+ def test_construction
48
+ parser = JSON::Parser.new('test')
49
+ assert_equal 'test', parser.source
50
+ end
51
+
52
+ def assert_equal_float(expected, is)
53
+ assert_in_delta(expected.first, is.first, 1e-2)
54
+ end
55
+
56
+ def test_parse_simple_arrays
57
+ assert_equal([], parse('[]'))
58
+ assert_equal([], parse(' [ ] '))
59
+ assert_equal([nil], parse('[null]'))
60
+ assert_equal([false], parse('[false]'))
61
+ assert_equal([true], parse('[true]'))
62
+ assert_equal([-23], parse('[-23]'))
63
+ assert_equal([23], parse('[23]'))
64
+ assert_equal([0.23], parse('[0.23]'))
65
+ assert_equal([0.0], parse('[0e0]'))
66
+ assert_raises(JSON::ParserError) { parse('[+23.2]') }
67
+ assert_raises(JSON::ParserError) { parse('[+23]') }
68
+ assert_raises(JSON::ParserError) { parse('[.23]') }
69
+ assert_raises(JSON::ParserError) { parse('[023]') }
70
+ assert_equal_float [3.141], parse('[3.141]')
71
+ assert_equal_float [-3.141], parse('[-3.141]')
72
+ assert_equal_float [3.141], parse('[3141e-3]')
73
+ assert_equal_float [3.141], parse('[3141.1e-3]')
74
+ assert_equal_float [3.141], parse('[3141E-3]')
75
+ assert_equal_float [3.141], parse('[3141.0E-3]')
76
+ assert_equal_float [-3.141], parse('[-3141.0e-3]')
77
+ assert_equal_float [-3.141], parse('[-3141e-3]')
78
+ assert_raises(ParserError) { parse('[NaN]') }
79
+ assert parse('[NaN]', :allow_nan => true).first.nan?
80
+ assert_raises(ParserError) { parse('[Infinity]') }
81
+ assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
82
+ assert_raises(ParserError) { parse('[-Infinity]') }
83
+ assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
84
+ assert_equal([""], parse('[""]'))
85
+ assert_equal(["foobar"], parse('["foobar"]'))
86
+ assert_equal([{}], parse('[{}]'))
87
+ end
88
+
89
+ def test_parse_simple_objects
90
+ assert_equal({}, parse('{}'))
91
+ assert_equal({}, parse(' { } '))
92
+ assert_equal({ "a" => nil }, parse('{ "a" : null}'))
93
+ assert_equal({ "a" => nil }, parse('{"a":null}'))
94
+ assert_equal({ "a" => false }, parse('{ "a" : false } '))
95
+ assert_equal({ "a" => false }, parse('{"a":false}'))
96
+ assert_raises(JSON::ParserError) { parse('{false}') }
97
+ assert_equal({ "a" => true }, parse('{"a":true}'))
98
+ assert_equal({ "a" => true }, parse(' { "a" : true } '))
99
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
100
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
101
+ assert_equal({ "a" => 23 }, parse('{"a":23 } '))
102
+ assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
103
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
104
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
105
+ end
106
+
107
+ if Array.method_defined?(:permutation)
108
+ def test_parse_more_complex_arrays
109
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
110
+ a.permutation.each do |perm|
111
+ json = pretty_generate(perm)
112
+ assert_equal perm, parse(json)
113
+ end
114
+ end
115
+
116
+ def test_parse_complex_objects
117
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
118
+ a.permutation.each do |perm|
119
+ s = "a"
120
+ orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
121
+ json = pretty_generate(orig_obj)
122
+ assert_equal orig_obj, parse(json)
123
+ end
124
+ end
125
+ end
126
+
127
+ def test_parse_arrays
128
+ assert_equal([1,2,3], parse('[1,2,3]'))
129
+ assert_equal([1.2,2,3], parse('[1.2,2,3]'))
130
+ assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
131
+ end
132
+
133
+ def test_parse_values
134
+ assert_equal([""], parse('[""]'))
135
+ assert_equal(["\\"], parse('["\\\\"]'))
136
+ assert_equal(['"'], parse('["\""]'))
137
+ assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
138
+ assert_equal(["\"\b\n\r\t\0\037"],
139
+ parse('["\"\b\n\r\t\u0000\u001f"]'))
140
+ for i in 0 ... @ary.size
141
+ assert_equal(@ary[i], parse(@ary_to_parse[i]))
142
+ end
143
+ end
144
+
145
+ def test_parse_array
146
+ assert_equal([], parse('[]'))
147
+ assert_equal([], parse(' [ ] '))
148
+ assert_equal([1], parse('[1]'))
149
+ assert_equal([1], parse(' [ 1 ] '))
150
+ assert_equal(@ary,
151
+ parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
152
+ ',[false],[true]]'))
153
+ assert_equal(@ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
154
+ , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
155
+ end
156
+
157
+ class SubArray < Array
158
+ def <<(v)
159
+ @shifted = true
160
+ super
161
+ end
162
+
163
+ def shifted?
164
+ @shifted
165
+ end
166
+ end
167
+
168
+ class SubArray2 < Array
169
+ def to_json(*a)
170
+ {
171
+ JSON.create_id => self.class.name,
172
+ 'ary' => to_a,
173
+ }.to_json(*a)
174
+ end
175
+
176
+ def self.json_create(o)
177
+ o.delete JSON.create_id
178
+ o['ary']
179
+ end
180
+ end
181
+
182
+ def test_parse_array_custom_class
183
+ res = parse('[1,2]', :array_class => SubArray)
184
+ assert_equal([1,2], res)
185
+ assert_equal(SubArray, res.class)
186
+ assert res.shifted?
187
+ end
188
+
189
+ def test_parse_object
190
+ assert_equal({}, parse('{}'))
191
+ assert_equal({}, parse(' { } '))
192
+ assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
193
+ assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
194
+ end
195
+
196
+ class SubHash < Hash
197
+ def []=(k, v)
198
+ @item_set = true
199
+ super
200
+ end
201
+
202
+ def item_set?
203
+ @item_set
204
+ end
205
+ end
206
+
207
+ class SubHash2 < Hash
208
+ def to_json(*a)
209
+ {
210
+ JSON.create_id => self.class.name,
211
+ }.merge(self).to_json(*a)
212
+ end
213
+
214
+ def self.json_create(o)
215
+ o.delete JSON.create_id
216
+ self[o]
217
+ end
218
+ end
219
+
220
+ def test_parse_object_custom_class
221
+ res = parse('{"foo":"bar"}', :object_class => SubHash)
222
+ assert_equal({"foo" => "bar"}, res)
223
+ assert_equal(SubHash, res.class)
224
+ assert res.item_set?
225
+ end
226
+
227
+ def test_generation_of_core_subclasses_with_new_to_json
228
+ obj = SubHash2["foo" => SubHash2["bar" => true]]
229
+ obj_json = JSON(obj)
230
+ obj_again = JSON(obj_json)
231
+ assert_kind_of SubHash2, obj_again
232
+ assert_kind_of SubHash2, obj_again['foo']
233
+ assert obj_again['foo']['bar']
234
+ assert_equal obj, obj_again
235
+ assert_equal ["foo"], JSON(JSON(SubArray2["foo"]))
236
+ end
237
+
238
+ def test_generation_of_core_subclasses_with_default_to_json
239
+ assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
240
+ assert_equal '["foo"]', JSON(SubArray["foo"])
241
+ end
242
+
243
+ def test_generation_of_core_subclasses
244
+ obj = SubHash["foo" => SubHash["bar" => true]]
245
+ obj_json = JSON(obj)
246
+ obj_again = JSON(obj_json)
247
+ assert_kind_of Hash, obj_again
248
+ assert_kind_of Hash, obj_again['foo']
249
+ assert obj_again['foo']['bar']
250
+ assert_equal obj, obj_again
251
+ end
252
+
253
+ def test_parser_reset
254
+ parser = Parser.new(@json)
255
+ assert_equal(@hash, parser.parse)
256
+ assert_equal(@hash, parser.parse)
257
+ end
258
+
259
+ def test_comments
260
+ json = <<EOT
261
+ {
262
+ "key1":"value1", // eol comment
263
+ "key2":"value2" /* multi line
264
+ * comment */,
265
+ "key3":"value3" /* multi line
266
+ // nested eol comment
267
+ * comment */
268
+ }
269
+ EOT
270
+ assert_equal(
271
+ { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
272
+ parse(json))
273
+ json = <<EOT
274
+ {
275
+ "key1":"value1" /* multi line
276
+ // nested eol comment
277
+ /* illegal nested multi line comment */
278
+ * comment */
279
+ }
280
+ EOT
281
+ assert_raises(ParserError) { parse(json) }
282
+ json = <<EOT
283
+ {
284
+ "key1":"value1" /* multi line
285
+ // nested eol comment
286
+ closed multi comment */
287
+ and again, throw an Error */
288
+ }
289
+ EOT
290
+ assert_raises(ParserError) { parse(json) }
291
+ json = <<EOT
292
+ {
293
+ "key1":"value1" /*/*/
294
+ }
295
+ EOT
296
+ assert_equal({ "key1" => "value1" }, parse(json))
297
+ end
298
+
299
+ def test_backslash
300
+ data = [ '\\.(?i:gif|jpe?g|png)$' ]
301
+ json = '["\\\\.(?i:gif|jpe?g|png)$"]'
302
+ assert_equal json, JSON.generate(data)
303
+ assert_equal data, JSON.parse(json)
304
+ #
305
+ data = [ '\\"' ]
306
+ json = '["\\\\\""]'
307
+ assert_equal json, JSON.generate(data)
308
+ assert_equal data, JSON.parse(json)
309
+ #
310
+ json = '["/"]'
311
+ data = JSON.parse(json)
312
+ assert_equal ['/'], data
313
+ assert_equal json, JSON.generate(data)
314
+ #
315
+ json = '["\""]'
316
+ data = JSON.parse(json)
317
+ assert_equal ['"'], data
318
+ assert_equal json, JSON.generate(data)
319
+ json = '["\\\'"]'
320
+ data = JSON.parse(json)
321
+ assert_equal ["'"], data
322
+ assert_equal '["\'"]', JSON.generate(data)
323
+ end
324
+
325
+ def test_wrong_inputs
326
+ assert_raises(ParserError) { JSON.parse('"foo"') }
327
+ assert_raises(ParserError) { JSON.parse('123') }
328
+ assert_raises(ParserError) { JSON.parse('[] bla') }
329
+ assert_raises(ParserError) { JSON.parse('[] 1') }
330
+ assert_raises(ParserError) { JSON.parse('[] []') }
331
+ assert_raises(ParserError) { JSON.parse('[] {}') }
332
+ assert_raises(ParserError) { JSON.parse('{} []') }
333
+ assert_raises(ParserError) { JSON.parse('{} {}') }
334
+ assert_raises(ParserError) { JSON.parse('[NULL]') }
335
+ assert_raises(ParserError) { JSON.parse('[FALSE]') }
336
+ assert_raises(ParserError) { JSON.parse('[TRUE]') }
337
+ assert_raises(ParserError) { JSON.parse('[07] ') }
338
+ assert_raises(ParserError) { JSON.parse('[0a]') }
339
+ assert_raises(ParserError) { JSON.parse('[1.]') }
340
+ assert_raises(ParserError) { JSON.parse(' ') }
341
+ end
342
+
343
+ def test_nesting
344
+ assert_raises(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
345
+ assert_raises(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
346
+ assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
347
+ too_deep = '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]'
348
+ too_deep_ary = eval too_deep
349
+ assert_raises(JSON::NestingError) { JSON.parse too_deep }
350
+ assert_raises(JSON::NestingError) { JSON.parser.new(too_deep).parse }
351
+ assert_raises(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 19 }
352
+ ok = JSON.parse too_deep, :max_nesting => 20
353
+ assert_equal too_deep_ary, ok
354
+ ok = JSON.parse too_deep, :max_nesting => nil
355
+ assert_equal too_deep_ary, ok
356
+ ok = JSON.parse too_deep, :max_nesting => false
357
+ assert_equal too_deep_ary, ok
358
+ ok = JSON.parse too_deep, :max_nesting => 0
359
+ assert_equal too_deep_ary, ok
360
+ assert_raises(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
361
+ assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
362
+ assert_raises(JSON::NestingError) { JSON.generate too_deep_ary }
363
+ assert_raises(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 19 }
364
+ ok = JSON.generate too_deep_ary, :max_nesting => 20
365
+ assert_equal too_deep, ok
366
+ ok = JSON.generate too_deep_ary, :max_nesting => nil
367
+ assert_equal too_deep, ok
368
+ ok = JSON.generate too_deep_ary, :max_nesting => false
369
+ assert_equal too_deep, ok
370
+ ok = JSON.generate too_deep_ary, :max_nesting => 0
371
+ assert_equal too_deep, ok
372
+ end
373
+
374
+ def test_symbolize_names
375
+ assert_equal({ "foo" => "bar", "baz" => "quux" },
376
+ JSON.parse('{"foo":"bar", "baz":"quux"}'))
377
+ assert_equal({ :foo => "bar", :baz => "quux" },
378
+ JSON.parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
379
+ end
380
+
381
+ def test_load_dump
382
+ too_deep = '[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]'
383
+ assert_equal too_deep, JSON.dump(eval(too_deep))
384
+ assert_kind_of String, Marshal.dump(eval(too_deep))
385
+ assert_raises(ArgumentError) { JSON.dump(eval(too_deep), 19) }
386
+ assert_raises(ArgumentError) { Marshal.dump(eval(too_deep), 19) }
387
+ assert_equal too_deep, JSON.dump(eval(too_deep), 20)
388
+ assert_kind_of String, Marshal.dump(eval(too_deep), 20)
389
+ output = StringIO.new
390
+ JSON.dump(eval(too_deep), output)
391
+ assert_equal too_deep, output.string
392
+ output = StringIO.new
393
+ JSON.dump(eval(too_deep), output, 20)
394
+ assert_equal too_deep, output.string
395
+ end
396
+
397
+ def test_big_integers
398
+ json1 = JSON([orig = (1 << 31) - 1])
399
+ assert_equal orig, JSON[json1][0]
400
+ json2 = JSON([orig = 1 << 31])
401
+ assert_equal orig, JSON[json2][0]
402
+ json3 = JSON([orig = (1 << 62) - 1])
403
+ assert_equal orig, JSON[json3][0]
404
+ json4 = JSON([orig = 1 << 62])
405
+ assert_equal orig, JSON[json4][0]
406
+ json5 = JSON([orig = 1 << 64])
407
+ assert_equal orig, JSON[json5][0]
408
+ end
409
+
410
+ if defined?(JSON::Ext::Parser)
411
+ def test_allocate
412
+ parser = JSON::Ext::Parser.new("{}")
413
+ assert_raise(TypeError, '[ruby-core:35079]') {parser.__send__(:initialize, "{}")}
414
+ parser = JSON::Ext::Parser.allocate
415
+ assert_raise(TypeError, '[ruby-core:35079]') {parser.source}
416
+ end
417
+ end
418
+
419
+ def test_argument_encoding
420
+ source = "{}".force_encoding("ascii-8bit")
421
+ JSON::Parser.new(source)
422
+ assert_equal Encoding::ASCII_8BIT, source.encoding
423
+ end if defined?(Encoding::ASCII_8BIT)
424
+ end