oj 3.11.5 → 3.16.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +19 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +20 -6
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +10 -9
  9. data/ext/oj/circarray.c +8 -6
  10. data/ext/oj/circarray.h +2 -2
  11. data/ext/oj/code.c +19 -33
  12. data/ext/oj/code.h +2 -2
  13. data/ext/oj/compat.c +27 -77
  14. data/ext/oj/custom.c +86 -179
  15. data/ext/oj/debug.c +126 -0
  16. data/ext/oj/dump.c +256 -249
  17. data/ext/oj/dump.h +26 -12
  18. data/ext/oj/dump_compat.c +565 -642
  19. data/ext/oj/dump_leaf.c +17 -63
  20. data/ext/oj/dump_object.c +65 -187
  21. data/ext/oj/dump_strict.c +27 -51
  22. data/ext/oj/encoder.c +43 -0
  23. data/ext/oj/err.c +2 -13
  24. data/ext/oj/err.h +24 -8
  25. data/ext/oj/extconf.rb +21 -6
  26. data/ext/oj/fast.c +149 -149
  27. data/ext/oj/intern.c +313 -0
  28. data/ext/oj/intern.h +22 -0
  29. data/ext/oj/mem.c +318 -0
  30. data/ext/oj/mem.h +53 -0
  31. data/ext/oj/mimic_json.c +121 -106
  32. data/ext/oj/object.c +85 -162
  33. data/ext/oj/odd.c +89 -67
  34. data/ext/oj/odd.h +15 -15
  35. data/ext/oj/oj.c +542 -411
  36. data/ext/oj/oj.h +99 -73
  37. data/ext/oj/parse.c +175 -187
  38. data/ext/oj/parse.h +26 -24
  39. data/ext/oj/parser.c +1600 -0
  40. data/ext/oj/parser.h +101 -0
  41. data/ext/oj/rails.c +112 -159
  42. data/ext/oj/rails.h +1 -1
  43. data/ext/oj/reader.c +11 -14
  44. data/ext/oj/reader.h +4 -2
  45. data/ext/oj/resolve.c +5 -24
  46. data/ext/oj/rxclass.c +7 -6
  47. data/ext/oj/rxclass.h +1 -1
  48. data/ext/oj/saj.c +22 -33
  49. data/ext/oj/saj2.c +584 -0
  50. data/ext/oj/saj2.h +23 -0
  51. data/ext/oj/scp.c +5 -28
  52. data/ext/oj/sparse.c +28 -72
  53. data/ext/oj/stream_writer.c +50 -40
  54. data/ext/oj/strict.c +56 -61
  55. data/ext/oj/string_writer.c +72 -39
  56. data/ext/oj/trace.h +31 -4
  57. data/ext/oj/usual.c +1218 -0
  58. data/ext/oj/usual.h +69 -0
  59. data/ext/oj/util.h +1 -1
  60. data/ext/oj/val_stack.c +14 -3
  61. data/ext/oj/val_stack.h +8 -7
  62. data/ext/oj/validate.c +46 -0
  63. data/ext/oj/wab.c +63 -88
  64. data/lib/oj/active_support_helper.rb +1 -3
  65. data/lib/oj/bag.rb +7 -1
  66. data/lib/oj/easy_hash.rb +4 -5
  67. data/lib/oj/error.rb +1 -2
  68. data/lib/oj/json.rb +162 -150
  69. data/lib/oj/mimic.rb +9 -7
  70. data/lib/oj/saj.rb +20 -6
  71. data/lib/oj/schandler.rb +5 -4
  72. data/lib/oj/state.rb +12 -8
  73. data/lib/oj/version.rb +1 -2
  74. data/lib/oj.rb +2 -0
  75. data/pages/Compatibility.md +1 -1
  76. data/pages/InstallOptions.md +20 -0
  77. data/pages/JsonGem.md +15 -0
  78. data/pages/Modes.md +8 -3
  79. data/pages/Options.md +43 -5
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +14 -2
  82. data/test/_test_active.rb +8 -9
  83. data/test/_test_active_mimic.rb +7 -8
  84. data/test/_test_mimic_rails.rb +17 -20
  85. data/test/activerecord/result_test.rb +5 -6
  86. data/test/activesupport6/encoding_test.rb +63 -28
  87. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  88. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  89. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  90. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  91. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  92. data/test/files.rb +15 -15
  93. data/test/foo.rb +16 -45
  94. data/test/helper.rb +11 -8
  95. data/test/isolated/shared.rb +3 -2
  96. data/test/json_gem/json_addition_test.rb +2 -2
  97. data/test/json_gem/json_common_interface_test.rb +8 -6
  98. data/test/json_gem/json_encoding_test.rb +0 -0
  99. data/test/json_gem/json_ext_parser_test.rb +1 -0
  100. data/test/json_gem/json_fixtures_test.rb +3 -2
  101. data/test/json_gem/json_generator_test.rb +56 -38
  102. data/test/json_gem/json_generic_object_test.rb +11 -11
  103. data/test/json_gem/json_parser_test.rb +54 -47
  104. data/test/json_gem/json_string_matching_test.rb +9 -9
  105. data/test/json_gem/test_helper.rb +7 -3
  106. data/test/mem.rb +34 -0
  107. data/test/perf.rb +22 -27
  108. data/test/perf_compat.rb +31 -33
  109. data/test/perf_dump.rb +50 -0
  110. data/test/perf_fast.rb +80 -82
  111. data/test/perf_file.rb +27 -29
  112. data/test/perf_object.rb +65 -69
  113. data/test/perf_once.rb +59 -0
  114. data/test/perf_parser.rb +183 -0
  115. data/test/perf_saj.rb +46 -54
  116. data/test/perf_scp.rb +58 -69
  117. data/test/perf_simple.rb +41 -39
  118. data/test/perf_strict.rb +74 -82
  119. data/test/perf_wab.rb +67 -69
  120. data/test/prec.rb +5 -5
  121. data/test/sample/change.rb +0 -1
  122. data/test/sample/dir.rb +0 -1
  123. data/test/sample/doc.rb +0 -1
  124. data/test/sample/file.rb +0 -1
  125. data/test/sample/group.rb +0 -1
  126. data/test/sample/hasprops.rb +0 -1
  127. data/test/sample/layer.rb +0 -1
  128. data/test/sample/rect.rb +0 -1
  129. data/test/sample/shape.rb +0 -1
  130. data/test/sample/text.rb +0 -1
  131. data/test/sample.rb +16 -16
  132. data/test/sample_json.rb +8 -8
  133. data/test/test_compat.rb +95 -43
  134. data/test/test_custom.rb +73 -51
  135. data/test/test_debian.rb +7 -10
  136. data/test/test_fast.rb +135 -79
  137. data/test/test_file.rb +41 -30
  138. data/test/test_gc.rb +16 -5
  139. data/test/test_generate.rb +5 -5
  140. data/test/test_hash.rb +5 -5
  141. data/test/test_integer_range.rb +9 -9
  142. data/test/test_null.rb +20 -20
  143. data/test/test_object.rb +99 -96
  144. data/test/test_parser.rb +11 -0
  145. data/test/test_parser_debug.rb +27 -0
  146. data/test/test_parser_saj.rb +337 -0
  147. data/test/test_parser_usual.rb +251 -0
  148. data/test/test_rails.rb +2 -2
  149. data/test/test_saj.rb +10 -8
  150. data/test/test_scp.rb +37 -39
  151. data/test/test_strict.rb +40 -32
  152. data/test/test_various.rb +165 -84
  153. data/test/test_wab.rb +48 -44
  154. data/test/test_writer.rb +47 -47
  155. data/test/tests.rb +13 -5
  156. data/test/tests_mimic.rb +12 -3
  157. data/test/tests_mimic_addition.rb +12 -3
  158. metadata +74 -128
  159. data/ext/oj/hash.c +0 -131
  160. data/ext/oj/hash.h +0 -19
  161. data/ext/oj/hash_test.c +0 -491
  162. data/test/activesupport4/decoding_test.rb +0 -108
  163. data/test/activesupport4/encoding_test.rb +0 -531
  164. data/test/activesupport4/test_helper.rb +0 -41
  165. data/test/activesupport5/test_helper.rb +0 -72
  166. data/test/bar.rb +0 -35
  167. data/test/baz.rb +0 -16
  168. data/test/zoo.rb +0 -13
