oj 3.13.9 → 3.16.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +101 -0
  3. data/README.md +13 -2
  4. data/ext/oj/buf.h +11 -6
  5. data/ext/oj/cache.c +25 -24
  6. data/ext/oj/cache8.c +10 -9
  7. data/ext/oj/circarray.c +8 -6
  8. data/ext/oj/circarray.h +2 -2
  9. data/ext/oj/code.c +19 -33
  10. data/ext/oj/code.h +2 -2
  11. data/ext/oj/compat.c +20 -60
  12. data/ext/oj/custom.c +76 -155
  13. data/ext/oj/debug.c +3 -9
  14. data/ext/oj/dump.c +203 -213
  15. data/ext/oj/dump.h +26 -12
  16. data/ext/oj/dump_compat.c +565 -642
  17. data/ext/oj/dump_leaf.c +17 -63
  18. data/ext/oj/dump_object.c +59 -181
  19. data/ext/oj/dump_strict.c +24 -48
  20. data/ext/oj/encoder.c +43 -0
  21. data/ext/oj/err.c +2 -13
  22. data/ext/oj/err.h +9 -12
  23. data/ext/oj/extconf.rb +18 -7
  24. data/ext/oj/fast.c +83 -108
  25. data/ext/oj/intern.c +52 -50
  26. data/ext/oj/intern.h +4 -8
  27. data/ext/oj/mem.c +318 -0
  28. data/ext/oj/mem.h +53 -0
  29. data/ext/oj/mimic_json.c +104 -81
  30. data/ext/oj/object.c +50 -67
  31. data/ext/oj/odd.c +89 -67
  32. data/ext/oj/odd.h +15 -15
  33. data/ext/oj/oj.c +171 -106
  34. data/ext/oj/oj.h +96 -74
  35. data/ext/oj/parse.c +169 -189
  36. data/ext/oj/parse.h +23 -24
  37. data/ext/oj/parser.c +89 -34
  38. data/ext/oj/parser.h +20 -9
  39. data/ext/oj/rails.c +86 -151
  40. data/ext/oj/rails.h +1 -1
  41. data/ext/oj/reader.c +12 -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 +21 -32
  47. data/ext/oj/saj2.c +329 -93
  48. data/ext/oj/saj2.h +23 -0
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +26 -70
  51. data/ext/oj/stream_writer.c +12 -22
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +21 -22
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +105 -150
  56. data/ext/oj/usual.h +68 -0
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +1 -1
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/validate.c +21 -26
  61. data/ext/oj/wab.c +32 -69
  62. data/lib/oj/active_support_helper.rb +1 -3
  63. data/lib/oj/bag.rb +7 -1
  64. data/lib/oj/easy_hash.rb +4 -5
  65. data/lib/oj/error.rb +0 -1
  66. data/lib/oj/json.rb +162 -150
  67. data/lib/oj/mimic.rb +6 -2
  68. data/lib/oj/saj.rb +20 -6
  69. data/lib/oj/state.rb +9 -6
  70. data/lib/oj/version.rb +1 -2
  71. data/lib/oj.rb +2 -0
  72. data/pages/Compatibility.md +1 -1
  73. data/pages/InstallOptions.md +20 -0
  74. data/pages/JsonGem.md +15 -0
  75. data/pages/Modes.md +6 -3
  76. data/pages/Options.md +10 -0
  77. data/pages/Rails.md +12 -0
  78. data/test/_test_active.rb +8 -9
  79. data/test/_test_active_mimic.rb +7 -8
  80. data/test/_test_mimic_rails.rb +17 -20
  81. data/test/activerecord/result_test.rb +5 -6
  82. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  83. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  84. data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
  85. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  86. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  87. data/test/files.rb +15 -15
  88. data/test/foo.rb +15 -15
  89. data/test/helper.rb +11 -8
  90. data/test/isolated/shared.rb +3 -2
  91. data/test/json_gem/json_addition_test.rb +2 -2
  92. data/test/json_gem/json_common_interface_test.rb +8 -6
  93. data/test/json_gem/json_encoding_test.rb +0 -0
  94. data/test/json_gem/json_ext_parser_test.rb +1 -0
  95. data/test/json_gem/json_fixtures_test.rb +3 -2
  96. data/test/json_gem/json_generator_test.rb +49 -37
  97. data/test/json_gem/json_generic_object_test.rb +11 -11
  98. data/test/json_gem/json_parser_test.rb +54 -47
  99. data/test/json_gem/json_string_matching_test.rb +9 -9
  100. data/test/json_gem/test_helper.rb +7 -3
  101. data/test/mem.rb +13 -12
  102. data/test/perf.rb +21 -26
  103. data/test/perf_compat.rb +31 -33
  104. data/test/perf_dump.rb +50 -0
  105. data/test/perf_fast.rb +80 -82
  106. data/test/perf_file.rb +27 -29
  107. data/test/perf_object.rb +65 -69
  108. data/test/perf_once.rb +12 -11
  109. data/test/perf_parser.rb +42 -48
  110. data/test/perf_saj.rb +46 -54
  111. data/test/perf_scp.rb +57 -69
  112. data/test/perf_simple.rb +41 -39
  113. data/test/perf_strict.rb +68 -70
  114. data/test/perf_wab.rb +67 -69
  115. data/test/prec.rb +3 -3
  116. data/test/sample/change.rb +0 -1
  117. data/test/sample/dir.rb +0 -1
  118. data/test/sample/doc.rb +0 -1
  119. data/test/sample/file.rb +0 -1
  120. data/test/sample/group.rb +0 -1
  121. data/test/sample/hasprops.rb +0 -1
  122. data/test/sample/layer.rb +0 -1
  123. data/test/sample/rect.rb +0 -1
  124. data/test/sample/shape.rb +0 -1
  125. data/test/sample/text.rb +0 -1
  126. data/test/sample.rb +16 -16
  127. data/test/sample_json.rb +8 -8
  128. data/test/test_compat.rb +95 -43
  129. data/test/test_custom.rb +72 -51
  130. data/test/test_debian.rb +7 -10
  131. data/test/test_fast.rb +102 -87
  132. data/test/test_file.rb +41 -30
  133. data/test/test_gc.rb +16 -5
  134. data/test/test_generate.rb +5 -5
  135. data/test/test_hash.rb +4 -4
  136. data/test/test_integer_range.rb +9 -9
  137. data/test/test_null.rb +20 -20
  138. data/test/test_object.rb +85 -96
  139. data/test/test_parser.rb +6 -22
  140. data/test/test_parser_debug.rb +27 -0
  141. data/test/test_parser_saj.rb +115 -23
  142. data/test/test_parser_usual.rb +6 -6
  143. data/test/test_rails.rb +2 -2
  144. data/test/test_saj.rb +10 -8
  145. data/test/test_scp.rb +37 -39
  146. data/test/test_strict.rb +40 -32
  147. data/test/test_various.rb +163 -84
  148. data/test/test_wab.rb +48 -44
  149. data/test/test_writer.rb +47 -47
  150. data/test/tests.rb +13 -5
  151. data/test/tests_mimic.rb +12 -3
  152. data/test/tests_mimic_addition.rb +12 -3
  153. metadata +34 -144
  154. data/test/activesupport4/decoding_test.rb +0 -108
  155. data/test/activesupport4/encoding_test.rb +0 -531
  156. data/test/activesupport4/test_helper.rb +0 -41
  157. data/test/activesupport5/test_helper.rb +0 -72
  158. data/test/bar.rb +0 -16
  159. data/test/baz.rb +0 -16
  160. data/test/bug.rb +0 -16
  161. data/test/zoo.rb +0 -13
