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_compat.rb CHANGED
@@ -1,9 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: UTF-8
2
+ # encoding: utf-8
3
3
 
4
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
5
9
 
6
- require 'helper'
10
+ require 'minitest'
11
+ require 'minitest/autorun'
12
+ require 'stringio'
13
+ require 'date'
14
+ require 'bigdecimal'
15
+ require 'oj'
7
16
 
8
17
  class CompatJuice < Minitest::Test
9
18
 
@@ -20,8 +29,8 @@ class CompatJuice < Minitest::Test
20
29
  end
21
30
  alias == eql?
22
31
 
23
- def as_json()
24
- {"json_class" => self.class.to_s,"x" => @x,"y" => @y}
32
+ def to_json(*a)
33
+ %|{"json_class":"#{self.class.to_s}","x":#{@x},"y":#{@y}}|
25
34
  end
26
35
 
27
36
  def self.json_create(h)
@@ -29,6 +38,24 @@ class CompatJuice < Minitest::Test
29
38
  end
30
39
  end # Jeez
31
40
 
41
+ class Argy
42
+ def initialize()
43
+ end
44
+
45
+ def to_json(*a)
46
+ %|{"args":"#{a}"}|
47
+ end
48
+ end # Argy
49
+
50
+ class Stringy
51
+ def initialize()
52
+ end
53
+
54
+ def to_s()
55
+ %|[1,2]|
56
+ end
57
+ end # Stringy
58
+
32
59
  module One
33
60
  module Two
34
61
  module Three
@@ -42,12 +69,8 @@ class CompatJuice < Minitest::Test
42
69
  end
43
70
  alias == eql?
44
71
 
45
- def to_hash()
46
- {'json_class' => "#{self.class.name}"}
47
- end
48
-
49
72
  def to_json(*a)
50
- %{{"json_class":"#{self.class.name}"}}
73
+ %|{"json_class":"#{self.class.name}"}|
51
74
  end
52
75
 
53
76
  def self.json_create(h)
@@ -60,6 +83,9 @@ class CompatJuice < Minitest::Test
60
83
 
61
84
  def setup
62
85
  @default_options = Oj.default_options
86
+ # in compat mode other options other than the JSON gem globals and options
87
+ # are not used.
88
+ Oj.default_options = { :mode => :compat }
63
89
  end
64
90
 
65
91
  def teardown
@@ -87,6 +113,8 @@ class CompatJuice < Minitest::Test
87
113
 
88
114
  def test_float
89
115
  dump_and_load(0.0, false)
116
+ dump_and_load(0.56, false)
117
+ dump_and_load(3.0, false)
90
118
  dump_and_load(12345.6789, false)
91
119
  dump_and_load(70.35, false)
92
120
  dump_and_load(-54321.012, false)
@@ -95,6 +123,19 @@ class CompatJuice < Minitest::Test
95
123
  dump_and_load(2.48e16, false)
96
124
  dump_and_load(2.48e100 * 1.0e10, false)
97
125
  dump_and_load(-2.48e100 * 1.0e10, false)
126
+ dump_and_load(1405460727.723866, false)
127
+ dump_and_load(0.5773, false)
128
+ dump_and_load(0.6768, false)
129
+ dump_and_load(0.685, false)
130
+ dump_and_load(0.7032, false)
131
+ dump_and_load(0.7051, false)
132
+ dump_and_load(0.8274, false)
133
+ dump_and_load(0.9149, false)
134
+ dump_and_load(64.4, false)
135
+ dump_and_load(71.6, false)
136
+ dump_and_load(73.4, false)
137
+ dump_and_load(80.6, false)
138
+ dump_and_load(-95.640172, false)
98
139
  end
99
140
 
100
141
  def test_string
@@ -106,16 +147,9 @@ class CompatJuice < Minitest::Test
106
147
 
107
148
  def test_encode
108
149
  opts = Oj.default_options
109
- Oj.default_options = { :ascii_only => false }
110
- unless 'jruby' == $ruby
111
- dump_and_load("ぴーたー", false)
112
- end
113
150
  Oj.default_options = { :ascii_only => true }
114
151
  json = Oj.dump("ぴーたー")
115
152
  assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
116
- unless 'jruby' == $ruby
117
- dump_and_load("ぴーたー", false)
118
- end
119
153
  Oj.default_options = opts
120
154
  end
121
155
 
@@ -139,7 +173,34 @@ class CompatJuice < Minitest::Test
139
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)
140
174
  end
141
175
 
