json 2.1.0 → 2.6.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 (96) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +63 -5
  3. data/LICENSE +56 -0
  4. data/README.md +56 -23
  5. data/VERSION +1 -1
  6. data/ext/json/ext/generator/generator.c +223 -58
  7. data/ext/json/ext/generator/generator.h +5 -2
  8. data/ext/json/ext/parser/extconf.rb +26 -0
  9. data/ext/json/ext/parser/parser.c +2973 -1744
  10. data/ext/json/ext/parser/parser.h +6 -1
  11. data/ext/json/ext/parser/parser.rl +130 -22
  12. data/ext/json/extconf.rb +1 -0
  13. data/json.gemspec +0 -0
  14. data/lib/json/add/bigdecimal.rb +2 -2
  15. data/lib/json/add/complex.rb +2 -3
  16. data/lib/json/add/ostruct.rb +1 -1
  17. data/lib/json/add/rational.rb +2 -3
  18. data/lib/json/add/regexp.rb +2 -2
  19. data/lib/json/add/set.rb +29 -0
  20. data/lib/json/common.rb +372 -125
  21. data/lib/json/pure/generator.rb +31 -10
  22. data/lib/json/pure/parser.rb +32 -6
  23. data/lib/json/version.rb +1 -1
  24. data/lib/json.rb +549 -29
  25. metadata +19 -113
  26. data/.gitignore +0 -17
  27. data/.travis.yml +0 -19
  28. data/Gemfile +0 -16
  29. data/README-json-jruby.md +0 -33
  30. data/Rakefile +0 -408
  31. data/data/example.json +0 -1
  32. data/data/index.html +0 -38
  33. data/data/prototype.js +0 -4184
  34. data/diagrams/.keep +0 -0
  35. data/install.rb +0 -23
  36. data/java/src/json/ext/ByteListTranscoder.java +0 -166
  37. data/java/src/json/ext/Generator.java +0 -443
  38. data/java/src/json/ext/GeneratorMethods.java +0 -231
  39. data/java/src/json/ext/GeneratorService.java +0 -42
  40. data/java/src/json/ext/GeneratorState.java +0 -490
  41. data/java/src/json/ext/OptionsReader.java +0 -113
  42. data/java/src/json/ext/Parser.java +0 -2362
  43. data/java/src/json/ext/Parser.rl +0 -893
  44. data/java/src/json/ext/ParserService.java +0 -34
  45. data/java/src/json/ext/RuntimeInfo.java +0 -116
  46. data/java/src/json/ext/StringDecoder.java +0 -166
  47. data/java/src/json/ext/StringEncoder.java +0 -111
  48. data/java/src/json/ext/Utils.java +0 -88
  49. data/json-java.gemspec +0 -38
  50. data/json_pure.gemspec +0 -38
  51. data/lib/json/ext/.keep +0 -0
  52. data/references/rfc7159.txt +0 -899
  53. data/tests/fixtures/fail10.json +0 -1
  54. data/tests/fixtures/fail11.json +0 -1
  55. data/tests/fixtures/fail12.json +0 -1
  56. data/tests/fixtures/fail13.json +0 -1
  57. data/tests/fixtures/fail14.json +0 -1
  58. data/tests/fixtures/fail18.json +0 -1
  59. data/tests/fixtures/fail19.json +0 -1
  60. data/tests/fixtures/fail2.json +0 -1
  61. data/tests/fixtures/fail20.json +0 -1
  62. data/tests/fixtures/fail21.json +0 -1
  63. data/tests/fixtures/fail22.json +0 -1
  64. data/tests/fixtures/fail23.json +0 -1
  65. data/tests/fixtures/fail24.json +0 -1
  66. data/tests/fixtures/fail25.json +0 -1
  67. data/tests/fixtures/fail27.json +0 -2
  68. data/tests/fixtures/fail28.json +0 -2
  69. data/tests/fixtures/fail3.json +0 -1
  70. data/tests/fixtures/fail4.json +0 -1
  71. data/tests/fixtures/fail5.json +0 -1
  72. data/tests/fixtures/fail6.json +0 -1
  73. data/tests/fixtures/fail7.json +0 -1
  74. data/tests/fixtures/fail8.json +0 -1
  75. data/tests/fixtures/fail9.json +0 -1
  76. data/tests/fixtures/obsolete_fail1.json +0 -1
  77. data/tests/fixtures/pass1.json +0 -56
  78. data/tests/fixtures/pass15.json +0 -1
  79. data/tests/fixtures/pass16.json +0 -1
  80. data/tests/fixtures/pass17.json +0 -1
  81. data/tests/fixtures/pass2.json +0 -1
  82. data/tests/fixtures/pass26.json +0 -1
  83. data/tests/fixtures/pass3.json +0 -6
  84. data/tests/json_addition_test.rb +0 -193
  85. data/tests/json_common_interface_test.rb +0 -126
  86. data/tests/json_encoding_test.rb +0 -107
  87. data/tests/json_ext_parser_test.rb +0 -15
  88. data/tests/json_fixtures_test.rb +0 -32
  89. data/tests/json_generator_test.rb +0 -377
  90. data/tests/json_generic_object_test.rb +0 -82
  91. data/tests/json_parser_test.rb +0 -471
  92. data/tests/json_string_matching_test.rb +0 -38
  93. data/tests/test_helper.rb +0 -21
  94. data/tools/diff.sh +0 -18
  95. data/tools/fuzz.rb +0 -131
  96. data/tools/server.rb +0 -62
