json 1.8.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of json might be problematic. Click here for more details.

Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.travis.yml +5 -3
  4. data/CHANGES +5 -5
  5. data/Gemfile +3 -1
  6. data/README.md +131 -84
  7. data/Rakefile +17 -10
  8. data/VERSION +1 -1
  9. data/ext/json/ext/generator/generator.c +1 -52
  10. data/ext/json/ext/generator/generator.h +0 -5
  11. data/ext/json/ext/parser/extconf.rb +3 -0
  12. data/ext/json/ext/parser/parser.c +304 -458
  13. data/ext/json/ext/parser/parser.h +0 -1
  14. data/ext/json/ext/parser/parser.rl +35 -152
  15. data/ext/json/extconf.rb +0 -1
  16. data/java/src/json/ext/Generator.java +2 -5
  17. data/java/src/json/ext/GeneratorState.java +2 -54
  18. data/java/src/json/ext/OptionsReader.java +1 -1
  19. data/java/src/json/ext/Parser.java +109 -409
  20. data/java/src/json/ext/Parser.rl +24 -117
  21. data/java/src/json/ext/RuntimeInfo.java +0 -4
  22. data/json.gemspec +0 -0
  23. data/json_pure.gemspec +7 -7
  24. data/lib/json.rb +1 -0
  25. data/lib/json/add/bigdecimal.rb +1 -0
  26. data/lib/json/add/complex.rb +2 -1
  27. data/lib/json/add/core.rb +1 -0
  28. data/lib/json/add/date.rb +1 -1
  29. data/lib/json/add/date_time.rb +1 -1
  30. data/lib/json/add/exception.rb +1 -1
  31. data/lib/json/add/ostruct.rb +1 -1
  32. data/lib/json/add/range.rb +1 -1
  33. data/lib/json/add/rational.rb +1 -0
  34. data/lib/json/add/regexp.rb +1 -1
  35. data/lib/json/add/struct.rb +1 -1
  36. data/lib/json/add/symbol.rb +1 -1
  37. data/lib/json/add/time.rb +1 -1
  38. data/lib/json/common.rb +24 -52
  39. data/lib/json/ext.rb +0 -6
  40. data/lib/json/generic_object.rb +5 -4
  41. data/lib/json/pure.rb +2 -8
  42. data/lib/json/pure/generator.rb +51 -123
  43. data/lib/json/pure/parser.rb +28 -80
  44. data/lib/json/version.rb +2 -1
  45. data/references/rfc7159.txt +899 -0
  46. data/tests/fixtures/obsolete_fail1.json +1 -0
  47. data/tests/{test_json_addition.rb → json_addition_test.rb} +22 -25
  48. data/tests/json_common_interface_test.rb +126 -0
  49. data/tests/json_encoding_test.rb +105 -0
  50. data/tests/json_ext_parser_test.rb +15 -0
  51. data/tests/{test_json_fixtures.rb → json_fixtures_test.rb} +5 -8
  52. data/tests/{test_json_generate.rb → json_generator_test.rb} +65 -37
  53. data/tests/{test_json_generic_object.rb → json_generic_object_test.rb} +15 -8
  54. data/tests/json_parser_test.rb +448 -0
  55. data/tests/json_string_matching_test.rb +38 -0
  56. data/tests/test_helper.rb +23 -0
  57. data/tools/fuzz.rb +1 -9
  58. metadata +19 -32
  59. data/TODO +0 -1
  60. data/tests/fixtures/fail1.json +0 -1
  61. data/tests/setup_variant.rb +0 -11
  62. data/tests/test_json.rb +0 -519
  63. data/tests/test_json_encoding.rb +0 -65
  64. data/tests/test_json_string_matching.rb +0 -39
  65. data/tests/test_json_unicode.rb +0 -72