176
+ def test_symbol
177
+ json = Oj.dump(:abc, :mode => :compat)
178
+ assert_equal('"abc"', json)
179
+ end
180
+
181
+ 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)
184
+ json = Oj.dump(t, :mode => :compat)
185
+ assert_equal(%{"2012-01-05 23:58:07 +0900"}, json)
186
+ end
187
+
188
+ def test_class
189
+ json = Oj.dump(CompatJuice, :mode => :compat)
190
+ assert_equal(%{"CompatJuice"}, json)
191
+ end
192
+
193
+ def test_module
194
+ json = Oj.dump(One::Two, :mode => :compat)
195
+ assert_equal(%{"CompatJuice::One::Two"}, json)
196
+ end
197
+
142
198
  # Hash
199
+ def test_non_str_hash
200
+ json = Oj.dump({ 1 => true, 0 => false }, :mode => :compat)
201
+ h = Oj.load(json, :mode => :strict)
202
+ assert_equal({ "1" => true, "0" => false }, h)
203
+ end
143
204
  def test_hash
144
205
  dump_and_load({}, false)
145
206
  dump_and_load({ 'true' => true, 'false' => false}, false)
@@ -175,83 +236,94 @@ class CompatJuice < Minitest::Test
175
236
  assert_equal({"a\nb" => true, "c\td" => false}, obj)
176
237
  end
177
238
 
239
+ def test_invalid_escapes_handled
240
+ json = '{"subtext":"\"404er\” \w \k \3 \a"}'
241
+ obj = Oj.compat_load(json)
242
+ assert_equal({"subtext" => "\"404er” w k 3 a"}, obj)
243
+ end
244
+
245
+ def test_hash_escaping
246
+ json = Oj.to_json({'<>' => '<>'}, mode: :compat)
247
+ assert_equal(json, '{"<>":"<>"}')
248
+ end
249
+
178
250
  def test_bignum_object
179
251
  dump_and_load(7 ** 55, false)
180
252
  end
181
253
 
254
+ def test_json_object
255
+ obj = Jeez.new(true, 58)
256
+ json = Oj.to_json(obj)
257
+ assert(%|{"json_class":"CompatJuice::Jeez","x":true,"y":58}| == json ||
258
+ %|{"json_class":"CompatJuice::Jeez","y":58,"x":true}| == json)
259
+ dump_to_json_and_load(obj, false)
260
+ end
261
+
262
+ def test_json_object_create_id
263
+ Oj.default_options = { :create_id => 'kson_class', :create_additions => true}
264
+ expected = Jeez.new(true, 58)
265
+ json = %{{"kson_class":"CompatJuice::Jeez","x":true,"y":58}}
266
+ obj = Oj.load(json)
267
+ assert_equal(expected, obj)
268
+ Oj.default_options = { :create_id => 'json_class' }
269
+ end
270
+
271
+ def test_bignum_compat
272
+ json = Oj.dump(7 ** 55, :mode => :compat)
273
+ b = Oj.load(json, :mode => :strict)
274
+ assert_equal(30226801971775055948247051683954096612865741943, b)
275
+ end
276
+
182
277
  # BigDecimal
183
- def test_bigdecimal_compat
184
- dump_and_load(BigDecimal.new('3.14159265358979323846'), false)
278
+ def test_bigdecimal
279
+ # BigDecimals are dumped as strings and can not be restored to the
280
+ # original value without using an undocumented feature of the JSON gem.
281
+ json = Oj.dump(BigDecimal('3.14159265358979323846'))
282
+ # 2.4.0 changes the exponent to lowercase
283
+ assert_equal('"0.314159265358979323846e1"', json.downcase)
284
+ end
285
+
286
+ def test_decimal_class
287
+ big = BigDecimal('3.14159265358979323846')
288
+ # :decimal_class is the undocumented feature.
289
+ json = Oj.load('3.14159265358979323846', mode: :compat, decimal_class: BigDecimal)
290
+ assert_equal(big, json)
185
291
  end
186
292
 
187
- def test_bigdecimal_load
188
- orig = BigDecimal.new('80.51')
189
- json = Oj.dump(orig, :mode => :compat, :bigdecimal_as_decimal => true)
190
- bg = Oj.load(json, :mode => :compat, :bigdecimal_load => true)
191
- assert_equal(BigDecimal, bg.class)
192
- assert_equal(orig, bg)
293
+ def test_infinity
294
+ assert_raises(Oj::ParseError) { Oj.load('Infinity', :mode => :strict) }
295
+ x = Oj.load('Infinity', :mode => :compat)
296
+ assert_equal('Infinity', x.to_s)
193
297
  end
194
298
 
195
299
  # Time
