json 1.8.3 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of json might be problematic. Click here for more details.

Files changed (82) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +7 -10
  4. data/{CHANGES → CHANGES.md} +186 -90
  5. data/Gemfile +10 -6
  6. data/{README-json-jruby.markdown → README-json-jruby.md} +0 -0
  7. data/{README.rdoc → README.md} +184 -133
  8. data/Rakefile +33 -37
  9. data/VERSION +1 -1
  10. data/ext/json/ext/fbuffer/fbuffer.h +0 -3
  11. data/ext/json/ext/generator/generator.c +47 -61
  12. data/ext/json/ext/generator/generator.h +7 -2
  13. data/ext/json/ext/parser/extconf.rb +3 -0
  14. data/ext/json/ext/parser/parser.c +374 -459
  15. data/ext/json/ext/parser/parser.h +4 -5
  16. data/ext/json/ext/parser/parser.rl +133 -181
  17. data/ext/json/extconf.rb +0 -1
  18. data/java/src/json/ext/ByteListTranscoder.java +1 -2
  19. data/java/src/json/ext/Generator.java +11 -12
  20. data/java/src/json/ext/GeneratorMethods.java +1 -2
  21. data/java/src/json/ext/GeneratorService.java +1 -2
  22. data/java/src/json/ext/GeneratorState.java +3 -56
  23. data/java/src/json/ext/OptionsReader.java +2 -3
  24. data/java/src/json/ext/Parser.java +132 -415
  25. data/java/src/json/ext/Parser.rl +48 -124
  26. data/java/src/json/ext/ParserService.java +1 -2
  27. data/java/src/json/ext/RuntimeInfo.java +1 -6
  28. data/java/src/json/ext/StringDecoder.java +1 -2
  29. data/java/src/json/ext/StringEncoder.java +5 -0
  30. data/java/src/json/ext/Utils.java +1 -2
  31. data/json-java.gemspec +15 -0
  32. data/json.gemspec +0 -0
  33. data/json_pure.gemspec +24 -26
  34. data/lib/json/add/bigdecimal.rb +1 -0
  35. data/lib/json/add/complex.rb +2 -1
  36. data/lib/json/add/core.rb +1 -0
  37. data/lib/json/add/date.rb +1 -1
  38. data/lib/json/add/date_time.rb +1 -1
  39. data/lib/json/add/exception.rb +1 -1
  40. data/lib/json/add/ostruct.rb +3 -3
  41. data/lib/json/add/range.rb +1 -1
  42. data/lib/json/add/rational.rb +1 -0
  43. data/lib/json/add/regexp.rb +1 -1
  44. data/lib/json/add/set.rb +29 -0
  45. data/lib/json/add/struct.rb +1 -1
  46. data/lib/json/add/symbol.rb +1 -1
  47. data/lib/json/add/time.rb +1 -1
  48. data/lib/json/common.rb +24 -52
  49. data/lib/json/ext.rb +0 -6
  50. data/lib/json/generic_object.rb +5 -4
  51. data/lib/json/pure/generator.rb +61 -125
  52. data/lib/json/pure/parser.rb +33 -81
  53. data/lib/json/pure.rb +2 -8
  54. data/lib/json/version.rb +2 -1
  55. data/lib/json.rb +1 -0
  56. data/references/rfc7159.txt +899 -0
  57. data/tests/fixtures/obsolete_fail1.json +1 -0
  58. data/tests/{test_json_addition.rb → json_addition_test.rb} +32 -25
  59. data/tests/json_common_interface_test.rb +126 -0
  60. data/tests/json_encoding_test.rb +107 -0
  61. data/tests/json_ext_parser_test.rb +15 -0
  62. data/tests/{test_json_fixtures.rb → json_fixtures_test.rb} +5 -8
  63. data/tests/{test_json_generate.rb → json_generator_test.rb} +79 -39
  64. data/tests/{test_json_generic_object.rb → json_generic_object_test.rb} +15 -8
  65. data/tests/json_parser_test.rb +472 -0
  66. data/tests/json_string_matching_test.rb +38 -0
  67. data/tests/{setup_variant.rb → test_helper.rb} +6 -0
  68. data/tools/diff.sh +18 -0
  69. data/tools/fuzz.rb +1 -9
  70. metadata +29 -47
  71. data/COPYING +0 -58
  72. data/COPYING-json-jruby +0 -57
  73. data/GPL +0 -340
  74. data/TODO +0 -1
  75. data/data/example.json +0 -1
  76. data/data/index.html +0 -38
  77. data/data/prototype.js +0 -4184
  78. data/tests/fixtures/fail1.json +0 -1
  79. data/tests/test_json.rb +0 -553
  80. data/tests/test_json_encoding.rb +0 -65
  81. data/tests/test_json_string_matching.rb +0 -39
  82. data/tests/test_json_unicode.rb +0 -72
