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.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +77 -0
  3. data/README.md +4 -2
  4. data/ext/oj/buf.h +7 -6
  5. data/ext/oj/cache.c +29 -26
  6. data/ext/oj/cache.h +3 -2
  7. data/ext/oj/cache8.c +10 -9
  8. data/ext/oj/circarray.c +7 -5
  9. data/ext/oj/circarray.h +2 -2
  10. data/ext/oj/code.c +5 -12
  11. data/ext/oj/code.h +2 -2
  12. data/ext/oj/compat.c +20 -60
  13. data/ext/oj/custom.c +44 -96
  14. data/ext/oj/debug.c +3 -9
  15. data/ext/oj/dump.c +69 -39
  16. data/ext/oj/dump.h +1 -4
  17. data/ext/oj/dump_compat.c +557 -592
  18. data/ext/oj/dump_leaf.c +3 -5
  19. data/ext/oj/dump_object.c +42 -48
  20. data/ext/oj/dump_strict.c +10 -22
  21. data/ext/oj/encoder.c +1 -1
  22. data/ext/oj/err.c +2 -13
  23. data/ext/oj/err.h +9 -12
  24. data/ext/oj/extconf.rb +16 -6
  25. data/ext/oj/fast.c +76 -106
  26. data/ext/oj/intern.c +63 -51
  27. data/ext/oj/intern.h +3 -7
  28. data/ext/oj/mem.c +318 -0
  29. data/ext/oj/mem.h +53 -0
  30. data/ext/oj/mimic_json.c +43 -30
  31. data/ext/oj/object.c +61 -70
  32. data/ext/oj/odd.c +8 -6
  33. data/ext/oj/odd.h +4 -4
  34. data/ext/oj/oj.c +243 -205
  35. data/ext/oj/oj.h +82 -78
  36. data/ext/oj/parse.c +123 -188
  37. data/ext/oj/parse.h +23 -24
  38. data/ext/oj/parser.c +103 -63
  39. data/ext/oj/parser.h +19 -9
  40. data/ext/oj/rails.c +68 -92
  41. data/ext/oj/reader.c +10 -15
  42. data/ext/oj/reader.h +4 -2
  43. data/ext/oj/resolve.c +3 -4
  44. data/ext/oj/rxclass.c +6 -5
  45. data/ext/oj/rxclass.h +1 -1
  46. data/ext/oj/saj.c +10 -9
  47. data/ext/oj/saj2.c +74 -92
  48. data/ext/oj/saj2.h +23 -0
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +22 -70
  51. data/ext/oj/stream_writer.c +43 -35
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +60 -34
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +125 -150
  56. data/ext/oj/usual.h +69 -0
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +14 -3
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/wab.c +25 -57
  61. data/lib/oj/active_support_helper.rb +1 -3
  62. data/lib/oj/bag.rb +7 -1
  63. data/lib/oj/easy_hash.rb +4 -5
  64. data/lib/oj/error.rb +0 -1
  65. data/lib/oj/json.rb +162 -150
  66. data/lib/oj/mimic.rb +6 -2
  67. data/lib/oj/state.rb +9 -6
  68. data/lib/oj/version.rb +1 -2
  69. data/lib/oj.rb +2 -0
  70. data/pages/Compatibility.md +1 -1
  71. data/pages/InstallOptions.md +20 -0
  72. data/pages/Options.md +10 -0
  73. data/test/_test_active.rb +8 -9
  74. data/test/_test_active_mimic.rb +7 -8
  75. data/test/_test_mimic_rails.rb +17 -20
  76. data/test/activerecord/result_test.rb +5 -6
  77. data/test/files.rb +15 -15
  78. data/test/foo.rb +9 -72
  79. data/test/helper.rb +11 -8
  80. data/test/isolated/shared.rb +3 -2
  81. data/test/json_gem/json_addition_test.rb +2 -2
  82. data/test/json_gem/json_common_interface_test.rb +8 -6
  83. data/test/json_gem/json_encoding_test.rb +0 -0
  84. data/test/json_gem/json_ext_parser_test.rb +1 -0
  85. data/test/json_gem/json_fixtures_test.rb +3 -2
  86. data/test/json_gem/json_generator_test.rb +53 -37
  87. data/test/json_gem/json_generic_object_test.rb +11 -11
  88. data/test/json_gem/json_parser_test.rb +47 -47
  89. data/test/json_gem/json_string_matching_test.rb +9 -9
  90. data/test/json_gem/test_helper.rb +7 -3
  91. data/test/mem.rb +13 -12
  92. data/test/perf.rb +21 -26
  93. data/test/perf_compat.rb +31 -33
  94. data/test/perf_dump.rb +28 -28
  95. data/test/perf_fast.rb +80 -82
  96. data/test/perf_file.rb +27 -29
  97. data/test/perf_object.rb +65 -69
  98. data/test/perf_once.rb +12 -11
  99. data/test/perf_parser.rb +42 -48
  100. data/test/perf_saj.rb +46 -54
  101. data/test/perf_scp.rb +57 -69
  102. data/test/perf_simple.rb +41 -39
  103. data/test/perf_strict.rb +68 -70
  104. data/test/perf_wab.rb +67 -69
  105. data/test/prec.rb +5 -5
  106. data/test/sample/change.rb +0 -1
  107. data/test/sample/dir.rb +0 -1
  108. data/test/sample/doc.rb +0 -1
  109. data/test/sample/file.rb +0 -1
  110. data/test/sample/group.rb +0 -1
  111. data/test/sample/hasprops.rb +0 -1
  112. data/test/sample/layer.rb +0 -1
  113. data/test/sample/rect.rb +0 -1
  114. data/test/sample/shape.rb +0 -1
  115. data/test/sample/text.rb +0 -1
  116. data/test/sample.rb +16 -16
  117. data/test/sample_json.rb +8 -8
  118. data/test/test_compat.rb +80 -53
  119. data/test/test_custom.rb +73 -51
  120. data/test/test_debian.rb +7 -10
  121. data/test/test_fast.rb +86 -90
  122. data/test/test_file.rb +28 -35
  123. data/test/test_gc.rb +16 -5
  124. data/test/test_generate.rb +5 -5
  125. data/test/test_hash.rb +4 -4
  126. data/test/test_integer_range.rb +9 -9
  127. data/test/test_null.rb +20 -20
  128. data/test/test_object.rb +94 -96
  129. data/test/test_parser.rb +6 -22
  130. data/test/test_parser_debug.rb +27 -0
  131. data/test/test_parser_saj.rb +61 -22
  132. data/test/test_parser_usual.rb +16 -6
  133. data/test/test_rails.rb +2 -2
  134. data/test/test_saj.rb +10 -8
  135. data/test/test_scp.rb +37 -39
  136. data/test/test_strict.rb +40 -32
  137. data/test/test_various.rb +148 -100
  138. data/test/test_wab.rb +48 -44
  139. data/test/test_writer.rb +47 -47
  140. data/test/tests.rb +13 -4
  141. data/test/tests_mimic.rb +12 -3
  142. data/test/tests_mimic_addition.rb +12 -3
  143. metadata +36 -27
  144. data/test/activesupport4/decoding_test.rb +0 -108
  145. data/test/activesupport4/encoding_test.rb +0 -531
  146. data/test/activesupport4/test_helper.rb +0 -41
  147. data/test/activesupport5/abstract_unit.rb +0 -45
  148. data/test/activesupport5/decoding_test.rb +0 -133
  149. data/test/activesupport5/encoding_test.rb +0 -500
  150. data/test/activesupport5/encoding_test_cases.rb +0 -98
  151. data/test/activesupport5/test_helper.rb +0 -72
  152. data/test/activesupport5/time_zone_test_helpers.rb +0 -39
  153. data/test/bar.rb +0 -11
  154. data/test/baz.rb +0 -16
  155. data/test/bug.rb +0 -16
  156. data/test/zoo.rb +0 -13
