json 2.4.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +27 -5
  3. data/README.md +3 -3
  4. data/VERSION +1 -1
  5. data/ext/json/ext/generator/generator.c +13 -17
  6. data/ext/json/ext/parser/extconf.rb +1 -0
  7. data/ext/json/ext/parser/parser.c +2971 -1797
  8. data/ext/json/ext/parser/parser.h +5 -1
  9. data/ext/json/ext/parser/parser.rl +106 -53
  10. data/json.gemspec +3 -76
  11. data/lib/json/common.rb +34 -13
  12. data/lib/json/pure/parser.rb +1 -1
  13. data/lib/json/version.rb +1 -1
  14. data/lib/json.rb +1 -1
  15. metadata +7 -110
  16. data/.gitignore +0 -18
  17. data/.travis.yml +0 -23
  18. data/Gemfile +0 -14
  19. data/README-json-jruby.md +0 -33
  20. data/Rakefile +0 -334
  21. data/diagrams/.keep +0 -0
  22. data/install.rb +0 -23
  23. data/java/src/json/ext/ByteListTranscoder.java +0 -166
  24. data/java/src/json/ext/Generator.java +0 -447
  25. data/java/src/json/ext/GeneratorMethods.java +0 -231
  26. data/java/src/json/ext/GeneratorService.java +0 -42
  27. data/java/src/json/ext/GeneratorState.java +0 -520
  28. data/java/src/json/ext/OptionsReader.java +0 -113
  29. data/java/src/json/ext/Parser.java +0 -2374
  30. data/java/src/json/ext/Parser.rl +0 -905
  31. data/java/src/json/ext/ParserService.java +0 -34
  32. data/java/src/json/ext/RuntimeInfo.java +0 -116
  33. data/java/src/json/ext/StringDecoder.java +0 -166
  34. data/java/src/json/ext/StringEncoder.java +0 -117
  35. data/java/src/json/ext/Utils.java +0 -88
  36. data/json-java.gemspec +0 -38
  37. data/json_pure.gemspec +0 -33
  38. data/lib/json/ext/.keep +0 -0
  39. data/references/rfc7159.txt +0 -899
  40. data/tests/fixtures/fail10.json +0 -1
  41. data/tests/fixtures/fail11.json +0 -1
  42. data/tests/fixtures/fail12.json +0 -1
  43. data/tests/fixtures/fail13.json +0 -1
  44. data/tests/fixtures/fail14.json +0 -1
  45. data/tests/fixtures/fail18.json +0 -1
  46. data/tests/fixtures/fail19.json +0 -1
  47. data/tests/fixtures/fail2.json +0 -1
  48. data/tests/fixtures/fail20.json +0 -1
  49. data/tests/fixtures/fail21.json +0 -1
  50. data/tests/fixtures/fail22.json +0 -1
  51. data/tests/fixtures/fail23.json +0 -1
  52. data/tests/fixtures/fail24.json +0 -1
  53. data/tests/fixtures/fail25.json +0 -1
  54. data/tests/fixtures/fail27.json +0 -2
  55. data/tests/fixtures/fail28.json +0 -2
  56. data/tests/fixtures/fail3.json +0 -1
  57. data/tests/fixtures/fail4.json +0 -1
  58. data/tests/fixtures/fail5.json +0 -1
  59. data/tests/fixtures/fail6.json +0 -1
  60. data/tests/fixtures/fail7.json +0 -1
  61. data/tests/fixtures/fail8.json +0 -1
  62. data/tests/fixtures/fail9.json +0 -1
  63. data/tests/fixtures/obsolete_fail1.json +0 -1
  64. data/tests/fixtures/pass1.json +0 -56
  65. data/tests/fixtures/pass15.json +0 -1
  66. data/tests/fixtures/pass16.json +0 -1
  67. data/tests/fixtures/pass17.json +0 -1
  68. data/tests/fixtures/pass2.json +0 -1
  69. data/tests/fixtures/pass26.json +0 -1
  70. data/tests/fixtures/pass3.json +0 -6
  71. data/tests/json_addition_test.rb +0 -199
  72. data/tests/json_common_interface_test.rb +0 -169
  73. data/tests/json_encoding_test.rb +0 -107
  74. data/tests/json_ext_parser_test.rb +0 -15
  75. data/tests/json_fixtures_test.rb +0 -40
  76. data/tests/json_generator_test.rb +0 -432
  77. data/tests/json_generic_object_test.rb +0 -82
  78. data/tests/json_parser_test.rb +0 -497
  79. data/tests/json_string_matching_test.rb +0 -38
  80. data/tests/test_helper.rb +0 -17
  81. data/tools/diff.sh +0 -18
  82. data/tools/fuzz.rb +0 -131
  83. data/tools/server.rb +0 -62
