/
testStruct.rb
145 lines (113 loc) · 2.68 KB
/
testStruct.rb
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
require 'test/minirunit'
test_check "Test Struct"
s = Struct.new("MyStruct", :x, :y)
test_equal(Struct::MyStruct, s)
s1 = s.new(11, 22)
test_equal(11, s1["x"])
test_equal(22, s1["y"])
s1 = s.new
test_equal(nil, s1.x)
test_equal(nil, s1.y)
s1.x = 10
s1.y = 20
test_equal(10, s1.x)
test_equal(20, s1.y)
test_equal(10, s1[0])
test_equal(20, s1[1])
test_equal(20, s1[-1])
test_equal(2, s1.length)
test_equal(2, s1.size)
test_equal([10, 20], s1.values)
test_exception(NameError) { s1["froboz"] }
test_exception(IndexError) { s1[10] }
s2 = s.new(1, 2)
test_equal(1, s2.x)
test_equal(2, s2.y)
test_exception(ArgumentError) { s.new(1,2,3,4,5,6,7) }
test_exception(ArgumentError) { Struct.new }
test_exception(NameError) { Struct.new('foo', 'bar') }
# name should be coerced to string with to_str
foo = Object.new
def foo.to_str() 'Foo' end
s = Struct.new(foo, :x, :y)
test_equal s, Struct::Foo
# Anonymous Struct
a = Struct.new(:x, :y)
a1 = a.new(5, 7)
test_equal(5, a1.x)
# Struct::Tms
tms = Struct::Tms.new(0, 0, 0, 0)
test_ok(tms != nil)
# Struct creation with a block
a = Struct.new(:foo, :bar) {
def hello
"hello"
end
}
test_equal("hello", a.new(0, 0).hello)
require 'stringio'
module Recording
def self.stderr
$stderr = recorder = StringIO.new
begin
yield
ensure
$stderr = STDERR
end
recorder.rewind
recorder
end
end
# Redefining a named struct should produce a warning, but it should be a new class
P1 = Struct.new("Post", :foo)
P1.class_eval do
def bar
true
end
end
Recording::stderr do
P2 = Struct.new("Post", :foo)
end
test_exception {
P2.new.bar
}
Recording::stderr do
MyStruct = Struct.new("MyStruct", :a, :b)
end
class MySubStruct < MyStruct
def initialize(v, *args) super(*args); @v = v; end
end
b = MySubStruct.new(1, 2)
inspect1 = b.inspect
b.instance_eval {"EH"}
# Instance_eval creates a metaclass and our inspect should not print that new metaclass out
test_equal(inspect1, b.inspect)
c = MySubStruct.new(1, 2)
class << b
def foo
end
end
# Even though they have different metaclasses they are still equal in the eyes of Ruby
test_equal(b, c)
c = Struct.new(:a)
s1 = c.new(1)
s2 = c.new(1)
test_ok(true, s1.eql?(s2))
test_equal(s1.hash, s2.hash)
test_no_exception { Struct.new(:icandup).new(1).dup }
FiveElementStruct = Struct.new(:a, :b, :c, :d, :e)
fes = FiveElementStruct.new(1, 2, 3, 4, 5)
test_equal([2,4], fes.select {|i| (i % 2).zero?})
# JRUBY-2157
class Foo < Struct.new(:heh)
def initialize
end
end
test_equal(nil, Foo.new.heh)
# JRUBY-2490
require 'java'
class JavaComparableStruct < Struct.new(:foo)
include java.lang.Comparable
def compare_to(other); 0; end
end
test_equal(:a, JavaComparableStruct.new(:a).foo)