data/test/test_null.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
5
- $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
4
+ $LOAD_PATH << __dir__
5
+ @oj_dir = File.dirname(File.expand_path(__dir__))
6
6
  %w(lib ext).each do |dir|
7
- $: << File.join($oj_dir, dir)
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(12345, false)
56
- dump_and_load(-54321, false)
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(12345.6789, false)
62
+ dump_and_load(12_345.6789, false)
63
63
  dump_and_load(70.35, false)
64
- dump_and_load(-54321.012, false)
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, "*** expected an exception")
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, "*** expected an exception")
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, "*** expected an exception")
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("ぴーたー", false)
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("ぴーたー", false)
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, "*** expected an exception")
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(File.dirname(__FILE__), 'open_file_test.json')
248
- File.open(filename, 'w') { |f| f.write(%{{
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
- # encoding: utf-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
4
+ $LOAD_PATH << __dir__
5
5
 
6
6
  require 'helper'
7
7
 
@@ -20,12 +20,12 @@ class ObjectJuice < Minitest::Test
20
20
  end
21
21
  alias == eql?
22
22
 
23
- def to_json(*a)
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
- self.new(h['x'], h['y'])
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
- def initialize(x, y)
49
- super
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
- self.new(h['x'], h['y'])
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
- self.new(h['x'], h['y'])
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' => "#{self.class.name}"}
81
+ def to_hash
82
+ {'json_class' => self.class.name.to_s}
90
83
  end
91
84
 
92
- def to_json(*a)
85
+ def to_json(*_a)
93
86
  %{{"json_class":"#{self.class.name}"}}
94
87
  end
95
88
 
96
- def self.json_create(h)
97
- self.new()
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
- return super + '(' + @safe + ')'
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(*a)
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(12345, false)
248
- dump_and_load(-54321, false)
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(12345.6789, false)
239
+ dump_and_load(12_345.6789, false)
255
240
  dump_and_load(70.35, false)
256
- dump_and_load(-54321.012, false)
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
- assert_equal(true, loaded.nan?)
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(":abc", false)
280
- dump_and_load(':xyz'.to_sym, false)
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("ぴーたー", false)
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("ぴーたー", false)
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(File.dirname(__FILE__), 'open_file_test.json')
387
- File.open(filename, 'w') { |f| f.write(%{{
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({"^#1" => [1, true], ":sim" => nil}, h)
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, 12345/60*60)
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, 12345)
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("ArgumentError", e.class().name)
633
+ assert_equal('ArgumentError', e.class().name)
649
634
  return
650
635
  end
651
- assert(false, "*** expected an exception")
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 => "young", false => true }
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 < Exception
789
+ class SubX < StandardError
805
790
  def initialize
806
- super("sub")
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 'rubinius' == $ruby
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(7123456789, 1000000000)), 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))
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
- assert_equal(true, obj.x)
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("Pete", true)
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("Pete", true)
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
- # encoding: utf-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
5
- $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
4
+ $LOAD_PATH << __dir__
5
+ @oj_dir = File.dirname(File.expand_path(__dir__))
6
6
  %w(lib ext).each do |dir|
7
- $: << File.join($oj_dir, dir)
7
+ $LOAD_PATH << File.join(@oj_dir, dir)
8
8
  end
9
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
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