jrjackson 0.4.18-java → 0.4.19-java
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 +4 -4
- data/jrjackson.gemspec +1 -2
- data/lib/com/fasterxml/jackson/core/jackson-annotations/{2.15.2/jackson-annotations-2.15.2.jar → 2.15.4/jackson-annotations-2.15.4.jar} +0 -0
- data/lib/com/fasterxml/jackson/core/jackson-core/{2.15.2/jackson-core-2.15.2.jar → 2.15.4/jackson-core-2.15.4.jar} +0 -0
- data/lib/com/fasterxml/jackson/core/jackson-databind/{2.15.2/jackson-databind-2.15.2.jar → 2.15.4/jackson-databind-2.15.4.jar} +0 -0
- data/lib/com/fasterxml/jackson/module/jackson-module-afterburner/{2.15.2/jackson-module-afterburner-2.15.2.jar → 2.15.4/jackson-module-afterburner-2.15.4.jar} +0 -0
- data/lib/jrjackson/build_info.rb +8 -8
- data/lib/jrjackson/jars/{jrjackson-1.2.35.jar → jrjackson-1.2.36.jar} +0 -0
- data/lib/jrjackson_jars.rb +8 -8
- data/pom.xml +47 -10
- metadata +13 -78
- data/.gitignore +0 -16
- data/.jrubyr_c +0 -433
- data/Gemfile +0 -13
- data/Mavenfile +0 -25
- data/Rakefile +0 -39
- data/alt_bench.rb +0 -46
- data/changelog.md +0 -181
- data/profiling/profiled.rb +0 -15
- data/run_all_individual_bench.sh +0 -25
- data/run_jruby_individual_bench.sh +0 -20
- data/run_mri_individual_bench.sh +0 -7
- data/src/main/java/com/jrjackson/IParseHandler.java +0 -53
- data/src/main/java/com/jrjackson/JavaBigDecimalValueConverter.java +0 -17
- data/src/main/java/com/jrjackson/JavaBigIntValueConverter.java +0 -17
- data/src/main/java/com/jrjackson/JavaConverter.java +0 -10
- data/src/main/java/com/jrjackson/JavaFloatValueConverter.java +0 -16
- data/src/main/java/com/jrjackson/JavaHandler.java +0 -118
- data/src/main/java/com/jrjackson/JavaLongValueConverter.java +0 -16
- data/src/main/java/com/jrjackson/JjParse.java +0 -139
- data/src/main/java/com/jrjackson/JrJacksonBase.java +0 -152
- data/src/main/java/com/jrjackson/JrJacksonJava.java +0 -81
- data/src/main/java/com/jrjackson/JrJacksonRaw.java +0 -108
- data/src/main/java/com/jrjackson/JrJacksonRuby.java +0 -89
- data/src/main/java/com/jrjackson/JrJacksonSaj.java +0 -26
- data/src/main/java/com/jrjackson/JrJacksonSch.java +0 -25
- data/src/main/java/com/jrjackson/JrJacksonService.java +0 -38
- data/src/main/java/com/jrjackson/JrParse.java +0 -142
- data/src/main/java/com/jrjackson/ParseError.java +0 -16
- data/src/main/java/com/jrjackson/RubyAnySerializer.java +0 -291
- data/src/main/java/com/jrjackson/RubyBigDecimalValueConverter.java +0 -18
- data/src/main/java/com/jrjackson/RubyBigIntValueConverter.java +0 -21
- data/src/main/java/com/jrjackson/RubyConverter.java +0 -12
- data/src/main/java/com/jrjackson/RubyDateFormat.java +0 -34
- data/src/main/java/com/jrjackson/RubyFloatValueConverter.java +0 -18
- data/src/main/java/com/jrjackson/RubyHandler.java +0 -119
- data/src/main/java/com/jrjackson/RubyIntValueConverter.java +0 -18
- data/src/main/java/com/jrjackson/RubyJacksonModule.java +0 -80
- data/src/main/java/com/jrjackson/RubyKeyConverter.java +0 -12
- data/src/main/java/com/jrjackson/RubyNameConverter.java +0 -9
- data/src/main/java/com/jrjackson/RubyObjectDeserializer.java +0 -182
- data/src/main/java/com/jrjackson/RubyStringConverter.java +0 -18
- data/src/main/java/com/jrjackson/RubyStringKeyConverter.java +0 -15
- data/src/main/java/com/jrjackson/RubyStringNameConverter.java +0 -12
- data/src/main/java/com/jrjackson/RubySymbolKeyConverter.java +0 -15
- data/src/main/java/com/jrjackson/RubySymbolNameConverter.java +0 -12
- data/src/main/java/com/jrjackson/RubyUtils.java +0 -149
- data/src/main/java/com/jrjackson/SajParse.java +0 -169
- data/src/main/java/com/jrjackson/SchParse.java +0 -209
- data/src/main/java/com/jrjackson/StreamParse.java +0 -66
- data/src/test/java/com/jrjackson/RubyAnySerializerTest.java +0 -56
- data/test/jrjackson_test.rb +0 -578
data/test/jrjackson_test.rb
DELETED
@@ -1,578 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
$LOAD_PATH << File.expand_path('../../lib', __FILE__)
|
4
|
-
|
5
|
-
require "java"
|
6
|
-
|
7
|
-
require 'securerandom'
|
8
|
-
|
9
|
-
require 'test/unit'
|
10
|
-
require 'thread'
|
11
|
-
require 'bigdecimal'
|
12
|
-
require 'jrjackson'
|
13
|
-
require 'stringio'
|
14
|
-
require 'time'
|
15
|
-
require 'date'
|
16
|
-
|
17
|
-
class JrJacksonTest < Test::Unit::TestCase
|
18
|
-
class Test::Unit::CustomObj
|
19
|
-
end
|
20
|
-
|
21
|
-
class Test::Unit::NullObj < BasicObject
|
22
|
-
def nil?() true; end
|
23
|
-
end
|
24
|
-
|
25
|
-
class ToJsonData
|
26
|
-
attr_reader :one, :two, :six
|
27
|
-
def initialize(a,b,c)
|
28
|
-
@one, @two, @six = a,b,c
|
29
|
-
end
|
30
|
-
def to_h
|
31
|
-
{'one' => one, 'two' => two, 'six' => six}
|
32
|
-
end
|
33
|
-
def to_json_data
|
34
|
-
[one, two, six]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class CustomToH
|
39
|
-
attr_accessor :one, :two, :six
|
40
|
-
def initialize(a,b,c)
|
41
|
-
@one, @two, @six = a,b,c
|
42
|
-
end
|
43
|
-
def to_h
|
44
|
-
{'one' => one, 'two' => two, 'six' => six}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class CustomToHash
|
49
|
-
attr_accessor :one, :two, :six
|
50
|
-
def initialize(a,b,c)
|
51
|
-
@one, @two, @six = a,b,c
|
52
|
-
end
|
53
|
-
def to_hash
|
54
|
-
{'one' => one, 'two' => two, 'six' => six}
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class CustomToJson
|
59
|
-
attr_accessor :one, :two, :six
|
60
|
-
def initialize(a,b,c)
|
61
|
-
@one, @two, @six = a,b,c
|
62
|
-
end
|
63
|
-
def to_json
|
64
|
-
%Q|{"one":#{one},"two":#{two},"six":#{six}}|
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class CustomToTime
|
69
|
-
def initialize(tm = Time.now)
|
70
|
-
@now = tm
|
71
|
-
end
|
72
|
-
def to_time
|
73
|
-
@now.to_time.utc
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
CustomStruct = Struct.new(:one, :two, :six)
|
78
|
-
|
79
|
-
class StrangeError < RuntimeError
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
class ScHandler
|
84
|
-
attr_accessor :calls
|
85
|
-
|
86
|
-
def initialize(arr = [])
|
87
|
-
@calls = arr
|
88
|
-
end
|
89
|
-
|
90
|
-
def hash_start()
|
91
|
-
@calls << [:hash_start]
|
92
|
-
{}
|
93
|
-
end
|
94
|
-
|
95
|
-
def hash_end()
|
96
|
-
@calls << [:hash_end]
|
97
|
-
end
|
98
|
-
|
99
|
-
def hash_key(key)
|
100
|
-
@calls << [:hash_key, key]
|
101
|
-
return 'too' if 'two' == key
|
102
|
-
return :symbol if 'symbol' == key
|
103
|
-
key
|
104
|
-
end
|
105
|
-
|
106
|
-
def array_start()
|
107
|
-
@calls << [:array_start]
|
108
|
-
[]
|
109
|
-
end
|
110
|
-
|
111
|
-
def array_end()
|
112
|
-
@calls << [:array_end]
|
113
|
-
end
|
114
|
-
|
115
|
-
def add_value(value)
|
116
|
-
@calls << [:add_value, value]
|
117
|
-
end
|
118
|
-
|
119
|
-
def hash_set(h, key, value)
|
120
|
-
# h[key] = value
|
121
|
-
@calls << [:hash_set, key, value]
|
122
|
-
end
|
123
|
-
|
124
|
-
def array_append(a, value)
|
125
|
-
# a.push(value)
|
126
|
-
@calls << [:array_append, value]
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
JsonString = %Q|{
|
131
|
-
"array": [
|
132
|
-
{
|
133
|
-
"num" : 3,
|
134
|
-
"string": "message",
|
135
|
-
"hash" : {
|
136
|
-
"h2" : {
|
137
|
-
"a" : [ 1, 2, 3 ]
|
138
|
-
}
|
139
|
-
}
|
140
|
-
}
|
141
|
-
],
|
142
|
-
"boolean" : true
|
143
|
-
}|
|
144
|
-
|
145
|
-
def test_sc_parse
|
146
|
-
array = []
|
147
|
-
handler = ScHandler.new(array)
|
148
|
-
JrJackson::Json.sc_load(handler, JsonString)
|
149
|
-
assert_equal(
|
150
|
-
[
|
151
|
-
[:hash_start],
|
152
|
-
[:array_start],
|
153
|
-
[:hash_start],
|
154
|
-
[:hash_key, 'num'],
|
155
|
-
[:hash_set, "num", 3],
|
156
|
-
[:hash_key, 'string'],
|
157
|
-
[:hash_set, "string", "message"],
|
158
|
-
[:hash_start],
|
159
|
-
[:hash_start],
|
160
|
-
[:array_start],
|
161
|
-
[:array_append, 1],
|
162
|
-
[:array_append, 2],
|
163
|
-
[:array_append, 3],
|
164
|
-
[:array_end],
|
165
|
-
[:hash_key, "a"],
|
166
|
-
[:hash_set, "a", []],
|
167
|
-
[:hash_end],
|
168
|
-
[:hash_key, "h2"],
|
169
|
-
[:hash_set, "h2", {}],
|
170
|
-
[:hash_end],
|
171
|
-
[:hash_key, "hash"],
|
172
|
-
[:hash_set, "hash", {}],
|
173
|
-
[:hash_end],
|
174
|
-
[:array_append, {}],
|
175
|
-
[:array_end],
|
176
|
-
[:hash_key, "array"],
|
177
|
-
[:hash_set, "array", []],
|
178
|
-
[:hash_key, 'boolean'],
|
179
|
-
[:hash_set, "boolean", true],
|
180
|
-
[:hash_end],
|
181
|
-
[:add_value, {}]
|
182
|
-
],
|
183
|
-
handler.calls
|
184
|
-
)
|
185
|
-
end
|
186
|
-
|
187
|
-
class SjHandler
|
188
|
-
attr_reader :calls
|
189
|
-
def initialize(arr = []) @calls = arr; end
|
190
|
-
def hash_start(key) @calls << [:hash_start, key]; end
|
191
|
-
def hash_end(key) @calls << [:hash_end, key]; end
|
192
|
-
def array_start(key) @calls << [:array_start, key]; end
|
193
|
-
def array_end(key) @calls << [:array_end, key]; end
|
194
|
-
def add_value(value, key) @calls << [:add_value, value, key]; end
|
195
|
-
def error(message, line, column) @calls << [:error, message, line, column]; end
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_sj_parse
|
199
|
-
handler = SjHandler.new()
|
200
|
-
JrJackson::Json.sj_load(handler, JsonString)
|
201
|
-
assert_equal(
|
202
|
-
[
|
203
|
-
[:hash_start, nil],
|
204
|
-
[:array_start, 'array'],
|
205
|
-
[:hash_start, nil],
|
206
|
-
[:add_value, 3, 'num'],
|
207
|
-
[:add_value, 'message', 'string'],
|
208
|
-
[:hash_start, 'hash'],
|
209
|
-
[:hash_start, 'h2'],
|
210
|
-
[:array_start, 'a'],
|
211
|
-
[:add_value, 1, nil],
|
212
|
-
[:add_value, 2, nil],
|
213
|
-
[:add_value, 3, nil],
|
214
|
-
[:array_end, 'a'],
|
215
|
-
[:hash_end, 'h2'],
|
216
|
-
[:hash_end, 'hash'],
|
217
|
-
[:hash_end, nil],
|
218
|
-
[:array_end, 'array'],
|
219
|
-
[:add_value, true, 'boolean'],
|
220
|
-
[:hash_end, nil]
|
221
|
-
],
|
222
|
-
handler.calls
|
223
|
-
)
|
224
|
-
end
|
225
|
-
|
226
|
-
def test_to_json_data
|
227
|
-
object = ToJsonData.new("uno", :two, 6.0)
|
228
|
-
expected = "[1,[\"uno\",\"two\",6.0]]"
|
229
|
-
actual = JrJackson::Json.dump([1, object])
|
230
|
-
assert_equal expected, actual
|
231
|
-
end
|
232
|
-
|
233
|
-
def test_datetime
|
234
|
-
h = {datetime: DateTime.parse("2014-01-27T18:24:46+01:00")}
|
235
|
-
expected = '{"datetime":"2014-01-27 17:24:46 +0000"}'
|
236
|
-
actual = JrJackson::Json.dump(h)
|
237
|
-
assert_equal expected, actual
|
238
|
-
end
|
239
|
-
|
240
|
-
def test_dump_date_in_array
|
241
|
-
expected = "[\"2016-04-10\"]"
|
242
|
-
td = Date.new(2016, 4, 10)
|
243
|
-
actual = JrJackson::Json.generate([td])
|
244
|
-
assert_equal(actual, expected)
|
245
|
-
end
|
246
|
-
|
247
|
-
def test_threading
|
248
|
-
q1, q2, q3 = Queue.new, Queue.new, Queue.new
|
249
|
-
|
250
|
-
s1 = %Q|{"a":2.5, "b":0.214, "c":3.4567, "d":-3.4567}|
|
251
|
-
th1 = Thread.new(s1) do |string|
|
252
|
-
q1 << JrJackson::Json.load(string, {use_bigdecimal: true, raw: true})
|
253
|
-
end
|
254
|
-
th2 = Thread.new(s1) do |string|
|
255
|
-
q2 << JrJackson::Json.load(string, {use_bigdecimal: true, symbolize_keys: true})
|
256
|
-
end
|
257
|
-
th3 = Thread.new(s1) do |string|
|
258
|
-
q3 << JrJackson::Json.load(string, {use_bigdecimal: false, symbolize_keys: true})
|
259
|
-
end
|
260
|
-
a1, a2, a3 = q1.pop, q2.pop, q3.pop
|
261
|
-
assert_equal ["a", "b", "c", "d"], a1.keys
|
262
|
-
assert a1.values.all? {|v| v.is_a?(Java::JavaMath::BigDecimal)}, "Expected all values to be Java::JavaMath::BigDecimal"
|
263
|
-
assert_equal [:a, :b, :c, :d], a2.keys
|
264
|
-
assert a2.values.all? {|v| v.is_a?(BigDecimal)}, "Expected all values to be BigDecimal"
|
265
|
-
assert a3.values.all? {|v| v.is_a?(Float)}, "Expected all values to be Float"
|
266
|
-
end
|
267
|
-
|
268
|
-
def test_deserialize_JSON_with_UTF8_characters
|
269
|
-
json_string = JrJackson::Json.dump({"utf8" => "żółć"})
|
270
|
-
expected = {utf8: "żółć"}
|
271
|
-
actual = JrJackson::Json.load(json_string, :symbolize_keys => true)
|
272
|
-
|
273
|
-
assert_equal expected, actual
|
274
|
-
end
|
275
|
-
|
276
|
-
def test_deserialize_JSON_with_two_entries
|
277
|
-
json_string = JrJackson::Json.dump({'foo' => 'foo_value', 'bar' => 'bar_value'})
|
278
|
-
expected = {foo: 'foo_value', bar: 'bar_value'}
|
279
|
-
actual = JrJackson::Json.load(json_string, :symbolize_keys => true)
|
280
|
-
assert_equal expected, actual
|
281
|
-
end
|
282
|
-
|
283
|
-
def test_serialize_non_json_datatypes_as_values
|
284
|
-
dt = Time.now.utc
|
285
|
-
today = Date.today
|
286
|
-
co1 = CustomToH.new("uno", :two, 6.0)
|
287
|
-
co2 = CustomToHash.new("uno", :two, 6.0)
|
288
|
-
co3 = CustomToJson.new(1.0, 2, 6.0)
|
289
|
-
co4 = CustomStruct.new(1, 2, 6)
|
290
|
-
co5 = CustomToTime.new(today)
|
291
|
-
source = {'sym' => :a_symbol, 'dt' => dt, 'co1' => co1, 'co2' => co2, 'co3' => co3, 'co4' => co4, 'co5' => co5}
|
292
|
-
json_string = JrJackson::Json.dump(source)
|
293
|
-
expected = {
|
294
|
-
:sym => "a_symbol",
|
295
|
-
:dt => dt.strftime('%F %T %z'),
|
296
|
-
:co1 => {:one => "uno", :two => "two", :six => 6.0 },
|
297
|
-
:co2 => {:one => "uno", :two => "two", :six => 6.0 },
|
298
|
-
:co3 => {:one => 1.0, :two => 2.0, :six => 6.0 },
|
299
|
-
:co4 => [1, 2, 6],
|
300
|
-
:co5 => today.to_time.utc.strftime('%F %T %z')
|
301
|
-
}
|
302
|
-
actual = JrJackson::Json.load(json_string, :symbolize_keys => true)
|
303
|
-
assert_equal expected, actual
|
304
|
-
end
|
305
|
-
|
306
|
-
def test_raw_serialize_base_classes
|
307
|
-
# String
|
308
|
-
assert_equal JrJackson::Json.dump("foo"), "\"foo\""
|
309
|
-
|
310
|
-
# Hash and implementations of the Java Hash interface
|
311
|
-
assert_equal JrJackson::Json.dump({"foo" => 1}), "{\"foo\":1}"
|
312
|
-
assert_equal JrJackson::Json.dump(Java::JavaUtil::HashMap.new({"foo" => 1})), "{\"foo\":1}"
|
313
|
-
assert_equal JrJackson::Json.dump(Java::JavaUtil::LinkedHashMap.new({"foo" => 1})), "{\"foo\":1}"
|
314
|
-
|
315
|
-
# Array and implementations of the Java List interface
|
316
|
-
assert_equal JrJackson::Json.dump(["foo", 1]), "[\"foo\",1]"
|
317
|
-
assert_equal JrJackson::Json.dump(Java::JavaUtil::ArrayList.new(["foo", 1])), "[\"foo\",1]"
|
318
|
-
assert_equal JrJackson::Json.dump(Java::JavaUtil::LinkedList.new(["foo", 1])), "[\"foo\",1]"
|
319
|
-
assert_equal JrJackson::Json.dump(Java::JavaUtil::Vector.new(["foo", 1])), "[\"foo\",1]"
|
320
|
-
|
321
|
-
# true/false
|
322
|
-
assert_equal JrJackson::Json.dump(true), "true"
|
323
|
-
assert_equal JrJackson::Json.dump(false), "false"
|
324
|
-
|
325
|
-
# nil
|
326
|
-
assert_equal JrJackson::Json.dump(nil), "null"
|
327
|
-
end
|
328
|
-
|
329
|
-
def test_serialize_date
|
330
|
-
# default date format
|
331
|
-
time_string = "2014-06-10 18:18:40 EDT"
|
332
|
-
source_time = Time.parse(time_string)
|
333
|
-
serialized_output = JrJackson::Json.dump({"time" => source_time})
|
334
|
-
other_time = Time.parse(serialized_output.split('"')[-2])
|
335
|
-
assert_equal other_time.to_f, source_time.to_f
|
336
|
-
end
|
337
|
-
|
338
|
-
def test_serialize_date_date_format
|
339
|
-
|
340
|
-
time = Time.new(2014,6,10,18,18,40, "-04:00")
|
341
|
-
# using date_format option
|
342
|
-
assert_equal "{\"time\":\"2014-06-10\"}", JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd", :timezone => "UTC")
|
343
|
-
assert_match(/\{"time"\:"\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}[+-]\d{4}"\}/, JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd'T'HH:mm:ss.SSSZ"))
|
344
|
-
end
|
345
|
-
|
346
|
-
def test_serialize_date_date_format_timezone
|
347
|
-
|
348
|
-
time = Time.new(2014,6,10,18,18,40, "-04:00")
|
349
|
-
# using date_format and timezone options
|
350
|
-
assert_equal "{\"time\":\"2014-06-10T22:18:40.000+0000\"}", JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd'T'HH:mm:ss.SSSZ", :timezone => "UTC")
|
351
|
-
# iso8601 date_format and timezone
|
352
|
-
assert_equal "{\"time\":\"2014-06-10T22:18:40.000Z\"}", JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd'T'HH:mm:ss.SSSX", :timezone => "UTC")
|
353
|
-
end
|
354
|
-
|
355
|
-
def test_can_parse_returning_java_objects
|
356
|
-
expected = {"arr"=>[2, 3, 4],
|
357
|
-
"flo"=>0.333E1,
|
358
|
-
"moo"=>"bar",
|
359
|
-
"utf8"=>"żółć",
|
360
|
-
"zzz"=>{"bar"=>-9}}
|
361
|
-
json = '{"utf8":"żółć", "moo": "bar", "zzz": {"bar":-9}, "arr": [2,3,4], "flo": 3.33}'
|
362
|
-
|
363
|
-
actual = JrJackson::Json.parse_java(json)
|
364
|
-
|
365
|
-
assert_equal Java::JavaUtil::HashMap, actual.class
|
366
|
-
assert_equal Java::JavaUtil::ArrayList, actual["arr"].class
|
367
|
-
assert_equal Java::JavaMath::BigDecimal, actual["flo"].class
|
368
|
-
assert_equal "3.33", actual["flo"].to_s
|
369
|
-
assert_equal "bar", actual["moo"]
|
370
|
-
assert_equal "żółć", actual["utf8"]
|
371
|
-
assert_equal Java::JavaUtil::HashMap, actual["zzz"].class
|
372
|
-
if 1.class == Integer
|
373
|
-
# avoid deprecation warning as Ruby 2.4 unifies Fixnum and Bignum into Integer
|
374
|
-
assert_equal Integer, actual["zzz"]["bar"].class
|
375
|
-
else
|
376
|
-
assert_equal Bignum, actual["zzz"]["bar"].class
|
377
|
-
end
|
378
|
-
assert_equal(-9, actual["zzz"]["bar"])
|
379
|
-
end
|
380
|
-
|
381
|
-
def test_can_parse_returning_ruby_objects_string_keys
|
382
|
-
expected = {
|
383
|
-
"a"=>"żółć", # string
|
384
|
-
"b"=>true, # boolean
|
385
|
-
"c"=>12345, # number
|
386
|
-
"d"=>
|
387
|
-
[true,
|
388
|
-
[false,
|
389
|
-
[-123456789, nil],
|
390
|
-
0.39676E1,
|
391
|
-
["Something else.", false],
|
392
|
-
nil]], # mix it up array
|
393
|
-
"e"=>{"zero"=>nil, "one"=>1, "two"=>2, "three"=>[3], "four"=>[0, 1, 2, 3, 4]}, # hash
|
394
|
-
"żółć"=>nil,# nil
|
395
|
-
"h"=>{"a"=>{"b"=>{"c"=>{"d"=>{"e"=>{"f"=>{"g"=>nil}}}}}}},# deep hash, not that deep
|
396
|
-
"i"=>[[[[[[[nil]]]]]]] # deep array, again, not that deep
|
397
|
-
}
|
398
|
-
json = JrJackson::Json.dump(expected)
|
399
|
-
actual = JrJackson::Json.parse_ruby(json)
|
400
|
-
assert_equal expected, actual
|
401
|
-
actual = JrJackson::Ruby.parse(json, {})
|
402
|
-
assert_equal expected, actual
|
403
|
-
end
|
404
|
-
|
405
|
-
def test_can_parse_returning_ruby_objects_symbol_keys
|
406
|
-
expected = {:a=>"Alpha",
|
407
|
-
:b=>true,
|
408
|
-
:c=>12345,
|
409
|
-
:d=>
|
410
|
-
[true, [false, [-123456789, nil], 3.9676, ["Something else.", false], nil]],
|
411
|
-
:e=>{:zero=>nil, :one=>1, :two=>2, :three=>[3], :four=>[0, 1, 2, 3, 4]},
|
412
|
-
:f=>nil,
|
413
|
-
:h=>{:a=>{:b=>{:c=>{:d=>{:e=>{:f=>{:g=>nil}}}}}}},
|
414
|
-
:i=>[[[[[[[nil]]]]]]]
|
415
|
-
}
|
416
|
-
json = JrJackson::Json.dump(expected)
|
417
|
-
actual = JrJackson::Ruby.parse_sym(json, {})
|
418
|
-
assert_equal expected, actual
|
419
|
-
end
|
420
|
-
|
421
|
-
def test_can_parse_nulls
|
422
|
-
expected = {"foo" => nil}
|
423
|
-
json = '{"foo":null}'
|
424
|
-
actual = JrJackson::Json.parse(json)
|
425
|
-
assert_equal expected, actual
|
426
|
-
end
|
427
|
-
|
428
|
-
def test_stringio
|
429
|
-
expected = {"foo" => 5, "utf8" => "żółć"}
|
430
|
-
json = ::StringIO.new('{"foo":5, "utf8":"żółć"}')
|
431
|
-
actual = JrJackson::Json.load_ruby(json)
|
432
|
-
assert_equal expected, actual
|
433
|
-
end
|
434
|
-
|
435
|
-
def test_ruby_io
|
436
|
-
expected = {"foo" => 5, "bar" => 6, "utf8" => "żółć"}
|
437
|
-
json, w = IO.pipe
|
438
|
-
w.write('{"foo":5, "bar":6, "utf8":"żółć"}')
|
439
|
-
w.close
|
440
|
-
actual = JrJackson::Json.load(json)
|
441
|
-
assert_equal expected, actual
|
442
|
-
end
|
443
|
-
|
444
|
-
def test_bad_utf
|
445
|
-
assert_raise JrJackson::ParseError do
|
446
|
-
JrJackson::Json.load("\x82\xAC\xEF")
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
|
-
def test_can_parse_bignum
|
451
|
-
expected = 12345678901234567890123456789
|
452
|
-
json = '{"foo":12345678901234567890123456789}'
|
453
|
-
|
454
|
-
actual = JrJackson::Json.parse(json)['foo']
|
455
|
-
assert_equal expected, actual
|
456
|
-
end
|
457
|
-
|
458
|
-
def test_can_parse_big_decimals
|
459
|
-
expected = BigDecimal('0.12345678901234567890123456789')
|
460
|
-
json = '{"foo":0.12345678901234567890123456789}'
|
461
|
-
|
462
|
-
actual = JrJackson::Json.parse(json, :use_bigdecimal => true)['foo']
|
463
|
-
assert_bigdecimal_equal expected, actual
|
464
|
-
|
465
|
-
actual = JrJackson::Json.parse(json, :use_bigdecimal => true, :symbolize_keys => true)[:foo]
|
466
|
-
assert_bigdecimal_equal expected, actual
|
467
|
-
|
468
|
-
actual = JrJackson::Java.parse(json, {})['foo']
|
469
|
-
assert_bigdecimal_similar expected, actual
|
470
|
-
|
471
|
-
actual = JrJackson::Json.parse(json, :use_bigdecimal => true, :raw => true)['foo']
|
472
|
-
assert_bigdecimal_similar expected, actual
|
473
|
-
|
474
|
-
end
|
475
|
-
|
476
|
-
def test_can_serialize_object
|
477
|
-
obj = Object.new
|
478
|
-
actual = JrJackson::Json.dump({"foo" => obj})
|
479
|
-
assert_equal "{\"foo\":\"#{obj}\"}", actual
|
480
|
-
end
|
481
|
-
|
482
|
-
def test_can_serialize_basic_object
|
483
|
-
obj = BasicObject.new
|
484
|
-
actual = JrJackson::Json.dump({"foo" => obj})
|
485
|
-
assert_equal "{\"foo\":\"#<BasicObject>\"}", actual
|
486
|
-
end
|
487
|
-
|
488
|
-
def test_can_serialize_basic_object_subclass
|
489
|
-
obj = Test::Unit::NullObj.new
|
490
|
-
actual = JrJackson::Json.dump({"foo" => obj})
|
491
|
-
assert_equal "{\"foo\":\"#<Test::Unit::NullObj>\"}", actual
|
492
|
-
end
|
493
|
-
|
494
|
-
def test_can_serialize_custom_object
|
495
|
-
obj = Test::Unit::CustomObj.new
|
496
|
-
actual = JrJackson::Json.dump({"foo" => obj})
|
497
|
-
assert_equal "{\"foo\":\"#{obj}\"}", actual
|
498
|
-
end
|
499
|
-
|
500
|
-
def test_supports_pretty_printing
|
501
|
-
object = {"foo" => 5, "utf8" => "żółć"}
|
502
|
-
actual = JrJackson::Json.dump(object, :pretty => true)
|
503
|
-
assert_equal "{\n \"foo\" : 5,\n \"utf8\" : \"żółć\"\n}", actual
|
504
|
-
end
|
505
|
-
|
506
|
-
def test_can_serialise_non_string_keys
|
507
|
-
object = {5 => "foo"}
|
508
|
-
actual = JrJackson::Json.dump(object)
|
509
|
-
assert_equal "{\"5\":\"foo\"}", actual
|
510
|
-
end
|
511
|
-
|
512
|
-
def test_can_serialise_regex_match_data
|
513
|
-
re = %r|(foo)(bar)(baz)|
|
514
|
-
m = re.match('foobarbaz')
|
515
|
-
object = {'matched' => m[2]}
|
516
|
-
actual = JrJackson::Json.dump(object)
|
517
|
-
assert_equal "{\"matched\":\"bar\"}", actual
|
518
|
-
end
|
519
|
-
|
520
|
-
def test_can_mix_java_and_ruby_objects
|
521
|
-
json = '{"utf8":"żółć", "moo": "bar", "arr": [2,3,4], "flo": 3.33}'
|
522
|
-
timeobj = Time.new(2015,11,11,11,11,11,0).utc
|
523
|
-
expected = '{"mixed":{"arr":[2,3,4],"utf8":"żółć","flo":3.33,"zzz":{"one":1.0,"two":2,"six":6.0},"moo":"bar"},"time":"2015-11-11 11:11:11 +0000"}'
|
524
|
-
object = JrJackson::Json.parse_java(json)
|
525
|
-
object["zzz"] = CustomToJson.new(1.0, 2, 6.0)
|
526
|
-
mixed = {"mixed" => object}
|
527
|
-
mixed['time'] = timeobj
|
528
|
-
actual = JrJackson::Json.dump(mixed)
|
529
|
-
assert_equal expected, actual
|
530
|
-
end
|
531
|
-
|
532
|
-
def test_can_serialize_exceptions
|
533
|
-
e = StrangeError.new("Something immensely bad happened")
|
534
|
-
object = {'error' => e}
|
535
|
-
actual = JrJackson::Json.dump(object)
|
536
|
-
assert_equal "{\"error\":\"#{e.inspect}\"}", actual
|
537
|
-
end
|
538
|
-
|
539
|
-
def test_can_serialize_class
|
540
|
-
object = {"foo" => BasicObject}
|
541
|
-
actual = JrJackson::Json.dump(object)
|
542
|
-
assert_equal "{\"foo\":\"#{BasicObject.inspect}\"}", actual
|
543
|
-
end
|
544
|
-
|
545
|
-
def test_can_handle_big_numbers
|
546
|
-
object = {"foo" => 2**63, "bar" => 65536}
|
547
|
-
actual = JrJackson::Json.dump(object)
|
548
|
-
assert_equal "{\"foo\":9223372036854775808,\"bar\":65536}", actual
|
549
|
-
end
|
550
|
-
|
551
|
-
|
552
|
-
# This test failed more often than not before fixing the underlying code
|
553
|
-
# and would fail every time if `100_000.times` was changed to `loop`
|
554
|
-
def test_concurrent_dump
|
555
|
-
now = Time.now
|
556
|
-
num_threads = 100
|
557
|
-
|
558
|
-
threads = num_threads.times.map do |i|
|
559
|
-
Thread.new do
|
560
|
-
100_000.times { JrJackson::Json.dump("a" => now) }
|
561
|
-
end
|
562
|
-
end
|
563
|
-
threads.each(&:join)
|
564
|
-
end
|
565
|
-
|
566
|
-
# -----------------------------
|
567
|
-
|
568
|
-
def assert_bigdecimal_equal(expected, actual)
|
569
|
-
assert_equal expected, actual
|
570
|
-
assert_equal expected.class, actual.class
|
571
|
-
assert_equal BigDecimal, actual.class
|
572
|
-
end
|
573
|
-
|
574
|
-
def assert_bigdecimal_similar(expected, actual)
|
575
|
-
assert_equal BigDecimal(expected.to_s).round(11), BigDecimal(actual.to_s).round(11)
|
576
|
-
assert_equal Java::JavaMath::BigDecimal, actual.class
|
577
|
-
end
|
578
|
-
end
|