@@ -0,0 +1,38 @@
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
@@ -0,0 +1,23 @@
1
+ gem 'json', File.read('VERSION').chomp
2
+
3
+ case ENV['JSON']
4
+ when 'pure'
5
+ $:.unshift 'lib'
6
+ require 'json/pure'
7
+ when 'ext'
8
+ $:.unshift 'ext', 'lib'
9
+ require 'json/ext'
10
+ else
11
+ $:.unshift 'ext', 'lib'
12
+ require 'json'
13
+ end
14
+
15
+ require 'test/unit'
16
+ begin
17
+ require 'byebug'
18
+ rescue LoadError
19
+ end
20
+ if ENV['START_SIMPLECOV'].to_i == 1
21
+ require 'simplecov'
22
+ SimpleCov.start
23
+ end
@@ -1,13 +1,5 @@
1
1
  require 'json'
2
2
 
3
- require 'iconv'
4
- ISO_8859_1_TO_UTF8 = Iconv.new('utf-8', 'iso-8859-15')
5
- class ::String
6
- def to_utf8
7
- ISO_8859_1_TO_UTF8.iconv self
8
- end
9
- end
10
-
11
3
  class Fuzzer
12
4
  def initialize(n, freqs = {})
13
5
  sum = freqs.inject(0.0) { |s, x| s + x.last }
@@ -25,7 +17,7 @@ class Fuzzer
25
17
  def random_string
26
18
  s = ''
27
19
  30.times { s << @alpha[rand(@alpha.size)] }
28
- s.to_utf8
20
+ s
29
21
  end
30
22
 
31
23
  def pick
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.6
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-13 00:00:00.000000000 Z
11
+ date: 2016-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -48,14 +48,7 @@ extensions:
48
48
  extra_rdoc_files:
49
49
  - README.md
50
50
  files:
51
- - "./tests/test_json.rb"
52
- - "./tests/test_json_addition.rb"
53
- - "./tests/test_json_encoding.rb"
54
- - "./tests/test_json_fixtures.rb"
55
- - "./tests/test_json_generate.rb"
56
- - "./tests/test_json_generic_object.rb"
57
- - "./tests/test_json_string_matching.rb"
58
- - "./tests/test_json_unicode.rb"
51
+ - "./tests/test_helper.rb"
59
52
  - ".gitignore"
60
53
  - ".travis.yml"
61
54
  - CHANGES
@@ -63,7 +56,6 @@ files:
63
56
  - README-json-jruby.markdown
64
57
  - README.md
65
58
  - Rakefile
66
- - TODO
67
59
  - VERSION
68
60
  - data/example.json
69
61
  - data/index.html
@@ -119,7 +111,7 @@ files:
119
111
  - lib/json/pure/generator.rb
120
112
  - lib/json/pure/parser.rb
121
113
  - lib/json/version.rb
122
- - tests/fixtures/fail1.json
114
+ - references/rfc7159.txt
123
115
  - tests/fixtures/fail10.json
124
116
  - tests/fixtures/fail11.json
125
117
  - tests/fixtures/fail12.json
@@ -143,6 +135,7 @@ files:
143
135
  - tests/fixtures/fail7.json
144
136
  - tests/fixtures/fail8.json
145
137
  - tests/fixtures/fail9.json
138
+ - tests/fixtures/obsolete_fail1.json
146
139
  - tests/fixtures/pass1.json
147
140
  - tests/fixtures/pass15.json
148
141
  - tests/fixtures/pass16.json
@@ -150,15 +143,16 @@ files:
150
143
  - tests/fixtures/pass2.json
151
144
  - tests/fixtures/pass26.json
152
145
  - tests/fixtures/pass3.json
