oj 3.13.9 → 3.16.1

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 (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/prec.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'oj'
4
4
 
5
- extras = {"locationLng" => -97.14690769100295}
5
+ extras = {'locationLng' => -97.14690769100295}
6
6
 
7
7
  Oj.default_options = {float_precision: 17}
8
8
 
@@ -10,13 +10,13 @@ encoded = Oj.dump(extras)
10
10
  puts encoded
11
11
  puts Oj.load(encoded)
12
12
 
13
- require "active_record"
13
+ require 'active_record'
14
14
 
15
15
  Oj::Rails.set_encoder()
16
16
  Oj::Rails.set_decoder()
17
17
 
18
18
  Oj.default_options = {float_precision: 17}
19
- # Using Oj rails encoder, gets the correct value: {"locationLng":-97.14690769100295}
19
+ # Using Oj rails encoder, gets the correct value: {'locationLng':-97.14690769100295}
20
20
  encoded = ActiveSupport::JSON.encode(extras)
21
21
  puts encoded
22
22
  puts ActiveSupport::JSON.decode(encoded)
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Change
4
3
  attr_accessor :time
data/test/sample/dir.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'etc'
3
2
 
4
3
  module Sample
data/test/sample/doc.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'sample/hasprops'
3
2
  require 'sample/group'
4
3
  require 'sample/layer'
data/test/sample/file.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'etc'
3
2
 
4
3
  module Sample
data/test/sample/group.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Group
4
3
  attr_reader :members
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  module HasProps
4
3
 
data/test/sample/layer.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Layer < Group
4
3
  attr_accessor :name
data/test/sample/rect.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Rect < Shape
4
3
 
data/test/sample/shape.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Shape
4
3
  include HasProps
data/test/sample/text.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Text < Shape
4
3
  attr_accessor :text
data/test/sample.rb CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env ruby -wW2
2
+ # frozen_string_literal: true
2
3
 
3
- if $0 == __FILE__
4
- $: << '.'
5
- $: << '..'
6
- $: << '../lib'
7
- $: << '../ext'
4
+ if $PROGRAM_NAME == __FILE__
5
+ $LOAD_PATH << '.'
6
+ $LOAD_PATH << '..'
7
+ $LOAD_PATH << '../lib'
8
+ $LOAD_PATH << '../ext'
8
9
  end
9
10
 
10
- require 'pp'
11
11
  require 'sample/doc'
12
12
 
13
13
  def sample_doc(size=3)
14
14
  colors = [ :black, :gray, :white, :red, :blue, :yellow, :green, :purple, :orange ]
15
15
 
16
- d = ::Sample::Doc.new('Sample')
16
+ d = Sample::Doc.new('Sample')
17
17
 
18
18
  # add some history
19
19
  (0..size * 10).each do |i|
@@ -22,22 +22,22 @@ def sample_doc(size=3)
22
22
 
23
23
  # add some layers
24
24
  (1..size).each do |i|
25
- layer = ::Sample::Layer.new("Layer-#{i}")
25
+ layer = Sample::Layer.new("Layer-#{i}")
26
26
  (1..size).each do |j|
27
- g = ::Sample::Group.new
27
+ g = Sample::Group.new
28
28
  (1..size).each do |k|
29
- g2 = ::Sample::Group.new
30
- r = ::Sample::Rect.new(j * 40 + 10.0, i * 10.0,
31
- 10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
29
+ g2 = Sample::Group.new
30
+ r = Sample::Rect.new((j * 40) + 10.0, i * 10.0,
31
+ 10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
32
32
  r.add_prop(:part_of, layer.name)
33
33
  g2 << r
34
- g2 << ::Sample::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
34
+ g2 << Sample::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
35
35
  g << g2
36
36
  end
37
- g2 = ::Sample::Group.new
37
+ g2 = Sample::Group.new
38
38
  (1..size).each do |k|
39
- o = ::Sample::Oval.new(j * 40 + 12.0, i * 10.0 + 2.0,
40
- 6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
39
+ o = Sample::Oval.new((j * 40) + 12.0, (i * 10.0) + 2.0,
40
+ 6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
41
41
  o.add_prop(:inside, true)
42
42
  g << o
43
43
  end
data/test/sample_json.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- if $0 == __FILE__
4
- $: << '.'
5
- $: << '..'
6
- $: << '../lib'
7
- $: << '../ext'
4
+ if $PROGRAM_NAME == __FILE__
5
+ $LOAD_PATH << '.'
6
+ $LOAD_PATH << '..'
7
+ $LOAD_PATH << '../lib'
8
+ $LOAD_PATH << '../ext'
8
9
  end
9
10
 
10
- require 'pp'
11
11
  require 'oj'
12
12
 
13
13
  def sample_json(size=3)
@@ -32,6 +32,6 @@ def sample_json(size=3)
32
32
  container
33
33
  end
34
34
 
35
- if $0 == __FILE__
36
- File.open('sample.json', "w") { |f| f.write(Oj.dump(sample_json(3), :indent => 2)) }
35
+ if $PROGRAM_NAME == __FILE__
36
+ File.write('sample.json', Oj.dump(sample_json(3), :indent => 2))
37
37
  end
data/test/test_compat.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'
@@ -29,18 +29,16 @@ class CompatJuice < Minitest::Test
29
29
  end
30
30
  alias == eql?
31
31
 
32
- def to_json(*a)
33
- %|{"json_class":"#{self.class.to_s}","x":#{@x},"y":#{@y}}|
32
+ def to_json(*_a)
33
+ %|{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}|
34
34
  end
35
35
 
36
36
  def self.json_create(h)
37
- self.new(h['x'], h['y'])
37
+ new(h['x'], h['y'])
38
38
  end
39
39
  end # Jeez
40
40
 
41
41
  class Argy
42
- def initialize()
43
- end
44
42
 
45
43
  def to_json(*a)
46
44
  %|{"args":"#{a}"}|
@@ -48,10 +46,8 @@ class CompatJuice < Minitest::Test
48
46
  end # Argy
49
47
 
50
48
  class Stringy
51
- def initialize()
52
- end
53
49
 
54
- def to_s()
50
+ def to_s
55
51
  %|[1,2]|
56
52
  end
57
53
  end # Stringy
@@ -61,20 +57,17 @@ class CompatJuice < Minitest::Test
61
57
  module Three
62
58
  class Deep
63
59
 
64
- def initialize()
65
- end
66
-
67
60
  def eql?(o)
68
61
  self.class == o.class
69
62
  end
70
63
  alias == eql?
71
64
 
72
- def to_json(*a)
65
+ def to_json(*_a)
73
66
  %|{"json_class":"#{self.class.name}"}|
74
67
  end
75
68
 
76
- def self.json_create(h)
77
- self.new()
69
+ def self.json_create(_h)
70
+ new()
78
71
  end
79
72
  end # Deep
80
73
  end # Three
@@ -106,24 +99,30 @@ class CompatJuice < Minitest::Test
106
99
 
107
100
  def test_fixnum
108
101
  dump_and_load(0, false)
109
- dump_and_load(12345, false)
110
- dump_and_load(-54321, false)
102
+ dump_and_load(12_345, false)
103
+ dump_and_load(-54_321, false)
111
104
  dump_and_load(1, false)
112
105
  end
113
106
 
107
+ def test_fixnum_array
108
+ data = (1..1000).to_a
109
+ json = Oj.dump(data, mode: :compat)
110
+ assert_equal("[#{data.join(',')}]", json)
111
+ end
112
+
114
113
  def test_float
115
114
  dump_and_load(0.0, false)
116
115
  dump_and_load(0.56, false)
117
116
  dump_and_load(3.0, false)
118
- dump_and_load(12345.6789, false)
117
+ dump_and_load(12_345.6789, false)
119
118
  dump_and_load(70.35, false)
120
- dump_and_load(-54321.012, false)
119
+ dump_and_load(-54_321.012, false)
121
120
  dump_and_load(1.7775, false)
122
121
  dump_and_load(2.5024, false)
123
122
  dump_and_load(2.48e16, false)
124
123
  dump_and_load(2.48e100 * 1.0e10, false)
125
124
  dump_and_load(-2.48e100 * 1.0e10, false)
126
- dump_and_load(1405460727.723866, false)
125
+ dump_and_load(1_405_460_727.723866, false)
127
126
  dump_and_load(0.5773, false)
128
127
  dump_and_load(0.6768, false)
129
128
  dump_and_load(0.685, false)
@@ -148,7 +147,7 @@ class CompatJuice < Minitest::Test
148
147
  def test_encode
149
148
  opts = Oj.default_options
150
149
  Oj.default_options = { :ascii_only => true }
151
- json = Oj.dump("ぴーたー")
150
+ json = Oj.dump('ぴーたー')
152
151
  assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
153
152
  Oj.default_options = opts
154
153
  end
@@ -170,7 +169,7 @@ class CompatJuice < Minitest::Test
170
169
  end
171
170
 
172
171
  def test_array_deep
173
- dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
172
+ dump_and_load([1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20]]]]]]]]]]]]]]]]]]]], false)
174
173
  end