@@ -1 +0,0 @@
1
- {"Extra value after close": true} "misplaced quoted value"
@@ -1 +0,0 @@
1
- {"Illegal expression": 1 + 2}
@@ -1 +0,0 @@
1
- {"Illegal invocation": alert()}
@@ -1 +0,0 @@
1
- {"Numbers cannot have leading zeroes": 013}
@@ -1 +0,0 @@
1
- {"Numbers cannot be hex": 0x14}
@@ -1 +0,0 @@
1
- [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
@@ -1 +0,0 @@
1
- {"Missing colon" null}
@@ -1 +0,0 @@
1
- ["Unclosed array"
@@ -1 +0,0 @@
1
- {"Double colon":: null}
@@ -1 +0,0 @@
1
- {"Comma instead of colon", null}
@@ -1 +0,0 @@
1
- ["Colon instead of comma": false]
@@ -1 +0,0 @@
1
- ["Bad value", truth]
@@ -1 +0,0 @@
1
- ['single quote']
@@ -1 +0,0 @@
1
- ["tab character in string "]
@@ -1,2 +0,0 @@
1
- ["line
2
- break"]
@@ -1,2 +0,0 @@
1
- ["line\
2
- break"]
@@ -1 +0,0 @@
1
- {unquoted_key: "keys must be quoted"}
@@ -1 +0,0 @@
1
- ["extra comma",]
@@ -1 +0,0 @@
1
- ["double extra comma",,]
@@ -1 +0,0 @@
1
- [ , "<-- missing value"]
@@ -1 +0,0 @@
1
- ["Comma after the close"],
@@ -1 +0,0 @@
1
- ["Extra close"]]
@@ -1 +0,0 @@
1
- {"Extra comma": true,}
@@ -1 +0,0 @@
1
- "A JSON payload should be an object or array, not a string."
@@ -1,56 +0,0 @@
1
- [
2
- "JSON Test Pattern pass1",
3
- {"object with 1 member":["array with 1 element"]},
4
- {},
5
- [],
6
- -42,
7
- true,
8
- false,
9
- null,
10
- {
11
- "integer": 1234567890,
12
- "real": -9876.543210,
13
- "e": 0.123456789e-12,
14
- "E": 1.234567890E+34,
15
- "": 23456789012E666,
16
- "zero": 0,
17
- "one": 1,
18
- "space": " ",
19
- "quote": "\"",
20
- "backslash": "\\",
21
- "controls": "\b\f\n\r\t",
22
- "slash": "/ & \/",
23
- "alpha": "abcdefghijklmnopqrstuvwyz",
24
- "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",
25
- "digit": "0123456789",
26
- "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
27
- "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
28
- "true": true,
29
- "false": false,
30
- "null": null,
31
- "array":[ ],
32
- "object":{ },
33
- "address": "50 St. James Street",
34
- "url": "http://www.JSON.org/",
35
- "comment": "// /* <!-- --",
36
- "# -- --> */": " ",
37
- " s p a c e d " :[1,2 , 3
38
-
39
- ,
40
-
41
- 4 , 5 , 6 ,7 ],
42
- "compact": [1,2,3,4,5,6,7],
43
- "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}",
44
- "quotes": "&#34; \u0022 %22 0x22 034 &#x22;",
45
- "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"
46
- : "A key can be any string"
47
- },
48
- 0.5 ,98.6
49
- ,
50
- 99.44
51
- ,
52
-
53
- 1066
54
-
55
-
56
- ,"rosebud"]
@@ -1 +0,0 @@
1
- ["Illegal backslash escape: \x15"]
@@ -1 +0,0 @@
1
- ["Illegal backslash escape: \'"]
@@ -1 +0,0 @@
1
- ["Illegal backslash escape: \017"]
@@ -1 +0,0 @@
1
- [[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
@@ -1 +0,0 @@
1
- ["tab\ character\ in\ string\ "]
@@ -1,6 +0,0 @@
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
- }
@@ -1,193 +0,0 @@
1
- #frozen_string_literal: false
2
- require 'test_helper'
3
- require 'json/add/core'
4
- require 'json/add/complex'
5
- require 'json/add/rational'
6
- require 'json/add/bigdecimal'
7
- require 'json/add/ostruct'
8
- require 'date'
9
-
10
- class JSONAdditionTest < Test::Unit::TestCase
11
- include JSON
12
-
13
- class A
14
- def initialize(a)
15
- @a = a
16
- end
17
-
18
- attr_reader :a
19
-
20
- def ==(other)
21
- a == other.a
22
- end
23
-
24
- def self.json_create(object)
25
- new(*object['args'])
26
- end
27
-
28
- def to_json(*args)
29
- {
30
- 'json_class' => self.class.name,
31
- 'args' => [ @a ],
32
- }.to_json(*args)
33
- end
34
- end
35
-
36
- class A2 < A
37
- def to_json(*args)
38
- {
39
- 'json_class' => self.class.name,
40
- 'args' => [ @a ],
41
- }.to_json(*args)
42
- end
43
- end
44
-
45
- class B
46
- def self.json_creatable?
47
- false
48
- end
49
-
50
- def to_json(*args)
51
- {
52
- 'json_class' => self.class.name,
53
- }.to_json(*args)
54
- end
55
- end
56
-
57
- class C
58
- def self.json_creatable?
59
- false
60
- end
61
-
62
- def to_json(*args)
63
- {
64
- 'json_class' => 'JSONAdditionTest::Nix',
65
- }.to_json(*args)
66
- end
67
- end
68
-
69
- def test_extended_json
70
- a = A.new(666)
71
- assert A.json_creatable?
72
- json = generate(a)
73
- a_again = parse(json, :create_additions => true)
74
- assert_kind_of a.class, a_again
75
- assert_equal a, a_again
76
- end
77
-
78
- def test_extended_json_default
79
- a = A.new(666)
80
- assert A.json_creatable?
81
- json = generate(a)
82
- a_hash = parse(json)
83
- assert_kind_of Hash, a_hash
84
- end
85
-
86
- def test_extended_json_disabled
87
- a = A.new(666)
88
- assert A.json_creatable?
89
- json = generate(a)
90
- a_again = parse(json, :create_additions => true)
91
- assert_kind_of a.class, a_again
92
- assert_equal a, a_again
93
- a_hash = parse(json, :create_additions => false)
94
- assert_kind_of Hash, a_hash
95
- assert_equal(
96
- {"args"=>[666], "json_class"=>"JSONAdditionTest::A"}.sort_by { |k,| k },
97
- a_hash.sort_by { |k,| k }
98
- )
99
- end
100
-
101
- def test_extended_json_fail1
102
- b = B.new
103
- assert !B.json_creatable?
104
- json = generate(b)
105
- assert_equal({ "json_class"=>"JSONAdditionTest::B" }, parse(json))
106
- end
107
-
108
- def test_extended_json_fail2
109
- c = C.new
110
- assert !C.json_creatable?
111
- json = generate(c)
112
- assert_raise(ArgumentError, NameError) { parse(json, :create_additions => true) }
113
- end
114
-
115
- def test_raw_strings
116
- raw = ''
117
- raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
118
- raw_array = []
119
- for i in 0..255
120
- raw << i
121
- raw_array << i
122
- end
123
- json = raw.to_json_raw
124
- json_raw_object = raw.to_json_raw_object
125
- hash = { 'json_class' => 'String', 'raw'=> raw_array }
126
- assert_equal hash, json_raw_object
127
- assert_match(/\A\{.*\}\z/, json)
128
- assert_match(/"json_class":"String"/, json)
129
- 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)
130
- raw_again = parse(json, :create_additions => true)
131
- assert_equal raw, raw_again
132
- end
133
-
134
- MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
135
-
136
- def test_core
137
- t = Time.now
138
- assert_equal t, JSON(JSON(t), :create_additions => true)
139
- d = Date.today
140
- assert_equal d, JSON(JSON(d), :create_additions => true)
141
- d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
142
- assert_equal d, JSON(JSON(d), :create_additions => true)
143
- assert_equal 1..10, JSON(JSON(1..10), :create_additions => true)
144
- assert_equal 1...10, JSON(JSON(1...10), :create_additions => true)
145
- assert_equal "a".."c", JSON(JSON("a".."c"), :create_additions => true)
146
- assert_equal "a"..."c", JSON(JSON("a"..."c"), :create_additions => true)
147
- s = MyJsonStruct.new 4711, 'foot'
148
- assert_equal s, JSON(JSON(s), :create_additions => true)
149
- struct = Struct.new :foo, :bar
150
- s = struct.new 4711, 'foot'
151
- assert_raise(JSONError) { JSON(s) }
152
- begin
153
- raise TypeError, "test me"
154
- rescue TypeError => e
155
- e_json = JSON.generate e
156
- e_again = JSON e_json, :create_additions => true
157
- assert_kind_of TypeError, e_again
158
- assert_equal e.message, e_again.message
159
- assert_equal e.backtrace, e_again.backtrace
160
- end
161
- assert_equal(/foo/, JSON(JSON(/foo/), :create_additions => true))
162
- assert_equal(/foo/i, JSON(JSON(/foo/i), :create_additions => true))
163
- end
164
-
165
- def test_utc_datetime
166
- now = Time.now
167
- d = DateTime.parse(now.to_s, :create_additions => true) # usual case
168
- assert_equal d, parse(d.to_json, :create_additions => true)
169
- d = DateTime.parse(now.utc.to_s) # of = 0
170
- assert_equal d, parse(d.to_json, :create_additions => true)
171
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
172
- assert_equal d, parse(d.to_json, :create_additions => true)
173
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
174
- assert_equal d, parse(d.to_json, :create_additions => true)
175
- end
176
-
177
- def test_rational_complex
178
- assert_equal Rational(2, 9), parse(JSON(Rational(2, 9)), :create_additions => true)
179
- assert_equal Complex(2, 9), parse(JSON(Complex(2, 9)), :create_additions => true)
180
- end
181
-
182
- def test_bigdecimal
183
- assert_equal BigDecimal('3.141', 23), JSON(JSON(BigDecimal('3.141', 23)), :create_additions => true)
184
- assert_equal BigDecimal('3.141', 666), JSON(JSON(BigDecimal('3.141', 666)), :create_additions => true)
185
- end
186
-
187
- def test_ostruct
188
- o = OpenStruct.new
189
- # XXX this won't work; o.foo = { :bar => true }
190
- o.foo = { 'bar' => true }
191
- assert_equal o, parse(JSON(o), :create_additions => true)
192
- end
193
- end
@@ -1,126 +0,0 @@
1
- #frozen_string_literal: false
2
- require 'test_helper'
3
- require 'stringio'
4
- require 'tempfile'
5
-
6
- class JSONCommonInterfaceTest < Test::Unit::TestCase
7
- include JSON
8
-
9
- def setup
10
- @hash = {
11
- 'a' => 2,
12
- 'b' => 3.141,
13
- 'c' => 'c',
14
- 'd' => [ 1, "b", 3.14 ],
15
- 'e' => { 'foo' => 'bar' },
16
- 'g' => "\"\0\037",
17
- 'h' => 1000.0,
18
- 'i' => 0.001
19
- }
20
- @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
21
- '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
22
- end
23
-
24
- def test_index
25
- assert_equal @json, JSON[@hash]
26
- assert_equal @hash, JSON[@json]
27
- end
28
-
29
- def test_parser
30
- assert_match /::Parser\z/, JSON.parser.name
31
- end
32
-
33
- def test_generator
34
- assert_match /::Generator\z/, JSON.generator.name
35
- end
36
-
37
- def test_state
38
- assert_match /::Generator::State\z/, JSON.state.name
39
- end
40
-
41
- def test_create_id
42
- assert_equal 'json_class', JSON.create_id
43
- JSON.create_id = 'foo_bar'
44
- assert_equal 'foo_bar', JSON.create_id
45
- ensure
46
- JSON.create_id = 'json_class'
47
- end
48
-
49
- def test_deep_const_get
50
- assert_raise(ArgumentError) { JSON.deep_const_get('Nix::Da') }
51
- assert_equal File::SEPARATOR, JSON.deep_const_get('File::SEPARATOR')
52
- end
53
-
54
- def test_parse
55
- assert_equal [ 1, 2, 3, ], JSON.parse('[ 1, 2, 3 ]')
56
- end
57
-
58
- def test_parse_bang
59
- assert_equal [ 1, NaN, 3, ], JSON.parse!('[ 1, NaN, 3 ]')
60
- end
61
-
62
- def test_generate
63
- assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
64
- end
65
-
66
- def test_fast_generate
67
- assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
68
- end
69
-
70
- def test_pretty_generate
71
- assert_equal "[\n 1,\n 2,\n 3\n]", JSON.pretty_generate([ 1, 2, 3 ])
72
- end
73
-
74
- def test_load
75
- assert_equal @hash, JSON.load(@json)
76
- tempfile = Tempfile.open('@json')
77
- tempfile.write @json
78
- tempfile.rewind
79
- assert_equal @hash, JSON.load(tempfile)
80
- stringio = StringIO.new(@json)
81
- stringio.rewind
82
- assert_equal @hash, JSON.load(stringio)
83
- assert_equal nil, JSON.load(nil)
84
- assert_equal nil, JSON.load('')
85
- ensure
86
- tempfile.close!
87
- end
88
-
89
- def test_load_with_options
90
- json = '{ "foo": NaN }'
91
- assert JSON.load(json, nil, :allow_nan => true)['foo'].nan?
92
- end
93
-
94
- def test_load_null
95
- assert_equal nil, JSON.load(nil, nil, :allow_blank => true)
96
- assert_raise(TypeError) { JSON.load(nil, nil, :allow_blank => false) }
97
- assert_raise(JSON::ParserError) { JSON.load('', nil, :allow_blank => false) }
98
- end
99
-
100
- def test_dump
101
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
102
- assert_equal too_deep, dump(eval(too_deep))
103
- assert_kind_of String, Marshal.dump(eval(too_deep))
104
- assert_raise(ArgumentError) { dump(eval(too_deep), 100) }
105
- assert_raise(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
106
- assert_equal too_deep, dump(eval(too_deep), 101)
107
- assert_kind_of String, Marshal.dump(eval(too_deep), 101)
108
- output = StringIO.new
109
- dump(eval(too_deep), output)
110
- assert_equal too_deep, output.string
111
- output = StringIO.new
112
- dump(eval(too_deep), output, 101)
113
- assert_equal too_deep, output.string
114
- end
115
-
116
- def test_dump_should_modify_defaults
117
- max_nesting = JSON.dump_default_options[:max_nesting]
118
- dump([], StringIO.new, 10)
119
- assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
120
- end
121
-
122
- def test_JSON
123
- assert_equal @json, JSON(@hash)
124
- assert_equal @hash, JSON(@json)
125
- end
126
- end
@@ -1,107 +0,0 @@
1
- # encoding: utf-8
2
- #frozen_string_literal: false
3
- require 'test_helper'
4
-
5
- class JSONEncodingTest < Test::Unit::TestCase
6
- include JSON
7
-
8
- def setup
9
- @utf_8 = '"© ≠ €!"'
10
- @ascii_8bit = @utf_8.dup.force_encoding('ascii-8bit')
11
- @parsed = "© ≠ €!"
12
- @generated = '"\u00a9 \u2260 \u20ac!"'
13
- if String.method_defined?(:encode)
14
- @utf_16_data = @parsed.encode('utf-16be', 'utf-8')
15
- @utf_16be = @utf_8.encode('utf-16be', 'utf-8')
16
- @utf_16le = @utf_8.encode('utf-16le', 'utf-8')
17
- @utf_32be = @utf_8.encode('utf-32be', 'utf-8')
18
- @utf_32le = @utf_8.encode('utf-32le', 'utf-8')
19
- else
20
- require 'iconv'
21
- @utf_16_data, = Iconv.iconv('utf-16be', 'utf-8', @parsed)
22
- @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
23
- @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
24
- @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
25
- @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
26
- end
27
- end
28
-
29
- def test_parse
30
- assert_equal @parsed, JSON.parse(@ascii_8bit)
31
- assert_equal @parsed, JSON.parse(@utf_8)
32
- assert_equal @parsed, JSON.parse(@utf_16be)
33
- assert_equal @parsed, JSON.parse(@utf_16le)
34
- assert_equal @parsed, JSON.parse(@utf_32be)
35
- assert_equal @parsed, JSON.parse(@utf_32le)
36
- end
37
-
38
- def test_generate
39
- assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
40
- assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
41
- end
42
-
43
- def test_unicode
44
- assert_equal '""', ''.to_json
45
- assert_equal '"\\b"', "\b".to_json
46
- assert_equal '"\u0001"', 0x1.chr.to_json
47
- assert_equal '"\u001f"', 0x1f.chr.to_json
48
- assert_equal '" "', ' '.to_json
49
- assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
50
- utf8 = [ "© ≠ €! \01" ]
51
- json = '["© ≠ €! \u0001"]'
52
- assert_equal json, utf8.to_json(:ascii_only => false)
53
- assert_equal utf8, parse(json)
54
- json = '["\u00a9 \u2260 \u20ac! \u0001"]'
55
- assert_equal json, utf8.to_json(:ascii_only => true)
56
- assert_equal utf8, parse(json)
57
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
58
- json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
59
- assert_equal utf8, parse(json)
60
- assert_equal json, utf8.to_json(:ascii_only => false)
61
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
62
- assert_equal utf8, parse(json)
63
- json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
64
- assert_equal json, utf8.to_json(:ascii_only => true)
65
- assert_equal utf8, parse(json)
66
- utf8 = ['საქართველო']
67
- json = '["საქართველო"]'
68
- assert_equal json, utf8.to_json(:ascii_only => false)
69
- json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
70
- assert_equal json, utf8.to_json(:ascii_only => true)
71
- assert_equal utf8, parse(json)
72
- assert_equal '["Ã"]', generate(["Ã"], :ascii_only => false)
73
- assert_equal '["\\u00c3"]', generate(["Ã"], :ascii_only => true)
74
- assert_equal ["€"], parse('["\u20ac"]')
75
- utf8 = ["\xf0\xa0\x80\x81"]
76
- json = "[\"\xf0\xa0\x80\x81\"]"
77
- assert_equal json, generate(utf8, :ascii_only => false)
78
- assert_equal utf8, parse(json)
79
- json = '["\ud840\udc01"]'
80
- assert_equal json, generate(utf8, :ascii_only => true)
81
- assert_equal utf8, parse(json)
82
- assert_raise(JSON::ParserError) { parse('"\u"') }
83
- assert_raise(JSON::ParserError) { parse('"\ud800"') }
84
- end
85
-
86
- def test_chars
87
- (0..0x7f).each do |i|
88
- json = '["\u%04x"]' % i
89
- if RUBY_VERSION >= "1.9."
90
- i = i.chr
91
- end
92
- assert_equal i, parse(json).first[0]
93
- if i == ?\b
94
- generated = generate(["" << i])
95
- assert '["\b"]' == generated || '["\10"]' == generated
96
- elsif [?\n, ?\r, ?\t, ?\f].include?(i)
97
- assert_equal '[' << ('' << i).dump << ']', generate(["" << i])
98
- elsif i.chr < 0x20.chr
99
- assert_equal json, generate(["" << i])
100
- end
101
- end
102
- assert_raise(JSON::GeneratorError) do
103
- generate(["\x80"], :ascii_only => true)
104
- end
105
- assert_equal "\302\200", parse('["\u0080"]').first
106
- end
107
- end
@@ -1,15 +0,0 @@
1
- #frozen_string_literal: false
2
- require 'test_helper'
3
-
4
- class JSONExtParserTest < Test::Unit::TestCase
5
- if defined?(JSON::Ext::Parser)
6
- def test_allocate
7
- parser = JSON::Ext::Parser.new("{}")
8
- assert_raise(TypeError, '[ruby-core:35079]') do
9
- parser.__send__(:initialize, "{}")
10
- end
11
- parser = JSON::Ext::Parser.allocate
12
- assert_raise(TypeError, '[ruby-core:35079]') { parser.source }
13
- end
14
- end
15
- end
@@ -1,32 +0,0 @@
1
- #frozen_string_literal: false
2
- require 'test_helper'
3
-
4
- class JSONFixturesTest < Test::Unit::TestCase
5
- def setup
6
- fixtures = File.join(File.dirname(__FILE__), 'fixtures/{fail,pass}.json')
7
- passed, failed = Dir[fixtures].partition { |f| f['pass'] }
8
- @passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
9
- @failed = failed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
10
- end
11
-
12
- def test_passing
13
- for name, source in @passed
14
- begin
15
- assert JSON.parse(source),
16
- "Did not pass for fixture '#{name}': #{source.inspect}"
17
- rescue => e
18
- warn "\nCaught #{e.class}(#{e}) for fixture '#{name}': #{source.inspect}\n#{e.backtrace * "\n"}"
19
- raise e
20
- end
21
- end
22
- end
23
-
24
- def test_failing
25
- for name, source in @failed
26
- assert_raise(JSON::ParserError, JSON::NestingError,
27
- "Did not fail for fixture '#{name}': #{source.inspect}") do
28
- JSON.parse(source)
29
- end
30
- end
31
- end
32
- end