data/test/test_fast.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
 
@@ -36,11 +36,22 @@ class DocTest < Minitest::Test
36
36
  end
37
37
  end
38
38
 
39
+ def test_leaf_of_existing_path
40
+ json = %{{"foo": 1, "fizz": true}}
41
+ Oj::Doc.open(json) do |doc|
42
+ %w(/foo/bar /fizz/bar).each do |path|
43
+ assert_nil(doc.fetch(path))
44
+ assert_equal(:default, doc.fetch(path, :default))
45
+ refute(doc.exists?(path))
46
+ end
47
+ end
48
+ end
49
+
39
50
  def test_true
40
51
  json = %{true}
41
52
  Oj::Doc.open(json) do |doc|
42
53
  assert_equal(TrueClass, doc.type)
43
- assert_equal(true, doc.fetch())
54
+ assert(doc.fetch())
44
55
  end
45
56
  end
46
57
 
@@ -48,7 +59,7 @@ class DocTest < Minitest::Test
48
59
  json = %{false}
49
60
  Oj::Doc.open(json) do |doc|
50
61
  assert_equal(FalseClass, doc.type)
51
- assert_equal(false, doc.fetch())
62
+ refute(doc.fetch())
52
63
  end
53
64
  end
54
65
 
@@ -64,7 +75,7 @@ class DocTest < Minitest::Test
64
75
  json = %{"ぴーたー"}