153
- - tests/setup_variant.rb
154
- - tests/test_json.rb
155
- - tests/test_json_addition.rb
156
- - tests/test_json_encoding.rb
157
- - tests/test_json_fixtures.rb
158
- - tests/test_json_generate.rb
159
- - tests/test_json_generic_object.rb
160
- - tests/test_json_string_matching.rb
161
- - tests/test_json_unicode.rb
146
+ - tests/json_addition_test.rb
147
+ - tests/json_common_interface_test.rb
148
+ - tests/json_encoding_test.rb
149
+ - tests/json_ext_parser_test.rb
150
+ - tests/json_fixtures_test.rb
151
+ - tests/json_generator_test.rb
152
+ - tests/json_generic_object_test.rb
153
+ - tests/json_parser_test.rb
154
+ - tests/json_string_matching_test.rb
155
+ - tests/test_helper.rb
162
156
  - tools/diff.sh
163
157
  - tools/fuzz.rb
164
158
  - tools/server.rb
@@ -176,9 +170,9 @@ require_paths:
176
170
  - lib
177
171
  required_ruby_version: !ruby/object:Gem::Requirement
178
172
  requirements:
179
- - - ">="
173
+ - - "~>"
180
174
  - !ruby/object:Gem::Version
181
- version: '0'
175
+ version: '2.0'
182
176
  required_rubygems_version: !ruby/object:Gem::Requirement
183
177
  requirements:
184
178
  - - ">="
@@ -186,16 +180,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
180
  version: '0'
187
181
  requirements: []
188
182
  rubyforge_project:
189
- rubygems_version: 2.6.8
183
+ rubygems_version: 2.6.4
190
184
  signing_key:
191
185
  specification_version: 4
192
186
  summary: JSON Implementation for Ruby
193
187
  test_files:
