oj 2.18.3 → 3.13.14

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 (182) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1324 -0
  3. data/README.md +51 -204
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +49 -72
  6. data/ext/oj/cache.c +326 -0
  7. data/ext/oj/cache.h +21 -0
  8. data/ext/oj/cache8.c +61 -64
  9. data/ext/oj/cache8.h +12 -39
  10. data/ext/oj/circarray.c +37 -68
  11. data/ext/oj/circarray.h +16 -42
  12. data/ext/oj/code.c +221 -0
  13. data/ext/oj/code.h +40 -0
  14. data/ext/oj/compat.c +231 -107
  15. data/ext/oj/custom.c +1125 -0
  16. data/ext/oj/debug.c +132 -0
  17. data/ext/oj/dump.c +935 -2513
  18. data/ext/oj/dump.h +108 -0
  19. data/ext/oj/dump_compat.c +936 -0
  20. data/ext/oj/dump_leaf.c +164 -0
  21. data/ext/oj/dump_object.c +761 -0
  22. data/ext/oj/dump_strict.c +410 -0
  23. data/ext/oj/encode.h +7 -42
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +40 -54
  26. data/ext/oj/err.h +52 -46
  27. data/ext/oj/extconf.rb +21 -30
  28. data/ext/oj/fast.c +1097 -1080
  29. data/ext/oj/intern.c +301 -0
  30. data/ext/oj/intern.h +26 -0
  31. data/ext/oj/mimic_json.c +893 -0
  32. data/ext/oj/object.c +549 -620
  33. data/ext/oj/odd.c +155 -167
  34. data/ext/oj/odd.h +37 -63
  35. data/ext/oj/oj.c +1661 -2063
  36. data/ext/oj/oj.h +341 -270
  37. data/ext/oj/parse.c +974 -737
  38. data/ext/oj/parse.h +105 -97
  39. data/ext/oj/parser.c +1526 -0
  40. data/ext/oj/parser.h +90 -0
  41. data/ext/oj/rails.c +1504 -0
  42. data/ext/oj/rails.h +18 -0
  43. data/ext/oj/reader.c +141 -163
  44. data/ext/oj/reader.h +75 -113
  45. data/ext/oj/resolve.c +45 -93
  46. data/ext/oj/resolve.h +7 -34
  47. data/ext/oj/rxclass.c +143 -0
  48. data/ext/oj/rxclass.h +26 -0
  49. data/ext/oj/saj.c +447 -511
  50. data/ext/oj/saj2.c +348 -0
  51. data/ext/oj/scp.c +91 -138
  52. data/ext/oj/sparse.c +793 -644
  53. data/ext/oj/stream_writer.c +331 -0
  54. data/ext/oj/strict.c +145 -109
  55. data/ext/oj/string_writer.c +493 -0
  56. data/ext/oj/trace.c +72 -0
  57. data/ext/oj/trace.h +28 -0
  58. data/ext/oj/usual.c +1254 -0
  59. data/ext/oj/util.c +136 -0
  60. data/ext/oj/util.h +20 -0
  61. data/ext/oj/val_stack.c +62 -70
  62. data/ext/oj/val_stack.h +95 -129
  63. data/ext/oj/validate.c +51 -0
  64. data/ext/oj/wab.c +622 -0
  65. data/lib/oj/bag.rb +1 -0
  66. data/lib/oj/easy_hash.rb +17 -8
  67. data/lib/oj/error.rb +10 -11
  68. data/lib/oj/json.rb +176 -0
  69. data/lib/oj/mimic.rb +158 -19
  70. data/lib/oj/state.rb +132 -0
  71. data/lib/oj/version.rb +2 -2
  72. data/lib/oj.rb +1 -31
  73. data/pages/Advanced.md +22 -0
  74. data/pages/Compatibility.md +25 -0
  75. data/pages/Custom.md +23 -0
  76. data/pages/Encoding.md +65 -0
  77. data/pages/JsonGem.md +94 -0
  78. data/pages/Modes.md +161 -0
  79. data/pages/Options.md +327 -0
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +167 -0
  82. data/pages/Security.md +20 -0
  83. data/pages/WAB.md +13 -0
  84. data/test/activerecord/result_test.rb +32 -0
  85. data/test/activesupport4/decoding_test.rb +108 -0
  86. data/test/activesupport4/encoding_test.rb +531 -0
  87. data/test/activesupport4/test_helper.rb +41 -0
  88. data/test/activesupport5/abstract_unit.rb +45 -0
  89. data/test/activesupport5/decoding_test.rb +133 -0
  90. data/test/activesupport5/encoding_test.rb +500 -0
  91. data/test/activesupport5/encoding_test_cases.rb +98 -0
  92. data/test/activesupport5/test_helper.rb +72 -0
  93. data/test/activesupport5/time_zone_test_helpers.rb +39 -0
  94. data/test/activesupport6/abstract_unit.rb +44 -0
  95. data/test/activesupport6/decoding_test.rb +133 -0
  96. data/test/activesupport6/encoding_test.rb +507 -0
  97. data/test/activesupport6/encoding_test_cases.rb +98 -0
  98. data/test/activesupport6/test_common.rb +17 -0
  99. data/test/activesupport6/test_helper.rb +163 -0
  100. data/test/activesupport6/time_zone_test_helpers.rb +39 -0
  101. data/test/activesupport7/abstract_unit.rb +49 -0
  102. data/test/activesupport7/decoding_test.rb +125 -0
  103. data/test/activesupport7/encoding_test.rb +486 -0
  104. data/test/activesupport7/encoding_test_cases.rb +104 -0
  105. data/test/activesupport7/time_zone_test_helpers.rb +47 -0
  106. data/test/bar.rb +9 -0
  107. data/test/baz.rb +16 -0
  108. data/test/bug.rb +11 -46
  109. data/test/foo.rb +69 -16
  110. data/test/helper.rb +10 -1
  111. data/test/isolated/shared.rb +12 -8
  112. data/test/isolated/test_mimic_rails_after.rb +3 -3
  113. data/test/isolated/test_mimic_rails_before.rb +3 -3
  114. data/test/json_gem/json_addition_test.rb +216 -0
  115. data/test/json_gem/json_common_interface_test.rb +153 -0
  116. data/test/json_gem/json_encoding_test.rb +107 -0
  117. data/test/json_gem/json_ext_parser_test.rb +20 -0
  118. data/test/json_gem/json_fixtures_test.rb +35 -0
  119. data/test/json_gem/json_generator_test.rb +397 -0
  120. data/test/json_gem/json_generic_object_test.rb +90 -0
  121. data/test/json_gem/json_parser_test.rb +470 -0
  122. data/test/json_gem/json_string_matching_test.rb +42 -0
  123. data/test/json_gem/test_helper.rb +26 -0
  124. data/test/mem.rb +33 -0
  125. data/test/perf.rb +1 -1
  126. data/test/perf_compat.rb +30 -28
  127. data/test/perf_dump.rb +50 -0
  128. data/test/perf_object.rb +1 -1
  129. data/test/perf_once.rb +58 -0
  130. data/test/perf_parser.rb +189 -0
  131. data/test/perf_scp.rb +11 -10
  132. data/test/perf_strict.rb +30 -19
  133. data/test/perf_wab.rb +131 -0
  134. data/test/prec.rb +23 -0
  135. data/test/sample.rb +0 -1
  136. data/test/sample_json.rb +1 -1
  137. data/test/test_compat.rb +219 -102
  138. data/test/test_custom.rb +533 -0
  139. data/test/test_fast.rb +107 -35
  140. data/test/test_file.rb +19 -25
  141. data/test/test_generate.rb +21 -0
  142. data/test/test_hash.rb +11 -1
  143. data/test/test_integer_range.rb +72 -0
  144. data/test/test_null.rb +376 -0
  145. data/test/test_object.rb +357 -70
  146. data/test/test_parser.rb +27 -0
  147. data/test/test_parser_saj.rb +245 -0
  148. data/test/test_parser_usual.rb +217 -0
  149. data/test/test_rails.rb +35 -0
  150. data/test/test_saj.rb +1 -1
  151. data/test/test_scp.rb +39 -2
  152. data/test/test_strict.rb +186 -7
  153. data/test/test_various.rb +160 -774
  154. data/test/test_wab.rb +307 -0
  155. data/test/test_writer.rb +90 -2
  156. data/test/tests.rb +24 -0
  157. data/test/tests_mimic.rb +14 -0
  158. data/test/tests_mimic_addition.rb +7 -0
  159. data/test/zoo.rb +13 -0
  160. metadata +194 -56
  161. data/ext/oj/hash.c +0 -163
  162. data/ext/oj/hash.h +0 -46
  163. data/ext/oj/hash_test.c +0 -512
  164. data/test/activesupport_datetime_test.rb +0 -23
  165. data/test/bug2.rb +0 -10
  166. data/test/bug3.rb +0 -46
  167. data/test/bug_fast.rb +0 -32
  168. data/test/bug_load.rb +0 -24
  169. data/test/crash.rb +0 -111
  170. data/test/curl/curl_oj.rb +0 -46
  171. data/test/curl/get_oj.rb +0 -24
  172. data/test/curl/just_curl.rb +0 -31
  173. data/test/curl/just_oj.rb +0 -51
  174. data/test/example.rb +0 -11
  175. data/test/io.rb +0 -48
  176. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  177. data/test/mod.rb +0 -16
  178. data/test/rails.rb +0 -50
  179. data/test/russian.rb +0 -18
  180. data/test/struct.rb +0 -29
  181. data/test/test_serializer.rb +0 -59
  182. data/test/write_timebars.rb +0 -31
