oj 3.13.17 → 3.16.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +77 -0
- data/README.md +4 -2
- data/ext/oj/buf.h +7 -6
- data/ext/oj/cache.c +29 -26
- data/ext/oj/cache.h +3 -2
- data/ext/oj/cache8.c +10 -9
- data/ext/oj/circarray.c +7 -5
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +5 -12
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +20 -60
- data/ext/oj/custom.c +44 -96
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +69 -39
- data/ext/oj/dump.h +1 -4
- data/ext/oj/dump_compat.c +557 -592
- data/ext/oj/dump_leaf.c +3 -5
- data/ext/oj/dump_object.c +42 -48
- data/ext/oj/dump_strict.c +10 -22
- 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 +16 -6
- data/ext/oj/fast.c +76 -106
- data/ext/oj/intern.c +63 -51
- data/ext/oj/intern.h +3 -7
- data/ext/oj/mem.c +318 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +43 -30
- data/ext/oj/object.c +61 -70
- data/ext/oj/odd.c +8 -6
- data/ext/oj/odd.h +4 -4
- data/ext/oj/oj.c +243 -205
- data/ext/oj/oj.h +82 -78
- data/ext/oj/parse.c +123 -188
- data/ext/oj/parse.h +23 -24
- data/ext/oj/parser.c +103 -63
- data/ext/oj/parser.h +19 -9
- data/ext/oj/rails.c +68 -92
- data/ext/oj/reader.c +10 -15
- data/ext/oj/reader.h +4 -2
- data/ext/oj/resolve.c +3 -4
- data/ext/oj/rxclass.c +6 -5
- data/ext/oj/rxclass.h +1 -1
- data/ext/oj/saj.c +10 -9
- data/ext/oj/saj2.c +74 -92
- data/ext/oj/saj2.h +23 -0
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +22 -70
- data/ext/oj/stream_writer.c +43 -35
- data/ext/oj/strict.c +20 -52
- data/ext/oj/string_writer.c +60 -34
- data/ext/oj/trace.h +31 -4
- data/ext/oj/usual.c +125 -150
- data/ext/oj/usual.h +69 -0
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.c +14 -3
- data/ext/oj/val_stack.h +8 -7
- data/ext/oj/wab.c +25 -57
- data/lib/oj/active_support_helper.rb +1 -3
- 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 +162 -150
- data/lib/oj/mimic.rb +6 -2
- data/lib/oj/state.rb +9 -6
- data/lib/oj/version.rb +1 -2
- data/lib/oj.rb +2 -0
- data/pages/Compatibility.md +1 -1
- data/pages/InstallOptions.md +20 -0
- data/pages/Options.md +10 -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 -72
- data/test/helper.rb +11 -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 +8 -6
- 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 +53 -37
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +47 -47
- data/test/json_gem/json_string_matching_test.rb +9 -9
- data/test/json_gem/test_helper.rb +7 -3
- data/test/mem.rb +13 -12
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +31 -33
- data/test/perf_dump.rb +28 -28
- 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 +42 -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 +5 -5
- 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 +80 -53
- data/test/test_custom.rb +73 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +86 -90
- data/test/test_file.rb +28 -35
- data/test/test_gc.rb +16 -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 +94 -96
- data/test/test_parser.rb +6 -22
- data/test/test_parser_debug.rb +27 -0
- data/test/test_parser_saj.rb +61 -22
- data/test/test_parser_usual.rb +16 -6
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +10 -8
- data/test/test_scp.rb +37 -39
- data/test/test_strict.rb +40 -32
- data/test/test_various.rb +148 -100
- data/test/test_wab.rb +48 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +13 -4
- data/test/tests_mimic.rb +12 -3
- data/test/tests_mimic_addition.rb +12 -3
- metadata +36 -27
- 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_null.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
|
+
@oj_dir = File.dirname(File.expand_path(__dir__))
|
6
6
|
%w(lib ext).each do |dir|
|
7
|
-
|
7
|
+
$LOAD_PATH << File.join(@oj_dir, dir)
|
8
8
|
end
|
9
9
|
|
10
10
|
require 'minitest'
|
@@ -52,16 +52,16 @@ class NullJuice < Minitest::Test
|
|
52
52
|
|
53
53
|
def test_fixnum
|
54
54
|
dump_and_load(0, false)
|
55
|
-
dump_and_load(
|
56
|
-
dump_and_load(-
|
55
|
+
dump_and_load(12_345, false)
|
56
|
+
dump_and_load(-54_321, false)
|
57
57
|
dump_and_load(1, false)
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_float
|
61
61
|
dump_and_load(0.0, false)
|
62
|
-
dump_and_load(
|
62
|
+
dump_and_load(12_345.6789, false)
|
63
63
|
dump_and_load(70.35, false)
|
64
|
-
dump_and_load(-
|
64
|
+
dump_and_load(-54_321.012, false)
|
65
65
|
dump_and_load(1.7775, false)
|
66
66
|
dump_and_load(2.5024, false)
|
67
67
|
dump_and_load(2.48e16, false)
|
@@ -78,7 +78,7 @@ class NullJuice < Minitest::Test
|
|
78
78
|
assert(true)
|
79
79
|
return
|
80
80
|
end
|
81
|
-
assert(false,
|
81
|
+
assert(false, '*** expected an exception')
|
82
82
|
end
|
83
83
|
|
84
84
|
def test_infinity_dump
|
@@ -90,7 +90,7 @@ class NullJuice < Minitest::Test
|
|
90
90
|
assert(true)
|
91
91
|
return
|
92
92
|
end
|
93
|
-
assert(false,
|
93
|
+
assert(false, '*** expected an exception')
|
94
94
|
end
|
95
95
|
|
96
96
|
def test_neg_infinity_dump
|
@@ -102,7 +102,7 @@ class NullJuice < Minitest::Test
|
|
102
102
|
assert(true)
|
103
103
|
return
|
104
104
|
end
|
105
|
-
assert(false,
|
105
|
+
assert(false, '*** expected an exception')
|
106
106
|
end
|
107
107
|
|
108
108
|
def test_string
|
@@ -116,13 +116,13 @@ class NullJuice < Minitest::Test
|
|
116
116
|
opts = Oj.default_options
|
117
117
|
Oj.default_options = { :ascii_only => false }
|
118
118
|
unless 'jruby' == $ruby
|
119
|
-
dump_and_load(
|
119
|
+
dump_and_load('ぴーたー', false)
|
120
120
|
end
|
121
121
|
Oj.default_options = { :ascii_only => true }
|
122
|
-
json = Oj.dump(
|
122
|
+
json = Oj.dump('ぴーたー')
|
123
123
|
assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
|
124
124
|
unless 'jruby' == $ruby
|
125
|
-
dump_and_load(
|
125
|
+
dump_and_load('ぴーたー', false)
|
126
126
|
end
|
127
127
|
Oj.default_options = opts
|
128
128
|
end
|
@@ -152,7 +152,7 @@ class NullJuice < Minitest::Test
|
|
152
152
|
end
|
153
153
|
|
154
154
|
def test_array_deep
|
155
|
-
dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
|
155
|
+
dump_and_load([1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20]]]]]]]]]]]]]]]]]]]], false)
|
156
156
|
end
|
157
157
|
|
158
158
|
# Hash
|
@@ -198,7 +198,7 @@ class NullJuice < Minitest::Test
|
|
198
198
|
assert(true)
|
199
199
|
return
|
200
200
|
end
|
201
|
-
assert(false,
|
201
|
+
assert(false, '*** expected an exception')
|
202
202
|
end
|
203
203
|
|
204
204
|
def test_bignum_object
|
@@ -244,13 +244,13 @@ class NullJuice < Minitest::Test
|
|
244
244
|
end
|
245
245
|
|
246
246
|
def test_io_file
|
247
|
-
filename = File.join(
|
248
|
-
File.
|
247
|
+
filename = File.join(__dir__, 'open_file_test.json')
|
248
|
+
File.write(filename, %{{
|
249
249
|
"x":true,
|
250
250
|
"y":58,
|
251
251
|
"z": [1,2,3]
|
252
252
|
}
|
253
|
-
})
|
253
|
+
})
|
254
254
|
f = File.new(filename)
|
255
255
|
obj = Oj.strict_load(f)
|
256
256
|
f.close()
|
@@ -364,7 +364,7 @@ class NullJuice < Minitest::Test
|
|
364
364
|
def dump_and_load(obj, trace=false)
|
365
365
|
json = Oj.dump(obj, :indent => 2)
|
366
366
|
puts json if trace
|
367
|
-
loaded = Oj.strict_load(json)
|
367
|
+
loaded = Oj.strict_load(json)
|
368
368
|
if obj.nil?
|
369
369
|
assert_nil(loaded)
|
370
370
|
else
|
data/test/test_object.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
7
|
|
@@ -20,12 +20,12 @@ class ObjectJuice < Minitest::Test
|
|
20
20
|
end
|
21
21
|
alias == eql?
|
22
22
|
|
23
|
-
def to_json(*
|
23
|
+
def to_json(*_a)
|
24
24
|
%{{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}}
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.json_create(h)
|
28
|
-
|
28
|
+
new(h['x'], h['y'])
|
29
29
|
end
|
30
30
|
end # Jeez
|
31
31
|
|
@@ -45,30 +45,26 @@ class ObjectJuice < Minitest::Test
|
|
45
45
|
end # Jam
|
46
46
|
|
47
47
|
class Jazz < Jam
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
def to_hash()
|
48
|
+
|
49
|
+
def to_hash
|
52
50
|
{ 'json_class' => self.class.to_s, 'x' => @x, 'y' => @y }
|
53
51
|
end
|
52
|
+
|
54
53
|
def self.json_create(h)
|
55
|
-
|
54
|
+
new(h['x'], h['y'])
|
56
55
|
end
|
57
56
|
end # Jazz
|
58
57
|
|
59
58
|
class Orange < Jam
|
60
|
-
def initialize(x, y)
|
61
|
-
super
|
62
|
-
end
|
63
59
|
|
64
|
-
def as_json
|
60
|
+
def as_json
|
65
61
|
{ :json_class => self.class,
|
66
62
|
:x => @x,
|
67
63
|
:y => @y }
|
68
64
|
end
|
69
65
|
|
70
66
|
def self.json_create(h)
|
71
|
-
|
67
|
+
new(h['x'], h['y'])
|
72
68
|
end
|
73
69
|
end
|
74
70
|
|
@@ -77,24 +73,21 @@ class ObjectJuice < Minitest::Test
|
|
77
73
|
module Three
|
78
74
|
class Deep
|
79
75
|
|
80
|
-
def initialize()
|
81
|
-
end
|
82
|
-
|
83
76
|
def eql?(o)
|
84
77
|
self.class == o.class
|
85
78
|
end
|
86
79
|
alias == eql?
|
87
80
|
|
88
|
-
def to_hash
|
89
|
-
{'json_class' =>
|
81
|
+
def to_hash
|
82
|
+
{'json_class' => self.class.name.to_s}
|
90
83
|
end
|
91
84
|
|
92
|
-
def to_json(*
|
85
|
+
def to_json(*_a)
|
93
86
|
%{{"json_class":"#{self.class.name}"}}
|
94
87
|
end
|
95
88
|
|
96
|
-
def self.json_create(
|
97
|
-
|
89
|
+
def self.json_create(_h)
|
90
|
+
new()
|
98
91
|
end
|
99
92
|
end # Deep
|
100
93
|
end # Three
|
@@ -102,7 +95,6 @@ class ObjectJuice < Minitest::Test
|
|
102
95
|
|
103
96
|
class Stuck2 < Struct.new(:a, :b)
|
104
97
|
end
|
105
|
-
|
106
98
|
end # One
|
107
99
|
|
108
100
|
class Stuck < Struct.new(:a, :b)
|
@@ -115,7 +107,7 @@ class ObjectJuice < Minitest::Test
|
|
115
107
|
@safe = safe
|
116
108
|
end
|
117
109
|
|
118
|
-
def safe?
|
110
|
+
def safe?
|
119
111
|
@safe
|
120
112
|
end
|
121
113
|
|
@@ -128,8 +120,8 @@ class ObjectJuice < Minitest::Test
|
|
128
120
|
end
|
129
121
|
alias == eql?
|
130
122
|
|
131
|
-
def inspect
|
132
|
-
|
123
|
+
def inspect
|
124
|
+
super + '(' + @safe + ')'
|
133
125
|
end
|
134
126
|
end
|
135
127
|
|
@@ -182,7 +174,7 @@ class ObjectJuice < Minitest::Test
|
|
182
174
|
@json = j
|
183
175
|
end
|
184
176
|
|
185
|
-
def to_json(*
|
177
|
+
def to_json(*_a)
|
186
178
|
@json
|
187
179
|
end
|
188
180
|
|
@@ -206,7 +198,7 @@ class ObjectJuice < Minitest::Test
|
|
206
198
|
@hash = h
|
207
199
|
end
|
208
200
|
|
209
|
-
def dump
|
201
|
+
def dump
|
210
202
|
@hash
|
211
203
|
end
|
212
204
|
|
@@ -221,13 +213,6 @@ class ObjectJuice < Minitest::Test
|
|
221
213
|
|
222
214
|
def teardown
|
223
215
|
Oj.default_options = @default_options
|
224
|
-
#=begin
|
225
|
-
if '3.1.0' <= RUBY_VERSION && !(RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/)
|
226
|
-
#Oj::debug_odd("teardown before GC.verify_compaction_references")
|
227
|
-
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
228
|
-
#Oj::debug_odd("teardown after GC.verify_compaction_references")
|
229
|
-
end
|
230
|
-
#=end
|
231
216
|
end
|
232
217
|
|
233
218
|
def test_nil
|
@@ -244,16 +229,16 @@ class ObjectJuice < Minitest::Test
|
|
244
229
|
|
245
230
|
def test_fixnum
|
246
231
|
dump_and_load(0, false)
|
247
|
-
dump_and_load(
|
248
|
-
dump_and_load(-
|
232
|
+
dump_and_load(12_345, false)
|
233
|
+
dump_and_load(-54_321, false)
|
249
234
|
dump_and_load(1, false)
|
250
235
|
end
|
251
236
|
|
252
237
|
def test_float
|
253
238
|
dump_and_load(0.0, false)
|
254
|
-
dump_and_load(
|
239
|
+
dump_and_load(12_345.6789, false)
|
255
240
|
dump_and_load(70.35, false)
|
256
|
-
dump_and_load(-
|
241
|
+
dump_and_load(-54_321.012, false)
|
257
242
|
dump_and_load(1.7775, false)
|
258
243
|
dump_and_load(2.5024, false)
|
259
244
|
dump_and_load(2.48e16, false)
|
@@ -263,8 +248,8 @@ class ObjectJuice < Minitest::Test
|
|
263
248
|
# NaN does not always == NaN
|
264
249
|
json = Oj.dump(0/0.0, :mode => :object)
|
265
250
|
assert_equal('3.3e14159265358979323846', json)
|
266
|
-
loaded = Oj.load(json)
|
267
|
-
|
251
|
+
loaded = Oj.load(json)
|
252
|
+
assert_predicate(loaded, :nan?)
|
268
253
|
end
|
269
254
|
|
270
255
|
def test_string
|
@@ -276,18 +261,18 @@ class ObjectJuice < Minitest::Test
|
|
276
261
|
|
277
262
|
def test_symbol
|
278
263
|
dump_and_load(:abc, false)
|
279
|
-
dump_and_load(
|
280
|
-
dump_and_load(
|
264
|
+
dump_and_load(':abc', false)
|
265
|
+
dump_and_load(:":xyz", false)
|
281
266
|
end
|
282
267
|
|
283
268
|
def test_encode
|
284
269
|
opts = Oj.default_options
|
285
270
|
Oj.default_options = { :ascii_only => false }
|
286
|
-
dump_and_load(
|
271
|
+
dump_and_load('ぴーたー', false)
|
287
272
|
Oj.default_options = { :ascii_only => true }
|
288
|
-
json = Oj.dump(
|
273
|
+
json = Oj.dump('ぴーたー')
|
289
274
|
assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
|
290
|
-
dump_and_load(
|
275
|
+
dump_and_load('ぴーたー', false)
|
291
276
|
Oj.default_options = opts
|
292
277
|
end
|
293
278
|
|
@@ -308,7 +293,7 @@ class ObjectJuice < Minitest::Test
|
|
308
293
|
end
|
309
294
|
|
310
295
|
def test_array_deep
|
311
|
-
dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
|
296
|
+
dump_and_load([1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20]]]]]]]]]]]]]]]]]]]], false)
|
312
297
|
end
|
313
298
|
|
314
299
|
# Hash
|
@@ -383,13 +368,13 @@ class ObjectJuice < Minitest::Test
|
|
383
368
|
end
|
384
369
|
|
385
370
|
def test_io_file
|
386
|
-
filename = File.join(
|
387
|
-
File.
|
371
|
+
filename = File.join(__dir__, 'open_file_test.json')
|
372
|
+
File.write(filename, %{{
|
388
373
|
"x":true,
|
389
374
|
"y":58,
|
390
375
|
"z": [1,2,3]
|
391
376
|
}
|
392
|
-
})
|
377
|
+
})
|
393
378
|
f = File.new(filename)
|
394
379
|
obj = Oj.object_load(f)
|
395
380
|
f.close()
|
@@ -419,7 +404,7 @@ class ObjectJuice < Minitest::Test
|
|
419
404
|
def test_non_str_hash_object
|
420
405
|
json = Oj.dump({ 1 => true, :sim => nil }, :mode => :object)
|
421
406
|
h = Oj.load(json, :mode => :strict)
|
422
|
-
assert_equal({
|
407
|
+
assert_equal({'^#1' => [1, true], ':sim' => nil}, h)
|
423
408
|
h = Oj.load(json, :mode => :object)
|
424
409
|
assert_equal({ 1 => true, :sim => nil }, h)
|
425
410
|
end
|
@@ -471,8 +456,8 @@ class ObjectJuice < Minitest::Test
|
|
471
456
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
472
457
|
# separately along with utc.
|
473
458
|
json = Oj.dump(t, :mode => :object, :time_format => :xmlschema)
|
474
|
-
#puts "*** json for test_xml_time '#{json}'"
|
475
|
-
loaded = Oj.object_load(json)
|
459
|
+
# puts "*** json for test_xml_time '#{json}'"
|
460
|
+
loaded = Oj.object_load(json)
|
476
461
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
477
462
|
if t.respond_to?(:tv_nsec)
|
478
463
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -489,7 +474,7 @@ class ObjectJuice < Minitest::Test
|
|
489
474
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
490
475
|
# separately along with utc.
|
491
476
|
json = Oj.dump(t, :mode => :object, :time_format => :xmlschema)
|
492
|
-
loaded = Oj.object_load(json)
|
477
|
+
loaded = Oj.object_load(json)
|
493
478
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
494
479
|
if t.respond_to?(:tv_nsec)
|
495
480
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -506,8 +491,8 @@ class ObjectJuice < Minitest::Test
|
|
506
491
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
507
492
|
# separately along with utc.
|
508
493
|
json = Oj.dump(t, :mode => :object, :time_format => :ruby)
|
509
|
-
#puts "*** json for test_ruby_time '#{json}'"
|
510
|
-
loaded = Oj.object_load(json)
|
494
|
+
# puts "*** json for test_ruby_time '#{json}'"
|
495
|
+
loaded = Oj.object_load(json)
|
511
496
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
512
497
|
if t.respond_to?(:tv_nsec)
|
513
498
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -519,14 +504,14 @@ class ObjectJuice < Minitest::Test
|
|
519
504
|
end
|
520
505
|
|
521
506
|
def test_ruby_time_12345
|
522
|
-
t = Time.new(2015, 1, 5, 21, 37, 7.123456789,
|
507
|
+
t = Time.new(2015, 1, 5, 21, 37, 7.123456789, 12_345/60*60)
|
523
508
|
# The fractional seconds are not always recreated exactly which causes a
|
524
509
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
525
510
|
# separately along with utc.
|
526
511
|
json = Oj.dump(t, :mode => :object, :time_format => :ruby)
|
527
|
-
#puts "*** json for test_ruby_time '#{json}'"
|
528
|
-
loaded = Oj.object_load(json)
|
529
|
-
#puts "*** loaded: #{loaded}"
|
512
|
+
# puts "*** json for test_ruby_time '#{json}'"
|
513
|
+
loaded = Oj.object_load(json)
|
514
|
+
# puts "*** loaded: #{loaded}"
|
530
515
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
531
516
|
if t.respond_to?(:tv_nsec)
|
532
517
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -543,8 +528,8 @@ class ObjectJuice < Minitest::Test
|
|
543
528
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
544
529
|
# separately along with utc.
|
545
530
|
json = Oj.dump(t, :mode => :object, :time_format => :ruby)
|
546
|
-
#puts json
|
547
|
-
loaded = Oj.object_load(json)
|
531
|
+
# puts json
|
532
|
+
loaded = Oj.object_load(json)
|
548
533
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
549
534
|
if t.respond_to?(:tv_nsec)
|
550
535
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -564,8 +549,8 @@ class ObjectJuice < Minitest::Test
|
|
564
549
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
565
550
|
# separately along with utc.
|
566
551
|
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
567
|
-
#puts json
|
568
|
-
loaded = Oj.object_load(json)
|
552
|
+
# puts json
|
553
|
+
loaded = Oj.object_load(json)
|
569
554
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
570
555
|
if t.respond_to?(:tv_nsec)
|
571
556
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -582,8 +567,8 @@ class ObjectJuice < Minitest::Test
|
|
582
567
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
583
568
|
# separately along with utc.
|
584
569
|
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
585
|
-
#puts json
|
586
|
-
loaded = Oj.object_load(json)
|
570
|
+
# puts json
|
571
|
+
loaded = Oj.object_load(json)
|
587
572
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
588
573
|
if t.respond_to?(:tv_nsec)
|
589
574
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -595,13 +580,13 @@ class ObjectJuice < Minitest::Test
|
|
595
580
|
end
|
596
581
|
|
597
582
|
def test_time_unix_zone_12345
|
598
|
-
t = Time.new(2015, 1, 5, 21, 37, 7.123456789,
|
583
|
+
t = Time.new(2015, 1, 5, 21, 37, 7.123456789, 12_345)
|
599
584
|
# The fractional seconds are not always recreated exactly which causes a
|
600
585
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
601
586
|
# separately along with utc.
|
602
587
|
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
603
|
-
#puts json
|
604
|
-
loaded = Oj.object_load(json)
|
588
|
+
# puts json
|
589
|
+
loaded = Oj.object_load(json)
|
605
590
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
606
591
|
if t.respond_to?(:tv_nsec)
|
607
592
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -618,8 +603,8 @@ class ObjectJuice < Minitest::Test
|
|
618
603
|
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
619
604
|
# separately along with utc.
|
620
605
|
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
621
|
-
#puts json
|
622
|
-
loaded = Oj.object_load(json)
|
606
|
+
# puts json
|
607
|
+
loaded = Oj.object_load(json)
|
623
608
|
assert_equal(t.tv_sec, loaded.tv_sec)
|
624
609
|
if t.respond_to?(:tv_nsec)
|
625
610
|
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
@@ -645,20 +630,20 @@ class ObjectJuice < Minitest::Test
|
|
645
630
|
begin
|
646
631
|
Oj.object_load(json)
|
647
632
|
rescue Exception => e
|
648
|
-
assert_equal(
|
633
|
+
assert_equal('ArgumentError', e.class().name)
|
649
634
|
return
|
650
635
|
end
|
651
|
-
assert(false,
|
636
|
+
assert(false, '*** expected an exception')
|
652
637
|
end
|
653
638
|
|
654
639
|
def test_json_object_not_hat_hash
|
655
640
|
json = %{{"^#x":[1,2]}}
|
656
641
|
h = Oj.object_load(json)
|
657
|
-
assert_equal({1 => 2}, h)
|
642
|
+
assert_equal({1 => 2}, h)
|
658
643
|
|
659
644
|
json = %{{"~#x":[1,2]}}
|
660
645
|
h = Oj.object_load(json)
|
661
|
-
assert_equal({'~#x' => [1,2]}, h)
|
646
|
+
assert_equal({'~#x' => [1, 2]}, h)
|
662
647
|
end
|
663
648
|
|
664
649
|
def test_json_struct
|
@@ -675,14 +660,14 @@ class ObjectJuice < Minitest::Test
|
|
675
660
|
s = Struct.new(:x, :y)
|
676
661
|
obj = s.new(1, 2)
|
677
662
|
json = Oj.dump(obj, :indent => 2, :mode => :object)
|
678
|
-
#puts json
|
679
|
-
loaded = Oj.object_load(json)
|
663
|
+
# puts json
|
664
|
+
loaded = Oj.object_load(json)
|
680
665
|
assert_equal(obj.members, loaded.members)
|
681
666
|
assert_equal(obj.values, loaded.values)
|
682
667
|
end
|
683
668
|
|
684
669
|
def test_json_non_str_hash
|
685
|
-
obj = { 59 =>
|
670
|
+
obj = { 59 => 'young', false => true }
|
686
671
|
dump_and_load(obj, false)
|
687
672
|
end
|
688
673
|
|
@@ -786,24 +771,24 @@ class ObjectJuice < Minitest::Test
|
|
786
771
|
err = e
|
787
772
|
end
|
788
773
|
json = Oj.dump(err, :mode => :object, :indent => 2)
|
789
|
-
#puts "*** #{json}"
|
774
|
+
# puts "*** #{json}"
|
790
775
|
e2 = Oj.load(json, :mode => :strict)
|
791
776
|
assert_equal(err.class.to_s, e2['^o'])
|
792
777
|
assert_equal(err.message, e2['~mesg'])
|
793
778
|
assert_equal(err.backtrace, e2['~bt'])
|
794
779
|
e2 = Oj.load(json, :mode => :object)
|
795
780
|
if 'rubinius' == $ruby
|
796
|
-
assert_equal(e.class, e2.class)
|
797
|
-
assert_equal(e.message, e2.message)
|
798
|
-
assert_equal(e.backtrace, e2.backtrace)
|
781
|
+
assert_equal(e.class, e2.class)
|
782
|
+
assert_equal(e.message, e2.message)
|
783
|
+
assert_equal(e.backtrace, e2.backtrace)
|
799
784
|
else
|
800
|
-
assert_equal(e, e2)
|
785
|
+
assert_equal(e, e2)
|
801
786
|
end
|
802
787
|
end
|
803
788
|
|
804
|
-
class SubX <
|
789
|
+
class SubX < StandardError
|
805
790
|
def initialize
|
806
|
-
super(
|
791
|
+
super('sub')
|
807
792
|
@xyz = 123
|
808
793
|
end
|
809
794
|
end
|
@@ -816,22 +801,22 @@ class ObjectJuice < Minitest::Test
|
|
816
801
|
err = e
|
817
802
|
end
|
818
803
|
json = Oj.dump(err, :mode => :object, :indent => 2)
|
819
|
-
#puts "*** #{json}"
|
804
|
+
# puts "*** #{json}"
|
820
805
|
e2 = Oj.load(json, :mode => :strict)
|
821
806
|
assert_equal(err.class.to_s, e2['^o'])
|
822
807
|
assert_equal(err.message, e2['~mesg'])
|
823
808
|
assert_equal(err.backtrace, e2['~bt'])
|
824
809
|
e2 = Oj.load(json, :mode => :object)
|
825
|
-
assert_equal(e, e2)
|
810
|
+
assert_equal(e, e2)
|
826
811
|
end
|
827
812
|
|
828
813
|
def test_range_object
|
829
814
|
Oj.default_options = { :mode => :object }
|
830
815
|
json = Oj.dump(1..7, :mode => :object, :indent => 0)
|
831
|
-
if '
|
832
|
-
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
833
|
-
else
|
816
|
+
if 'ruby' == $ruby
|
834
817
|
assert_equal(%{{"^u":["Range",1,7,false]}}, json)
|
818
|
+
else
|
819
|
+
assert_equal(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}}, json)
|
835
820
|
end
|
836
821
|
dump_and_load(1..7, false)
|
837
822
|
dump_and_load(1..1, false)
|
@@ -846,7 +831,6 @@ class ObjectJuice < Minitest::Test
|
|
846
831
|
assert_equal(h2['b'].__id__, h2.__id__)
|
847
832
|
end
|
848
833
|
|
849
|
-
|
850
834
|
def test_json_object_missing_fields
|
851
835
|
json = %{{ "^u": [ "ObjectJuice::Stuck",1]}}
|
852
836
|
|
@@ -964,7 +948,21 @@ class ObjectJuice < Minitest::Test
|
|
964
948
|
|
965
949
|
def test_odd_datetime
|
966
950
|
dump_and_load(DateTime.new(2012, 6, 19, 13, 5, Rational(4, 3)), false)
|
967
|
-
dump_and_load(DateTime.new(2012, 6, 19, 13, 5, Rational(
|
951
|
+
dump_and_load(DateTime.new(2012, 6, 19, 13, 5, Rational(7_123_456_789, 1_000_000_000)), false)
|
952
|
+
end
|
953
|
+
|
954
|
+
def test_odd_xml_time
|
955
|
+
str = "2023-01-01T00:00:00Z"
|
956
|
+
assert_equal(Time.parse(str), Oj.load('{"^t":"' + str + '"}', mode: :object))
|
957
|
+
|
958
|
+
str = "2023-01-01T00:00:00.3Z"
|
959
|
+
assert_equal(Time.parse(str), Oj.load('{"^t":"' + str + '"}', mode: :object))
|
960
|
+
|
961
|
+
str = "2023-01-01T00:00:00.123456789123456789Z"
|
962
|
+
assert_equal(Time.parse(str), Oj.load('{"^t":"' + str + '"}', mode: :object))
|
963
|
+
|
964
|
+
str = "2023-01-01T00:00:00.123456789123456789123456789Z"
|
965
|
+
assert_equal(Time.parse(str), Oj.load('{"^t":"' + str + '"}', mode: :object))
|
968
966
|
end
|
969
967
|
|
970
968
|
def test_bag
|
@@ -974,13 +972,13 @@ class ObjectJuice < Minitest::Test
|
|
974
972
|
"y":58 }}
|
975
973
|
obj = Oj.load(json, :mode => :object, :auto_define => true)
|
976
974
|
assert_equal('ObjectJuice::Jem', obj.class.name)
|
977
|
-
|
975
|
+
assert(obj.x)
|
978
976
|
assert_equal(58, obj.y)
|
979
977
|
end
|
980
978
|
|
981
979
|
def test_odd_string
|
982
980
|
Oj.register_odd(Strung, Strung, :create, :to_s, 'safe?')
|
983
|
-
s = Strung.new(
|
981
|
+
s = Strung.new('Pete', true)
|
984
982
|
dump_and_load(s, false)
|
985
983
|
end
|
986
984
|
|
@@ -1001,7 +999,7 @@ class ObjectJuice < Minitest::Test
|
|
1001
999
|
end
|
1002
1000
|
|
1003
1001
|
def test_auto_string
|
1004
|
-
s = AutoStrung.new(
|
1002
|
+
s = AutoStrung.new('Pete', true)
|
1005
1003
|
dump_and_load(s, false)
|
1006
1004
|
end
|
1007
1005
|
|
@@ -1020,7 +1018,7 @@ class ObjectJuice < Minitest::Test
|
|
1020
1018
|
def dump_and_load(obj, trace=false)
|
1021
1019
|
json = Oj.dump(obj, :indent => 2, :mode => :object)
|
1022
1020
|
puts json if trace
|
1023
|
-
loaded = Oj.object_load(json)
|
1021
|
+
loaded = Oj.object_load(json)
|
1024
1022
|
if obj.nil?
|
1025
1023
|
assert_nil(loaded)
|
1026
1024
|
else
|
data/test/test_parser.rb
CHANGED
@@ -1,27 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
|
+
@oj_dir = File.dirname(File.expand_path(__dir__))
|
6
6
|
%w(lib ext).each do |dir|
|
7
|
-
|
7
|
+
$LOAD_PATH << File.join(@oj_dir, dir)
|
8
8
|
end
|
9
9
|
|
10
|
-
require '
|
11
|
-
require '
|
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
|
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
|