json 1.8.3 → 2.6.3

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 (108) hide show
  1. checksums.yaml +5 -5
  2. data/{CHANGES → CHANGES.md} +255 -93
  3. data/{COPYING-json-jruby → LICENSE} +5 -6
  4. data/{README.rdoc → README.md} +202 -135
  5. data/VERSION +1 -1
  6. data/ext/json/ext/fbuffer/fbuffer.h +0 -3
  7. data/ext/json/ext/generator/generator.c +266 -116
  8. data/ext/json/ext/generator/generator.h +12 -4
  9. data/ext/json/ext/parser/extconf.rb +29 -0
  10. data/ext/json/ext/parser/parser.c +3011 -1880
  11. data/ext/json/ext/parser/parser.h +10 -6
  12. data/ext/json/ext/parser/parser.rl +239 -192
  13. data/ext/json/extconf.rb +1 -1
  14. data/json.gemspec +0 -0
  15. data/lib/json/add/bigdecimal.rb +3 -2
  16. data/lib/json/add/complex.rb +4 -4
  17. data/lib/json/add/core.rb +1 -0
  18. data/lib/json/add/date.rb +1 -1
  19. data/lib/json/add/date_time.rb +1 -1
  20. data/lib/json/add/exception.rb +1 -1
  21. data/lib/json/add/ostruct.rb +3 -3
  22. data/lib/json/add/range.rb +1 -1
  23. data/lib/json/add/rational.rb +3 -3
  24. data/lib/json/add/regexp.rb +3 -3
  25. data/lib/json/add/set.rb +29 -0
  26. data/lib/json/add/struct.rb +1 -1
  27. data/lib/json/add/symbol.rb +1 -1
  28. data/lib/json/add/time.rb +1 -1
  29. data/lib/json/common.rb +381 -162
  30. data/lib/json/ext.rb +0 -6
  31. data/lib/json/generic_object.rb +5 -4
  32. data/lib/json/pure/generator.rb +83 -126
  33. data/lib/json/pure/parser.rb +64 -86
  34. data/lib/json/pure.rb +2 -8
  35. data/lib/json/version.rb +2 -1
  36. data/lib/json.rb +550 -29
  37. metadata +23 -132
  38. data/.gitignore +0 -16
  39. data/.travis.yml +0 -26
  40. data/COPYING +0 -58
  41. data/GPL +0 -340
  42. data/Gemfile +0 -10
  43. data/README-json-jruby.markdown +0 -33
  44. data/Rakefile +0 -412
  45. data/TODO +0 -1
  46. data/data/example.json +0 -1
  47. data/data/index.html +0 -38
  48. data/data/prototype.js +0 -4184
  49. data/diagrams/.keep +0 -0
  50. data/install.rb +0 -23
  51. data/java/src/json/ext/ByteListTranscoder.java +0 -167
  52. data/java/src/json/ext/Generator.java +0 -444
  53. data/java/src/json/ext/GeneratorMethods.java +0 -232
  54. data/java/src/json/ext/GeneratorService.java +0 -43
  55. data/java/src/json/ext/GeneratorState.java +0 -543
  56. data/java/src/json/ext/OptionsReader.java +0 -114
  57. data/java/src/json/ext/Parser.java +0 -2645
  58. data/java/src/json/ext/Parser.rl +0 -969
  59. data/java/src/json/ext/ParserService.java +0 -35
  60. data/java/src/json/ext/RuntimeInfo.java +0 -121
  61. data/java/src/json/ext/StringDecoder.java +0 -167
  62. data/java/src/json/ext/StringEncoder.java +0 -106
  63. data/java/src/json/ext/Utils.java +0 -89
  64. data/json-java.gemspec +0 -23
  65. data/json_pure.gemspec +0 -40
  66. data/lib/json/ext/.keep +0 -0
  67. data/tests/fixtures/fail1.json +0 -1
  68. data/tests/fixtures/fail10.json +0 -1
  69. data/tests/fixtures/fail11.json +0 -1
  70. data/tests/fixtures/fail12.json +0 -1
  71. data/tests/fixtures/fail13.json +0 -1
  72. data/tests/fixtures/fail14.json +0 -1
  73. data/tests/fixtures/fail18.json +0 -1
  74. data/tests/fixtures/fail19.json +0 -1
  75. data/tests/fixtures/fail2.json +0 -1
  76. data/tests/fixtures/fail20.json +0 -1
  77. data/tests/fixtures/fail21.json +0 -1
  78. data/tests/fixtures/fail22.json +0 -1
  79. data/tests/fixtures/fail23.json +0 -1
  80. data/tests/fixtures/fail24.json +0 -1
  81. data/tests/fixtures/fail25.json +0 -1
  82. data/tests/fixtures/fail27.json +0 -2
  83. data/tests/fixtures/fail28.json +0 -2
  84. data/tests/fixtures/fail3.json +0 -1
  85. data/tests/fixtures/fail4.json +0 -1
  86. data/tests/fixtures/fail5.json +0 -1
  87. data/tests/fixtures/fail6.json +0 -1
  88. data/tests/fixtures/fail7.json +0 -1
  89. data/tests/fixtures/fail8.json +0 -1
  90. data/tests/fixtures/fail9.json +0 -1
  91. data/tests/fixtures/pass1.json +0 -56
  92. data/tests/fixtures/pass15.json +0 -1
  93. data/tests/fixtures/pass16.json +0 -1
  94. data/tests/fixtures/pass17.json +0 -1
  95. data/tests/fixtures/pass2.json +0 -1
  96. data/tests/fixtures/pass26.json +0 -1
  97. data/tests/fixtures/pass3.json +0 -6
  98. data/tests/setup_variant.rb +0 -11
  99. data/tests/test_json.rb +0 -553
  100. data/tests/test_json_addition.rb +0 -196
  101. data/tests/test_json_encoding.rb +0 -65
  102. data/tests/test_json_fixtures.rb +0 -35
  103. data/tests/test_json_generate.rb +0 -337
  104. data/tests/test_json_generic_object.rb +0 -75
  105. data/tests/test_json_string_matching.rb +0 -39
  106. data/tests/test_json_unicode.rb +0 -72
  107. data/tools/fuzz.rb +0 -139
  108. data/tools/server.rb +0 -62