65
76
  Oj::Doc.open(json) do |doc|
66
77
  assert_equal(String, doc.type)
67
- assert_equal("ぴーたー", doc.fetch())
78
+ assert_equal('ぴーたー', doc.fetch())
68
79
  end
69
80
  end
70
81
 
@@ -72,19 +83,15 @@ class DocTest < Minitest::Test
72
83
  json = %{"\\u3074\\u30fc\\u305f\\u30fc"}
73
84
  Oj::Doc.open(json) do |doc|
74
85
  assert_equal(String, doc.type)
75
- assert_equal("ぴーたー", doc.fetch())
86
+ assert_equal('ぴーたー', doc.fetch())
76
87
  end
77
88
  end
78
89
 
79
90
  def test_fixnum
80
91
  json = %{12345}
81
92
  Oj::Doc.open(json) do |doc|
82
- if '2.4.0' <= RUBY_VERSION
83
- assert_equal(Integer, doc.type)
84
- else
85
- assert_equal(Fixnum, doc.type)
86
- end
87
- assert_equal(12345, doc.fetch())
93
+ assert_equal(Integer, doc.type)
94
+ assert_equal(12_345, doc.fetch())
88
95
  end
89
96
  end
90
97
 
@@ -92,7 +99,7 @@ class DocTest < Minitest::Test
92
99
  json = %{12345.6789}
93
100
  Oj::Doc.open(json) do |doc|
94
101
  assert_equal(Float, doc.type)
95
- assert_equal(12345.6789, doc.fetch())
102
+ assert_in_delta(12_345.6789, doc.fetch())
96
103
  end
97
104
  end
98
105
 
@@ -100,8 +107,8 @@ class DocTest < Minitest::Test
100
107
  json = %{12345.6789e7}
101
108
  Oj::Doc.open(json) do |doc|
102
109
  assert_equal(Float, doc.type)
103
- #assert_equal(12345.6789e7, doc.fetch())
104
- 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)
105
112
  end
106
113
  end
107
114
 
