json 1.7.0 → 2.3.0

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 (88) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.travis.yml +18 -10
  4. data/{CHANGES → CHANGES.md} +217 -69
  5. data/Gemfile +11 -12
  6. data/{COPYING-json-jruby → LICENSE} +5 -6
  7. data/{README-json-jruby.markdown → README-json-jruby.md} +0 -0
  8. data/{README.rdoc → README.md} +188 -137
  9. data/Rakefile +52 -37
  10. data/VERSION +1 -1
  11. data/ext/json/ext/fbuffer/fbuffer.h +38 -7
  12. data/ext/json/ext/generator/depend +1 -0
  13. data/ext/json/ext/generator/extconf.rb +1 -10
  14. data/ext/json/ext/generator/generator.c +239 -133
  15. data/ext/json/ext/generator/generator.h +35 -26
  16. data/ext/json/ext/parser/depend +1 -0
  17. data/ext/json/ext/parser/extconf.rb +2 -9
  18. data/ext/json/ext/parser/parser.c +446 -514
  19. data/ext/json/ext/parser/parser.h +23 -9
  20. data/ext/json/ext/parser/parser.rl +177 -208
  21. data/ext/json/extconf.rb +2 -0
  22. data/java/src/json/ext/ByteListTranscoder.java +1 -2
  23. data/java/src/json/ext/Generator.java +49 -20
  24. data/java/src/json/ext/GeneratorMethods.java +1 -2
  25. data/java/src/json/ext/GeneratorService.java +1 -2
  26. data/java/src/json/ext/GeneratorState.java +25 -57
  27. data/java/src/json/ext/OptionsReader.java +5 -5
  28. data/java/src/json/ext/Parser.java +141 -419
  29. data/java/src/json/ext/Parser.rl +57 -128
  30. data/java/src/json/ext/ParserService.java +1 -2
  31. data/java/src/json/ext/RuntimeInfo.java +1 -6
  32. data/java/src/json/ext/StringDecoder.java +1 -2
  33. data/java/src/json/ext/StringEncoder.java +5 -0
  34. data/java/src/json/ext/Utils.java +1 -2
  35. data/json-java.gemspec +17 -2
  36. data/json.gemspec +0 -0
  37. data/json_pure.gemspec +25 -26
  38. data/lib/json.rb +3 -2
  39. data/lib/json/add/bigdecimal.rb +10 -2
  40. data/lib/json/add/complex.rb +9 -2
  41. data/lib/json/add/core.rb +1 -0
  42. data/lib/json/add/date.rb +1 -1
  43. data/lib/json/add/date_time.rb +1 -1
  44. data/lib/json/add/exception.rb +1 -1
  45. data/lib/json/add/ostruct.rb +3 -3
  46. data/lib/json/add/range.rb +1 -1
  47. data/lib/json/add/rational.rb +8 -2
  48. data/lib/json/add/regexp.rb +3 -3
  49. data/lib/json/add/set.rb +29 -0
  50. data/lib/json/add/struct.rb +1 -1
  51. data/lib/json/add/symbol.rb +1 -1
  52. data/lib/json/add/time.rb +6 -3
  53. data/lib/json/common.rb +51 -66
  54. data/lib/json/ext.rb +0 -6
  55. data/lib/json/generic_object.rb +36 -4
  56. data/lib/json/pure.rb +2 -8
  57. data/lib/json/pure/generator.rb +106 -119
  58. data/lib/json/pure/parser.rb +48 -88
  59. data/lib/json/version.rb +2 -1
  60. data/references/rfc7159.txt +899 -0
  61. data/tests/fixtures/fail18.json +1 -1
  62. data/tests/fixtures/obsolete_fail1.json +1 -0
  63. data/tests/{test_json_addition.rb → json_addition_test.rb} +53 -38
  64. data/tests/json_common_interface_test.rb +126 -0
  65. data/tests/json_encoding_test.rb +107 -0
  66. data/tests/json_ext_parser_test.rb +15 -0
  67. data/tests/{test_json_fixtures.rb → json_fixtures_test.rb} +5 -8
  68. data/tests/json_generator_test.rb +421 -0
  69. data/tests/json_generic_object_test.rb +82 -0
  70. data/tests/json_parser_test.rb +472 -0
  71. data/tests/json_string_matching_test.rb +38 -0
  72. data/tests/{setup_variant.rb → test_helper.rb} +6 -0
  73. data/tools/diff.sh +18 -0
  74. data/tools/fuzz.rb +1 -9
  75. metadata +49 -72
  76. data/COPYING +0 -58
  77. data/GPL +0 -340
  78. data/TODO +0 -1
  79. data/data/example.json +0 -1
  80. data/data/index.html +0 -38
  81. data/data/prototype.js +0 -4184
  82. data/tests/fixtures/fail1.json +0 -1
  83. data/tests/test_json.rb +0 -539
  84. data/tests/test_json_encoding.rb +0 -65
  85. data/tests/test_json_generate.rb +0 -251
  86. data/tests/test_json_generic_object.rb +0 -35
  87. data/tests/test_json_string_matching.rb +0 -40
  88. data/tests/test_json_unicode.rb +0 -72