196
- def test_time_ruby
197
- if RUBY_VERSION.start_with?('1.8')
198
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
199
- else
200
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
201
- end
300
+ def test_time_from_time_object
301
+ t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
202
302
  expect = '"' + t.to_s + '"'
203
- json = Oj.dump(t, :mode => :compat, :time_format => :ruby)
303
+ json = Oj.dump(t)
204
304
  assert_equal(expect, json)
205
305
  end
206
- def test_time_xml
207
- if RUBY_VERSION.start_with?('1.8')
208
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
209
- else
210
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
211
- end
212
- json = Oj.dump(t, :mode => :compat, :time_format => :xmlschema, :second_precision => 6)
213
- assert_equal('"2015-01-05T21:37:07.123456-08:00"', json)
214
- end
215
- unless RUBY_VERSION.start_with?('1.8')
216
- def test_time_xml_12345
217
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, 12345)
218
- json = Oj.dump(t, :mode => :compat, :time_format => :xmlschema, :second_precision => 6)
219
- assert_equal('"2015-01-05T21:37:07.123456+03:25"', json)
220
- end
221
- end
222
- def test_time_unix
223
- if RUBY_VERSION.start_with?('1.8')
224
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
225
- else
226
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
227
- end
228
- json = Oj.dump(t, :mode => :compat, :time_format => :unix, :second_precision => 6)
229
- assert_equal('1420522627.123456', json)
230
- end
231
- def test_time_unix_zone
232
- if RUBY_VERSION.start_with?('1.8')
233
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
234
- else
235
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
236
- end
237
- json = Oj.dump(t, :mode => :compat, :time_format => :unix_zone, :second_precision => 6)
238
- assert_equal('1420522627.123456e-28800', json)
239
- end
240
- unless RUBY_VERSION.start_with?('1.8')
241
- def test_time_unix_zone_12345
242
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, 12345)
243
- json = Oj.dump(t, :mode => :compat, :time_format => :unix_zone, :second_precision => 6)
244
- assert_equal('1420481482.123456e12345', json)
306
+
307
+ def test_date_compat
308
+ orig = Date.new(2012, 6, 19)
309
+ json = Oj.dump(orig, :mode => :compat)
310
+ x = Oj.load(json, :mode => :compat)
311
+ # Some Rubies implement Date as data and some as a real Object. Either are
312
+ # okay for the test.
313
+ if x.is_a?(String)
314
+ assert_equal(orig.to_s, x)
315
+ else # better be a Hash
316
+ assert_equal({"year" => orig.year, "month" => orig.month, "day" => orig.day, "start" => orig.start}, x)
245
317
  end
246
318
  end
247
- def test_time_unix_zone_early
248
- if RUBY_VERSION.start_with?('1.8')
249
- t = Time.parse('1954-01-05T21:37:07.123456-08:00')
250
- else
251
- t = Time.new(1954, 1, 5, 21, 37, 7.123456, -8 * 3600)
252
- end
253
- json = Oj.dump(t, :mode => :compat, :time_format => :unix_zone, :second_precision => 6)
254
- assert_equal('-504469372.876544e-28800', json)
319
+
320
+ def test_datetime_compat
321
+ orig = DateTime.new(2012, 6, 19, 20, 19, 27)
322
+ json = Oj.dump(orig, :mode => :compat)
323
+ x = Oj.load(json, :mode => :compat)
324
+ # Some Rubies implement Date as data and some as a real Object. Either are
325
+ # okay for the test.
326
+ assert_equal(orig.to_s, x)
255
327
  end
256
328
 
257
329
  # Stream IO
@@ -329,69 +401,114 @@ class CompatJuice < Minitest::Test
329
401
  assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
330
402
  end
331
403
 
332
- def test_json_object_compat
404
+ # If mimic_JSON has not been called then Oj.dump will call to_json on the
405
+ # top level object only.
406
+ def test_json_object_top
333
407
  obj = Jeez.new(true, 58)
334
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
335
- dump_and_load(obj, false)
408
+ dump_to_json_and_load(obj, false)
409
+ end
410
+
411
+ # A child to_json should not be called.
412
+ def test_json_object_child
413
+ obj = { "child" => Jeez.new(true, 58) }
414
+ assert_equal('{"child":{"json_class":"CompatJuice::Jeez","x":true,"y":58}}', Oj.dump(obj))
336
415
  end
337
416
 
338
417
  def test_json_module_object
339
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
340
418
  obj = One::Two::Three::Deep.new()
341
- dump_and_load(obj, false)
419
+ dump_to_json_and_load(obj, false)
342
420
  end
