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
|
require 'test/unit'
require 'ostruct'
class TC_OpenStruct < Test::Unit::TestCase
def test_initialize
h = {name: "John Smith", age: 70, pension: 300}
assert_equal h, OpenStruct.new(h).to_h
assert_equal h, OpenStruct.new(OpenStruct.new(h)).to_h
assert_equal h, OpenStruct.new(Struct.new(*h.keys).new(*h.values)).to_h
end
def test_equality
o1 = OpenStruct.new
o2 = OpenStruct.new
assert_equal(o1, o2)
o1.a = 'a'
assert_not_equal(o1, o2)
o2.a = 'a'
assert_equal(o1, o2)
o1.a = 'b'
assert_not_equal(o1, o2)
o2 = Object.new
o2.instance_eval{@table = {:a => 'b'}}
assert_not_equal(o1, o2)
end
def test_inspect
foo = OpenStruct.new
assert_equal("#<OpenStruct>", foo.inspect)
foo.bar = 1
foo.baz = 2
assert_equal("#<OpenStruct bar=1, baz=2>", foo.inspect)
foo = OpenStruct.new
foo.bar = OpenStruct.new
assert_equal('#<OpenStruct bar=#<OpenStruct>>', foo.inspect)
foo.bar.foo = foo
assert_equal('#<OpenStruct bar=#<OpenStruct foo=#<OpenStruct ...>>>', foo.inspect)
end
def test_frozen
o = OpenStruct.new
o.a = 'a'
o.freeze
assert_raise(RuntimeError) {o.b = 'b'}
assert_not_respond_to(o, :b)
assert_raise(RuntimeError) {o.a = 'z'}
assert_equal('a', o.a)
o = OpenStruct.new :a => 42
def o.frozen?; nil end
o.freeze
assert_raise(RuntimeError, '[ruby-core:22559]') {o.a = 1764}
end
def test_delete_field
bug = '[ruby-core:33010]'
o = OpenStruct.new
assert_not_respond_to(o, :a)
assert_not_respond_to(o, :a=)
o.a = 'a'
assert_respond_to(o, :a)
assert_respond_to(o, :a=)
a = o.delete_field :a
assert_not_respond_to(o, :a, bug)
assert_not_respond_to(o, :a=, bug)
assert_equal(a, 'a')
s = Object.new
def s.to_sym
:foo
end
o[s] = true
assert_respond_to(o, :foo)
assert_respond_to(o, :foo=)
o.delete_field s
assert_not_respond_to(o, :foo)
assert_not_respond_to(o, :foo=)
end
def test_setter
os = OpenStruct.new
os[:foo] = :bar
assert_equal :bar, os.foo
os['foo'] = :baz
assert_equal :baz, os.foo
end
def test_getter
os = OpenStruct.new
os.foo = :bar
assert_equal :bar, os[:foo]
assert_equal :bar, os['foo']
end
def test_to_h
h = {name: "John Smith", age: 70, pension: 300}
os = OpenStruct.new(h)
to_h = os.to_h
assert_equal(h, to_h)
to_h[:age] = 71
assert_equal(70, os.age)
assert_equal(70, h[:age])
assert_equal(h, OpenStruct.new("name" => "John Smith", "age" => 70, pension: 300).to_h)
end
def test_each_pair
h = {name: "John Smith", age: 70, pension: 300}
os = OpenStruct.new(h)
assert_equal '#<Enumerator: #<OpenStruct name="John Smith", age=70, pension=300>:each_pair>', os.each_pair.inspect
assert_equal [[:name, "John Smith"], [:age, 70], [:pension, 300]], os.each_pair.to_a
assert_equal 3, os.each_pair.size
end
def test_eql_and_hash
os1 = OpenStruct.new age: 70
os2 = OpenStruct.new age: 70.0
assert_equal os1, os2
assert_equal false, os1.eql?(os2)
assert_not_equal os1.hash, os2.hash
assert_equal true, os1.eql?(os1.dup)
assert_equal os1.hash, os1.dup.hash
end
def test_method_missing
os = OpenStruct.new
e = assert_raise(NoMethodError) { os.foo true }
assert_equal :foo, e.name
assert_equal [true], e.args
assert_match(/#{__callee__}/, e.backtrace[0])
e = assert_raise(ArgumentError) { os.send :foo=, true, true }
assert_match(/#{__callee__}/, e.backtrace[0])
end
end
|