oj 2.0.0 → 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 (133) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +17 -23
  3. data/README.md +74 -425
  4. data/ext/oj/buf.h +103 -0
  5. data/ext/oj/cache8.c +4 -0
  6. data/ext/oj/circarray.c +68 -0
  7. data/ext/oj/circarray.h +23 -0
  8. data/ext/oj/code.c +227 -0
  9. data/ext/oj/code.h +40 -0
  10. data/ext/oj/compat.c +243 -0
  11. data/ext/oj/custom.c +1097 -0
  12. data/ext/oj/dump.c +766 -1534
  13. data/ext/oj/dump.h +92 -0
  14. data/ext/oj/dump_compat.c +937 -0
  15. data/ext/oj/dump_leaf.c +254 -0
  16. data/ext/oj/dump_object.c +810 -0
  17. data/ext/oj/dump_rails.c +329 -0
  18. data/ext/oj/dump_strict.c +416 -0
  19. data/ext/oj/encode.h +51 -0
  20. data/ext/oj/err.c +57 -0
  21. data/ext/oj/err.h +70 -0
  22. data/ext/oj/extconf.rb +17 -7
  23. data/ext/oj/fast.c +213 -180
  24. data/ext/oj/hash.c +163 -0
  25. data/ext/oj/hash.h +46 -0
  26. data/ext/oj/hash_test.c +512 -0
  27. data/ext/oj/mimic_json.c +817 -0
  28. data/ext/oj/mimic_rails.c +806 -0
  29. data/ext/oj/mimic_rails.h +17 -0
  30. data/ext/oj/object.c +752 -0
  31. data/ext/oj/odd.c +230 -0
  32. data/ext/oj/odd.h +44 -0
  33. data/ext/oj/oj.c +1288 -929
  34. data/ext/oj/oj.h +240 -69
  35. data/ext/oj/parse.c +1014 -0
  36. data/ext/oj/parse.h +92 -0
  37. data/ext/oj/reader.c +223 -0
  38. data/ext/oj/reader.h +151 -0
  39. data/ext/oj/resolve.c +127 -0
  40. data/ext/oj/{cache.h → resolve.h} +6 -13
  41. data/ext/oj/rxclass.c +133 -0
  42. data/ext/oj/rxclass.h +27 -0
  43. data/ext/oj/saj.c +77 -175
  44. data/ext/oj/scp.c +224 -0
  45. data/ext/oj/sparse.c +911 -0
  46. data/ext/oj/stream_writer.c +301 -0
  47. data/ext/oj/strict.c +162 -0
  48. data/ext/oj/string_writer.c +480 -0
  49. data/ext/oj/val_stack.c +98 -0
  50. data/ext/oj/val_stack.h +188 -0
  51. data/lib/oj/active_support_helper.rb +41 -0
  52. data/lib/oj/bag.rb +6 -10
  53. data/lib/oj/easy_hash.rb +52 -0
  54. data/lib/oj/json.rb +172 -0
  55. data/lib/oj/mimic.rb +260 -5
  56. data/lib/oj/saj.rb +13 -10
  57. data/lib/oj/schandler.rb +142 -0
  58. data/lib/oj/state.rb +131 -0
  59. data/lib/oj/version.rb +1 -1
  60. data/lib/oj.rb +11 -23
  61. data/pages/Advanced.md +22 -0
  62. data/pages/Compatibility.md +25 -0
  63. data/pages/Custom.md +23 -0
  64. data/pages/Encoding.md +65 -0
  65. data/pages/JsonGem.md +79 -0
  66. data/pages/Modes.md +140 -0
  67. data/pages/Options.md +250 -0
  68. data/pages/Rails.md +60 -0
  69. data/pages/Security.md +20 -0
  70. data/test/_test_active.rb +76 -0
  71. data/test/_test_active_mimic.rb +96 -0
  72. data/test/_test_mimic_rails.rb +126 -0
  73. data/test/activesupport4/decoding_test.rb +105 -0
  74. data/test/activesupport4/encoding_test.rb +531 -0
  75. data/test/activesupport4/test_helper.rb +41 -0
  76. data/test/activesupport5/decoding_test.rb +125 -0
  77. data/test/activesupport5/encoding_test.rb +483 -0
  78. data/test/activesupport5/encoding_test_cases.rb +90 -0
  79. data/test/activesupport5/test_helper.rb +50 -0
  80. data/test/activesupport5/time_zone_test_helpers.rb +24 -0
  81. data/test/helper.rb +27 -0
  82. data/test/isolated/shared.rb +310 -0
  83. data/test/isolated/test_mimic_after.rb +13 -0
  84. data/test/isolated/test_mimic_alone.rb +12 -0
  85. data/test/isolated/test_mimic_as_json.rb +45 -0
  86. data/test/isolated/test_mimic_before.rb +13 -0
  87. data/test/isolated/test_mimic_define.rb +28 -0
  88. data/test/isolated/test_mimic_rails_after.rb +22 -0
  89. data/test/isolated/test_mimic_rails_before.rb +21 -0
  90. data/test/isolated/test_mimic_redefine.rb +15 -0
  91. data/test/json_gem/json_addition_test.rb +216 -0
  92. data/test/json_gem/json_common_interface_test.rb +143 -0
  93. data/test/json_gem/json_encoding_test.rb +109 -0
  94. data/test/json_gem/json_ext_parser_test.rb +20 -0
  95. data/test/json_gem/json_fixtures_test.rb +35 -0
  96. data/test/json_gem/json_generator_test.rb +383 -0
  97. data/test/json_gem/json_generic_object_test.rb +90 -0
  98. data/test/json_gem/json_parser_test.rb +470 -0
  99. data/test/json_gem/json_string_matching_test.rb +42 -0
  100. data/test/json_gem/test_helper.rb +18 -0
  101. data/test/perf_compat.rb +130 -0
  102. data/test/perf_fast.rb +9 -9
  103. data/test/perf_file.rb +64 -0
  104. data/test/{perf_obj.rb → perf_object.rb} +24 -10
  105. data/test/perf_scp.rb +151 -0
  106. data/test/perf_strict.rb +32 -113
  107. data/test/sample.rb +2 -3
  108. data/test/test_compat.rb +474 -0
  109. data/test/test_custom.rb +355 -0
  110. data/test/test_debian.rb +53 -0
  111. data/test/test_fast.rb +66 -16
  112. data/test/test_file.rb +237 -0
  113. data/test/test_gc.rb +49 -0
  114. data/test/test_hash.rb +29 -0
  115. data/test/test_null.rb +376 -0
  116. data/test/test_object.rb +1010 -0
  117. data/test/test_saj.rb +16 -16
  118. data/test/test_scp.rb +417 -0
  119. data/test/test_strict.rb +410 -0
  120. data/test/test_various.rb +815 -0
  121. data/test/test_writer.rb +308 -0
  122. data/test/tests.rb +9 -902
  123. data/test/tests_mimic.rb +14 -0
  124. data/test/tests_mimic_addition.rb +7 -0
  125. metadata +253 -38
  126. data/ext/oj/cache.c +0 -148
  127. data/ext/oj/foo.rb +0 -6
  128. data/ext/oj/load.c +0 -1049
  129. data/test/a.rb +0 -38
  130. data/test/perf1.rb +0 -64
  131. data/test/perf2.rb +0 -76
  132. data/test/perf_obj_old.rb +0 -213
  133. data/test/test_mimic.rb +0 -208