data/test/test_fast.rb CHANGED
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: UTF-8
2
+ # coding: utf-8
3
+ # frozen_string_literal: true
3
4
 
4
5
  $: << File.dirname(__FILE__)
5
6
 
6
7
  require 'helper'
7
8
 
8
- $json1 = %|{
9
- "array": [
10
- {
11
- "num" : 3,
12
- "string": "message",
13
- "hash" : {
14
- "h2" : {
15
- "a" : [ 1, 2, 3 ]
16
- }
17
- }
18
- }
19
- ],
20
- "boolean" : true
21
- }|
22
-
23
9
  class DocTest < Minitest::Test
24
10
  def setup
25
11
  @default_options = Oj.default_options
12
+ @json1 = %|{
13
+ "array": [
14
+ {
15
+ "num" : 3,
16
+ "string": "message",
17
+ "hash" : {
18
+ "h2" : {
19
+ "a" : [ 1, 2, 3 ]
20
+ }
21
+ }
22
+ }
23
+ ],
24
+ "boolean" : true
25
+ }|
26
26
  end
27
27
 
28
28
  def teardown
@@ -33,7 +33,18 @@ class DocTest < Minitest::Test
33
33
  json = %{null}
34
34
  Oj::Doc.open(json) do |doc|
35
35
  assert_equal(NilClass, doc.type)