175
174
 
176
175
  def test_symbol
@@ -179,8 +178,8 @@ class CompatJuice < Minitest::Test
179
178
  end
180
179
 
181
180
  def test_time_xml_schema
182
- t = Time.xmlschema("2012-01-05T23:58:07.123456000+09:00")
183
- #t = Time.local(2012, 1, 5, 23, 58, 7, 123456)
181
+ t = Time.xmlschema('2012-01-05T23:58:07.123456000+09:00')
182
+ # t = Time.local(2012, 1, 5, 23, 58, 7, 123456)
184
183
  json = Oj.dump(t, :mode => :compat)
185
184
  assert_equal(%{"2012-01-05 23:58:07 +0900"}, json)
186
185
  end
@@ -199,8 +198,9 @@ class CompatJuice < Minitest::Test
199
198
  def test_non_str_hash
200
199
  json = Oj.dump({ 1 => true, 0 => false }, :mode => :compat)
201
200
  h = Oj.load(json, :mode => :strict)
202
- assert_equal({ "1" => true, "0" => false }, h)
201
+ assert_equal({ '1' => true, '0' => false }, h)
203
202
  end
203
+
204
204
  def test_hash
205
205
  dump_and_load({}, false)
206
206
  dump_and_load({ 'true' => true, 'false' => false}, false)
