jrjackson 0.4.18-java → 0.4.19-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/jrjackson.gemspec +1 -2
  3. 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
  4. 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
  5. 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
  6. 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
  7. data/lib/jrjackson/build_info.rb +8 -8
  8. data/lib/jrjackson/jars/{jrjackson-1.2.35.jar → jrjackson-1.2.36.jar} +0 -0
  9. data/lib/jrjackson_jars.rb +8 -8
  10. data/pom.xml +47 -10
  11. metadata +13 -78
  12. data/.gitignore +0 -16
  13. data/.jrubyr_c +0 -433
  14. data/Gemfile +0 -13
  15. data/Mavenfile +0 -25
  16. data/Rakefile +0 -39
  17. data/alt_bench.rb +0 -46
  18. data/changelog.md +0 -181
  19. data/profiling/profiled.rb +0 -15
  20. data/run_all_individual_bench.sh +0 -25
  21. data/run_jruby_individual_bench.sh +0 -20
  22. data/run_mri_individual_bench.sh +0 -7
  23. data/src/main/java/com/jrjackson/IParseHandler.java +0 -53
  24. data/src/main/java/com/jrjackson/JavaBigDecimalValueConverter.java +0 -17
  25. data/src/main/java/com/jrjackson/JavaBigIntValueConverter.java +0 -17
  26. data/src/main/java/com/jrjackson/JavaConverter.java +0 -10
  27. data/src/main/java/com/jrjackson/JavaFloatValueConverter.java +0 -16
  28. data/src/main/java/com/jrjackson/JavaHandler.java +0 -118
  29. data/src/main/java/com/jrjackson/JavaLongValueConverter.java +0 -16
  30. data/src/main/java/com/jrjackson/JjParse.java +0 -139
  31. data/src/main/java/com/jrjackson/JrJacksonBase.java +0 -152
  32. data/src/main/java/com/jrjackson/JrJacksonJava.java +0 -81
  33. data/src/main/java/com/jrjackson/JrJacksonRaw.java +0 -108
  34. data/src/main/java/com/jrjackson/JrJacksonRuby.java +0 -89
  35. data/src/main/java/com/jrjackson/JrJacksonSaj.java +0 -26
  36. data/src/main/java/com/jrjackson/JrJacksonSch.java +0 -25
  37. data/src/main/java/com/jrjackson/JrJacksonService.java +0 -38
  38. data/src/main/java/com/jrjackson/JrParse.java +0 -142
  39. data/src/main/java/com/jrjackson/ParseError.java +0 -16
  40. data/src/main/java/com/jrjackson/RubyAnySerializer.java +0 -291
  41. data/src/main/java/com/jrjackson/RubyBigDecimalValueConverter.java +0 -18
  42. data/src/main/java/com/jrjackson/RubyBigIntValueConverter.java +0 -21
  43. data/src/main/java/com/jrjackson/RubyConverter.java +0 -12
  44. data/src/main/java/com/jrjackson/RubyDateFormat.java +0 -34
  45. data/src/main/java/com/jrjackson/RubyFloatValueConverter.java +0 -18
  46. data/src/main/java/com/jrjackson/RubyHandler.java +0 -119
  47. data/src/main/java/com/jrjackson/RubyIntValueConverter.java +0 -18
  48. data/src/main/java/com/jrjackson/RubyJacksonModule.java +0 -80
  49. data/src/main/java/com/jrjackson/RubyKeyConverter.java +0 -12
  50. data/src/main/java/com/jrjackson/RubyNameConverter.java +0 -9
  51. data/src/main/java/com/jrjackson/RubyObjectDeserializer.java +0 -182
  52. data/src/main/java/com/jrjackson/RubyStringConverter.java +0 -18
  53. data/src/main/java/com/jrjackson/RubyStringKeyConverter.java +0 -15
  54. data/src/main/java/com/jrjackson/RubyStringNameConverter.java +0 -12
  55. data/src/main/java/com/jrjackson/RubySymbolKeyConverter.java +0 -15
  56. data/src/main/java/com/jrjackson/RubySymbolNameConverter.java +0 -12
  57. data/src/main/java/com/jrjackson/RubyUtils.java +0 -149
  58. data/src/main/java/com/jrjackson/SajParse.java +0 -169
  59. data/src/main/java/com/jrjackson/SchParse.java +0 -209
  60. data/src/main/java/com/jrjackson/StreamParse.java +0 -66
  61. data/src/test/java/com/jrjackson/RubyAnySerializerTest.java +0 -56
  62. data/test/jrjackson_test.rb +0 -578
@@ -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