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
|
#!/usr/bin/env ruby
# frozen_string_literal: true
require_relative 'test_helper'
class JSONCoderTest < Test::Unit::TestCase
def test_json_coder_with_proc
coder = JSON::Coder.new do |object|
"[Object object]"
end
assert_equal %(["[Object object]"]), coder.dump([Object.new])
end
def test_json_coder_with_proc_with_unsupported_value
coder = JSON::Coder.new do |object, is_key|
assert_equal false, is_key
Object.new
end
assert_raise(JSON::GeneratorError) { coder.dump([Object.new]) }
end
def test_json_coder_hash_key
obj = Object.new
coder = JSON::Coder.new do |obj, is_key|
assert_equal true, is_key
obj.to_s
end
assert_equal %({#{obj.to_s.inspect}:1}), coder.dump({ obj => 1 })
coder = JSON::Coder.new { 42 }
error = assert_raise JSON::GeneratorError do
coder.dump({ obj => 1 })
end
assert_equal "Integer not allowed as object key in JSON", error.message
end
def test_json_coder_options
coder = JSON::Coder.new(array_nl: "\n") do |object|
42
end
assert_equal "[\n42\n]", coder.dump([Object.new])
end
def test_json_coder_load
coder = JSON::Coder.new
assert_equal [1,2,3], coder.load("[1,2,3]")
end
def test_json_coder_load_options
coder = JSON::Coder.new(symbolize_names: true)
assert_equal({a: 1}, coder.load('{"a":1}'))
end
def test_json_coder_dump_NaN_or_Infinity
coder = JSON::Coder.new { |o| o.inspect }
assert_equal "NaN", coder.load(coder.dump(Float::NAN))
assert_equal "Infinity", coder.load(coder.dump(Float::INFINITY))
assert_equal "-Infinity", coder.load(coder.dump(-Float::INFINITY))
end
def test_json_coder_dump_NaN_or_Infinity_loop
coder = JSON::Coder.new { |o| o.itself }
error = assert_raise JSON::GeneratorError do
coder.dump(Float::NAN)
end
assert_include error.message, "NaN not allowed in JSON"
end
def test_json_coder_string_invalid_encoding
calls = 0
coder = JSON::Coder.new do |object, is_key|
calls += 1
object
end
error = assert_raise JSON::GeneratorError do
coder.dump("\xFF")
end
assert_equal "source sequence is illegal/malformed utf-8", error.message
assert_equal 1, calls
error = assert_raise JSON::GeneratorError do
coder.dump({ "\xFF" => 1 })
end
assert_equal "source sequence is illegal/malformed utf-8", error.message
assert_equal 2, calls
calls = 0
coder = JSON::Coder.new do |object, is_key|
calls += 1
object.dup
end
error = assert_raise JSON::GeneratorError do
coder.dump("\xFF")
end
assert_equal "source sequence is illegal/malformed utf-8", error.message
assert_equal 1, calls
error = assert_raise JSON::GeneratorError do
coder.dump({ "\xFF" => 1 })
end
assert_equal "source sequence is illegal/malformed utf-8", error.message
assert_equal 2, calls
calls = 0
coder = JSON::Coder.new do |object, is_key|
calls += 1
object.bytes
end
assert_equal "[255]", coder.dump("\xFF")
assert_equal 1, calls
error = assert_raise JSON::GeneratorError do
coder.dump({ "\xFF" => 1 })
end
assert_equal "Array not allowed as object key in JSON", error.message
assert_equal 2, calls
calls = 0
coder = JSON::Coder.new do |object, is_key|
calls += 1
[object].pack("m")
end
assert_equal '"/w==\\n"', coder.dump("\xFF")
assert_equal 1, calls
assert_equal '{"/w==\\n":1}', coder.dump({ "\xFF" => 1 })
assert_equal 2, calls
end
def test_depth
coder = JSON::Coder.new(object_nl: "\n", array_nl: "\n", space: " ", indent: " ", depth: 1)
assert_equal %({\n "foo": 42\n }), coder.dump(foo: 42)
end
def test_nesting_recovery
coder = JSON::Coder.new
ary = []
ary << ary
assert_raise JSON::NestingError do
coder.dump(ary)
end
assert_equal '{"a":1}', coder.dump({ a: 1 })
end
end
|