oj 3.16.9 → 3.16.10
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 +5 -0
- data/ext/oj/fast.c +3 -6
- data/ext/oj/mimic_json.c +3 -6
- data/ext/oj/oj.c +2 -4
- data/ext/oj/parse.c +15 -5
- data/ext/oj/parser.c +1 -1
- data/ext/oj/parser.h +2 -0
- data/ext/oj/rails.c +1 -2
- data/ext/oj/saj.c +3 -6
- data/ext/oj/scp.c +3 -6
- data/ext/oj/stream_writer.c +1 -7
- data/ext/oj/strict.c +2 -4
- data/ext/oj/string_writer.c +1 -3
- data/lib/oj/version.rb +1 -1
- metadata +3 -98
- data/test/_test_active.rb +0 -75
- data/test/_test_active_mimic.rb +0 -95
- data/test/_test_mimic_rails.rb +0 -123
- data/test/activerecord/result_test.rb +0 -31
- data/test/activesupport6/abstract_unit.rb +0 -44
- data/test/activesupport6/decoding_test.rb +0 -133
- data/test/activesupport6/encoding_test.rb +0 -542
- data/test/activesupport6/encoding_test_cases.rb +0 -98
- data/test/activesupport6/test_common.rb +0 -17
- data/test/activesupport6/test_helper.rb +0 -163
- data/test/activesupport6/time_zone_test_helpers.rb +0 -39
- data/test/activesupport7/abstract_unit.rb +0 -52
- data/test/activesupport7/decoding_test.rb +0 -125
- data/test/activesupport7/encoding_test.rb +0 -536
- data/test/activesupport7/encoding_test_cases.rb +0 -104
- data/test/activesupport7/time_zone_test_helpers.rb +0 -47
- data/test/files.rb +0 -29
- data/test/foo.rb +0 -26
- data/test/helper.rb +0 -39
- data/test/isolated/shared.rb +0 -309
- data/test/isolated/test_mimic_after.rb +0 -13
- data/test/isolated/test_mimic_alone.rb +0 -12
- data/test/isolated/test_mimic_as_json.rb +0 -45
- data/test/isolated/test_mimic_before.rb +0 -13
- data/test/isolated/test_mimic_define.rb +0 -28
- data/test/isolated/test_mimic_rails_after.rb +0 -22
- data/test/isolated/test_mimic_rails_before.rb +0 -21
- data/test/isolated/test_mimic_redefine.rb +0 -15
- data/test/json_gem/json_addition_test.rb +0 -216
- data/test/json_gem/json_common_interface_test.rb +0 -155
- data/test/json_gem/json_encoding_test.rb +0 -107
- data/test/json_gem/json_ext_parser_test.rb +0 -21
- data/test/json_gem/json_fixtures_test.rb +0 -36
- data/test/json_gem/json_generator_test.rb +0 -413
- data/test/json_gem/json_generic_object_test.rb +0 -90
- data/test/json_gem/json_parser_test.rb +0 -477
- data/test/json_gem/json_string_matching_test.rb +0 -42
- data/test/json_gem/test_helper.rb +0 -30
- data/test/mem.rb +0 -34
- data/test/perf.rb +0 -102
- data/test/perf_compat.rb +0 -128
- data/test/perf_dump.rb +0 -50
- data/test/perf_fast.rb +0 -162
- data/test/perf_file.rb +0 -62
- data/test/perf_object.rb +0 -134
- data/test/perf_once.rb +0 -59
- data/test/perf_parser.rb +0 -183
- data/test/perf_saj.rb +0 -101
- data/test/perf_scp.rb +0 -140
- data/test/perf_simple.rb +0 -289
- data/test/perf_strict.rb +0 -137
- data/test/perf_wab.rb +0 -129
- data/test/prec.rb +0 -23
- data/test/sample/change.rb +0 -13
- data/test/sample/dir.rb +0 -18
- data/test/sample/doc.rb +0 -35
- data/test/sample/file.rb +0 -47
- data/test/sample/group.rb +0 -15
- data/test/sample/hasprops.rb +0 -15
- data/test/sample/layer.rb +0 -11
- data/test/sample/line.rb +0 -20
- data/test/sample/oval.rb +0 -10
- data/test/sample/rect.rb +0 -9
- data/test/sample/shape.rb +0 -34
- data/test/sample/text.rb +0 -19
- data/test/sample.rb +0 -54
- data/test/sample_json.rb +0 -37
- data/test/test_compat.rb +0 -567
- data/test/test_custom.rb +0 -555
- data/test/test_debian.rb +0 -50
- data/test/test_fast.rb +0 -526
- data/test/test_file.rb +0 -250
- data/test/test_gc.rb +0 -60
- data/test/test_generate.rb +0 -21
- data/test/test_hash.rb +0 -39
- data/test/test_integer_range.rb +0 -72
- data/test/test_null.rb +0 -376
- data/test/test_object.rb +0 -1030
- data/test/test_parser.rb +0 -11
- data/test/test_parser_debug.rb +0 -27
- data/test/test_parser_saj.rb +0 -337
- data/test/test_parser_usual.rb +0 -255
- data/test/test_rails.rb +0 -35
- data/test/test_saj.rb +0 -188
- data/test/test_scp.rb +0 -431
- data/test/test_strict.rb +0 -441
- data/test/test_various.rb +0 -801
- data/test/test_wab.rb +0 -311
- data/test/test_writer.rb +0 -396
- data/test/tests.rb +0 -33
- data/test/tests_mimic.rb +0 -23
- data/test/tests_mimic_addition.rb +0 -16
data/test/test_object.rb
DELETED
@@ -1,1030 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
$LOAD_PATH << __dir__
|
5
|
-
|
6
|
-
require 'helper'
|
7
|
-
|
8
|
-
class ObjectJuice < Minitest::Test
|
9
|
-
class Jeez
|
10
|
-
attr_accessor :x, :y, :_z
|
11
|
-
|
12
|
-
def initialize(x, y)
|
13
|
-
@x = x
|
14
|
-
@y = y
|
15
|
-
@_z = x.to_s
|
16
|
-
end
|
17
|
-
|
18
|
-
def eql?(o)
|
19
|
-
self.class == o.class && @x == o.x && @y == o.y
|
20
|
-
end
|
21
|
-
alias == eql?
|
22
|
-
|
23
|
-
def to_json(*_a)
|
24
|
-
%{{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}}
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.json_create(h)
|
28
|
-
new(h['x'], h['y'])
|
29
|
-
end
|
30
|
-
end # Jeez
|
31
|
-
|
32
|
-
class Jam
|
33
|
-
attr_accessor :x, :y
|
34
|
-
|
35
|
-
def initialize(x, y)
|
36
|
-
@x = x
|
37
|
-
@y = y
|
38
|
-
end
|
39
|
-
|
40
|
-
def eql?(o)
|
41
|
-
self.class == o.class && @x == o.x && @y == o.y
|
42
|
-
end
|
43
|
-
alias == eql?
|
44
|
-
|
45
|
-
end # Jam
|
46
|
-
|
47
|
-
class Jazz < Jam
|
48
|
-
|
49
|
-
def to_hash
|
50
|
-
{ 'json_class' => self.class.to_s, 'x' => @x, 'y' => @y }
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.json_create(h)
|
54
|
-
new(h['x'], h['y'])
|
55
|
-
end
|
56
|
-
end # Jazz
|
57
|
-
|
58
|
-
class Orange < Jam
|
59
|
-
|
60
|
-
def as_json
|
61
|
-
{ :json_class => self.class,
|
62
|
-
:x => @x,
|
63
|
-
:y => @y }
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.json_create(h)
|
67
|
-
new(h['x'], h['y'])
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
module One
|
72
|
-
module Two
|
73
|
-
module Three
|
74
|
-
class Deep
|
75
|
-
|
76
|
-
def eql?(o)
|
77
|
-
self.class == o.class
|
78
|
-
end
|
79
|
-
alias == eql?
|
80
|
-
|
81
|
-
def to_hash
|
82
|
-
{'json_class' => self.class.name.to_s}
|
83
|
-
end
|
84
|
-
|
85
|
-
def to_json(*_a)
|
86
|
-
%{{"json_class":"#{self.class.name}"}}
|
87
|
-
end
|
88
|
-
|
89
|
-
def self.json_create(_h)
|
90
|
-
new()
|
91
|
-
end
|
92
|
-
end # Deep
|
93
|
-
end # Three
|
94
|
-
end # Two
|
95
|
-
|
96
|
-
class Stuck2 < Struct.new(:a, :b)
|
97
|
-
end
|
98
|
-
end # One
|
99
|
-
|
100
|
-
class Stuck < Struct.new(:a, :b)
|
101
|
-
end
|
102
|
-
|
103
|
-
class Strung < String
|
104
|
-
|
105
|
-
def initialize(str, safe)
|
106
|
-
super(str)
|
107
|
-
@safe = safe
|
108
|
-
end
|
109
|
-
|
110
|
-
def safe?
|
111
|
-
@safe
|
112
|
-
end
|
113
|
-
|
114
|
-
def self.create(str, safe)
|
115
|
-
new(str, safe)
|
116
|
-
end
|
117
|
-
|
118
|
-
def eql?(o)
|
119
|
-
super && self.class == o.class && @safe == o.safe?
|
120
|
-
end
|
121
|
-
alias == eql?
|
122
|
-
|
123
|
-
def inspect
|
124
|
-
super + '(' + @safe + ')'
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
class AutoStrung < String
|
129
|
-
attr_accessor :safe
|
130
|
-
|
131
|
-
def initialize(str, safe)
|
132
|
-
super(str)
|
133
|
-
@safe = safe
|
134
|
-
end
|
135
|
-
|
136
|
-
def eql?(o)
|
137
|
-
self.class == o.class && super(o) && @safe == o.safe
|
138
|
-
end
|
139
|
-
alias == eql?
|
140
|
-
end
|
141
|
-
|
142
|
-
class AutoArray < Array
|
143
|
-
attr_accessor :safe
|
144
|
-
|
145
|
-
def initialize(a, safe)
|
146
|
-
super(a)
|
147
|
-
@safe = safe
|
148
|
-
end
|
149
|
-
|
150
|
-
def eql?(o)
|
151
|
-
self.class == o.class && super(o) && @safe == o.safe
|
152
|
-
end
|
153
|
-
alias == eql?
|
154
|
-
end
|
155
|
-
|
156
|
-
class AutoHash < Hash
|
157
|
-
attr_accessor :safe
|
158
|
-
|
159
|
-
def initialize(h, safe)
|
160
|
-
super(h)
|
161
|
-
@safe = safe
|
162
|
-
end
|
163
|
-
|
164
|
-
def eql?(o)
|
165
|
-
self.class == o.class && super(o) && @safe == o.safe
|
166
|
-
end
|
167
|
-
alias == eql?
|
168
|
-
end
|
169
|
-
|
170
|
-
class Raw
|
171
|
-
attr_accessor :json
|
172
|
-
|
173
|
-
def initialize(j)
|
174
|
-
@json = j
|
175
|
-
end
|
176
|
-
|
177
|
-
def to_json(*_a)
|
178
|
-
@json
|
179
|
-
end
|
180
|
-
|
181
|
-
def self.create(h)
|
182
|
-
h
|
183
|
-
end
|
184
|
-
end # Raw
|
185
|
-
|
186
|
-
module Ichi
|
187
|
-
module Ni
|
188
|
-
def self.direct(h)
|
189
|
-
h
|
190
|
-
end
|
191
|
-
|
192
|
-
module San
|
193
|
-
class Shi
|
194
|
-
|
195
|
-
attr_accessor :hash
|
196
|
-
|
197
|
-
def initialize(h)
|
198
|
-
@hash = h
|
199
|
-
end
|
200
|
-
|
201
|
-
def dump
|
202
|
-
@hash
|
203
|
-
end
|
204
|
-
|
205
|
-
end # Shi
|
206
|
-
end # San
|
207
|
-
end # Ni
|
208
|
-
end # Ichi
|
209
|
-
|
210
|
-
def setup
|
211
|
-
@default_options = Oj.default_options
|
212
|
-
end
|
213
|
-
|
214
|
-
def teardown
|
215
|
-
Oj.default_options = @default_options
|
216
|
-
end
|
217
|
-
|
218
|
-
def test_nil
|
219
|
-
dump_and_load(nil, false)
|
220
|
-
end
|
221
|
-
|
222
|
-
def test_true
|
223
|
-
dump_and_load(true, false)
|
224
|
-
end
|
225
|
-
|
226
|
-
def test_false
|
227
|
-
dump_and_load(false, false)
|
228
|
-
end
|
229
|
-
|
230
|
-
def test_fixnum
|
231
|
-
dump_and_load(0, false)
|
232
|
-
dump_and_load(12_345, false)
|
233
|
-
dump_and_load(-54_321, false)
|
234
|
-
dump_and_load(1, false)
|
235
|
-
end
|
236
|
-
|
237
|
-
def test_float
|
238
|
-
dump_and_load(0.0, false)
|
239
|
-
dump_and_load(12_345.6789, false)
|
240
|
-
dump_and_load(70.35, false)
|
241
|
-
dump_and_load(-54_321.012, false)
|
242
|
-
dump_and_load(1.7775, false)
|
243
|
-
dump_and_load(2.5024, false)
|
244
|
-
dump_and_load(2.48e16, false)
|
245
|
-
dump_and_load(2.48e100 * 1.0e10, false)
|
246
|
-
dump_and_load(-2.48e100 * 1.0e10, false)
|
247
|
-
dump_and_load(1/0.0, false)
|
248
|
-
# NaN does not always == NaN
|
249
|
-
json = Oj.dump(0/0.0, :mode => :object)
|
250
|
-
assert_equal('3.3e14159265358979323846', json)
|
251
|
-
loaded = Oj.load(json)
|
252
|
-
assert_predicate(loaded, :nan?)
|
253
|
-
end
|
254
|
-
|
255
|
-
def test_string
|
256
|
-
dump_and_load('', false)
|
257
|
-
dump_and_load('abc', false)
|
258
|
-
dump_and_load("abc\ndef", false)
|
259
|
-
dump_and_load("a\u0041", false)
|
260
|
-
end
|
261
|
-
|
262
|
-
def test_symbol
|
263
|
-
dump_and_load(:abc, false)
|
264
|
-
dump_and_load(':abc', false)
|
265
|
-
dump_and_load(:":xyz", false)
|
266
|
-
end
|
267
|
-
|
268
|
-
def test_encode
|
269
|
-
opts = Oj.default_options
|
270
|
-
Oj.default_options = { :ascii_only => false }
|
271
|
-
dump_and_load('ぴーたー', false)
|
272
|
-
Oj.default_options = { :ascii_only => true }
|
273
|
-
json = Oj.dump('ぴーたー')
|
274
|
-
assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
|
275
|
-
dump_and_load('ぴーたー', false)
|
276
|
-
Oj.default_options = opts
|
277
|
-
end
|
278
|
-
|
279
|
-
def test_unicode
|
280
|
-
# hits the 3 normal ranges and one extended surrogate pair
|
281
|
-
json = %{"\\u019f\\u05e9\\u3074\\ud834\\udd1e"}
|
282
|
-
obj = Oj.load(json)
|
283
|
-
json2 = Oj.dump(obj, :ascii_only => true)
|
284
|
-
assert_equal(json, json2)
|
285
|
-
end
|
286
|
-
|
287
|
-
def test_array
|
288
|
-
dump_and_load([], false)
|
289
|
-
dump_and_load([true, false], false)
|
290
|
-
dump_and_load(['a', 1, nil], false)
|
291
|
-
dump_and_load([[nil]], false)
|
292
|
-
dump_and_load([[nil], 58], false)
|
293
|
-
end
|
294
|
-
|
295
|
-
def test_array_deep
|
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)
|
297
|
-
end
|
298
|
-
|
299
|
-
# Hash
|
300
|
-
def test_hash
|
301
|
-
dump_and_load({}, false)
|
302
|
-
dump_and_load({ 'true' => true, 'false' => false}, false)
|
303
|
-
dump_and_load({ 'true' => true, 'array' => [], 'hash' => { }}, false)
|
304
|
-
end
|
305
|
-
|
306
|
-
def test_hash_deep
|
307
|
-
dump_and_load({'1' => {
|
308
|
-
'2' => {
|
309
|
-
'3' => {
|
310
|
-
'4' => {
|
311
|
-
'5' => {
|
312
|
-
'6' => {
|
313
|
-
'7' => {
|
314
|
-
'8' => {
|
315
|
-
'9' => {
|
316
|
-
'10' => {
|
317
|
-
'11' => {
|
318
|
-
'12' => {
|
319
|
-
'13' => {
|
320
|
-
'14' => {
|
321
|
-
'15' => {
|
322
|
-
'16' => {
|
323
|
-
'17' => {
|
324
|
-
'18' => {
|
325
|
-
'19' => {
|
326
|
-
'20' => {}}}}}}}}}}}}}}}}}}}}}, false)
|
327
|
-
end
|
328
|
-
|
329
|
-
def test_hash_escaped_key
|
330
|
-
json = %{{"a\nb":true,"c\td":false}}
|
331
|
-
obj = Oj.object_load(json)
|
332
|
-
assert_equal({"a\nb" => true, "c\td" => false}, obj)
|
333
|
-
end
|
334
|
-
|
335
|
-
def test_bignum_object
|
336
|
-
dump_and_load(7 ** 55, false)
|
337
|
-
end
|
338
|
-
|
339
|
-
# BigDecimal
|
340
|
-
def test_bigdecimal_object
|
341
|
-
dump_and_load(BigDecimal('3.14159265358979323846'), false)
|
342
|
-
end
|
343
|
-
|
344
|
-
def test_bigdecimal_load
|
345
|
-
orig = BigDecimal('80.51')
|
346
|
-
json = Oj.dump(orig, :mode => :object, :bigdecimal_as_decimal => true)
|
347
|
-
bg = Oj.load(json, :mode => :object, :bigdecimal_load => true)
|
348
|
-
assert_equal(BigDecimal, bg.class)
|
349
|
-
assert_equal(orig, bg)
|
350
|
-
# Infinity is the same for Float and BigDecimal
|
351
|
-
json = Oj.dump(BigDecimal('Infinity'), :mode => :object)
|
352
|
-
assert_equal('Infinity', json)
|
353
|
-
json = Oj.dump(BigDecimal('-Infinity'), :mode => :object)
|
354
|
-
assert_equal('-Infinity', json)
|
355
|
-
end
|
356
|
-
|
357
|
-
# Stream IO
|
358
|
-
def test_io_string
|
359
|
-
json = %{{
|
360
|
-
"x":true,
|
361
|
-
"y":58,
|
362
|
-
"z": [1,2,3]
|
363
|
-
}
|
364
|
-
}
|
365
|
-
input = StringIO.new(json)
|
366
|
-
obj = Oj.object_load(input)
|
367
|
-
assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
|
368
|
-
end
|
369
|
-
|
370
|
-
def test_io_file
|
371
|
-
filename = File.join(__dir__, 'open_file_test.json')
|
372
|
-
File.write(filename, %{{
|
373
|
-
"x":true,
|
374
|
-
"y":58,
|
375
|
-
"z": [1,2,3]
|
376
|
-
}
|
377
|
-
})
|
378
|
-
f = File.new(filename)
|
379
|
-
obj = Oj.object_load(f)
|
380
|
-
f.close()
|
381
|
-
assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
|
382
|
-
end
|
383
|
-
|
384
|
-
# symbol_keys option
|
385
|
-
def test_symbol_keys
|
386
|
-
json = %{{
|
387
|
-
"x":true,
|
388
|
-
"y":58,
|
389
|
-
"z": [1,2,3]
|
390
|
-
}
|
391
|
-
}
|
392
|
-
obj = Oj.object_load(json, :symbol_keys => true)
|
393
|
-
assert_equal({ :x => true, :y => 58, :z => [1, 2, 3]}, obj)
|
394
|
-
end
|
395
|
-
|
396
|
-
def test_class_object
|
397
|
-
dump_and_load(ObjectJuice, false)
|
398
|
-
end
|
399
|
-
|
400
|
-
def test_module_object
|
401
|
-
dump_and_load(One, false)
|
402
|
-
end
|
403
|
-
|
404
|
-
def test_non_str_hash_object
|
405
|
-
json = Oj.dump({ 1 => true, :sim => nil }, :mode => :object)
|
406
|
-
h = Oj.load(json, :mode => :strict)
|
407
|
-
assert_equal({'^#1' => [1, true], ':sim' => nil}, h)
|
408
|
-
h = Oj.load(json, :mode => :object)
|
409
|
-
assert_equal({ 1 => true, :sim => nil }, h)
|
410
|
-
end
|
411
|
-
|
412
|
-
# comments
|
413
|
-
def test_comment_slash
|
414
|
-
json = %{{
|
415
|
-
"x":true,//three
|
416
|
-
"y":58,
|
417
|
-
"z": [1,2,
|
418
|
-
3 // six
|
419
|
-
]}
|
420
|
-
}
|
421
|
-
obj = Oj.object_load(json)
|
422
|
-
assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
|
423
|
-
end
|
424
|
-
|
425
|
-
def test_comment_c
|
426
|
-
json = %{{
|
427
|
-
"x"/*one*/:/*two*/true,
|
428
|
-
"y":58,
|
429
|
-
"z": [1,2,3]}
|
430
|
-
}
|
431
|
-
obj = Oj.object_load(json)
|
432
|
-
assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
|
433
|
-
end
|
434
|
-
|
435
|
-
def test_comment
|
436
|
-
json = %{{
|
437
|
-
"x"/*one*/:/*two*/true,//three
|
438
|
-
"y":58/*four*/,
|
439
|
-
"z": [1,2/*five*/,
|
440
|
-
3 // six
|
441
|
-
]
|
442
|
-
}
|
443
|
-
}
|
444
|
-
obj = Oj.object_load(json)
|
445
|
-
assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
|
446
|
-
end
|
447
|
-
|
448
|
-
def test_json_module_object
|
449
|
-
obj = One::Two::Three::Deep.new()
|
450
|
-
dump_and_load(obj, false)
|
451
|
-
end
|
452
|
-
|
453
|
-
def test_xml_time
|
454
|
-
t = Time.new(2015, 1, 5, 21, 37, 7.123456789, -8 * 3600)
|
455
|
-
# The fractional seconds are not always recreated exactly which causes a
|
456
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
457
|
-
# separately along with utc.
|
458
|
-
json = Oj.dump(t, :mode => :object, :time_format => :xmlschema)
|
459
|
-
# puts "*** json for test_xml_time '#{json}'"
|
460
|
-
loaded = Oj.object_load(json)
|
461
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
462
|
-
if t.respond_to?(:tv_nsec)
|
463
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
464
|
-
else
|
465
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
466
|
-
end
|
467
|
-
assert_equal(t.utc?, loaded.utc?)
|
468
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
469
|
-
end
|
470
|
-
|
471
|
-
def test_xml_time_utc
|
472
|
-
t = Time.utc(2015, 1, 5, 21, 37, 7.123456789)
|
473
|
-
# The fractional seconds are not always recreated exactly which causes a
|
474
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
475
|
-
# separately along with utc.
|
476
|
-
json = Oj.dump(t, :mode => :object, :time_format => :xmlschema)
|
477
|
-
loaded = Oj.object_load(json)
|
478
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
479
|
-
if t.respond_to?(:tv_nsec)
|
480
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
481
|
-
else
|
482
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
483
|
-
end
|
484
|
-
assert_equal(t.utc?, loaded.utc?)
|
485
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
486
|
-
end
|
487
|
-
|
488
|
-
def test_ruby_time
|
489
|
-
t = Time.new(2015, 1, 5, 21, 37, 7.123456789, -8 * 3600)
|
490
|
-
# The fractional seconds are not always recreated exactly which causes a
|
491
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
492
|
-
# separately along with utc.
|
493
|
-
json = Oj.dump(t, :mode => :object, :time_format => :ruby)
|
494
|
-
# puts "*** json for test_ruby_time '#{json}'"
|
495
|
-
loaded = Oj.object_load(json)
|
496
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
497
|
-
if t.respond_to?(:tv_nsec)
|
498
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
499
|
-
else
|
500
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
501
|
-
end
|
502
|
-
assert_equal(t.utc?, loaded.utc?)
|
503
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
504
|
-
end
|
505
|
-
|
506
|
-
def test_ruby_time_12345
|
507
|
-
t = Time.new(2015, 1, 5, 21, 37, 7.123456789, 12_345/60*60)
|
508
|
-
# The fractional seconds are not always recreated exactly which causes a
|
509
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
510
|
-
# separately along with utc.
|
511
|
-
json = Oj.dump(t, :mode => :object, :time_format => :ruby)
|
512
|
-
# puts "*** json for test_ruby_time '#{json}'"
|
513
|
-
loaded = Oj.object_load(json)
|
514
|
-
# puts "*** loaded: #{loaded}"
|
515
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
516
|
-
if t.respond_to?(:tv_nsec)
|
517
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
518
|
-
else
|
519
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
520
|
-
end
|
521
|
-
assert_equal(t.utc?, loaded.utc?)
|
522
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
523
|
-
end
|
524
|
-
|
525
|
-
def test_ruby_time_utc
|
526
|
-
t = Time.utc(2015, 1, 5, 21, 37, 7.123456789)
|
527
|
-
# The fractional seconds are not always recreated exactly which causes a
|
528
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
529
|
-
# separately along with utc.
|
530
|
-
json = Oj.dump(t, :mode => :object, :time_format => :ruby)
|
531
|
-
# puts json
|
532
|
-
loaded = Oj.object_load(json)
|
533
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
534
|
-
if t.respond_to?(:tv_nsec)
|
535
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
536
|
-
else
|
537
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
538
|
-
end
|
539
|
-
assert_equal(t.utc?, loaded.utc?)
|
540
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
541
|
-
end
|
542
|
-
|
543
|
-
def test_time_early
|
544
|
-
# Windows does not support dates before 1970.
|
545
|
-
return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
546
|
-
|
547
|
-
t = Time.new(1954, 1, 5, 21, 37, 7.123456789, -8 * 3600)
|
548
|
-
# The fractional seconds are not always recreated exactly which causes a
|
549
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
550
|
-
# separately along with utc.
|
551
|
-
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
552
|
-
# puts json
|
553
|
-
loaded = Oj.object_load(json)
|
554
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
555
|
-
if t.respond_to?(:tv_nsec)
|
556
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
557
|
-
else
|
558
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
559
|
-
end
|
560
|
-
assert_equal(t.utc?, loaded.utc?)
|
561
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
562
|
-
end
|
563
|
-
|
564
|
-
def test_time_unix_zone
|
565
|
-
t = Time.new(2015, 1, 5, 21, 37, 7.123456789, -8 * 3600)
|
566
|
-
# The fractional seconds are not always recreated exactly which causes a
|
567
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
568
|
-
# separately along with utc.
|
569
|
-
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
570
|
-
# puts json
|
571
|
-
loaded = Oj.object_load(json)
|
572
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
573
|
-
if t.respond_to?(:tv_nsec)
|
574
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
575
|
-
else
|
576
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
577
|
-
end
|
578
|
-
assert_equal(t.utc?, loaded.utc?)
|
579
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
580
|
-
end
|
581
|
-
|
582
|
-
def test_time_unix_zone_12345
|
583
|
-
t = Time.new(2015, 1, 5, 21, 37, 7.123456789, 12_345)
|
584
|
-
# The fractional seconds are not always recreated exactly which causes a
|
585
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
586
|
-
# separately along with utc.
|
587
|
-
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
588
|
-
# puts json
|
589
|
-
loaded = Oj.object_load(json)
|
590
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
591
|
-
if t.respond_to?(:tv_nsec)
|
592
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
593
|
-
else
|
594
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
595
|
-
end
|
596
|
-
assert_equal(t.utc?, loaded.utc?)
|
597
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
598
|
-
end
|
599
|
-
|
600
|
-
def test_time_unix_zone_utc
|
601
|
-
t = Time.utc(2015, 1, 5, 21, 37, 7.123456789)
|
602
|
-
# The fractional seconds are not always recreated exactly which causes a
|
603
|
-
# mismatch so instead the seconds, nsecs, and gmt_offset are checked
|
604
|
-
# separately along with utc.
|
605
|
-
json = Oj.dump(t, :mode => :object, :time_format => :unix_zone)
|
606
|
-
# puts json
|
607
|
-
loaded = Oj.object_load(json)
|
608
|
-
assert_equal(t.tv_sec, loaded.tv_sec)
|
609
|
-
if t.respond_to?(:tv_nsec)
|
610
|
-
assert_equal(t.tv_nsec, loaded.tv_nsec)
|
611
|
-
else
|
612
|
-
assert_equal(t.tv_usec, loaded.tv_usec)
|
613
|
-
end
|
614
|
-
assert_equal(t.utc?, loaded.utc?)
|
615
|
-
assert_equal(t.utc_offset, loaded.utc_offset)
|
616
|
-
end
|
617
|
-
|
618
|
-
def test_json_object
|
619
|
-
obj = Jeez.new(true, 58)
|
620
|
-
dump_and_load(obj, false)
|
621
|
-
end
|
622
|
-
|
623
|
-
def test_json_object_create_deep
|
624
|
-
obj = One::Two::Three::Deep.new()
|
625
|
-
dump_and_load(obj, false)
|
626
|
-
end
|
627
|
-
|
628
|
-
def test_json_object_bad
|
629
|
-
json = %{{"^o":"Junk","x":true}}
|
630
|
-
begin
|
631
|
-
Oj.object_load(json)
|
632
|
-
rescue Exception => e
|
633
|
-
assert_equal('ArgumentError', e.class().name)
|
634
|
-
return
|
635
|
-
end
|
636
|
-
assert(false, '*** expected an exception')
|
637
|
-
end
|
638
|
-
|
639
|
-
def test_json_object_not_hat_hash
|
640
|
-
json = %{{"^#x":[1,2]}}
|
641
|
-
h = Oj.object_load(json)
|
642
|
-
assert_equal({1 => 2}, h)
|
643
|
-
|
644
|
-
json = %{{"~#x":[1,2]}}
|
645
|
-
h = Oj.object_load(json)
|
646
|
-
assert_equal({'~#x' => [1, 2]}, h)
|
647
|
-
end
|
648
|
-
|
649
|
-
def test_json_struct
|
650
|
-
obj = Stuck.new(false, 7)
|
651
|
-
dump_and_load(obj, false)
|
652
|
-
end
|
653
|
-
|
654
|
-
def test_json_struct2
|
655
|
-
obj = One::Stuck2.new(false, 7)
|
656
|
-
dump_and_load(obj, false)
|
657
|
-
end
|
658
|
-
|
659
|
-
def test_json_anonymous_struct
|
660
|
-
s = Struct.new(:x, :y)
|
661
|
-
obj = s.new(1, 2)
|
662
|
-
json = Oj.dump(obj, :indent => 2, :mode => :object)
|
663
|
-
# puts json
|
664
|
-
loaded = Oj.object_load(json)
|
665
|
-
assert_equal(obj.members, loaded.members)
|
666
|
-
assert_equal(obj.values, loaded.values)
|
667
|
-
end
|
668
|
-
|
669
|
-
def test_json_non_str_hash
|
670
|
-
obj = { 59 => 'young', false => true }
|
671
|
-
dump_and_load(obj, false)
|
672
|
-
end
|
673
|
-
|
674
|
-
def test_mixed_hash_object
|
675
|
-
Oj.default_options = { :mode => :object }
|
676
|
-
json = Oj.dump({ 1 => true, 'nil' => nil, :sim => 4 })
|
677
|
-
h = Oj.object_load(json)
|
678
|
-
assert_equal({ 1 => true, 'nil' => nil, :sim => 4 }, h)
|
679
|
-
end
|
680
|
-
|
681
|
-
def test_json_object_object
|
682
|
-
obj = Jeez.new(true, 58)
|
683
|
-
json = Oj.dump(obj, mode: :object, indent: 2, ignore_under: true)
|
684
|
-
assert(%{{
|
685
|
-
"^o":"ObjectJuice::Jeez",
|
686
|
-
"x":true,
|
687
|
-
"y":58
|
688
|
-
}
|
689
|
-
} == json ||
|
690
|
-
%{{
|
691
|
-
"^o":"ObjectJuice::Jeez",
|
692
|
-
"y":58,
|
693
|
-
"x":true
|
694
|
-
}
|
695
|
-
} == json)
|
696
|
-
obj2 = Oj.load(json, :mode => :object)
|
697
|
-
assert_equal(obj, obj2)
|
698
|
-
end
|
699
|
-
|
700
|
-
def test_to_hash_object_object
|
701
|
-
obj = Jazz.new(true, 58)
|
702
|
-
json = Oj.dump(obj, :mode => :object, :indent => 2)
|
703
|
-
assert(%{{
|
704
|
-
"^o":"ObjectJuice::Jazz",
|
705
|
-
"x":true,
|
706
|
-
"y":58
|
707
|
-
}
|
708
|
-
} == json ||
|
709
|
-
%{{
|
710
|
-
"^o":"ObjectJuice::Jazz",
|
711
|
-
"y":58,
|
712
|
-
"x":true
|
713
|
-
}
|
714
|
-
} == json)
|
715
|
-
obj2 = Oj.load(json, :mode => :object)
|
716
|
-
assert_equal(obj, obj2)
|
717
|
-
end
|
718
|
-
|
719
|
-
def test_as_json_object_object
|
720
|
-
obj = Orange.new(true, 58)
|
721
|
-
json = Oj.dump(obj, :mode => :object, :indent => 2)
|
722
|
-
assert(%{{
|
723
|
-
"^o":"ObjectJuice::Orange",
|
724
|
-
"x":true,
|
725
|
-
"y":58
|
726
|
-
}
|
727
|
-
} == json ||
|
728
|
-
%{{
|
729
|
-
"^o":"ObjectJuice::Orange",
|
730
|
-
"y":58,
|
731
|
-
"x":true
|
732
|
-
}
|
733
|
-
} == json)
|
734
|
-
obj2 = Oj.load(json, :mode => :object)
|
735
|
-
assert_equal(obj, obj2)
|
736
|
-
end
|
737
|
-
|
738
|
-
def test_object_object_no_cache
|
739
|
-
obj = Jam.new(true, 58)
|
740
|
-
json = Oj.dump(obj, :mode => :object, :indent => 2)
|
741
|
-
assert(%{{
|
742
|
-
"^o":"ObjectJuice::Jam",
|
743
|
-
"x":true,
|
744
|
-
"y":58
|
745
|
-
}
|
746
|
-
} == json ||
|
747
|
-
%{{
|
748
|
-
"^o":"ObjectJuice::Jam",
|
749
|
-
"y":58,
|
750
|
-
"x":true
|
751
|
-
}
|
752
|
-
} == json)
|
753
|
-
obj2 = Oj.load(json, :mode => :object, :class_cache => false)
|
754
|
-
assert_equal(obj, obj2)
|
755
|
-
end
|
756
|
-
|
757
|
-
def test_ignore
|
758
|
-
obj = Jeez.new(true, 58)
|
759
|
-
json = Oj.dump({ 'a' => 7, 'b' => obj }, :mode => :object, :indent => 2, :ignore => [ Jeez ])
|
760
|
-
assert_equal(%|{
|
761
|
-
"a":7
|
762
|
-
}
|
763
|
-
|, json)
|
764
|
-
end
|
765
|
-
|
766
|
-
def test_exception
|
767
|
-
err = nil
|
768
|
-
begin
|
769
|
-
raise StandardError.new('A Message')
|
770
|
-
rescue Exception => e
|
771
|
-
err = e
|
772
|
-
end
|
773
|
-
json = Oj.dump(err, :mode => :object, :indent => 2)
|
774
|
-
# puts "*** #{json}"
|
775
|
-
e2 = Oj.load(json, :mode => :strict)
|
776
|
-
assert_equal(err.class.to_s, e2['^o'])
|
777
|
-
assert_equal(err.message, e2['~mesg'])
|
778
|
-
assert_equal(err.backtrace, e2['~bt'])
|
779
|
-
e2 = Oj.load(json, :mode => :object)
|
780
|
-
if 'rubinius' == $ruby
|
781
|
-
assert_equal(e.class, e2.class)
|
782
|
-
assert_equal(e.message, e2.message)
|
783
|
-
assert_equal(e.backtrace, e2.backtrace)
|
784
|
-
else
|
785
|
-
assert_equal(e, e2)
|
786
|
-
end
|
787
|
-
end
|
788
|
-
|
789
|
-
class SubX < StandardError
|
790
|
-
def initialize
|
791
|
-
super('sub')
|
792
|
-
@xyz = 123
|
793
|
-
end
|
794
|
-
end
|
795
|
-
|
796
|
-
def test_exception_subclass
|
797
|
-
err = nil
|
798
|
-
begin
|
799
|
-
raise SubX.new
|
800
|
-
rescue Exception => e
|
801
|
-
err = e
|
802
|
-
end
|
803
|
-
json = Oj.dump(err, :mode => :object, :indent => 2)
|
804
|
-
# puts "*** #{json}"
|
805
|
-
e2 = Oj.load(json, :mode => :strict)
|
806
|
-
assert_equal(err.class.to_s, e2['^o'])
|
807
|
-
assert_equal(err.message, e2['~mesg'])
|
808
|
-
assert_equal(err.backtrace, e2['~bt'])
|
809
|
-
e2 = Oj.load(json, :mode => :object)
|
810
|
-
assert_equal(e, e2)
|
811
|
-
end
|
812
|
-
|
813
|
-
def test_range_object
|
814
|
-
Oj.default_options = { :mode => :object }
|
815
|
-
json = Oj.dump(1..7, :mode => :object, :indent => 0)
|
816
|
-
if 'ruby' == $ruby
|
817
|
-
assert_equal(%{{"^u":["Range",1,7,false]}}, json)
|
818
|
-
else
|
819
|
-
assert_equal(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}}, json)
|
820
|
-
end
|
821
|
-
dump_and_load(1..7, false)
|
822
|
-
dump_and_load(1..1, false)
|
823
|
-
dump_and_load(1...7, false)
|
824
|
-
end
|
825
|
-
|
826
|
-
def test_circular_hash
|
827
|
-
h = { 'a' => 7 }
|
828
|
-
h['b'] = h
|
829
|
-
json = Oj.dump(h, :mode => :object, :indent => 2, :circular => true)
|
830
|
-
h2 = Oj.object_load(json, :circular => true)
|
831
|
-
assert_equal(h2['b'].__id__, h2.__id__)
|
832
|
-
end
|
833
|
-
|
834
|
-
def test_json_object_missing_fields
|
835
|
-
json = %{{ "^u": [ "ObjectJuice::Stuck",1]}}
|
836
|
-
|
837
|
-
obj = Oj.load(json, mode: :object)
|
838
|
-
assert_nil(obj['b'])
|
839
|
-
end
|
840
|
-
|
841
|
-
def test_circular_array
|
842
|
-
a = [7]
|
843
|
-
a << a
|
844
|
-
json = Oj.dump(a, :mode => :object, :indent => 2, :circular => true)
|
845
|
-
a2 = Oj.object_load(json, :circular => true)
|
846
|
-
assert_equal(a2[1].__id__, a2.__id__)
|
847
|
-
end
|
848
|
-
|
849
|
-
def test_circular_array2
|
850
|
-
a = [7]
|
851
|
-
a << a
|
852
|
-
json = Oj.dump(a, :mode => :object, :indent => 2, :circular => true)
|
853
|
-
assert_equal(%{[
|
854
|
-
"^i1",
|
855
|
-
7,
|
856
|
-
"^r1"
|
857
|
-
]
|
858
|
-
}, json)
|
859
|
-
a2 = Oj.load(json, :mode => :object, :circular => true)
|
860
|
-
assert_equal(a2[1].__id__, a2.__id__)
|
861
|
-
end
|
862
|
-
|
863
|
-
def test_circular_array3
|
864
|
-
a = ['^r1']
|
865
|
-
json = Oj.dump(a, mode: :object, circular: true)
|
866
|
-
assert_equal(%{["^i1","\\u005er1"]}, json)
|
867
|
-
a2 = Oj.load(json, mode: :object, circular: true)
|
868
|
-
assert_equal(a, a2)
|
869
|
-
end
|
870
|
-
|
871
|
-
def test_circular_hash2
|
872
|
-
h = { 'a' => 7 }
|
873
|
-
h['b'] = h
|
874
|
-
json = Oj.dump(h, :mode => :object, :indent => 2, :circular => true)
|
875
|
-
ha = Oj.load(json, :mode => :strict)
|
876
|
-
assert_equal({'^i' => 1, 'a' => 7, 'b' => '^r1'}, ha)
|
877
|
-
Oj.load(json, :mode => :object, :circular => true)
|
878
|
-
assert_equal(h['b'].__id__, h.__id__)
|
879
|
-
end
|
880
|
-
|
881
|
-
def test_circular_object
|
882
|
-
obj = Jeez.new(nil, 58)
|
883
|
-
obj.x = obj
|
884
|
-
json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
|
885
|
-
obj2 = Oj.object_load(json, :circular => true)
|
886
|
-
assert_equal(obj2.x.__id__, obj2.__id__)
|
887
|
-
end
|
888
|
-
|
889
|
-
def test_circular_object2
|
890
|
-
obj = Jam.new(nil, 58)
|
891
|
-
obj.x = obj
|
892
|
-
json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
|
893
|
-
assert(%{{
|
894
|
-
"^o":"ObjectJuice::Jam",
|
895
|
-
"^i":1,
|
896
|
-
"x":"^r1",
|
897
|
-
"y":58
|
898
|
-
}
|
899
|
-
} == json ||
|
900
|
-
%{{
|
901
|
-
"^o":"ObjectJuice::Jam",
|
902
|
-
"^i":1,
|
903
|
-
"y":58,
|
904
|
-
"x":"^r1"
|
905
|
-
}
|
906
|
-
} == json)
|
907
|
-
obj2 = Oj.load(json, :mode => :object, :circular => true)
|
908
|
-
assert_equal(obj2.x.__id__, obj2.__id__)
|
909
|
-
end
|
910
|
-
|
911
|
-
def test_circular
|
912
|
-
h = { 'a' => 7 }
|
913
|
-
obj = Jeez.new(h, 58)
|
914
|
-
obj.x['b'] = obj
|
915
|
-
json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
|
916
|
-
Oj.object_load(json, :circular => true)
|
917
|
-
assert_equal(obj.x.__id__, h.__id__)
|
918
|
-
assert_equal(h['b'].__id__, obj.__id__)
|
919
|
-
end
|
920
|
-
|
921
|
-
def test_circular2
|
922
|
-
h = { 'a' => 7 }
|
923
|
-
obj = Jam.new(h, 58)
|
924
|
-
obj.x['b'] = obj
|
925
|
-
json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
|
926
|
-
ha = Oj.load(json, :mode => :strict)
|
927
|
-
assert_equal({'^o' => 'ObjectJuice::Jam', '^i' => 1, 'x' => { '^i' => 2, 'a' => 7, 'b' => '^r1' }, 'y' => 58 }, ha)
|
928
|
-
Oj.load(json, :mode => :object, :circular => true)
|
929
|
-
assert_equal(obj.x.__id__, h.__id__)
|
930
|
-
assert_equal(h['b'].__id__, obj.__id__)
|
931
|
-
end
|
932
|
-
|
933
|
-
def test_omit_nil
|
934
|
-
jam = Jam.new({'a' => 1, 'b' => nil }, nil)
|
935
|
-
|
936
|
-
json = Oj.dump(jam, :omit_nil => true, :mode => :object)
|
937
|
-
assert_equal(%|{"^o":"ObjectJuice::Jam","x":{"a":1}}|, json)
|
938
|
-
end
|
939
|
-
|
940
|
-
def test_odd_date
|
941
|
-
dump_and_load(Date.new(2012, 6, 19), false)
|
942
|
-
|
943
|
-
Oj.register_odd(Date, Date, :jd, :jd)
|
944
|
-
json = Oj.dump(Date.new(2015, 3, 7), :mode => :object)
|
945
|
-
assert_equal(%|{"^O":"Date","jd":2457089}|, json)
|
946
|
-
dump_and_load(Date.new(2012, 6, 19), false)
|
947
|
-
end
|
948
|
-
|
949
|
-
def test_odd_datetime
|
950
|
-
dump_and_load(DateTime.new(2012, 6, 19, 13, 5, Rational(4, 3)), false)
|
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))
|
966
|
-
end
|
967
|
-
|
968
|
-
def test_bag
|
969
|
-
json = %{{
|
970
|
-
"^o":"ObjectJuice::Jem",
|
971
|
-
"x":true,
|
972
|
-
"y":58 }}
|
973
|
-
obj = Oj.load(json, :mode => :object, :auto_define => true)
|
974
|
-
assert_equal('ObjectJuice::Jem', obj.class.name)
|
975
|
-
assert(obj.x)
|
976
|
-
assert_equal(58, obj.y)
|
977
|
-
end
|
978
|
-
|
979
|
-
def test_odd_string
|
980
|
-
Oj.register_odd(Strung, Strung, :create, :to_s, 'safe?')
|
981
|
-
s = Strung.new('Pete', true)
|
982
|
-
dump_and_load(s, false)
|
983
|
-
end
|
984
|
-
|
985
|
-
def test_odd_raw
|
986
|
-
Oj.register_odd_raw(Raw, Raw, :create, :to_json)
|
987
|
-
json = Oj.dump(Raw.new(%|{"a":1}|), :mode => :object)
|
988
|
-
assert_equal(%|{"^O":"ObjectJuice::Raw","to_json":{"a":1}}|, json)
|
989
|
-
h = Oj.load(json, :mode => :object)
|
990
|
-
assert_equal({'a' => 1}, h)
|
991
|
-
end
|
992
|
-
|
993
|
-
def test_odd_mod
|
994
|
-
Oj.register_odd(Ichi::Ni, Ichi::Ni, :direct, :dump)
|
995
|
-
json = Oj.dump(Ichi::Ni::San::Shi.new({'a' => 1}), :mode => :object)
|
996
|
-
assert_equal(%|{"^O":"ObjectJuice::Ichi::Ni::San::Shi","dump":{"a":1}}|, json)
|
997
|
-
h = Oj.load(json, :mode => :object)
|
998
|
-
assert_equal({'a' => 1}, h)
|
999
|
-
end
|
1000
|
-
|
1001
|
-
def test_auto_string
|
1002
|
-
s = AutoStrung.new('Pete', true)
|
1003
|
-
dump_and_load(s, false)
|
1004
|
-
end
|
1005
|
-
|
1006
|
-
def test_auto_array
|
1007
|
-
a = AutoArray.new([1, 'abc', nil], true)
|
1008
|
-
dump_and_load(a, false)
|
1009
|
-
end
|
1010
|
-
|
1011
|
-
def test_auto_hash
|
1012
|
-
h = AutoHash.new(nil, true)
|
1013
|
-
h['a'] = 1
|
1014
|
-
h['b'] = 2
|
1015
|
-
dump_and_load(h, false)
|
1016
|
-
end
|
1017
|
-
|
1018
|
-
def dump_and_load(obj, trace=false)
|
1019
|
-
json = Oj.dump(obj, :indent => 2, :mode => :object)
|
1020
|
-
puts json if trace
|
1021
|
-
loaded = Oj.object_load(json)
|
1022
|
-
if obj.nil?
|
1023
|
-
assert_nil(loaded)
|
1024
|
-
else
|
1025
|
-
assert_equal(obj, loaded)
|
1026
|
-
end
|
1027
|
-
loaded
|
1028
|
-
end
|
1029
|
-
|
1030
|
-
end
|