@@ -1,65 +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
-
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,251 +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
-
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_fast_generate
77
- json = fast_generate(@hash)
78
- assert_equal(JSON.parse(@json2), JSON.parse(json))
79
- parsed_json = parse(json)
80
- assert_equal(@hash, parsed_json)
81
- json = fast_generate({1=>2})
82
- assert_equal('{"1":2}', json)
83
- parsed_json = parse(json)
84
- assert_equal({"1"=>2}, parsed_json)
85
- assert_raise(GeneratorError) { fast_generate(666) }
86
- assert_equal '666', fast_generate(666, :quirks_mode => true)
87
- end
88
-
89
- def test_own_state
90
- state = State.new
91
- json = generate(@hash, state)
92
- assert_equal(JSON.parse(@json2), JSON.parse(json))
93
- parsed_json = parse(json)
94
- assert_equal(@hash, parsed_json)
95
- json = generate({1=>2}, state)
96
- assert_equal('{"1":2}', json)
97
- parsed_json = parse(json)
98
- assert_equal({"1"=>2}, parsed_json)
99
- assert_raise(GeneratorError) { generate(666, state) }
100
- state.quirks_mode = true
101
- assert state.quirks_mode?
102
- assert_equal '666', generate(666, state)
103
- end
104
-
105
- def test_states
106
- json = generate({1=>2}, nil)
107
- assert_equal('{"1":2}', json)
108
- s = JSON.state.new
109
- assert s.check_circular?
110
- assert s[:check_circular?]
111
- h = { 1=>2 }
112
- h[3] = h
113
- assert_raises(JSON::NestingError) { generate(h) }
114
- assert_raises(JSON::NestingError) { generate(h, s) }
115
- s = JSON.state.new
116
- a = [ 1, 2 ]
117
- a << a
118
- assert_raises(JSON::NestingError) { generate(a, s) }
119
- assert s.check_circular?
120
- assert s[:check_circular?]
121
- end
122
-
123
- def test_pretty_state
124
- state = PRETTY_STATE_PROTOTYPE.dup
125
- assert_equal({
126
- :allow_nan => false,
127
- :array_nl => "\n",
128
- :ascii_only => false,
129
- :buffer_initial_length => 1024,
130
- :quirks_mode => false,
131
- :depth => 0,
132
- :indent => " ",
133
- :max_nesting => 19,
134
- :object_nl => "\n",
135
- :space => " ",
136
- :space_before => "",
137
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
138
- end
139
-
140
- def test_safe_state
141
- state = SAFE_STATE_PROTOTYPE.dup
142
- assert_equal({
143
- :allow_nan => false,
144
- :array_nl => "",
145
- :ascii_only => false,
146
- :buffer_initial_length => 1024,
147
- :quirks_mode => false,
148
- :depth => 0,
149
- :indent => "",
150
- :max_nesting => 19,
151
- :object_nl => "",
152
- :space => "",
153
- :space_before => "",
154
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
155
- end
156
-
157
- def test_fast_state
158
- state = FAST_STATE_PROTOTYPE.dup
159
- assert_equal({
160
- :allow_nan => false,
161
- :array_nl => "",
162
- :ascii_only => false,
163
- :buffer_initial_length => 1024,
164
- :quirks_mode => false,
165
- :depth => 0,
166
- :indent => "",
167
- :max_nesting => 0,
168
- :object_nl => "",
169
- :space => "",
170
- :space_before => "",
171
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
172
- end
173
-
174
- def test_allow_nan
175
- assert_raises(GeneratorError) { generate([JSON::NaN]) }
176
- assert_equal '[NaN]', generate([JSON::NaN], :allow_nan => true)
177
- assert_raises(GeneratorError) { fast_generate([JSON::NaN]) }
178
- assert_raises(GeneratorError) { pretty_generate([JSON::NaN]) }
179
- assert_equal "[\n NaN\n]", pretty_generate([JSON::NaN], :allow_nan => true)
180
- assert_raises(GeneratorError) { generate([JSON::Infinity]) }
181
- assert_equal '[Infinity]', generate([JSON::Infinity], :allow_nan => true)
182
- assert_raises(GeneratorError) { fast_generate([JSON::Infinity]) }
183
- assert_raises(GeneratorError) { pretty_generate([JSON::Infinity]) }
184
- assert_equal "[\n Infinity\n]", pretty_generate([JSON::Infinity], :allow_nan => true)
185
- assert_raises(GeneratorError) { generate([JSON::MinusInfinity]) }
186
- assert_equal '[-Infinity]', generate([JSON::MinusInfinity], :allow_nan => true)
187
- assert_raises(GeneratorError) { fast_generate([JSON::MinusInfinity]) }
188
- assert_raises(GeneratorError) { pretty_generate([JSON::MinusInfinity]) }
189
- assert_equal "[\n -Infinity\n]", pretty_generate([JSON::MinusInfinity], :allow_nan => true)
190
- end
191
-
192
- def test_depth
193
- ary = []; ary << ary
194
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
195
- assert_raises(JSON::NestingError) { JSON.generate(ary) }
196
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
197
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
198
- assert_raises(JSON::NestingError) { JSON.pretty_generate(ary) }
199
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
200
- s = JSON.state.new
201
- assert_equal 0, s.depth
202
- assert_raises(JSON::NestingError) { ary.to_json(s) }
203
- assert_equal 19, s.depth
204
- end
205
-
206
- def test_buffer_initial_length
207
- s = JSON.state.new
208
- assert_equal 1024, s.buffer_initial_length
209
- s.buffer_initial_length = 0
210
- assert_equal 1024, s.buffer_initial_length
211
- s.buffer_initial_length = -1
212
- assert_equal 1024, s.buffer_initial_length
213
- s.buffer_initial_length = 128
214
- assert_equal 128, s.buffer_initial_length
215
- end
216
-
217
- def test_gc
218
- bignum_too_long_to_embed_as_string = 1234567890123456789012345
219
- expect = bignum_too_long_to_embed_as_string.to_s
220
- stress, GC.stress = GC.stress, true
221
-
222
- 10.times do |i|
223
- tmp = bignum_too_long_to_embed_as_string.to_json
224
- assert_equal expect, tmp
225
- end
226
- ensure
227
- GC.stress = stress
228
- end if GC.respond_to?(:stress=)
229
-
230
- if defined?(JSON::Ext::Generator)
231
- def test_broken_bignum # [ruby-core:38867]
232
- pid = fork do
233
- Bignum.class_eval do
234
- def to_s
235
- end
236
- end
237
- begin
238
- JSON::Ext::Generator::State.new.generate(1<<64)
239
- exit 1
240
- rescue TypeError
241
- exit 0
242
- end
243
- end
244
- _, status = Process.waitpid2(pid)
245
- assert status.success?
246
- rescue NotImplementedError
247
- # forking to avoid modifying core class of a parent process and
248
- # introducing race conditions of tests are run in parallel
249
- end
250
- end
251
- end
@@ -1,35 +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
- class TestJSONGenericObject < Test::Unit::TestCase
7
- include JSON
8
-
9
- def setup
10
- @go = GenericObject[ :a => 1, :b => 2 ]
11
- end
12
-
13
- def test_attributes
14
- assert_equal 1, @go.a
15
- assert_equal 1, @go[:a]
16
- assert_equal 2, @go.b
17
- assert_equal 2, @go[:b]
18
- assert_nil @go.c
19
- assert_nil @go[:c]
20
- end
21
-
22
- def test_generate_json
23
- assert_equal @go, JSON(JSON(@go))
24
- end
25
-
26
- def test_parse_json
27
- assert_equal @go, l = JSON('{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }')
28
- assert_equal 1, l.a
29
- assert_equal @go, l = JSON('{ "a": 1, "b": 2 }', :object_class => GenericObject)
30
- assert_equal 1, l.a
31
- assert_equal GenericObject[:a => GenericObject[:b => 2]],
32
- l = JSON('{ "a": { "b": 2 } }', :object_class => GenericObject)
33
- assert_equal 2, l.a.b
34
- end
35
- end
@@ -1,40 +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 'stringio'
7
- require 'time'
8
-
9
- class TestJSONStringMatching < Test::Unit::TestCase
10
- include JSON
11
-
12
- class TestTime < ::Time
13
- def self.json_create(string)
14
- Time.parse(string)
15
- end
16
-
17
- def to_json(*)
18
- %{"#{strftime('%FT%T%z')}"}
19
- end
20
-
21
- def ==(other)
22
- to_i == other.to_i
23
- end
24
- end
25
-
26
- def test_match_date
27
- t = TestTime.new
28
- t_json = [ t ].to_json
29
- assert_equal [ t ],
30
- JSON.parse(t_json,
31
- :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\Z/ => TestTime })
32
- assert_equal [ t.strftime('%FT%T%z') ],
33
- JSON.parse(t_json,
34
- :match_string => { /\A\d{3}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\Z/ => TestTime })
35
- assert_equal [ t.strftime('%FT%T%z') ],
36
- JSON.parse(t_json,
37
- :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\Z/ => TestTime },
38
- :create_additions => false)
39
- end
40
- end
@@ -1,72 +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
-
7
- class TestJSONUnicode < Test::Unit::TestCase
8
- include JSON
9
-
10
- def test_unicode
11
- assert_equal '""', ''.to_json
12
- assert_equal '"\\b"', "\b".to_json
13
- assert_equal '"\u0001"', 0x1.chr.to_json
14
- assert_equal '"\u001f"', 0x1f.chr.to_json
15
- assert_equal '" "', ' '.to_json
16
- assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
17
- utf8 = [ "© ≠ €! \01" ]
18
- json = '["© ≠ €! \u0001"]'
19
- assert_equal json, utf8.to_json(:ascii_only => false)
20
- assert_equal utf8, parse(json)
21
- json = '["\u00a9 \u2260 \u20ac! \u0001"]'
22
- assert_equal json, utf8.to_json(:ascii_only => true)
23
- assert_equal utf8, parse(json)
24
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
25
- json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
26
- assert_equal utf8, parse(json)
27
- assert_equal json, utf8.to_json(:ascii_only => false)
28
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
29
- assert_equal utf8, parse(json)
30
- json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
31
- assert_equal json, utf8.to_json(:ascii_only => true)
32
- assert_equal utf8, parse(json)
33
- utf8 = ['საქართველო']
34
- json = '["საქართველო"]'
35
- assert_equal json, utf8.to_json(:ascii_only => false)
36
- json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
37
- assert_equal json, utf8.to_json(:ascii_only => true)
38
- assert_equal utf8, parse(json)
39
- assert_equal '["Ã"]', JSON.generate(["Ã"], :ascii_only => false)
40
- assert_equal '["\\u00c3"]', JSON.generate(["Ã"], :ascii_only => true)
41
- assert_equal ["€"], JSON.parse('["\u20ac"]')
42
- utf8 = ["\xf0\xa0\x80\x81"]
43
- json = "[\"\xf0\xa0\x80\x81\"]"
44
- assert_equal json, JSON.generate(utf8, :ascii_only => false)
45
- assert_equal utf8, JSON.parse(json)
46
- json = '["\ud840\udc01"]'
47
- assert_equal json, JSON.generate(utf8, :ascii_only => true)
48
- assert_equal utf8, JSON.parse(json)
49
- end
50
-
51
- def test_chars
52
- (0..0x7f).each do |i|
53
- json = '["\u%04x"]' % i
54
- if RUBY_VERSION >= "1.9."
55
- i = i.chr
56
- end
57
- assert_equal i, JSON.parse(json).first[0]
58
- if i == ?\b
59
- generated = JSON.generate(["" << i])
60
- assert '["\b"]' == generated || '["\10"]' == generated
61
- elsif [?\n, ?\r, ?\t, ?\f].include?(i)
62
- assert_equal '[' << ('' << i).dump << ']', JSON.generate(["" << i])
63
- elsif i.chr < 0x20.chr
64
- assert_equal json, JSON.generate(["" << i])
65
- end
66
- end
67
- assert_raise(JSON::GeneratorError) do
68
- JSON.generate(["\x80"], :ascii_only => true)
69
- end
70
- assert_equal "\302\200", JSON.parse('["\u0080"]').first
71
- end
72
- end