oj 2.18.5 → 3.0.0

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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -226
  3. data/ext/oj/circarray.c +0 -25
  4. data/ext/oj/circarray.h +0 -25
  5. data/ext/oj/code.c +227 -0
  6. data/ext/oj/code.h +40 -0
  7. data/ext/oj/compat.c +126 -38
  8. data/ext/oj/custom.c +1097 -0
  9. data/ext/oj/dump.c +658 -2376
  10. data/ext/oj/dump.h +92 -0
  11. data/ext/oj/dump_compat.c +937 -0
  12. data/ext/oj/dump_leaf.c +254 -0
  13. data/ext/oj/dump_object.c +810 -0
  14. data/ext/oj/dump_rails.c +329 -0
  15. data/ext/oj/dump_strict.c +416 -0
  16. data/ext/oj/err.c +0 -25
  17. data/ext/oj/err.h +8 -2
  18. data/ext/oj/fast.c +24 -24
  19. data/ext/oj/mimic_json.c +817 -0
  20. data/ext/oj/mimic_rails.c +806 -0
  21. data/ext/oj/mimic_rails.h +17 -0
  22. data/ext/oj/object.c +18 -72
  23. data/ext/oj/odd.c +0 -25
  24. data/ext/oj/odd.h +2 -27
  25. data/ext/oj/oj.c +655 -1503
  26. data/ext/oj/oj.h +93 -40
  27. data/ext/oj/parse.c +99 -46
  28. data/ext/oj/parse.h +12 -26
  29. data/ext/oj/reader.c +1 -25
  30. data/ext/oj/reader.h +3 -25
  31. data/ext/oj/resolve.c +9 -11
  32. data/ext/oj/resolve.h +2 -2
  33. data/ext/oj/rxclass.c +133 -0
  34. data/ext/oj/rxclass.h +27 -0
  35. data/ext/oj/saj.c +4 -25
  36. data/ext/oj/scp.c +3 -25
  37. data/ext/oj/sparse.c +89 -13
  38. data/ext/oj/stream_writer.c +301 -0
  39. data/ext/oj/strict.c +4 -27
  40. data/ext/oj/string_writer.c +480 -0
  41. data/ext/oj/val_stack.h +6 -2
  42. data/lib/oj.rb +1 -23
  43. data/lib/oj/easy_hash.rb +12 -4
  44. data/lib/oj/json.rb +172 -0
  45. data/lib/oj/mimic.rb +123 -18
  46. data/lib/oj/state.rb +131 -0
  47. data/lib/oj/version.rb +1 -1
  48. data/pages/Advanced.md +22 -0
  49. data/pages/Compatibility.md +25 -0
  50. data/pages/Custom.md +23 -0
  51. data/pages/Encoding.md +65 -0
  52. data/pages/JsonGem.md +79 -0
  53. data/pages/Modes.md +140 -0
  54. data/pages/Options.md +250 -0
  55. data/pages/Rails.md +60 -0
  56. data/pages/Security.md +20 -0
  57. data/test/activesupport4/decoding_test.rb +105 -0
  58. data/test/activesupport4/encoding_test.rb +531 -0
  59. data/test/activesupport4/test_helper.rb +41 -0
  60. data/test/activesupport5/decoding_test.rb +125 -0
  61. data/test/activesupport5/encoding_test.rb +483 -0
  62. data/test/activesupport5/encoding_test_cases.rb +90 -0
  63. data/test/activesupport5/test_helper.rb +50 -0
  64. data/test/activesupport5/time_zone_test_helpers.rb +24 -0
  65. data/test/json_gem/json_addition_test.rb +216 -0
  66. data/test/json_gem/json_common_interface_test.rb +143 -0
  67. data/test/json_gem/json_encoding_test.rb +109 -0
  68. data/test/json_gem/json_ext_parser_test.rb +20 -0
  69. data/test/json_gem/json_fixtures_test.rb +35 -0
  70. data/test/json_gem/json_generator_test.rb +383 -0
  71. data/test/json_gem/json_generic_object_test.rb +90 -0
  72. data/test/json_gem/json_parser_test.rb +470 -0
  73. data/test/json_gem/json_string_matching_test.rb +42 -0
  74. data/test/json_gem/test_helper.rb +18 -0
  75. data/test/perf_compat.rb +30 -28
  76. data/test/perf_object.rb +1 -1
  77. data/test/perf_strict.rb +18 -1
  78. data/test/sample.rb +0 -1
  79. data/test/test_compat.rb +169 -93
  80. data/test/test_custom.rb +355 -0
  81. data/test/test_file.rb +0 -8
  82. data/test/test_null.rb +376 -0
  83. data/test/test_object.rb +268 -3
  84. data/test/test_scp.rb +22 -1
  85. data/test/test_strict.rb +160 -4
  86. data/test/test_various.rb +52 -620
  87. data/test/tests.rb +14 -0
  88. data/test/tests_mimic.rb +14 -0
  89. data/test/tests_mimic_addition.rb +7 -0
  90. metadata +89 -47
  91. data/test/activesupport_datetime_test.rb +0 -23
  92. data/test/bug.rb +0 -51
  93. data/test/bug2.rb +0 -10
  94. data/test/bug3.rb +0 -46
  95. data/test/bug_fast.rb +0 -32
  96. data/test/bug_load.rb +0 -24
  97. data/test/crash.rb +0 -111
  98. data/test/curl/curl_oj.rb +0 -46
  99. data/test/curl/get_oj.rb +0 -24
  100. data/test/curl/just_curl.rb +0 -31
  101. data/test/curl/just_oj.rb +0 -51
  102. data/test/example.rb +0 -11
  103. data/test/foo.rb +0 -24
  104. data/test/io.rb +0 -48
  105. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  106. data/test/mod.rb +0 -16
  107. data/test/rails.rb +0 -50
  108. data/test/russian.rb +0 -18
  109. data/test/struct.rb +0 -29
  110. data/test/test_serializer.rb +0 -59
  111. data/test/write_timebars.rb +0 -31