@@ -109,7 +116,7 @@ class DocTest < Minitest::Test
109
116
  json = %{[]}
110
117
  Oj::Doc.open(json) do |doc|
111
118
  assert_equal(Array, doc.type)
112
- assert_equal([], doc.fetch())
119
+ assert_empty(doc.fetch())
113
120
  end
114
121
  end
115
122
 
@@ -125,7 +132,7 @@ class DocTest < Minitest::Test
125
132
  json = %{{}}
126
133
  Oj::Doc.open(json) do |doc|
127
134
  assert_equal(Hash, doc.type)
128
- assert_equal({}, doc.fetch())
135
+ assert_empty(doc.fetch())
129
136
  end
130
137
  end
131
138
 
@@ -160,7 +167,8 @@ class DocTest < Minitest::Test
160
167
 
161
168
  def test_move
162
169
  Oj::Doc.open(@json1) do |doc|
163
- [ '/',
170
+ [
171
+ '/',
164
172
  '/array',
165
173
  '/boolean',
166
174
  '/array/1/hash/h2/a/3',
@@ -193,13 +201,14 @@ class DocTest < Minitest::Test
193
201
 
194
202
  def test_move_relative
195
203
  Oj::Doc.open(@json1) do |doc|
196
- [['/', 'array', '/array'],
197
- ['/array', '1/num', '/array/1/num'],
198
- ['/array/1/hash', 'h2/a', '/array/1/hash/h2/a'],
199
- ['/array/1', 'hash/h2/a/2', '/array/1/hash/h2/a/2'],
200
- ['/array/1/hash', '../string', '/array/1/string'],
201
- ['/array/1/hash', '..', '/array/1'],
202
- ].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|
203
212
  doc.move(start)
204
213
  doc.move(path)
205
214
  assert_equal(where, doc.where?)
@@ -208,21 +217,17 @@ class DocTest < Minitest::Test
208
217
  end
209
218
 
210
219
  def test_type
211
- if '2.4.0' <= RUBY_VERSION
212
- num_class = Integer
213
- else
214
- num_class = Fixnum
215
- end
216
220
  Oj::Doc.open(@json1) do |doc|
217
- [['/', Hash],
218
- ['/array', Array],
219
- ['/array/1', Hash],
220
- ['/array/1/num', num_class],
221
- ['/array/1/string', String],
222
- ['/array/1/hash/h2/a', Array],
223
- ['/array/1/hash/../num', num_class],
224
- ['/array/1/hash/../..', Array],
225
- ].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|
226
231
  assert_equal(type, doc.type(path))
227
232
  end
228
233
  end
@@ -230,16 +235,17 @@ class DocTest < Minitest::Test
230
235
 
231
236
  def test_local_key
232
237
  Oj::Doc.open(@json1) do |doc|
233
- [['/', nil],
234
- ['/array', 'array'],
235
- ['/array/1', 1],
236
- ['/array/1/num', 'num'],
237
- ['/array/1/string', 'string'],
238
- ['/array/1/hash/h2/a', 'a'],
239
- ['/array/1/hash/../num', 'num'],
240
- ['/array/1/hash/..', 1],
241
- ['/array/1/hash/../..', 'array'],
242
- ].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|
243
249
  doc.move(path)
244
250
  if key.nil?
245
251
  assert_nil(doc.local_key())
@@ -252,16 +258,17 @@ class DocTest < Minitest::Test
252
258
 
253
259
  def test_fetch_move
254
260
  Oj::Doc.open(@json1) do |doc|
255
- [['/array/1/num', 3],
256
- ['/array/1/string', 'message'],
257
- ['/array/1/hash/h2/a', [1, 2, 3]],
258
- ['/array/1/hash/../num', 3],
259
- ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
260
- ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
261
- ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
262
- ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
263
- ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
264
- ].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|
265
272
  doc.move(path)
266
273
  assert_equal(val, doc.fetch())
267
274
  end
@@ -270,33 +277,65 @@ class DocTest < Minitest::Test
270
277
 
271
278
  def test_fetch_path
272
279
  Oj::Doc.open(@json1) do |doc|
273
- [['/array/1/num', 3],
274
- ['/array/1/string', 'message'],
275
- ['/array/1/hash/h2/a', [1, 2, 3]],
276
- ['/array/1/hash/../num', 3],
277
- ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
278
- ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
279
- ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
280
- ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
281
- ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
282
- ].each do |path,val|
283
- assert_equal(val, doc.fetch(path))
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|
293
+ if val.nil?
294
+ assert_nil(doc.fetch(path))
295
+ else
296
+ assert_equal(val, doc.fetch(path))
297
+ end
284
298
  end
285
299
  end
300
+ # verify empty hash and arrays return nil when a member is requested
301
+ Oj::Doc.open('{}') do |doc|
302
+ assert_nil(doc.fetch('/x'))
303
+ assert_nil(doc.fetch('/0'))
304
+ end
305
+ Oj::Doc.open('[]') do |doc|
306
+ assert_nil(doc.fetch('/x'))
307
+ assert_nil(doc.fetch('/0'))
308
+ end
286
309
  end
287
310
 
288
311
  def test_move_fetch_path
289
312
  Oj::Doc.open(@json1) do |doc|
290
- [['/array/1', 'num', 3],
291
- ['/array/1', 'string', 'message'],
292
- ['/array/1/hash', 'h2/a', [1, 2, 3]],
293
- ].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|
294
318
  doc.move(path)
295
319
  assert_equal(val, doc.fetch(fetch_path))
296
320
  end
297
321
  end
298
322
  end
299
323
 
324
+ def test_exists
325
+ Oj::Doc.open(@json1) do |doc|
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|
334
+ assert_equal(val, doc.exists?(path), "failed for #{path.inspect}")
335
+ end
336
+ end
337
+ end
338
+
300
339
  def test_home
301
340
  Oj::Doc.open(@json1) do |doc|
302
341
  doc.move('/array/1/num')
@@ -354,6 +393,19 @@ class DocTest < Minitest::Test
354
393
  end
355
394
  end
356
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
+
357
409
  def test_size
358
410
  Oj::Doc.open('[1,2,3]') do |doc|
359
411
  assert_equal(4, doc.size)
@@ -364,8 +416,8 @@ class DocTest < Minitest::Test
364
416
  end
365
417
 
366
418
  def test_open_file
367
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
368
- 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]}')
369
421
  Oj::Doc.open_file(filename) do |doc|