@@ -1 +0,0 @@
1
- "A JSON payload should be an object or array, not a string."
data/tests/test_json.rb DELETED
@@ -1,553 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require 'test/unit'
5
- require File.join(File.dirname(__FILE__), 'setup_variant')
6
- require 'stringio'
7
- require 'tempfile'
8
- require 'ostruct'
9
-
10
- unless Array.method_defined?(:permutation)
11
- begin
12
- require 'enumerator'
13
- require 'permutation'
14
- class Array
15
- def permutation
16
- Permutation.for(self).to_enum.map { |x| x.project }
17
- end
18
- end
19
- rescue LoadError
20
- warn "Skipping permutation tests."
21
- end
22
- end
23
-
24
- class TestJSON < Test::Unit::TestCase
25
- include JSON
26
-
27
- def setup
28
- @ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
29
- |x| [x]
30
- end
31
- @ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
32
- "[1,-2,3]", "false", "true"].map do
33
- |x| "[#{x}]"
34
- end
35
- @hash = {
36
- 'a' => 2,
37
- 'b' => 3.141,
38
- 'c' => 'c',
39
- 'd' => [ 1, "b", 3.14 ],
40
- 'e' => { 'foo' => 'bar' },
41
- 'g' => "\"\0\037",
42
- 'h' => 1000.0,
43
- 'i' => 0.001
44
- }
45
- @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
46
- '"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
47
- end
48
-
49
- def test_construction
50
- parser = JSON::Parser.new('test')
51
- assert_equal 'test', parser.source
52
- end
53
-
54
- def assert_equal_float(expected, is)
55
- assert_in_delta(expected.first, is.first, 1e-2)
56
- end
57
-
58
- def test_parse_simple_arrays
59
- assert_equal([], parse('[]'))
60
- assert_equal([], parse(' [ ] '))
61
- assert_equal([nil], parse('[null]'))
62
- assert_equal([false], parse('[false]'))
63
- assert_equal([true], parse('[true]'))
64
- assert_equal([-23], parse('[-23]'))
65
- assert_equal([23], parse('[23]'))
66
- assert_equal([0.23], parse('[0.23]'))
67
- assert_equal([0.0], parse('[0e0]'))
68
- assert_raises(JSON::ParserError) { parse('[+23.2]') }
69
- assert_raises(JSON::ParserError) { parse('[+23]') }
70
- assert_raises(JSON::ParserError) { parse('[.23]') }
71
- assert_raises(JSON::ParserError) { parse('[023]') }
72
- assert_equal_float [3.141], parse('[3.141]')
73
- assert_equal_float [-3.141], parse('[-3.141]')
74
- assert_equal_float [3.141], parse('[3141e-3]')
75
- assert_equal_float [3.141], parse('[3141.1e-3]')
76
- assert_equal_float [3.141], parse('[3141E-3]')
77
- assert_equal_float [3.141], parse('[3141.0E-3]')
78
- assert_equal_float [-3.141], parse('[-3141.0e-3]')
79
- assert_equal_float [-3.141], parse('[-3141e-3]')
80
- assert_raises(ParserError) { parse('[NaN]') }
81
- assert parse('[NaN]', :allow_nan => true).first.nan?
82
- assert_raises(ParserError) { parse('[Infinity]') }
83
- assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
84
- assert_raises(ParserError) { parse('[-Infinity]') }
85
- assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
86
- assert_equal([""], parse('[""]'))
87
- assert_equal(["foobar"], parse('["foobar"]'))
88
- assert_equal([{}], parse('[{}]'))
89
- end
90
-
91
- def test_parse_simple_objects
92
- assert_equal({}, parse('{}'))
93
- assert_equal({}, parse(' { } '))
94
- assert_equal({ "a" => nil }, parse('{ "a" : null}'))
95
- assert_equal({ "a" => nil }, parse('{"a":null}'))
96
- assert_equal({ "a" => false }, parse('{ "a" : false } '))
97
- assert_equal({ "a" => false }, parse('{"a":false}'))
98
- assert_raises(JSON::ParserError) { parse('{false}') }
99
- assert_equal({ "a" => true }, parse('{"a":true}'))
100
- assert_equal({ "a" => true }, parse(' { "a" : true } '))
101
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
102
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
103
- assert_equal({ "a" => 23 }, parse('{"a":23 } '))
104
- assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
105
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
106
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
107
- end
108
-
109
- def test_parse_json_primitive_values
110
- assert_raise(JSON::ParserError) { JSON.parse('') }
111
- assert_raise(JSON::ParserError) { JSON.parse('', :quirks_mode => true) }
112
- assert_raise(TypeError) { JSON::Parser.new(nil).parse }
113
- assert_raise(TypeError) { JSON::Parser.new(nil, :quirks_mode => true).parse }
114
- assert_raise(TypeError) { JSON.parse(nil) }
115
- assert_raise(TypeError) { JSON.parse(nil, :quirks_mode => true) }
116
- assert_raise(JSON::ParserError) { JSON.parse(' /* foo */ ') }
117
- assert_raise(JSON::ParserError) { JSON.parse(' /* foo */ ', :quirks_mode => true) }
118
- parser = JSON::Parser.new('null')
119
- assert_equal false, parser.quirks_mode?
120
- assert_raise(JSON::ParserError) { parser.parse }
121
- assert_raise(JSON::ParserError) { JSON.parse('null') }
122
- assert_equal nil, JSON.parse('null', :quirks_mode => true)
123
- parser = JSON::Parser.new('null', :quirks_mode => true)
124
- assert_equal true, parser.quirks_mode?
125
- assert_equal nil, parser.parse
126
- assert_raise(JSON::ParserError) { JSON.parse('false') }
127
- assert_equal false, JSON.parse('false', :quirks_mode => true)
128
- assert_raise(JSON::ParserError) { JSON.parse('true') }
129
- assert_equal true, JSON.parse('true', :quirks_mode => true)
130
- assert_raise(JSON::ParserError) { JSON.parse('23') }
131
- assert_equal 23, JSON.parse('23', :quirks_mode => true)
132
- assert_raise(JSON::ParserError) { JSON.parse('1') }
133
- assert_equal 1, JSON.parse('1', :quirks_mode => true)
134
- assert_raise(JSON::ParserError) { JSON.parse('3.141') }
135
- assert_in_delta 3.141, JSON.parse('3.141', :quirks_mode => true), 1E-3
136
- assert_raise(JSON::ParserError) { JSON.parse('18446744073709551616') }
137
- assert_equal 2 ** 64, JSON.parse('18446744073709551616', :quirks_mode => true)
138
- assert_raise(JSON::ParserError) { JSON.parse('"foo"') }
139
- assert_equal 'foo', JSON.parse('"foo"', :quirks_mode => true)
140
- assert_raise(JSON::ParserError) { JSON.parse('NaN', :allow_nan => true) }
141
- assert JSON.parse('NaN', :quirks_mode => true, :allow_nan => true).nan?
142
- assert_raise(JSON::ParserError) { JSON.parse('Infinity', :allow_nan => true) }
143
- assert JSON.parse('Infinity', :quirks_mode => true, :allow_nan => true).infinite?
144
- assert_raise(JSON::ParserError) { JSON.parse('-Infinity', :allow_nan => true) }
145
- assert JSON.parse('-Infinity', :quirks_mode => true, :allow_nan => true).infinite?
146
- assert_raise(JSON::ParserError) { JSON.parse('[ 1, ]', :quirks_mode => true) }
147
- end
148
-
149
- if Array.method_defined?(:permutation)
150
- def test_parse_more_complex_arrays
151
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
152
- a.permutation.each do |perm|
153
- json = pretty_generate(perm)
154
- assert_equal perm, parse(json)
155
- end
156
- end
157
-
158
- def test_parse_complex_objects
159
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
160
- a.permutation.each do |perm|
161
- s = "a"
162
- orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
163
- json = pretty_generate(orig_obj)
164
- assert_equal orig_obj, parse(json)
165
- end
166
- end
167
- end
168
-
169
- def test_parse_arrays
170
- assert_equal([1,2,3], parse('[1,2,3]'))
171
- assert_equal([1.2,2,3], parse('[1.2,2,3]'))
172
- assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
173
- end
174
-
175
- def test_parse_values
176
- assert_equal([""], parse('[""]'))
177
- assert_equal(["\\"], parse('["\\\\"]'))
178
- assert_equal(['"'], parse('["\""]'))
179
- assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
180
- assert_equal(["\"\b\n\r\t\0\037"],
181
- parse('["\"\b\n\r\t\u0000\u001f"]'))
182
- for i in 0 ... @ary.size
183
- assert_equal(@ary[i], parse(@ary_to_parse[i]))
184
- end
185
- end
186
-
187
- def test_parse_array
188
- assert_equal([], parse('[]'))
189
- assert_equal([], parse(' [ ] '))
190
- assert_equal([1], parse('[1]'))
191
- assert_equal([1], parse(' [ 1 ] '))
192
- assert_equal(@ary,
193
- parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
194
- ',[false],[true]]'))
195
- assert_equal(@ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
196
- , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
197
- end
198
-
199
- class SubArray < Array
200
- def <<(v)
201
- @shifted = true
202
- super
203
- end
204
-
205
- def shifted?
206
- @shifted
207
- end
208
- end
209
-
210
- class SubArray2 < Array
211
- def to_json(*a)
212
- {
213
- JSON.create_id => self.class.name,
214
- 'ary' => to_a,
215
- }.to_json(*a)
216
- end
217
-
218
- def self.json_create(o)
219
- o.delete JSON.create_id
220
- o['ary']
221
- end
222
- end
223
-
224
- class SubArrayWrapper
225
- def initialize
226
- @data = []
227
- end
228
-
229
- attr_reader :data
230
-
231
- def [](index)
232
- @data[index]
233
- end
234
-
235
- def <<(value)
236
- @data << value
237
- @shifted = true
238
- end
239
-
240
- def shifted?
241
- @shifted
242
- end
243
- end
244
-
245
- def test_parse_array_custom_array_derived_class
246
- res = parse('[1,2]', :array_class => SubArray)
247
- assert_equal([1,2], res)
248
- assert_equal(SubArray, res.class)
249
- assert res.shifted?
250
- end
251
-
252
- def test_parse_array_custom_non_array_derived_class
253
- res = parse('[1,2]', :array_class => SubArrayWrapper)
254
- assert_equal([1,2], res.data)
255
- assert_equal(SubArrayWrapper, res.class)
256
- assert res.shifted?
257
- end
258
-
259
- def test_parse_object
260
- assert_equal({}, parse('{}'))
261
- assert_equal({}, parse(' { } '))
262
- assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
263
- assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
264
- end
265
-
266
- class SubHash < Hash
267
- def []=(k, v)
268
- @item_set = true
269
- super
270
- end
271
-
272
- def item_set?
273
- @item_set
274
- end
275
- end
276
-
277
- class SubHash2 < Hash
278
- def to_json(*a)
279
- {
280
- JSON.create_id => self.class.name,
281
- }.merge(self).to_json(*a)
282
- end
283
-
284
- def self.json_create(o)
285
- o.delete JSON.create_id
286
- self[o]
287
- end
288
- end
289
-
290
- class SubOpenStruct < OpenStruct
291
- def [](k)
292
- __send__(k)
293
- end
294
-
295
- def []=(k, v)
296
- @item_set = true
297
- __send__("#{k}=", v)
298
- end
299
-
300
- def item_set?
301
- @item_set
302
- end
303
- end
304
-
305
- def test_parse_object_custom_hash_derived_class
306
- res = parse('{"foo":"bar"}', :object_class => SubHash)
307
- assert_equal({"foo" => "bar"}, res)
308
- assert_equal(SubHash, res.class)
309
- assert res.item_set?
310
- end
311
-
312
- def test_parse_object_custom_non_hash_derived_class
313
- res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
314
- assert_equal "bar", res.foo
315
- assert_equal(SubOpenStruct, res.class)
316
- assert res.item_set?
317
- end
318
-
319
- def test_parse_generic_object
320
- res = parse('{"foo":"bar", "baz":{}}', :object_class => JSON::GenericObject)
321
- assert_equal(JSON::GenericObject, res.class)
322
- assert_equal "bar", res.foo
323
- assert_equal "bar", res["foo"]
324
- assert_equal "bar", res[:foo]
325
- assert_equal "bar", res.to_hash[:foo]
326
- assert_equal(JSON::GenericObject, res.baz.class)
327
- end
328
-
329
- def test_generate_core_subclasses_with_new_to_json
330
- obj = SubHash2["foo" => SubHash2["bar" => true]]
331
- obj_json = JSON(obj)
332
- obj_again = JSON.parse(obj_json, :create_additions => true)
333
- assert_kind_of SubHash2, obj_again
334
- assert_kind_of SubHash2, obj_again['foo']
335
- assert obj_again['foo']['bar']
336
- assert_equal obj, obj_again
337
- assert_equal ["foo"], JSON(JSON(SubArray2["foo"]), :create_additions => true)
338
- end
339
-
340
- def test_generate_core_subclasses_with_default_to_json
341
- assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
342
- assert_equal '["foo"]', JSON(SubArray["foo"])
343
- end
344
-
345
- def test_generate_of_core_subclasses
346
- obj = SubHash["foo" => SubHash["bar" => true]]
347
- obj_json = JSON(obj)
348
- obj_again = JSON(obj_json)
349
- assert_kind_of Hash, obj_again
350
- assert_kind_of Hash, obj_again['foo']
351
- assert obj_again['foo']['bar']
352
- assert_equal obj, obj_again
353
- end
354
-
355
- def test_parser_reset
356
- parser = Parser.new(@json)
357
- assert_equal(@hash, parser.parse)
358
- assert_equal(@hash, parser.parse)
359
- end
360
-
361
- def test_comments
362
- json = <<EOT
363
- {
364
- "key1":"value1", // eol comment
365
- "key2":"value2" /* multi line
366
- * comment */,
367
- "key3":"value3" /* multi line
368
- // nested eol comment
369
- * comment */
370
- }
371
- EOT
372
- assert_equal(
373
- { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
374
- parse(json))
375
- json = <<EOT
376
- {
377
- "key1":"value1" /* multi line
378
- // nested eol comment
379
- /* illegal nested multi line comment */
380
- * comment */
381
- }
382
- EOT
383
- assert_raises(ParserError) { parse(json) }
384
- json = <<EOT
385
- {
386
- "key1":"value1" /* multi line
387
- // nested eol comment
388
- closed multi comment */
389
- and again, throw an Error */
390
- }
391
- EOT
392
- assert_raises(ParserError) { parse(json) }
393
- json = <<EOT
394
- {
395
- "key1":"value1" /*/*/
396
- }
397
- EOT
398
- assert_equal({ "key1" => "value1" }, parse(json))
399
- end
400
-
401
- def test_backslash
402
- data = [ '\\.(?i:gif|jpe?g|png)$' ]
403
- json = '["\\\\.(?i:gif|jpe?g|png)$"]'
404
- assert_equal json, JSON.generate(data)
405
- assert_equal data, JSON.parse(json)
406
- #
407
- data = [ '\\"' ]
408
- json = '["\\\\\""]'
409
- assert_equal json, JSON.generate(data)
410
- assert_equal data, JSON.parse(json)
411
- #
412
- json = '["/"]'
413
- data = JSON.parse(json)
414
- assert_equal ['/'], data
415
- assert_equal json, JSON.generate(data)
416
- #
417
- json = '["\""]'
418
- data = JSON.parse(json)
419
- assert_equal ['"'], data
420
- assert_equal json, JSON.generate(data)
421
- json = '["\\\'"]'
422
- data = JSON.parse(json)
423
- assert_equal ["'"], data
424
- assert_equal '["\'"]', JSON.generate(data)
425
- end
426
-
427
- def test_wrong_inputs
428
- assert_raises(ParserError) { JSON.parse('"foo"') }
429
- assert_raises(ParserError) { JSON.parse('123') }
430
- assert_raises(ParserError) { JSON.parse('[] bla') }
431
- assert_raises(ParserError) { JSON.parse('[] 1') }
432
- assert_raises(ParserError) { JSON.parse('[] []') }
433
- assert_raises(ParserError) { JSON.parse('[] {}') }
434
- assert_raises(ParserError) { JSON.parse('{} []') }
435
- assert_raises(ParserError) { JSON.parse('{} {}') }
436
- assert_raises(ParserError) { JSON.parse('[NULL]') }
437
- assert_raises(ParserError) { JSON.parse('[FALSE]') }
438
- assert_raises(ParserError) { JSON.parse('[TRUE]') }
439
- assert_raises(ParserError) { JSON.parse('[07] ') }
440
- assert_raises(ParserError) { JSON.parse('[0a]') }
441
- assert_raises(ParserError) { JSON.parse('[1.]') }
442
- assert_raises(ParserError) { JSON.parse(' ') }
443
- end
444
-
445
- def test_nesting
446
- assert_raises(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
447
- assert_raises(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
448
- assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
449
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
450
- too_deep_ary = eval too_deep
451
- assert_raises(JSON::NestingError) { JSON.parse too_deep }
452
- assert_raises(JSON::NestingError) { JSON.parser.new(too_deep).parse }
453
- assert_raises(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 100 }
454
- ok = JSON.parse too_deep, :max_nesting => 101
455
- assert_equal too_deep_ary, ok
456
- ok = JSON.parse too_deep, :max_nesting => nil
457
- assert_equal too_deep_ary, ok
458
- ok = JSON.parse too_deep, :max_nesting => false
459
- assert_equal too_deep_ary, ok
460
- ok = JSON.parse too_deep, :max_nesting => 0
461
- assert_equal too_deep_ary, ok
462
- assert_raises(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
463
- assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
464
- assert_raises(JSON::NestingError) { JSON.generate too_deep_ary }
465
- assert_raises(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 100 }
466
- ok = JSON.generate too_deep_ary, :max_nesting => 101
467
- assert_equal too_deep, ok
468
- ok = JSON.generate too_deep_ary, :max_nesting => nil
469
- assert_equal too_deep, ok
470
- ok = JSON.generate too_deep_ary, :max_nesting => false
471
- assert_equal too_deep, ok
472
- ok = JSON.generate too_deep_ary, :max_nesting => 0
473
- assert_equal too_deep, ok
474
- end
475
-
476
- def test_symbolize_names
477
- assert_equal({ "foo" => "bar", "baz" => "quux" },
478
- JSON.parse('{"foo":"bar", "baz":"quux"}'))
479
- assert_equal({ :foo => "bar", :baz => "quux" },
480
- JSON.parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
481
- end
482
-
483
- def test_load
484
- assert_equal @hash, JSON.load(@json)
485
- tempfile = Tempfile.open('json')
486
- tempfile.write @json
487
- tempfile.rewind
488
- assert_equal @hash, JSON.load(tempfile)
489
- stringio = StringIO.new(@json)
490
- stringio.rewind
491
- assert_equal @hash, JSON.load(stringio)
492
- assert_equal nil, JSON.load(nil)
493
- assert_equal nil, JSON.load('')
494
- ensure
495
- tempfile.close!
496
- end
497
-
498
- def test_load_with_options
499
- small_hash = JSON("foo" => 'bar')
500
- symbol_hash = { :foo => 'bar' }
501
- assert_equal symbol_hash, JSON.load(small_hash, nil, :symbolize_names => true)
502
- end
503
-
504
- def test_dump
505
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
506
- assert_equal too_deep, JSON.dump(eval(too_deep))
507
- assert_kind_of String, Marshal.dump(eval(too_deep))
508
- assert_raises(ArgumentError) { JSON.dump(eval(too_deep), 100) }
509
- assert_raises(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
510
- assert_equal too_deep, JSON.dump(eval(too_deep), 101)
511
- assert_kind_of String, Marshal.dump(eval(too_deep), 101)
512
- output = StringIO.new
513
- JSON.dump(eval(too_deep), output)
514
- assert_equal too_deep, output.string
515
- output = StringIO.new
516
- JSON.dump(eval(too_deep), output, 101)
517
- assert_equal too_deep, output.string
518
- end
519
-
520
- def test_dump_should_modify_defaults
521
- max_nesting = JSON.dump_default_options[:max_nesting]
522
- JSON.dump([], StringIO.new, 10)
523
- assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
524
- end
525
-
526
- def test_big_integers
527
- json1 = JSON([orig = (1 << 31) - 1])
528
- assert_equal orig, JSON[json1][0]
529
- json2 = JSON([orig = 1 << 31])
530
- assert_equal orig, JSON[json2][0]
531
- json3 = JSON([orig = (1 << 62) - 1])
532
- assert_equal orig, JSON[json3][0]
533
- json4 = JSON([orig = 1 << 62])
534
- assert_equal orig, JSON[json4][0]
535
- json5 = JSON([orig = 1 << 64])
536
- assert_equal orig, JSON[json5][0]
537
- end
538
-
539
- if defined?(JSON::Ext::Parser)
540
- def test_allocate
541
- parser = JSON::Ext::Parser.new("{}")
542
- assert_raise(TypeError, '[ruby-core:35079]') {parser.__send__(:initialize, "{}")}
543
- parser = JSON::Ext::Parser.allocate
544
- assert_raise(TypeError, '[ruby-core:35079]') {parser.source}
545
- end
546
- end
547
-
548
- def test_argument_encoding
549
- source = "{}".force_encoding("ascii-8bit")
550
- JSON::Parser.new(source)
551
- assert_equal Encoding::ASCII_8BIT, source.encoding
552
- end if defined?(Encoding::ASCII_8BIT)
553
- end
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require 'test/unit'
5
- require File.join(File.dirname(__FILE__), 'setup_variant')
6
-
7
- class TestJSONEncoding < Test::Unit::TestCase
8
- include JSON
9
-
10
- def setup
11
- @utf_8 = '["© ≠ €!"]'
12
- @parsed = [ "© ≠ €!" ]
13
- @generated = '["\u00a9 \u2260 \u20ac!"]'
14
- if String.method_defined?(:encode)
15
- @utf_16_data = [@parsed.first.encode('utf-16be', 'utf-8')]
16
- @utf_8_ascii_8bit = @utf_8.dup.force_encoding(Encoding::ASCII_8BIT)
17
- @utf_16be = @utf_8.encode('utf-16be', 'utf-8')
18
- @utf_16be_ascii_8bit = @utf_16be.dup.force_encoding(Encoding::ASCII_8BIT)
19
- @utf_16le = @utf_8.encode('utf-16le', 'utf-8')
20
- @utf_16le_ascii_8bit = @utf_16le.dup.force_encoding(Encoding::ASCII_8BIT)
21
- @utf_32be = @utf_8.encode('utf-32be', 'utf-8')
22
- @utf_32be_ascii_8bit = @utf_32be.dup.force_encoding(Encoding::ASCII_8BIT)
23
- @utf_32le = @utf_8.encode('utf-32le', 'utf-8')
24
- @utf_32le_ascii_8bit = @utf_32le.dup.force_encoding(Encoding::ASCII_8BIT)
25
- else
26
- require 'iconv'
27
- @utf_16_data = Iconv.iconv('utf-16be', 'utf-8', @parsed.first)
28
- @utf_8_ascii_8bit = @utf_8.dup
29
- @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
30
- @utf_16be_ascii_8bit = @utf_16be.dup
31
- @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
32
- @utf_16le_ascii_8bit = @utf_16le.dup
33
- @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
34
- @utf_32be_ascii_8bit = @utf_32be.dup
35
- @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
36
- @utf_32le_ascii_8bit = @utf_32le.dup
37
- end
38
- end
39
-
40
- def test_parse
41
- assert_equal @parsed, JSON.parse(@utf_8)
42
- assert_equal @parsed, JSON.parse(@utf_16be)
43
- assert_equal @parsed, JSON.parse(@utf_16le)
44
- assert_equal @parsed, JSON.parse(@utf_32be)
45
- assert_equal @parsed, JSON.parse(@utf_32le)
46
- end
47
-
48
- def test_parse_ascii_8bit
49
- assert_equal @parsed, JSON.parse(@utf_8_ascii_8bit)
50
- assert_equal @parsed, JSON.parse(@utf_16be_ascii_8bit)
51
- assert_equal @parsed, JSON.parse(@utf_16le_ascii_8bit)
52
- assert_equal @parsed, JSON.parse(@utf_32be_ascii_8bit)
53
- assert_equal @parsed, JSON.parse(@utf_32le_ascii_8bit)
54
- end
55
-
56
- def test_generate
57
- assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
58
- if defined?(::Encoding)
59
- assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
60
- else
61
- # XXX checking of correct utf8 data is not as strict (yet?) without :ascii_only
62
- assert_raises(JSON::GeneratorError) { JSON.generate(@utf_16_data, :ascii_only => true) }
63
- end
64
- end
65
- end
@@ -1,39 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require 'test/unit'
5
- require File.join(File.dirname(__FILE__), 'setup_variant')
6
- require 'stringio'
7
- require 'time'
8
-
9
- class TestJSONStringMatching < Test::Unit::TestCase
10
- include JSON
11
-
12
- class TestTime < ::Time
13
- def self.json_create(string)
14
- Time.parse(string)
15
- end
16
-
17
- def to_json(*)
18
- %{"#{strftime('%FT%T%z')}"}
19
- end
20
-
21
- def ==(other)
22
- to_i == other.to_i
23
- end
24
- end
25
-
26
- def test_match_date
27
- t = TestTime.new
28
- t_json = [ t ].to_json
29
- assert_equal [ t ],
30
- JSON.parse(t_json, :create_additions => true,
31
- :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
32
- assert_equal [ t.strftime('%FT%T%z') ],
33
- JSON.parse(t_json, :create_additions => true,
34
- :match_string => { /\A\d{3}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
35
- assert_equal [ t.strftime('%FT%T%z') ],
36
- JSON.parse(t_json,
37
- :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
38
- end
39
- end