@@ -28,6 +28,49 @@ class ObjectJuice < Minitest::Test
28
28
  end
29
29
  end # Jeez
30
30
 
31
+ class Jam
32
+ attr_accessor :x, :y
33
+
34
+ def initialize(x, y)
35
+ @x = x
36
+ @y = y
37
+ end
38
+
39
+ def eql?(o)
40
+ self.class == o.class && @x == o.x && @y == o.y
41
+ end
42
+ alias == eql?
43
+
44
+ end # Jam
45
+
46
+ class Jazz < Jam
47
+ def initialize(x, y)
48
+ super
49
+ end
50
+ def to_hash()
51
+ { 'json_class' => self.class.to_s, 'x' => @x, 'y' => @y }
52
+ end
53
+ def self.json_create(h)
54
+ self.new(h['x'], h['y'])
55
+ end
56
+ end # Jazz
57
+
58
+ class Orange < Jam
59
+ def initialize(x, y)
60
+ super
61
+ end
62
+
63
+ def as_json()
64
+ { :json_class => self.class,
65
+ :x => @x,
66
+ :y => @y }
67
+ end
68
+
69
+ def self.json_create(h)
70
+ self.new(h['x'], h['y'])
71
+ end
72
+ end
73
+
31
74
  module One
32
75
  module Two
33
76
  module Three
@@ -208,6 +251,12 @@ class ObjectJuice < Minitest::Test
208
251
  dump_and_load(2.48e16, false)
209
252
  dump_and_load(2.48e100 * 1.0e10, false)
210
253
  dump_and_load(-2.48e100 * 1.0e10, false)
254
+ dump_and_load(1/0.0, false)
255
+ # NaN does not always == NaN
256
+ json = Oj.dump(0/0.0, :mode => :object)
257
+ assert_equal('3.3e14159265358979323846', json)
258
+ loaded = Oj.load(json);
259
+ assert_equal(true, loaded.nan?)
211
260
  end
212
261
 
213
262
  def test_string
@@ -220,6 +269,7 @@ class ObjectJuice < Minitest::Test
220
269
  def test_symbol
221
270
  dump_and_load(:abc, false)
