oj 3.14.2 → 3.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +0 -1
- data/ext/oj/buf.h +2 -2
- data/ext/oj/cache.c +16 -16
- data/ext/oj/cache8.c +7 -7
- data/ext/oj/circarray.c +2 -1
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +2 -2
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +6 -14
- data/ext/oj/custom.c +6 -16
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +43 -18
- data/ext/oj/dump_compat.c +551 -576
- data/ext/oj/dump_leaf.c +3 -5
- data/ext/oj/dump_object.c +35 -36
- data/ext/oj/dump_strict.c +2 -4
- data/ext/oj/encoder.c +1 -1
- data/ext/oj/err.c +2 -13
- data/ext/oj/err.h +9 -12
- data/ext/oj/extconf.rb +1 -1
- data/ext/oj/fast.c +24 -38
- data/ext/oj/intern.c +38 -42
- data/ext/oj/intern.h +3 -7
- data/ext/oj/mem.c +211 -217
- data/ext/oj/mem.h +10 -10
- data/ext/oj/mimic_json.c +39 -24
- data/ext/oj/object.c +12 -26
- data/ext/oj/odd.c +2 -1
- data/ext/oj/odd.h +4 -4
- data/ext/oj/oj.c +80 -81
- data/ext/oj/oj.h +56 -54
- data/ext/oj/parse.c +55 -118
- data/ext/oj/parse.h +5 -10
- data/ext/oj/parser.c +7 -8
- data/ext/oj/parser.h +7 -8
- data/ext/oj/rails.c +28 -59
- data/ext/oj/reader.c +5 -9
- data/ext/oj/reader.h +1 -1
- data/ext/oj/resolve.c +3 -4
- data/ext/oj/rxclass.c +1 -1
- data/ext/oj/rxclass.h +1 -1
- data/ext/oj/saj.c +4 -4
- data/ext/oj/saj2.c +32 -49
- data/ext/oj/saj2.h +1 -1
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +18 -67
- data/ext/oj/stream_writer.c +5 -18
- data/ext/oj/strict.c +16 -40
- data/ext/oj/string_writer.c +6 -14
- data/ext/oj/trace.h +27 -16
- data/ext/oj/usual.c +62 -61
- data/ext/oj/usual.h +6 -6
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.h +4 -4
- data/ext/oj/wab.c +16 -36
- data/lib/oj/active_support_helper.rb +0 -1
- data/lib/oj/bag.rb +7 -1
- data/lib/oj/easy_hash.rb +4 -5
- data/lib/oj/error.rb +0 -1
- data/lib/oj/json.rb +4 -2
- data/lib/oj/mimic.rb +4 -2
- data/lib/oj/state.rb +8 -5
- data/lib/oj/version.rb +1 -2
- data/lib/oj.rb +2 -0
- data/pages/Options.md +4 -0
- data/test/_test_active.rb +8 -9
- data/test/_test_active_mimic.rb +7 -8
- data/test/_test_mimic_rails.rb +17 -20
- data/test/activerecord/result_test.rb +5 -6
- data/test/files.rb +15 -15
- data/test/foo.rb +9 -52
- data/test/helper.rb +5 -8
- data/test/isolated/shared.rb +3 -2
- data/test/json_gem/json_addition_test.rb +2 -2
- data/test/json_gem/json_common_interface_test.rb +4 -4
- data/test/json_gem/json_encoding_test.rb +0 -0
- data/test/json_gem/json_ext_parser_test.rb +1 -0
- data/test/json_gem/json_fixtures_test.rb +3 -2
- data/test/json_gem/json_generator_test.rb +43 -32
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +46 -46
- data/test/json_gem/json_string_matching_test.rb +9 -9
- data/test/mem.rb +13 -12
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +31 -33
- data/test/perf_dump.rb +25 -25
- data/test/perf_fast.rb +80 -82
- data/test/perf_file.rb +27 -29
- data/test/perf_object.rb +65 -69
- data/test/perf_once.rb +12 -11
- data/test/perf_parser.rb +41 -48
- data/test/perf_saj.rb +46 -54
- data/test/perf_scp.rb +57 -69
- data/test/perf_simple.rb +41 -39
- data/test/perf_strict.rb +68 -70
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +3 -3
- data/test/sample/change.rb +0 -1
- data/test/sample/dir.rb +0 -1
- data/test/sample/doc.rb +0 -1
- data/test/sample/file.rb +0 -1
- data/test/sample/group.rb +0 -1
- data/test/sample/hasprops.rb +0 -1
- data/test/sample/layer.rb +0 -1
- data/test/sample/rect.rb +0 -1
- data/test/sample/shape.rb +0 -1
- data/test/sample/text.rb +0 -1
- data/test/sample.rb +16 -16
- data/test/sample_json.rb +8 -8
- data/test/test_compat.rb +52 -52
- data/test/test_custom.rb +61 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +86 -90
- data/test/test_file.rb +24 -29
- data/test/test_gc.rb +5 -5
- data/test/test_generate.rb +5 -5
- data/test/test_hash.rb +4 -4
- data/test/test_integer_range.rb +9 -9
- data/test/test_null.rb +20 -20
- data/test/test_object.rb +78 -87
- data/test/test_parser.rb +4 -4
- data/test/test_parser_debug.rb +4 -4
- data/test/test_parser_saj.rb +27 -25
- data/test/test_parser_usual.rb +6 -6
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +10 -8
- data/test/test_scp.rb +35 -35
- data/test/test_strict.rb +28 -32
- data/test/test_various.rb +140 -97
- data/test/test_wab.rb +46 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +7 -7
- data/test/tests_mimic.rb +6 -6
- data/test/tests_mimic_addition.rb +6 -6
- metadata +18 -30
- data/test/activesupport4/decoding_test.rb +0 -108
- data/test/activesupport4/encoding_test.rb +0 -531
- data/test/activesupport4/test_helper.rb +0 -41
- data/test/activesupport5/abstract_unit.rb +0 -45
- data/test/activesupport5/decoding_test.rb +0 -133
- data/test/activesupport5/encoding_test.rb +0 -500
- data/test/activesupport5/encoding_test_cases.rb +0 -98
- data/test/activesupport5/test_helper.rb +0 -72
- data/test/activesupport5/time_zone_test_helpers.rb +0 -39
- data/test/bar.rb +0 -11
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/test/test_various.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: false
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
7
|
|
8
8
|
class Juice < Minitest::Test
|
9
|
-
def gen_whitespaced_string(length
|
10
|
-
whitespace_chars = [
|
11
|
-
result =
|
9
|
+
def gen_whitespaced_string(length=Random.new.rand(100))
|
10
|
+
whitespace_chars = [' ', "\t", "\f", "\n", "\r"]
|
11
|
+
result = ''
|
12
12
|
length.times { result << whitespace_chars.sample }
|
13
13
|
result
|
14
14
|
end
|
@@ -32,59 +32,49 @@ class Juice < Minitest::Test
|
|
32
32
|
end # Jam
|
33
33
|
|
34
34
|
class Jeez < Jam
|
35
|
-
def initialize(x, y)
|
36
|
-
super
|
37
|
-
end
|
38
35
|
|
39
|
-
def to_json()
|
36
|
+
def to_json(*_args)
|
40
37
|
%{{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}}
|
41
38
|
end
|
42
39
|
|
43
40
|
def self.json_create(h)
|
44
|
-
|
41
|
+
new(h['x'], h['y'])
|
45
42
|
end
|
46
43
|
end # Jeez
|
47
44
|
|
48
45
|
# contributed by sauliusg to fix as_json
|
49
46
|
class Orange < Jam
|
50
|
-
def initialize(x, y)
|
51
|
-
super
|
52
|
-
end
|
53
47
|
|
54
|
-
def as_json
|
48
|
+
def as_json
|
55
49
|
{ :json_class => self.class,
|
56
50
|
:x => @x,
|
57
51
|
:y => @y }
|
58
52
|
end
|
59
53
|
|
60
54
|
def self.json_create(h)
|
61
|
-
|
55
|
+
new(h['x'], h['y'])
|
62
56
|
end
|
63
57
|
end
|
64
58
|
|
65
59
|
class Melon < Jam
|
66
|
-
def initialize(x, y)
|
67
|
-
super
|
68
|
-
end
|
69
60
|
|
70
|
-
def as_json(
|
61
|
+
def as_json(_options)
|
71
62
|
"#{x} #{y}"
|
72
63
|
end
|
73
64
|
|
74
65
|
def self.json_create(h)
|
75
|
-
|
66
|
+
new(h['x'], h['y'])
|
76
67
|
end
|
77
68
|
end
|
78
69
|
|
79
70
|
class Jazz < Jam
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
def to_hash()
|
71
|
+
|
72
|
+
def to_hash
|
84
73
|
{ 'json_class' => self.class.to_s, 'x' => @x, 'y' => @y }
|
85
74
|
end
|
75
|
+
|
86
76
|
def self.json_create(h)
|
87
|
-
|
77
|
+
new(h['x'], h['y'])
|
88
78
|
end
|
89
79
|
end # Jazz
|
90
80
|
|
@@ -99,7 +89,7 @@ class Juice < Minitest::Test
|
|
99
89
|
def test_set_options
|
100
90
|
orig = Oj.default_options()
|
101
91
|
alt ={
|
102
|
-
indent:
|
92
|
+
indent: ' - ',
|
103
93
|
second_precision: 5,
|
104
94
|
circular: true,
|
105
95
|
class_cache: false,
|
@@ -139,17 +129,18 @@ class Juice < Minitest::Test
|
|
139
129
|
ignore_under: true,
|
140
130
|
trace: true,
|
141
131
|
safe: true,
|
132
|
+
omit_null_byte: false,
|
142
133
|
}
|
143
134
|
Oj.default_options = alt
|
144
|
-
#keys = alt.keys
|
145
|
-
#Oj.default_options.keys.each { |k| puts k unless keys.include? k}
|
135
|
+
# keys = alt.keys
|
136
|
+
# Oj.default_options.keys.each { |k| puts k unless keys.include? k}
|
146
137
|
opts = Oj.default_options()
|
147
|
-
assert_equal(alt, opts)
|
138
|
+
assert_equal(alt, opts)
|
148
139
|
|
149
140
|
Oj.default_options = orig # return to original
|
150
141
|
# verify back to original
|
151
142
|
opts = Oj.default_options()
|
152
|
-
assert_equal(orig, opts)
|
143
|
+
assert_equal(orig, opts)
|
153
144
|
end
|
154
145
|
|
155
146
|
def test_nil
|
@@ -166,8 +157,8 @@ class Juice < Minitest::Test
|
|
166
157
|
|
167
158
|
def test_fixnum
|
168
159
|
dump_and_load(0, false)
|
169
|
-
dump_and_load(
|
170
|
-
dump_and_load(-
|
160
|
+
dump_and_load(12_345, false)
|
161
|
+
dump_and_load(-54_321, false)
|
171
162
|
dump_and_load(1, false)
|
172
163
|
end
|
173
164
|
|
@@ -175,11 +166,11 @@ class Juice < Minitest::Test
|
|
175
166
|
Oj.default_options = { :float_precision => 16, :bigdecimal_load => :auto }
|
176
167
|
n = Oj.load('0.00001234567890123456')
|
177
168
|
assert_equal(Float, n.class)
|
178
|
-
assert_equal('1.234567890123456e-05',
|
169
|
+
assert_equal('1.234567890123456e-05', '%0.15e' % [n])
|
179
170
|
|
180
171
|
n = Oj.load('-0.00001234567890123456')
|
181
172
|
assert_equal(Float, n.class)
|
182
|
-
assert_equal('-1.234567890123456e-05',
|
173
|
+
assert_equal('-1.234567890123456e-05', '%0.15e' % [n])
|
183
174
|
|
184
175
|
n = Oj.load('1000.0000123456789')
|
185
176
|
assert_equal(BigDecimal, n.class)
|
@@ -227,12 +218,12 @@ class Juice < Minitest::Test
|
|
227
218
|
def test_encode
|
228
219
|
opts = Oj.default_options
|
229
220
|
Oj.default_options = { :ascii_only => false }
|
230
|
-
dump_and_load(
|
221
|
+
dump_and_load('ぴーたー', false)
|
231
222
|
|
232
223
|
Oj.default_options = { :ascii_only => true }
|
233
|
-
json = Oj.dump(
|
224
|
+
json = Oj.dump('ぴーたー')
|
234
225
|
assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
|
235
|
-
dump_and_load(
|
226
|
+
dump_and_load('ぴーたー', false)
|
236
227
|
Oj.default_options = opts
|
237
228
|
end
|
238
229
|
|
@@ -253,7 +244,7 @@ class Juice < Minitest::Test
|
|
253
244
|
assert(true)
|
254
245
|
return
|
255
246
|
end
|
256
|
-
assert(false,
|
247
|
+
assert(false, '*** expected an exception')
|
257
248
|
end
|
258
249
|
|
259
250
|
def test_invalid_unicode_ok
|
@@ -267,11 +258,11 @@ class Juice < Minitest::Test
|
|
267
258
|
def test_dump_options
|
268
259
|
json = Oj.dump({ 'a' => 1, 'b' => [true, false]},
|
269
260
|
:mode => :compat,
|
270
|
-
:indent =>
|
261
|
+
:indent => '--',
|
271
262
|
:array_nl => "\n",
|
272
263
|
:object_nl => "#\n",
|
273
|
-
:space =>
|
274
|
-
:space_before =>
|
264
|
+
:space => '*',
|
265
|
+
:space_before => '~')
|
275
266
|
assert(%{{#
|
276
267
|
--"a"~:*1,#
|
277
268
|
--"b"~:*[
|
@@ -286,7 +277,6 @@ class Juice < Minitest::Test
|
|
286
277
|
--],#
|
287
278
|
--"a"~:*1#
|
288
279
|
}} == json)
|
289
|
-
|
290
280
|
end
|
291
281
|
|
292
282
|
def test_null_char
|
@@ -301,6 +291,7 @@ class Juice < Minitest::Test
|
|
301
291
|
dump_and_load([[nil]], false)
|
302
292
|
dump_and_load([[nil], 58], false)
|
303
293
|
end
|
294
|
+
|
304
295
|
def test_array_not_closed
|
305
296
|
begin
|
306
297
|
Oj.load('[')
|
@@ -308,7 +299,7 @@ class Juice < Minitest::Test
|
|
308
299
|
assert(true)
|
309
300
|
return
|
310
301
|
end
|
311
|
-
assert(false,
|
302
|
+
assert(false, '*** expected an exception')
|
312
303
|
end
|
313
304
|
|
314
305
|
# multiple JSON in one string
|
@@ -319,7 +310,7 @@ class Juice < Minitest::Test
|
|
319
310
|
}
|
320
311
|
results = []
|
321
312
|
Oj.load(json, :mode => :strict) { |x, start, len| results << [x, start, len] }
|
322
|
-
assert_equal([[{
|
313
|
+
assert_equal([[{'a'=>1}, 0, 7], [[1, 2], 7, 6], [[3, 4], 13, 5], [{'b'=>2}, 18, 8]], results)
|
323
314
|
end
|
324
315
|
|
325
316
|
def test_multiple_json_no_callback
|
@@ -339,33 +330,39 @@ class Juice < Minitest::Test
|
|
339
330
|
out = Oj.dump(hash)
|
340
331
|
assert_equal(json, out)
|
341
332
|
end
|
333
|
+
|
342
334
|
def test_escapes_entities_by_default_when_configured_to_do_so
|
343
|
-
hash = {'key' =>
|
335
|
+
hash = {'key' => 'I <3 this'}
|
344
336
|
Oj.default_options = {:escape_mode => :xss_safe}
|
345
337
|
out = Oj.dump hash
|
346
338
|
assert_equal(%{{"key":"I \\u003c3 this"}}, out)
|
347
339
|
end
|
340
|
+
|
348
341
|
def test_escapes_slashes_by_default_when_configured_to_do_so
|
349
|
-
hash = {'key' =>
|
342
|
+
hash = {'key' => 'I <3 this </script>'}
|
350
343
|
Oj.default_options = {:escape_mode => :slash}
|
351
344
|
out = Oj.dump hash
|
352
345
|
assert_equal(%{{"key":"I <3 this <\\/script>"}}, out)
|
353
346
|
end
|
347
|
+
|
354
348
|
def test_escapes_entities_when_asked_to
|
355
|
-
hash = {'key' =>
|
349
|
+
hash = {'key' => 'I <3 this'}
|
356
350
|
out = Oj.dump(hash, :escape_mode => :xss_safe)
|
357
351
|
assert_equal(%{{"key":"I \\u003c3 this"}}, out)
|
358
352
|
end
|
353
|
+
|
359
354
|
def test_does_not_escape_entities_when_not_asked_to
|
360
|
-
hash = {'key' =>
|
355
|
+
hash = {'key' => 'I <3 this'}
|
361
356
|
out = Oj.dump(hash, :escape_mode => :json)
|
362
357
|
assert_equal(%{{"key":"I <3 this"}}, out)
|
363
358
|
end
|
359
|
+
|
364
360
|
def test_escapes_common_xss_vectors
|
365
|
-
hash = {'key' =>
|
361
|
+
hash = {'key' => '<script>alert(123) && formatHD()</script>'}
|
366
362
|
out = Oj.dump(hash, :escape_mode => :xss_safe)
|
367
363
|
assert_equal(%{{"key":"\\u003cscript\\u003ealert(123) \\u0026\\u0026 formatHD()\\u003c\\/script\\u003e"}}, out)
|
368
364
|
end
|
365
|
+
|
369
366
|
def test_escape_newline_by_default
|
370
367
|
Oj.default_options = { :escape_mode => :json }
|
371
368
|
json = %{["one","two\\n2"]}
|
@@ -373,6 +370,7 @@ class Juice < Minitest::Test
|
|
373
370
|
out = Oj.dump(x)
|
374
371
|
assert_equal(json, out)
|
375
372
|
end
|
373
|
+
|
376
374
|
def test_does_not_escape_newline
|
377
375
|
Oj.default_options = { :escape_mode => :newline }
|
378
376
|
json = %{["one","two\n2"]}
|
@@ -380,6 +378,7 @@ class Juice < Minitest::Test
|
|
380
378
|
out = Oj.dump(x)
|
381
379
|
assert_equal(json, out)
|
382
380
|
end
|
381
|
+
|
383
382
|
def test_dump_invalid_utf8
|
384
383
|
Oj.default_options = { :escape_mode => :ascii }
|
385
384
|
assert_raises(EncodingError) {
|
@@ -401,14 +400,14 @@ class Juice < Minitest::Test
|
|
401
400
|
end
|
402
401
|
|
403
402
|
def test_time_neg
|
404
|
-
t = Time.parse(
|
403
|
+
t = Time.parse('1900-01-01 00:18:59 UTC')
|
405
404
|
json = Oj.dump(t, :mode => :custom, :time_format => :unix)
|
406
405
|
assert_equal('-2208987661.000000000', json)
|
407
406
|
end
|
408
407
|
|
409
408
|
def test_time_years
|
410
409
|
(-2020..2020).each { |year|
|
411
|
-
s =
|
410
|
+
s = '%04d-03-01T15:14:13Z' % [year]
|
412
411
|
json = Oj.dump(Time.parse(s), mode: :custom, time_format: :xmlschema, second_precision: -1)
|
413
412
|
assert_equal(s, json[1..-2])
|
414
413
|
|
@@ -437,7 +436,7 @@ class Juice < Minitest::Test
|
|
437
436
|
assert(true)
|
438
437
|
return
|
439
438
|
end
|
440
|
-
assert(false,
|
439
|
+
assert(false, '*** expected an exception')
|
441
440
|
end
|
442
441
|
|
443
442
|
def test_hash_not_closed
|
@@ -447,7 +446,7 @@ class Juice < Minitest::Test
|
|
447
446
|
assert(true)
|
448
447
|
return
|
449
448
|
end
|
450
|
-
assert(false,
|
449
|
+
assert(false, '*** expected an exception')
|
451
450
|
end
|
452
451
|
|
453
452
|
# Object with to_json()
|
@@ -457,7 +456,7 @@ class Juice < Minitest::Test
|
|
457
456
|
assert_equal('null', json)
|
458
457
|
end
|
459
458
|
|
460
|
-
# Object with to_hash()
|
459
|
+
# Object with to_hash()
|
461
460
|
def test_to_hash_object_null
|
462
461
|
obj = Jazz.new(true, 58)
|
463
462
|
json = Oj.dump(obj, :mode => :null)
|
@@ -505,7 +504,7 @@ class Juice < Minitest::Test
|
|
505
504
|
|
506
505
|
def test_infinity
|
507
506
|
n = Oj.load('Infinity', :mode => :object)
|
508
|
-
assert_equal(BigDecimal('Infinity').to_f, n)
|
507
|
+
assert_equal(BigDecimal('Infinity').to_f, n)
|
509
508
|
x = Oj.load('Infinity', :mode => :compat)
|
510
509
|
assert_equal('Infinity', x.to_s)
|
511
510
|
end
|
@@ -530,7 +529,7 @@ class Juice < Minitest::Test
|
|
530
529
|
"y":58 }}
|
531
530
|
obj = Oj.load(json, :mode => :object, :auto_define => true)
|
532
531
|
assert_equal('Juice::Jem', obj.class.name)
|
533
|
-
|
532
|
+
assert(obj.x)
|
534
533
|
assert_equal(58, obj.y)
|
535
534
|
end
|
536
535
|
|
@@ -538,19 +537,19 @@ class Juice < Minitest::Test
|
|
538
537
|
def test_deep_nest_dump
|
539
538
|
begin
|
540
539
|
a = []
|
541
|
-
|
540
|
+
10_000.times { a << [a] }
|
542
541
|
Oj.dump(a)
|
543
542
|
rescue Exception
|
544
543
|
assert(true)
|
545
544
|
return
|
546
545
|
end
|
547
|
-
assert(false,
|
546
|
+
assert(false, '*** expected an exception')
|
548
547
|
end
|
549
548
|
|
550
549
|
# Stream IO
|
551
550
|
def test_io_string
|
552
551
|
src = { 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}
|
553
|
-
output = StringIO.open(
|
552
|
+
output = StringIO.open('', 'w+')
|
554
553
|
Oj.to_stream(output, src)
|
555
554
|
|
556
555
|
input = StringIO.new(output.string())
|
@@ -560,8 +559,8 @@ class Juice < Minitest::Test
|
|
560
559
|
|
561
560
|
def test_io_file
|
562
561
|
src = { 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}
|
563
|
-
filename = File.join(
|
564
|
-
File.open(filename,
|
562
|
+
filename = File.join(__dir__, 'open_file_test.json')
|
563
|
+
File.open(filename, 'w') { |f|
|
565
564
|
Oj.to_stream(f, src)
|
566
565
|
}
|
567
566
|
f = File.new(filename)
|
@@ -575,26 +574,26 @@ class Juice < Minitest::Test
|
|
575
574
|
|
576
575
|
IO.pipe do |r, w|
|
577
576
|
if fork
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
577
|
+
r.close
|
578
|
+
# w.nonblock = false
|
579
|
+
a = []
|
580
|
+
10_000.times do |i|
|
581
|
+
a << i
|
582
|
+
end
|
583
|
+
Oj.to_stream(w, a, indent: 2)
|
584
|
+
w.close
|
586
585
|
else
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
586
|
+
w.close
|
587
|
+
sleep(0.1) # to force a busy
|
588
|
+
cnt = 0
|
589
|
+
r.each_line { cnt += 1 }
|
590
|
+
r.close
|
591
|
+
Process.exit(0)
|
593
592
|
end
|
594
593
|
end
|
595
594
|
end
|
596
595
|
|
597
|
-
# comments
|
596
|
+
# comments
|
598
597
|
def test_comment_slash
|
599
598
|
json = %{{
|
600
599
|
"x":true,//three
|
@@ -638,7 +637,7 @@ class Juice < Minitest::Test
|
|
638
637
|
assert(true)
|
639
638
|
return
|
640
639
|
end
|
641
|
-
assert(false,
|
640
|
+
assert(false, '*** expected an exception')
|
642
641
|
end
|
643
642
|
|
644
643
|
def test_nilnil_true
|
@@ -661,27 +660,27 @@ class Juice < Minitest::Test
|
|
661
660
|
assert(Oj::ParseError == e.class || EncodingError == e.class)
|
662
661
|
return
|
663
662
|
end
|
664
|
-
assert(false,
|
663
|
+
assert(false, '*** expected an exception')
|
665
664
|
end
|
666
665
|
|
667
666
|
def test_quirks_null_mode
|
668
|
-
assert_raises(Oj::ParseError) { Oj.load(
|
669
|
-
assert_nil(Oj.load(
|
667
|
+
assert_raises(Oj::ParseError) { Oj.load('null', :quirks_mode => false) }
|
668
|
+
assert_nil(Oj.load('null', :quirks_mode => true))
|
670
669
|
end
|
671
670
|
|
672
671
|
def test_quirks_bool_mode
|
673
|
-
assert_raises(Oj::ParseError) { Oj.load(
|
674
|
-
|
672
|
+
assert_raises(Oj::ParseError) { Oj.load('true', :quirks_mode => false) }
|
673
|
+
assert(Oj.load('true', :quirks_mode => true))
|
675
674
|
end
|
676
675
|
|
677
676
|
def test_quirks_number_mode
|
678
|
-
assert_raises(Oj::ParseError) { Oj.load(
|
679
|
-
assert_equal(123, Oj.load(
|
677
|
+
assert_raises(Oj::ParseError) { Oj.load('123', :quirks_mode => false) }
|
678
|
+
assert_equal(123, Oj.load('123', :quirks_mode => true))
|
680
679
|
end
|
681
680
|
|
682
681
|
def test_quirks_decimal_mode
|
683
|
-
assert_raises(Oj::ParseError) { Oj.load(
|
684
|
-
|
682
|
+
assert_raises(Oj::ParseError) { Oj.load('123.45', :quirks_mode => false) }
|
683
|
+
assert_in_delta(123.45, Oj.load('123.45', :quirks_mode => true))
|
685
684
|
end
|
686
685
|
|
687
686
|
def test_quirks_string_mode
|
@@ -693,35 +692,33 @@ class Juice < Minitest::Test
|
|
693
692
|
msg = ''
|
694
693
|
assert_raises(Oj::ParseError) {
|
695
694
|
begin
|
696
|
-
|
695
|
+
Oj.load(%|{
|
697
696
|
"first": [
|
698
697
|
1, 2, { "third": 123x }
|
699
698
|
]
|
700
699
|
}|)
|
701
700
|
rescue Oj::ParseError => e
|
702
|
-
|
703
|
-
|
701
|
+
msg = e.message
|
702
|
+
raise e
|
704
703
|
end
|
705
704
|
}
|
706
705
|
assert_equal('after first[2].third', msg.split('(')[1].split(')')[0])
|
707
706
|
end
|
708
707
|
|
709
708
|
def test_bad_bignum
|
710
|
-
|
711
|
-
|
712
|
-
Oj.load(%|{ "big": -e123456789 }|, mode: :strict)
|
713
|
-
end
|
709
|
+
assert_raises Oj::ParseError do
|
710
|
+
Oj.load(%|{ "big": -e123456789 }|, mode: :strict)
|
714
711
|
end
|
715
712
|
end
|
716
713
|
|
717
714
|
def test_quirks_array_mode
|
718
|
-
|
719
|
-
|
715
|
+
assert_empty(Oj.load('[]', :quirks_mode => false))
|
716
|
+
assert_empty(Oj.load('[]', :quirks_mode => true))
|
720
717
|
end
|
721
718
|
|
722
719
|
def test_quirks_object_mode
|
723
|
-
|
724
|
-
|
720
|
+
assert_empty(Oj.load('{}', :quirks_mode => false))
|
721
|
+
assert_empty(Oj.load('{}', :quirks_mode => true))
|
725
722
|
end
|
726
723
|
|
727
724
|
def test_omit_nil
|
@@ -737,6 +734,52 @@ class Juice < Minitest::Test
|
|
737
734
|
assert_equal(%|{"x":{"a":1}}|, json)
|
738
735
|
end
|
739
736
|
|
737
|
+
def test_omit_null_byte
|
738
|
+
Oj.default_options = { :omit_null_byte => true }
|
739
|
+
|
740
|
+
json = Oj.dump({ "fo\x00o" => "b\x00ar" })
|
741
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
742
|
+
|
743
|
+
json = Oj.dump({ "foo\x00" => "\x00bar" })
|
744
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
745
|
+
|
746
|
+
json = Oj.dump({ "\x00foo" => "bar\x00" })
|
747
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
748
|
+
|
749
|
+
json = Oj.dump({ "fo\0o" => "ba\0r" })
|
750
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
751
|
+
|
752
|
+
json = Oj.dump({ "foo\0" => "\0bar" })
|
753
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
754
|
+
|
755
|
+
json = Oj.dump({ "\0foo" => "bar\0" })
|
756
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
757
|
+
|
758
|
+
json = Oj.dump({ "fo\u0000o" => "ba\u0000r" })
|
759
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
760
|
+
|
761
|
+
json = Oj.dump({ "foo\u0000" => "\u0000bar" })
|
762
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
763
|
+
|
764
|
+
json = Oj.dump({ "\u0000foo" => "bar\u0000" })
|
765
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
766
|
+
|
767
|
+
json = Oj.dump({ "\x00foo" => "bar\x00" }, :omit_null_byte => false)
|
768
|
+
assert_equal(%|{"\\u0000foo":"bar\\u0000"}|, json)
|
769
|
+
|
770
|
+
# no change from default set earlier so :omit_null_byte is still true
|
771
|
+
json = Oj.dump({ "\x00foo" => "bar\x00" }, :omit_null_byte => nil)
|
772
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
773
|
+
|
774
|
+
Oj.default_options = { :omit_null_byte => false }
|
775
|
+
|
776
|
+
json = Oj.dump({ "\x00foo" => "bar\x00" })
|
777
|
+
assert_equal(%|{"\\u0000foo":"bar\\u0000"}|, json)
|
778
|
+
|
779
|
+
json = Oj.dump({ "\x00foo" => "bar\x00" }, :omit_null_byte => true)
|
780
|
+
assert_equal(%|{"foo":"bar"}|, json)
|
781
|
+
end
|
782
|
+
|
740
783
|
def dump_and_load(obj, trace=false)
|
741
784
|
json = Oj.dump(obj, :indent => 2)
|
742
785
|
puts json if trace
|