json 1.2.0 → 2.19.8

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/BSDL +22 -0
  3. data/CHANGES.md +783 -0
  4. data/COPYING +14 -16
  5. data/LEGAL +20 -0
  6. data/README.md +310 -0
  7. data/ext/json/ext/fbuffer/fbuffer.h +260 -0
  8. data/ext/json/ext/generator/extconf.rb +15 -8
  9. data/ext/json/ext/generator/generator.c +1675 -613
  10. data/ext/json/ext/json.h +116 -0
  11. data/ext/json/ext/parser/extconf.rb +16 -7
  12. data/ext/json/ext/parser/parser.c +1649 -1772
  13. data/ext/json/ext/simd/conf.rb +24 -0
  14. data/ext/json/ext/simd/simd.h +208 -0
  15. data/ext/json/ext/vendor/fpconv.c +480 -0
  16. data/ext/json/ext/vendor/jeaiii-ltoa.h +267 -0
  17. data/ext/json/ext/vendor/ryu.h +819 -0
  18. data/json.gemspec +62 -0
  19. data/lib/json/add/bigdecimal.rb +58 -0
  20. data/lib/json/add/complex.rb +51 -0
  21. data/lib/json/add/core.rb +11 -133
  22. data/lib/json/add/date.rb +54 -0
  23. data/lib/json/add/date_time.rb +67 -0
  24. data/lib/json/add/exception.rb +49 -0
  25. data/lib/json/add/ostruct.rb +54 -0
  26. data/lib/json/add/range.rb +54 -0
  27. data/lib/json/add/rational.rb +49 -0
  28. data/lib/json/add/regexp.rb +48 -0
  29. data/lib/json/add/set.rb +48 -0
  30. data/lib/json/add/string.rb +35 -0
  31. data/lib/json/add/struct.rb +52 -0
  32. data/lib/json/add/symbol.rb +52 -0
  33. data/lib/json/add/time.rb +52 -0
  34. data/lib/json/common.rb +1056 -254
  35. data/lib/json/ext/generator/state.rb +103 -0
  36. data/lib/json/ext.rb +35 -5
  37. data/lib/json/generic_object.rb +67 -0
  38. data/lib/json/truffle_ruby/generator.rb +755 -0
  39. data/lib/json/version.rb +3 -6
  40. data/lib/json.rb +671 -6
  41. metadata +68 -159
  42. data/CHANGES +0 -136
  43. data/GPL +0 -340
  44. data/README +0 -360
  45. data/Rakefile +0 -287
  46. data/TODO +0 -1
  47. data/VERSION +0 -1
  48. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +0 -52
  49. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +0 -1000
  50. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +0 -1001
  51. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +0 -900
  52. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +0 -901
  53. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +0 -1000
  54. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +0 -1001
  55. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +0 -261
  56. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +0 -1000
  57. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +0 -1001
  58. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +0 -1000
  59. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +0 -1001
  60. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +0 -1000
  61. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +0 -1001
  62. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +0 -262
  63. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +0 -1000
  64. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +0 -1001
  65. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +0 -82
  66. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +0 -34
  67. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +0 -900
  68. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +0 -901
  69. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +0 -81
  70. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +0 -1000
  71. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +0 -1001
  72. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +0 -82
  73. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +0 -1000
  74. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +0 -1001
  75. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +0 -82
  76. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +0 -1000
  77. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +0 -1001
  78. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +0 -82
  79. data/benchmarks/generator_benchmark.rb +0 -165
  80. data/benchmarks/parser_benchmark.rb +0 -197
  81. data/bin/edit_json.rb +0 -9
  82. data/bin/prettify_json.rb +0 -75
  83. data/data/example.json +0 -1
  84. data/data/index.html +0 -38
  85. data/data/prototype.js +0 -4184
  86. data/ext/json/ext/generator/unicode.c +0 -180
  87. data/ext/json/ext/generator/unicode.h +0 -53
  88. data/ext/json/ext/parser/parser.rl +0 -737
  89. data/ext/json/ext/parser/unicode.c +0 -154
  90. data/ext/json/ext/parser/unicode.h +0 -58
  91. data/install.rb +0 -26
  92. data/lib/json/Array.xpm +0 -21
  93. data/lib/json/FalseClass.xpm +0 -21
  94. data/lib/json/Hash.xpm +0 -21
  95. data/lib/json/Key.xpm +0 -73
  96. data/lib/json/NilClass.xpm +0 -21
  97. data/lib/json/Numeric.xpm +0 -28
  98. data/lib/json/String.xpm +0 -96
  99. data/lib/json/TrueClass.xpm +0 -21
  100. data/lib/json/add/rails.rb +0 -58
  101. data/lib/json/editor.rb +0 -1371
  102. data/lib/json/json.xpm +0 -1499
  103. data/lib/json/pure/generator.rb +0 -443
  104. data/lib/json/pure/parser.rb +0 -303
  105. data/lib/json/pure.rb +0 -77
  106. data/tests/fixtures/fail1.json +0 -1
  107. data/tests/fixtures/fail10.json +0 -1
  108. data/tests/fixtures/fail11.json +0 -1
  109. data/tests/fixtures/fail12.json +0 -1
  110. data/tests/fixtures/fail13.json +0 -1
  111. data/tests/fixtures/fail14.json +0 -1
  112. data/tests/fixtures/fail18.json +0 -1
  113. data/tests/fixtures/fail19.json +0 -1
  114. data/tests/fixtures/fail2.json +0 -1
  115. data/tests/fixtures/fail20.json +0 -1
  116. data/tests/fixtures/fail21.json +0 -1
  117. data/tests/fixtures/fail22.json +0 -1
  118. data/tests/fixtures/fail23.json +0 -1
  119. data/tests/fixtures/fail24.json +0 -1
  120. data/tests/fixtures/fail25.json +0 -1
  121. data/tests/fixtures/fail27.json +0 -2
  122. data/tests/fixtures/fail28.json +0 -2
  123. data/tests/fixtures/fail3.json +0 -1
  124. data/tests/fixtures/fail4.json +0 -1
  125. data/tests/fixtures/fail5.json +0 -1
  126. data/tests/fixtures/fail6.json +0 -1
  127. data/tests/fixtures/fail7.json +0 -1
  128. data/tests/fixtures/fail8.json +0 -1
  129. data/tests/fixtures/fail9.json +0 -1
  130. data/tests/fixtures/pass1.json +0 -56
  131. data/tests/fixtures/pass15.json +0 -1
  132. data/tests/fixtures/pass16.json +0 -1
  133. data/tests/fixtures/pass17.json +0 -1
  134. data/tests/fixtures/pass2.json +0 -1
  135. data/tests/fixtures/pass26.json +0 -1
  136. data/tests/fixtures/pass3.json +0 -6
  137. data/tests/test_json.rb +0 -320
  138. data/tests/test_json_addition.rb +0 -164
  139. data/tests/test_json_encoding.rb +0 -67
  140. data/tests/test_json_fixtures.rb +0 -34
  141. data/tests/test_json_generate.rb +0 -120
  142. data/tests/test_json_rails.rb +0 -146
  143. data/tests/test_json_unicode.rb +0 -62
  144. data/tools/fuzz.rb +0 -139
  145. data/tools/server.rb +0 -61