data/test/test_fast.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
4
+ $LOAD_PATH << __dir__
5
5
 
6
6
  require 'helper'
7
7
 
@@ -51,7 +51,7 @@ class DocTest < Minitest::Test
51
51
  json = %{true}
52
52
  Oj::Doc.open(json) do |doc|
53
53
  assert_equal(TrueClass, doc.type)
54
- assert_equal(true, doc.fetch())
54
+ assert(doc.fetch())
55
55
  end
56
56
  end
57
57
 
@@ -59,7 +59,7 @@ class DocTest < Minitest::Test
59
59
  json = %{false}
60
60
  Oj::Doc.open(json) do |doc|
61
61
  assert_equal(FalseClass, doc.type)
62
- assert_equal(false, doc.fetch())
62
+ refute(doc.fetch())
63
63
  end
64
64
  end
65
65
 
@@ -75,7 +75,7 @@ class DocTest < Minitest::Test
75
75
  json = %{"ぴーたー"}
76
76
  Oj::Doc.open(json) do |doc|
77
77
  assert_equal(String, doc.type)
78
- assert_equal("ぴーたー", doc.fetch())
78
+ assert_equal('ぴーたー', doc.fetch())
79
79
  end
80
80
  end
81
81
 
@@ -83,19 +83,15 @@ class DocTest < Minitest::Test
83
83
  json = %{"\\u3074\\u30fc\\u305f\\u30fc"}