222
271
  dump_and_load(":abc", false)
272
+ dump_and_load(':xyz'.to_sym, false)
223
273
  end
224
274
 
225
275
  def test_encode
@@ -304,6 +354,11 @@ class ObjectJuice < Minitest::Test
304
354
  bg = Oj.load(json, :mode => :object, :bigdecimal_load => true)
305
355
  assert_equal(BigDecimal, bg.class)
306
356
  assert_equal(orig, bg)
357
+ # Infinity is the same for Float and BigDecimal
358
+ json = Oj.dump(BigDecimal.new('Infinity'), :mode => :object)
359
+ assert_equal('Infinity', json)
360
+ json = Oj.dump(BigDecimal.new('-Infinity'), :mode => :object)
361
+ assert_equal('-Infinity', json)
307
362
  end
308
363
 
309
364
  # Stream IO
@@ -345,6 +400,22 @@ class ObjectJuice < Minitest::Test
345
400
  assert_equal({ :x => true, :y => 58, :z => [1, 2, 3]}, obj)
346
401
  end
347
402
 
403
+ def test_class_object
404
+ dump_and_load(ObjectJuice, false)
405
+ end
406
+
407
+ def test_module_object
408
+ dump_and_load(One, false)
409
+ end
410
+
411
+ def test_non_str_hash_object
412
+ json = Oj.dump({ 1 => true, :sim => nil }, :mode => :object)
413
+ h = Oj.load(json, :mode => :strict)
414
+ assert_equal({"^#1" => [1, true], ":sim" => nil}, h)
415
+ h = Oj.load(json, :mode => :object)
416
+ assert_equal({ 1 => true, :sim => nil }, h)
417
+ end
418
+
348
419
  # comments
349
420
  def test_comment_slash