194
- - "./tests/test_json.rb"
195
- - "./tests/test_json_addition.rb"
196
- - "./tests/test_json_encoding.rb"
197
- - "./tests/test_json_fixtures.rb"
198
- - "./tests/test_json_generate.rb"
199
- - "./tests/test_json_generic_object.rb"
200
- - "./tests/test_json_string_matching.rb"
201
- - "./tests/test_json_unicode.rb"
188
+ - "./tests/test_helper.rb"
data/TODO DELETED
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- "A JSON payload should be an object or array, not a string."
@@ -1,11 +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
@@ -1,519 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require 'test/unit'
5
- require File.join(File.dirname(__FILE__), 'setup_variant')
6
- require 'stringio'
7
- require 'tempfile'
8
- require 'ostruct'
9
-
10
- class TestJSON < Test::Unit::TestCase
11
- include JSON
12
-
13
- def setup
14
- @ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
15
- |x| [x]
16
- end
17
- @ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
18
- "[1,-2,3]", "false", "true"].map do
19
- |x| "[#{x}]"
20
- end
21
- @hash = {
22
- 'a' => 2,
23
- 'b' => 3.141,
24
- 'c' => 'c',
25
- 'd' => [ 1, "b", 3.14 ],
26
- 'e' => { 'foo' => 'bar' },
27
- 'g' => "\"\0\037",
28
- 'h' => 1000.0,
29
- 'i' => 0.001
30
- }
31
- @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
32
- '"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
33
- end
34
-
35
- def test_construction
36
- parser = JSON::Parser.new('test')
37
- assert_equal 'test', parser.source
38
- end
39
-
40
- def assert_equal_float(expected, is)
41
- assert_in_delta(expected.first, is.first, 1e-2)
42
- end
43
-
44
- def test_parse_simple_arrays
45
- assert_equal([], parse('[]'))
46
- assert_equal([], parse(' [ ] '))
47
- assert_equal([nil], parse('[null]'))
48
- assert_equal([false], parse('[false]'))
49
- assert_equal([true], parse('[true]'))
50
- assert_equal([-23], parse('[-23]'))
51
- assert_equal([23], parse('[23]'))
52
- assert_equal([0.23], parse('[0.23]'))
53
- assert_equal([0.0], parse('[0e0]'))
54
- assert_raises(JSON::ParserError) { parse('[+23.2]') }
55
- assert_raises(JSON::ParserError) { parse('[+23]') }
56
- assert_raises(JSON::ParserError) { parse('[.23]') }
57
- assert_raises(JSON::ParserError) { parse('[023]') }
58
- assert_equal_float [3.141], parse('[3.141]')
59
- assert_equal_float [-3.141], parse('[-3.141]')
60
- assert_equal_float [3.141], parse('[3141e-3]')
61
- assert_equal_float [3.141], parse('[3141.1e-3]')
62
- assert_equal_float [3.141], parse('[3141E-3]')
63
- assert_equal_float [3.141], parse('[3141.0E-3]')
64
- assert_equal_float [-3.141], parse('[-3141.0e-3]')
65
- assert_equal_float [-3.141], parse('[-3141e-3]')
66
- assert_raises(ParserError) { parse('[NaN]') }
67
- assert parse('[NaN]', :allow_nan => true).first.nan?
68
- assert_raises(ParserError) { parse('[Infinity]') }
69
- assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
70
- assert_raises(ParserError) { parse('[-Infinity]') }
71
- assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
72
- assert_equal([""], parse('[""]'))
73
- assert_equal(["foobar"], parse('["foobar"]'))
74
- assert_equal([{}], parse('[{}]'))
75
- end
76
-
77
- def test_parse_simple_objects
78
- assert_equal({}, parse('{}'))
79
- assert_equal({}, parse(' { } '))
80
- assert_equal({ "a" => nil }, parse('{ "a" : null}'))
81
- assert_equal({ "a" => nil }, parse('{"a":null}'))
82
- assert_equal({ "a" => false }, parse('{ "a" : false } '))
83
- assert_equal({ "a" => false }, parse('{"a":false}'))
84
- assert_raises(JSON::ParserError) { parse('{false}') }
85
- assert_equal({ "a" => true }, parse('{"a":true}'))
86
- assert_equal({ "a" => true }, parse(' { "a" : true } '))
87
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
88
- assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
89
- assert_equal({ "a" => 23 }, parse('{"a":23 } '))
90
- assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
91
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
92
- assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
93
- end
94
-
95
- def test_parse_json_primitive_values
96
- assert_raise(JSON::ParserError) { JSON.parse('') }
97
- assert_raise(JSON::ParserError) { JSON.parse('', :quirks_mode => true) }
98
- assert_raise(TypeError) { JSON::Parser.new(nil).parse }
99
- assert_raise(TypeError) { JSON::Parser.new(nil, :quirks_mode => true).parse }
100
- assert_raise(TypeError) { JSON.parse(nil) }
101
- assert_raise(TypeError) { JSON.parse(nil, :quirks_mode => true) }
102
- assert_raise(JSON::ParserError) { JSON.parse(' /* foo */ ') }
103
- assert_raise(JSON::ParserError) { JSON.parse(' /* foo */ ', :quirks_mode => true) }
104
- parser = JSON::Parser.new('null')
105
- assert_equal false, parser.quirks_mode?
106
- assert_raise(JSON::ParserError) { parser.parse }
107
- assert_raise(JSON::ParserError) { JSON.parse('null') }
108
- assert_equal nil, JSON.parse('null', :quirks_mode => true)
109
- parser = JSON::Parser.new('null', :quirks_mode => true)
110
- assert_equal true, parser.quirks_mode?
111
- assert_equal nil, parser.parse
112
- assert_raise(JSON::ParserError) { JSON.parse('false') }
113
- assert_equal false, JSON.parse('false', :quirks_mode => true)
114
- assert_raise(JSON::ParserError) { JSON.parse('true') }
115
- assert_equal true, JSON.parse('true', :quirks_mode => true)
116
- assert_raise(JSON::ParserError) { JSON.parse('23') }
117
- assert_equal 23, JSON.parse('23', :quirks_mode => true)
118
- assert_raise(JSON::ParserError) { JSON.parse('1') }
119
- assert_equal 1, JSON.parse('1', :quirks_mode => true)
120
- assert_raise(JSON::ParserError) { JSON.parse('3.141') }
121
- assert_in_delta 3.141, JSON.parse('3.141', :quirks_mode => true), 1E-3
122
- assert_raise(JSON::ParserError) { JSON.parse('18446744073709551616') }
123
- assert_equal 2 ** 64, JSON.parse('18446744073709551616', :quirks_mode => true)
124
- assert_raise(JSON::ParserError) { JSON.parse('"foo"') }
125
- assert_equal 'foo', JSON.parse('"foo"', :quirks_mode => true)
126
- assert_raise(JSON::ParserError) { JSON.parse('NaN', :allow_nan => true) }
127
- assert JSON.parse('NaN', :quirks_mode => true, :allow_nan => true).nan?
128
- assert_raise(JSON::ParserError) { JSON.parse('Infinity', :allow_nan => true) }
129
- assert JSON.parse('Infinity', :quirks_mode => true, :allow_nan => true).infinite?
130
- assert_raise(JSON::ParserError) { JSON.parse('-Infinity', :allow_nan => true) }
131
- assert JSON.parse('-Infinity', :quirks_mode => true, :allow_nan => true).infinite?
132
- assert_raise(JSON::ParserError) { JSON.parse('[ 1, ]', :quirks_mode => true) }
133
- end
134
-
135
- def test_parse_arrays
136
- assert_equal([1,2,3], parse('[1,2,3]'))
137
- assert_equal([1.2,2,3], parse('[1.2,2,3]'))
138
- assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
139
- end
140
-
141
- def test_parse_values
142
- assert_equal([""], parse('[""]'))
143
- assert_equal(["\\"], parse('["\\\\"]'))
144
- assert_equal(['"'], parse('["\""]'))
145
- assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
146
- assert_equal(["\"\b\n\r\t\0\037"],
147
- parse('["\"\b\n\r\t\u0000\u001f"]'))
148
- for i in 0 ... @ary.size
149
- assert_equal(@ary[i], parse(@ary_to_parse[i]))
150
- end
151
- end
152
-
153
- def test_parse_array
154
- assert_equal([], parse('[]'))
155
- assert_equal([], parse(' [ ] '))
156
- assert_equal([1], parse('[1]'))
157
- assert_equal([1], parse(' [ 1 ] '))
158
- assert_equal(@ary,
159
- parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
160
- ',[false],[true]]'))
161
- assert_equal(@ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
162
- , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
163
- end
164
-
165
- class SubArray < Array
166
- def <<(v)
167
- @shifted = true
168
- super
169
- end
170
-
171
- def shifted?
172
- @shifted
173
- end
174
- end
175
-
176
- class SubArray2 < Array
177
- def to_json(*a)
178
- {
179
- JSON.create_id => self.class.name,
180
- 'ary' => to_a,
181
- }.to_json(*a)
182
- end
183
-
184
- def self.json_create(o)
185
- o.delete JSON.create_id
186
- o['ary']
187
- end
188
- end
189
-
190
- class SubArrayWrapper
191
- def initialize
192
- @data = []
193
- end
194
-
195
- attr_reader :data
196
-
197
- def [](index)
198
- @data[index]
199
- end
200
-
201
- def <<(value)
202
- @data << value
203
- @shifted = true
204
- end
205
-
206
- def shifted?
207
- @shifted
208
- end
209
- end
210
-
211
- def test_parse_array_custom_array_derived_class
212
- res = parse('[1,2]', :array_class => SubArray)
213
- assert_equal([1,2], res)
214
- assert_equal(SubArray, res.class)
215
- assert res.shifted?
216
- end
217
-
218
- def test_parse_array_custom_non_array_derived_class
219
- res = parse('[1,2]', :array_class => SubArrayWrapper)
220
- assert_equal([1,2], res.data)
221
- assert_equal(SubArrayWrapper, res.class)
222
- assert res.shifted?
223
- end
224
-
225
- def test_parse_object
226
- assert_equal({}, parse('{}'))
227
- assert_equal({}, parse(' { } '))
228
- assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
229
- assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
230
- end
231
-
232
- class SubHash < Hash
233
- def []=(k, v)
234
- @item_set = true
235
- super
236
- end
237
-
238
- def item_set?
239
- @item_set
240
- end
241
- end
242
-
243
- class SubHash2 < Hash
244
- def to_json(*a)
245
- {
246
- JSON.create_id => self.class.name,
247
- }.merge(self).to_json(*a)
248
- end
249
-
250
- def self.json_create(o)
251
- o.delete JSON.create_id
252
- self[o]
253
- end
254
- end
255
-
256
- class SubOpenStruct < OpenStruct
257
- def [](k)
258
- __send__(k)
259
- end
260
-
261
- def []=(k, v)
262
- @item_set = true
263
- __send__("#{k}=", v)
264
- end
265
-
266
- def item_set?
267
- @item_set
268
- end
269
- end
270
-
271
- def test_parse_object_custom_hash_derived_class
272
- res = parse('{"foo":"bar"}', :object_class => SubHash)
273
- assert_equal({"foo" => "bar"}, res)
274
- assert_equal(SubHash, res.class)
275
- assert res.item_set?
276
- end
277
-
278
- def test_parse_object_custom_non_hash_derived_class
279
- res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
280
- assert_equal "bar", res.foo
281
- assert_equal(SubOpenStruct, res.class)
282
- assert res.item_set?
283
- end
284
-
285
- def test_parse_generic_object
286
- res = parse('{"foo":"bar", "baz":{}}', :object_class => JSON::GenericObject)
287
- assert_equal(JSON::GenericObject, res.class)
288
- assert_equal "bar", res.foo
289
- assert_equal "bar", res["foo"]
290
- assert_equal "bar", res[:foo]
291
- assert_equal "bar", res.to_hash[:foo]
292
- assert_equal(JSON::GenericObject, res.baz.class)
293
- end
294
-
295
- def test_generate_core_subclasses_with_new_to_json
296
- obj = SubHash2["foo" => SubHash2["bar" => true]]
297
- obj_json = JSON(obj)
298
- obj_again = JSON.parse(obj_json, :create_additions => true)
299
- assert_kind_of SubHash2, obj_again
300
- assert_kind_of SubHash2, obj_again['foo']
301
- assert obj_again['foo']['bar']
302
- assert_equal obj, obj_again
303
- assert_equal ["foo"], JSON(JSON(SubArray2["foo"]), :create_additions => true)
304
- end
305
-
306
- def test_generate_core_subclasses_with_default_to_json
307
- assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
308
- assert_equal '["foo"]', JSON(SubArray["foo"])
309
- end
310
-
311
- def test_generate_of_core_subclasses
312
- obj = SubHash["foo" => SubHash["bar" => true]]
313
- obj_json = JSON(obj)
314
- obj_again = JSON(obj_json)
315
- assert_kind_of Hash, obj_again
316
- assert_kind_of Hash, obj_again['foo']
317
- assert obj_again['foo']['bar']
318
- assert_equal obj, obj_again
319
- end
320
-
321
- def test_parser_reset
322
- parser = Parser.new(@json)
323
- assert_equal(@hash, parser.parse)
324
- assert_equal(@hash, parser.parse)
325
- end
326
-
327
- def test_comments
328
- json = <<EOT
329
- {
330
- "key1":"value1", // eol comment
331
- "key2":"value2" /* multi line
332
- * comment */,
333
- "key3":"value3" /* multi line
334
- // nested eol comment
335
- * comment */
336
- }
337
- EOT
338
- assert_equal(
339
- { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
340
- parse(json))
341
- json = <<EOT
342
- {
343
- "key1":"value1" /* multi line
344
- // nested eol comment
345
- /* illegal nested multi line comment */
346
- * comment */
347
- }
348
- EOT
349
- assert_raises(ParserError) { parse(json) }
350
- json = <<EOT
351
- {
352
- "key1":"value1" /* multi line
353
- // nested eol comment
354
- closed multi comment */
355
- and again, throw an Error */
356
- }
357
- EOT
358
- assert_raises(ParserError) { parse(json) }
359
- json = <<EOT
360
- {
361
- "key1":"value1" /*/*/
362
- }
363
- EOT
364
- assert_equal({ "key1" => "value1" }, parse(json))
365
- end
366
-
367
- def test_backslash
368
- data = [ '\\.(?i:gif|jpe?g|png)$' ]
369
- json = '["\\\\.(?i:gif|jpe?g|png)$"]'
370
- assert_equal json, JSON.generate(data)
371
- assert_equal data, JSON.parse(json)
372
- #
373
- data = [ '\\"' ]
374
- json = '["\\\\\""]'
375
- assert_equal json, JSON.generate(data)
376
- assert_equal data, JSON.parse(json)
377
- #
378
- json = '["/"]'
379
- data = JSON.parse(json)
380
- assert_equal ['/'], data
381
- assert_equal json, JSON.generate(data)
382
- #
383
- json = '["\""]'
384
- data = JSON.parse(json)
385
- assert_equal ['"'], data
386
- assert_equal json, JSON.generate(data)
387
- json = '["\\\'"]'
388
- data = JSON.parse(json)
389
- assert_equal ["'"], data
390
- assert_equal '["\'"]', JSON.generate(data)
391
- end
392
-
393
- def test_wrong_inputs
394
- assert_raises(ParserError) { JSON.parse('"foo"') }
395
- assert_raises(ParserError) { JSON.parse('123') }
396
- assert_raises(ParserError) { JSON.parse('[] bla') }
397
- assert_raises(ParserError) { JSON.parse('[] 1') }
398
- assert_raises(ParserError) { JSON.parse('[] []') }
399
- assert_raises(ParserError) { JSON.parse('[] {}') }
400
- assert_raises(ParserError) { JSON.parse('{} []') }
401
- assert_raises(ParserError) { JSON.parse('{} {}') }
402
- assert_raises(ParserError) { JSON.parse('[NULL]') }
403
- assert_raises(ParserError) { JSON.parse('[FALSE]') }
404
- assert_raises(ParserError) { JSON.parse('[TRUE]') }
405
- assert_raises(ParserError) { JSON.parse('[07] ') }
406
- assert_raises(ParserError) { JSON.parse('[0a]') }
407
- assert_raises(ParserError) { JSON.parse('[1.]') }
408
- assert_raises(ParserError) { JSON.parse(' ') }
409
- end
410
-
411
- def test_nesting
412
- assert_raises(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
413
- assert_raises(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
414
- assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
415
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
416
- too_deep_ary = eval too_deep
417
- assert_raises(JSON::NestingError) { JSON.parse too_deep }
418
- assert_raises(JSON::NestingError) { JSON.parser.new(too_deep).parse }
419
- assert_raises(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 100 }
420
- ok = JSON.parse too_deep, :max_nesting => 101
421
- assert_equal too_deep_ary, ok
422
- ok = JSON.parse too_deep, :max_nesting => nil
423
- assert_equal too_deep_ary, ok
424
- ok = JSON.parse too_deep, :max_nesting => false
425
- assert_equal too_deep_ary, ok
426
- ok = JSON.parse too_deep, :max_nesting => 0
427
- assert_equal too_deep_ary, ok
428
- assert_raises(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
429
- assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
430
- assert_raises(JSON::NestingError) { JSON.generate too_deep_ary }
431
- assert_raises(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 100 }
432
- ok = JSON.generate too_deep_ary, :max_nesting => 101
433
- assert_equal too_deep, ok
434
- ok = JSON.generate too_deep_ary, :max_nesting => nil
435
- assert_equal too_deep, ok
436
- ok = JSON.generate too_deep_ary, :max_nesting => false
437
- assert_equal too_deep, ok
438
- ok = JSON.generate too_deep_ary, :max_nesting => 0
439
- assert_equal too_deep, ok
440
- end
441
-
442
- def test_symbolize_names
443
- assert_equal({ "foo" => "bar", "baz" => "quux" },
444
- JSON.parse('{"foo":"bar", "baz":"quux"}'))
445
- assert_equal({ :foo => "bar", :baz => "quux" },
446
- JSON.parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
447
- end
448
-
449
- def test_load
450
- assert_equal @hash, JSON.load(@json)
451
- tempfile = Tempfile.open('json')
452
- tempfile.write @json
453
- tempfile.rewind
454
- assert_equal @hash, JSON.load(tempfile)
455
- stringio = StringIO.new(@json)
456
- stringio.rewind
457
- assert_equal @hash, JSON.load(stringio)
458
- assert_equal nil, JSON.load(nil)
459
- assert_equal nil, JSON.load('')
460
- ensure
461
- tempfile.close!
462
- end
463
-
464
- def test_load_with_options
465
- small_hash = JSON("foo" => 'bar')
466
- symbol_hash = { :foo => 'bar' }
467
- assert_equal symbol_hash, JSON.load(small_hash, nil, :symbolize_names => true)
468
- end
469
-
470
- def test_dump
471
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
472
- assert_equal too_deep, JSON.dump(eval(too_deep))
473
- assert_kind_of String, Marshal.dump(eval(too_deep))
474
- assert_raises(ArgumentError) { JSON.dump(eval(too_deep), 100) }
475
- assert_raises(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
476
- assert_equal too_deep, JSON.dump(eval(too_deep), 101)
477
- assert_kind_of String, Marshal.dump(eval(too_deep), 101)
478
- output = StringIO.new
479
- JSON.dump(eval(too_deep), output)
480
- assert_equal too_deep, output.string
481
- output = StringIO.new
482
- JSON.dump(eval(too_deep), output, 101)
483
- assert_equal too_deep, output.string
484
- end
485
-
486
- def test_dump_should_modify_defaults
487
- max_nesting = JSON.dump_default_options[:max_nesting]
488
- JSON.dump([], StringIO.new, 10)
489
- assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
490
- end
491
-
492
- def test_big_integers
493
- json1 = JSON([orig = (1 << 31) - 1])
494
- assert_equal orig, JSON[json1][0]
495
- json2 = JSON([orig = 1 << 31])
496
- assert_equal orig, JSON[json2][0]
497
- json3 = JSON([orig = (1 << 62) - 1])
498
- assert_equal orig, JSON[json3][0]
499
- json4 = JSON([orig = 1 << 62])
500
- assert_equal orig, JSON[json4][0]
501
- json5 = JSON([orig = 1 << 64])
502
- assert_equal orig, JSON[json5][0]
503
- end
504
-
505
- if defined?(JSON::Ext::Parser)
506
- def test_allocate
507
- parser = JSON::Ext::Parser.new("{}")
508
- assert_raise(TypeError, '[ruby-core:35079]') {parser.__send__(:initialize, "{}")}
509
- parser = JSON::Ext::Parser.allocate
510
- assert_raise(TypeError, '[ruby-core:35079]') {parser.source}
511
- end
512
- end
513
-
514
- def test_argument_encoding
515
- source = "{}".force_encoding("ascii-8bit")
516
- JSON::Parser.new(source)
517
- assert_equal Encoding::ASCII_8BIT, source.encoding
518
- end if defined?(Encoding::ASCII_8BIT)
519
- end