json 2.1.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +74 -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