84
84
  Oj::Doc.open(json) do |doc|
85
85
  assert_equal(String, doc.type)
86
- assert_equal("ぴーたー", doc.fetch())
86
+ assert_equal('ぴーたー', doc.fetch())
87
87
  end
88
88
  end
89
89
 
90
90
  def test_fixnum
91
91
  json = %{12345}
92
92
  Oj::Doc.open(json) do |doc|
93
- if '2.4.0' <= RUBY_VERSION
94
- assert_equal(Integer, doc.type)
95
- else
96
- assert_equal(Fixnum, doc.type)
97
- end
98
- assert_equal(12345, doc.fetch())
93
+ assert_equal(Integer, doc.type)
94
+ assert_equal(12_345, doc.fetch())
99
95
  end
100
96
  end
101
97
 
@@ -103,7 +99,7 @@ class DocTest < Minitest::Test
103
99
  json = %{12345.6789}
104
100
  Oj::Doc.open(json) do |doc|
105
101
  assert_equal(Float, doc.type)
106
- assert_equal(12345.6789, doc.fetch())
102
+ assert_in_delta(12_345.6789, doc.fetch())
107
103
  end
108
104
  end
109
105
 
@@ -111,8 +107,8 @@ class DocTest < Minitest::Test
111
107
  json = %{12345.6789e7}
112
108
  Oj::Doc.open(json) do |doc|
113
109
  assert_equal(Float, doc.type)
114
- #assert_equal(12345.6789e7, doc.fetch())
115
- assert_equal(12345.6789e7.to_i, doc.fetch().to_i)
110
+ # assert_equal(12345.6789e7, doc.fetch())
111
+ assert_equal(12_345.6789e7.to_i, doc.fetch().to_i)
116
112
  end
117
113
  end
118
114
 
@@ -120,7 +116,7 @@ class DocTest < Minitest::Test
120
116
  json = %{[]}
121
117
  Oj::Doc.open(json) do |doc|
122
118
  assert_equal(Array, doc.type)
123
- assert_equal([], doc.fetch())
119
+ assert_empty(doc.fetch())
124
120
  end
125
121
  end
126
122
 
@@ -136,7 +132,7 @@ class DocTest < Minitest::Test
136
132
  json = %{{}}
137
133
  Oj::Doc.open(json) do |doc|
138
134
  assert_equal(Hash, doc.type)
139
- assert_equal({}, doc.fetch())
135
+ assert_empty(doc.fetch())
140
136
  end
141
137
  end
142
138
 
@@ -171,7 +167,8 @@ class DocTest < Minitest::Test
171
167
 
172
168
  def test_move
173
169
  Oj::Doc.open(@json1) do |doc|
