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
@@ -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
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ #frozen_string_literal: false
5
+
6
+ require 'json_gem/test_helper'
7
+ require 'date'
8
+
9
+ if REAL_JSON_GEM
10
+ require 'json/add/core'
11
+ require 'json/add/complex'
12
+ require 'json/add/rational'
13
+ require 'json/add/bigdecimal'
14
+ require 'json/add/ostruct'
15
+ else
16
+ #Oj.add_to_json()
17
+ Oj.add_to_json(Array, BigDecimal, Complex, Date, DateTime, Exception, Hash, Integer, OpenStruct, Range, Rational, Regexp, Struct, Time)
18
+ end
19
+
20
+ class JSONAdditionTest < Test::Unit::TestCase
21
+ include Test::Unit::TestCaseOmissionSupport
22
+ include Test::Unit::TestCasePendingSupport
23
+
24
+ class A
25
+ def self.json_creatable?
26
+ true
27
+ end
28
+
29
+ def initialize(a)
30
+ @a = a
31
+ end
32
+
33
+ attr_reader :a
34
+
35
+ def ==(other)
36
+ a == other.a
37
+ end
38
+
39
+ def self.json_create(object)
40
+ new(*object['args'])
41
+ end
42
+
43
+ def to_json(*args)
44
+ {
45
+ 'json_class' => self.class.name,
46
+ 'args' => [ @a ],
47
+ }.to_json(*args)
48
+ end
49
+ end
50
+
51
+ class A2 < A
52
+ def to_json(*args)
53
+ {
54
+ 'json_class' => self.class.name,
55
+ 'args' => [ @a ],
56
+ }.to_json(*args)
57
+ end
58
+ end
59
+
60
+ class B
61
+ def self.json_creatable?
62
+ false
63
+ end
64
+
65
+ def to_json(*args)
66
+ {
67
+ 'json_class' => self.class.name,
68
+ }.to_json(*args)
69
+ end
70
+ end
71
+
72
+ class C
73
+ def self.json_creatable?
74
+ false
75
+ end
76
+
77
+ def to_json(*args)
78
+ {
79
+ 'json_class' => 'JSONAdditionTest::Nix',
80
+ }.to_json(*args)
81
+ end
82
+ end
83
+
84
+ def test_extended_json
85
+ a = A.new(666)
86
+ assert A.json_creatable?
87
+ json = JSON.generate(a)
88
+ a_again = JSON.parse(json, :create_additions => true)
89
+ assert_kind_of a.class, a_again
90
+ assert_equal a, a_again
91
+ end
92
+
93
+ def test_extended_json_default
94
+ a = A.new(666)
95
+ assert A.json_creatable?
96
+ json = JSON.generate(a)
97
+ a_hash = JSON.parse(json)
98
+ assert_kind_of Hash, a_hash
99
+ end
100
+
101
+ def test_extended_json_disabled
102
+ a = A.new(666)
103
+ assert A.json_creatable?
104
+ json = JSON.generate(a)
105
+ a_again = JSON.parse(json, :create_additions => true)
106
+ assert_kind_of a.class, a_again
107
+ assert_equal a, a_again
108
+ a_hash = JSON.parse(json, :create_additions => false)
109
+ assert_kind_of Hash, a_hash
110
+ assert_equal(
111
+ {"args"=>[666], "json_class"=>"JSONAdditionTest::A"}.sort_by { |k,| k },
112
+ a_hash.sort_by { |k,| k }
113
+ )
114
+ end
115
+
116
+ def test_extended_json_fail1
117
+ b = B.new
118
+ assert !B.json_creatable?
119
+ json = JSON.generate(b)
120
+ assert_equal({ "json_class"=>"JSONAdditionTest::B" }, JSON.parse(json))
121
+ end
122
+
123
+ def test_extended_json_fail2
124
+ c = C.new
125
+ assert !C.json_creatable?
126
+ json = JSON.generate(c)
127
+ assert_raise(ArgumentError, NameError) { JSON.parse(json, :create_additions => true) }
128
+ end
129
+
130
+ def test_raw_strings
131
+ raw = ''
132
+ raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
133
+ raw_array = []
134
+ for i in 0..255
135
+ raw << i
136
+ raw_array << i
137
+ end
138
+ json = raw.to_json_raw
139
+ json_raw_object = raw.to_json_raw_object
140
+ hash = { 'json_class' => 'String', 'raw'=> raw_array }
141
+ assert_equal hash, json_raw_object
142
+ assert_match(/\A\{.*\}\z/, json)
143
+ assert_match(/"json_class":"String"/, json)
144
+ assert_match(/"raw":\[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255\]/, json)
145
+
146
+ raw_again = JSON.parse(json, :create_additions => true)
147
+ assert_equal raw, raw_again
148
+ end
149
+
150
+ MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
151
+
152
+ def test_core
153
+ t = Time.now
154
+ assert_equal t, JSON(JSON(t), :create_additions => true)
155
+
156
+ d = Date.today
157
+ assert_equal d, JSON(JSON(d), :create_additions => true)
158
+
159
+ d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
160
+ assert_equal d, JSON(JSON(d), :create_additions => true)
161
+
162
+ assert_equal 1..10, JSON(JSON(1..10), :create_additions => true)
163
+ assert_equal 1...10, JSON(JSON(1...10), :create_additions => true)
164
+ assert_equal "a".."c", JSON(JSON("a".."c"), :create_additions => true)
165
+ assert_equal "a"..."c", JSON(JSON("a"..."c"), :create_additions => true)
166
+
167
+ s = MyJsonStruct.new 4711, 'foot'
168
+ assert_equal s, JSON(JSON(s), :create_additions => true)
169
+
170
+ struct = Struct.new :foo, :bar
171
+ s = struct.new 4711, 'foot'
172
+ assert_raise(JSON::JSONError) { JSON(s) }
173
+
174
+ begin
175
+ raise TypeError, "test me"
176
+ rescue TypeError => e
177
+ e_json = JSON.generate e
178
+ e_again = JSON e_json, :create_additions => true
179
+ assert_kind_of TypeError, e_again
180
+ assert_equal e.message, e_again.message
181
+ assert_equal e.backtrace, e_again.backtrace
182
+ end
183
+
184
+ assert_equal(/foo/, JSON(JSON(/foo/), :create_additions => true))
185
+ assert_equal(/foo/i, JSON(JSON(/foo/i), :create_additions => true))
186
+ end
187
+
188
+ def test_utc_datetime
189
+ now = Time.now
190
+ d = DateTime.parse(now.to_s, :create_additions => true) # usual case
191
+ assert_equal d, JSON.parse(d.to_json, :create_additions => true)
192
+ d = DateTime.parse(now.utc.to_s) # of = 0
193
+ assert_equal d, JSON.parse(d.to_json, :create_additions => true)
194
+ d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
195
+ assert_equal d, JSON.parse(d.to_json, :create_additions => true)
196
+ d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
197
+ assert_equal d, JSON.parse(d.to_json, :create_additions => true)
198
+ end
199
+
200
+ def test_rational_complex
201
+ assert_equal Rational(2, 9), JSON.parse(JSON(Rational(2, 9)), :create_additions => true)
202
+ assert_equal Complex(2, 9), JSON.parse(JSON(Complex(2, 9)), :create_additions => true)
203
+ end
204
+
205
+ def test_bigdecimal
206
+ assert_equal BigDecimal('3.141', 23), JSON(JSON(BigDecimal('3.141', 23)), :create_additions => true)
207
+ assert_equal BigDecimal('3.141', 666), JSON(JSON(BigDecimal('3.141', 666)), :create_additions => true)
208
+ end
209
+
210
+ def test_ostruct
211
+ o = OpenStruct.new
212
+ # XXX this won't work; o.foo = { :bar => true }
213
+ o.foo = { 'bar' => true }
214
+ assert_equal o, JSON.parse(JSON(o), :create_additions => true)
215
+ end
216
+ end
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ #frozen_string_literal: false
5
+
6
+ require 'json_gem/test_helper'
7
+
8
+ require 'stringio'
9
+ require 'tempfile'
10
+
11
+ class JSONCommonInterfaceTest < Test::Unit::TestCase
12
+ include Test::Unit::TestCaseOmissionSupport
13
+ include Test::Unit::TestCasePendingSupport
14
+
15
+ def setup
16
+ @hash = {
17
+ 'a' => 2,
18
+ 'b' => 3.141,
19
+ 'c' => 'c',
20
+ 'd' => [ 1, "b", 3.14 ],
21
+ 'e' => { 'foo' => 'bar' },
22
+ 'g' => "\"\0\037",
23
+ 'h' => 1000.0,
24
+ 'i' => 0.001
25
+ }
26
+ @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
27
+ '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
28
+ end
29
+
30
+ def test_index
31
+ assert_equal @json, JSON[@hash]
32
+ assert_equal @hash, JSON[@json]
33
+ end
34
+
35
+ ##############################################################################
36
+ # The next tests are omitted as implementing them and using them is a
37
+ # performance hit. Use of the JSON.parse() and similar provide the same
38
+ # functionality and perform better.
39
+
40
+ def test_parser
41
+ assert_match /::Parser\z/, JSON.parser.name
42
+ end
43
+
44
+ def test_generator
45
+ assert_match /::Generator\z/, JSON.generator.name
46
+ end
47
+
48
+ def test_state
49
+ assert_match /::Generator::State\z/, JSON.state.name
50
+ end
51
+
52
+ # This doesn't have anything to do with JSON parsing or generation. It seems
53
+ # to be more of an internal tool that is exposed to users.
54
+ def test_deep_const_get
55
+ omit("mimic_JSON") unless REAL_JSON_GEM
56
+ assert_raise(ArgumentError) { JSON.deep_const_get('Nix::Da') }
57
+ assert_equal File::SEPARATOR, JSON.deep_const_get('File::SEPARATOR')
58
+ end
59
+ ##############################################################################
60
+
61
+ def test_create_id
62
+ assert_equal 'json_class', JSON.create_id
63
+ JSON.create_id = 'foo_bar'
64
+ assert_equal 'foo_bar', JSON.create_id
65
+ ensure
66
+ JSON.create_id = 'json_class'
67
+ end
68
+
69
+ def test_parse
70
+ assert_equal [ 1, 2, 3, ], JSON.parse('[ 1, 2, 3 ]')
71
+ end
72
+
73
+ def test_parse_bang
74
+ # Modified this test to compare strings since NaN comparison fails if NaN
75
+ # was defined in different places even if it represents the same value.
76
+ assert_equal [ 1, NaN, 3, ].to_s, JSON.parse!('[ 1, NaN, 3 ]').to_s
77
+ end
78
+
79
+ def test_generate
80
+ assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
81
+ end
82
+
83
+ def test_fast_generate
84
+ assert_equal '[1,2,3]', JSON.generate([ 1, 2, 3 ])
85
+ end
86
+
87
+ def test_pretty_generate
88
+ assert_equal "[\n 1,\n 2,\n 3\n]", JSON.pretty_generate([ 1, 2, 3 ])
89
+ end
90
+
91
+ def test_load
92
+ assert_equal @hash, JSON.load(@json)
93
+ tempfile = Tempfile.open('@json')
94
+ tempfile.write @json
95
+ tempfile.rewind
96
+ assert_equal @hash, JSON.load(tempfile)
97
+ stringio = StringIO.new(@json)
98
+ stringio.rewind
99
+ assert_equal @hash, JSON.load(stringio)
100
+ assert_equal nil, JSON.load(nil)
101
+ assert_equal nil, JSON.load('')
102
+ ensure
103
+ tempfile.close!
104
+ end
105
+
106
+ def test_load_with_options
107
+ json = '{ "foo": NaN }'
108
+ assert JSON.load(json, nil, :allow_nan => true)['foo'].nan?
109
+ end
110
+
111
+ def test_load_null
112
+ assert_equal nil, JSON.load(nil, nil, :allow_blank => true)
113
+ assert_raise(TypeError) { JSON.load(nil, nil, :allow_blank => false) }
114
+ assert_raise(JSON::ParserError) { JSON.load('', nil, :allow_blank => false) }
115
+ end
116
+
117
+ def test_dump
118
+ too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
119
+ assert_equal too_deep, JSON.dump(eval(too_deep))
120
+ assert_kind_of String, Marshal.dump(eval(too_deep))
121
+ assert_raise(ArgumentError) { JSON.dump(eval(too_deep), 100) }
122
+ assert_raise(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
123
+ assert_equal too_deep, JSON.dump(eval(too_deep), 101)
124
+ assert_kind_of String, Marshal.dump(eval(too_deep), 101)
125
+ output = StringIO.new
126
+ JSON.dump(eval(too_deep), output)
127
+ assert_equal too_deep, output.string
128
+ output = StringIO.new
129
+ JSON.dump(eval(too_deep), output, 101)
130
+ assert_equal too_deep, output.string
131
+ end
132
+
133
+ def test_dump_should_modify_defaults
134
+ max_nesting = JSON.dump_default_options[:max_nesting]
135
+ JSON.dump([], StringIO.new, 10)
136
+ assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
137
+ end
138
+
139
+ def test_JSON
140
+ assert_equal @json, JSON(@hash)
141
+ assert_equal @hash, JSON(@json)
142
+ end
143
+ end