oj 3.11.5 → 3.16.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +19 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +20 -6
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +10 -9
  9. data/ext/oj/circarray.c +8 -6
  10. data/ext/oj/circarray.h +2 -2
  11. data/ext/oj/code.c +19 -33
  12. data/ext/oj/code.h +2 -2
  13. data/ext/oj/compat.c +27 -77
  14. data/ext/oj/custom.c +86 -179
  15. data/ext/oj/debug.c +126 -0
  16. data/ext/oj/dump.c +256 -249
  17. data/ext/oj/dump.h +26 -12
  18. data/ext/oj/dump_compat.c +565 -642
  19. data/ext/oj/dump_leaf.c +17 -63
  20. data/ext/oj/dump_object.c +65 -187
  21. data/ext/oj/dump_strict.c +27 -51
  22. data/ext/oj/encoder.c +43 -0
  23. data/ext/oj/err.c +2 -13
  24. data/ext/oj/err.h +24 -8
  25. data/ext/oj/extconf.rb +21 -6
  26. data/ext/oj/fast.c +149 -149
  27. data/ext/oj/intern.c +313 -0
  28. data/ext/oj/intern.h +22 -0
  29. data/ext/oj/mem.c +318 -0
  30. data/ext/oj/mem.h +53 -0
  31. data/ext/oj/mimic_json.c +121 -106
  32. data/ext/oj/object.c +85 -162
  33. data/ext/oj/odd.c +89 -67
  34. data/ext/oj/odd.h +15 -15
  35. data/ext/oj/oj.c +542 -411
  36. data/ext/oj/oj.h +99 -73
  37. data/ext/oj/parse.c +175 -187
  38. data/ext/oj/parse.h +26 -24
  39. data/ext/oj/parser.c +1600 -0
  40. data/ext/oj/parser.h +101 -0
  41. data/ext/oj/rails.c +112 -159
  42. data/ext/oj/rails.h +1 -1
  43. data/ext/oj/reader.c +11 -14
  44. data/ext/oj/reader.h +4 -2
  45. data/ext/oj/resolve.c +5 -24
  46. data/ext/oj/rxclass.c +7 -6
  47. data/ext/oj/rxclass.h +1 -1
  48. data/ext/oj/saj.c +22 -33
  49. data/ext/oj/saj2.c +584 -0
  50. data/ext/oj/saj2.h +23 -0
  51. data/ext/oj/scp.c +5 -28
  52. data/ext/oj/sparse.c +28 -72
  53. data/ext/oj/stream_writer.c +50 -40
  54. data/ext/oj/strict.c +56 -61
  55. data/ext/oj/string_writer.c +72 -39
  56. data/ext/oj/trace.h +31 -4
  57. data/ext/oj/usual.c +1218 -0
  58. data/ext/oj/usual.h +69 -0
  59. data/ext/oj/util.h +1 -1
  60. data/ext/oj/val_stack.c +14 -3
  61. data/ext/oj/val_stack.h +8 -7
  62. data/ext/oj/validate.c +46 -0
  63. data/ext/oj/wab.c +63 -88
  64. data/lib/oj/active_support_helper.rb +1 -3
  65. data/lib/oj/bag.rb +7 -1
  66. data/lib/oj/easy_hash.rb +4 -5
  67. data/lib/oj/error.rb +1 -2
  68. data/lib/oj/json.rb +162 -150
  69. data/lib/oj/mimic.rb +9 -7
  70. data/lib/oj/saj.rb +20 -6
  71. data/lib/oj/schandler.rb +5 -4
  72. data/lib/oj/state.rb +12 -8
  73. data/lib/oj/version.rb +1 -2
  74. data/lib/oj.rb +2 -0
  75. data/pages/Compatibility.md +1 -1
  76. data/pages/InstallOptions.md +20 -0
  77. data/pages/JsonGem.md +15 -0
  78. data/pages/Modes.md +8 -3
  79. data/pages/Options.md +43 -5
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +14 -2
  82. data/test/_test_active.rb +8 -9
  83. data/test/_test_active_mimic.rb +7 -8
  84. data/test/_test_mimic_rails.rb +17 -20
  85. data/test/activerecord/result_test.rb +5 -6
  86. data/test/activesupport6/encoding_test.rb +63 -28
  87. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  88. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  89. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  90. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  91. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  92. data/test/files.rb +15 -15
  93. data/test/foo.rb +16 -45
  94. data/test/helper.rb +11 -8
  95. data/test/isolated/shared.rb +3 -2
  96. data/test/json_gem/json_addition_test.rb +2 -2
  97. data/test/json_gem/json_common_interface_test.rb +8 -6
  98. data/test/json_gem/json_encoding_test.rb +0 -0
  99. data/test/json_gem/json_ext_parser_test.rb +1 -0
  100. data/test/json_gem/json_fixtures_test.rb +3 -2
  101. data/test/json_gem/json_generator_test.rb +56 -38
  102. data/test/json_gem/json_generic_object_test.rb +11 -11
  103. data/test/json_gem/json_parser_test.rb +54 -47
  104. data/test/json_gem/json_string_matching_test.rb +9 -9
  105. data/test/json_gem/test_helper.rb +7 -3
  106. data/test/mem.rb +34 -0
  107. data/test/perf.rb +22 -27
  108. data/test/perf_compat.rb +31 -33
  109. data/test/perf_dump.rb +50 -0
  110. data/test/perf_fast.rb +80 -82
  111. data/test/perf_file.rb +27 -29
  112. data/test/perf_object.rb +65 -69
  113. data/test/perf_once.rb +59 -0
  114. data/test/perf_parser.rb +183 -0
  115. data/test/perf_saj.rb +46 -54
  116. data/test/perf_scp.rb +58 -69
  117. data/test/perf_simple.rb +41 -39
  118. data/test/perf_strict.rb +74 -82
  119. data/test/perf_wab.rb +67 -69
  120. data/test/prec.rb +5 -5
  121. data/test/sample/change.rb +0 -1
  122. data/test/sample/dir.rb +0 -1
  123. data/test/sample/doc.rb +0 -1
  124. data/test/sample/file.rb +0 -1
  125. data/test/sample/group.rb +0 -1
  126. data/test/sample/hasprops.rb +0 -1
  127. data/test/sample/layer.rb +0 -1
  128. data/test/sample/rect.rb +0 -1
  129. data/test/sample/shape.rb +0 -1
  130. data/test/sample/text.rb +0 -1
  131. data/test/sample.rb +16 -16
  132. data/test/sample_json.rb +8 -8
  133. data/test/test_compat.rb +95 -43
  134. data/test/test_custom.rb +73 -51
  135. data/test/test_debian.rb +7 -10
  136. data/test/test_fast.rb +135 -79
  137. data/test/test_file.rb +41 -30
  138. data/test/test_gc.rb +16 -5
  139. data/test/test_generate.rb +5 -5
  140. data/test/test_hash.rb +5 -5
  141. data/test/test_integer_range.rb +9 -9
  142. data/test/test_null.rb +20 -20
  143. data/test/test_object.rb +99 -96
  144. data/test/test_parser.rb +11 -0
  145. data/test/test_parser_debug.rb +27 -0
  146. data/test/test_parser_saj.rb +337 -0
  147. data/test/test_parser_usual.rb +251 -0
  148. data/test/test_rails.rb +2 -2
  149. data/test/test_saj.rb +10 -8
  150. data/test/test_scp.rb +37 -39
  151. data/test/test_strict.rb +40 -32
  152. data/test/test_various.rb +165 -84
  153. data/test/test_wab.rb +48 -44
  154. data/test/test_writer.rb +47 -47
  155. data/test/tests.rb +13 -5
  156. data/test/tests_mimic.rb +12 -3
  157. data/test/tests_mimic_addition.rb +12 -3
  158. metadata +74 -128
  159. data/ext/oj/hash.c +0 -131
  160. data/ext/oj/hash.h +0 -19
  161. data/ext/oj/hash_test.c +0 -491
  162. data/test/activesupport4/decoding_test.rb +0 -108
  163. data/test/activesupport4/encoding_test.rb +0 -531
  164. data/test/activesupport4/test_helper.rb +0 -41
  165. data/test/activesupport5/test_helper.rb +0 -72
  166. data/test/bar.rb +0 -35
  167. data/test/baz.rb +0 -16
  168. data/test/zoo.rb +0 -13
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH << __dir__
5
+ @oj_dir = File.dirname(File.expand_path(__dir__))
6
+ %w(lib ext).each do |dir|
7
+ $LOAD_PATH << File.join(@oj_dir, dir)
8
+ end
9
+
10
+ require 'test_parser_usual'
11
+ require 'test_parser_saj'
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH << __dir__
5
+ @oj_dir = File.dirname(File.expand_path(__dir__))
6
+ %w[lib ext].each do |dir|
7
+ $LOAD_PATH << File.join(@oj_dir, dir)
8
+ end
9
+
10
+ require 'minitest'
11
+ require 'minitest/autorun'
12
+ require 'stringio'
13
+ require 'date'
14
+ require 'bigdecimal'
15
+ require 'oj'
16
+
17
+ class ParserJuice < Minitest::Test
18
+
19
+ def test_array
20
+ p = Oj::Parser.new(:debug)
21
+ out = p.parse(%|[true, false, null, 123, -1.23, "abc"]|)
22
+ puts out
23
+ out = p.parse(%|{"abc": []}|)
24
+ puts out
25
+ end
26
+
27
+ end
@@ -0,0 +1,337 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH << __dir__
5
+
6
+ require 'helper'
7
+
8
+ $json = %|{
9
+ "array": [
10
+ {
11
+ "num" : 3,
12
+ "string": "message",
13
+ "hash" : {
14
+ "h2" : {
15
+ "a" : [ 1, 2, 3 ]
16
+ }
17
+ }
18
+ }
19
+ ],
20
+ "boolean" : true
21
+ }|
22
+
23
+ class AllSaj < Oj::Saj
24
+ attr_accessor :calls
25
+
26
+ def initialize
27
+ @calls = []
28
+
29
+ super
30
+ end
31
+
32
+ def hash_start(key)
33
+ @calls << [:hash_start, key]
34
+ end
35
+
36
+ def hash_end(key)
37
+ @calls << [:hash_end, key]
38
+ end
39
+
40
+ def array_start(key)
41
+ @calls << [:array_start, key]
42
+ end
43
+
44
+ def array_end(key)
45
+ @calls << [:array_end, key]
46
+ end
47
+
48
+ def add_value(value, key)
49
+ @calls << [:add_value, value, key]
50
+ end
51
+
52
+ def error(message, line, column)
53
+ @calls << [:error, message, line, column]
54
+ end
55
+
56
+ end # AllSaj
57
+
58
+ class LocSaj
59
+ attr_accessor :calls
60
+
61
+ def initialize
62
+ @calls = []
63
+ end
64
+
65
+ def hash_start(key, line, column)
66
+ @calls << [:hash_start, key, line, column]
67
+ end
68
+
69
+ def hash_end(key, line, column)
70
+ @calls << [:hash_end, key, line, column]
71
+ end
72
+
73
+ def array_start(key, line, column)
74
+ @calls << [:array_start, key, line, column]
75
+ end
76
+
77
+ def array_end(key, line, column)
78
+ @calls << [:array_end, key, line, column]
79
+ end
80
+
81
+ def add_value(value, key, line, column)
82
+ @calls << [:add_value, value, key, line, column]
83
+ end
84
+
85
+ end # LocSaj
86
+
87
+ class SajTest < Minitest::Test
88
+
89
+ def test_nil
90
+ handler = AllSaj.new()
91
+ json = %{null}
92
+ p = Oj::Parser.new(:saj)
93
+ p.handler = handler
94
+ p.parse(json)
95
+ assert_equal([[:add_value, nil, nil]], handler.calls)
96
+ end
97
+
98
+ def test_true
99
+ handler = AllSaj.new()
100
+ json = %{true}
101
+ p = Oj::Parser.new(:saj)
102
+ p.handler = handler
103
+ p.parse(json)
104
+ assert_equal([[:add_value, true, nil]], handler.calls)
105
+ end
106
+
107
+ def test_false
108
+ handler = AllSaj.new()
109
+ json = %{false}
110
+ p = Oj::Parser.new(:saj)
111
+ p.handler = handler
112
+ p.parse(json)
113
+ assert_equal([[:add_value, false, nil]], handler.calls)
114
+ end
115
+
116
+ def test_string
117
+ handler = AllSaj.new()
118
+ json = %{"a string"}
119
+ p = Oj::Parser.new(:saj)
120
+ p.handler = handler
121
+ p.parse(json)
122
+ assert_equal([[:add_value, 'a string', nil]], handler.calls)
123
+ end
124
+
125
+ def test_fixnum
126
+ handler = AllSaj.new()
127
+ json = %{12345}
128
+ p = Oj::Parser.new(:saj)
129
+ p.handler = handler
130
+ p.parse(json)
131
+ assert_equal([[:add_value, 12_345, nil]], handler.calls)
132
+ end
133
+
134
+ def test_float
135
+ handler = AllSaj.new()
136
+ json = %{12345.6789}
137
+ p = Oj::Parser.new(:saj)
138
+ p.handler = handler
139
+ p.parse(json)
140
+ assert_equal([[:add_value, 12_345.6789, nil]], handler.calls)
141
+ end
142
+
143
+ def test_float_exp
144
+ handler = AllSaj.new()
145
+ json = %{12345.6789e7}
146
+ p = Oj::Parser.new(:saj)
147
+ p.handler = handler
148
+ p.parse(json)
149
+ assert_equal(1, handler.calls.size)
150
+ assert_equal(:add_value, handler.calls[0][0])
151
+ assert_equal((12_345.6789e7 * 10_000).to_i, (handler.calls[0][1] * 10_000).to_i)
152
+ end
153
+
154
+ def test_bignum
155
+ handler = AllSaj.new()
156
+ json = %{-11.899999999999999}
157
+ p = Oj::Parser.new(:saj)
158
+ p.handler = handler
159
+ p.parse(json)
160
+ assert_equal(1, handler.calls.size)
161
+ assert_equal(:add_value, handler.calls[0][0])
162
+ assert_equal(-118_999, (handler.calls[0][1] * 10_000).to_i)
163
+ end
164
+
165
+ def test_bignum_loc
166
+ handler = LocSaj.new()
167
+ json = <<~JSON
168
+ {
169
+ "width": 192.33800000000002,
170
+ "xaxis": {
171
+ "anchor": "y"
172
+ }
173
+ }
174
+ JSON
175
+
176
+ p = Oj::Parser.new(:saj)
177
+ p.handler = handler
178
+ p.parse(json)
179
+ assert_equal(6, handler.calls.size)
180
+ assert_equal(1_923_380, (handler.calls[1][1] * 10_000).to_i)
181
+ handler.calls[1][1] = 1_923_380
182
+ assert_equal([[:hash_start, nil, 1, 1],
183
+ [:add_value, 1_923_380, 'width', 2, 30],
184
+ [:hash_start, 'xaxis', 3, 12],
185
+ [:add_value, 'y', 'anchor', 4, 17],
186
+ [:hash_end, 'xaxis', 5, 3],
187
+ [:hash_end, nil, 6, 1]],
188
+ handler.calls)
189
+ end
190
+
191
+ def test_array_empty
192
+ handler = AllSaj.new()
193
+ json = %{[]}
194
+ p = Oj::Parser.new(:saj)
195
+ p.handler = handler
196
+ p.parse(json)
197
+ assert_equal([[:array_start, nil],
198
+ [:array_end, nil]], handler.calls)
199
+ end
200
+
201
+ def test_array
202
+ handler = AllSaj.new()
203
+ json = %{[true,false]}
204
+ p = Oj::Parser.new(:saj)
205
+ p.handler = handler
206
+ p.parse(json)
207
+ assert_equal([[:array_start, nil],
208
+ [:add_value, true, nil],
209
+ [:add_value, false, nil],
210
+ [:array_end, nil]], handler.calls)
211
+ end
212
+
213
+ def test_hash_empty
214
+ handler = AllSaj.new()
215
+ json = %{{}}
216
+ p = Oj::Parser.new(:saj)
217
+ p.handler = handler
218
+ p.parse(json)
219
+ assert_equal([[:hash_start, nil],
220
+ [:hash_end, nil]], handler.calls)
221
+ end
222
+
223
+ def test_hash
224
+ handler = AllSaj.new()
225
+ json = %{{"one":true,"two":false}}
226
+ p = Oj::Parser.new(:saj)
227
+ p.handler = handler
228
+ p.parse(json)
229
+ assert_equal([[:hash_start, nil],
230
+ [:add_value, true, 'one'],
231
+ [:add_value, false, 'two'],
232
+ [:hash_end, nil]], handler.calls)
233
+ end
234
+
235
+ def test_full
236
+ handler = AllSaj.new()
237
+ Oj.saj_parse(handler, $json)
238
+ assert_equal([[:hash_start, nil],
239
+ [:array_start, 'array'],
240
+ [:hash_start, nil],
241
+ [:add_value, 3, 'num'],
242
+ [:add_value, 'message', 'string'],
243
+ [:hash_start, 'hash'],
244
+ [:hash_start, 'h2'],
245
+ [:array_start, 'a'],
246
+ [:add_value, 1, nil],
247
+ [:add_value, 2, nil],
248
+ [:add_value, 3, nil],
249
+ [:array_end, 'a'],
250
+ [:hash_end, 'h2'],
251
+ [:hash_end, 'hash'],
252
+ [:hash_end, nil],
253
+ [:array_end, 'array'],
254
+ [:add_value, true, 'boolean'],
255
+ [:hash_end, nil]], handler.calls)
256
+ end
257
+
258
+ def test_multiple
259
+ handler = AllSaj.new()
260
+ json = %|[true][false]|
261
+ p = Oj::Parser.new(:saj)
262
+ p.handler = handler
263
+ p.parse(json)
264
+ assert_equal([
265
+ [:array_start, nil],
266
+ [:add_value, true, nil],
267
+ [:array_end, nil],
268
+ [:array_start, nil],
269
+ [:add_value, false, nil],
270
+ [:array_end, nil],
271
+ ], handler.calls)
272
+ end
273
+
274
+ def test_io
275
+ handler = AllSaj.new()
276
+ json = %| [true,false] |
277
+ p = Oj::Parser.new(:saj)
278
+ p.handler = handler
279
+ p.load(StringIO.new(json))
280
+ assert_equal([
281
+ [:array_start, nil],
282
+ [:add_value, true, nil],
283
+ [:add_value, false, nil],
284
+ [:array_end, nil],
285
+ ], handler.calls)
286
+ end
287
+
288
+ def test_file
289
+ handler = AllSaj.new()
290
+ p = Oj::Parser.new(:saj)
291
+ p.handler = handler
292
+ p.file('saj_test.json')
293
+ assert_equal([
294
+ [:array_start, nil],
295
+ [:add_value, true, nil],
296
+ [:add_value, false, nil],
297
+ [:array_end, nil],
298
+ ], handler.calls)
299
+ end
300
+
301
+ def test_default
302
+ handler = AllSaj.new()
303
+ json = %|[true]|
304
+ Oj::Parser.saj.handler = handler
305
+ Oj::Parser.saj.parse(json)
306
+ assert_equal([
307
+ [:array_start, nil],
308
+ [:add_value, true, nil],
309
+ [:array_end, nil],
310
+ ], handler.calls)
311
+ end
312
+
313
+ def test_loc
314
+ handler = LocSaj.new()
315
+ Oj::Parser.saj.handler = handler
316
+ Oj::Parser.saj.parse($json)
317
+ assert_equal([[:hash_start, nil, 1, 1],
318
+ [:array_start, 'array', 2, 12],
319
+ [:hash_start, nil, 3, 5],
320
+ [:add_value, 3, 'num', 4, 18],
321
+ [:add_value, 'message', 'string', 5, 25],
322
+ [:hash_start, 'hash', 6, 17],
323
+ [:hash_start, 'h2', 7, 17],
324
+ [:array_start, 'a', 8, 17],
325
+ [:add_value, 1, nil, 8, 20],
326
+ [:add_value, 2, nil, 8, 23],
327
+ [:add_value, 3, nil, 8, 26],
328
+ [:array_end, 'a', 8, 27],
329
+ [:hash_end, 'h2', 9, 9],
330
+ [:hash_end, 'hash', 10, 7],
331
+ [:hash_end, nil, 11, 5],
332
+ [:array_end, 'array', 12, 3],
333
+ [:add_value, true, 'boolean', 13, 18],
334
+ [:hash_end, nil, 14, 1]], handler.calls)
335
+ end
336
+
337
+ end
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH << __dir__
5
+
6
+ require 'helper'
7
+
8
+ class UsualTest < Minitest::Test
9
+
10
+ def test_nil
11
+ p = Oj::Parser.new(:usual)
12
+ doc = p.parse('nil')
13
+ assert_nil(doc)
14
+ end
15
+
16
+ def test_primitive
17
+ p = Oj::Parser.new(:usual)
18
+ [
19
+ ['true', true],
20
+ ['false', false],
21
+ ['123', 123],
22
+ ['1.25', 1.25],
23
+ ['"abc"', 'abc'],
24
+ ].each { |x|
25
+ doc = p.parse(x[0])
26
+ assert_equal(x[1], doc)
27
+ }
28
+ end
29
+
30
+ def test_big
31
+ p = Oj::Parser.new(:usual)
32
+ doc = p.parse('12345678901234567890123456789')
33
+ assert_equal(BigDecimal, doc.class)
34
+ doc = p.parse('1234567890.1234567890123456789')
35
+ assert_equal(BigDecimal, doc.class)
36
+ end
37
+
38
+ def test_array
39
+ p = Oj::Parser.new(:usual)
40
+ [
41
+ ['[]', []],
42
+ ['[false]', [false]],
43
+ ['[true,false]', [true, false]],
44
+ ['[[]]', [[]]],
45
+ ['[true,[],false]', [true, [], false]],
46
+ ['[true,[true],false]', [true, [true], false]],
47
+ ].each { |x|
48
+ doc = p.parse(x[0])
49
+ assert_equal(x[1], doc)
50
+ }
51
+ end
52
+
53
+ def test_hash
54
+ p = Oj::Parser.new(:usual)
55
+ [
56
+ ['{}', {}],
57
+ ['{"a": null}', {'a' => nil}],
58
+ ['{"t": true, "f": false, "s": "abc"}', {'t' => true, 'f' => false, 's' => 'abc'}],
59
+ ['{"a": {}}', {'a' => {}}],
60
+ ['{"a": {"b": 2}}', {'a' => {'b' => 2}}],
61
+ ['{"a": [true]}', {'a' => [true]}],
62
+ ].each { |x|
63
+ doc = p.parse(x[0])
64
+ assert_equal(x[1], doc)
65
+ }
66
+ end
67
+
68
+ def test_symbol_keys
69
+ p = Oj::Parser.new(:usual)
70
+ refute(p.symbol_keys)
71
+ p.symbol_keys = true
72
+ doc = p.parse('{"a": true, "b": false}')
73
+ assert_equal({a: true, b: false}, doc)
74
+ end
75
+
76
+ def test_strings
77
+ p = Oj::Parser.new(:usual)
78
+ doc = p.parse('{"ぴ": "", "ぴ ": "x", "c": "ぴーたー", "d": " ぴーたー "}')
79
+ assert_equal({'ぴ' => '', 'ぴ ' => 'x', 'c' => 'ぴーたー', 'd' => ' ぴーたー '}, doc)
80
+ end
81
+
82
+ def test_capacity
83
+ p = Oj::Parser.new(:usual, capacity: 1000)
84
+ assert_equal(4096, p.capacity)
85
+ p.capacity = 5000
86
+ assert_equal(5000, p.capacity)
87
+ end
88
+
89
+ def test_decimal
90
+ p = Oj::Parser.new(:usual)
91
+ assert_equal(:auto, p.decimal)
92
+ doc = p.parse('1.234567890123456789')
93
+ assert_equal(BigDecimal, doc.class)
94
+ assert_equal('0.1234567890123456789e1', doc.to_s)
95
+ doc = p.parse('1.25')
96
+ assert_equal(Float, doc.class)
97
+
98
+ p.decimal = :float
99
+ assert_equal(:float, p.decimal)
100
+ doc = p.parse('1.234567890123456789')
101
+ assert_equal(Float, doc.class)
102
+
103
+ p.decimal = :bigdecimal
104
+ assert_equal(:bigdecimal, p.decimal)
105
+ doc = p.parse('1.234567890123456789')
106
+ assert_equal(BigDecimal, doc.class)
107
+ doc = p.parse('1.25')
108
+ assert_equal(BigDecimal, doc.class)
109
+ assert_equal('0.125e1', doc.to_s)
110
+
111
+ p.decimal = :ruby
112
+ assert_equal(:ruby, p.decimal)
113
+ doc = p.parse('1.234567890123456789')
114
+ assert_equal(Float, doc.class)
115
+ end
116
+
117
+ def test_multi_parse
118
+ p = Oj::Parser.new(:usual)
119
+ out = []
120
+ p.parse('{"a":1}{"b":{"x":2}} {"c":3}') { |j| out.push(j) }
121
+ assert_equal([{'a'=>1}, {'b'=>{'x'=>2}},{'c'=>3}], out)
122
+ end
123
+
124
+ def test_multi_load
125
+ p = Oj::Parser.new(:usual)
126
+ out = []
127
+ r, w = IO.pipe
128
+ thread = Thread.new do
129
+ ['{"a":1}', '{"b":{"x"', ':2}}{"c":', '3}'].each { |seg|
130
+ w.write(seg)
131
+ sleep(0.1)
132
+ }
133
+ w.close
134
+ end
135
+ p.load(r) { |j| out.push(j) }
136
+ r.close
137
+ thread.join
138
+ assert_equal([{'a'=>1}, {'b'=>{'x'=>2}},{'c'=>3}], out)
139
+ end
140
+
141
+ def test_omit_null
142
+ p = Oj::Parser.new(:usual)
143
+ p.omit_null = true
144
+ doc = p.parse('{"a":true,"b":null}')
145
+ assert_equal({'a'=>true}, doc)
146
+
147
+ p.omit_null = false
148
+ doc = p.parse('{"a":true,"b":null}')
149
+ assert_equal({'a'=>true, 'b'=>nil}, doc)
150
+ end
151
+
152
+ class MyArray < Array
153
+ end
154
+
155
+ def test_array_class
156
+ p = Oj::Parser.new(:usual)
157
+ p.array_class = MyArray
158
+ assert_equal(MyArray, p.array_class)
159
+ doc = p.parse('[true]')
160
+ assert_equal(MyArray, doc.class)
161
+ end
162
+
163
+ class MyHash < Hash
164
+ end
165
+
166
+ def test_hash_class
167
+ p = Oj::Parser.new(:usual)
168
+ p.hash_class = MyHash
169
+ assert_equal(MyHash, p.hash_class)
170
+ doc = p.parse('{"a":true}')
171
+ assert_equal(MyHash, doc.class)
172
+ end
173
+
174
+ def test_empty
175
+ p = Oj::Parser.new(:usual)
176
+ p.raise_on_empty = false
177
+ doc = p.parse(' ')
178
+ assert_nil(doc)
179
+
180
+ p.raise_on_empty = true
181
+ assert_raises(Oj::ParseError) { p.parse(' ') }
182
+ end
183
+
184
+ class MyClass
185
+ attr_accessor :a
186
+ attr_accessor :b
187
+
188
+ def to_s
189
+ "#{self.class}{a: #{@a} b: #{b}}"
190
+ end
191
+ end
192
+
193
+ class MyClass2 < MyClass
194
+ def self.json_create(arg)
195
+ obj = new
196
+ obj.a = arg['a']
197
+ obj.b = arg['b']
198
+ obj
199
+ end
200
+ end
201
+
202
+ def test_create_id
203
+ p = Oj::Parser.new(:usual)
204
+ p.create_id = '^'
205
+ doc = p.parse('{"a":true}')
206
+ assert_equal(Hash, doc.class)
207
+ doc = p.parse('{"a":true,"^":"UsualTest::MyClass","b":false}')
208
+ assert_equal('UsualTest::MyClass{a: true b: false}', doc.to_s)
209
+
210
+ doc = p.parse('{"a":true,"^":"UsualTest::MyClass2","b":false}')
211
+ assert_equal('UsualTest::MyClass2{a: true b: false}', doc.to_s)
212
+
213
+ p.hash_class = MyHash
214
+ assert_equal(MyHash, p.hash_class)
215
+ doc = p.parse('{"a":true}')
216
+ assert_equal(MyHash, doc.class)
217
+
218
+ doc = p.parse('{"a":true,"^":"UsualTest::MyClass","b":false}')
219
+ assert_equal('UsualTest::MyClass{a: true b: false}', doc.to_s)
220
+ end
221
+
222
+ def test_missing_class
223
+ p = Oj::Parser.new(:usual, create_id: '^')
224
+ json = '{"a":true,"^":"Auto","b":false}'
225
+ doc = p.parse(json)
226
+ assert_equal(Hash, doc.class)
227
+
228
+ p.missing_class = :auto
229
+ doc = p.parse(json)
230
+ # Auto should be defined after parsing
231
+ assert_equal(Auto, doc.class)
232
+ end
233
+
234
+ def test_class_cache
235
+ p = Oj::Parser.new(:usual)
236
+ p.create_id = '^'
237
+ p.class_cache = true
238
+ p.missing_class = :auto
239
+ json = '{"a":true,"^":"Auto2","b":false}'
240
+ doc = p.parse(json)
241
+ assert_equal(Auto2, doc.class)
242
+
243
+ doc = p.parse(json)
244
+ assert_equal(Auto2, doc.class)
245
+ end
246
+
247
+ def test_default_parser
248
+ doc = Oj::Parser.usual.parse('{"a":true,"b":null}')
249
+ assert_equal({'a'=>true, 'b'=>nil}, doc)
250
+ end
251
+ end
data/test/test_rails.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: utf-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
4
+ $LOAD_PATH << __dir__
5
5
 