@@ -239,12 +239,12 @@ class CompatJuice < Minitest::Test
239
239
  def test_invalid_escapes_handled
240
240
  json = '{"subtext":"\"404er\” \w \k \3 \a"}'
241
241
  obj = Oj.compat_load(json)
242
- assert_equal({"subtext" => "\"404er” w k 3 a"}, obj)
242
+ assert_equal({'subtext' => '"404er” w k 3 a'}, obj)
243
243
  end
244
244
 
245
245
  def test_hash_escaping
246
246
  json = Oj.to_json({'<>' => '<>'}, mode: :compat)
247
- assert_equal(json, '{"<>":"<>"}')
247
+ assert_equal('{"<>":"<>"}', json)
248
248
  end
249
249
 
250
250
  def test_bignum_object
@@ -271,7 +271,7 @@ class CompatJuice < Minitest::Test
271
271
  def test_bignum_compat
272
272
  json = Oj.dump(7 ** 55, :mode => :compat)
273
273
  b = Oj.load(json, :mode => :strict)
274
- assert_equal(30226801971775055948247051683954096612865741943, b)
274
+ assert_equal(30_226_801_971_775_055_948_247_051_683_954_096_612_865_741_943, b)
275
275
  end
276
276
 
277
277
  # BigDecimal
@@ -313,7 +313,7 @@ class CompatJuice < Minitest::Test
313
313
  if x.is_a?(String)
314
314
  assert_equal(orig.to_s, x)
315
315
  else # better be a Hash
316
- assert_equal({"year" => orig.year, "month" => orig.month, "day" => orig.day, "start" => orig.start}, x)
316
+ assert_equal({'year' => orig.year, 'month' => orig.month, 'day' => orig.day, 'start' => orig.start}, x)
317
317
  end
318
318
  end
319
319
 
@@ -340,13 +340,13 @@ class CompatJuice < Minitest::Test
340
340
  end
341
341
 
342
342
  def test_io_file