@@ -1,497 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: false
3
- require 'test_helper'
4
- require 'stringio'
5
- require 'tempfile'
6
- require 'ostruct'
7
- require 'bigdecimal'
8
-
9
- class JSONParserTest < Test::Unit::TestCase
10
- include JSON
11
-
12
- def test_construction
13
- parser = JSON::Parser.new('test')
14
- assert_equal 'test', parser.source
15
- end
16
-
17
- def test_argument_encoding
18
- source = "{}".encode("UTF-16")
19
- JSON::Parser.new(source)
20
- assert_equal Encoding::UTF_16, source.encoding
21
- end if defined?(Encoding::UTF_16)
22
-
23
- def test_error_message_encoding
24
- bug10705 = '[ruby-core:67386] [Bug #10705]'
25
- json = ".\"\xE2\x88\x9A\"".force_encoding(Encoding::UTF_8)
26
- e = assert_raise(JSON::ParserError) {
27
- JSON::Ext::Parser.new(json).parse
28
- }
29
- assert_equal(Encoding::UTF_8, e.message.encoding, bug10705)
30
- assert_include(e.message, json, bug10705)
31
- end if defined?(Encoding::UTF_8) and defined?(JSON::Ext::Parser)
32
-
33
- def test_parsing
34
- parser = JSON::Parser.new('"test"')
35
- assert_equal 'test', parser.parse
36
- end
37
-
38
- def test_parser_reset
39
- parser = Parser.new('{"a":"b"}')
40
- assert_equal({ 'a' => 'b' }, parser.parse)
41
- assert_equal({ 'a' => 'b' }, parser.parse)
42
- end
43
-
44
- def test_parse_values
45
- assert_equal(nil, parse('null'))
46
- assert_equal(false, parse('false'))
47
- assert_equal(true, parse('true'))
48
- assert_equal(-23, parse('-23'))
49
- assert_equal(23, parse('23'))
50
- assert_in_delta(0.23, parse('0.23'), 1e-2)
51
- assert_in_delta(0.0, parse('0e0'), 1e-2)
52
- assert_equal("", parse('""'))
53
- assert_equal("foobar", parse('"foobar"'))
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_float([ 0.23 ], parse('[0.23]'))
65
- assert_equal_float([ 0.0 ], parse('[0e0]'))
66
- assert_equal([""], parse('[""]'))
67
- assert_equal(["foobar"], parse('["foobar"]'))
68
- assert_equal([{}], parse('[{}]'))
69
- end
70
-
71
- def test_parse_simple_objects
72
- assert_equal({}, parse('{}'))
73
- assert_equal({}, parse(' { } '))
74
- assert_equal({ "a" => nil }, parse('{ "a" : null}'))
75
- assert_equal({ "a" => nil }, parse('{"a":null}'))
76
- assert_equal({ "a" => false }, parse('{ "a" : false } '))
77
- assert_equal({ "a" => false }, parse('{"a":false}'))
78
- assert_raise(JSON::ParserError) { parse('{false}') }
79
- assert_equal({ "a" => true }, parse('{"a":true}'))
80
- assert_equal({ "a" => true }, parse(' { "a" : true } '))
81
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
82
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
83
- assert_equal({ "a" => 23 }, parse('{"a":23 } '))
84
- assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
85
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
86
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
87
- end
88
-
89
- def test_parse_numbers
90
- assert_raise(JSON::ParserError) { parse('+23.2') }
91
- assert_raise(JSON::ParserError) { parse('+23') }
92
- assert_raise(JSON::ParserError) { parse('.23') }
93
- assert_raise(JSON::ParserError) { parse('023') }
94
- assert_equal(23, parse('23'))
95
- assert_equal(-23, parse('-23'))
96
- assert_equal_float(3.141, parse('3.141'))
97
- assert_equal_float(-3.141, parse('-3.141'))
98
- assert_equal_float(3.141, parse('3141e-3'))
99
- assert_equal_float(3.141, parse('3141.1e-3'))
100
- assert_equal_float(3.141, parse('3141E-3'))
101
- assert_equal_float(3.141, parse('3141.0E-3'))
102
- assert_equal_float(-3.141, parse('-3141.0e-3'))
103
- assert_equal_float(-3.141, parse('-3141e-3'))
104
- assert_raise(ParserError) { parse('NaN') }
105
- assert parse('NaN', :allow_nan => true).nan?
106
- assert_raise(ParserError) { parse('Infinity') }
107
- assert_equal(1.0/0, parse('Infinity', :allow_nan => true))
108
- assert_raise(ParserError) { parse('-Infinity') }
109
- assert_equal(-1.0/0, parse('-Infinity', :allow_nan => true))
110
- end
111
-
112
- def test_parse_bigdecimals
113
- assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
114
- assert_equal(BigDecimal("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] )
115
- end
116
-
117
- if Array.method_defined?(:permutation)
118
- def test_parse_more_complex_arrays
119
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
120
- a.permutation.each do |perm|
121
- json = pretty_generate(perm)
122
- assert_equal perm, parse(json)
123
- end
124
- end
125
-
126
- def test_parse_complex_objects
127
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
128
- a.permutation.each do |perm|
129
- s = "a"
130
- orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
131
- json = pretty_generate(orig_obj)
132
- assert_equal orig_obj, parse(json)
133
- end
134
- end
135
- end
136
-
137
- def test_parse_arrays
138
- assert_equal([1,2,3], parse('[1,2,3]'))
139
- assert_equal([1.2,2,3], parse('[1.2,2,3]'))
140
- assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
141
- assert_equal([], parse('[]'))
142
- assert_equal([], parse(' [ ] '))
143
- assert_equal([1], parse('[1]'))
144
- assert_equal([1], parse(' [ 1 ] '))
145
- ary = [[1], ["foo"], [3.14], [4711.0], [2.718], [nil],
146
- [[1, -2, 3]], [false], [true]]
147
- assert_equal(ary,
148
- parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]],[false],[true]]'))
149
- assert_equal(ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
150
- , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
151
- end
152
-
153
- def test_parse_json_primitive_values
154
- assert_raise(JSON::ParserError) { parse('') }
155
- assert_raise(TypeError) { parse(nil) }
156
- assert_raise(JSON::ParserError) { parse(' /* foo */ ') }
157
- assert_equal nil, parse('null')
158
- assert_equal false, parse('false')
159
- assert_equal true, parse('true')
160
- assert_equal 23, parse('23')
161
- assert_equal 1, parse('1')
162
- assert_equal_float 3.141, parse('3.141'), 1E-3
163
- assert_equal 2 ** 64, parse('18446744073709551616')
164
- assert_equal 'foo', parse('"foo"')
165
- assert parse('NaN', :allow_nan => true).nan?
166
- assert parse('Infinity', :allow_nan => true).infinite?
167
- assert parse('-Infinity', :allow_nan => true).infinite?
168
- assert_raise(JSON::ParserError) { parse('[ 1, ]') }
169
- end
170
-
171
- def test_parse_some_strings
172
- assert_equal([""], parse('[""]'))
173
- assert_equal(["\\"], parse('["\\\\"]'))
174
- assert_equal(['"'], parse('["\""]'))
175
- assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
176
- assert_equal(
177
- ["\"\b\n\r\t\0\037"],
178
- parse('["\"\b\n\r\t\u0000\u001f"]')
179
- )
180
- end
181
-
182
- def test_parse_big_integers
183
- json1 = JSON(orig = (1 << 31) - 1)
184
- assert_equal orig, parse(json1)
185
- json2 = JSON(orig = 1 << 31)
186
- assert_equal orig, parse(json2)
187
- json3 = JSON(orig = (1 << 62) - 1)
188
- assert_equal orig, parse(json3)
189
- json4 = JSON(orig = 1 << 62)
190
- assert_equal orig, parse(json4)
191
- json5 = JSON(orig = 1 << 64)
192
- assert_equal orig, parse(json5)
193
- end
194
-
195
- def test_some_wrong_inputs
196
- assert_raise(ParserError) { parse('[] bla') }
197
- assert_raise(ParserError) { parse('[] 1') }
198
- assert_raise(ParserError) { parse('[] []') }
199
- assert_raise(ParserError) { parse('[] {}') }
200
- assert_raise(ParserError) { parse('{} []') }
201
- assert_raise(ParserError) { parse('{} {}') }
202
- assert_raise(ParserError) { parse('[NULL]') }
203
- assert_raise(ParserError) { parse('[FALSE]') }
204
- assert_raise(ParserError) { parse('[TRUE]') }
205
- assert_raise(ParserError) { parse('[07] ') }
206
- assert_raise(ParserError) { parse('[0a]') }
207
- assert_raise(ParserError) { parse('[1.]') }
208
- assert_raise(ParserError) { parse(' ') }
209
- end
210
-
211
- def test_symbolize_names
212
- assert_equal({ "foo" => "bar", "baz" => "quux" },
213
- parse('{"foo":"bar", "baz":"quux"}'))
214
- assert_equal({ :foo => "bar", :baz => "quux" },
215
- parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
216
- assert_raise(ArgumentError) do
217
- parse('{}', :symbolize_names => true, :create_additions => true)
218
- end
219
- end
220
-
221
- def test_freeze
222
- assert_predicate parse('{}', :freeze => true), :frozen?
223
- assert_predicate parse('[]', :freeze => true), :frozen?
224
- assert_predicate parse('"foo"', :freeze => true), :frozen?
225
-
226
- if string_deduplication_available?
227
- assert_same(-'foo', parse('"foo"', :freeze => true))
228
- assert_same(-'foo', parse('{"foo": 1}', :freeze => true).keys.first)
229
- end
230
- end
231
-
232
- def test_parse_comments
233
- json = <<EOT
234
- {
235
- "key1":"value1", // eol comment
236
- "key2":"value2" /* multi line
237
- * comment */,
238
- "key3":"value3" /* multi line
239
- // nested eol comment
240
- * comment */
241
- }
242
- EOT
243
- assert_equal(
244
- { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
245
- parse(json))
246
- json = <<EOT
247
- {
248
- "key1":"value1" /* multi line
249
- // nested eol comment
250
- /* illegal nested multi line comment */
251
- * comment */
252
- }
253
- EOT
254
- assert_raise(ParserError) { parse(json) }
255
- json = <<EOT
256
- {
257
- "key1":"value1" /* multi line
258
- // nested eol comment
259
- closed multi comment */
260
- and again, throw an Error */
261
- }
262
- EOT
263
- assert_raise(ParserError) { parse(json) }
264
- json = <<EOT
265
- {
266
- "key1":"value1" /*/*/
267
- }
268
- EOT
269
- assert_equal({ "key1" => "value1" }, parse(json))
270
- end
271
-
272
- def test_nesting
273
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
274
- too_deep_ary = eval too_deep
275
- assert_raise(JSON::NestingError) { parse too_deep }
276
- assert_raise(JSON::NestingError) { parse too_deep, :max_nesting => 100 }
277
- ok = parse too_deep, :max_nesting => 101
278
- assert_equal too_deep_ary, ok
279
- ok = parse too_deep, :max_nesting => nil
280
- assert_equal too_deep_ary, ok
281
- ok = parse too_deep, :max_nesting => false
282
- assert_equal too_deep_ary, ok
283
- ok = parse too_deep, :max_nesting => 0
284
- assert_equal too_deep_ary, ok
285
- end
286
-
287
- def test_backslash
288
- data = [ '\\.(?i:gif|jpe?g|png)$' ]
289
- json = '["\\\\.(?i:gif|jpe?g|png)$"]'
290
- assert_equal data, parse(json)
291
- #
292
- data = [ '\\"' ]
293
- json = '["\\\\\""]'
294
- assert_equal data, parse(json)
295
- #
296
- json = '["/"]'
297
- data = [ '/' ]
298
- assert_equal data, parse(json)
299
- #
300
- json = '["\""]'
301
- data = ['"']
302
- assert_equal data, parse(json)
303
- #
304
- json = '["\\\'"]'
305
- data = ["'"]
306
- assert_equal data, parse(json)
307
-
308
- json = '["\/"]'
309
- data = [ '/' ]
310
- assert_equal data, parse(json)
311
- end
312
-
313
- class SubArray < Array
314
- def <<(v)
315
- @shifted = true
316
- super
317
- end
318
-
319
- def shifted?
320
- @shifted
321
- end
322
- end
323
-
324
- class SubArray2 < Array
325
- def to_json(*a)
326
- {
327
- JSON.create_id => self.class.name,
328
- 'ary' => to_a,
329
- }.to_json(*a)
330
- end
331
-
332
- def self.json_create(o)
333
- o.delete JSON.create_id
334
- o['ary']
335
- end
336
- end
337
-
338
- class SubArrayWrapper
339
- def initialize
340
- @data = []
341
- end
342
-
343
- attr_reader :data
344
-
345
- def [](index)
346
- @data[index]
347
- end
348
-
349
- def <<(value)
350
- @data << value
351
- @shifted = true
352
- end
353
-
354
- def shifted?
355
- @shifted
356
- end
357
- end
358
-
359
- def test_parse_array_custom_array_derived_class
360
- res = parse('[1,2]', :array_class => SubArray)
361
- assert_equal([1,2], res)
362
- assert_equal(SubArray, res.class)
363
- assert res.shifted?
364
- end
365
-
366
- def test_parse_array_custom_non_array_derived_class
367
- res = parse('[1,2]', :array_class => SubArrayWrapper)
368
- assert_equal([1,2], res.data)
369
- assert_equal(SubArrayWrapper, res.class)
370
- assert res.shifted?
371
- end
372
-
373
- def test_parse_object
374
- assert_equal({}, parse('{}'))
375
- assert_equal({}, parse(' { } '))
376
- assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
377
- assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
378
- end
379
-
380
- class SubHash < Hash
381
- def []=(k, v)
382
- @item_set = true
383
- super
384
- end
385
-
386
- def item_set?
387
- @item_set
388
- end
389
- end
390
-
391
- class SubHash2 < Hash
392
- def to_json(*a)
393
- {
394
- JSON.create_id => self.class.name,
395
- }.merge(self).to_json(*a)
396
- end
397
-
398
- def self.json_create(o)
399
- o.delete JSON.create_id
400
- self[o]
401
- end
402
- end
403
-
404
- class SubOpenStruct < OpenStruct
405
- def [](k)
406
- __send__(k)
407
- end
408
-
409
- def []=(k, v)
410
- @item_set = true
411
- __send__("#{k}=", v)
412
- end
413
-
414
- def item_set?
415
- @item_set
416
- end
417
- end
418
-
419
- def test_parse_object_custom_hash_derived_class
420
- res = parse('{"foo":"bar"}', :object_class => SubHash)
421
- assert_equal({"foo" => "bar"}, res)
422
- assert_equal(SubHash, res.class)
423
- assert res.item_set?
424
- end
425
-
426
- def test_parse_object_custom_non_hash_derived_class
427
- res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
428
- assert_equal "bar", res.foo
429
- assert_equal(SubOpenStruct, res.class)
430
- assert res.item_set?
431
- end
432
-
433
- def test_parse_generic_object
434
- res = parse(
435
- '{"foo":"bar", "baz":{}}',
436
- :object_class => JSON::GenericObject
437
- )
438
- assert_equal(JSON::GenericObject, res.class)
439
- assert_equal "bar", res.foo
440
- assert_equal "bar", res["foo"]
441
- assert_equal "bar", res[:foo]
442
- assert_equal "bar", res.to_hash[:foo]
443
- assert_equal(JSON::GenericObject, res.baz.class)
444
- end
445
-
446
- def test_generate_core_subclasses_with_new_to_json
447
- obj = SubHash2["foo" => SubHash2["bar" => true]]
448
- obj_json = JSON(obj)
449
- obj_again = parse(obj_json, :create_additions => true)
450
- assert_kind_of SubHash2, obj_again
451
- assert_kind_of SubHash2, obj_again['foo']
452
- assert obj_again['foo']['bar']
453
- assert_equal obj, obj_again
454
- assert_equal ["foo"],
455
- JSON(JSON(SubArray2["foo"]), :create_additions => true)
456
- end
457
-
458
- def test_generate_core_subclasses_with_default_to_json
459
- assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
460
- assert_equal '["foo"]', JSON(SubArray["foo"])
461
- end
462
-
463
- def test_generate_of_core_subclasses
464
- obj = SubHash["foo" => SubHash["bar" => true]]
465
- obj_json = JSON(obj)
466
- obj_again = JSON(obj_json)
467
- assert_kind_of Hash, obj_again
468
- assert_kind_of Hash, obj_again['foo']
469
- assert obj_again['foo']['bar']
470
- assert_equal obj, obj_again
471
- end
472
-
473
- def test_parsing_frozen_ascii8bit_string
474
- assert_equal(
475
- { 'foo' => 'bar' },
476
- JSON('{ "foo": "bar" }'.force_encoding(Encoding::ASCII_8BIT).freeze)
477
- )
478
- end
479
-
480
- private
481
-
482
- def string_deduplication_available?
483
- r1 = rand.to_s
484
- r2 = r1.dup
485
- begin
486
- (-r1).equal?(-r2)
487
- rescue NoMethodError
488
- false # No String#-@
489
- end
490
- end
491
-
492
- def assert_equal_float(expected, actual, delta = 1e-2)
493
- Array === expected and expected = expected.first
494
- Array === actual and actual = actual.first
495
- assert_in_delta(expected, actual, delta)
496
- end
497
- end
@@ -1,38 +0,0 @@
1
- #frozen_string_literal: false
2
- require 'test_helper'
3
- require 'time'
4
-
5
- class JSONStringMatchingTest < Test::Unit::TestCase
6
- include JSON
7
-
8
- class TestTime < ::Time
9
- def self.json_create(string)
10
- Time.parse(string)
11
- end
12
-
13
- def to_json(*)
14
- %{"#{strftime('%FT%T%z')}"}
15
- end
16
-
17
- def ==(other)
18
- to_i == other.to_i
19
- end
20
- end
21
-
22
- def test_match_date
23
- t = TestTime.new
24
- t_json = [ t ].to_json
25
- time_regexp = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/
26
- assert_equal [ t ],
27
- parse(
28
- t_json,
29
- :create_additions => true,
30
- :match_string => { time_regexp => TestTime }
31
- )
32
- assert_equal [ t.strftime('%FT%T%z') ],
33
- parse(
34
- t_json,
35
- :match_string => { time_regexp => TestTime }
36
- )
37
- end
38
- end
data/tests/test_helper.rb DELETED
@@ -1,17 +0,0 @@
1
- case ENV['JSON']
2
- when 'pure'
3
- $:.unshift File.join(__dir__, '../lib')
4
- require 'json/pure'
5
- when 'ext'
6
- $:.unshift File.join(__dir__, '../ext'), File.join(__dir__, '../lib')
7
- require 'json/ext'
8
- else
9
- $:.unshift File.join(__dir__, '../ext'), File.join(__dir__, '../lib')
10
- require 'json'
11
- end
12
-
13
- require 'test/unit'
14
- begin
15
- require 'byebug'
16
- rescue LoadError
17
- end
data/tools/diff.sh DELETED
@@ -1,18 +0,0 @@
1
- #!/bin/sh
2
-
3
- files=`find ext -name '*.[ch]' -o -name parser.rl`
4
-
5
- for f in $files
6
- do
7
- b=`basename $f`
8
- g=`find ../ruby/ext/json -name $b`
9
- d=`diff -u $f $g`
10
- test -z "$d" && continue
11
- echo "$d"
12
- read -p "Edit diff of $b? " a
13
- case $a in
14
- [yY]*)
15
- vimdiff $f $g
16
- ;;
17
- esac
18
- done
data/tools/fuzz.rb DELETED
@@ -1,131 +0,0 @@
1
- require 'json'
2
-
3
- class Fuzzer
4
- def initialize(n, freqs = {})
5
- sum = freqs.inject(0.0) { |s, x| s + x.last }
6
- freqs.each_key { |x| freqs[x] /= sum }
7
- s = 0.0
8
- freqs.each_key do |x|
9
- freqs[x] = s .. (s + t = freqs[x])
10
- s += t
11
- end
12
- @freqs = freqs
13
- @n = n
14
- @alpha = (0..0xff).to_a
15
- end
16
-
17
- def random_string
18
- s = ''
19
- 30.times { s << @alpha[rand(@alpha.size)] }
20
- s
21
- end
22
-
23
- def pick
24
- r = rand
25
- found = @freqs.find { |k, f| f.include? rand }
26
- found && found.first
27
- end
28
-
29
- def make_pick
30
- k = pick
31
- case
32
- when k == Hash, k == Array
33
- k.new
34
- when k == true, k == false, k == nil
35
- k
36
- when k == String
37
- random_string
38
- when k == Fixnum
39
- rand(2 ** 30) - 2 ** 29
40
- when k == Bignum
41
- rand(2 ** 70) - 2 ** 69
42
- end
43
- end
44
-
45
- def fuzz(current = nil)
46
- if @n > 0
47
- case current
48
- when nil
49
- @n -= 1
50
- current = fuzz [ Hash, Array ][rand(2)].new
51
- when Array
52
- while @n > 0
53
- @n -= 1
54
- current << case p = make_pick
55
- when Array, Hash
56
- fuzz(p)
57
- else
58
- p
59
- end
60
- end
61
- when Hash
62
- while @n > 0
63
- @n -= 1
64
- current[random_string] = case p = make_pick
65
- when Array, Hash
66
- fuzz(p)
67
- else
68
- p
69
- end
70
- end
71
- end
72
- end
73
- current
74
- end
75
- end
76
-
77
- class MyState < JSON.state
78
- WS = " \r\t\n"
79
-
80
- def initialize
81
- super(
82
- :indent => make_spaces,
83
- :space => make_spaces,
84
- :space_before => make_spaces,
85
- :object_nl => make_spaces,
86
- :array_nl => make_spaces,
87
- :max_nesting => false
88
- )
89
- end
90
-
91
- def make_spaces
92
- s = ''
93
- rand(1).times { s << WS[rand(WS.size)] }
94
- s
95
- end
96
- end
97
-
98
- n = (ARGV.shift || 500).to_i
99
- loop do
100
- fuzzer = Fuzzer.new(n,
101
- Hash => 25,
102
- Array => 25,
103
- String => 10,
104
- Fixnum => 10,
105
- Bignum => 10,
106
- nil => 5,
107
- true => 5,
108
- false => 5
109
- )
110
- o1 = fuzzer.fuzz
111
- json = JSON.generate o1, MyState.new
112
- if $DEBUG
113
- puts "-" * 80
114
- puts json, json.size
115
- else
116
- puts json.size
117
- end
118
- begin
119
- o2 = JSON.parse(json, :max_nesting => false)
120
- rescue JSON::ParserError => e
121
- puts "Caught #{e.class}: #{e.message}\n#{e.backtrace * "\n"}"
122
- puts "o1 = #{o1.inspect}", "json = #{json}", "json_str = #{json.inspect}"
123
- puts "locals = #{local_variables.inspect}"
124
- exit
125
- end
126
- if o1 != o2
127
- puts "mismatch", "o1 = #{o1.inspect}", "o2 = #{o2.inspect}",
128
- "json = #{json}", "json_str = #{json.inspect}"
129
- puts "locals = #{local_variables.inspect}"
130
- end
131
- end