larsklevan-json 1.5.1

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 (136) hide show
  1. data/CHANGES +188 -0
  2. data/COPYING +58 -0
  3. data/COPYING-json-jruby +57 -0
  4. data/GPL +340 -0
  5. data/README +358 -0
  6. data/README-json-jruby.markdown +33 -0
  7. data/Rakefile +401 -0
  8. data/TODO +1 -0
  9. data/VERSION +1 -0
  10. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +52 -0
  11. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
  12. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
  13. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
  14. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
  15. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
  16. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
  17. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +261 -0
  18. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
  19. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
  20. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
  21. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
  22. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
  23. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
  24. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +262 -0
  25. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
  26. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
  27. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +82 -0
  28. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +34 -0
  29. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
  30. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
  31. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +81 -0
  32. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
  33. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
  34. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +82 -0
  35. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
  36. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
  37. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +82 -0
  38. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
  39. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
  40. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +82 -0
  41. data/benchmarks/generator2_benchmark.rb +222 -0
  42. data/benchmarks/generator_benchmark.rb +224 -0
  43. data/benchmarks/ohai.json +1216 -0
  44. data/benchmarks/ohai.ruby +1 -0
  45. data/benchmarks/parser2_benchmark.rb +251 -0
  46. data/benchmarks/parser_benchmark.rb +259 -0
  47. data/bin/edit_json.rb +9 -0
  48. data/bin/prettify_json.rb +75 -0
  49. data/data/example.json +1 -0
  50. data/data/index.html +38 -0
  51. data/data/prototype.js +4184 -0
  52. data/ext/json/ext/generator/extconf.rb +20 -0
  53. data/ext/json/ext/generator/generator.c +1424 -0
  54. data/ext/json/ext/generator/generator.h +197 -0
  55. data/ext/json/ext/parser/extconf.rb +16 -0
  56. data/ext/json/ext/parser/parser.c +1969 -0
  57. data/ext/json/ext/parser/parser.h +78 -0
  58. data/ext/json/ext/parser/parser.rl +826 -0
  59. data/install.rb +26 -0
  60. data/java/lib/bytelist-1.0.6.jar +0 -0
  61. data/java/lib/jcodings.jar +0 -0
  62. data/java/src/json/ext/ByteListTranscoder.java +167 -0
  63. data/java/src/json/ext/Generator.java +441 -0
  64. data/java/src/json/ext/GeneratorMethods.java +231 -0
  65. data/java/src/json/ext/GeneratorService.java +42 -0
  66. data/java/src/json/ext/GeneratorState.java +473 -0
  67. data/java/src/json/ext/OptionsReader.java +119 -0
  68. data/java/src/json/ext/Parser.java +2295 -0
  69. data/java/src/json/ext/Parser.rl +825 -0
  70. data/java/src/json/ext/ParserService.java +34 -0
  71. data/java/src/json/ext/RuntimeInfo.java +119 -0
  72. data/java/src/json/ext/StringDecoder.java +166 -0
  73. data/java/src/json/ext/StringEncoder.java +116 -0
  74. data/java/src/json/ext/Utils.java +89 -0
  75. data/json-java.gemspec +20 -0
  76. data/lib/json.rb +10 -0
  77. data/lib/json/Array.xpm +21 -0
  78. data/lib/json/FalseClass.xpm +21 -0
  79. data/lib/json/Hash.xpm +21 -0
  80. data/lib/json/Key.xpm +73 -0
  81. data/lib/json/NilClass.xpm +21 -0
  82. data/lib/json/Numeric.xpm +28 -0
  83. data/lib/json/String.xpm +96 -0
  84. data/lib/json/TrueClass.xpm +21 -0
  85. data/lib/json/add/core.rb +147 -0
  86. data/lib/json/add/rails.rb +8 -0
  87. data/lib/json/common.rb +419 -0
  88. data/lib/json/editor.rb +1369 -0
  89. data/lib/json/ext.rb +28 -0
  90. data/lib/json/json.xpm +1499 -0
  91. data/lib/json/pure.rb +15 -0
  92. data/lib/json/pure/generator.rb +446 -0
  93. data/lib/json/pure/parser.rb +320 -0
  94. data/lib/json/version.rb +8 -0
  95. data/tests/fixtures/fail1.json +1 -0
  96. data/tests/fixtures/fail10.json +1 -0
  97. data/tests/fixtures/fail11.json +1 -0
  98. data/tests/fixtures/fail12.json +1 -0
  99. data/tests/fixtures/fail13.json +1 -0
  100. data/tests/fixtures/fail14.json +1 -0
  101. data/tests/fixtures/fail18.json +1 -0
  102. data/tests/fixtures/fail19.json +1 -0
  103. data/tests/fixtures/fail2.json +1 -0
  104. data/tests/fixtures/fail20.json +1 -0
  105. data/tests/fixtures/fail21.json +1 -0
  106. data/tests/fixtures/fail22.json +1 -0
  107. data/tests/fixtures/fail23.json +1 -0
  108. data/tests/fixtures/fail24.json +1 -0
  109. data/tests/fixtures/fail25.json +1 -0
  110. data/tests/fixtures/fail27.json +2 -0
  111. data/tests/fixtures/fail28.json +2 -0
  112. data/tests/fixtures/fail3.json +1 -0
  113. data/tests/fixtures/fail4.json +1 -0
  114. data/tests/fixtures/fail5.json +1 -0
  115. data/tests/fixtures/fail6.json +1 -0
  116. data/tests/fixtures/fail7.json +1 -0
  117. data/tests/fixtures/fail8.json +1 -0
  118. data/tests/fixtures/fail9.json +1 -0
  119. data/tests/fixtures/pass1.json +56 -0
  120. data/tests/fixtures/pass15.json +1 -0
  121. data/tests/fixtures/pass16.json +1 -0
  122. data/tests/fixtures/pass17.json +1 -0
  123. data/tests/fixtures/pass2.json +1 -0
  124. data/tests/fixtures/pass26.json +1 -0
  125. data/tests/fixtures/pass3.json +6 -0
  126. data/tests/setup_variant.rb +11 -0
  127. data/tests/test_json.rb +390 -0
  128. data/tests/test_json_addition.rb +167 -0
  129. data/tests/test_json_encoding.rb +65 -0
  130. data/tests/test_json_fixtures.rb +35 -0
  131. data/tests/test_json_generate.rb +185 -0
  132. data/tests/test_json_string_matching.rb +40 -0
  133. data/tests/test_json_unicode.rb +72 -0
  134. data/tools/fuzz.rb +139 -0
  135. data/tools/server.rb +61 -0
  136. metadata +209 -0