@@ -1,196 +0,0 @@
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 'json/add/core'
7
- require 'json/add/complex'
8
- require 'json/add/rational'
9
- require 'json/add/bigdecimal'
10
- require 'json/add/ostruct'
11
- require 'date'
12
-
13
- class TestJSONAddition < 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 A2 < A
40
- def to_json(*args)
41
- {
42
- 'json_class' => self.class.name,
43
- 'args' => [ @a ],
44
- }.to_json(*args)
45
- end
46
- end
47
-
48
- class B
49
- def self.json_creatable?
50
- false
51
- end
52
-
53
- def to_json(*args)
54
- {
55
- 'json_class' => self.class.name,
56
- }.to_json(*args)
57
- end
58
- end
59
-
60
- class C
61
- def self.json_creatable?
62
- false
63
- end
64
-
65
- def to_json(*args)
66
- {
67
- 'json_class' => 'TestJSONAddition::Nix',
68
- }.to_json(*args)
69
- end
70
- end
71
-
72
- def test_extended_json
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
- end
80
-
81
- def test_extended_json_default
82
- a = A.new(666)
83
- assert A.json_creatable?
84
- json = generate(a)
85
- a_hash = JSON.parse(json)
86
- assert_kind_of Hash, a_hash
87
- end
88
-
89
- def test_extended_json_disabled
90
- a = A.new(666)
91
- assert A.json_creatable?
92
- json = generate(a)
93
- a_again = JSON.parse(json, :create_additions => true)
94
- assert_kind_of a.class, a_again
95
- assert_equal a, a_again
96
- a_hash = JSON.parse(json, :create_additions => false)
97
- assert_kind_of Hash, a_hash
98
- assert_equal(
99
- {"args"=>[666], "json_class"=>"TestJSONAddition::A"}.sort_by { |k,| k },
100
- a_hash.sort_by { |k,| k }
101
- )
102
- end
103
-
104
- def test_extended_json_fail1
105
- b = B.new
106
- assert !B.json_creatable?
107
- json = generate(b)
108
- assert_equal({ "json_class"=>"TestJSONAddition::B" }, JSON.parse(json))
109
- end
110
-
111
- def test_extended_json_fail2
112
- c = C.new
113
- assert !C.json_creatable?
114
- json = generate(c)
115
- assert_raises(ArgumentError, NameError) { JSON.parse(json, :create_additions => true) }
116
- end
117
-
118
- def test_raw_strings
119
- raw = ''
120
- raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
121
- raw_array = []
122
- for i in 0..255
123
- raw << i
124
- raw_array << i
125
- end
126
- json = raw.to_json_raw
127
- json_raw_object = raw.to_json_raw_object
128
- hash = { 'json_class' => 'String', 'raw'=> raw_array }
129
- assert_equal hash, json_raw_object
130
- assert_match(/\A\{.*\}\z/, json)
131
- assert_match(/"json_class":"String"/, json)
132
- 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)
133
- raw_again = JSON.parse(json, :create_additions => true)
134
- assert_equal raw, raw_again
135
- end
136
-
137
- MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
138
-
139
- def test_core
140
- t = Time.now
141
- assert_equal t, JSON(JSON(t), :create_additions => true)
142
- d = Date.today
143
- assert_equal d, JSON(JSON(d), :create_additions => true)
144
- d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
145
- assert_equal d, JSON(JSON(d), :create_additions => true)
146
- assert_equal 1..10, JSON(JSON(1..10), :create_additions => true)
147
- assert_equal 1...10, JSON(JSON(1...10), :create_additions => true)
148
- assert_equal "a".."c", JSON(JSON("a".."c"), :create_additions => true)
149
- assert_equal "a"..."c", JSON(JSON("a"..."c"), :create_additions => true)
150
- s = MyJsonStruct.new 4711, 'foot'
151
- assert_equal s, JSON(JSON(s), :create_additions => true)
152
- struct = Struct.new :foo, :bar
153
- s = struct.new 4711, 'foot'
154
- assert_raises(JSONError) { JSON(s) }
155
- begin
156
- raise TypeError, "test me"
157
- rescue TypeError => e
158
- e_json = JSON.generate e
159
- e_again = JSON e_json, :create_additions => true
160
- assert_kind_of TypeError, e_again
161
- assert_equal e.message, e_again.message
162
- assert_equal e.backtrace, e_again.backtrace
163
- end
164
- assert_equal(/foo/, JSON(JSON(/foo/), :create_additions => true))
165
- assert_equal(/foo/i, JSON(JSON(/foo/i), :create_additions => true))
166
- end
167
-
168
- def test_utc_datetime
169
- now = Time.now
170
- d = DateTime.parse(now.to_s, :create_additions => true) # usual case
171
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
172
- d = DateTime.parse(now.utc.to_s) # of = 0
173
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
174
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
175
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
176
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
177
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
178
- end
179
-
180
- def test_rational_complex
181
- assert_equal Rational(2, 9), JSON.parse(JSON(Rational(2, 9)), :create_additions => true)
182
- assert_equal Complex(2, 9), JSON.parse(JSON(Complex(2, 9)), :create_additions => true)
183
- end
184
-
185
- def test_bigdecimal
186
- assert_equal BigDecimal('3.141', 23), JSON(JSON(BigDecimal('3.141', 23)), :create_additions => true)
187
- assert_equal BigDecimal('3.141', 666), JSON(JSON(BigDecimal('3.141', 666)), :create_additions => true)
188
- end
189
-
190
- def test_ostruct
191
- o = OpenStruct.new
192
- # XXX this won't work; o.foo = { :bar => true }
193
- o.foo = { 'bar' => true }
194
- assert_equal o, JSON.parse(JSON(o), :create_additions => true)
195
- end
196
- end
@@ -1,65 +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
-
7
- class TestJSONEncoding < Test::Unit::TestCase
8
- include JSON
9
-
10
- def setup
11
- @utf_8 = '["© ≠ €!"]'
12
- @parsed = [ "© ≠ €!" ]
13
- @generated = '["\u00a9 \u2260 \u20ac!"]'
14
- if String.method_defined?(:encode)
15
- @utf_16_data = [@parsed.first.encode('utf-16be', 'utf-8')]
16
- @utf_8_ascii_8bit = @utf_8.dup.force_encoding(Encoding::ASCII_8BIT)
17
- @utf_16be = @utf_8.encode('utf-16be', 'utf-8')
18
- @utf_16be_ascii_8bit = @utf_16be.dup.force_encoding(Encoding::ASCII_8BIT)
19
- @utf_16le = @utf_8.encode('utf-16le', 'utf-8')
20
- @utf_16le_ascii_8bit = @utf_16le.dup.force_encoding(Encoding::ASCII_8BIT)
21
- @utf_32be = @utf_8.encode('utf-32be', 'utf-8')
22
- @utf_32be_ascii_8bit = @utf_32be.dup.force_encoding(Encoding::ASCII_8BIT)
23
- @utf_32le = @utf_8.encode('utf-32le', 'utf-8')
24
- @utf_32le_ascii_8bit = @utf_32le.dup.force_encoding(Encoding::ASCII_8BIT)
25
- else
26
- require 'iconv'
27
- @utf_16_data = Iconv.iconv('utf-16be', 'utf-8', @parsed.first)
28
- @utf_8_ascii_8bit = @utf_8.dup
29
- @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
30
- @utf_16be_ascii_8bit = @utf_16be.dup
31
- @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
32
- @utf_16le_ascii_8bit = @utf_16le.dup
33
- @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
34
- @utf_32be_ascii_8bit = @utf_32be.dup
35
- @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
36
- @utf_32le_ascii_8bit = @utf_32le.dup
37
- end
38
- end
39
-
40
- def test_parse
41
- assert_equal @parsed, JSON.parse(@utf_8)
42
- assert_equal @parsed, JSON.parse(@utf_16be)
43
- assert_equal @parsed, JSON.parse(@utf_16le)
44
- assert_equal @parsed, JSON.parse(@utf_32be)
45
- assert_equal @parsed, JSON.parse(@utf_32le)
46
- end
47
-
48
- def test_parse_ascii_8bit
49
- assert_equal @parsed, JSON.parse(@utf_8_ascii_8bit)
50
- assert_equal @parsed, JSON.parse(@utf_16be_ascii_8bit)
51
- assert_equal @parsed, JSON.parse(@utf_16le_ascii_8bit)
52
- assert_equal @parsed, JSON.parse(@utf_32be_ascii_8bit)
53
- assert_equal @parsed, JSON.parse(@utf_32le_ascii_8bit)
54
- end
55
-
56
- def test_generate
57
- assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
58
- if defined?(::Encoding)
59
- assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
60
- else
61
- # XXX checking of correct utf8 data is not as strict (yet?) without :ascii_only
62
- assert_raises(JSON::GeneratorError) { JSON.generate(@utf_16_data, :ascii_only => true) }
63
- end
64
- end
65
- end
@@ -1,35 +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
-
7
- class TestJSONFixtures < Test::Unit::TestCase
8
- def setup
9
- fixtures = File.join(File.dirname(__FILE__), 'fixtures/*.json')
10
- passed, failed = Dir[fixtures].partition { |f| f['pass'] }
11
- @passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
12
- @failed = failed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
13
- end
14
-
15
- def test_passing
16
- for name, source in @passed
17
- begin
18
- assert JSON.parse(source),
19
- "Did not pass for fixture '#{name}': #{source.inspect}"
20
- rescue => e
21
- warn "\nCaught #{e.class}(#{e}) for fixture '#{name}': #{source.inspect}\n#{e.backtrace * "\n"}"
22
- raise e
23
- end
24
- end
25
- end
26
-
27
- def test_failing
28
- for name, source in @failed
29
- assert_raises(JSON::ParserError, JSON::NestingError,
30
- "Did not fail for fixture '#{name}': #{source.inspect}") do
31
- JSON.parse(source)
32
- end
33
- end
34
- end
35
- end
@@ -1,337 +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
-
7
- class TestJSONGenerate < Test::Unit::TestCase
8
- include JSON
9
-
10
- def setup
11
- @hash = {
12
- 'a' => 2,
13
- 'b' => 3.141,
14
- 'c' => 'c',
15
- 'd' => [ 1, "b", 3.14 ],
16
- 'e' => { 'foo' => 'bar' },
17
- 'g' => "\"\0\037",
18
- 'h' => 1000.0,
19
- 'i' => 0.001
20
- }
21
- @json2 = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},' +
22
- '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
23
- @json3 = <<'EOT'.chomp
24
- {
25
- "a": 2,
26
- "b": 3.141,
27
- "c": "c",
28
- "d": [
29
- 1,
30
- "b",
31
- 3.14
32
- ],
33
- "e": {
34
- "foo": "bar"
35
- },
36
- "g": "\"\u0000\u001f",
37
- "h": 1000.0,
38
- "i": 0.001
39
- }
40
- EOT
41
- end
42
-
43
- def test_generate
44
- json = generate(@hash)
45
- assert_equal(JSON.parse(@json2), JSON.parse(json))
46
- json = JSON[@hash]
47
- assert_equal(JSON.parse(@json2), JSON.parse(json))
48
- parsed_json = parse(json)
49
- assert_equal(@hash, parsed_json)
50
- json = generate({1=>2})
51
- assert_equal('{"1":2}', json)
52
- parsed_json = parse(json)
53
- assert_equal({"1"=>2}, parsed_json)
54
- assert_raise(GeneratorError) { generate(666) }
55
- assert_equal '666', generate(666, :quirks_mode => true)
56
- end
57
-
58
- def test_generate_pretty
59
- json = pretty_generate(@hash)
60
- # hashes aren't (insertion) ordered on every ruby implementation assert_equal(@json3, json)
61
- assert_equal(JSON.parse(@json3), JSON.parse(json))
62
- parsed_json = parse(json)
63
- assert_equal(@hash, parsed_json)
64
- json = pretty_generate({1=>2})
65
- assert_equal(<<'EOT'.chomp, json)
66
- {
67
- "1": 2
68
- }
69
- EOT
70
- parsed_json = parse(json)
71
- assert_equal({"1"=>2}, parsed_json)
72
- assert_raise(GeneratorError) { pretty_generate(666) }
73
- assert_equal '666', pretty_generate(666, :quirks_mode => true)
74
- end
75
-
76
- def test_generate_custom
77
- state = State.new(:space_before => " ", :space => " ", :indent => "<i>", :object_nl => "\n", :array_nl => "<a_nl>")
78
- json = generate({1=>{2=>3,4=>[5,6]}}, state)
79
- assert_equal(<<'EOT'.chomp, json)
80
- {
81
- <i>"1" : {
82
- <i><i>"2" : 3,
83
- <i><i>"4" : [<a_nl><i><i><i>5,<a_nl><i><i><i>6<a_nl><i><i>]
84
- <i>}
85
- }
86
- EOT
87
- end
88
-
89
- def test_fast_generate
90
- json = fast_generate(@hash)
91
- assert_equal(JSON.parse(@json2), JSON.parse(json))
92
- parsed_json = parse(json)
93
- assert_equal(@hash, parsed_json)
94
- json = fast_generate({1=>2})
95
- assert_equal('{"1":2}', json)
96
- parsed_json = parse(json)
97
- assert_equal({"1"=>2}, parsed_json)
98
- assert_raise(GeneratorError) { fast_generate(666) }
99
- assert_equal '666', fast_generate(666, :quirks_mode => true)
100
- end
101
-
102
- def test_own_state
103
- state = State.new
104
- json = generate(@hash, state)
105
- assert_equal(JSON.parse(@json2), JSON.parse(json))
106
- parsed_json = parse(json)
107
- assert_equal(@hash, parsed_json)
108
- json = generate({1=>2}, state)
109
- assert_equal('{"1":2}', json)
110
- parsed_json = parse(json)
111
- assert_equal({"1"=>2}, parsed_json)
112
- assert_raise(GeneratorError) { generate(666, state) }
113
- state.quirks_mode = true
114
- assert state.quirks_mode?
115
- assert_equal '666', generate(666, state)
116
- end
117
-
118
- def test_states
119
- json = generate({1=>2}, nil)
120
- assert_equal('{"1":2}', json)
121
- s = JSON.state.new
122
- assert s.check_circular?
123
- assert s[:check_circular?]
124
- h = { 1=>2 }
125
- h[3] = h
126
- assert_raises(JSON::NestingError) { generate(h) }
127
- assert_raises(JSON::NestingError) { generate(h, s) }
128
- s = JSON.state.new
129
- a = [ 1, 2 ]
130
- a << a
131
- assert_raises(JSON::NestingError) { generate(a, s) }
132
- assert s.check_circular?
133
- assert s[:check_circular?]
134
- end
135
-
136
- def test_pretty_state
137
- state = PRETTY_STATE_PROTOTYPE.dup
138
- assert_equal({
139
- :allow_nan => false,
140
- :array_nl => "\n",
141
- :ascii_only => false,
142
- :buffer_initial_length => 1024,
143
- :quirks_mode => false,
144
- :depth => 0,
145
- :indent => " ",
146
- :max_nesting => 100,
147
- :object_nl => "\n",
148
- :space => " ",
149
- :space_before => "",
150
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
151
- end
152
-
153
- def test_safe_state
154
- state = SAFE_STATE_PROTOTYPE.dup
155
- assert_equal({
156
- :allow_nan => false,
157
- :array_nl => "",
158
- :ascii_only => false,
159
- :buffer_initial_length => 1024,
160
- :quirks_mode => false,
161
- :depth => 0,
162
- :indent => "",
163
- :max_nesting => 100,
164
- :object_nl => "",
165
- :space => "",
166
- :space_before => "",
167
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
168
- end
169
-
170
- def test_fast_state
171
- state = FAST_STATE_PROTOTYPE.dup
172
- assert_equal({
173
- :allow_nan => false,
174
- :array_nl => "",
175
- :ascii_only => false,
176
- :buffer_initial_length => 1024,
177
- :quirks_mode => false,
178
- :depth => 0,
179
- :indent => "",
180
- :max_nesting => 0,
181
- :object_nl => "",
182
- :space => "",
183
- :space_before => "",
184
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
185
- end
186
-
187
- def test_allow_nan
188
- assert_raises(GeneratorError) { generate([JSON::NaN]) }
189
- assert_equal '[NaN]', generate([JSON::NaN], :allow_nan => true)
190
- assert_raises(GeneratorError) { fast_generate([JSON::NaN]) }
191
- assert_raises(GeneratorError) { pretty_generate([JSON::NaN]) }
192
- assert_equal "[\n NaN\n]", pretty_generate([JSON::NaN], :allow_nan => true)
193
- assert_raises(GeneratorError) { generate([JSON::Infinity]) }
194
- assert_equal '[Infinity]', generate([JSON::Infinity], :allow_nan => true)
195
- assert_raises(GeneratorError) { fast_generate([JSON::Infinity]) }
196
- assert_raises(GeneratorError) { pretty_generate([JSON::Infinity]) }
197
- assert_equal "[\n Infinity\n]", pretty_generate([JSON::Infinity], :allow_nan => true)
198
- assert_raises(GeneratorError) { generate([JSON::MinusInfinity]) }
199
- assert_equal '[-Infinity]', generate([JSON::MinusInfinity], :allow_nan => true)
200
- assert_raises(GeneratorError) { fast_generate([JSON::MinusInfinity]) }
201
- assert_raises(GeneratorError) { pretty_generate([JSON::MinusInfinity]) }
202
- assert_equal "[\n -Infinity\n]", pretty_generate([JSON::MinusInfinity], :allow_nan => true)
203
- end
204
-
205
- def test_depth
206
- ary = []; ary << ary
207
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
208
- assert_raises(JSON::NestingError) { JSON.generate(ary) }
209
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
210
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
211
- assert_raises(JSON::NestingError) { JSON.pretty_generate(ary) }
212
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
213
- s = JSON.state.new
214
- assert_equal 0, s.depth
215
- assert_raises(JSON::NestingError) { ary.to_json(s) }
216
- assert_equal 100, s.depth
217
- end
218
-
219
- def test_buffer_initial_length
220
- s = JSON.state.new
221
- assert_equal 1024, s.buffer_initial_length
222
- s.buffer_initial_length = 0
223
- assert_equal 1024, s.buffer_initial_length
224
- s.buffer_initial_length = -1
225
- assert_equal 1024, s.buffer_initial_length
226
- s.buffer_initial_length = 128
227
- assert_equal 128, s.buffer_initial_length
228
- end
229
-
230
- def test_gc
231
- if respond_to?(:assert_in_out_err)
232
- assert_in_out_err(%w[-rjson --disable-gems], <<-EOS, [], [])
233
- bignum_too_long_to_embed_as_string = 1234567890123456789012345
234
- expect = bignum_too_long_to_embed_as_string.to_s
235
- GC.stress = true
236
-
237
- 10.times do |i|
238
- tmp = bignum_too_long_to_embed_as_string.to_json
239
- raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
240
- end
241
- EOS
242
- end
243
- end if GC.respond_to?(:stress=)
244
-
245
- def test_configure_using_configure_and_merge
246
- numbered_state = {
247
- :indent => "1",
248
- :space => '2',
249
- :space_before => '3',
250
- :object_nl => '4',
251
- :array_nl => '5'
252
- }
253
- state1 = JSON.state.new
254
- state1.merge(numbered_state)
255
- assert_equal '1', state1.indent
256
- assert_equal '2', state1.space
257
- assert_equal '3', state1.space_before
258
- assert_equal '4', state1.object_nl
259
- assert_equal '5', state1.array_nl
260
- state2 = JSON.state.new
261
- state2.configure(numbered_state)
262
- assert_equal '1', state2.indent
263
- assert_equal '2', state2.space
264
- assert_equal '3', state2.space_before
265
- assert_equal '4', state2.object_nl
266
- assert_equal '5', state2.array_nl
267
- end
268
-
269
- def test_configure_hash_conversion
270
- state = JSON.state.new
271
- state.configure(:indent => '1')
272
- assert_equal '1', state.indent
273
- state = JSON.state.new
274
- foo = 'foo'
275
- assert_raise(TypeError) do
276
- state.configure(foo)
277
- end
278
- def foo.to_h
279
- { :indent => '2' }
280
- end
281
- state.configure(foo)
282
- assert_equal '2', state.indent
283
- end
284
-
285
- if defined?(JSON::Ext::Generator)
286
- def test_broken_bignum # [ruby-core:38867]
287
- pid = fork do
288
- Bignum.class_eval do
289
- def to_s
290
- end
291
- end
292
- begin
293
- JSON::Ext::Generator::State.new.generate(1<<64)
294
- exit 1
295
- rescue TypeError
296
- exit 0
297
- end
298
- end
299
- _, status = Process.waitpid2(pid)
300
- assert status.success?
301
- rescue NotImplementedError
302
- # forking to avoid modifying core class of a parent process and
303
- # introducing race conditions of tests are run in parallel
304
- end
305
- end
306
-
307
- def test_hash_likeness_set_symbol
308
- state = JSON.state.new
309
- assert_equal nil, state[:foo]
310
- assert_equal nil.class, state[:foo].class
311
- assert_equal nil, state['foo']
312
- state[:foo] = :bar
313
- assert_equal :bar, state[:foo]
314
- assert_equal :bar, state['foo']
315
- state_hash = state.to_hash
316
- assert_kind_of Hash, state_hash
317
- assert_equal :bar, state_hash[:foo]
318
- end
319
-
320
- def test_hash_likeness_set_string
321
- state = JSON.state.new
322
- assert_equal nil, state[:foo]
323
- assert_equal nil, state['foo']
324
- state['foo'] = :bar
325
- assert_equal :bar, state[:foo]
326
- assert_equal :bar, state['foo']
327
- state_hash = state.to_hash
328
- assert_kind_of Hash, state_hash
329
- assert_equal :bar, state_hash[:foo]
330
- end
331
-
332
- def test_json_generate
333
- assert_raise JSON::GeneratorError do
334
- assert_equal true, JSON.generate(["\xea"])
335
- end
336
- end
337
- end