json 2.1.0 → 2.6.0

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