343
421
 
344
- def test_json_object_create_id
345
- Oj.default_options = { :mode => :compat, :use_as_json => false, :use_to_json => false }
422
+ def test_json_object_dump_create_id
346
423
  expected = Jeez.new(true, 58)
347
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true, :use_as_json => true)
348
- obj = Oj.compat_load(json)
424
+ json = Oj.to_json(expected)
425
+ obj = Oj.compat_load(json, :create_additions => true)
349
426
  assert_equal(expected, obj)
350
427
  end
351
428
 
352
429
  def test_json_object_bad
353
430
  json = %{{"json_class":"CompatJuice::Junk","x":true}}
354
431
  begin
355
- Oj.compat_load(json)
432
+ Oj.compat_load(json, :create_additions => true)
356
433
  rescue Exception => e
357
- assert_equal("Oj::ParseError", e.class().name)
434
+ assert_equal("ArgumentError", e.class().name)
358
435
  return
359
436
  end
360
437
  assert(false, "*** expected an exception")
361
438
  end
362
439
 
363
440
  def test_json_object_create_cache
364
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
365
441
  expected = Jeez.new(true, 58)
366
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true)
367
- obj = Oj.compat_load(json, :class_cache => true)
442
+ json = Oj.to_json(expected)
443
+ obj = Oj.compat_load(json, :class_cache => true, :create_additions => true)
368
444
  assert_equal(expected, obj)
369
- obj = Oj.compat_load(json, :class_cache => false)
445
+ obj = Oj.compat_load(json, :class_cache => false, :create_additions => true)
370
446
  assert_equal(expected, obj)
371
447
  end
372
448
 
373
449
  def test_json_object_create_id_other
374
- Oj.default_options = { :mode => :compat, :use_as_json => false, :use_to_json => false }
375
450
  expected = Jeez.new(true, 58)
376
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_as_json => true)
451
+ json = Oj.to_json(expected)
377
452
  json.gsub!('json_class', '_class_')
378
- obj = Oj.compat_load(json, :create_id => "_class_")
453
+ obj = Oj.compat_load(json, :create_id => "_class_", :create_additions => true)
379
454
  assert_equal(expected, obj)
380
455
  end
381
456
 
382
457
  def test_json_object_create_deep
383
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
384
458
  expected = One::Two::Three::Deep.new()
385
- json = Oj.dump(expected, :indent => 2, :mode => :compat)
386
- obj = Oj.compat_load(json)
459
+ json = Oj.to_json(expected)
460
+ obj = Oj.compat_load(json, :create_additions => true)
387
461
  assert_equal(expected, obj)
388
462
  end
389
463
 
464
+ def test_range
465
+ json = Oj.dump(1..7)
466
+ assert_equal('"1..7"', json)
467
+ end
468
+
469
+ def test_arg_passing
470
+ json = Oj.to_json(Argy.new(), :max_nesting=> 40)
471
+ assert_equal(%|{"args":"[{:max_nesting=>40}]"}|, json)
472
+ end
473
+
474
+ def test_bad_unicode
475
+ assert_raises() { Oj.to_json("\xE4xy") }
476
+ end
477
+
478
+ def test_bad_unicode_e2
479
+ assert_raises() { Oj.to_json("L\xE2m ") }
480
+ end
481
+
482
+ def test_bad_unicode_start
483
+ assert_raises() { Oj.to_json("\x8abc") }
484
+ end
485
+
486
+ def test_parse_to_s
487
+ s = Stringy.new
488
+ assert_equal([1,2], Oj.load(s, :mode => :compat))
489
+ end
490
+
390
491
  def dump_and_load(obj, trace=false)
391
- json = Oj.dump(obj, :indent => 2, :mode => :compat)
492
+ json = Oj.dump(obj)
493
+ puts json if trace
494
+ loaded = Oj.compat_load(json, :create_additions => true);
495
+ if obj.nil?
496
+ assert_nil(loaded)
497
+ else
498
+ assert_equal(obj, loaded)
499
+ end
500
+ loaded
501
+ end
502
+
503
+ def dump_to_json_and_load(obj, trace=false)
504
+ json = Oj.to_json(obj, :indent => ' ')
392
505
  puts json if trace
393
- loaded = Oj.compat_load(json);
394
- assert_equal(obj, loaded)
506
+ loaded = Oj.compat_load(json, :create_additions => true);
507
+ if obj.nil?
508
+ assert_nil(loaded)
509
+ else
510
+ assert_equal(obj, loaded)
511
+ end
395
512
  loaded
396
513
  end
397
514