@@ -0,0 +1 @@
1
+ ["Illegal backslash escape: \x15"]
@@ -0,0 +1 @@
1
+ ["Illegal backslash escape: \'"]
@@ -0,0 +1 @@
1
+ ["Illegal backslash escape: \017"]
@@ -0,0 +1 @@
1
+ [[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
@@ -0,0 +1 @@
1
+ ["tab\ character\ in\ string\ "]
@@ -0,0 +1,6 @@
1
+ {
2
+ "JSON Test Pattern pass3": {
3
+ "The outermost value": "must be an object or array.",
4
+ "In this test": "It is an object."
5
+ }
6
+ }
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,390 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ require 'test/unit'
5
+ require File.join(File.dirname(__FILE__), 'setup_variant')
6
+ require 'stringio'
7
+
8
+ unless Array.method_defined?(:permutation)
9
+ begin
10
+ require 'enumerator'
11
+ require 'permutation'
12
+ class Array
13
+ def permutation
14
+ Permutation.for(self).to_enum.map { |x| x.project }
15
+ end
16
+ end
17
+ rescue LoadError
18
+ warn "Skipping permutation tests."
19
+ end
20
+ end
21
+
22
+ class TC_JSON < Test::Unit::TestCase
23
+ include JSON
24
+
25
+ def setup
26
+ @ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
27
+ |x| [x]
28
+ end
29
+ @ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
30
+ "[1,-2,3]", "false", "true"].map do
31
+ |x| "[#{x}]"
32
+ end
33
+ @hash = {
34
+ 'a' => 2,
35
+ 'b' => 3.141,
36
+ 'c' => 'c',
37
+ 'd' => [ 1, "b", 3.14 ],
38
+ 'e' => { 'foo' => 'bar' },
39
+ 'g' => "\"\0\037",
40
+ 'h' => 1000.0,
41
+ 'i' => 0.001
42
+ }
43
+ @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
44
+ '"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
45
+ end
46
+
47
+ def test_construction
48
+ parser = JSON::Parser.new('test')
49
+ assert_equal 'test', parser.source
50
+ end
51
+
52
+ def assert_equal_float(expected, is)
53
+ assert_in_delta(expected.first, is.first, 1e-2)
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([0.23], parse('[0.23]'))
65
+ assert_equal([0.0], parse('[0e0]'))
66
+ assert_raises(JSON::ParserError) { parse('[+23.2]') }
67
+ assert_raises(JSON::ParserError) { parse('[+23]') }
68
+ assert_raises(JSON::ParserError) { parse('[.23]') }
69
+ assert_raises(JSON::ParserError) { parse('[023]') }
70
+ assert_equal_float [3.141], parse('[3.141]')
71
+ assert_equal_float [-3.141], parse('[-3.141]')
72
+ assert_equal_float [3.141], parse('[3141e-3]')
73
+ assert_equal_float [3.141], parse('[3141.1e-3]')
74
+ assert_equal_float [3.141], parse('[3141E-3]')
75
+ assert_equal_float [3.141], parse('[3141.0E-3]')
76
+ assert_equal_float [-3.141], parse('[-3141.0e-3]')
77
+ assert_equal_float [-3.141], parse('[-3141e-3]')
78
+ assert_raises(ParserError) { parse('[NaN]') }
79
+ assert parse('[NaN]', :allow_nan => true).first.nan?
80
+ assert_raises(ParserError) { parse('[Infinity]') }
81
+ assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
82
+ assert_raises(ParserError) { parse('[-Infinity]') }
83
+ assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
84
+ assert_equal([""], parse('[""]'))
85
+ assert_equal(["foobar"], parse('["foobar"]'))
86
+ assert_equal([{}], parse('[{}]'))
87
+ end
88
+
89
+ def test_parse_simple_objects
90
+ assert_equal({}, parse('{}'))
91
+ assert_equal({}, parse(' { } '))
92
+ assert_equal({ "a" => nil }, parse('{ "a" : null}'))
93
+ assert_equal({ "a" => nil }, parse('{"a":null}'))
94
+ assert_equal({ "a" => false }, parse('{ "a" : false } '))
95
+ assert_equal({ "a" => false }, parse('{"a":false}'))
96
+ assert_raises(JSON::ParserError) { parse('{false}') }
97
+ assert_equal({ "a" => true }, parse('{"a":true}'))
98
+ assert_equal({ "a" => true }, parse(' { "a" : true } '))
99
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
100
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
101
+ assert_equal({ "a" => 23 }, parse('{"a":23 } '))
102
+ assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
103
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
104
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
105
+ end
106
+
107
+ if Array.method_defined?(:permutation)
108
+ def test_parse_more_complex_arrays
109
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
110
+ a.permutation.each do |perm|
111
+ json = pretty_generate(perm)
112
+ assert_equal perm, parse(json)
113
+ end
114
+ end
115
+
116
+ def test_parse_complex_objects
117
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
118
+ a.permutation.each do |perm|
119
+ s = "a"
120
+ orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
121
+ json = pretty_generate(orig_obj)
122
+ assert_equal orig_obj, parse(json)
123
+ end
124
+ end
125
+ end
126
+
127
+ def test_parse_arrays
128
+ assert_equal([1,2,3], parse('[1,2,3]'))
129
+ assert_equal([1.2,2,3], parse('[1.2,2,3]'))
130
+ assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
131
+ end
132
+
133
+ def test_parse_values
134
+ assert_equal([""], parse('[""]'))
135
+ assert_equal(["\\"], parse('["\\\\"]'))
136
+ assert_equal(['"'], parse('["\""]'))
137
+ assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
138
+ assert_equal(["\"\b\n\r\t\0\037"],
139
+ parse('["\"\b\n\r\t\u0000\u001f"]'))
140
+ for i in 0 ... @ary.size
141
+ assert_equal(@ary[i], parse(@ary_to_parse[i]))
142
+ end
143
+ end
144
+
145
+ def test_parse_array
146
+ assert_equal([], parse('[]'))
147
+ assert_equal([], parse(' [ ] '))
148
+ assert_equal([1], parse('[1]'))
149
+ assert_equal([1], parse(' [ 1 ] '))
150
+ assert_equal(@ary,
151
+ parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
152
+ ',[false],[true]]'))
153
+ assert_equal(@ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]
154
+ , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
155
+ end
156
+
157
+ class SubArray < Array; end
158
+
159
+ class SubArray2 < Array
160
+ def to_json(*a)
161
+ {
162
+ JSON.create_id => self.class.name,
163
+ 'ary' => to_a,
164
+ }.to_json(*a)
165
+ end
166
+
167
+ def self.json_create(o)
168
+ o.delete JSON.create_id
169
+ o['ary']
170
+ end
171
+ end
172
+
173
+ def test_parse_array_custom_class
174
+ res = parse('[]', :array_class => SubArray)
175
+ assert_equal([], res)
176
+ assert_equal(SubArray, res.class)
177
+ end
178
+
179
+ def test_parse_object
180
+ assert_equal({}, parse('{}'))
181
+ assert_equal({}, parse(' { } '))
182
+ assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
183
+ assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
184
+ end
185
+
186
+ class SubHash < Hash
187
+ end
188
+
189
+ class SubHash2 < Hash
190
+ def to_json(*a)
191
+ {
192
+ JSON.create_id => self.class.name,
193
+ }.merge(self).to_json(*a)
194
+ end
195
+
196
+ def self.json_create(o)
197
+ o.delete JSON.create_id
198
+ self[o]
199
+ end
200
+ end
201
+
202
+ def test_parse_object_custom_class
203
+ res = parse('{}', :object_class => SubHash2)
204
+ assert_equal({}, res)
205
+ assert_equal(SubHash2, res.class)
206
+ end
207
+
208
+ def test_generation_of_core_subclasses_with_new_to_json
209
+ obj = SubHash2["foo" => SubHash2["bar" => true]]
210
+ obj_json = JSON(obj)
211
+ obj_again = JSON(obj_json)
212
+ assert_kind_of SubHash2, obj_again
213
+ assert_kind_of SubHash2, obj_again['foo']
214
+ assert obj_again['foo']['bar']
215
+ assert_equal obj, obj_again
216
+ assert_equal ["foo"], JSON(JSON(SubArray2["foo"]))
217
+ end
218
+
219
+ def test_generation_of_core_subclasses_with_default_to_json
220
+ assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
221
+ assert_equal '["foo"]', JSON(SubArray["foo"])
222
+ end
223
+
224
+ def test_generation_of_core_subclasses
225
+ obj = SubHash["foo" => SubHash["bar" => true]]
226
+ obj_json = JSON(obj)
227
+ obj_again = JSON(obj_json)
228
+ assert_kind_of Hash, obj_again
229
+ assert_kind_of Hash, obj_again['foo']
230
+ assert obj_again['foo']['bar']
231
+ assert_equal obj, obj_again
232
+ end
233
+
234
+ def test_parser_reset
235
+ parser = Parser.new(@json)
236
+ assert_equal(@hash, parser.parse)
237
+ assert_equal(@hash, parser.parse)
238
+ end
239
+
240
+ def test_comments
241
+ json = <<EOT
242
+ {
243
+ "key1":"value1", // eol comment
244
+ "key2":"value2" /* multi line
245
+ * comment */,
246
+ "key3":"value3" /* multi line
247
+ // nested eol comment
248
+ * comment */
249
+ }
250
+ EOT
251
+ assert_equal(
252
+ { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
253
+ parse(json))
254
+ json = <<EOT
255
+ {
256
+ "key1":"value1" /* multi line
257
+ // nested eol comment
258
+ /* illegal nested multi line comment */
259
+ * comment */
260
+ }
261
+ EOT
262
+ assert_raises(ParserError) { parse(json) }
263
+ json = <<EOT
264
+ {
265
+ "key1":"value1" /* multi line
266
+ // nested eol comment
267
+ closed multi comment */
268
+ and again, throw an Error */
269
+ }
270
+ EOT
271
+ assert_raises(ParserError) { parse(json) }
272
+ json = <<EOT
273
+ {
274
+ "key1":"value1" /*/*/
275
+ }
276
+ EOT
277
+ assert_equal({ "key1" => "value1" }, parse(json))
278
+ end
279
+
280
+ def test_backslash
281
+ data = [ '\\.(?i:gif|jpe?g|png)$' ]
282
+ json = '["\\\\.(?i:gif|jpe?g|png)$"]'
283
+ assert_equal json, JSON.generate(data)
284
+ assert_equal data, JSON.parse(json)
285
+ #
286
+ data = [ '\\"' ]
287
+ json = '["\\\\\""]'
288
+ assert_equal json, JSON.generate(data)
289
+ assert_equal data, JSON.parse(json)
290
+ #
291
+ json = '["/"]'
292
+ data = JSON.parse(json)
293
+ assert_equal ['/'], data
294
+ assert_equal json, JSON.generate(data)
295
+ #
296
+ json = '["\""]'
297
+ data = JSON.parse(json)
298
+ assert_equal ['"'], data
299
+ assert_equal json, JSON.generate(data)
300
+ json = '["\\\'"]'
301
+ data = JSON.parse(json)
302
+ assert_equal ["'"], data
303
+ assert_equal '["\'"]', JSON.generate(data)
304
+ end
305
+
306
+ def test_wrong_inputs
307
+ assert_raises(ParserError) { JSON.parse('"foo"') }
308
+ assert_raises(ParserError) { JSON.parse('123') }
309
+ assert_raises(ParserError) { JSON.parse('[] bla') }
310
+ assert_raises(ParserError) { JSON.parse('[] 1') }
311
+ assert_raises(ParserError) { JSON.parse('[] []') }
312
+ assert_raises(ParserError) { JSON.parse('[] {}') }
313
+ assert_raises(ParserError) { JSON.parse('{} []') }
314
+ assert_raises(ParserError) { JSON.parse('{} {}') }
315
+ assert_raises(ParserError) { JSON.parse('[NULL]') }
316
+ assert_raises(ParserError) { JSON.parse('[FALSE]') }
317
+ assert_raises(ParserError) { JSON.parse('[TRUE]') }
318
+ assert_raises(ParserError) { JSON.parse('[07] ') }
319
+ assert_raises(ParserError) { JSON.parse('[0a]') }
320
+ assert_raises(ParserError) { JSON.parse('[1.]') }
321
+ assert_raises(ParserError) { JSON.parse(' ') }
322
+ end
323
+
324
+ def test_nesting
325
+ assert_raises(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
326
+ assert_raises(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
327
+ assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
328
+ too_deep = '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]'
329
+ too_deep_ary = eval too_deep
330
+ assert_raises(JSON::NestingError) { JSON.parse too_deep }
331
+ assert_raises(JSON::NestingError) { JSON.parser.new(too_deep).parse }
332
+ assert_raises(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 19 }
333
+ ok = JSON.parse too_deep, :max_nesting => 20
334
+ assert_equal too_deep_ary, ok
335
+ ok = JSON.parse too_deep, :max_nesting => nil
336
+ assert_equal too_deep_ary, ok
337
+ ok = JSON.parse too_deep, :max_nesting => false
338
+ assert_equal too_deep_ary, ok
339
+ ok = JSON.parse too_deep, :max_nesting => 0
340
+ assert_equal too_deep_ary, ok
341
+ assert_raises(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
342
+ assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
343
+ assert_raises(JSON::NestingError) { JSON.generate too_deep_ary }
344
+ assert_raises(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 19 }
345
+ ok = JSON.generate too_deep_ary, :max_nesting => 20
346
+ assert_equal too_deep, ok
347
+ ok = JSON.generate too_deep_ary, :max_nesting => nil
348
+ assert_equal too_deep, ok
349
+ ok = JSON.generate too_deep_ary, :max_nesting => false
350
+ assert_equal too_deep, ok
351
+ ok = JSON.generate too_deep_ary, :max_nesting => 0
352
+ assert_equal too_deep, ok
353
+ end
354
+
355
+ def test_symbolize_names
356
+ assert_equal({ "foo" => "bar", "baz" => "quux" },
357
+ JSON.parse('{"foo":"bar", "baz":"quux"}'))
358
+ assert_equal({ :foo => "bar", :baz => "quux" },
359
+ JSON.parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
360
+ end
361
+
362
+ def test_load_dump
363
+ too_deep = '[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]'
364
+ assert_equal too_deep, JSON.dump(eval(too_deep))
365
+ assert_kind_of String, Marshal.dump(eval(too_deep))
366
+ assert_raises(ArgumentError) { JSON.dump(eval(too_deep), 19) }
367
+ assert_raises(ArgumentError) { Marshal.dump(eval(too_deep), 19) }
368
+ assert_equal too_deep, JSON.dump(eval(too_deep), 20)
369
+ assert_kind_of String, Marshal.dump(eval(too_deep), 20)
370
+ output = StringIO.new
371
+ JSON.dump(eval(too_deep), output)
372
+ assert_equal too_deep, output.string
373
+ output = StringIO.new
374
+ JSON.dump(eval(too_deep), output, 20)
375
+ assert_equal too_deep, output.string
376
+ end
377
+
378
+ def test_big_integers
379
+ json1 = JSON([orig = (1 << 31) - 1])
380
+ assert_equal orig, JSON[json1][0]
381
+ json2 = JSON([orig = 1 << 31])
382
+ assert_equal orig, JSON[json2][0]
383
+ json3 = JSON([orig = (1 << 62) - 1])
384
+ assert_equal orig, JSON[json3][0]
385
+ json4 = JSON([orig = 1 << 62])
386
+ assert_equal orig, JSON[json4][0]
387
+ json5 = JSON([orig = 1 << 64])
388
+ assert_equal orig, JSON[json5][0]
389
+ end
390
+ end
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding:utf-8 -*-
3
+
4
+ require 'test/unit'
5
+ require File.join(File.dirname(__FILE__), 'setup_variant')
6
+ load 'json/add/core.rb'
7
+ require 'date'
8
+
9
+ class TC_JSONAddition < Test::Unit::TestCase
10
+ include JSON
11
+
12
+ class A
13
+ def initialize(a)
14
+ @a = a
15
+ end
16
+
17
+ attr_reader :a
18
+
19
+ def ==(other)
20
+ a == other.a
21
+ end
22
+
23
+ def self.json_create(object)
24
+ new(*object['args'])
25
+ end
26
+
27
+ def to_json(*args)
28
+ {
29
+ 'json_class' => self.class.name,
30
+ 'args' => [ @a ],
31
+ }.to_json(*args)
32
+ end
33
+ end
34
+
35
+ class A2 < A
36
+ def to_json(*args)
37
+ {
38
+ 'json_class' => self.class.name,
39
+ 'args' => [ @a ],
40
+ }.to_json(*args)
41
+ end
42
+ end
43
+
44
+ class B
45
+ def self.json_creatable?
46
+ false
47
+ end
48
+
49
+ def to_json(*args)
50
+ {
51
+ 'json_class' => self.class.name,
52
+ }.to_json(*args)
53
+ end
54
+ end
55
+
56
+ class C
57
+ def self.json_creatable?
58
+ false
59
+ end
60
+
61
+ def to_json(*args)
62
+ {
63
+ 'json_class' => 'TC_JSONAddition::Nix',
64
+ }.to_json(*args)
65
+ end
66
+ end
67
+
68
+ def test_extended_json
69
+ a = A.new(666)
70
+ assert A.json_creatable?
71
+ json = generate(a)
72
+ a_again = JSON.parse(json)
73
+ assert_kind_of a.class, a_again
74
+ assert_equal a, a_again
75
+ end
76
+
77
+ def test_extended_json_disabled
78
+ a = A.new(666)
79
+ assert A.json_creatable?
80
+ json = generate(a)
81
+ a_again = JSON.parse(json, :create_additions => true)
82
+ assert_kind_of a.class, a_again
83
+ assert_equal a, a_again
84
+ a_hash = JSON.parse(json, :create_additions => false)
85
+ assert_kind_of Hash, a_hash
86
+ assert_equal(
87
+ {"args"=>[666], "json_class"=>"TC_JSONAddition::A"}.sort_by { |k,| k },
88
+ a_hash.sort_by { |k,| k }
89
+ )
90
+ end
91
+
92
+ def test_extended_json_fail1
93
+ b = B.new
94
+ assert !B.json_creatable?
95
+ json = generate(b)
96
+ assert_equal({ "json_class"=>"TC_JSONAddition::B" }, JSON.parse(json))
97
+ end
98
+
99
+ def test_extended_json_fail2
100
+ c = C.new
101
+ assert !C.json_creatable?
102
+ json = generate(c)
103
+ assert_raises(ArgumentError, NameError) { JSON.parse(json) }
104
+ end
105
+
106
+ def test_raw_strings
107
+ raw = ''
108
+ raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
109
+ raw_array = []
110
+ for i in 0..255
111
+ raw << i
112
+ raw_array << i
113
+ end
114
+ json = raw.to_json_raw
115
+ json_raw_object = raw.to_json_raw_object
116
+ hash = { 'json_class' => 'String', 'raw'=> raw_array }
117
+ assert_equal hash, json_raw_object
118
+ assert_match(/\A\{.*\}\Z/, json)
119
+ assert_match(/"json_class":"String"/, json)
120
+ assert_match(/"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\]/, json)
121
+ raw_again = JSON.parse(json)
122
+ assert_equal raw, raw_again
123
+ end
124
+
125
+ MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
126
+
127
+ def test_core
128
+ t = Time.now
129
+ assert_equal t.inspect, JSON(JSON(t)).inspect
130
+ d = Date.today
131
+ assert_equal d, JSON(JSON(d))
132
+ d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
133
+ assert_equal d, JSON(JSON(d))
134
+ assert_equal 1..10, JSON(JSON(1..10))
135
+ assert_equal 1...10, JSON(JSON(1...10))
136
+ assert_equal "a".."c", JSON(JSON("a".."c"))
137
+ assert_equal "a"..."c", JSON(JSON("a"..."c"))
138
+ s = MyJsonStruct.new 4711, 'foot'
139
+ assert_equal s, JSON(JSON(s))
140
+ struct = Struct.new :foo, :bar
141
+ s = struct.new 4711, 'foot'
142
+ assert_raises(JSONError) { JSON(s) }
143
+ begin
144
+ raise TypeError, "test me"
145
+ rescue TypeError => e
146
+ e_json = JSON.generate e
147
+ e_again = JSON e_json
148
+ assert_kind_of TypeError, e_again
149
+ assert_equal e.message, e_again.message
150
+ assert_equal e.backtrace, e_again.backtrace
151
+ end
152
+ assert_equal(/foo/, JSON(JSON(/foo/)))
153
+ assert_equal(/foo/i, JSON(JSON(/foo/i)))
154
+ end
155
+
156
+ def test_utc_datetime
157
+ now = Time.now
158
+ d = DateTime.parse(now.to_s) # usual case
159
+ assert_equal d, JSON.parse(d.to_json)
160
+ d = DateTime.parse(now.utc.to_s) # of = 0
161
+ assert_equal d, JSON.parse(d.to_json)
162
+ d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
163
+ assert_equal d, JSON.parse(d.to_json)
164
+ d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
165
+ assert_equal d, JSON.parse(d.to_json)
166
+ end
167
+ end