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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1324 -0
- data/README.md +51 -204
- data/RELEASE_NOTES.md +61 -0
- data/ext/oj/buf.h +49 -72
- data/ext/oj/cache.c +326 -0
- data/ext/oj/cache.h +21 -0
- data/ext/oj/cache8.c +61 -64
- data/ext/oj/cache8.h +12 -39
- data/ext/oj/circarray.c +37 -68
- data/ext/oj/circarray.h +16 -42
- data/ext/oj/code.c +221 -0
- data/ext/oj/code.h +40 -0
- data/ext/oj/compat.c +231 -107
- data/ext/oj/custom.c +1125 -0
- data/ext/oj/debug.c +132 -0
- data/ext/oj/dump.c +935 -2513
- data/ext/oj/dump.h +108 -0
- data/ext/oj/dump_compat.c +936 -0
- data/ext/oj/dump_leaf.c +164 -0
- data/ext/oj/dump_object.c +761 -0
- data/ext/oj/dump_strict.c +410 -0
- data/ext/oj/encode.h +7 -42
- data/ext/oj/encoder.c +43 -0
- data/ext/oj/err.c +40 -54
- data/ext/oj/err.h +52 -46
- data/ext/oj/extconf.rb +21 -30
- data/ext/oj/fast.c +1097 -1080
- data/ext/oj/intern.c +301 -0
- data/ext/oj/intern.h +26 -0
- data/ext/oj/mimic_json.c +893 -0
- data/ext/oj/object.c +549 -620
- data/ext/oj/odd.c +155 -167
- data/ext/oj/odd.h +37 -63
- data/ext/oj/oj.c +1661 -2063
- data/ext/oj/oj.h +341 -270
- data/ext/oj/parse.c +974 -737
- data/ext/oj/parse.h +105 -97
- data/ext/oj/parser.c +1526 -0
- data/ext/oj/parser.h +90 -0
- data/ext/oj/rails.c +1504 -0
- data/ext/oj/rails.h +18 -0
- data/ext/oj/reader.c +141 -163
- data/ext/oj/reader.h +75 -113
- data/ext/oj/resolve.c +45 -93
- data/ext/oj/resolve.h +7 -34
- data/ext/oj/rxclass.c +143 -0
- data/ext/oj/rxclass.h +26 -0
- data/ext/oj/saj.c +447 -511
- data/ext/oj/saj2.c +348 -0
- data/ext/oj/scp.c +91 -138
- data/ext/oj/sparse.c +793 -644
- data/ext/oj/stream_writer.c +331 -0
- data/ext/oj/strict.c +145 -109
- data/ext/oj/string_writer.c +493 -0
- data/ext/oj/trace.c +72 -0
- data/ext/oj/trace.h +28 -0
- data/ext/oj/usual.c +1254 -0
- data/ext/oj/util.c +136 -0
- data/ext/oj/util.h +20 -0
- data/ext/oj/val_stack.c +62 -70
- data/ext/oj/val_stack.h +95 -129
- data/ext/oj/validate.c +51 -0
- data/ext/oj/wab.c +622 -0
- data/lib/oj/bag.rb +1 -0
- data/lib/oj/easy_hash.rb +17 -8
- data/lib/oj/error.rb +10 -11
- data/lib/oj/json.rb +176 -0
- data/lib/oj/mimic.rb +158 -19
- data/lib/oj/state.rb +132 -0
- data/lib/oj/version.rb +2 -2
- data/lib/oj.rb +1 -31
- data/pages/Advanced.md +22 -0
- data/pages/Compatibility.md +25 -0
- data/pages/Custom.md +23 -0
- data/pages/Encoding.md +65 -0
- data/pages/JsonGem.md +94 -0
- data/pages/Modes.md +161 -0
- data/pages/Options.md +327 -0
- data/pages/Parser.md +309 -0
- data/pages/Rails.md +167 -0
- data/pages/Security.md +20 -0
- data/pages/WAB.md +13 -0
- data/test/activerecord/result_test.rb +32 -0
- data/test/activesupport4/decoding_test.rb +108 -0
- data/test/activesupport4/encoding_test.rb +531 -0
- data/test/activesupport4/test_helper.rb +41 -0
- data/test/activesupport5/abstract_unit.rb +45 -0
- data/test/activesupport5/decoding_test.rb +133 -0
- data/test/activesupport5/encoding_test.rb +500 -0
- data/test/activesupport5/encoding_test_cases.rb +98 -0
- data/test/activesupport5/test_helper.rb +72 -0
- data/test/activesupport5/time_zone_test_helpers.rb +39 -0
- data/test/activesupport6/abstract_unit.rb +44 -0
- data/test/activesupport6/decoding_test.rb +133 -0
- data/test/activesupport6/encoding_test.rb +507 -0
- data/test/activesupport6/encoding_test_cases.rb +98 -0
- data/test/activesupport6/test_common.rb +17 -0
- data/test/activesupport6/test_helper.rb +163 -0
- data/test/activesupport6/time_zone_test_helpers.rb +39 -0
- data/test/activesupport7/abstract_unit.rb +49 -0
- data/test/activesupport7/decoding_test.rb +125 -0
- data/test/activesupport7/encoding_test.rb +486 -0
- data/test/activesupport7/encoding_test_cases.rb +104 -0
- data/test/activesupport7/time_zone_test_helpers.rb +47 -0
- data/test/bar.rb +9 -0
- data/test/baz.rb +16 -0
- data/test/bug.rb +11 -46
- data/test/foo.rb +69 -16
- data/test/helper.rb +10 -1
- data/test/isolated/shared.rb +12 -8
- data/test/isolated/test_mimic_rails_after.rb +3 -3
- data/test/isolated/test_mimic_rails_before.rb +3 -3
- data/test/json_gem/json_addition_test.rb +216 -0
- data/test/json_gem/json_common_interface_test.rb +153 -0
- data/test/json_gem/json_encoding_test.rb +107 -0
- data/test/json_gem/json_ext_parser_test.rb +20 -0
- data/test/json_gem/json_fixtures_test.rb +35 -0
- data/test/json_gem/json_generator_test.rb +397 -0
- data/test/json_gem/json_generic_object_test.rb +90 -0
- data/test/json_gem/json_parser_test.rb +470 -0
- data/test/json_gem/json_string_matching_test.rb +42 -0
- data/test/json_gem/test_helper.rb +26 -0
- data/test/mem.rb +33 -0
- data/test/perf.rb +1 -1
- data/test/perf_compat.rb +30 -28
- data/test/perf_dump.rb +50 -0
- data/test/perf_object.rb +1 -1
- data/test/perf_once.rb +58 -0
- data/test/perf_parser.rb +189 -0
- data/test/perf_scp.rb +11 -10
- data/test/perf_strict.rb +30 -19
- data/test/perf_wab.rb +131 -0
- data/test/prec.rb +23 -0
- data/test/sample.rb +0 -1
- data/test/sample_json.rb +1 -1
- data/test/test_compat.rb +219 -102
- data/test/test_custom.rb +533 -0
- data/test/test_fast.rb +107 -35
- data/test/test_file.rb +19 -25
- data/test/test_generate.rb +21 -0
- data/test/test_hash.rb +11 -1
- data/test/test_integer_range.rb +72 -0
- data/test/test_null.rb +376 -0
- data/test/test_object.rb +357 -70
- data/test/test_parser.rb +27 -0
- data/test/test_parser_saj.rb +245 -0
- data/test/test_parser_usual.rb +217 -0
- data/test/test_rails.rb +35 -0
- data/test/test_saj.rb +1 -1
- data/test/test_scp.rb +39 -2
- data/test/test_strict.rb +186 -7
- data/test/test_various.rb +160 -774
- data/test/test_wab.rb +307 -0
- data/test/test_writer.rb +90 -2
- data/test/tests.rb +24 -0
- data/test/tests_mimic.rb +14 -0
- data/test/tests_mimic_addition.rb +7 -0
- data/test/zoo.rb +13 -0
- metadata +194 -56
- data/ext/oj/hash.c +0 -163
- data/ext/oj/hash.h +0 -46
- data/ext/oj/hash_test.c +0 -512
- data/test/activesupport_datetime_test.rb +0 -23
- data/test/bug2.rb +0 -10
- data/test/bug3.rb +0 -46
- data/test/bug_fast.rb +0 -32
- data/test/bug_load.rb +0 -24
- data/test/crash.rb +0 -111
- data/test/curl/curl_oj.rb +0 -46
- data/test/curl/get_oj.rb +0 -24
- data/test/curl/just_curl.rb +0 -31
- data/test/curl/just_oj.rb +0 -51
- data/test/example.rb +0 -11
- data/test/io.rb +0 -48
- data/test/isolated/test_mimic_rails_datetime.rb +0 -27
- data/test/mod.rb +0 -16
- data/test/rails.rb +0 -50
- data/test/russian.rb +0 -18
- data/test/struct.rb +0 -29
- data/test/test_serializer.rb +0 -59
- data/test/write_timebars.rb +0 -31
data/test/test_wab.rb
ADDED
@@ -0,0 +1,307 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
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
|
9
|
+
|
10
|
+
require 'minitest'
|
11
|
+
require 'minitest/autorun'
|
12
|
+
require 'stringio'
|
13
|
+
require 'date'
|
14
|
+
require 'bigdecimal'
|
15
|
+
require 'uri'
|
16
|
+
require 'oj'
|
17
|
+
|
18
|
+
# Simple version of WAB::UUID for testing.
|
19
|
+
module WAB
|
20
|
+
class UUID
|
21
|
+
attr_reader :id
|
22
|
+
def initialize(id)
|
23
|
+
@id = id.downcase
|
24
|
+
raise Exception.new("Invalid UUID format.") if /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.match(@id).nil?
|
25
|
+
end
|
26
|
+
def to_s
|
27
|
+
@id
|
28
|
+
end
|
29
|
+
def ==(other)
|
30
|
+
other.is_a?(self.class) && @id == other.id
|
31
|
+
end
|
32
|
+
end # UUID
|
33
|
+
end # WAB
|
34
|
+
|
35
|
+
|
36
|
+
class WabJuice < Minitest::Test
|
37
|
+
|
38
|
+
module TestModule
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_nil
|
42
|
+
dump_and_load(nil, false)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_true
|
46
|
+
dump_and_load(true, false)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_false
|
50
|
+
dump_and_load(false, false)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_fixnum
|
54
|
+
dump_and_load(0, false)
|
55
|
+
dump_and_load(12345, false)
|
56
|
+
dump_and_load(-54321, false)
|
57
|
+
dump_and_load(1, false)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_float
|
61
|
+
dump_and_load(0.0, false)
|
62
|
+
dump_and_load(12345.6789, false)
|
63
|
+
dump_and_load(70.35, false)
|
64
|
+
dump_and_load(-54321.012, false)
|
65
|
+
dump_and_load(1.7775, false)
|
66
|
+
dump_and_load(2.5024, false)
|
67
|
+
dump_and_load(2.48e16, false)
|
68
|
+
dump_and_load(2.48e100 * 1.0e10, false)
|
69
|
+
dump_and_load(-2.48e100 * 1.0e10, false)
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_nan_dump
|
73
|
+
assert_raises() { Oj.dump(0/0.0, mode: :wab) }
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_infinity_dump
|
77
|
+
assert_raises() { Oj.dump(1/0.0, mode: :wab) }
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_neg_infinity_dump
|
81
|
+
assert_raises() { Oj.dump(-1/0.0, mode: :wab) }
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_string
|
85
|
+
dump_and_load('', false)
|
86
|
+
dump_and_load('abc', false)
|
87
|
+
dump_and_load("abc\ndef", false)
|
88
|
+
dump_and_load("a\u0041", false)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_encode
|
92
|
+
dump_and_load("ぴーたー", false)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_array
|
96
|
+
dump_and_load([], false)
|
97
|
+
dump_and_load([true, false], false)
|
98
|
+
dump_and_load(['a', 1, nil], false)
|
99
|
+
dump_and_load([[nil]], false)
|
100
|
+
dump_and_load([[nil], 58], false)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_array_deep
|
104
|
+
dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_deep_nest
|
108
|
+
begin
|
109
|
+
n = 10000
|
110
|
+
Oj.wab_load('[' * n + ']' * n)
|
111
|
+
rescue Exception => e
|
112
|
+
assert(false, e.message)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Hash
|
117
|
+
def test_hash
|
118
|
+
dump_and_load({}, false)
|
119
|
+
dump_and_load({ true: true, false: false}, false)
|
120
|
+
dump_and_load({ true: true, array: [], hash: { }}, false)
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_hash_non_sym_keys
|
124
|
+
assert_raises() { Oj.dump({ 'true' => true}, mode: :wab) }
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_hash_deep
|
128
|
+
dump_and_load({x1: {
|
129
|
+
x2: {
|
130
|
+
x3: {
|
131
|
+
x4: {
|
132
|
+
x5: {
|
133
|
+
x6: {
|
134
|
+
x7: {
|
135
|
+
x8: {
|
136
|
+
x9: {
|
137
|
+
x10: {
|
138
|
+
x11: {
|
139
|
+
x12: {
|
140
|
+
x13: {
|
141
|
+
x14: {
|
142
|
+
x15: {
|
143
|
+
x16: {
|
144
|
+
x17: {
|
145
|
+
x18: {
|
146
|
+
x19: {
|
147
|
+
x20: {}}}}}}}}}}}}}}}}}}}}}, false)
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_non_str_hash
|
151
|
+
assert_raises() { Oj.dump({ 1 => true, 0 => false }, mode: :wab) }
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_bignum_object
|
155
|
+
dump_and_load(7 ** 55, false)
|
156
|
+
end
|
157
|
+
|
158
|
+
# BigDecimal
|
159
|
+
def test_bigdecimal_wab
|
160
|
+
dump_and_load(BigDecimal('3.14159265358979323846'), false)
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_bigdecimal_load
|
164
|
+
orig = BigDecimal('80.51')
|
165
|
+
json = Oj.dump(orig, mode: :wab)
|
166
|
+
bg = Oj.load(json, :mode => :wab, :bigdecimal_load => true)
|
167
|
+
assert_equal(BigDecimal, bg.class)
|
168
|
+
assert_equal(orig, bg)
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_range
|
172
|
+
assert_raises() { Oj.dump(1..7, mode: :wab) }
|
173
|
+
end
|
174
|
+
|
175
|
+
# Stream IO
|
176
|
+
def test_io_string
|
177
|
+
json = %{{
|
178
|
+
"x":true,
|
179
|
+
"y":58,
|
180
|
+
"z": [1,2,3]
|
181
|
+
}
|
182
|
+
}
|
183
|
+
input = StringIO.new(json)
|
184
|
+
obj = Oj.wab_load(input)
|
185
|
+
assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_io_file
|
189
|
+
filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
|
190
|
+
File.open(filename, 'w') { |f| f.write(%{{
|
191
|
+
"x":true,
|
192
|
+
"y":58,
|
193
|
+
"z": [1,2,3]
|
194
|
+
}
|
195
|
+
}) }
|
196
|
+
f = File.new(filename)
|
197
|
+
obj = Oj.wab_load(f)
|
198
|
+
f.close()
|
199
|
+
assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_symbol
|
203
|
+
json = Oj.dump(:abc, mode: :wab)
|
204
|
+
assert_equal('"abc"', json)
|
205
|
+
end
|
206
|
+
|
207
|
+
def test_time
|
208
|
+
t = Time.gm(2017, 1, 5, 23, 58, 7, 123456.789)
|
209
|
+
json = Oj.dump(t, mode: :wab)
|
210
|
+
assert_equal('"2017-01-05T23:58:07.123456789Z"', json)
|
211
|
+
# must load and convert to json as the Time#== does not match identical
|
212
|
+
# times due to the way it tracks fractional seconds.
|
213
|
+
loaded = Oj.wab_load(json);
|
214
|
+
assert_equal(json, Oj.dump(loaded, mode: :wab), "json mismatch after load")
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_uuid
|
218
|
+
u = ::WAB::UUID.new('123e4567-e89b-12d3-a456-426655440000')
|
219
|
+
json = Oj.dump(u, mode: :wab)
|
220
|
+
assert_equal('"123e4567-e89b-12d3-a456-426655440000"', json)
|
221
|
+
dump_and_load(u, false)
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_uri
|
225
|
+
u = URI('http://opo.technology/sample')
|
226
|
+
json = Oj.dump(u, mode: :wab)
|
227
|
+
assert_equal('"http://opo.technology/sample"', json)
|
228
|
+
dump_and_load(u, false)
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_class
|
232
|
+
assert_raises() { Oj.dump(WabJuice, mode: :wab) }
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_module
|
236
|
+
assert_raises() { Oj.dump(TestModule, mode: :wab) }
|
237
|
+
end
|
238
|
+
|
239
|
+
# symbol_keys option
|
240
|
+
def test_symbol_keys
|
241
|
+
json = %{{
|
242
|
+
"x":true,
|
243
|
+
"y":58,
|
244
|
+
"z": [1,2,3]
|
245
|
+
}
|
246
|
+
}
|
247
|
+
obj = Oj.wab_load(json, :symbol_keys => true)
|
248
|
+
assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
|
249
|
+
end
|
250
|
+
|
251
|
+
# comments
|
252
|
+
def test_comment_slash
|
253
|
+
json = %{{
|
254
|
+
"x":true,//three
|
255
|
+
"y":58,
|
256
|
+
"z": [1,2,
|
257
|
+
3 // six
|
258
|
+
]}
|
259
|
+
}
|
260
|
+
obj = Oj.wab_load(json)
|
261
|
+
assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_comment_c
|
265
|
+
json = %{{
|
266
|
+
"x"/*one*/:/*two*/true,
|
267
|
+
"y":58,
|
268
|
+
"z": [1,2,3]}
|
269
|
+
}
|
270
|
+
obj = Oj.wab_load(json)
|
271
|
+
assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_comment
|
275
|
+
json = %{{
|
276
|
+
"x"/*one*/:/*two*/true,//three
|
277
|
+
"y":58/*four*/,
|
278
|
+
"z": [1,2/*five*/,
|
279
|
+
3 // six
|
280
|
+
]
|
281
|
+
}
|
282
|
+
}
|
283
|
+
obj = Oj.wab_load(json)
|
284
|
+
assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
|
285
|
+
end
|
286
|
+
|
287
|
+
def test_double
|
288
|
+
json = %{{ "x": 1}{ "y": 2}}
|
289
|
+
results = []
|
290
|
+
Oj.load(json, :mode => :wab) { |x| results << x }
|
291
|
+
|
292
|
+
assert_equal([{ x: 1 }, { y: 2 }], results)
|
293
|
+
end
|
294
|
+
|
295
|
+
def dump_and_load(obj, trace=false)
|
296
|
+
json = Oj.dump(obj, mode: :wab, indent: 2)
|
297
|
+
puts json if trace
|
298
|
+
loaded = Oj.wab_load(json);
|
299
|
+
if obj.nil?
|
300
|
+
assert_nil(loaded)
|
301
|
+
else
|
302
|
+
assert_equal(obj, loaded)
|
303
|
+
end
|
304
|
+
loaded
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
data/test/test_writer.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# encoding:
|
2
|
+
# encoding: utf-8
|
3
3
|
|
4
4
|
$: << File.dirname(__FILE__)
|
5
5
|
|
@@ -44,6 +44,14 @@ class OjWriter < Minitest::Test
|
|
44
44
|
assert_equal("{}\n", w.to_s)
|
45
45
|
end
|
46
46
|
|
47
|
+
def test_string_writer_push_null_value_with_key
|
48
|
+
w = Oj::StringWriter.new(:indent => 0, :mode => :compat)
|
49
|
+
w.push_object()
|
50
|
+
w.push_value(nil, 'nothing')
|
51
|
+
w.pop()
|
52
|
+
assert_equal(%|{"nothing":null}\n|, w.to_s)
|
53
|
+
end
|
54
|
+
|
47
55
|
def test_string_writer_nested_object
|
48
56
|
w = Oj::StringWriter.new(:indent => 0)
|
49
57
|
w.push_object()
|
@@ -219,6 +227,22 @@ class OjWriter < Minitest::Test
|
|
219
227
|
|
220
228
|
# Stream Writer
|
221
229
|
|
230
|
+
class SString < ::String
|
231
|
+
alias :write :concat
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_stream_writer_encoding
|
235
|
+
output = SString.new.force_encoding(::Encoding::UTF_8)
|
236
|
+
w = Oj::StreamWriter.new(output, :indent => 0)
|
237
|
+
# Oddly enough, when pushing ASCII characters with UTF-8 encoding or even
|
238
|
+
# ASCII-8BIT does not change the output encoding. Pushing any non-ASCII no
|
239
|
+
# matter what the encoding changes the output encoding to ASCII-8BIT.
|
240
|
+
x = "香港" # Hong Kong
|
241
|
+
x = x.force_encoding('ASCII-8BIT')
|
242
|
+
w.push_value(x)
|
243
|
+
assert_equal(::Encoding::UTF_8, output.encoding)
|
244
|
+
end
|
245
|
+
|
222
246
|
def test_stream_writer_empty_array
|
223
247
|
output = StringIO.open("", "w+")
|
224
248
|
w = Oj::StreamWriter.new(output, :indent => 0)
|
@@ -243,7 +267,8 @@ class OjWriter < Minitest::Test
|
|
243
267
|
w.push_object("a3")
|
244
268
|
w.pop()
|
245
269
|
w.pop()
|
246
|
-
|
270
|
+
result = output.string()
|
271
|
+
assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, result)
|
247
272
|
end
|
248
273
|
|
249
274
|
def test_stream_writer_mixed_file
|
@@ -289,4 +314,67 @@ class OjWriter < Minitest::Test
|
|
289
314
|
assert_equal(%|{"a1":{},"a2":{"b":{}},"a3":{"a4":37}}\n|, output.string())
|
290
315
|
end
|
291
316
|
|
317
|
+
def push_stuff(w, pop_all=true)
|
318
|
+
w.push_object()
|
319
|
+
w.push_object("a1")
|
320
|
+
w.pop()
|
321
|
+
w.push_object("a2")
|
322
|
+
w.push_array("b")
|
323
|
+
w.push_value(7)
|
324
|
+
w.push_value(true)
|
325
|
+
w.push_value("string")
|
326
|
+
w.pop()
|
327
|
+
w.pop()
|
328
|
+
w.push_object("a3")
|
329
|
+
if pop_all
|
330
|
+
w.pop_all()
|
331
|
+
else
|
332
|
+
w.pop()
|
333
|
+
w.pop()
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_stream_writer_buf_small
|
338
|
+
output = StringIO.open("", "w+")
|
339
|
+
w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 20)
|
340
|
+
push_stuff(w)
|
341
|
+
assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
|
342
|
+
end
|
343
|
+
|
344
|
+
def test_stream_writer_buf_large
|
345
|
+
output = StringIO.open("", "w+")
|
346
|
+
w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 16000)
|
347
|
+
push_stuff(w)
|
348
|
+
assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_stream_writer_buf_flush
|
352
|
+
output = StringIO.open("", "w+")
|
353
|
+
w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 4096)
|
354
|
+
push_stuff(w, false)
|
355
|
+
# no flush so nothing should be in the output yet
|
356
|
+
assert_equal("", output.string())
|
357
|
+
w.flush()
|
358
|
+
assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_stream_writer_buf_flush_small
|
362
|
+
output = StringIO.open("", "w+")
|
363
|
+
w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 30)
|
364
|
+
push_stuff(w, false)
|
365
|
+
# flush should be called at 30 bytes but since the writes are chunky flush
|
366
|
+
# is called after adding "string".
|
367
|
+
assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"|, output.string())
|
368
|
+
w.flush()
|
369
|
+
assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
|
370
|
+
end
|
371
|
+
|
372
|
+
def test_stream_writer_push_null_value_with_key
|
373
|
+
output = StringIO.open("", "w+")
|
374
|
+
w = Oj::StreamWriter.new(output, :indent => 0)
|
375
|
+
w.push_object()
|
376
|
+
w.push_value(nil, 'nothing')
|
377
|
+
w.pop()
|
378
|
+
assert_equal(%|{"nothing":null}\n|, output.string())
|
379
|
+
end
|
292
380
|
end # OjWriter
|
data/test/tests.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
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
|
9
|
+
|
10
|
+
require 'test_compat'
|
11
|
+
require 'test_custom'
|
12
|
+
require 'test_fast'
|
13
|
+
require 'test_file'
|
14
|
+
require 'test_gc'
|
15
|
+
require 'test_hash'
|
16
|
+
require 'test_null'
|
17
|
+
require 'test_object'
|
18
|
+
require 'test_saj'
|
19
|
+
require 'test_scp'
|
20
|
+
require 'test_strict'
|
21
|
+
require 'test_rails'
|
22
|
+
require 'test_wab'
|
23
|
+
require 'test_writer'
|
24
|
+
require 'test_integer_range'
|
data/test/tests_mimic.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
$: << File.dirname(__FILE__)
|
5
|
+
$: << File.join(File.dirname(__FILE__), 'json_gem')
|
6
|
+
|
7
|
+
require 'json_common_interface_test'
|
8
|
+
require 'json_encoding_test'
|
9
|
+
require 'json_ext_parser_test'
|
10
|
+
require 'json_fixtures_test'
|
11
|
+
require 'json_generator_test'
|
12
|
+
require 'json_generic_object_test'
|
13
|
+
require 'json_parser_test'
|
14
|
+
require 'json_string_matching_test'
|