36
- assert_equal(nil, doc.fetch())
36
+ assert_nil(doc.fetch())
37
+ end
38
+ end
39
+
40
+ def test_leaf_of_existing_path
41
+ json = %{{"foo": 1, "fizz": true}}
42
+ Oj::Doc.open(json) do |doc|
43
+ %w(/foo/bar /fizz/bar).each do |path|
44
+ assert_nil(doc.fetch(path))
45
+ assert_equal(:default, doc.fetch(path, :default))
46
+ refute(doc.exists?(path))
47
+ end
37
48
  end
38
49
  end
39
50
 
@@ -80,7 +91,11 @@ class DocTest < Minitest::Test
80
91
  def test_fixnum
81
92
  json = %{12345}
82
93
  Oj::Doc.open(json) do |doc|
83
- assert_equal(Fixnum, doc.type)
94
+ if '2.4.0' <= RUBY_VERSION
95
+ assert_equal(Integer, doc.type)
96
+ else
97
+ assert_equal(Fixnum, doc.type)
98
+ end
84
99
  assert_equal(12345, doc.fetch())
85
100
  end
86
101
  end
@@ -156,7 +171,7 @@ class DocTest < Minitest::Test
156
171
  end
157
172
 
158
173
  def test_move
159
- Oj::Doc.open($json1) do |doc|
174
+ Oj::Doc.open(@json1) do |doc|
160
175
  [ '/',
161
176
  '/array',
162
177
  '/boolean',
@@ -189,7 +204,7 @@ class DocTest < Minitest::Test
189
204
  end
190
205
 
191
206
  def test_move_relative
192
- Oj::Doc.open($json1) do |doc|
207
+ Oj::Doc.open(@json1) do |doc|
193
208
  [['/', 'array', '/array'],
194
209
  ['/array', '1/num', '/array/1/num'],
195
210
  ['/array/1/hash', 'h2/a', '/array/1/hash/h2/a'],
@@ -205,14 +220,19 @@ class DocTest < Minitest::Test
205
220
  end
206
221
 
207
222
  def test_type
208
- Oj::Doc.open($json1) do |doc|
223
+ if '2.4.0' <= RUBY_VERSION
224
+ num_class = Integer
225
+ else
226
+ num_class = Fixnum
227
+ end
228
+ Oj::Doc.open(@json1) do |doc|
209
229
  [['/', Hash],
210
230
  ['/array', Array],
211
231
  ['/array/1', Hash],
212
- ['/array/1/num', Fixnum],
232
+ ['/array/1/num', num_class],
213
233
  ['/array/1/string', String],
214
234
  ['/array/1/hash/h2/a', Array],
215
- ['/array/1/hash/../num', Fixnum],
235
+ ['/array/1/hash/../num', num_class],
216
236
  ['/array/1/hash/../..', Array],
217
237
  ].each do |path,type|
218
238
  assert_equal(type, doc.type(path))
@@ -221,7 +241,7 @@ class DocTest < Minitest::Test
221
241
  end
222
242
 
223
243
  def test_local_key
224
- Oj::Doc.open($json1) do |doc|
244
+ Oj::Doc.open(@json1) do |doc|
225
245
  [['/', nil],
226
246
  ['/array', 'array'],
227
247
  ['/array/1', 1],
@@ -233,13 +253,17 @@ class DocTest < Minitest::Test
233
253
  ['/array/1/hash/../..', 'array'],
234
254
  ].each do |path,key|
235
255
  doc.move(path)
236
- assert_equal(key, doc.local_key())
256
+ if key.nil?
257
+ assert_nil(doc.local_key())
258
+ else
259
+ assert_equal(key, doc.local_key())
260
+ end
237
261
  end
238
262
  end
239
263
  end
240
264
 
241
265
  def test_fetch_move
242
- Oj::Doc.open($json1) do |doc|
266
+ Oj::Doc.open(@json1) do |doc|
243
267
  [['/array/1/num', 3],
244
268
  ['/array/1/string', 'message'],
245
269
  ['/array/1/hash/h2/a', [1, 2, 3]],
@@ -257,7 +281,7 @@ class DocTest < Minitest::Test
257
281
  end
258
282
 
259
283
  def test_fetch_path
260
- Oj::Doc.open($json1) do |doc|
284
+ Oj::Doc.open(@json1) do |doc|
261
285
  [['/array/1/num', 3],
262
286
  ['/array/1/string', 'message'],
263
287
  ['/array/1/hash/h2/a', [1, 2, 3]],
@@ -267,14 +291,30 @@ class DocTest < Minitest::Test
267
291
  ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
268
292
  ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
269
293
  ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
294
+ ['/nothing', nil],
295
+ ['/array/10', nil],
270
296
  ].each do |path,val|
271
- assert_equal(val, doc.fetch(path))
297
+ if val.nil?
298
+ assert_nil(doc.fetch(path))
299
+ else
300
+ assert_equal(val, doc.fetch(path))
301
+ end
272
302
  end
273
303
  end
304
+ # verify empty hash and arrays return nil when a member is requested
305
+ Oj::Doc.open('{}') do |doc|
306
+ assert_nil(doc.fetch('/x'))
307
+ assert_nil(doc.fetch('/0'))
308
+ end
309
+ Oj::Doc.open('[]') do |doc|
310
+ assert_nil(doc.fetch('/x'))
311
+ assert_nil(doc.fetch('/0'))
312
+ end
313
+
274
314
  end
275
315
 
276
316
  def test_move_fetch_path
277
- Oj::Doc.open($json1) do |doc|
317
+ Oj::Doc.open(@json1) do |doc|
278
318
  [['/array/1', 'num', 3],
279
319
  ['/array/1', 'string', 'message'],
280
320
  ['/array/1/hash', 'h2/a', [1, 2, 3]],
@@ -285,8 +325,22 @@ class DocTest < Minitest::Test
285
325
  end
286
326
  end
287
327
 
328
+ def test_exists
329
+ Oj::Doc.open(@json1) do |doc|
330
+ [['/array/1', true],
331
+ ['/array/1', true],
332
+ ['/array/1/hash', true],
333
+ ['/array/1/dash', false],
334
+ ['/array/3', false],
335
+ ['/nothing', false],
336
+ ].each do |path,val|
337
+ assert_equal(val, doc.exists?(path), "failed for #{path.inspect}")
338
+ end
339
+ end
340
+ end
341
+
288
342
  def test_home
289
- Oj::Doc.open($json1) do |doc|
343
+ Oj::Doc.open(@json1) do |doc|
290
344
  doc.move('/array/1/num')
291
345
  doc.home()
292
346
  assert_equal('/', doc.where?)
@@ -294,7 +348,7 @@ class DocTest < Minitest::Test
294
348
  end
295
349
 
296
350
  def test_each_value_root
297
- Oj::Doc.open($json1) do |doc|
351
+ Oj::Doc.open(@json1) do |doc|
298
352
  values = []
299
353
  doc.each_value() { |v| values << v.to_s }
300
354
  assert_equal(['1', '2', '3', '3', 'message', 'true'], values.sort)
@@ -302,7 +356,7 @@ class DocTest < Minitest::Test
302
356
  end
303
357
 
304
358
  def test_each_value_move
305
- Oj::Doc.open($json1) do |doc|
359
+ Oj::Doc.open(@json1) do |doc|
306
360
  doc.move('/array/1/hash')
307
361
  values = []
308
362
  doc.each_value() { |v| values << v.to_s }
@@ -311,7 +365,7 @@ class DocTest < Minitest::Test
311
365
  end
312
366
 
313
367
  def test_each_value_path
314
- Oj::Doc.open($json1) do |doc|
368
+ Oj::Doc.open(@json1) do |doc|
315
369
  values = []
316
370
  doc.each_value('/array/1/hash') { |v| values << v.to_s }
317
371
  assert_equal(['1', '2', '3'], values.sort)
@@ -319,7 +373,7 @@ class DocTest < Minitest::Test
319
373
  end
320
374
 
321
375
  def test_each_child_move
322
- Oj::Doc.open($json1) do |doc|
376
+ Oj::Doc.open(@json1) do |doc|
323
377
  locations = []
324
378
  doc.move('/array/1/hash/h2/a')
325
379
  doc.each_child() { |d| locations << d.where? }
@@ -332,7 +386,7 @@ class DocTest < Minitest::Test
332
386
  end
333
387
 
334
388
  def test_each_child_path
335
- Oj::Doc.open($json1) do |doc|
389
+ Oj::Doc.open(@json1) do |doc|
336
390
  locations = []
337
391
  doc.each_child('/array/1/hash/h2/a') { |d| locations << d.where? }
338
392
  assert_equal(['/array/1/hash/h2/a/1', '/array/1/hash/h2/a/2', '/array/1/hash/h2/a/3'], locations)
@@ -342,6 +396,19 @@ class DocTest < Minitest::Test
342
396
  end
343
397
  end
344
398
 
399
+ def test_nested_each_child
400
+ h = {}
401
+ Oj::Doc.open('{"a":1,"c":[2],"d":3}') do |doc|
402
+ doc.each_child('/') do |child|
403
+ h[child.path] = child.fetch
404
+ child.each_child do |grandchild|
405
+ h[grandchild.path] = grandchild.fetch
406
+ end
407
+ end
408
+ end
409
+ assert_equal({"/a"=>1, "/c"=>[2], "/c/1"=>2, "/d"=>3}, h)
410
+ end
411
+
345
412
  def test_size
346
413
  Oj::Doc.open('[1,2,3]') do |doc|
347
414
  assert_equal(4, doc.size)
@@ -438,6 +505,11 @@ class DocTest < Minitest::Test
438
505
  assert_equal({'/a/x' => 2, '/b/y' => 4}, results)
439
506
  end
440
507
 
508
+ def test_doc_empty
509
+ result = Oj::Doc.open("") { |doc| doc.each_child {} }
510
+ assert_nil(result)
511
+ end
512
+
441
513
  def test_comment
442
514
  json = %{{
443
515
  "x"/*one*/:/*two*/true,//three
data/test/test_file.rb CHANGED
@@ -130,6 +130,8 @@ class FileJuice < Minitest::Test
130
130
  dump_and_load(t, false)
131
131
  end
132
132
  def test_time_object_early
133
+ # Windows does not support dates before 1970.
134
+ return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
133
135
  t = Time.xmlschema("1954-01-05T00:00:00.123456")
134
136
  Oj.default_options = { :mode => :object, :time_format => :unix_zone }
135
137
  dump_and_load(t, false)
@@ -145,7 +147,7 @@ class FileJuice < Minitest::Test
145
147
 
146
148
  # Object with to_json()
147
149
  def test_json_object_compat
148
- Oj.default_options = { :mode => :compat, :use_to_json => true }
150
+ Oj.default_options = { :mode => :compat, :use_to_json => true, :create_additions => true }
149
151
  obj = Jeez.new(true, 58)
150
152
  json = Oj.dump(obj, :indent => 2)
151
153
  assert(%{{"json_class":"FileJuice::Jeez","x":true,"y":58}
@@ -156,30 +158,20 @@ class FileJuice < Minitest::Test
156
158
  Oj.default_options = { :mode => :compat, :use_to_json => false }
157
159
  end
158
160
 
159
- def test_as_json_object_compat_hash
160
- Oj.default_options = { :mode => :compat, :use_as_json => true }
161
- obj = Orange.new(true, 58)
162
- json = Oj.dump(obj, :indent => 2)
163
- assert(!json.nil?)
164
- dump_and_load(obj, false)
165
- end
166
-
167
161
  # Range
168
162
  def test_range_object
169
- unless RUBY_VERSION.start_with?('1.8')
170
- Oj.default_options = { :mode => :object }
171
- json = Oj.dump(1..7, :mode => :object, :indent => 0)
172
- if 'rubinius' == $ruby
173
- assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
174
- elsif 'jruby' == $ruby
175
- assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
176
- else
177
- assert_equal(%{{"^u":["Range",1,7,false]}}, json)
178
- end
179
- dump_and_load(1..7, false)
180
- dump_and_load(1..1, false)
181
- dump_and_load(1...7, false)
163
+ Oj.default_options = { :mode => :object }
164
+ 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
170
+ assert_equal(%{{"^u":["Range",1,7,false]}}, json)
182
171
  end
172
+ dump_and_load(1..7, false)
173
+ dump_and_load(1..1, false)
174
+ dump_and_load(1...7, false)
183
175
  end
184
176
 
185
177
  # BigNum
@@ -192,20 +184,20 @@ class FileJuice < Minitest::Test
192
184
  def test_bigdecimal_strict
193
185
  mode = Oj.default_options[:mode]
194
186
  Oj.default_options = {:mode => :strict}
195
- dump_and_load(BigDecimal.new('3.14159265358979323846'), false)
187
+ dump_and_load(BigDecimal('3.14159265358979323846'), false)
196
188
  Oj.default_options = {:mode => mode}
197
189
  end
198
190
 
199
191
  def test_bigdecimal_null
200
192
  mode = Oj.default_options[:mode]
201
193
  Oj.default_options = {:mode => :null}
202
- dump_and_load(BigDecimal.new('3.14159265358979323846'), false)
194
+ dump_and_load(BigDecimal('3.14159265358979323846'), false)
203
195
  Oj.default_options = {:mode => mode}
204
196
  end
205
197
 
206
198
  def test_bigdecimal_object
207
199
  Oj.default_options = {:mode => :object}
208
- dump_and_load(BigDecimal.new('3.14159265358979323846'), false)
200
+ dump_and_load(BigDecimal('3.14159265358979323846'), false)
209
201
  end
210
202
 
211
203
  # Date
@@ -236,6 +228,8 @@ class FileJuice < Minitest::Test
236
228
  end
237
229
  assert_equal(obj.utc?, loaded.utc?)
238
230
  assert_equal(obj.utc_offset, loaded.utc_offset)
231
+ elsif obj.nil?
232
+ assert_nil(loaded)
239
233
  else
240
234
  assert_equal(obj, loaded)
241
235
  end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
6
+ %w(lib ext).each do |dir|
7
+ $: << File.join($oj_dir, dir)
8
+ end
9
+
10
+ require 'minitest'
11
+ require 'minitest/autorun'
12
+ require 'oj'
13
+
14
+ class Generator < Minitest::Test
15
+
16
+ def test_before
17
+ json = Oj.generate({})
18
+ assert_equal("{}", json)
19
+ end
20
+
21
+ end
data/test/test_hash.rb CHANGED
@@ -5,7 +5,7 @@ $: << File.dirname(__FILE__)
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
@@ -25,5 +25,15 @@ class Hashi < Minitest::Test
25
25
  assert_equal(3, obj[:abc])
26
26
  assert_equal(3, obj.abc())
27
27
  end
28
+
29
+ def test_marshal
30
+ h = Oj::EasyHash.new()
31
+ h['abc'] = 3
32
+ out = Marshal.dump(h)
33
+
34
+ obj = Marshal.load(out)
35
+ assert_equal(Oj::EasyHash, obj.class)
36
+ assert_equal(3, obj[:abc])
37
+ end
28
38
 
29
39
  end # HashTest
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
6
+ %w(lib ext).each do |dir|
7
+ $: << File.join($oj_dir, dir)
8
+ end
9
+
10
+ require 'minitest'
11
+ require 'minitest/autorun'
12
+ require 'oj'
13
+
14
+ class IntegerRangeTest < Minitest::Test
15
+ def setup
16
+ @default_options = Oj.default_options
17
+ # in null mode other options other than the number formats are not used.
18
+ Oj.default_options = { :mode => :null, bigdecimal_as_decimal: true }
19
+ end
20
+
21
+ def teardown
22
+ Oj.default_options = @default_options
23
+ end
24
+
25
+ def test_range
26
+ test = {s: 0, s2: -1, s3: 1, u: -2, u2: 2, u3: 9007199254740993}
27
+ exp = '{"s":0,"s2":-1,"s3":1,"u":"-2","u2":"2","u3":"9007199254740993"}'
28
+ assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
29
+ end
30
+
31
+ def test_bignum
32
+ test = {u: -10000000000000000000, u2: 10000000000000000000}
33
+ exp = '{"u":"-10000000000000000000","u2":"10000000000000000000"}'
34
+ assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
35
+ end
36
+
37
+ def test_valid_modes
38
+ test = {safe: 0, unsafe: 9007199254740993}
39
+ exp = '{"safe":0,"unsafe":"9007199254740993"}'
40
+
41
+ [:strict, :null, :compat, :rails, :custom].each do |mode|
42
+ assert_equal(exp, Oj.dump(test, mode: mode, integer_range: (-1..1)), "Invalid mode #{mode}")
43
+ end
44
+
45
+ exp = '{":safe":0,":unsafe":"9007199254740993"}'
46
+ [:object].each do |mode|
47
+ assert_equal(exp, Oj.dump(test, mode: mode, integer_range: (-1..1)), "Invalid mode #{mode}")
48
+ end
49
+ end
50
+
51
+ def test_modes_without_opt
52
+ test = {safe:0, unsafe: 10000000000000000000}
53
+ exp = '{"safe":0,"unsafe":10000000000000000000}'
54
+
55
+ [:strict, :null, :compat, :rails, :custom].each do |mode|
56
+ assert_equal(exp, Oj.dump(test, mode: mode), "Invalid mode #{mode}")
57
+ end
58
+
59
+ exp = '{":safe":0,":unsafe":10000000000000000000}'
60
+ [:object].each do |mode|
61
+ assert_equal(exp, Oj.dump(test, mode: mode), "Invalid mode #{mode}")
62
+ end
63
+ end
64
+
65
+ def test_accept_nil_and_false
66
+ test = {safe:0, unsafe: 10000000000000000000}
67
+ exp = '{"safe":0,"unsafe":10000000000000000000}'
68
+
69
+ assert_equal(exp, Oj.dump(test, integer_range: nil))
70
+ assert_equal(exp, Oj.dump(test, integer_range: false))
71
+ end
72
+ end