nitro 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -0
- data/ChangeLog +83 -0
- data/LICENCE +8 -8
- data/README +5 -1
- data/RELEASES +9 -0
- data/Rakefile +43 -23
- data/bin/cluster.rb +15 -12
- data/examples/ndb/README +5 -0
- data/examples/ndb/run.rb +271 -0
- data/examples/simple/README +27 -0
- data/examples/simple/app.rb +2 -2
- data/examples/simple/conf/config.rb +3 -8
- data/examples/simple/conf/debug-config.rb +6 -7
- data/examples/simple/conf/live-config.rb +2 -4
- data/examples/simple/conf/requires.rb +2 -10
- data/examples/simple/ctl +1 -1
- data/examples/simple/env.rb +2 -2
- data/examples/simple/root/article-form.ss +1 -1
- data/examples/simple/root/comments-form.ss +1 -1
- data/examples/tiny/README +15 -0
- data/examples/tiny/app.rb +2 -2
- data/examples/tiny/conf/config.rb +8 -13
- data/examples/tiny/conf/requires.rb +2 -8
- data/examples/tiny/ctl +2 -17
- data/examples/tiny/root/index.sx +1 -1
- data/lib/n/app/cluster.rb +15 -12
- data/lib/n/app/cookie.rb +10 -9
- data/lib/n/app/filters/autologin.rb +5 -4
- data/lib/n/app/fragment.rb +13 -10
- data/lib/n/app/handlers.rb +29 -22
- data/lib/n/app/handlers/code-handler.rb +2 -4
- data/lib/n/app/handlers/page-handler.rb +3 -5
- data/lib/n/app/request-part.rb +2 -7
- data/lib/n/app/request.rb +27 -22
- data/lib/n/app/script.rb +4 -15
- data/lib/n/app/server.rb +11 -7
- data/lib/n/app/session.rb +7 -11
- data/lib/n/app/user.rb +10 -11
- data/lib/n/app/webrick-servlet.rb +23 -10
- data/lib/n/app/webrick.rb +13 -10
- data/lib/n/application.rb +13 -6
- data/lib/n/config.rb +18 -7
- data/lib/n/db.rb +56 -40
- data/lib/n/db/connection.rb +18 -22
- data/lib/n/db/managed.rb +6 -8
- data/lib/n/db/mixins.rb +4 -7
- data/lib/n/db/mysql.rb +6 -3
- data/lib/n/db/psql.rb +15 -10
- data/lib/n/db/tools.rb +5 -9
- data/lib/n/db/utils.rb +11 -8
- data/lib/n/events.rb +14 -10
- data/lib/n/logger.rb +8 -2
- data/lib/n/macros.rb +5 -2
- data/lib/n/parts.rb +13 -10
- data/lib/n/properties.rb +17 -12
- data/lib/n/server.rb +3 -2
- data/lib/n/server/filter.rb +2 -4
- data/lib/n/shaders.rb +11 -13
- data/lib/n/sitemap.rb +23 -20
- data/lib/n/std.rb +15 -4
- data/lib/n/sync/clc.rb +4 -2
- data/lib/n/sync/handler.rb +20 -12
- data/lib/n/sync/server.rb +24 -18
- data/lib/n/ui/date-select.rb +2 -4
- data/lib/n/ui/pager.rb +10 -8
- data/lib/n/ui/popup.rb +5 -4
- data/lib/n/ui/select.rb +3 -4
- data/lib/n/ui/tabs.rb +3 -4
- data/lib/n/utils/array.rb +6 -14
- data/lib/n/utils/cache.rb +3 -7
- data/lib/n/utils/gfx.rb +5 -6
- data/lib/n/utils/hash.rb +7 -12
- data/lib/n/utils/html.rb +8 -4
- data/lib/n/utils/http.rb +10 -6
- data/lib/n/utils/mail.rb +6 -6
- data/lib/n/utils/number.rb +3 -4
- data/lib/n/utils/pool.rb +5 -8
- data/lib/n/utils/string.rb +12 -10
- data/lib/n/utils/template.rb +3 -5
- data/lib/n/utils/time.rb +7 -5
- data/lib/n/utils/uri.rb +5 -4
- data/lib/p/README +1 -0
- data/lib/xsl/xforms.xsl +2 -0
- data/test/n/app/tc_cookie.rb +34 -0
- data/test/n/app/tc_request.rb +70 -0
- data/test/n/app/tc_requestpart.rb +28 -0
- data/test/n/app/tc_session.rb +34 -0
- data/test/n/tc_db.rb +223 -0
- data/test/n/tc_db_mysql.rb +241 -0
- data/test/n/tc_events.rb +44 -0
- data/test/n/tc_properties.rb +68 -0
- data/test/n/tc_sitemap.rb +37 -0
- data/test/n/ui/tc_pager.rb +52 -0
- data/test/n/utils/tc_cache.rb +47 -0
- data/test/n/utils/tc_hash.rb +39 -0
- data/test/n/utils/tc_html.rb +79 -0
- data/test/n/utils/tc_http.rb +18 -0
- data/test/n/utils/tc_number.rb +21 -0
- data/test/n/utils/tc_strings.rb +149 -0
- data/test/n/utils/tc_uri.rb +100 -0
- metadata +49 -22
- data/doc/css.txt +0 -20
- data/doc/ideas.txt +0 -120
- data/doc/pg.txt +0 -47
- data/doc/svn.txt +0 -82
- data/doc/todo.txt +0 -30
- data/examples/simple/conf/overrides.rb +0 -9
- data/examples/simple/logs/access_log +0 -2
- data/examples/simple/logs/apache.log +0 -3
- data/examples/simple/logs/app.log +0 -1
- data/examples/simple/logs/events.log +0 -1
- data/examples/tiny/conf/apache.conf +0 -100
- data/examples/tiny/logs/access_log +0 -9
- data/examples/tiny/logs/apache.log +0 -9
- data/lib/n/db/make-release.sh +0 -26
- data/lib/n/tools/README +0 -11
- data/lib/xsl/ce.xsl +0 -30
- data/lib/xsl/localization.xsl +0 -23
- data/test/run.rb +0 -95
@@ -0,0 +1,241 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "n/logger"; $log = Logger.new(STDERR) unless $log
|
4
|
+
|
5
|
+
require "n/db"
|
6
|
+
|
7
|
+
module Test # :nodoc: all
|
8
|
+
|
9
|
+
class Article
|
10
|
+
manage {
|
11
|
+
include N::Entity
|
12
|
+
|
13
|
+
prop_accessor String, :title, :body
|
14
|
+
}
|
15
|
+
|
16
|
+
def self.__descendants_classes
|
17
|
+
[Message]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Message
|
22
|
+
manage {
|
23
|
+
include N::Entity
|
24
|
+
include N::Named
|
25
|
+
include N::Child
|
26
|
+
include N::ParentClass
|
27
|
+
|
28
|
+
include N::Sequenced
|
29
|
+
|
30
|
+
prop_accessor Fixnum, :owner_oid
|
31
|
+
prop_accessor Fixnum, "smallint", :val1, :val2, :val3
|
32
|
+
prop_accessor String, :title, :body
|
33
|
+
prop_accessor String, "text NOT NULL", :test
|
34
|
+
prop_accessor Fixnum, :count
|
35
|
+
prop_accessor Time, :create_time
|
36
|
+
sql_index :owner_oid, :pid
|
37
|
+
}
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
@create_time = Time.now
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
class SubMessage < Message
|
46
|
+
manage {
|
47
|
+
# duplicate definition
|
48
|
+
prop_accessor Float, :count
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
class TC_N_Db < Test::Unit::TestCase
|
53
|
+
|
54
|
+
def setup
|
55
|
+
$db = N::Db.new(
|
56
|
+
:backend => "mysql",
|
57
|
+
:address => "localhost",
|
58
|
+
:database => "test",
|
59
|
+
:user => "root",
|
60
|
+
:password => "navelrulez",
|
61
|
+
:connection_count => 2
|
62
|
+
)
|
63
|
+
|
64
|
+
@art = Article.new()
|
65
|
+
@art.title = "The parent"
|
66
|
+
@art.body = "The body"
|
67
|
+
|
68
|
+
@msg1 = Message.new()
|
69
|
+
@msg1.name = "name1"
|
70
|
+
@msg1.body = "body1"
|
71
|
+
@msg1.title = "title1"
|
72
|
+
@msg1.count = "22"
|
73
|
+
@msg1.owner_oid = 1
|
74
|
+
|
75
|
+
@msg2 = Message.new()
|
76
|
+
@msg2.name = "name2"
|
77
|
+
@msg2.body = "body2"
|
78
|
+
@msg2.title = "title2"
|
79
|
+
@msg2.count = "22"
|
80
|
+
@msg1.owner_oid = 2
|
81
|
+
end
|
82
|
+
|
83
|
+
def teardown
|
84
|
+
@art = @msg1 = @msg2 = nil
|
85
|
+
$db.shutdown()
|
86
|
+
end
|
87
|
+
|
88
|
+
# gmosx: move to tc-properties
|
89
|
+
#
|
90
|
+
def test_props
|
91
|
+
|
92
|
+
# check multiple prop
|
93
|
+
|
94
|
+
assert_equal("SMALLINT", Message.__props.find { |p| :val2 == p.symbol }.sql_type)
|
95
|
+
|
96
|
+
# bug: props for subclasses.
|
97
|
+
|
98
|
+
assert(SubMessage.__props)
|
99
|
+
assert_equal(Message.__props.size(), SubMessage.__props.size())
|
100
|
+
|
101
|
+
# bug: duplicate definition
|
102
|
+
|
103
|
+
assert_equal(Float, SubMessage.__props.find { |p| :count == p.symbol }.klass)
|
104
|
+
|
105
|
+
# dont force conversion
|
106
|
+
|
107
|
+
@msg1.count = 2.4
|
108
|
+
assert_equal(Float, @msg1.count.class)
|
109
|
+
|
110
|
+
# force conversion
|
111
|
+
|
112
|
+
@msg1.__force_count__(2.4)
|
113
|
+
assert_equal(Fixnum, @msg1.count.class)
|
114
|
+
end
|
115
|
+
|
116
|
+
# gmosx: hmm, implemented in one method to enforce order.
|
117
|
+
#
|
118
|
+
def test_all
|
119
|
+
$db.open { |db|
|
120
|
+
|
121
|
+
# check exception, cleanup test db.
|
122
|
+
|
123
|
+
# db.drop_schema()
|
124
|
+
db.drop_table(Article)
|
125
|
+
db.drop_table(Message)
|
126
|
+
|
127
|
+
# db.create_schema()
|
128
|
+
|
129
|
+
# bug: get methods without entity table
|
130
|
+
|
131
|
+
db.get(1, Message)
|
132
|
+
|
133
|
+
# check put
|
134
|
+
|
135
|
+
db << @art
|
136
|
+
# one oid is missed when creating the table for the first time!
|
137
|
+
assert_equal(1, @art.oid)
|
138
|
+
|
139
|
+
art2 = Article.new()
|
140
|
+
art2.title = "Another test"
|
141
|
+
db << art2
|
142
|
+
|
143
|
+
@msg1.set_parent(@art)
|
144
|
+
@msg2.set_parent(@art)
|
145
|
+
|
146
|
+
db << @msg1
|
147
|
+
db << @msg2
|
148
|
+
|
149
|
+
$log.error "#{@msg2.oid}"
|
150
|
+
assert_equal(2, @msg2.oid)
|
151
|
+
|
152
|
+
# check children.
|
153
|
+
|
154
|
+
msgs = db.children(@art, Message, "ORDER BY count")
|
155
|
+
assert_equal(2, msgs.size())
|
156
|
+
assert_equal(Message, msgs[0].class)
|
157
|
+
|
158
|
+
assert_equal(2, db.count_children(@art, Message))
|
159
|
+
|
160
|
+
# bug: pid was string
|
161
|
+
|
162
|
+
assert_equal(@art.oid, msgs[0].pid)
|
163
|
+
|
164
|
+
# check updates
|
165
|
+
|
166
|
+
@art.title = "CHANGED TITLE"
|
167
|
+
db.update_properties("title='#{@art.title}'", @art)
|
168
|
+
|
169
|
+
art2 = db.get(@art.oid, Article)
|
170
|
+
|
171
|
+
assert_equal(art2.title, @art.title)
|
172
|
+
|
173
|
+
@art.body = "CHANGED BODY"
|
174
|
+
@art.title = "CHANGED AGAIN"
|
175
|
+
db << @art
|
176
|
+
|
177
|
+
art2 = db.get(@art.oid, Article)
|
178
|
+
assert_equal(art2.body, @art.body)
|
179
|
+
assert_equal(art2.title, "CHANGED AGAIN")
|
180
|
+
|
181
|
+
# check timestamp
|
182
|
+
|
183
|
+
now = Time.now()
|
184
|
+
@msg1.create_time = now
|
185
|
+
db << @msg1
|
186
|
+
|
187
|
+
msg = db.get(@msg1.oid, Message)
|
188
|
+
|
189
|
+
# bug:
|
190
|
+
# assert_equal(msg.create_time, @msg1.create_time)
|
191
|
+
assert_equal(msg.create_time.to_i(), @msg1.create_time.to_i())
|
192
|
+
|
193
|
+
# gmosx: not implemented in postgres driver.
|
194
|
+
# classes = db.managed_classes()
|
195
|
+
# assert_equal(2, classes.size())
|
196
|
+
|
197
|
+
# get_by_name
|
198
|
+
|
199
|
+
msg = db.get_by_name("name2", Message)
|
200
|
+
assert_equal("body2", msg.body)
|
201
|
+
|
202
|
+
# pclass
|
203
|
+
|
204
|
+
assert_equal(@art.class.to_s(), msg.pclass)
|
205
|
+
|
206
|
+
}
|
207
|
+
|
208
|
+
# deserialize = false
|
209
|
+
|
210
|
+
$db.open(deserialize = false) { |db|
|
211
|
+
|
212
|
+
assert_equal(false, db.deserialize)
|
213
|
+
|
214
|
+
msg = db.get_by_name("name2", Message)
|
215
|
+
assert_equal(Array, msg.class)
|
216
|
+
|
217
|
+
art = db.get(2, Article)
|
218
|
+
assert_equal(Array, art.class)
|
219
|
+
|
220
|
+
}
|
221
|
+
|
222
|
+
# cascade delete
|
223
|
+
|
224
|
+
msgs = $db.children(0, Message)
|
225
|
+
assert_equal(2, msgs.size())
|
226
|
+
|
227
|
+
$db.delete(@art)
|
228
|
+
|
229
|
+
msgs = $db.children(0, Message)
|
230
|
+
assert_equal(nil, msgs)
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_sql_table_to_class
|
235
|
+
# assert_equal(Article,
|
236
|
+
# N::DbUtils.sql_table_to_class(N::DbUtils.sql_table(Article)))
|
237
|
+
end
|
238
|
+
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
data/test/n/tc_events.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "n/events"
|
5
|
+
|
6
|
+
class TC_Events < Test::Unit::TestCase
|
7
|
+
# :nodoc: all
|
8
|
+
include N
|
9
|
+
|
10
|
+
def setup
|
11
|
+
$flag = 0
|
12
|
+
$flag2 = 1
|
13
|
+
@events = N::EventManager.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
@events = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_events
|
21
|
+
@events.add_handler("my.event", "test1", proc { |val|
|
22
|
+
$flag = val
|
23
|
+
})
|
24
|
+
@events.add_handler("my.event", "test2", proc { |val|
|
25
|
+
$flag2 += val
|
26
|
+
})
|
27
|
+
|
28
|
+
@events.fire("my.event", 5)
|
29
|
+
|
30
|
+
assert_equal(5, $flag)
|
31
|
+
assert_equal(6, $flag2)
|
32
|
+
|
33
|
+
@events.fire("my.event", 5)
|
34
|
+
|
35
|
+
assert_equal(11, $flag2)
|
36
|
+
|
37
|
+
# test remove handler
|
38
|
+
|
39
|
+
@events.remove_handler("my.event", "test2")
|
40
|
+
@events.fire("my.event", 5)
|
41
|
+
|
42
|
+
assert_equal(11, $flag2)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "n/logger"; $log = Logger.new(STDERR) unless $log
|
4
|
+
|
5
|
+
require "n/properties"
|
6
|
+
|
7
|
+
module Test # :nodoc: all
|
8
|
+
|
9
|
+
class Message
|
10
|
+
prop_accessor Fixnum, :owner_oid
|
11
|
+
prop_accessor Fixnum, "smallint", :val1, :val2, :val3
|
12
|
+
prop_accessor String, :title, :body
|
13
|
+
prop_accessor String, "char(10) NOT NULL", :test
|
14
|
+
prop_accessor Fixnum, :count
|
15
|
+
prop_accessor Time, :create_time
|
16
|
+
|
17
|
+
# a marshaled property
|
18
|
+
prop_accessor Array, :options
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@create_time = Time.now
|
22
|
+
@options = []
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class SubMessage < Message
|
28
|
+
inherit_meta(superclass)
|
29
|
+
# duplicate definition
|
30
|
+
prop_accessor Float, :count
|
31
|
+
end
|
32
|
+
|
33
|
+
class TC_N_Properties < Test::Unit::TestCase
|
34
|
+
|
35
|
+
def setup
|
36
|
+
@msg1 = Message.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def teardown
|
40
|
+
@msg1 = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_props
|
44
|
+
|
45
|
+
|
46
|
+
# bug: props for subclasses.
|
47
|
+
|
48
|
+
assert(SubMessage.__props)
|
49
|
+
assert_equal(Message.__props.size(), SubMessage.__props.size())
|
50
|
+
|
51
|
+
# bug: duplicate definition
|
52
|
+
|
53
|
+
assert_equal(Float, SubMessage.__props.find { |p| :count == p.symbol }.klass)
|
54
|
+
|
55
|
+
# dont force conversion
|
56
|
+
|
57
|
+
@msg1.count = 2.4
|
58
|
+
assert_equal(Float, @msg1.count.class)
|
59
|
+
|
60
|
+
# force conversion
|
61
|
+
|
62
|
+
@msg1.__force_count(2.4)
|
63
|
+
assert_equal(Fixnum, @msg1.count.class)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end # module
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "n/logger"; $log = Logger.new(STDERR) unless $log
|
6
|
+
|
7
|
+
require "n/sitemap"
|
8
|
+
|
9
|
+
class TC_N_SiteMap < Test::Unit::TestCase
|
10
|
+
include N
|
11
|
+
|
12
|
+
def setup
|
13
|
+
$n0 = SitePage.new "/index.sx", "Joy", nil, realm = "main-realm"
|
14
|
+
$n1 = SitePage.new "/id/index.sx", "Id", $n0
|
15
|
+
$n2 = SitePage.new "/id/page.sx", "My page", $n1
|
16
|
+
$n1 = SitePage.new "/id/login.sx", "Login", $n0
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
$sitemap = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_all
|
24
|
+
assert_equal(3, $sitemap.path("/id/page.sx").size())
|
25
|
+
|
26
|
+
# bug: wrong order
|
27
|
+
assert_equal("Joy > Id > My page", $sitemap.str_path("/id/page.sx"))
|
28
|
+
|
29
|
+
# bug: wrong hrefs
|
30
|
+
assert_equal('<a href="/index.sx">Joy</a> > <a href="/id/index.sx">Id</a> > My page', $sitemap.linked_path("/id/page.sx"))
|
31
|
+
|
32
|
+
# bug: realm should be inherited from parent
|
33
|
+
setup
|
34
|
+
assert_equal($n2.realm, $n1.realm)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "n/logger"; $log = Logger.new(STDERR) unless $log
|
6
|
+
|
7
|
+
require "n/db"
|
8
|
+
require "n/ui/pager"
|
9
|
+
|
10
|
+
class RequestMock < Hash
|
11
|
+
def get(k, default)
|
12
|
+
return self[k] || default
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TC_N_UI_Pager < Test::Unit::TestCase
|
17
|
+
|
18
|
+
def setup
|
19
|
+
=begin
|
20
|
+
$db = N::Db.new(
|
21
|
+
:addres => "localhost",
|
22
|
+
:database => "testdb",
|
23
|
+
:user => "root",
|
24
|
+
# :password => "navelrulez",
|
25
|
+
:connection_count => 2
|
26
|
+
)
|
27
|
+
=end
|
28
|
+
end
|
29
|
+
|
30
|
+
def teardown
|
31
|
+
# $db.shutdown()
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_all
|
35
|
+
items = [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
36
|
+
count = items.size()
|
37
|
+
|
38
|
+
request = RequestMock.new()
|
39
|
+
pager = N::UI::Pager.new("tst", request, 2, items)
|
40
|
+
|
41
|
+
assert_equal(pager.total_count, count)
|
42
|
+
|
43
|
+
# bug: bad rounding.
|
44
|
+
|
45
|
+
assert_equal(5, pager.page_count)
|
46
|
+
|
47
|
+
# bug: FIXME
|
48
|
+
# assert_equal(2, items.size())
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "n/utils/cache"
|
5
|
+
|
6
|
+
class TC_N_Utils_Cache < Test::Unit::TestCase
|
7
|
+
# :nodoc: all
|
8
|
+
|
9
|
+
class Dummy
|
10
|
+
include N::LRUCache::Item
|
11
|
+
end
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@cache = N::LRUCache.new(maxitems = 3)
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
@cache = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_safe_cache
|
22
|
+
d1 = Dummy.new
|
23
|
+
d2 = Dummy.new
|
24
|
+
d3 = Dummy.new
|
25
|
+
d4 = Dummy.new
|
26
|
+
|
27
|
+
@cache[1] = d1
|
28
|
+
@cache[2] = d2
|
29
|
+
@cache[3] = d3
|
30
|
+
|
31
|
+
assert_equal(d1, @cache.last)
|
32
|
+
assert_equal(d3, @cache.first)
|
33
|
+
|
34
|
+
val = @cache[2]
|
35
|
+
assert_equal(d2, @cache.first)
|
36
|
+
|
37
|
+
@cache[4] = d4
|
38
|
+
assert_equal(3, @cache.size)
|
39
|
+
assert_equal(d4, @cache.first)
|
40
|
+
|
41
|
+
# insert the same key
|
42
|
+
@cache[4] = d4
|
43
|
+
assert_equal(3, @cache.size)
|
44
|
+
assert_equal(d4, @cache.first)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|