174
- [ '/',
170
+ [
171
+ '/',
175
172
  '/array',
176
173
  '/boolean',
177
174
  '/array/1/hash/h2/a/3',
@@ -204,13 +201,14 @@ class DocTest < Minitest::Test
204
201
 
205
202
  def test_move_relative
206
203
  Oj::Doc.open(@json1) do |doc|
207
- [['/', 'array', '/array'],
208
- ['/array', '1/num', '/array/1/num'],
209
- ['/array/1/hash', 'h2/a', '/array/1/hash/h2/a'],
210
- ['/array/1', 'hash/h2/a/2', '/array/1/hash/h2/a/2'],
211
- ['/array/1/hash', '../string', '/array/1/string'],
212
- ['/array/1/hash', '..', '/array/1'],
213
- ].each do |start,path,where|
204
+ [
205
+ ['/', 'array', '/array'],
206
+ ['/array', '1/num', '/array/1/num'],
207
+ ['/array/1/hash', 'h2/a', '/array/1/hash/h2/a'],
208
+ ['/array/1', 'hash/h2/a/2', '/array/1/hash/h2/a/2'],
209
+ ['/array/1/hash', '../string', '/array/1/string'],
210
+ ['/array/1/hash', '..', '/array/1'],
211
+ ].each do |start, path, where|
214
212
  doc.move(start)
215
213
  doc.move(path)
216
214
  assert_equal(where, doc.where?)
@@ -219,21 +217,17 @@ class DocTest < Minitest::Test
219
217
  end
220
218
 
221
219
  def test_type
222
- if '2.4.0' <= RUBY_VERSION
223
- num_class = Integer
224
- else
225
- num_class = Fixnum
226
- end
227
220
  Oj::Doc.open(@json1) do |doc|
228
- [['/', Hash],
229
- ['/array', Array],
230
- ['/array/1', Hash],
231
- ['/array/1/num', num_class],
232
- ['/array/1/string', String],
233
- ['/array/1/hash/h2/a', Array],
234
- ['/array/1/hash/../num', num_class],
235
- ['/array/1/hash/../..', Array],
236
- ].each do |path,type|
221
+ [
222
+ ['/', Hash],
223
+ ['/array', Array],
224
+ ['/array/1', Hash],
225
+ ['/array/1/num', Integer],
226
+ ['/array/1/string', String],
227
+ ['/array/1/hash/h2/a', Array],
228
+ ['/array/1/hash/../num', Integer],
229
+ ['/array/1/hash/../..', Array],
230
+ ].each do |path, type|
237
231
  assert_equal(type, doc.type(path))
238
232
  end
239
233
  end
@@ -241,16 +235,17 @@ class DocTest < Minitest::Test
241
235
 
242
236
  def test_local_key
243
237
  Oj::Doc.open(@json1) do |doc|
244
- [['/', nil],
245
- ['/array', 'array'],
246
- ['/array/1', 1],
247
- ['/array/1/num', 'num'],
248
- ['/array/1/string', 'string'],
249
- ['/array/1/hash/h2/a', 'a'],
250
- ['/array/1/hash/../num', 'num'],
251
- ['/array/1/hash/..', 1],
252
- ['/array/1/hash/../..', 'array'],
253
- ].each do |path,key|
238
+ [
239
+ ['/', nil],
240
+ ['/array', 'array'],
241
+ ['/array/1', 1],
242
+ ['/array/1/num', 'num'],
243
+ ['/array/1/string', 'string'],
244
+ ['/array/1/hash/h2/a', 'a'],
245
+ ['/array/1/hash/../num', 'num'],
246
+ ['/array/1/hash/..', 1],
247
+ ['/array/1/hash/../..', 'array'],
248
+ ].each do |path, key|
254
249
  doc.move(path)
255
250
  if key.nil?
256
251
  assert_nil(doc.local_key())
@@ -263,16 +258,17 @@ class DocTest < Minitest::Test
263
258
 
264
259
  def test_fetch_move
265
260
  Oj::Doc.open(@json1) do |doc|
266
- [['/array/1/num', 3],
267
- ['/array/1/string', 'message'],
268
- ['/array/1/hash/h2/a', [1, 2, 3]],
269
- ['/array/1/hash/../num', 3],
270
- ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
271
- ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
272
- ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
273
- ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
274
- ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
275
- ].each do |path,val|
261
+ [
262
+ ['/array/1/num', 3],
263
+ ['/array/1/string', 'message'],
264
+ ['/array/1/hash/h2/a', [1, 2, 3]],
265
+ ['/array/1/hash/../num', 3],
266
+ ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
267
+ ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
268
+ ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
269
+ ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
270
+ ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
271
+ ].each do |path, val|
276
272
  doc.move(path)
277
273
  assert_equal(val, doc.fetch())
278
274
  end
@@ -281,18 +277,19 @@ class DocTest < Minitest::Test
281
277
 
282
278
  def test_fetch_path
283
279
  Oj::Doc.open(@json1) do |doc|
284
- [['/array/1/num', 3],
285
- ['/array/1/string', 'message'],
286
- ['/array/1/hash/h2/a', [1, 2, 3]],
287
- ['/array/1/hash/../num', 3],
288
- ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
289
- ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
290
- ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
291
- ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
292
- ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
293
- ['/nothing', nil],
294
- ['/array/10', nil],
295
- ].each do |path,val|
280
+ [
281
+ ['/array/1/num', 3],
282
+ ['/array/1/string', 'message'],
283
+ ['/array/1/hash/h2/a', [1, 2, 3]],
284
+ ['/array/1/hash/../num', 3],
285
+ ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
286
+ ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
287
+ ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
288
+ ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
289
+ ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
290
+ ['/nothing', nil],
291
+ ['/array/10', nil],
292
+ ].each do |path, val|
296
293
  if val.nil?
297
294
  assert_nil(doc.fetch(path))
298
295
  else
@@ -309,15 +306,15 @@ class DocTest < Minitest::Test
309
306
  assert_nil(doc.fetch('/x'))
310
307
  assert_nil(doc.fetch('/0'))
311
308
  end
312
-
313
309
  end
314
310
 
315
311
  def test_move_fetch_path
316
312
  Oj::Doc.open(@json1) do |doc|
317
- [['/array/1', 'num', 3],
318
- ['/array/1', 'string', 'message'],
319
- ['/array/1/hash', 'h2/a', [1, 2, 3]],
320
- ].each do |path,fetch_path,val|
313
+ [
314
+ ['/array/1', 'num', 3],
315
+ ['/array/1', 'string', 'message'],
316
+ ['/array/1/hash', 'h2/a', [1, 2, 3]],
317
+ ].each do |path, fetch_path, val|
321
318
  doc.move(path)
322
319
  assert_equal(val, doc.fetch(fetch_path))
323
320
  end
@@ -326,13 +323,14 @@ class DocTest < Minitest::Test
326
323
 
327
324
  def test_exists
328
325
  Oj::Doc.open(@json1) do |doc|
329
- [['/array/1', true],
330
- ['/array/1', true],
331
- ['/array/1/hash', true],
332
- ['/array/1/dash', false],
333
- ['/array/3', false],
334
- ['/nothing', false],
335
- ].each do |path,val|
326
+ [
327
+ ['/array/1', true],
328
+ ['/array/1', true],
329
+ ['/array/1/hash', true],
330
+ ['/array/1/dash', false],
331
+ ['/array/3', false],
332
+ ['/nothing', false],
333
+ ].each do |path, val|
336
334
  assert_equal(val, doc.exists?(path), "failed for #{path.inspect}")
337
335
  end
338
336
  end
@@ -395,6 +393,19 @@ class DocTest < Minitest::Test
395
393
  end
396
394
  end
397
395
 
396
+ def test_nested_each_child
397
+ h = {}
398
+ Oj::Doc.open('{"a":1,"c":[2],"d":3}') do |doc|
399
+ doc.each_child('/') do |child|
400
+ h[child.path] = child.fetch
401
+ child.each_child do |grandchild|
402
+ h[grandchild.path] = grandchild.fetch
403
+ end
404
+ end
405
+ end
406
+ assert_equal({'/a'=>1, '/c'=>[2], '/c/1'=>2, '/d'=>3}, h)
407
+ end
408
+
398
409
  def test_size
399
410
  Oj::Doc.open('[1,2,3]') do |doc|
400
411
  assert_equal(4, doc.size)
@@ -405,8 +416,8 @@ class DocTest < Minitest::Test
405
416
  end
406
417
 
407
418
  def test_open_file
408
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
409
- File.open(filename, 'w') { |f| f.write('{"a":[1,2,3]}') }
419
+ filename = File.join(__dir__, 'open_file_test.json')
420
+ File.write(filename, '{"a":[1,2,3]}')
410
421
  Oj::Doc.open_file(filename) do |doc|
411
422
  assert_equal(5, doc.size)
412
423
  end
@@ -431,8 +442,8 @@ class DocTest < Minitest::Test
431
442
  end
432
443
 
433
444
  def test_file_open_close
434
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
435
- File.open(filename, 'w') { |f| f.write('{"a":[1,2,3]}') }
445
+ filename = File.join(__dir__, 'open_file_test.json')
446
+ File.write(filename, '{"a":[1,2,3]}')
436
447
  doc = Oj::Doc.open_file(filename)
437
448
  assert_equal(Oj::Doc, doc.class)
438
449
  assert_equal(5, doc.size)
@@ -459,7 +470,6 @@ class DocTest < Minitest::Test
459
470
  doc.home()
460
471
  assert_equal(2, doc.fetch('/a/2'))
461
472
  assert_equal(2, doc.fetch('a/2'))
462
- doc = nil
463
473
  GC.start
464
474
  # a print statement confirms close is called
465
475
  end
@@ -491,6 +501,11 @@ class DocTest < Minitest::Test
491
501
  assert_equal({'/a/x' => 2, '/b/y' => 4}, results)
492
502
  end
493
503
 
504
+ def test_doc_empty
505
+ result = Oj::Doc.open('') { |doc| doc.each_child {} }
506
+ assert_nil(result)
507
+ end
508
+
494
509
  def test_comment
495
510
  json = %{{
496
511
  "x"/*one*/:/*two*/true,//three
data/test/test_file.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
 
@@ -19,35 +19,29 @@ class FileJuice < Minitest::Test
19
19
  end
20
20
  alias == eql?
21
21
 
22
- end# Jam
22
+ end # Jam
23
23
 
24
24
  class Jeez < Jam
25
- def initialize(x, y)
26
- super
27
- end
28
25
 
29
- def to_json()
26
+ def to_json(*_args)
30
27
  %{{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}}
31
28
  end
32
29
 
33
30
  def self.json_create(h)
34
- self.new(h['x'], h['y'])
31
+ new(h['x'], h['y'])
35
32
  end
36
- end# Jeez
33
+ end # Jeez
37
34
 
38
35
  class Orange < Jam
39
- def initialize(x, y)
40
- super
41
- end
42
36
 
43
- def as_json()
37
+ def as_json
44
38
  { :json_class => self.class,
45
39
  :x => @x,
46
40
  :y => @y }
47
41
  end
48
42
 
49
43
  def self.json_create(h)
50
- self.new(h['x'], h['y'])
44
+ new(h['x'], h['y'])
51
45
  end
52
46
  end
53
47
 
@@ -73,8 +67,8 @@ class FileJuice < Minitest::Test
73
67
 
74
68
  def test_fixnum
75
69
  dump_and_load(0, false)
76
- dump_and_load(12345, false)
77
- dump_and_load(-54321, false)
70
+ dump_and_load(12_345, false)
71
+ dump_and_load(-54_321, false)
78
72
  dump_and_load(1, false)
79
73
  end
80
74
 
@@ -82,9 +76,9 @@ class FileJuice < Minitest::Test
82
76
  mode = Oj.default_options()[:mode]
83
77
  Oj.default_options = {:mode => :object}
84
78
  dump_and_load(0.0, false)
85
- dump_and_load(12345.6789, false)
79
+ dump_and_load(12_345.6789, false)
86
80
  dump_and_load(70.35, false)
87
- dump_and_load(-54321.012, false)
81
+ dump_and_load(-54_321.012, false)
88
82
  dump_and_load(1.7775, false)
89
83
  dump_and_load(2.5024, false)
90
84
  dump_and_load(2.48e16, false)
@@ -118,9 +112,9 @@ class FileJuice < Minitest::Test
118
112
  # Symbol
119
113
  def test_symbol_object
120
114
  Oj.default_options = { :mode => :object }
121
- #dump_and_load(''.to_sym, false)
115
+ # dump_and_load(''.to_sym, false)
122
116
  dump_and_load(:abc, false)
123
- dump_and_load(':xyz'.to_sym, false)
117
+ dump_and_load(:":xyz", false)
124
118
  end
125
119
 
126
120
  # Time
@@ -129,10 +123,11 @@ class FileJuice < Minitest::Test
129
123
  Oj.default_options = { :mode => :object, :time_format => :unix_zone }
130
124
  dump_and_load(t, false)
131
125
  end
126
+
132
127
  def test_time_object_early
133
- # Windows does not support dates before 1970.
134
- return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
135
- t = Time.xmlschema("1954-01-05T00:00:00.123456")
128
+ skip 'Windows does not support dates before 1970.' if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
129
+
130
+ t = Time.xmlschema('1954-01-05T00:00:00.123456')
136
131
  Oj.default_options = { :mode => :object, :time_format => :unix_zone }
137
132
  dump_and_load(t, false)
138
133
  end
@@ -162,12 +157,10 @@ class FileJuice < Minitest::Test
162
157
  def test_range_object
163
158
  Oj.default_options = { :mode => :object }
164
159
  json = Oj.dump(1..7, :mode => :object, :indent => 0)
165
- if 'rubinius' == $ruby
166
- assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
167
- elsif 'jruby' == $ruby
168
- assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
169
- else
160
+ if $ruby == 'ruby'
170
161
  assert_equal(%{{"^u":["Range",1,7,false]}}, json)
162
+ else
163
+ assert_equal(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}}, json)
171
164
  end
172
165
  dump_and_load(1..7, false)
173
166
  dump_and_load(1..1, false)
@@ -212,9 +205,27 @@ class FileJuice < Minitest::Test
212
205
  dump_and_load(DateTime.new(2012, 6, 19), false)
213
206
  end
214
207
 
208
+ def test_load_unicode_path
209
+ json =<<~JSON
210
+ {
211
+ "x":true,
212
+ "y":58,
213
+ "z": [1,2,3]
214
+ }
215
+ JSON
216
+
217
+ Tempfile.create('file_test_conceição1.json') do |f|
218
+ f.write(json)
219
+ f.close
220
+
221
+ objects = Oj.load_file(f.path)
222
+ assert_equal(Oj.load(json), objects)
223
+ end
224
+ end
225
+
215
226
  def dump_and_load(obj, trace=false)
216
- filename = File.join(File.dirname(__FILE__), 'file_test.json')
217
- File.open(filename, "w") { |f|
227
+ filename = File.join(__dir__, 'file_test.json')
228
+ File.open(filename, 'w') { |f|
218
229
  Oj.to_stream(f, obj, :indent => 2)
219
230
  }
220
231
  puts "\n*** file: '#{File.read(filename)}'" if trace
data/test/test_gc.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
 
@@ -14,22 +14,24 @@ class GCTest < Minitest::Test
14
14
  @child = child
15
15
  end
16
16
 
17
- def to_hash()
18
- { 'json_class' => "#{self.class}", 'x' => x, 'child' => child }
17
+ def to_hash
18
+ { 'json_class' => self.class.to_s, 'x' => x, 'child' => child }
19
19
  end
20
20
 
21
21
  def self.json_create(h)
22
22
  GC.start
23
- self.new(h['x'], h['child'])
23
+ new(h['x'], h['child'])
24
24
  end
25
25
  end # Goo
26
26
 
27
27
  def setup
28
28
  @default_options = Oj.default_options
29
+ GC.stress = true
29
30
  end
30
31
 
31
32
  def teardown
32
33
  Oj.default_options = @default_options
34
+ GC.stress = false
33
35
  end
34
36
 
35
37
  # if no crash then the GC marking is working
@@ -46,4 +48,13 @@ class GCTest < Minitest::Test
46
48
  json = Oj.dump(g, :mode => :object)
47
49
  Oj.object_load(json)
48
50
  end
51
+
52
+ def test_parse_gc
53
+ json = '{"a":"Alpha","b":true,"c":12345,"d":[true,[false,[-123456789,null],3.9676,["Something else.",false],null]],"e":{"zero":null,"one":1,"two":2,"three":[3],"four":[0,1,2,3,4]},"f":null,"h":{"a":{"b":{"c":{"d":{"e":{"f":{"g":null}}}}}}},"i":[[[[[[[null]]]]]]]}'
54
+
55
+ 50.times do
56
+ data = Oj.load(json)
57
+ assert_equal(json, Oj.dump(data))
58
+ end
59
+ end
49
60
  end
@@ -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'
@@ -15,7 +15,7 @@ class Generator < Minitest::Test
15
15
 
16
16
  def test_before
17
17
  json = Oj.generate({})
18
- assert_equal("{}", json)
18
+ assert_equal('{}', json)
19
19
  end
20
20
 
21
21
  end
data/test/test_hash.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
 
@@ -19,7 +19,7 @@ class HashTest < Minitest::Test
19
19
 
20
20
  def test_load
21
21
  obj = Oj.load(%|{"abc":3}|, :mode => :compat, :hash_class => Oj::EasyHash)
22
-
22
+
23
23
  assert_equal(Oj::EasyHash, obj.class)
24
24
  assert_equal(3, obj['abc'])
25
25
  assert_equal(3, obj[:abc])
@@ -35,5 +35,5 @@ class HashTest < Minitest::Test
35
35
  assert_equal(Oj::EasyHash, obj.class)
36
36
  assert_equal(3, obj[:abc])
37
37
  end
38
-
38
+
39
39
  end # HashTest
@@ -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'
@@ -23,19 +23,19 @@ class IntegerRangeTest < Minitest::Test
23
23
  end
24
24
 
25
25
  def test_range
26
- test = {s: 0, s2: -1, s3: 1, u: -2, u2: 2, u3: 9007199254740993}
26
+ test = {s: 0, s2: -1, s3: 1, u: -2, u2: 2, u3: 9_007_199_254_740_993}
27
27
  exp = '{"s":0,"s2":-1,"s3":1,"u":"-2","u2":"2","u3":"9007199254740993"}'
28
28
  assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
29
29
  end
30
30
 
31
31
  def test_bignum
32
- test = {u: -10000000000000000000, u2: 10000000000000000000}
32
+ test = {u: -10_000_000_000_000_000_000, u2: 10_000_000_000_000_000_000}
33
33
  exp = '{"u":"-10000000000000000000","u2":"10000000000000000000"}'
34
34
  assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
35
35
  end
36
36
 
37
37
  def test_valid_modes
38
- test = {safe: 0, unsafe: 9007199254740993}
38
+ test = {safe: 0, unsafe: 9_007_199_254_740_993}
39
39
  exp = '{"safe":0,"unsafe":"9007199254740993"}'
40
40
 
41
41
  [:strict, :null, :compat, :rails, :custom].each do |mode|
@@ -49,7 +49,7 @@ class IntegerRangeTest < Minitest::Test
49
49
  end
50
50
 
51
51
  def test_modes_without_opt
52
- test = {safe:0, unsafe: 10000000000000000000}
52
+ test = {safe: 0, unsafe: 10_000_000_000_000_000_000}
53
53
  exp = '{"safe":0,"unsafe":10000000000000000000}'
54
54
 
55
55
  [:strict, :null, :compat, :rails, :custom].each do |mode|
@@ -63,7 +63,7 @@ class IntegerRangeTest < Minitest::Test
63
63
  end
64
64
 
65
65
  def test_accept_nil_and_false
66
- test = {safe:0, unsafe: 10000000000000000000}
66
+ test = {safe: 0, unsafe: 10_000_000_000_000_000_000}
67
67
  exp = '{"safe":0,"unsafe":10000000000000000000}'
68
68
 
69
69
  assert_equal(exp, Oj.dump(test, integer_range: nil))