343
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
344
- File.open(filename, 'w') { |f| f.write(%{{
343
+ filename = File.join(__dir__, 'open_file_test.json')
344
+ File.write(filename, %{{
345
345
  "x":true,
346
346
  "y":58,
347
347
  "z": [1,2,3]
348
348
  }
349
- }) }
349
+ })
350
350
  f = File.new(filename)
351
351
  obj = Oj.compat_load(f)
352
352
  f.close()
@@ -410,7 +410,7 @@ class CompatJuice < Minitest::Test
410
410
 
411
411
  # A child to_json should not be called.
412
412
  def test_json_object_child
413
- obj = { "child" => Jeez.new(true, 58) }
413
+ obj = { 'child' => Jeez.new(true, 58) }
414
414
  assert_equal('{"child":{"json_class":"CompatJuice::Jeez","x":true,"y":58}}', Oj.dump(obj))
415
415
  end
416
416
 
@@ -431,10 +431,10 @@ class CompatJuice < Minitest::Test
431
431
  begin
432
432
  Oj.compat_load(json, :create_additions => true)
433
433
  rescue Exception => e
434
- assert_equal("ArgumentError", e.class().name)
434
+ assert_equal('ArgumentError', e.class().name)
435
435
  return
436
436
  end
437
- assert(false, "*** expected an exception")
437
+ assert(false, '*** expected an exception')
438
438
  end
439
439
 
440
440
  def test_json_object_create_cache
@@ -450,7 +450,7 @@ class CompatJuice < Minitest::Test
450
450
  expected = Jeez.new(true, 58)
451
451
  json = Oj.to_json(expected)
452
452
  json.gsub!('json_class', '_class_')
453
- obj = Oj.compat_load(json, :create_id => "_class_", :create_additions => true)
453
+ obj = Oj.compat_load(json, :create_id => '_class_', :create_additions => true)
454
454
  assert_equal(expected, obj)
455
455
  end
456
456
 
@@ -467,10 +467,28 @@ class CompatJuice < Minitest::Test
467
467
  end
468
468
 
469
469
  def test_arg_passing
470
- json = Oj.to_json(Argy.new(), :max_nesting=> 40)
470
+ json = Oj.to_json(Argy.new(), :max_nesting => 40)
471
471
  assert_equal(%|{"args":"[{:max_nesting=>40}]"}|, json)
472
472
  end
473
473
 
474
+ def test_max_nesting
475
+ assert_raises() { Oj.to_json([[[[[]]]]], :max_nesting => 3) }
476
+ assert_raises() { Oj.dump([[[[[]]]]], :max_nesting => 3, :mode=>:compat) }
477
+
478
+ assert_raises() { Oj.to_json([[]], :max_nesting => 1) }
479
+ assert_equal('[[]]', Oj.to_json([[]], :max_nesting => 2))
480
+
481
+ assert_raises() { Oj.dump([[]], :max_nesting => 1, :mode=>:compat) }
482
+ assert_equal('[[]]', Oj.dump([[]], :max_nesting => 2, :mode=>:compat))
483
+
484
+ assert_raises() { Oj.to_json([[3]], :max_nesting => 1) }
485
+ assert_equal('[[3]]', Oj.to_json([[3]], :max_nesting => 2))
486
+
487
+ assert_raises() { Oj.dump([[3]], :max_nesting => 1, :mode=>:compat) }
488
+ assert_equal('[[3]]', Oj.dump([[3]], :max_nesting => 2, :mode=>:compat))
489
+
490
+ end
491
+
474
492
  def test_bad_unicode
475
493
  assert_raises() { Oj.to_json("\xE4xy") }
476
494
  end
@@ -485,13 +503,47 @@ class CompatJuice < Minitest::Test
485
503
 
486
504
  def test_parse_to_s
487
505
  s = Stringy.new
488
- assert_equal([1,2], Oj.load(s, :mode => :compat))
506
+ assert_equal([1, 2], Oj.load(s, :mode => :compat))
507
+ end
508
+
509
+ def test_parse_large_string
510
+ error = assert_raises() { Oj.load(%|{"a":"aaaaaaaaaa\0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}|) }
511
+ assert_includes(error.message, 'NULL byte in string')
512
+
513
+ error = assert_raises() { Oj.load(%|{"a":"aaaaaaaaaaaaaaaaaaaa }|) }
514
+ assert_includes(error.message, 'quoted string not terminated')
515
+
516
+ json =<<~JSON
517
+ {
518
+ "a": "\\u3074\\u30fc\\u305f\\u30fc",
519
+ "b": "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
520
+ }
521
+ JSON
522
+ assert_equal('ぴーたー', Oj.load(json)['a'])
523
+ end
524
+
525
+ def test_parse_large_escaped_string
526
+ invalid_json = %|{"a":"aaaa\\nbbbb\\rcccc\\tddd\\feee\\bf/\\\\\\u3074\\u30fc\\u305f\\u30fc }|
527
+ error = assert_raises() { Oj.load(invalid_json) }
528
+ assert_includes(error.message, 'quoted string not terminated')
529
+
530
+ json = '"aaaa\\nbbbb\\rcccc\\tddd\\feee\\bf/\\\\\\u3074\\u30fc\\u305f\\u30fc "'
531
+ assert_equal("aaaa\nbbbb\rcccc\tddd\feee\bf/\\ぴーたー ", Oj.load(json))
532
+ end
533
+
534
+ def test_invalid_to_s
535
+ obj = Object.new
536
+ def obj.to_s
537
+ nil
538
+ end
539
+
540
+ assert_raises(TypeError) { Oj.dump(obj, mode: :compat) }
489
541
  end
490
542
 
491
543
  def dump_and_load(obj, trace=false)
492
544
  json = Oj.dump(obj)
493
545
  puts json if trace
494
- loaded = Oj.compat_load(json, :create_additions => true);
546
+ loaded = Oj.compat_load(json, :create_additions => true)
495
547
  if obj.nil?
496
548
  assert_nil(loaded)
497
549
  else
@@ -503,7 +555,7 @@ class CompatJuice < Minitest::Test
503
555
  def dump_to_json_and_load(obj, trace=false)
504
556
  json = Oj.to_json(obj, :indent => ' ')
505
557
  puts json if trace
506
- loaded = Oj.compat_load(json, :create_additions => true);
558
+ loaded = Oj.compat_load(json, :create_additions => true)
507
559
  if obj.nil?
508
560
  assert_nil(loaded)
509
561
  else