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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/ext/oj/fast.c +3 -6
  4. data/ext/oj/mimic_json.c +3 -6
  5. data/ext/oj/oj.c +2 -4
  6. data/ext/oj/parse.c +15 -5
  7. data/ext/oj/parser.c +1 -1
  8. data/ext/oj/parser.h +2 -0
  9. data/ext/oj/rails.c +1 -2
  10. data/ext/oj/saj.c +3 -6
  11. data/ext/oj/scp.c +3 -6
  12. data/ext/oj/stream_writer.c +1 -7
  13. data/ext/oj/strict.c +2 -4
  14. data/ext/oj/string_writer.c +1 -3
  15. data/lib/oj/version.rb +1 -1
  16. metadata +3 -98
  17. data/test/_test_active.rb +0 -75
  18. data/test/_test_active_mimic.rb +0 -95
  19. data/test/_test_mimic_rails.rb +0 -123
  20. data/test/activerecord/result_test.rb +0 -31
  21. data/test/activesupport6/abstract_unit.rb +0 -44
  22. data/test/activesupport6/decoding_test.rb +0 -133
  23. data/test/activesupport6/encoding_test.rb +0 -542
  24. data/test/activesupport6/encoding_test_cases.rb +0 -98
  25. data/test/activesupport6/test_common.rb +0 -17
  26. data/test/activesupport6/test_helper.rb +0 -163
  27. data/test/activesupport6/time_zone_test_helpers.rb +0 -39
  28. data/test/activesupport7/abstract_unit.rb +0 -52
  29. data/test/activesupport7/decoding_test.rb +0 -125
  30. data/test/activesupport7/encoding_test.rb +0 -536
  31. data/test/activesupport7/encoding_test_cases.rb +0 -104
  32. data/test/activesupport7/time_zone_test_helpers.rb +0 -47
  33. data/test/files.rb +0 -29
  34. data/test/foo.rb +0 -26
  35. data/test/helper.rb +0 -39
  36. data/test/isolated/shared.rb +0 -309
  37. data/test/isolated/test_mimic_after.rb +0 -13
  38. data/test/isolated/test_mimic_alone.rb +0 -12
  39. data/test/isolated/test_mimic_as_json.rb +0 -45
  40. data/test/isolated/test_mimic_before.rb +0 -13
  41. data/test/isolated/test_mimic_define.rb +0 -28
  42. data/test/isolated/test_mimic_rails_after.rb +0 -22
  43. data/test/isolated/test_mimic_rails_before.rb +0 -21
  44. data/test/isolated/test_mimic_redefine.rb +0 -15
  45. data/test/json_gem/json_addition_test.rb +0 -216
  46. data/test/json_gem/json_common_interface_test.rb +0 -155
  47. data/test/json_gem/json_encoding_test.rb +0 -107
  48. data/test/json_gem/json_ext_parser_test.rb +0 -21
  49. data/test/json_gem/json_fixtures_test.rb +0 -36
  50. data/test/json_gem/json_generator_test.rb +0 -413
  51. data/test/json_gem/json_generic_object_test.rb +0 -90
  52. data/test/json_gem/json_parser_test.rb +0 -477
  53. data/test/json_gem/json_string_matching_test.rb +0 -42
  54. data/test/json_gem/test_helper.rb +0 -30
  55. data/test/mem.rb +0 -34
  56. data/test/perf.rb +0 -102
  57. data/test/perf_compat.rb +0 -128
  58. data/test/perf_dump.rb +0 -50
  59. data/test/perf_fast.rb +0 -162
  60. data/test/perf_file.rb +0 -62
  61. data/test/perf_object.rb +0 -134
  62. data/test/perf_once.rb +0 -59
  63. data/test/perf_parser.rb +0 -183
  64. data/test/perf_saj.rb +0 -101
  65. data/test/perf_scp.rb +0 -140
  66. data/test/perf_simple.rb +0 -289
  67. data/test/perf_strict.rb +0 -137
  68. data/test/perf_wab.rb +0 -129
  69. data/test/prec.rb +0 -23
  70. data/test/sample/change.rb +0 -13
  71. data/test/sample/dir.rb +0 -18
  72. data/test/sample/doc.rb +0 -35
  73. data/test/sample/file.rb +0 -47
  74. data/test/sample/group.rb +0 -15
  75. data/test/sample/hasprops.rb +0 -15
  76. data/test/sample/layer.rb +0 -11
  77. data/test/sample/line.rb +0 -20
  78. data/test/sample/oval.rb +0 -10
  79. data/test/sample/rect.rb +0 -9
  80. data/test/sample/shape.rb +0 -34
  81. data/test/sample/text.rb +0 -19
  82. data/test/sample.rb +0 -54
  83. data/test/sample_json.rb +0 -37
  84. data/test/test_compat.rb +0 -567
  85. data/test/test_custom.rb +0 -555
  86. data/test/test_debian.rb +0 -50
  87. data/test/test_fast.rb +0 -526
  88. data/test/test_file.rb +0 -250
  89. data/test/test_gc.rb +0 -60
  90. data/test/test_generate.rb +0 -21
  91. data/test/test_hash.rb +0 -39
  92. data/test/test_integer_range.rb +0 -72
  93. data/test/test_null.rb +0 -376
  94. data/test/test_object.rb +0 -1030
  95. data/test/test_parser.rb +0 -11
  96. data/test/test_parser_debug.rb +0 -27
  97. data/test/test_parser_saj.rb +0 -337
  98. data/test/test_parser_usual.rb +0 -255
  99. data/test/test_rails.rb +0 -35
  100. data/test/test_saj.rb +0 -188
  101. data/test/test_scp.rb +0 -431
  102. data/test/test_strict.rb +0 -441
  103. data/test/test_various.rb +0 -801
  104. data/test/test_wab.rb +0 -311
  105. data/test/test_writer.rb +0 -396
  106. data/test/tests.rb +0 -33
  107. data/test/tests_mimic.rb +0 -23
  108. 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