350
421
  json = %{{
@@ -597,7 +668,7 @@ class ObjectJuice < Minitest::Test
597
668
  begin
598
669
  Oj.object_load(json)
599
670
  rescue Exception => e
600
- assert_equal("Oj::ParseError", e.class().name)
671
+ assert_equal("ArgumentError", e.class().name)
601
672
  return
602
673
  end
603
674
  assert(false, "*** expected an exception")
@@ -645,6 +716,120 @@ class ObjectJuice < Minitest::Test
645
716
  assert_equal({ 1 => true, 'nil' => nil, :sim => 4 }, h)
646
717
  end
647
718
 
719
+ def test_json_object_object
720
+ obj = Jeez.new(true, 58)
721
+ json = Oj.dump(obj, :mode => :object, :indent => 2)
722
+ assert(%{{
723
+ "^o":"ObjectJuice::Jeez",
724
+ "x":true,
725
+ "y":58
726
+ }
727
+ } == json ||
728
+ %{{
729
+ "^o":"ObjectJuice::Jeez",
730
+ "y":58,
731
+ "x":true
732
+ }
733
+ } == json)
734
+ obj2 = Oj.load(json, :mode => :object)
735
+ assert_equal(obj, obj2)
736
+ end
737
+
738
+ def test_to_hash_object_object
739
+ obj = Jazz.new(true, 58)
740
+ json = Oj.dump(obj, :mode => :object, :indent => 2)
741
+ assert(%{{
742
+ "^o":"ObjectJuice::Jazz",
743
+ "x":true,
744
+ "y":58
745
+ }
746
+ } == json ||
747
+ %{{
748
+ "^o":"ObjectJuice::Jazz",
749
+ "y":58,
750
+ "x":true
751
+ }
752
+ } == json)
753
+ obj2 = Oj.load(json, :mode => :object)
754
+ assert_equal(obj, obj2)
755
+ end
756
+
757
+ def test_as_json_object_object
758
+ obj = Orange.new(true, 58)
759
+ json = Oj.dump(obj, :mode => :object, :indent => 2)
760
+ assert(%{{
761
+ "^o":"ObjectJuice::Orange",
762
+ "x":true,
763
+ "y":58
764
+ }
765
+ } == json ||
766
+ %{{
767
+ "^o":"ObjectJuice::Orange",
768
+ "y":58,
769
+ "x":true
770
+ }
771
+ } == json)
772
+ obj2 = Oj.load(json, :mode => :object)
773
+ assert_equal(obj, obj2)
774
+ end
775
+
776
+ def test_object_object_no_cache
777
+ obj = Jam.new(true, 58)
778
+ json = Oj.dump(obj, :mode => :object, :indent => 2)
779
+ assert(%{{
780
+ "^o":"ObjectJuice::Jam",
781
+ "x":true,
782
+ "y":58
783
+ }
784
+ } == json ||
785
+ %{{
786
+ "^o":"ObjectJuice::Jam",
787
+ "y":58,
788
+ "x":true
789
+ }
790
+ } == json)
791
+ obj2 = Oj.load(json, :mode => :object, :class_cache => false)
792
+ assert_equal(obj, obj2)
793
+ end
794
+
795
+ def test_exception
796
+ err = nil
797
+ begin
798
+ raise StandardError.new('A Message')
799
+ rescue Exception => e
800
+ err = e
801
+ end
802
+ json = Oj.dump(err, :mode => :object, :indent => 2)
803
+ #puts "*** #{json}"
804
+ e2 = Oj.load(json, :mode => :strict)
805
+ assert_equal(err.class.to_s, e2['^o'])
806
+ assert_equal(err.message, e2['~mesg'])
807
+ assert_equal(err.backtrace, e2['~bt'])
808
+ e2 = Oj.load(json, :mode => :object)
809
+ if RUBY_VERSION.start_with?('1.8') || 'rubinius' == $ruby
810
+ assert_equal(e.class, e2.class);
811
+ assert_equal(e.message, e2.message);
812
+ assert_equal(e.backtrace, e2.backtrace);
813
+ else
814
+ assert_equal(e, e2);
815
+ end
816
+ end
817
+
818
+ def test_range_object
819
+ unless RUBY_VERSION.start_with?('1.8')
820
+ Oj.default_options = { :mode => :object }
821
+ json = Oj.dump(1..7, :mode => :object, :indent => 0)
822
+ if 'rubinius' == $ruby
823
+ assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
824
+ else
825
+ assert_equal(%{{"^u":["Range",1,7,false]}}, json)
826
+ end
827
+ dump_and_load(1..7, false)
828
+ dump_and_load(1..1, false)
829
+ dump_and_load(1...7, false)
830
+ end
831
+ end
832
+
648
833
  def test_circular_hash
649
834
  h = { 'a' => 7 }
650
835
  h['b'] = h
@@ -661,6 +846,30 @@ class ObjectJuice < Minitest::Test
661
846
  assert_equal(a2[1].__id__, a2.__id__)
662
847
  end
663
848
 
849
+ def test_circular_array2
850
+ a = [7]
851
+ a << a
852
+ json = Oj.dump(a, :mode => :object, :indent => 2, :circular => true)
853
+ assert_equal(%{[
854
+ "^i1",
855
+ 7,
856
+ "^r1"
857
+ ]
858
+ }, json)
859
+ a2 = Oj.load(json, :mode => :object, :circular => true)
860
+ assert_equal(a2[1].__id__, a2.__id__)
861
+ end
862
+
863
+ def test_circular_hash2
864
+ h = { 'a' => 7 }
865
+ h['b'] = h
866
+ json = Oj.dump(h, :mode => :object, :indent => 2, :circular => true)
867
+ ha = Oj.load(json, :mode => :strict)
868
+ assert_equal({'^i' => 1, 'a' => 7, 'b' => '^r1'}, ha)
869
+ Oj.load(json, :mode => :object, :circular => true)
870
+ assert_equal(h['b'].__id__, h.__id__)
871
+ end
872
+
664
873
  def test_circular_object
665
874
  obj = Jeez.new(nil, 58)
666
875
  obj.x = obj
@@ -669,6 +878,28 @@ class ObjectJuice < Minitest::Test
669
878
  assert_equal(obj2.x.__id__, obj2.__id__)
670
879
  end
671
880
 
881
+ def test_circular_object2
882
+ obj = Jam.new(nil, 58)
883
+ obj.x = obj
884
+ json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
885
+ assert(%{{
886
+ "^o":"ObjectJuice::Jam",
887
+ "^i":1,
888
+ "x":"^r1",
889
+ "y":58
890
+ }
891
+ } == json ||
892
+ %{{
893
+ "^o":"ObjectJuice::Jam",
894
+ "^i":1,
895
+ "y":58,
896
+ "x":"^r1"
897
+ }
898
+ } == json)
899
+ obj2 = Oj.load(json, :mode => :object, :circular => true)
900
+ assert_equal(obj2.x.__id__, obj2.__id__)
901
+ end
902
+
672
903
  def test_circular
673
904
  h = { 'a' => 7 }
674
905
  obj = Jeez.new(h, 58)
@@ -679,15 +910,45 @@ class ObjectJuice < Minitest::Test
679
910
  assert_equal(h['b'].__id__, obj.__id__)
680
911
  end
681
912
 
913
+ def test_circular2
914
+ h = { 'a' => 7 }
915
+ obj = Jam.new(h, 58)
916
+ obj.x['b'] = obj
917
+ json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
918
+ ha = Oj.load(json, :mode => :strict)
919
+ assert_equal({'^o' => 'ObjectJuice::Jam', '^i' => 1, 'x' => { '^i' => 2, 'a' => 7, 'b' => '^r1' }, 'y' => 58 }, ha)
920
+ Oj.load(json, :mode => :object, :circular => true)
921
+ assert_equal(obj.x.__id__, h.__id__)
922
+ assert_equal(h['b'].__id__, obj.__id__)
923
+ end
924
+
925
+ def test_omit_nil
926
+ jam = Jam.new({'a' => 1, 'b' => nil }, nil)
927
+
928
+ json = Oj.dump(jam, :omit_nil => true, :mode => :object)
929
+ assert_equal(%|{"^o":"ObjectJuice::Jam","x":{"a":1}}|, json)
930
+ end
931
+
682
932
  def test_odd_date
683
933
  dump_and_load(Date.new(2012, 6, 19), false)
684
934
  end
685
-
935
+
686
936
  def test_odd_datetime
687
937
  dump_and_load(DateTime.new(2012, 6, 19, 13, 5, Rational(4, 3)), false)
688
938
  dump_and_load(DateTime.new(2012, 6, 19, 13, 5, Rational(7123456789, 1000000000)), false)
689
939
  end
690
940
 
941
+ def test_bag
942
+ json = %{{
943
+ "^o":"ObjectJuice::Jem",
944
+ "x":true,
945
+ "y":58 }}
946
+ obj = Oj.load(json, :mode => :object, :auto_define => true)
947
+ assert_equal('ObjectJuice::Jem', obj.class.name)
948
+ assert_equal(true, obj.x)
949
+ assert_equal(58, obj.y)
950
+ end
951
+
691
952
  def test_odd_string
692
953
  Oj.register_odd(Strung, Strung, :create, :to_s, 'safe?')
693
954
  s = Strung.new("Pete", true)
@@ -738,7 +999,11 @@ class ObjectJuice < Minitest::Test
738
999
  json = Oj.dump(obj, :indent => 2, :mode => :object)
739
1000
  puts json if trace
740
1001
  loaded = Oj.object_load(json);
741
- assert_equal(obj, loaded)
1002
+ if obj.nil?
1003
+ assert_nil(loaded)
1004
+ else
1005
+ assert_equal(obj, loaded)
1006
+ end
742
1007
  loaded
743
1008
  end
744
1009
 
@@ -5,6 +5,7 @@ $: << File.dirname(__FILE__)
5
5
 
6
6
  require 'helper'
7
7
  require 'socket'
8
+ require 'stringio'
8
9
 
9
10
  $json = %{{
10
11
  "array": [
@@ -260,7 +261,27 @@ class ScpTest < Minitest::Test
260
261
  def test_double
261
262
  handler = AllHandler.new()
262
263
  json = %{{"one":true,"two":false}{"three":true,"four":false}}
263
- Oj.sc_parse(handler, json) { |j| j }
264
+ Oj.sc_parse(handler, json)
265
+ assert_equal([[:hash_start],
266
+ [:hash_key, 'one'],
267
+ [:hash_set, 'one', true],
268
+ [:hash_key, 'two'],
269
+ [:hash_set, 'too', false],
270
+ [:hash_end],
271
+ [:add_value, {}],
272
+ [:hash_start],
273
+ [:hash_key, 'three'],
274
+ [:hash_set, 'three', true],
275
+ [:hash_key, 'four'],
276
+ [:hash_set, 'four', false],
277
+ [:hash_end],
278
+ [:add_value, {}]], handler.calls)
279
+ end
280
+
281
+ def test_double_io
282
+ handler = AllHandler.new()
283
+ json = %{{"one":true,"two":false}{"three":true,"four":false}}
284
+ Oj.sc_parse(handler, StringIO.new(json))
264
285
  assert_equal([[:hash_start],
265
286
  [:hash_key, 'one'],
266
287
  [:hash_set, 'one', true],
@@ -2,13 +2,36 @@
2
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 StrictJuice < Minitest::Test
9
18
 
19
+ module TestModule
20
+ end
21
+
22
+ class Jeez
23
+ attr_accessor :x, :y
24
+
25
+ def initialize(x, y)
26
+ @x = x
27
+ @y = y
28
+ end
29
+ end
30
+
10
31
  def setup
11
32
  @default_options = Oj.default_options
33
+ # in strict mode other options other than the number formats are not used.
34
+ Oj.default_options = { :mode => :strict }
12
35
  end
13
36
 
14
37
  def teardown
@@ -46,6 +69,42 @@ class StrictJuice < Minitest::Test
46
69
  dump_and_load(-2.48e100 * 1.0e10, false)
47
70
  end
48
71
 
72
+ def test_nan_dump
73
+ assert_equal('null', Oj.dump(0/0.0, :nan => :null))
74
+ assert_equal('3.3e14159265358979323846', Oj.dump(0/0.0, :nan => :huge))
75
+ begin
76
+ Oj.dump(0/0.0, :nan => :word)
77
+ rescue Exception
78
+ assert(true)
79
+ return
80
+ end
81
+ assert(false, "*** expected an exception")
82
+ end
83
+
84
+ def test_infinity_dump
85
+ assert_equal('null', Oj.dump(1/0.0, :nan => :null))
86
+ assert_equal('3.0e14159265358979323846', Oj.dump(1/0.0, :nan => :huge))
87
+ begin
88
+ Oj.dump(1/0.0, :nan => :word)
89
+ rescue Exception
90
+ assert(true)
91
+ return
92
+ end
93
+ assert(false, "*** expected an exception")
94
+ end
95
+
96
+ def test_neg_infinity_dump
97
+ assert_equal('null', Oj.dump(-1/0.0, :nan => :null))
98
+ assert_equal('-3.0e14159265358979323846', Oj.dump(-1/0.0, :nan => :huge))
99
+ begin
100
+ Oj.dump(-1/0.0, :nan => :word)
101
+ rescue Exception
102
+ assert(true)
103
+ return
104
+ end
105
+ assert(false, "*** expected an exception")
106
+ end
107
+
49
108
  def test_string
50
109
  dump_and_load('', false)
51
110
  dump_and_load('abc', false)
@@ -96,6 +155,15 @@ class StrictJuice < Minitest::Test
96
155
  dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
97
156
  end
98
157
 
158
+ def test_deep_nest
159
+ begin
160
+ n = 10000
161
+ Oj.strict_load('[' * n + ']' * n)
162
+ rescue Exception => e
163
+ assert(false, e.message)
164
+ end
165
+ end
166
+
99
167
  # Hash
100
168
  def test_hash
101
169
  dump_and_load({}, false)
@@ -132,23 +200,55 @@ class StrictJuice < Minitest::Test
132
200
  assert_equal({"a\nb" => true, "c\td" => false}, obj)
133
201
  end
134
202
 
203
+ def test_non_str_hash
204
+ begin
205
+ Oj.dump({ 1 => true, 0 => false })
206
+ rescue Exception
207
+ assert(true)
208
+ return
209
+ end
210
+ assert(false, "*** expected an exception")
211
+ end
212
+
135
213
  def test_bignum_object
136
214
  dump_and_load(7 ** 55, false)
137
215
  end
138
216
 
139
217
  # BigDecimal
140
218
  def test_bigdecimal_strict
219
+ Oj.default_options = { :bigdecimal_load => true}
141
220
  dump_and_load(BigDecimal.new('3.14159265358979323846'), false)
142
221
  end
143
222
 
144
223
  def test_bigdecimal_load
145
224
  orig = BigDecimal.new('80.51')
146
- json = Oj.dump(orig, :mode => :compat, :bigdecimal_as_decimal => true)
147
- bg = Oj.load(json, :mode => :compat, :bigdecimal_load => true)
225
+ json = Oj.dump(orig, :mode => :strict, :bigdecimal_as_decimal => true)
226
+ bg = Oj.load(json, :mode => :strict, :bigdecimal_load => true)
148
227
  assert_equal(BigDecimal, bg.class)
149
228
  assert_equal(orig, bg)
150
229
  end
151
230
 
231
+ def test_json_object
232
+ obj = Jeez.new(true, 58)
233
+ begin
234
+ Oj.dump(obj)
235
+ rescue Exception
236
+ assert(true)
237
+ return
238
+ end
239
+ assert(false, "*** expected an exception")
240
+ end
241
+
242
+ def test_range
243
+ begin
244
+ Oj.dump(1..7)
245
+ rescue Exception
246
+ assert(true)
247
+ return
248
+ end
249
+ assert(false, "*** expected an exception")
250
+ end
251
+
152
252
  # Stream IO
153
253
  def test_io_string
154
254
  json = %{{
@@ -176,6 +276,42 @@ class StrictJuice < Minitest::Test
176
276
  assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
177
277
  end
178
278
 
279
+ def test_symbol
280
+ json = Oj.dump(:abc)
281
+ assert_equal('"abc"', json)
282
+ end
283
+
284
+ def test_time
285
+ t = Time.local(2012, 1, 5, 23, 58, 7)
286
+ begin
287
+ Oj.dump(t)
288
+ rescue Exception
289
+ assert(true)
290
+ return
291
+ end
292
+ assert(false, "*** expected an exception")
293
+ end
294
+
295
+ def test_class
296
+ begin
297
+ Oj.dump(StrictJuice)
298
+ rescue Exception
299
+ assert(true)
300
+ return
301
+ end
302
+ assert(false, "*** expected an exception")
303
+ end
304
+
305
+ def test_module
306
+ begin
307
+ Oj.dump(TestModule)
308
+ rescue Exception
309
+ assert(true)
310
+ return
311
+ end
312
+ assert(false, "*** expected an exception")
313
+ end
314
+
179
315
  # symbol_keys option
180
316
  def test_symbol_keys
181
317
  json = %{{
@@ -243,11 +379,31 @@ class StrictJuice < Minitest::Test
243
379
  assert_equal([{ 'x' => 1 }, { 'y' => 2 }], results)
244
380
  end
245
381
 
382
+ def test_circular_hash
383
+ h = { 'a' => 7 }
384
+ h['b'] = h
385
+ json = Oj.dump(h, :indent => 2, :circular => true)
386
+ assert_equal(%|{
387
+ "a":7,
388
+ "b":null
389
+ }
390
+ |, json)
391
+ end
392
+
393
+ def test_omit_nil
394
+ json = Oj.dump({'x' => {'a' => 1, 'b' => nil }, 'y' => nil}, :omit_nil => true)
395
+ assert_equal(%|{"x":{"a":1}}|, json)
396
+ end
397
+
246
398
  def dump_and_load(obj, trace=false)
247
399
  json = Oj.dump(obj, :indent => 2)
248
400
  puts json if trace
249
401
  loaded = Oj.strict_load(json);
250
- assert_equal(obj, loaded)
402
+ if obj.nil?
403
+ assert_nil(loaded)
404
+ else
405
+ assert_equal(obj, loaded)
406
+ end
251
407
  loaded
252
408
  end
253
409