data/tests/test_json.rb DELETED
@@ -1,320 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
- require 'test/unit'
5
- case ENV['JSON']
6
- when 'pure' then require 'json/pure'
7
- when 'ext' then require 'json/ext'
8
- else require 'json'
9
- end
10
- require 'stringio'
11
-
12
- unless Array.method_defined?(:permutation)
13
- begin
14
- require 'enumerator'
15
- require 'permutation'
16
- class Array
17
- def permutation
18
- Permutation.for(self).to_enum.map { |x| x.project }
19
- end
20
- end
21
- rescue LoadError
22
- warn "Skipping permutation tests."
23
- end
24
- end
25
-
26
- class TC_JSON < Test::Unit::TestCase
27
- include JSON
28
-
29
- def setup
30
- @ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
31
- |x| [x]
32
- end
33
- @ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
34
- "[1,-2,3]", "false", "true"].map do
35
- |x| "[#{x}]"
36
- end
37
- @hash = {
38
- 'a' => 2,
39
- 'b' => 3.141,
40
- 'c' => 'c',
41
- 'd' => [ 1, "b", 3.14 ],
42
- 'e' => { 'foo' => 'bar' },
43
- 'g' => "\"\0\037",
44
- 'h' => 1000.0,
45
- 'i' => 0.001
46
- }
47
- @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
48
- '"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
49
- end
50
-
51
- def test_construction
52
- parser = JSON::Parser.new('test')
53
- assert_equal 'test', parser.source
54
- end
55
-
56
- def assert_equal_float(expected, is)
57
- assert_in_delta(expected.first, is.first, 1e-2)
58
- end
59
-
60
- def test_parse_simple_arrays
61
- assert_equal([], parse('[]'))
62
- assert_equal([], parse(' [ ] '))
63
- assert_equal([nil], parse('[null]'))
64
- assert_equal([false], parse('[false]'))
65
- assert_equal([true], parse('[true]'))
66
- assert_equal([-23], parse('[-23]'))
67
- assert_equal([23], parse('[23]'))
68
- assert_equal([0.23], parse('[0.23]'))
69
- assert_equal([0.0], parse('[0e0]'))
70
- assert_raises(JSON::ParserError) { parse('[+23.2]') }
71
- assert_raises(JSON::ParserError) { parse('[+23]') }
72
- assert_raises(JSON::ParserError) { parse('[.23]') }
73
- assert_raises(JSON::ParserError) { parse('[023]') }
74
- assert_equal_float [3.141], parse('[3.141]')
75
- assert_equal_float [-3.141], parse('[-3.141]')
76
- assert_equal_float [3.141], parse('[3141e-3]')
77
- assert_equal_float [3.141], parse('[3141.1e-3]')
78
- assert_equal_float [3.141], parse('[3141E-3]')
79
- assert_equal_float [3.141], parse('[3141.0E-3]')
80
- assert_equal_float [-3.141], parse('[-3141.0e-3]')
81
- assert_equal_float [-3.141], parse('[-3141e-3]')
82
- assert_raises(ParserError) { parse('[NaN]') }
83
- assert parse('[NaN]', :allow_nan => true).first.nan?
84
- assert_raises(ParserError) { parse('[Infinity]') }
85
- assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
86
- assert_raises(ParserError) { parse('[-Infinity]') }
87
- assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
88
- assert_equal([""], parse('[""]'))
89
- assert_equal(["foobar"], parse('["foobar"]'))
90
- assert_equal([{}], parse('[{}]'))
91
- end
92
-
93
- def test_parse_simple_objects
94
- assert_equal({}, parse('{}'))
95
- assert_equal({}, parse(' { } '))
96
- assert_equal({ "a" => nil }, parse('{ "a" : null}'))
97
- assert_equal({ "a" => nil }, parse('{"a":null}'))
98
- assert_equal({ "a" => false }, parse('{ "a" : false } '))
99
- assert_equal({ "a" => false }, parse('{"a":false}'))
100
- assert_raises(JSON::ParserError) { parse('{false}') }
101
- assert_equal({ "a" => true }, parse('{"a":true}'))
102
- assert_equal({ "a" => true }, parse(' { "a" : true } '))
103
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
104
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
105
- assert_equal({ "a" => 23 }, parse('{"a":23 } '))
106
- assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
107
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
108
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
109
- end
110
-
111
- if Array.method_defined?(:permutation)
112
- def test_parse_more_complex_arrays
113
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
114
- a.permutation.each do |perm|
115
- json = pretty_generate(perm)
116
- assert_equal perm, parse(json)
117
- end
118
- end
119
-
120
- def test_parse_complex_objects
121
- a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
122
- a.permutation.each do |perm|
123
- s = "a"
124
- orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
125
- json = pretty_generate(orig_obj)
126
- assert_equal orig_obj, parse(json)
127
- end
128
- end
129
- end
130
-
131
- def test_parse_arrays
132
- assert_equal([1,2,3], parse('[1,2,3]'))
133
- assert_equal([1.2,2,3], parse('[1.2,2,3]'))
134
- assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
135
- end
136
-
137
- def test_parse_values
138
- assert_equal([""], parse('[""]'))
139
- assert_equal(["\\"], parse('["\\\\"]'))
140
- assert_equal(['"'], parse('["\""]'))
141
- assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
142
- assert_equal(["\"\b\n\r\t\0\037"],
143
- parse('["\"\b\n\r\t\u0000\u001f"]'))
144
- for i in 0 ... @ary.size
145
- assert_equal(@ary[i], parse(@ary_to_parse[i]))
146
- end
147
- end
148
-
149
- def test_parse_array
150
- assert_equal([], parse('[]'))
151
- assert_equal([], parse(' [ ] '))
152
- assert_equal([1], parse('[1]'))
153
- assert_equal([1], parse(' [ 1 ] '))
154
- assert_equal(@ary,
155
- parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
156
- ',[false],[true]]'))
157
- assert_equal(@ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]
158
- , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
159
- end
160
-
161
- class SubArray < Array; end
162
-
163
- def test_parse_array_custom_class
164
- res = parse('[]', :array_class => SubArray)
165
- assert_equal([], res)
166
- assert_equal(SubArray, res.class)
167
- end
168
-
169
- def test_parse_object
170
- assert_equal({}, parse('{}'))
171
- assert_equal({}, parse(' { } '))
172
- assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
173
- assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
174
- end
175
-
176
- class SubHash < Hash; end
177
-
178
- def test_parse_object_custom_class
179
- res = parse('{}', :object_class => SubHash)
180
- assert_equal({}, res)
181
- assert_equal(SubHash, res.class)
182
- end
183
-
184
- def test_parser_reset
185
- parser = Parser.new(@json)
186
- assert_equal(@hash, parser.parse)
187
- assert_equal(@hash, parser.parse)
188
- end
189
-
190
- def test_comments
191
- json = <<EOT
192
- {
193
- "key1":"value1", // eol comment
194
- "key2":"value2" /* multi line
195
- * comment */,
196
- "key3":"value3" /* multi line
197
- // nested eol comment
198
- * comment */
199
- }
200
- EOT
201
- assert_equal(
202
- { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
203
- parse(json))
204
- json = <<EOT
205
- {
206
- "key1":"value1" /* multi line
207
- // nested eol comment
208
- /* illegal nested multi line comment */
209
- * comment */
210
- }
211
- EOT
212
- assert_raises(ParserError) { parse(json) }
213
- json = <<EOT
214
- {
215
- "key1":"value1" /* multi line
216
- // nested eol comment
217
- closed multi comment */
218
- and again, throw an Error */
219
- }
220
- EOT
221
- assert_raises(ParserError) { parse(json) }
222
- json = <<EOT
223
- {
224
- "key1":"value1" /*/*/
225
- }
226
- EOT
227
- assert_equal({ "key1" => "value1" }, parse(json))
228
- end
229
-
230
- def test_backslash
231
- data = [ '\\.(?i:gif|jpe?g|png)$' ]
232
- json = '["\\\\.(?i:gif|jpe?g|png)$"]'
233
- assert_equal json, JSON.generate(data)
234
- assert_equal data, JSON.parse(json)
235
- #
236
- data = [ '\\"' ]
237
- json = '["\\\\\""]'
238
- assert_equal json, JSON.generate(data)
239
- assert_equal data, JSON.parse(json)
240
- #
241
- json = '["/"]'
242
- data = JSON.parse(json)
243
- assert_equal ['/'], data
244
- assert_equal json, JSON.generate(data)
245
- #
246
- json = '["\""]'
247
- data = JSON.parse(json)
248
- assert_equal ['"'], data
249
- assert_equal json, JSON.generate(data)
250
- json = '["\\\'"]'
251
- data = JSON.parse(json)
252
- assert_equal ["'"], data
253
- assert_equal '["\'"]', JSON.generate(data)
254
- end
255
-
256
- def test_wrong_inputs
257
- assert_raises(ParserError) { JSON.parse('"foo"') }
258
- assert_raises(ParserError) { JSON.parse('123') }
259
- assert_raises(ParserError) { JSON.parse('[] bla') }
260
- assert_raises(ParserError) { JSON.parse('[] 1') }
261
- assert_raises(ParserError) { JSON.parse('[] []') }
262
- assert_raises(ParserError) { JSON.parse('[] {}') }
263
- assert_raises(ParserError) { JSON.parse('{} []') }
264
- assert_raises(ParserError) { JSON.parse('{} {}') }
265
- assert_raises(ParserError) { JSON.parse('[NULL]') }
266
- assert_raises(ParserError) { JSON.parse('[FALSE]') }
267
- assert_raises(ParserError) { JSON.parse('[TRUE]') }
268
- assert_raises(ParserError) { JSON.parse('[07] ') }
269
- assert_raises(ParserError) { JSON.parse('[0a]') }
270
- assert_raises(ParserError) { JSON.parse('[1.]') }
271
- assert_raises(ParserError) { JSON.parse(' ') }
272
- end
273
-
274
- def test_nesting
275
- assert_raises(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
276
- assert_raises(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
277
- assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
278
- too_deep = '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]'
279
- too_deep_ary = eval too_deep
280
- assert_raises(JSON::NestingError) { JSON.parse too_deep }
281
- assert_raises(JSON::NestingError) { JSON.parser.new(too_deep).parse }
282
- assert_raises(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 19 }
283
- ok = JSON.parse too_deep, :max_nesting => 20
284
- assert_equal too_deep_ary, ok
285
- ok = JSON.parse too_deep, :max_nesting => nil
286
- assert_equal too_deep_ary, ok
287
- ok = JSON.parse too_deep, :max_nesting => false
288
- assert_equal too_deep_ary, ok
289
- ok = JSON.parse too_deep, :max_nesting => 0
290
- assert_equal too_deep_ary, ok
291
- assert_raises(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
292
- assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
293
- assert_raises(JSON::NestingError) { JSON.generate too_deep_ary }
294
- assert_raises(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 19 }
295
- ok = JSON.generate too_deep_ary, :max_nesting => 20
296
- assert_equal too_deep, ok
297
- ok = JSON.generate too_deep_ary, :max_nesting => nil
298
- assert_equal too_deep, ok
299
- ok = JSON.generate too_deep_ary, :max_nesting => false
300
- assert_equal too_deep, ok
301
- ok = JSON.generate too_deep_ary, :max_nesting => 0
302
- assert_equal too_deep, ok
303
- end
304
-
305
- def test_load_dump
306
- too_deep = '[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]'
307
- assert_equal too_deep, JSON.dump(eval(too_deep))
308
- assert_kind_of String, Marshal.dump(eval(too_deep))
309
- assert_raises(ArgumentError) { JSON.dump(eval(too_deep), 19) }
310
- assert_raises(ArgumentError) { Marshal.dump(eval(too_deep), 19) }
311
- assert_equal too_deep, JSON.dump(eval(too_deep), 20)
312
- assert_kind_of String, Marshal.dump(eval(too_deep), 20)
313
- output = StringIO.new
314
- JSON.dump(eval(too_deep), output)
315
- assert_equal too_deep, output.string
316
- output = StringIO.new
317
- JSON.dump(eval(too_deep), output, 20)
318
- assert_equal too_deep, output.string
319
- end
320
- end
@@ -1,164 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding:utf-8 -*-
3
-
4
- require 'test/unit'
5
- case ENV['JSON']
6
- when 'pure' then require 'json/pure'
7
- when 'ext' then require 'json/ext'
8
- else require 'json'
9
- end
10
- require 'json/add/core'
11
- require 'date'
12
-
13
- class TC_JSONAddition < Test::Unit::TestCase
14
- include JSON
15
-
16
- class A
17
- def initialize(a)
18
- @a = a
19
- end
20
-
21
- attr_reader :a
22
-
23
- def ==(other)
24
- a == other.a
25
- end
26
-
27
- def self.json_create(object)
28
- new(*object['args'])
29
- end
30
-
31
- def to_json(*args)
32
- {
33
- 'json_class' => self.class.name,
34
- 'args' => [ @a ],
35
- }.to_json(*args)
36
- end
37
- end
38
-
39
- class B
40
- def self.json_creatable?
41
- false
42
- end
43
-
44
- def to_json(*args)
45
- {
46
- 'json_class' => self.class.name,
47
- }.to_json(*args)
48
- end
49
- end
50
-
51
- class C
52
- def self.json_creatable?
53
- false
54
- end
55
-
56
- def to_json(*args)
57
- {
58
- 'json_class' => 'TC_JSONAddition::Nix',
59
- }.to_json(*args)
60
- end
61
- end
62
-
63
- def test_extended_json
64
- a = A.new(666)
65
- assert A.json_creatable?
66
- json = generate(a)
67
- a_again = JSON.parse(json)
68
- assert_kind_of a.class, a_again
69
- assert_equal a, a_again
70
- end
71
-
72
- def test_extended_json_disabled
73
- a = A.new(666)
74
- assert A.json_creatable?
75
- json = generate(a)
76
- a_again = JSON.parse(json, :create_additions => true)
77
- assert_kind_of a.class, a_again
78
- assert_equal a, a_again
79
- a_hash = JSON.parse(json, :create_additions => false)
80
- assert_kind_of Hash, a_hash
81
- assert_equal(
82
- {"args"=>[666], "json_class"=>"TC_JSONAddition::A"}.sort_by { |k,| k },
83
- a_hash.sort_by { |k,| k }
84
- )
85
- end
86
-
87
- def test_extended_json_fail1
88
- b = B.new
89
- assert !B.json_creatable?
90
- json = generate(b)
91
- assert_equal({ "json_class"=>"TC_JSONAddition::B" }, JSON.parse(json))
92
- end
93
-
94
- def test_extended_json_fail2
95
- c = C.new
96
- assert !C.json_creatable?
97
- json = generate(c)
98
- assert_raises(ArgumentError) { JSON.parse(json) }
99
- end
100
-
101
- def test_raw_strings
102
- raw = ''
103
- raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
104
- raw_array = []
105
- for i in 0..255
106
- raw << i
107
- raw_array << i
108
- end
109
- json = raw.to_json_raw
110
- json_raw_object = raw.to_json_raw_object
111
- hash = { 'json_class' => 'String', 'raw'=> raw_array }
112
- assert_equal hash, json_raw_object
113
- json_raw = <<EOT.chomp
114
- {\"json_class\":\"String\",\"raw\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]}
115
- EOT
116
- # "
117
- assert_equal json_raw, json
118
- raw_again = JSON.parse(json)
119
- assert_equal raw, raw_again
120
- end
121
-
122
- MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
123
-
124
- def test_core
125
- t = Time.now
126
- assert_equal t.inspect, JSON(JSON(t)).inspect
127
- d = Date.today
128
- assert_equal d, JSON(JSON(d))
129
- d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
130
- assert_equal d, JSON(JSON(d))
131
- assert_equal 1..10, JSON(JSON(1..10))
132
- assert_equal 1...10, JSON(JSON(1...10))
133
- assert_equal "a".."c", JSON(JSON("a".."c"))
134
- assert_equal "a"..."c", JSON(JSON("a"..."c"))
135
- s = MyJsonStruct.new 4711, 'foot'
136
- assert_equal s, JSON(JSON(s))
137
- struct = Struct.new :foo, :bar
138
- s = struct.new 4711, 'foot'
139
- assert_raises(JSONError) { JSON(s) }
140
- begin
141
- raise TypeError, "test me"
142
- rescue TypeError => e
143
- e_json = JSON.generate e
144
- e_again = JSON e_json
145
- assert_kind_of TypeError, e_again
146
- assert_equal e.message, e_again.message
147
- assert_equal e.backtrace, e_again.backtrace
148
- end
149
- assert_equal(/foo/, JSON(JSON(/foo/)))
150
- assert_equal(/foo/i, JSON(JSON(/foo/i)))
151
- end
152
-
153
- def test_utc_datetime
154
- now = Time.now
155
- d = DateTime.parse(now.to_s) # usual case
156
- assert d, JSON.parse(d.to_json)
157
- d = DateTime.parse(now.utc.to_s) # of = 0
158
- assert d, JSON.parse(d.to_json)
159
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, 1) # of = 1 / 12 => 1/12
160
- assert d, JSON.parse(d.to_json)
161
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, 12) # of = 12 / 12 => 12
162
- assert d, JSON.parse(d.to_json)
163
- end
164
- end
@@ -1,67 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
- require 'test/unit'
5
- case ENV['JSON']
6
- when 'pure' then require 'json/pure'
7
- when 'ext' then require 'json/ext'
8
- else require 'json'
9
- end
10
- require 'iconv'
11
-
12
- class TC_JSONEncoding < Test::Unit::TestCase
13
- include JSON
14
-
15
- def setup
16
- @utf_8 = '["© ≠ €!"]'
17
- @parsed = [ "© ≠ €!" ]
18
- @utf_16_data = Iconv.iconv('utf-16be', 'utf-8', @parsed.first)
19
- @generated = '["\u00a9 \u2260 \u20ac!"]'
20
- if defined?(::Encoding)
21
- @utf_8_ascii_8bit = @utf_8.dup.force_encoding(Encoding::ASCII_8BIT)
22
- @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
23
- @utf_16be_ascii_8bit = @utf_16be.dup.force_encoding(Encoding::ASCII_8BIT)
24
- @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
25
- @utf_16le_ascii_8bit = @utf_16le.dup.force_encoding(Encoding::ASCII_8BIT)
26
- @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
27
- @utf_32be_ascii_8bit = @utf_32be.dup.force_encoding(Encoding::ASCII_8BIT)
28
- @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
29
- @utf_32le_ascii_8bit = @utf_32le.dup.force_encoding(Encoding::ASCII_8BIT)
30
- else
31
- @utf_8_ascii_8bit = @utf_8.dup
32
- @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
33
- @utf_16be_ascii_8bit = @utf_16be.dup
34
- @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
35
- @utf_16le_ascii_8bit = @utf_16le.dup
36
- @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
37
- @utf_32be_ascii_8bit = @utf_32be.dup
38
- @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
39
- @utf_32le_ascii_8bit = @utf_32le.dup
40
- end
41
- end
42
-
43
- def test_parse
44
- assert_equal @parsed, JSON.parse(@utf_8)
45
- assert_equal @parsed, JSON.parse(@utf_16be)
46
- assert_equal @parsed, JSON.parse(@utf_16le)
47
- assert_equal @parsed, JSON.parse(@utf_32be)
48
- assert_equal @parsed, JSON.parse(@utf_32le)
49
- end
50
-
51
- def test_parse_ascii_8bit
52
- assert_equal @parsed, JSON.parse(@utf_8_ascii_8bit)
53
- assert_equal @parsed, JSON.parse(@utf_16be_ascii_8bit)
54
- assert_equal @parsed, JSON.parse(@utf_16le_ascii_8bit)
55
- assert_equal @parsed, JSON.parse(@utf_32be_ascii_8bit)
56
- assert_equal @parsed, JSON.parse(@utf_32le_ascii_8bit)
57
- end
58
-
59
- def test_generate
60
- assert_equal @generated, JSON.generate(@parsed)
61
- if defined?(::Encoding)
62
- assert_equal @generated, JSON.generate(@utf_16_data)
63
- else
64
- assert_raises(JSON::GeneratorError) { JSON.generate(@utf_16_data) }
65
- end
66
- end
67
- end
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
- require 'test/unit'
5
- case ENV['JSON']
6
- when 'pure' then require 'json/pure'
7
- when 'ext' then require 'json/ext'
8
- else require 'json'
9
- end
10
-
11
- class TC_JSONFixtures < Test::Unit::TestCase
12
- def setup
13
- fixtures = File.join(File.dirname(__FILE__), 'fixtures/*.json')
14
- passed, failed = Dir[fixtures].partition { |f| f['pass'] }
15
- @passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
16
- @failed = failed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
17
- end
18
-
19
- def test_passing
20
- for name, source in @passed
21
- assert JSON.parse(source),
22
- "Did not pass for fixture '#{name}'"
23
- end
24
- end
25
-
26
- def test_failing
27
- for name, source in @failed
28
- assert_raises(JSON::ParserError, JSON::NestingError,
29
- "Did not fail for fixture '#{name}'") do
30
- JSON.parse(source)
31
- end
32
- end
33
- end
34
- end