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
|
require 'locale/util/memoizable'
require 'test/unit'
class A
include Locale::Util::Memoizable
def initialize
@count = 0
@a = ""
end
def test1(a)
@a += String(a)
@count += 1
end
memoize :test1
attr_reader :a
end
class B < A
end
class C < A
def test1(a)
@a = String(a) + @a
@count += 1
end
memoize :test1
end
class D
class << self
include Locale::Util::Memoizable
def init
@@count = 0
@@a = "a"
end
def test1(a)
@@a = @@a + "b" * a
@@count += 1
end
memoize :test1
def a
@@a
end
end
end
class E
include Locale::Util::Memoizable
def test2
"aa"
end
memoize :test2
def test2_dup
"bb"
end
memoize_dup :test2_dup
end
class TestMemoizable < Test::Unit::TestCase
def test_simple
t = A.new
assert_equal 1, t.test1(1)
assert_equal "1", t.a
assert_equal 1, t.test1(1)
assert_equal "1", t.a
assert_equal 2, t.test1(2)
assert_equal "12", t.a
assert_equal 2, t.test1(2)
assert_equal "12", t.a
assert_equal 1, t.test1(1)
assert_equal "12", t.a
end
def test_simple_inherited
t = B.new
assert_equal 1, t.test1(1)
assert_equal "1", t.a
assert_equal 1, t.test1(1)
assert_equal "1", t.a
assert_equal 2, t.test1(2)
assert_equal "12", t.a
assert_equal 2, t.test1(2)
assert_equal "12", t.a
assert_equal 1, t.test1(1)
assert_equal "12", t.a
end
def test_override
t = C.new
assert_equal 1, t.test1(1)
assert_equal "1", t.a
assert_equal 1, t.test1(1)
assert_equal "1", t.a
assert_equal 2, t.test1(2)
assert_equal "21", t.a
assert_equal 2, t.test1(2)
assert_equal "21", t.a
assert_equal 1, t.test1(1)
assert_equal "21", t.a
end
def test_class_method
D.init
assert_equal 1, D.test1(1)
assert_equal "ab", D.a
assert_equal 1, D.test1(1)
assert_equal "ab", D.a
assert_equal 2, D.test1(2)
assert_equal "abbb", D.a
assert_equal 2, D.test1(2)
assert_equal "abbb", D.a
assert_equal 1, D.test1(1)
assert_equal "abbb", D.a
end
def test_freeze_or_dup
t = E.new
assert_equal "aa", t.test2
# When modification attempted on frozen objects,
# ruby 1.9 raises RuntimeError instead of TypeError.
# http://redmine.ruby-lang.org/issues/show/409
# http://redmine.ruby-lang.org/repositories/diff/ruby-19/error.c?rev=7294
if RUBY_VERSION < '1.9.0'
assert_raise(TypeError){ t.test2 << "a" }
else
assert_raise(RuntimeError){ t.test2 << "a" }
end
assert_equal "bb", t.test2_dup
assert_equal "bbb", t.test2_dup << "b"
assert_equal "bb", t.test2_dup
end
end
|