6
6
  require 'helper'
7
7
 
data/test/test_saj.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
4
+ $LOAD_PATH << __dir__
5
5
 
6
6
  require 'helper'
7
7
 
@@ -23,8 +23,10 @@ $json = %{{
23
23
  class AllSaj < Oj::Saj
24
24
  attr_accessor :calls
25
25
 
26
- def initialize()
26
+ def initialize
27
27
  @calls = []
28
+
29
+ super
28
30
  end
29
31
 
30
32
  def hash_start(key)
@@ -95,14 +97,14 @@ class SajTest < Minitest::Test
95
97
  handler = AllSaj.new()
96
98
  json = %{12345}
97
99
  Oj.saj_parse(handler, json)
98
- assert_equal([[:add_value, 12345, nil]], handler.calls)
100
+ assert_equal([[:add_value, 12_345, nil]], handler.calls)
99
101
  end
100
102
 
101
103
  def test_float
102
104
  handler = AllSaj.new()
103
105
  json = %{12345.6789}
104
106
  Oj.saj_parse(handler, json)
105
- assert_equal([[:add_value, 12345.6789, nil]], handler.calls)
107
+ assert_equal([[:add_value, 12_345.6789, nil]], handler.calls)
106
108
  end
107
109
 
108
110
  def test_float_exp
@@ -111,7 +113,7 @@ class SajTest < Minitest::Test
111
113
  Oj.saj_parse(handler, json)
112
114
  assert_equal(1, handler.calls.size)
113
115
  assert_equal(:add_value, handler.calls[0][0])
114
- assert_equal((12345.6789e7 * 10000).to_i, (handler.calls[0][1] * 10000).to_i)
116
+ assert_equal((12_345.6789e7 * 10_000).to_i, (handler.calls[0][1] * 10_000).to_i)
115
117
  end
116
118
 
117
119
  def test_array_empty
@@ -177,10 +179,10 @@ class SajTest < Minitest::Test
177
179
  handler = AllSaj.new()
178
180
  json = %{12345xyz}
179
181
  Oj.saj_parse(handler, json)
180
- assert_equal([:add_value, 12345, nil], handler.calls.first)
182
+ assert_equal([:add_value, 12_345, nil], handler.calls.first)
181
183
  type, message, line, column = handler.calls.last
182
184
  assert_equal([:error, 1, 6], [type, line, column])
183
- assert_match(%r{invalid format, extra characters at line 1, column 6 \[(?:[a-z\.]+/)*saj\.c:\d+\]}, message)
185
+ assert_match(%r{invalid format, extra characters at line 1, column 6 \[(?:[A-Za-z]:/)?(?:[a-z.]+/)*saj\.c:\d+\]}, message)
184
186
  end
185
187
 
186
188
  end