json-maglev- 1.5.4

Sign up to get free protection for your applications and to get access to all the features.
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