370
422
  assert_equal(5, doc.size)
371
423
  end
@@ -390,8 +442,8 @@ class DocTest < Minitest::Test
390
442
  end
391
443
 
392
444
  def test_file_open_close
393
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
394
- 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]}')
395
447
  doc = Oj::Doc.open_file(filename)
396
448
  assert_equal(Oj::Doc, doc.class)
397
449
  assert_equal(5, doc.size)
@@ -418,7 +470,6 @@ class DocTest < Minitest::Test
418
470
  doc.home()
419
471
  assert_equal(2, doc.fetch('/a/2'))
420
472
  assert_equal(2, doc.fetch('a/2'))
421
- doc = nil
422
473
  GC.start
423
474
  # a print statement confirms close is called
424
475
  end
@@ -450,6 +501,11 @@ class DocTest < Minitest::Test
450
501
  assert_equal({'/a/x' => 2, '/b/y' => 4}, results)
451
502
  end
452
503
 
504
+ def test_doc_empty
505
+ result = Oj::Doc.open('') { |doc| doc.each_child {} }
506
+ assert_nil(result)
507
+ end
508
+
453
509
  def test_comment
454
510
  json = %{{
455
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,11 +1,11 @@
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
 
8
- class Hashi < Minitest::Test
8
+ class HashTest < Minitest::Test
9
9
 
10
10
  module TestModule
11
11
  end
@@ -19,7 +19,7 @@ class Hashi < 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 Hashi < 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