oj 3.9.1 → 3.16.11

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1452 -0
  3. data/README.md +21 -6
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +50 -68
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +60 -62
  9. data/ext/oj/cache8.h +9 -36
  10. data/ext/oj/circarray.c +38 -42
  11. data/ext/oj/circarray.h +12 -13
  12. data/ext/oj/code.c +158 -179
  13. data/ext/oj/code.h +20 -22
  14. data/ext/oj/compat.c +145 -205
  15. data/ext/oj/custom.c +740 -880
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +1145 -844
  18. data/ext/oj/dump.h +71 -57
  19. data/ext/oj/dump_compat.c +575 -655
  20. data/ext/oj/dump_leaf.c +96 -186
  21. data/ext/oj/dump_object.c +533 -660
  22. data/ext/oj/dump_strict.c +306 -340
  23. data/ext/oj/encode.h +4 -33
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +28 -28
  26. data/ext/oj/err.h +39 -42
  27. data/ext/oj/extconf.rb +28 -7
  28. data/ext/oj/fast.c +1052 -1113
  29. data/ext/oj/intern.c +313 -0
  30. data/ext/oj/intern.h +22 -0
  31. data/ext/oj/mem.c +318 -0
  32. data/ext/oj/mem.h +53 -0
  33. data/ext/oj/mimic_json.c +471 -430
  34. data/ext/oj/object.c +532 -580
  35. data/ext/oj/odd.c +156 -142
  36. data/ext/oj/odd.h +25 -26
  37. data/ext/oj/oj.c +1346 -961
  38. data/ext/oj/oj.h +307 -290
  39. data/ext/oj/parse.c +954 -858
  40. data/ext/oj/parse.h +74 -72
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +103 -0
  43. data/ext/oj/rails.c +819 -836
  44. data/ext/oj/rails.h +8 -11
  45. data/ext/oj/reader.c +136 -147
  46. data/ext/oj/reader.h +69 -83
  47. data/ext/oj/resolve.c +41 -63
  48. data/ext/oj/resolve.h +4 -6
  49. data/ext/oj/rxclass.c +69 -72
  50. data/ext/oj/rxclass.h +12 -13
  51. data/ext/oj/saj.c +440 -485
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +79 -118
  55. data/ext/oj/simd.h +10 -0
  56. data/ext/oj/sparse.c +739 -709
  57. data/ext/oj/stream_writer.c +141 -175
  58. data/ext/oj/strict.c +103 -128
  59. data/ext/oj/string_writer.c +244 -261
  60. data/ext/oj/trace.c +34 -41
  61. data/ext/oj/trace.h +42 -15
  62. data/ext/oj/usual.c +1218 -0
  63. data/ext/oj/usual.h +69 -0
  64. data/ext/oj/util.c +107 -107
  65. data/ext/oj/util.h +4 -3
  66. data/ext/oj/val_stack.c +61 -78
  67. data/ext/oj/val_stack.h +80 -114
  68. data/ext/oj/validate.c +46 -0
  69. data/ext/oj/wab.c +316 -361
  70. data/lib/oj/active_support_helper.rb +1 -3
  71. data/lib/oj/bag.rb +8 -1
  72. data/lib/oj/easy_hash.rb +9 -9
  73. data/lib/oj/error.rb +1 -2
  74. data/lib/oj/json.rb +162 -150
  75. data/lib/oj/mimic.rb +54 -20
  76. data/lib/oj/saj.rb +20 -6
  77. data/lib/oj/schandler.rb +5 -4
  78. data/lib/oj/state.rb +12 -8
  79. data/lib/oj/version.rb +1 -2
  80. data/lib/oj.rb +2 -8
  81. data/pages/Compatibility.md +1 -1
  82. data/pages/Encoding.md +1 -1
  83. data/pages/InstallOptions.md +20 -0
  84. data/pages/JsonGem.md +15 -0
  85. data/pages/Modes.md +9 -3
  86. data/pages/Options.md +62 -12
  87. data/pages/Parser.md +309 -0
  88. data/pages/Rails.md +73 -22
  89. metadata +68 -192
  90. data/ext/oj/hash.c +0 -163
  91. data/ext/oj/hash.h +0 -46
  92. data/ext/oj/hash_test.c +0 -512
  93. data/test/_test_active.rb +0 -76
  94. data/test/_test_active_mimic.rb +0 -96
  95. data/test/_test_mimic_rails.rb +0 -126
  96. data/test/activerecord/result_test.rb +0 -27
  97. data/test/activesupport4/decoding_test.rb +0 -108
  98. data/test/activesupport4/encoding_test.rb +0 -531
  99. data/test/activesupport4/test_helper.rb +0 -41
  100. data/test/activesupport5/decoding_test.rb +0 -125
  101. data/test/activesupport5/encoding_test.rb +0 -485
  102. data/test/activesupport5/encoding_test_cases.rb +0 -90
  103. data/test/activesupport5/test_helper.rb +0 -50
  104. data/test/activesupport5/time_zone_test_helpers.rb +0 -24
  105. data/test/bar.rb +0 -25
  106. data/test/files.rb +0 -29
  107. data/test/foo.rb +0 -21
  108. data/test/helper.rb +0 -26
  109. data/test/isolated/shared.rb +0 -308
  110. data/test/isolated/test_mimic_after.rb +0 -13
  111. data/test/isolated/test_mimic_alone.rb +0 -12
  112. data/test/isolated/test_mimic_as_json.rb +0 -45
  113. data/test/isolated/test_mimic_before.rb +0 -13
  114. data/test/isolated/test_mimic_define.rb +0 -28
  115. data/test/isolated/test_mimic_rails_after.rb +0 -22
  116. data/test/isolated/test_mimic_rails_before.rb +0 -21
  117. data/test/isolated/test_mimic_redefine.rb +0 -15
  118. data/test/json_gem/json_addition_test.rb +0 -216
  119. data/test/json_gem/json_common_interface_test.rb +0 -148
  120. data/test/json_gem/json_encoding_test.rb +0 -107
  121. data/test/json_gem/json_ext_parser_test.rb +0 -20
  122. data/test/json_gem/json_fixtures_test.rb +0 -35
  123. data/test/json_gem/json_generator_test.rb +0 -383
  124. data/test/json_gem/json_generic_object_test.rb +0 -90
  125. data/test/json_gem/json_parser_test.rb +0 -470
  126. data/test/json_gem/json_string_matching_test.rb +0 -42
  127. data/test/json_gem/test_helper.rb +0 -18
  128. data/test/perf.rb +0 -107
  129. data/test/perf_compat.rb +0 -130
  130. data/test/perf_fast.rb +0 -164
  131. data/test/perf_file.rb +0 -64
  132. data/test/perf_object.rb +0 -138
  133. data/test/perf_saj.rb +0 -109
  134. data/test/perf_scp.rb +0 -151
  135. data/test/perf_simple.rb +0 -287
  136. data/test/perf_strict.rb +0 -145
  137. data/test/perf_wab.rb +0 -131
  138. data/test/sample/change.rb +0 -14
  139. data/test/sample/dir.rb +0 -19
  140. data/test/sample/doc.rb +0 -36
  141. data/test/sample/file.rb +0 -48
  142. data/test/sample/group.rb +0 -16
  143. data/test/sample/hasprops.rb +0 -16
  144. data/test/sample/layer.rb +0 -12
  145. data/test/sample/line.rb +0 -20
  146. data/test/sample/oval.rb +0 -10
  147. data/test/sample/rect.rb +0 -10
  148. data/test/sample/shape.rb +0 -35
  149. data/test/sample/text.rb +0 -20
  150. data/test/sample.rb +0 -54
  151. data/test/sample_json.rb +0 -37
  152. data/test/test_compat.rb +0 -509
  153. data/test/test_custom.rb +0 -503
  154. data/test/test_debian.rb +0 -53
  155. data/test/test_fast.rb +0 -470
  156. data/test/test_file.rb +0 -239
  157. data/test/test_gc.rb +0 -49
  158. data/test/test_hash.rb +0 -29
  159. data/test/test_integer_range.rb +0 -73
  160. data/test/test_null.rb +0 -376
  161. data/test/test_object.rb +0 -1018
  162. data/test/test_saj.rb +0 -186
  163. data/test/test_scp.rb +0 -433
  164. data/test/test_strict.rb +0 -410
  165. data/test/test_various.rb +0 -741
  166. data/test/test_wab.rb +0 -307
  167. data/test/test_writer.rb +0 -380
  168. data/test/tests.rb +0 -24
  169. data/test/tests_mimic.rb +0 -14
  170. data/test/tests_mimic_addition.rb +0 -7
  171. data/test/zoo.rb +0 -13
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.join(File.dirname(__FILE__), '..')
5
-
6
- require 'helper'
7
-
8
- begin
9
- require 'rails/all'
10
- rescue LoadError => e
11
- puts "Rails are not in the gemfile, skipping tests"
12
- Process.exit
13
- end
14
-
15
- Oj.mimic_JSON
16
-
17
- require 'isolated/shared'
18
-
19
- $rails_monkey = true
20
-
21
- class MimicRailsAfter < SharedMimicRailsTest
22
- end # MimicRailsAfter
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.join(File.dirname(__FILE__), '..')
5
-
6
- require 'helper'
7
-
8
- Oj.mimic_JSON
9
- begin
10
- require 'rails/all'
11
- rescue LoadError => e
12
- puts "Rails are not in the gemfile, skipping tests"
13
- Process.exit
14
- end
15
-
16
- require 'isolated/shared'
17
-
18
- $rails_monkey = true
19
-
20
- class MimicRailsBefore < SharedMimicRailsTest
21
- end # MimicRailsBefore
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.join(File.dirname(__FILE__), '..')
5
-
6
- require 'helper'
7
-
8
- class MimicRedefine < Minitest::Test
9
- def test_mimic_redefine
10
- require 'json'
11
- parser_error = JSON::ParserError
12
- Oj.mimic_JSON
13
- assert_equal(parser_error, JSON::ParserError)
14
- end
15
- end # MimicSingle
@@ -1,216 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- #frozen_string_literal: false
5
-
6
- require 'json_gem/test_helper'
7
- require 'date'
8
-
9
- if REAL_JSON_GEM
10
- require 'json/add/core'
11
- require 'json/add/complex'
12
- require 'json/add/rational'
13
- require 'json/add/bigdecimal'
14
- require 'json/add/ostruct'
15
- else
16
- #Oj.add_to_json()
17
- Oj.add_to_json(Array, BigDecimal, Complex, Date, DateTime, Exception, Hash, Integer, OpenStruct, Range, Rational, Regexp, Struct, Time)
18
- end
19
-
20
- class JSONAdditionTest < Test::Unit::TestCase
21
- include Test::Unit::TestCaseOmissionSupport
22
- include Test::Unit::TestCasePendingSupport
23
-
24
- class A
25
- def self.json_creatable?
26
- true
27
- end
28
-
29
- def initialize(a)
30
- @a = a
31
- end
32
-
33
- attr_reader :a
34
-
35
- def ==(other)
36
- a == other.a
37
- end
38
-
39
- def self.json_create(object)
40
- new(*object['args'])
41
- end
42
-
43
- def to_json(*args)
44
- {
45
- 'json_class' => self.class.name,
46
- 'args' => [ @a ],
47
- }.to_json(*args)
48
- end
49
- end
50
-
51
- class A2 < A
52
- def to_json(*args)
53
- {
54
- 'json_class' => self.class.name,
55
- 'args' => [ @a ],
56
- }.to_json(*args)
57
- end
58
- end
59
-
60
- class B
61
- def self.json_creatable?
62
- false
63
- end
64
-
65
- def to_json(*args)
66
- {
67
- 'json_class' => self.class.name,
68
- }.to_json(*args)
69
- end
70
- end
71
-
72
- class C
73
- def self.json_creatable?
74
- false
75
- end
76
-
77
- def to_json(*args)
78
- {
79
- 'json_class' => 'JSONAdditionTest::Nix',
80
- }.to_json(*args)
81
- end
82
- end
83
-
84
- def test_extended_json
85
- a = A.new(666)
86
- assert A.json_creatable?
87
- json = JSON.generate(a)
88
- a_again = JSON.parse(json, :create_additions => true)
89
- assert_kind_of a.class, a_again
90
- assert_equal a, a_again
91
- end
92
-
93
- def test_extended_json_default
94
- a = A.new(666)
95
- assert A.json_creatable?
96
- json = JSON.generate(a)
97
- a_hash = JSON.parse(json)
98
- assert_kind_of Hash, a_hash
99
- end
100
-
101
- def test_extended_json_disabled
102
- a = A.new(666)
103
- assert A.json_creatable?
104
- json = JSON.generate(a)
105
- a_again = JSON.parse(json, :create_additions => true)
106
- assert_kind_of a.class, a_again
107
- assert_equal a, a_again
108
- a_hash = JSON.parse(json, :create_additions => false)
109
- assert_kind_of Hash, a_hash
110
- assert_equal(
111
- {"args"=>[666], "json_class"=>"JSONAdditionTest::A"}.sort_by { |k,| k },
112
- a_hash.sort_by { |k,| k }
113
- )
114
- end
115
-
116
- def test_extended_json_fail1
117
- b = B.new
118
- assert !B.json_creatable?
119
- json = JSON.generate(b)
120
- assert_equal({ "json_class"=>"JSONAdditionTest::B" }, JSON.parse(json))
121
- end
122
-
123
- def test_extended_json_fail2
124
- c = C.new
125
- assert !C.json_creatable?
126
- json = JSON.generate(c)
127
- assert_raise(ArgumentError, NameError) { JSON.parse(json, :create_additions => true) }
128
- end
129
-
130
- def test_raw_strings
131
- raw = ''
132
- raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
133
- raw_array = []
134
- for i in 0..255
135
- raw << i
136
- raw_array << i
137
- end
138
- json = raw.to_json_raw
139
- json_raw_object = raw.to_json_raw_object
140
- hash = { 'json_class' => 'String', 'raw'=> raw_array }
141
- assert_equal hash, json_raw_object
142
- assert_match(/\A\{.*\}\z/, json)
143
- assert_match(/"json_class":"String"/, json)
144
- 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)
145
-
146
- raw_again = JSON.parse(json, :create_additions => true)
147
- assert_equal raw, raw_again
148
- end
149
-
150
- MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
151
-
152
- def test_core
153
- t = Time.now
154
- assert_equal t, JSON(JSON(t), :create_additions => true)
155
-
156
- d = Date.today
157
- assert_equal d, JSON(JSON(d), :create_additions => true)
158
-
159
- d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
160
- assert_equal d, JSON(JSON(d), :create_additions => true)
161
-
162
- assert_equal 1..10, JSON(JSON(1..10), :create_additions => true)
163
- assert_equal 1...10, JSON(JSON(1...10), :create_additions => true)
164
- assert_equal "a".."c", JSON(JSON("a".."c"), :create_additions => true)
165
- assert_equal "a"..."c", JSON(JSON("a"..."c"), :create_additions => true)
166
-
167
- s = MyJsonStruct.new 4711, 'foot'
168
- assert_equal s, JSON(JSON(s), :create_additions => true)
169
-
170
- struct = Struct.new :foo, :bar
171
- s = struct.new 4711, 'foot'
172
- assert_raise(JSON::JSONError) { JSON(s) }
173
-
174
- begin
175
- raise TypeError, "test me"
176
- rescue TypeError => e
177
- e_json = JSON.generate e
178
- e_again = JSON e_json, :create_additions => true
179
- assert_kind_of TypeError, e_again
180
- assert_equal e.message, e_again.message
181
- assert_equal e.backtrace, e_again.backtrace
182
- end
183
-
184
- assert_equal(/foo/, JSON(JSON(/foo/), :create_additions => true))
185
- assert_equal(/foo/i, JSON(JSON(/foo/i), :create_additions => true))
186
- end
187
-
188
- def test_utc_datetime
189
- now = Time.now
190
- d = DateTime.parse(now.to_s, :create_additions => true) # usual case
191
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
192
- d = DateTime.parse(now.utc.to_s) # of = 0
193
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
194
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
195
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
196
- d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
197
- assert_equal d, JSON.parse(d.to_json, :create_additions => true)
198
- end
199
-
200
- def test_rational_complex
201
- assert_equal Rational(2, 9), JSON.parse(JSON(Rational(2, 9)), :create_additions => true)
202
- assert_equal Complex(2, 9), JSON.parse(JSON(Complex(2, 9)), :create_additions => true)
203
- end
204
-
205
- def test_bigdecimal
206
- assert_equal BigDecimal('3.141', 23), JSON(JSON(BigDecimal('3.141', 23)), :create_additions => true)
207
- assert_equal BigDecimal('3.141', 666), JSON(JSON(BigDecimal('3.141', 666)), :create_additions => true)
208
- end
209
-
210
- def test_ostruct
211
- o = OpenStruct.new
212
- # XXX this won't work; o.foo = { :bar => true }
213
- o.foo = { 'bar' => true }
214
- assert_equal o, JSON.parse(JSON(o), :create_additions => true)
215
- end
216
- end
@@ -1,148 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- #frozen_string_literal: false
5
-
6
- require 'json_gem/test_helper'
7
-
8
- require 'stringio'
9
- require 'tempfile'
10
-
11
- class JSONCommonInterfaceTest < Test::Unit::TestCase
12
- include Test::Unit::TestCaseOmissionSupport
13
- include Test::Unit::TestCasePendingSupport
14
-
15
- def setup
16
- @hash = {
17
- 'a' => 2,
18
- 'b' => 3.141,
19
- 'c' => 'c',
20
- 'd' => [ 1, "b", 3.14 ],
21
- 'e' => { 'foo' => 'bar' },
22
- 'g' => "\"\0\037",
23
- 'h' => 1000.0,
24
- 'i' => 0.001
25
- }
26
- @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
27
- '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
28
- end
29
-
30
- def test_index
31
- assert_equal @json, JSON[@hash]
32
- assert_equal @hash, JSON[@json]
33
- end
34
-
35
- ##############################################################################
36
- # The next tests are omitted as implementing them and using them is a
37
- # performance hit. Use of the JSON.parse() and similar provide the same
38
- # functionality and perform better.
39
-
40
- def test_parser
41
- assert_match /::Parser\z/, JSON.parser.name
42
- end
43
-
44
- def test_generator
45
- assert_match /::Generator\z/, JSON.generator.name
46
- end
47
-
48
- def test_state
49
- assert_match /::Generator::State\z/, JSON.state.name
50
- end
51
-
52
- # This doesn't have anything to do with JSON parsing or generation. It seems
53
- # to be more of an internal tool that is exposed to users.
54
- def test_deep_const_get
55
- omit("mimic_JSON") unless REAL_JSON_GEM
56
- assert_raise(ArgumentError) { JSON.deep_const_get('Nix::Da') }
57
- assert_equal File::SEPARATOR, JSON.deep_const_get('File::SEPARATOR')
58
- end
59
- ##############################################################################
60
-
61
- def test_create_id
62
- assert_equal 'json_class', JSON.create_id
63
- JSON.create_id = 'foo_bar'
64
- assert_equal 'foo_bar', JSON.create_id
65
- ensure
66
- JSON.create_id = 'json_class'
67
- end
68
-
69
- def test_parse
70
- assert_equal [ 1, 2, 3, ], JSON.parse('[ 1, 2, 3 ]')
71
- end
72
-
73
- def test_parse_bang
74
- # Modified this test to compare strings since NaN comparison fails if NaN
75
- # was defined in different places even if it represents the same value.
76
- assert_equal [ 1, NaN, 3, ].to_s, JSON.parse!('[ 1, NaN, 3 ]').to_s
77
- end
78
-
79
- def test_generate
80
- assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
81
- end
82
-
83
- def test_fast_generate
84
- assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
85
- end
86
-
87
- def test_pretty_generate
88
- assert_equal "[\n 1,\n 2,\n 3\n]", JSON.pretty_generate([ 1, 2, 3 ])
89
- end
90
-
91
- def test_load
92
- assert_equal @hash, JSON.load(@json)
93
- tempfile = Tempfile.open('@json')
94
- tempfile.write @json
95
- tempfile.rewind
96
- assert_equal @hash, JSON.load(tempfile)
97
- stringio = StringIO.new(@json)
98
- stringio.rewind
99
- assert_equal @hash, JSON.load(stringio)
100
- assert_equal nil, JSON.load(nil)
101
- assert_equal nil, JSON.load('')
102
- ensure
103
- tempfile.close!
104
- end
105
-
106
- def test_load_with_options
107
- json = '{ "foo": NaN }'
108
- assert JSON.load(json, nil, :allow_nan => true)['foo'].nan?
109
- end
110
-
111
- def test_load_null
112
- assert_equal nil, JSON.load(nil, nil, :allow_blank => true)
113
- assert_raise(TypeError) { JSON.load(nil, nil, :allow_blank => false) }
114
- assert_raise(JSON::ParserError) { JSON.load('', nil, :allow_blank => false) }
115
- # The next tests are added by Oj to catch additional cases.
116
- assert_equal nil, JSON.load('', nil, :allow_blank => true)
117
- assert_raise(JSON::ParserError) { JSON.load('', nil, :allow_blank => false) }
118
- assert_raise(JSON::ParserError) { JSON.load(' ', nil, :allow_blank => true) }
119
- assert_raise(JSON::ParserError) { JSON.load(' ', nil, :allow_blank => false) }
120
- end
121
-
122
- def test_dump
123
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
124
- assert_equal too_deep, JSON.dump(eval(too_deep))
125
- assert_kind_of String, Marshal.dump(eval(too_deep))
126
- assert_raise(ArgumentError) { JSON.dump(eval(too_deep), 100) }
127
- assert_raise(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
128
- assert_equal too_deep, JSON.dump(eval(too_deep), 101)
129
- assert_kind_of String, Marshal.dump(eval(too_deep), 101)
130
- output = StringIO.new
131
- JSON.dump(eval(too_deep), output)
132
- assert_equal too_deep, output.string
133
- output = StringIO.new
134
- JSON.dump(eval(too_deep), output, 101)
135
- assert_equal too_deep, output.string
136
- end
137
-
138
- def test_dump_should_modify_defaults
139
- max_nesting = JSON.dump_default_options[:max_nesting]
140
- JSON.dump([], StringIO.new, 10)
141
- assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
142
- end
143
-
144
- def test_JSON
145
- assert_equal @json, JSON(@hash)
146
- assert_equal @hash, JSON(@json)
147
- end
148
- end
@@ -1,107 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- #frozen_string_literal: false
5
-
6
- require 'json_gem/test_helper'
7
-
8
- class JSONEncodingTest < Test::Unit::TestCase
9
- include Test::Unit::TestCaseOmissionSupport
10
- include Test::Unit::TestCasePendingSupport
11
-
12
- def setup
13
- @utf_8 = '"© ≠ €!"'
14
- @ascii_8bit = @utf_8.dup.force_encoding('ascii-8bit')
15
- @parsed = "© ≠ €!"
16
- @generated = '"\u00a9 \u2260 \u20ac!"'
17
- if String.method_defined?(:encode)
18
- @utf_16_data = @parsed.encode('utf-16be', 'utf-8')
19
- @utf_16be = @utf_8.encode('utf-16be', 'utf-8')
20
- @utf_16le = @utf_8.encode('utf-16le', 'utf-8')
21
- @utf_32be = @utf_8.encode('utf-32be', 'utf-8')
22
- @utf_32le = @utf_8.encode('utf-32le', 'utf-8')
23
- else
24
- require 'iconv'
25
- @utf_16_data, = Iconv.iconv('utf-16be', 'utf-8', @parsed)
26
- @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
27
- @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
28
- @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
29
- @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
30
- end
31
- end
32
-
33
- def test_parse
34
- assert_equal @parsed, JSON.parse(@ascii_8bit)
35
- assert_equal @parsed, JSON.parse(@utf_8)
36
- assert_equal @parsed, JSON.parse(@utf_16be)
37
- assert_equal @parsed, JSON.parse(@utf_16le)
38
- assert_equal @parsed, JSON.parse(@utf_32be)
39
- assert_equal @parsed, JSON.parse(@utf_32le)
40
- end
41
-
42
- def test_generate
43
- assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
44
- assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
45
- end
46
-
47
- def test_unicode
48
- assert_equal '""', ''.to_json
49
- assert_equal '"\\b"', "\b".to_json
50
- assert_equal '"\u0001"', 0x1.chr.to_json
51
- assert_equal '"\u001f"', 0x1f.chr.to_json
52
- assert_equal '" "', ' '.to_json
53
- assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
54
- utf8 = [ "© ≠ €! \01" ]
55
- json = '["© ≠ €! \u0001"]'
56
- assert_equal json, utf8.to_json(:ascii_only => false)
57
- assert_equal utf8, JSON.parse(json)
58
- json = '["\u00a9 \u2260 \u20ac! \u0001"]'
59
- assert_equal json, utf8.to_json(:ascii_only => true)
60
- assert_equal utf8, JSON.parse(json)
61
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
62
- json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
63
- assert_equal utf8, JSON.parse(json)
64
- assert_equal json, utf8.to_json(:ascii_only => false)
65
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
66
- assert_equal utf8, JSON.parse(json)
67
- json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
68
- assert_equal json, utf8.to_json(:ascii_only => true)
69
- assert_equal utf8, JSON.parse(json)
70
- utf8 = ['საქართველო']
71
- json = '["საქართველო"]'
72
- assert_equal json, utf8.to_json(:ascii_only => false)
73
- json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
74
- assert_equal json, utf8.to_json(:ascii_only => true)
75
- assert_equal utf8, JSON.parse(json)
76
- assert_equal '["Ã"]', JSON.generate(["Ã"], :ascii_only => false)
77
- assert_equal '["\\u00c3"]', JSON.generate(["Ã"], :ascii_only => true)
78
- assert_equal ["€"], JSON.parse('["\u20ac"]')
79
- utf8 = ["\xf0\xa0\x80\x81"]
80
- json = "[\"\xf0\xa0\x80\x81\"]"
81
- assert_equal json, JSON.generate(utf8, :ascii_only => false)
82
- assert_equal utf8, JSON.parse(json)
83
- json = '["\ud840\udc01"]'
84
- assert_equal json, JSON.generate(utf8, :ascii_only => true)
85
- assert_equal utf8, JSON.parse(json)
86
- end
87
-
88
- def test_chars
89
- (0..0x7f).each do |i|
90
- json = '["\u%04x"]' % i
91
- i = i.chr
92
- assert_equal i, JSON.parse(json).first[0]
93
- if i == ?\b
94
- generated = JSON.generate(["" << i])
95
- assert '["\b"]' == generated || '["\10"]' == generated
96
- elsif [?\n, ?\r, ?\t, ?\f].include?(i)
97
- assert_equal '[' << ('' << i).dump << ']', JSON.generate(["" << i])
98
- elsif i.chr < 0x20.chr
99
- assert_equal json, JSON.generate(["" << i])
100
- end
101
- end
102
- assert_raise(JSON::GeneratorError) do
103
- JSON.generate(["\x80"], :ascii_only => true)
104
- end
105
- assert_equal "\302\200", JSON.parse('["\u0080"]').first
106
- end
107
- end
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- #frozen_string_literal: false
5
- require 'json_gem/test_helper'
6
-
7
- class JSONExtParserTest < Test::Unit::TestCase
8
- include Test::Unit::TestCaseOmissionSupport
9
-
10
- if defined?(JSON::Ext::Parser)
11
- def test_allocate
12
- parser = JSON::Ext::Parser.new("{}")
13
- assert_raise(TypeError, '[ruby-core:35079]') do
14
- parser.__send__(:initialize, "{}")
15
- end
16
- parser = JSON::Ext::Parser.allocate
17
- assert_raise(TypeError, '[ruby-core:35079]') { parser.source }
18
- end
19
- end
20
- end
@@ -1,35 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- #frozen_string_literal: false
5
- require 'json_gem/test_helper'
6
-
7
- class JSONFixturesTest < Test::Unit::TestCase
8
- def setup
9
- fixtures = File.join(File.dirname(__FILE__), 'fixtures/{fail,pass}.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_raise(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