@@ -0,0 +1,90 @@
1
+ require 'bigdecimal'
2
+ require 'date'
3
+ require 'time'
4
+
5
+ module JSONTest
6
+ class Foo
7
+ def initialize(a, b)
8
+ @a, @b = a, b
9
+ end
10
+ end
11
+
12
+ class Hashlike
13
+ def to_hash
14
+ { :foo => "hello", :bar => "world" }
15
+ end
16
+ end
17
+
18
+ class Custom
19
+ def initialize(serialized)
20
+ @serialized = serialized
21
+ end
22
+
23
+ def as_json(options = nil)
24
+ @serialized
25
+ end
26
+ end
27
+
28
+ class MyStruct < Struct.new(:name, :value)
29
+ def initialize(*)
30
+ @unused = "unused instance variable"
31
+ super
32
+ end
33
+ end
34
+
35
+ module EncodingTestCases
36
+ TrueTests = [[ true, %(true) ]]
37
+ FalseTests = [[ false, %(false) ]]
38
+ NilTests = [[ nil, %(null) ]]
39
+ NumericTests = [[ 1, %(1) ],
40
+ [ 2.5, %(2.5) ],
41
+ [ 0.0/0.0, %(null) ],
42
+ [ 1.0/0.0, %(null) ],
43
+ [ -1.0/0.0, %(null) ],
44
+ [ BigDecimal('0.0')/BigDecimal('0.0'), %(null) ],
45
+ [ BigDecimal('2.5'), %("#{BigDecimal('2.5')}") ]]
46
+
47
+ StringTests = [[ 'this is the <string>', %("this is the \\u003cstring\\u003e")],
48
+ [ 'a "string" with quotes & an ampersand', %("a \\"string\\" with quotes \\u0026 an ampersand") ],
49
+ [ 'http://test.host/posts/1', %("http://test.host/posts/1")],
50
+ [ "Control characters: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\u2028\u2029",
51
+ %("Control characters: \\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\\u2028\\u2029") ]]
52
+
53
+ ArrayTests = [[ ['a', 'b', 'c'], %([\"a\",\"b\",\"c\"]) ],
54
+ [ [1, 'a', :b, nil, false], %([1,\"a\",\"b\",null,false]) ]]
55
+
56
+ HashTests = [[ {foo: "bar"}, %({\"foo\":\"bar\"}) ],
57
+ [ {1 => 1, 2 => 'a', 3 => :b, 4 => nil, 5 => false}, %({\"1\":1,\"2\":\"a\",\"3\":\"b\",\"4\":null,\"5\":false}) ]]
58
+
59
+ RangeTests = [[ 1..2, %("1..2")],
60
+ [ 1...2, %("1...2")],
61
+ [ 1.5..2.5, %("1.5..2.5")]]
62
+
63
+ SymbolTests = [[ :a, %("a") ],
64
+ [ :this, %("this") ],
65
+ [ :"a b", %("a b") ]]
66
+
67
+ ObjectTests = [[ Foo.new(1, 2), %({\"a\":1,\"b\":2}) ]]
68
+ HashlikeTests = [[ Hashlike.new, %({\"bar\":\"world\",\"foo\":\"hello\"}) ]]
69
+ StructTests = [[ MyStruct.new(:foo, "bar"), %({\"name\":\"foo\",\"value\":\"bar\"}) ],
70
+ [ MyStruct.new(nil, nil), %({\"name\":null,\"value\":null}) ]]
71
+ CustomTests = [[ Custom.new("custom"), '"custom"' ],
72
+ [ Custom.new(nil), 'null' ],
73
+ [ Custom.new(:a), '"a"' ],
74
+ [ Custom.new([ :foo, "bar" ]), '["foo","bar"]' ],
75
+ [ Custom.new({ :foo => "hello", :bar => "world" }), '{"bar":"world","foo":"hello"}' ],
76
+ [ Custom.new(Hashlike.new), '{"bar":"world","foo":"hello"}' ],
77
+ [ Custom.new(Custom.new(Custom.new(:a))), '"a"' ]]
78
+
79
+ RegexpTests = [[ /^a/, '"(?-mix:^a)"' ], [/^\w{1,2}[a-z]+/ix, '"(?ix-m:^\\\\w{1,2}[a-z]+)"']]
80
+
81
+ DateTests = [[ Date.new(2005,2,1), %("2005/02/01") ]]
82
+ TimeTests = [[ Time.utc(2005,2,1,15,15,10), %("2005/02/01 15:15:10 +0000") ]]
83
+ DateTimeTests = [[ DateTime.civil(2005,2,1,15,15,10), %("2005/02/01 15:15:10 +0000") ]]
84
+
85
+ StandardDateTests = [[ Date.new(2005,2,1), %("2005-02-01") ]]
86
+ StandardTimeTests = [[ Time.utc(2005,2,1,15,15,10), %("2005-02-01T15:15:10.000Z") ]]
87
+ StandardDateTimeTests = [[ DateTime.civil(2005,2,1,15,15,10), %("2005-02-01T15:15:10.000+00:00") ]]
88
+ StandardStringTests = [[ 'this is the <string>', %("this is the <string>")]]
89
+ end
90
+ end
@@ -0,0 +1,50 @@
1
+ require 'active_support/testing/assertions'
2
+ require 'active_support/testing/deprecation'
3
+ require 'active_support/testing/declarative'
4
+ require 'minitest/autorun'
5
+
6
+ module ActiveSupport
7
+ class TestCase < ::Minitest::Test
8
+ # Skips the current run on Rubinius using Minitest::Assertions#skip
9
+ private def rubinius_skip(message = "")
10
+ skip message if RUBY_ENGINE == "rbx"
11
+ end
12
+ # Skips the current run on JRuby using Minitest::Assertions#skip
13
+ private def jruby_skip(message = "")
14
+ skip message if defined?(JRUBY_VERSION)
15
+ end
16
+
17
+ Assertion = Minitest::Assertion
18
+
19
+ alias_method :method_name, :name
20
+
21
+ include ActiveSupport::Testing::Assertions
22
+ include ActiveSupport::Testing::Deprecation
23
+ extend ActiveSupport::Testing::Declarative
24
+
25
+ # test/unit backwards compatibility methods
26
+ alias :assert_raise :assert_raises
27
+ alias :assert_not_empty :refute_empty
28
+ alias :assert_not_equal :refute_equal
29
+ alias :assert_not_in_delta :refute_in_delta
30
+ alias :assert_not_in_epsilon :refute_in_epsilon
31
+ alias :assert_not_includes :refute_includes
32
+ alias :assert_not_instance_of :refute_instance_of
33
+ alias :assert_not_kind_of :refute_kind_of
34
+ alias :assert_no_match :refute_match
35
+ alias :assert_not_nil :refute_nil
36
+ alias :assert_not_operator :refute_operator
37
+ alias :assert_not_predicate :refute_predicate
38
+ alias :assert_not_respond_to :refute_respond_to
39
+ alias :assert_not_same :refute_same
40
+
41
+ # Fails if the block raises an exception.
42
+ #
43
+ # assert_nothing_raised do
44
+ # ...
45
+ # end
46
+ def assert_nothing_raised(*args)
47
+ yield
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,24 @@
1
+ module TimeZoneTestHelpers
2
+ def with_tz_default(tz = nil)
3
+ old_tz = Time.zone
4
+ Time.zone = tz
5
+ yield
6
+ ensure
7
+ Time.zone = old_tz
8
+ end
9
+
10
+ def with_env_tz(new_tz = 'US/Eastern')
11
+ old_tz, ENV['TZ'] = ENV['TZ'], new_tz
12
+ yield
13
+ ensure
14
+ old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
15
+ end
16
+
17
+ def with_preserve_timezone(value)
18
+ old_preserve_tz = ActiveSupport.to_time_preserves_timezone
19
+ ActiveSupport.to_time_preserves_timezone = value
20
+ yield
21
+ ensure
22
+ ActiveSupport.to_time_preserves_timezone = old_preserve_tz
23
+ end
24
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,27 @@
1
+ # Ubuntu does not accept arguments to ruby when called using env. To get warnings to show up the -w options is
2
+ # required. That can be set in the RUBYOPT environment variable.
3
+ # export RUBYOPT=-w
4
+
5
+ $VERBOSE = true
6
+
7
+ %w(lib ext test).each do |dir|
8
+ $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
9
+ end
10
+
11
+ require 'rubygems' if RUBY_VERSION.start_with?('1.8.')
12
+ require 'minitest'
13
+ require 'minitest/autorun'
14
+ require 'stringio'
15
+ require 'date'
16
+ require 'bigdecimal'
17
+ require 'pp'
18
+ require 'oj'
19
+
20
+ $ruby = RUBY_DESCRIPTION.split(' ')[0]
21
+ $ruby = 'ree' if 'ruby' == $ruby && RUBY_DESCRIPTION.include?('Ruby Enterprise Edition')
22
+
23
+ class Range
24
+ def to_hash()
25
+ { 'begin' => self.begin, 'end' => self.end, 'exclude_end' => self.exclude_end? }
26
+ end
27
+ end
@@ -0,0 +1,310 @@
1
+ # encoding: UTF-8
2
+
3
+ # The rails tests set this to true. Both Rails and the JSON gem monkey patch the
4
+ # as_json methods on several base classes. Depending on which one replaces the
5
+ # method last the behavior will be different. Oj.mimic_JSON abides by the same
6
+ # conflicting behavior and the tests reflect that.
7
+ $rails_monkey = false unless defined?($rails_monkey)
8
+
9
+ class SharedMimicTest < Minitest::Test
10
+ class Jam
11
+ attr_accessor :x, :y
12
+
13
+ def initialize(x, y)
14
+ @x = x
15
+ @y = y
16
+ end
17
+
18
+ def eql?(o)
19
+ self.class == o.class && @x == o.x && @y == o.y
20
+ end
21
+ alias == eql?
22
+
23
+ def as_json()
24
+ {"json_class" => self.class.to_s,"x" => @x,"y" => @y}
25
+ end
26
+
27
+ def self.json_create(h)
28
+ self.new(h['x'], h['y'])
29
+ end
30
+
31
+ end # Jam
32
+
33
+ def setup
34
+ @default_options = Oj.default_options
35
+ @time = Time.at(1400000000).utc
36
+ @expected_time_string =
37
+ if defined?(Rails)
38
+ %{"2014-05-13T16:53:20.000Z"}
39
+ elsif RUBY_VERSION.start_with?('1.8')
40
+ %{"Tue May 13 16:53:20 UTC 2014"}
41
+ else
42
+ %{"2014-05-13 16:53:20 UTC"}
43
+ end
44
+ end
45
+
46
+ def teardown
47
+ Oj.default_options = @default_options
48
+ end
49
+
50
+ # exception
51
+ def test_exception
52
+ begin
53
+ JSON.parse("{")
54
+ puts "Failed"
55
+ rescue JSON::ParserError
56
+ assert(true)
57
+ rescue Exception
58
+ assert(false, 'Expected a JSON::ParserError')
59
+ end
60
+ end
61
+
62
+ # dump
63
+ def test_dump_string
64
+ json = JSON.dump([1, true, nil, @time])
65
+ if $rails_monkey
66
+ assert_equal(%{[1,true,null,#{@expected_time_string}]}, json)
67
+ else
68
+ assert_equal(%{[1,true,null,{"json_class":"Time","s":1400000000,"n":0}]}, json)
69
+ end
70
+ end
71
+
72
+ def test_dump_with_options
73
+ Oj.default_options= {:indent => 2} # JSON this will not change anything
74
+ json = JSON.dump([1, true, nil, @time])
75
+ if $rails_monkey
76
+ assert_equal(%{[
77
+ 1,
78
+ true,
79
+ null,
80
+ #{@expected_time_string}
81
+ ]
82
+ }, json)
83
+ else
84
+ assert_equal(%{[
85
+ 1,
86
+ true,
87
+ null,
88
+ {
89
+ "json_class":"Time",
90
+ "s":1400000000,
91
+ "n\":0
92
+ }
93
+ ]
94
+ }, json)
95
+ end
96
+ end
97
+
98
+ def test_dump_io
99
+ s = StringIO.new()
100
+ json = JSON.dump([1, true, nil, @time], s)
101
+ assert_equal(s, json)
102
+ if $rails_monkey
103
+ assert_equal(%{[1,true,null,#{@expected_time_string}]}, s.string)
104
+ else
105
+ assert_equal(%{[1,true,null,{"json_class":"Time","s":1400000000,"n":0}]}, s.string)
106
+ end
107
+ end
108
+ # TBD options
109
+
110
+ def test_dump_struct
111
+ # anonymous Struct not supported by json so name it
112
+ if Object.const_defined?("Struct::Abc")
113
+ s = Struct::Abc
114
+ else
115
+ s = Struct.new("Abc", :a, :b, :c)
116
+ end
117
+ o = s.new(1, 'two', [true, false])
118
+ json = JSON.dump(o)
119
+ if o.respond_to?(:as_json)
120
+ if $rails_monkey
121
+ assert_equal(%|{"a":1,"b":"two","c":[true,false]}|, json)
122
+ else
123
+ assert_equal(%|{"json_class":"Struct::Abc","v":[1,"two",[true,false]]}|, json)
124
+ end
125
+ else
126
+ j = '"' + o.to_s.gsub('"', '\\"') + '"'
127
+ assert_equal(j, json)
128
+ end
129
+ end
130
+
131
+ # load
132
+ def test_load_string
133
+ json = %{{"a":1,"b":[true,false]}}
134
+ obj = JSON.load(json)
135
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
136
+ end
137
+
138
+ def test_load_io
139
+ json = %{{"a":1,"b":[true,false]}}
140
+ obj = JSON.load(StringIO.new(json))
141
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
142
+ end
143
+
144
+ def test_load_proc
145
+ Oj.mimic_JSON
146
+ children = []
147
+ json = %{{"a":1,"b":[true,false]}}
148
+ if 'rubinius' == $ruby || '1.8.7' == RUBY_VERSION
149
+ obj = JSON.load(json) {|x| children << x }
150
+ else
151
+ p = Proc.new {|x| children << x }
152
+ obj = JSON.load(json, p)
153
+ end
154
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
155
+ assert([1, true, false, [true, false], { 'a' => 1, 'b' => [true, false]}] == children ||
156
+ [true, false, [true, false], 1, { 'a' => 1, 'b' => [true, false]}] == children,
157
+ "children don't match")
158
+ end
159
+
160
+ def test_parse_with_quirks_mode
161
+ json = %{null}
162
+ assert_equal(nil, JSON.parse(json, :quirks_mode => true))
163
+ assert_raises(JSON::ParserError) { JSON.parse(json, :quirks_mode => false) }
164
+ assert_raises(JSON::ParserError) { JSON.parse(json) }
165
+ end
166
+
167
+ def test_parse_with_empty_string
168
+ Oj.mimic_JSON
169
+ assert_raises(JSON::ParserError) { JSON.parse(' ') }
170
+ assert_raises(JSON::ParserError) { JSON.parse("\t\t\n ") }
171
+ end
172
+
173
+ # []
174
+ def test_bracket_load
175
+ json = %{{"a":1,"b":[true,false]}}
176
+ obj = JSON[json]
177
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
178
+ end
179
+
180
+ def test_bracket_dump
181
+ json = JSON[[1, true, nil]]
182
+ assert_equal(%{[1,true,null]}, json)
183
+ end
184
+
185
+ # generate
186
+ def test_generate
187
+ json = JSON.generate({ 'a' => 1, 'b' => [true, false]})
188
+ assert(%{{"a":1,"b":[true,false]}} == json ||
189
+ %{{"b":[true,false],"a":1}} == json)
190
+ end
191
+ def test_generate_options
192
+ json = JSON.generate({ 'a' => 1, 'b' => [true, false]},
193
+ :indent => "--",
194
+ :array_nl => "\n",
195
+ :object_nl => "#\n",
196
+ :space => "*",
197
+ :space_before => "~")
198
+ assert(%{{#
199
+ --"a"~:*1,#
200
+ --"b"~:*[
201
+ ----true,
202
+ ----false
203
+ --]#
204
+ }} == json ||
205
+ %{{#
206
+ --"b"~:*[
207
+ ----true,
208
+ ----false
209
+ --],#
210
+ --"a"~:*1#
211
+ }} == json)
212
+
213
+ end
214
+
215
+ # fast_generate
216
+ def test_fast_generate
217
+ json = JSON.generate({ 'a' => 1, 'b' => [true, false]})
218
+ assert(%{{"a":1,"b":[true,false]}} == json ||
219
+ %{{"b":[true,false],"a":1}} == json)
220
+ end
221
+
222
+ # pretty_generate
223
+ def test_pretty_generate
224
+ json = JSON.pretty_generate({ 'a' => 1, 'b' => [true, false]})
225
+ assert(%{{
226
+ "a": 1,
227
+ "b": [
228
+ true,
229
+ false
230
+ ]
231
+ }} == json ||
232
+ %{{
233
+ "b": [
234
+ true,
235
+ false
236
+ ],
237
+ "a": 1
238
+ }} == json)
239
+ end
240
+
241
+ # parse
242
+ def test_parse
243
+ json = %{{"a":1,"b":[true,false]}}
244
+ obj = JSON.parse(json)
245
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
246
+ end
247
+ def test_parse_sym_names
248
+ json = %{{"a":1,"b":[true,false]}}
249
+ obj = JSON.parse(json, :symbolize_names => true)
250
+ assert_equal({ :a => 1, :b => [true, false]}, obj)
251
+ end
252
+ def test_parse_additions
253
+ jam = Jam.new(true, 58)
254
+ json = Oj.dump(jam, :mode => :compat, :use_to_json => true)
255
+ obj = JSON.parse(json)
256
+ assert_equal(jam, obj)
257
+ obj = JSON.parse(json, :create_additions => true)
258
+ assert_equal(jam, obj)
259
+ obj = JSON.parse(json, :create_additions => false)
260
+ assert_equal({'json_class' => 'SharedMimicTest::Jam', 'x' => true, 'y' => 58}, obj)
261
+ json.gsub!('json_class', 'kson_class')
262
+ JSON.create_id = 'kson_class'
263
+ obj = JSON.parse(json, :create_additions => true)
264
+ JSON.create_id = 'json_class'
265
+ assert_equal(jam, obj)
266
+ end
267
+ def test_parse_bang
268
+ json = %{{"a":1,"b":[true,false]}}
269
+ obj = JSON.parse!(json)
270
+ assert_equal({ 'a' => 1, 'b' => [true, false]}, obj)
271
+ end
272
+
273
+ # recurse_proc
274
+ def test_recurse_proc
275
+ children = []
276
+ JSON.recurse_proc({ 'a' => 1, 'b' => [true, false]}) { |x| children << x }
277
+ # JRuby 1.7.0 rb_yield() is broken and converts the [true, false] array into true
278
+ unless 'jruby' == $ruby && '1.9.3' == RUBY_VERSION
279
+ assert([1, true, false, [true, false], { 'a' => 1, 'b' => [true, false]}] == children ||
280
+ [true, false, [true, false], 1, { 'b' => [true, false], 'a' => 1}] == children)
281
+ end
282
+ end
283
+
284
+ # make sure to_json is defined for object.
285
+ def test_mimic_to_json
286
+ {'a' => 1}.to_json()
287
+ Object.new().to_json()
288
+ end
289
+ end # SharedMimicTest
290
+
291
+ if defined?(ActiveSupport)
292
+ class SharedMimicRailsTest < SharedMimicTest
293
+ def test_activesupport_exception
294
+ begin
295
+ ActiveSupport::JSON.decode("{")
296
+ puts "Failed"
297
+ rescue ActiveSupport::JSON.parse_error
298
+ assert(true)
299
+ rescue Exception
300
+ assert(false, 'Expected a JSON::ParserError')
301
+ end
302
+ end
303
+
304
+ def test_activesupport_encode
305
+ Oj.default_options= {:indent => 0}
306
+ json = ActiveSupport::JSON.encode([1, true, nil])
307
+ assert_equal(%{[1,true,null]}, json)
308
+ end
309
+ end # SharedMimicRailsTest
310
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+ require 'isolated/shared'
8
+
9
+ require 'json'
10
+ Oj.mimic_JSON
11
+
12
+ class MimicAfter < SharedMimicTest
13
+ end # MimicAfter
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+ require 'isolated/shared'
8
+
9
+ Oj.mimic_JSON
10
+
11
+ class MimicAlone < SharedMimicTest
12
+ end # MimicAlone
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+
6
+ require 'helper'
7
+ require 'oj'
8
+
9
+ class ObjectFolder < Minitest::Test
10
+ class Raccoon
11
+ attr_accessor :name
12
+
13
+ def initialize(name)
14
+ @name = name
15
+ end
16
+
17
+ def as_json(options={})
18
+ {:name => @name}.merge(options)
19
+ end
20
+ end
21
+
22
+ def setup
23
+ @default_options = Oj.default_options
24
+ end
25
+
26
+ def teardown
27
+ Oj.default_options = @default_options
28
+ end
29
+
30
+ def test_as_json_options
31
+ Oj.mimic_JSON()
32
+ raccoon = Raccoon.new('Rocket')
33
+ json = raccoon.to_json()
34
+ assert_equal(json, '{"name":"Rocket"}')
35
+
36
+ json = raccoon.to_json(:occupation => 'bounty hunter')
37
+ # depending on the ruby version the order of the hash members maybe different.
38
+ if (json.start_with?('{"name'))
39
+ assert_equal(json, '{"name":"Rocket","occupation":"bounty hunter"}')
40
+ else
41
+ assert_equal(json, '{"occupation":"bounty hunter","name":"Rocket"}')
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+ require 'isolated/shared'
8
+
9
+ Oj.mimic_JSON
10
+ require 'json'
11
+
12
+ class MimicBefore < SharedMimicTest
13
+ end # MimicBefore
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+
8
+ class MimicDefine < Minitest::Test
9
+ def test_mimic_define
10
+ assert(defined?(JSON).nil?)
11
+ Oj.mimic_JSON
12
+
13
+ # Test constants
14
+ assert(!defined?(JSON).nil?)
15
+ assert(!defined?(JSON::ParserError).nil?)
16
+ assert(Object.respond_to?(:to_json))
17
+
18
+ # Test loaded features
19
+ assert(!require('json'))
20
+
21
+ begin
22
+ require('json_spec')
23
+ assert(false, '** should raise LoadError')
24
+ rescue LoadError
25
+ assert(true)
26
+ end
27
+ end
28
+ end # MimicSingle
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+
8
+ begin
9
+ require 'rails/all'
10
+ rescue LoadError => e
11
+ puts "Rails are not in the gemfile, skipping tests"
12
+ Process.exit
13
+ end
14
+
15
+ Oj.mimic_JSON
16
+
17
+ require 'isolated/shared'
18
+
19
+ $rails_monkey = true
20
+
21
+ class MimicRailsAfter < SharedMimicRailsTest
22
+ end # MimicRailsAfter
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+
8
+ Oj.mimic_JSON
9
+ begin
10
+ require 'rails/all'
11
+ rescue LoadError => e
12
+ puts "Rails are not in the gemfile, skipping tests"
13
+ Process.exit
14
+ end
15
+
16
+ require 'isolated/shared'
17
+
18
+ $rails_monkey = true
19
+
20
+ class MimicRailsBefore < SharedMimicRailsTest
21
+ end # MimicRailsBefore
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+
8
+ class MimicRedefine < Minitest::Test
9
+ def test_mimic_redefine
10
+ require 'json'
11
+ parser_error = JSON::ParserError
12
+ Oj.mimic_JSON
13
+ assert_equal(parser_error, JSON::ParserError)
14
+ end
15
+ end # MimicSingle