gdbm 1.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +26 -8
- data/lib/gdbm.rb +9 -3
- metadata +24 -45
- data/test/test_gdbm-1.8.7.rb +0 -697
- data/test/test_gdbm-1.9.1.rb +0 -732
data/test/test_gdbm-1.9.1.rb
DELETED
@@ -1,732 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'tmpdir'
|
3
|
-
|
4
|
-
begin
|
5
|
-
# require 'gdbm'
|
6
|
-
rescue LoadError
|
7
|
-
end
|
8
|
-
|
9
|
-
#This is needed because JRuby does not have it implemented yet,
|
10
|
-
#but it's in MRI 1.9 and in the tests below (remove_entry_secure).
|
11
|
-
#
|
12
|
-
#This is NOT NECESSARILY 1.9's implementation of it, though.
|
13
|
-
class File::Stat
|
14
|
-
unless self.instance_methods.include? :world_writable?
|
15
|
-
def world_writable?
|
16
|
-
(self.mode & 0002) != 0
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
if defined? GDBM
|
22
|
-
|
23
|
-
$stderr.puts "WARNING: Loaded non-FFI gdbm library (probably from the standard lib)." unless defined? GDBM_FFI
|
24
|
-
|
25
|
-
require 'tmpdir'
|
26
|
-
require 'fileutils'
|
27
|
-
|
28
|
-
class TestGDBM < Test::Unit::TestCase
|
29
|
-
def TestGDBM.uname_s
|
30
|
-
require 'rbconfig'
|
31
|
-
case RbConfig::CONFIG['target_os']
|
32
|
-
when 'cygwin'
|
33
|
-
require 'Win32API'
|
34
|
-
uname = Win32API.new('cygwin1', 'uname', 'P', 'I')
|
35
|
-
utsname = ' ' * 100
|
36
|
-
raise 'cannot get system name' if uname.call(utsname) == -1
|
37
|
-
|
38
|
-
utsname.unpack('A20' * 5)[0]
|
39
|
-
else
|
40
|
-
RbConfig::CONFIG['target_os']
|
41
|
-
end
|
42
|
-
end
|
43
|
-
SYSTEM = uname_s
|
44
|
-
|
45
|
-
def setup
|
46
|
-
@tmpdir = Dir.mktmpdir("tmptest_gdbm")
|
47
|
-
@prefix = "tmptest_gdbm_#{$$}"
|
48
|
-
@path = "#{@tmpdir}/#{@prefix}_"
|
49
|
-
assert_instance_of(GDBM, @gdbm = GDBM.new(@path))
|
50
|
-
|
51
|
-
# prepare to make readonly GDBM file
|
52
|
-
GDBM.open("#{@tmpdir}/#{@prefix}_rdonly", 0400) {|gdbm|
|
53
|
-
gdbm['foo'] = 'FOO'
|
54
|
-
}
|
55
|
-
assert_instance_of(GDBM, @gdbm_rdonly = GDBM.new("#{@tmpdir}/#{@prefix}_rdonly", nil))
|
56
|
-
end
|
57
|
-
def teardown
|
58
|
-
assert_nil(@gdbm.close)
|
59
|
-
assert_nil(@gdbm_rdonly.close)
|
60
|
-
ObjectSpace.each_object(GDBM) do |obj|
|
61
|
-
obj.close unless obj.closed?
|
62
|
-
end
|
63
|
-
FileUtils.remove_entry_secure @tmpdir
|
64
|
-
end
|
65
|
-
|
66
|
-
def check_size(expect, gdbm=@gdbm)
|
67
|
-
assert_equal(expect, gdbm.size)
|
68
|
-
n = 0
|
69
|
-
gdbm.each { n+=1 }
|
70
|
-
assert_equal(expect, n)
|
71
|
-
if expect == 0
|
72
|
-
assert_equal(true, gdbm.empty?)
|
73
|
-
else
|
74
|
-
assert_equal(false, gdbm.empty?)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def have_fork?
|
79
|
-
begin
|
80
|
-
fork{}
|
81
|
-
true
|
82
|
-
rescue NotImplementedError
|
83
|
-
false
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_s_new_has_no_block
|
88
|
-
# GDBM.new ignore the block
|
89
|
-
foo = true
|
90
|
-
assert_instance_of(GDBM, gdbm = GDBM.new("#{@tmpdir}/#{@prefix}") { foo = false })
|
91
|
-
assert_equal(foo, true)
|
92
|
-
assert_nil(gdbm.close)
|
93
|
-
end
|
94
|
-
def test_s_open_create_new
|
95
|
-
return if /^CYGWIN_9/ =~ SYSTEM
|
96
|
-
|
97
|
-
save_mask = File.umask(0)
|
98
|
-
begin
|
99
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}"))
|
100
|
-
gdbm.close
|
101
|
-
assert_equal(File.stat("#{@tmpdir}/#{@prefix}").mode & 0777, 0666)
|
102
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}2", 0644))
|
103
|
-
gdbm.close
|
104
|
-
assert_equal(File.stat("#{@tmpdir}/#{@prefix}2").mode & 0777, 0644)
|
105
|
-
ensure
|
106
|
-
File.umask save_mask
|
107
|
-
end
|
108
|
-
end
|
109
|
-
def test_s_open_no_create
|
110
|
-
assert_nil(gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", nil),
|
111
|
-
"this test is failed on libgdbm 1.8.0")
|
112
|
-
ensure
|
113
|
-
gdbm.close if gdbm
|
114
|
-
end
|
115
|
-
def test_s_open_3rd_arg
|
116
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
|
117
|
-
GDBM::FAST))
|
118
|
-
gdbm.close
|
119
|
-
|
120
|
-
# gdbm 1.8.0 specific
|
121
|
-
if defined? GDBM::SYNC
|
122
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
|
123
|
-
GDBM::SYNC))
|
124
|
-
gdbm.close
|
125
|
-
end
|
126
|
-
# gdbm 1.8.0 specific
|
127
|
-
if defined? GDBM::NOLOCK
|
128
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
|
129
|
-
GDBM::NOLOCK))
|
130
|
-
gdbm.close
|
131
|
-
end
|
132
|
-
end
|
133
|
-
def test_s_open_with_block
|
134
|
-
assert_equal(GDBM.open("#{@tmpdir}/#{@prefix}") { :foo }, :foo)
|
135
|
-
end
|
136
|
-
def test_s_open_lock
|
137
|
-
return unless have_fork? # snip this test
|
138
|
-
pid = fork() {
|
139
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
|
140
|
-
sleep 2
|
141
|
-
}
|
142
|
-
begin
|
143
|
-
sleep 1
|
144
|
-
assert_raise(Errno::EWOULDBLOCK) {
|
145
|
-
begin
|
146
|
-
assert_instance_of(GDBM, gdbm2 = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
|
147
|
-
rescue Errno::EAGAIN, Errno::EACCES
|
148
|
-
raise Errno::EWOULDBLOCK
|
149
|
-
end
|
150
|
-
}
|
151
|
-
ensure
|
152
|
-
Process.wait pid
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
=begin
|
157
|
-
# Is it guaranteed on many OS?
|
158
|
-
def test_s_open_lock_one_process
|
159
|
-
# locking on one process
|
160
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
|
161
|
-
assert_raise(Errno::EWOULDBLOCK) {
|
162
|
-
begin
|
163
|
-
GDBM.open("#{@tmpdir}/#{@prefix}", 0644)
|
164
|
-
rescue Errno::EAGAIN
|
165
|
-
raise Errno::EWOULDBLOCK
|
166
|
-
end
|
167
|
-
}
|
168
|
-
end
|
169
|
-
=end
|
170
|
-
|
171
|
-
def test_s_open_nolock
|
172
|
-
# gdbm 1.8.0 specific
|
173
|
-
if not defined? GDBM::NOLOCK
|
174
|
-
return
|
175
|
-
end
|
176
|
-
return unless have_fork? # snip this test
|
177
|
-
|
178
|
-
pid = fork() {
|
179
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
|
180
|
-
GDBM::NOLOCK))
|
181
|
-
sleep 2
|
182
|
-
}
|
183
|
-
sleep 1
|
184
|
-
begin
|
185
|
-
gdbm2 = nil
|
186
|
-
assert_nothing_raised(Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EACCES) {
|
187
|
-
assert_instance_of(GDBM, gdbm2 = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
|
188
|
-
}
|
189
|
-
ensure
|
190
|
-
Process.wait pid
|
191
|
-
gdbm2.close if gdbm2
|
192
|
-
end
|
193
|
-
|
194
|
-
p Dir.glob("#{@tmpdir}/#{@prefix}*") if $DEBUG
|
195
|
-
|
196
|
-
pid = fork() {
|
197
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
|
198
|
-
sleep 2
|
199
|
-
}
|
200
|
-
begin
|
201
|
-
sleep 1
|
202
|
-
gdbm2 = nil
|
203
|
-
assert_nothing_raised(Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EACCES) {
|
204
|
-
# this test is failed on Cygwin98 (???)
|
205
|
-
assert_instance_of(GDBM, gdbm2 = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
|
206
|
-
GDBM::NOLOCK))
|
207
|
-
}
|
208
|
-
ensure
|
209
|
-
Process.wait pid
|
210
|
-
gdbm2.close if gdbm2
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def test_s_open_error
|
215
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0))
|
216
|
-
assert_raise(Errno::EACCES) {
|
217
|
-
GDBM.open("#{@tmpdir}/#{@prefix}", 0)
|
218
|
-
}
|
219
|
-
gdbm.close
|
220
|
-
end
|
221
|
-
|
222
|
-
def test_close
|
223
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}"))
|
224
|
-
assert_nil(gdbm.close)
|
225
|
-
|
226
|
-
# closed GDBM file
|
227
|
-
assert_raise(RuntimeError) { gdbm.close }
|
228
|
-
end
|
229
|
-
|
230
|
-
def test_aref
|
231
|
-
assert_equal('bar', @gdbm['foo'] = 'bar')
|
232
|
-
assert_equal('bar', @gdbm['foo'])
|
233
|
-
|
234
|
-
assert_nil(@gdbm['bar'])
|
235
|
-
end
|
236
|
-
|
237
|
-
def test_fetch
|
238
|
-
assert_equal('bar', @gdbm['foo']='bar')
|
239
|
-
assert_equal('bar', @gdbm.fetch('foo'))
|
240
|
-
|
241
|
-
# key not found
|
242
|
-
assert_raise(IndexError) {
|
243
|
-
@gdbm.fetch('bar')
|
244
|
-
}
|
245
|
-
|
246
|
-
# test for `ifnone' arg
|
247
|
-
assert_equal('baz', @gdbm.fetch('bar', 'baz'))
|
248
|
-
|
249
|
-
# test for `ifnone' block
|
250
|
-
assert_equal('foobar', @gdbm.fetch('bar') {|key| 'foo' + key })
|
251
|
-
end
|
252
|
-
|
253
|
-
def test_aset
|
254
|
-
num = 0
|
255
|
-
2.times {|i|
|
256
|
-
assert_equal('foo', @gdbm['foo'] = 'foo')
|
257
|
-
assert_equal('foo', @gdbm['foo'])
|
258
|
-
assert_equal('bar', @gdbm['foo'] = 'bar')
|
259
|
-
assert_equal('bar', @gdbm['foo'])
|
260
|
-
|
261
|
-
num += 1 if i == 0
|
262
|
-
assert_equal(num, @gdbm.size)
|
263
|
-
|
264
|
-
# assign nil
|
265
|
-
assert_equal('', @gdbm['bar'] = '')
|
266
|
-
assert_equal('', @gdbm['bar'])
|
267
|
-
|
268
|
-
num += 1 if i == 0
|
269
|
-
assert_equal(num, @gdbm.size)
|
270
|
-
|
271
|
-
# empty string
|
272
|
-
assert_equal('', @gdbm[''] = '')
|
273
|
-
assert_equal('', @gdbm[''])
|
274
|
-
|
275
|
-
num += 1 if i == 0
|
276
|
-
assert_equal(num, @gdbm.size)
|
277
|
-
|
278
|
-
# Fixnum
|
279
|
-
assert_equal('200', @gdbm['100'] = '200')
|
280
|
-
assert_equal('200', @gdbm['100'])
|
281
|
-
|
282
|
-
num += 1 if i == 0
|
283
|
-
assert_equal(num, @gdbm.size)
|
284
|
-
|
285
|
-
# Big key and value
|
286
|
-
assert_equal('y' * 100, @gdbm['x' * 100] = 'y' * 100)
|
287
|
-
assert_equal('y' * 100, @gdbm['x' * 100])
|
288
|
-
|
289
|
-
num += 1 if i == 0
|
290
|
-
assert_equal(num, @gdbm.size)
|
291
|
-
}
|
292
|
-
end
|
293
|
-
|
294
|
-
def test_key
|
295
|
-
assert_equal('bar', @gdbm['foo'] = 'bar')
|
296
|
-
assert_equal('foo', @gdbm.key('bar'))
|
297
|
-
assert_nil(@gdbm['bar'])
|
298
|
-
end
|
299
|
-
|
300
|
-
def test_values_at
|
301
|
-
keys = %w(foo bar baz)
|
302
|
-
values = %w(FOO BAR BAZ)
|
303
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
304
|
-
assert_equal(values.reverse, @gdbm.values_at(*keys.reverse))
|
305
|
-
end
|
306
|
-
|
307
|
-
def test_select_with_block
|
308
|
-
keys = %w(foo bar baz)
|
309
|
-
values = %w(FOO BAR BAZ)
|
310
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
311
|
-
ret = @gdbm.select {|k,v|
|
312
|
-
assert_equal(k.upcase, v)
|
313
|
-
k != "bar"
|
314
|
-
}
|
315
|
-
assert_equal([['baz', 'BAZ'], ['foo', 'FOO']],
|
316
|
-
ret.sort)
|
317
|
-
end
|
318
|
-
|
319
|
-
def test_length
|
320
|
-
num = 10
|
321
|
-
assert_equal(0, @gdbm.size)
|
322
|
-
num.times {|i|
|
323
|
-
i = i.to_s
|
324
|
-
@gdbm[i] = i
|
325
|
-
}
|
326
|
-
assert_equal(num, @gdbm.size)
|
327
|
-
|
328
|
-
@gdbm.shift
|
329
|
-
|
330
|
-
assert_equal(num - 1, @gdbm.size)
|
331
|
-
end
|
332
|
-
|
333
|
-
def test_empty?
|
334
|
-
assert_equal(true, @gdbm.empty?)
|
335
|
-
@gdbm['foo'] = 'FOO'
|
336
|
-
assert_equal(false, @gdbm.empty?)
|
337
|
-
end
|
338
|
-
|
339
|
-
def test_each_pair
|
340
|
-
n = 0
|
341
|
-
@gdbm.each_pair { n += 1 }
|
342
|
-
assert_equal(0, n)
|
343
|
-
|
344
|
-
keys = %w(foo bar baz)
|
345
|
-
values = %w(FOO BAR BAZ)
|
346
|
-
|
347
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
348
|
-
|
349
|
-
n = 0
|
350
|
-
ret = @gdbm.each_pair {|key, val|
|
351
|
-
assert_not_nil(i = keys.index(key))
|
352
|
-
assert_equal(val, values[i])
|
353
|
-
|
354
|
-
n += 1
|
355
|
-
}
|
356
|
-
assert_equal(keys.size, n)
|
357
|
-
assert_equal(@gdbm, ret)
|
358
|
-
end
|
359
|
-
|
360
|
-
def test_each_value
|
361
|
-
n = 0
|
362
|
-
@gdbm.each_value { n += 1 }
|
363
|
-
assert_equal(0, n)
|
364
|
-
|
365
|
-
keys = %w(foo bar baz)
|
366
|
-
values = %w(FOO BAR BAZ)
|
367
|
-
|
368
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
369
|
-
|
370
|
-
n = 0
|
371
|
-
ret = @gdbm.each_value {|val|
|
372
|
-
assert_not_nil(key = @gdbm.key(val))
|
373
|
-
assert_not_nil(i = keys.index(key))
|
374
|
-
assert_equal(val, values[i])
|
375
|
-
|
376
|
-
n += 1
|
377
|
-
}
|
378
|
-
assert_equal(keys.size, n)
|
379
|
-
assert_equal(@gdbm, ret)
|
380
|
-
end
|
381
|
-
|
382
|
-
def test_each_key
|
383
|
-
n = 0
|
384
|
-
@gdbm.each_key { n += 1 }
|
385
|
-
assert_equal(0, n)
|
386
|
-
|
387
|
-
keys = %w(foo bar baz)
|
388
|
-
values = %w(FOO BAR BAZ)
|
389
|
-
|
390
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
391
|
-
|
392
|
-
n = 0
|
393
|
-
ret = @gdbm.each_key {|key|
|
394
|
-
assert_not_nil(i = keys.index(key))
|
395
|
-
assert_equal(@gdbm[key], values[i])
|
396
|
-
|
397
|
-
n += 1
|
398
|
-
}
|
399
|
-
assert_equal(keys.size, n)
|
400
|
-
assert_equal(@gdbm, ret)
|
401
|
-
end
|
402
|
-
|
403
|
-
def test_keys
|
404
|
-
assert_equal([], @gdbm.keys)
|
405
|
-
|
406
|
-
keys = %w(foo bar baz)
|
407
|
-
values = %w(FOO BAR BAZ)
|
408
|
-
|
409
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
410
|
-
|
411
|
-
assert_equal(keys.sort, @gdbm.keys.sort)
|
412
|
-
assert_equal(values.sort, @gdbm.values.sort)
|
413
|
-
end
|
414
|
-
|
415
|
-
def test_values
|
416
|
-
test_keys
|
417
|
-
end
|
418
|
-
|
419
|
-
def test_shift
|
420
|
-
assert_nil(@gdbm.shift)
|
421
|
-
assert_equal(0, @gdbm.size)
|
422
|
-
|
423
|
-
keys = %w(foo bar baz)
|
424
|
-
values = %w(FOO BAR BAZ)
|
425
|
-
|
426
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
427
|
-
|
428
|
-
ret_keys = []
|
429
|
-
ret_values = []
|
430
|
-
while ret = @gdbm.shift
|
431
|
-
ret_keys.push ret[0]
|
432
|
-
ret_values.push ret[1]
|
433
|
-
|
434
|
-
assert_equal(keys.size - ret_keys.size, @gdbm.size)
|
435
|
-
end
|
436
|
-
|
437
|
-
assert_equal(keys.sort, ret_keys.sort)
|
438
|
-
assert_equal(values.sort, ret_values.sort)
|
439
|
-
end
|
440
|
-
|
441
|
-
def test_delete
|
442
|
-
keys = %w(foo bar baz)
|
443
|
-
values = %w(FOO BAR BAZ)
|
444
|
-
key = keys[1]
|
445
|
-
|
446
|
-
assert_nil(@gdbm.delete(key))
|
447
|
-
assert_equal(0, @gdbm.size)
|
448
|
-
|
449
|
-
@gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
|
450
|
-
|
451
|
-
assert_equal('BAR', @gdbm.delete(key))
|
452
|
-
assert_nil(@gdbm[key])
|
453
|
-
assert_equal(2, @gdbm.size)
|
454
|
-
|
455
|
-
assert_nil(@gdbm.delete(key))
|
456
|
-
|
457
|
-
if /^CYGWIN_9/ !~ SYSTEM
|
458
|
-
assert_raise(GDBMError) {
|
459
|
-
@gdbm_rdonly.delete("foo")
|
460
|
-
}
|
461
|
-
|
462
|
-
assert_nil(@gdbm_rdonly.delete("bar"))
|
463
|
-
end
|
464
|
-
end
|
465
|
-
def test_delete_with_block
|
466
|
-
key = 'no called block'
|
467
|
-
@gdbm[key] = 'foo'
|
468
|
-
assert_equal('foo', @gdbm.delete(key) {|k| k.replace 'called block'})
|
469
|
-
assert_equal('no called block', key)
|
470
|
-
assert_equal(0, @gdbm.size)
|
471
|
-
|
472
|
-
key = 'no called block'
|
473
|
-
assert_equal(:blockval,
|
474
|
-
@gdbm.delete(key) {|k| k.replace 'called block'; :blockval})
|
475
|
-
assert_equal('called block', key)
|
476
|
-
assert_equal(0, @gdbm.size)
|
477
|
-
end
|
478
|
-
|
479
|
-
def test_delete_if
|
480
|
-
v = "0"
|
481
|
-
100.times {@gdbm[v] = v; v = v.next}
|
482
|
-
|
483
|
-
ret = @gdbm.delete_if {|key, val| key.to_i < 50}
|
484
|
-
assert_equal(@gdbm, ret)
|
485
|
-
check_size(50, @gdbm)
|
486
|
-
|
487
|
-
ret = @gdbm.delete_if {|key, val| key.to_i >= 50}
|
488
|
-
assert_equal(@gdbm, ret)
|
489
|
-
check_size(0, @gdbm)
|
490
|
-
|
491
|
-
# break
|
492
|
-
v = "0"
|
493
|
-
100.times {@gdbm[v] = v; v = v.next}
|
494
|
-
check_size(100, @gdbm)
|
495
|
-
n = 0;
|
496
|
-
@gdbm.delete_if {|key, val|
|
497
|
-
break if n > 50
|
498
|
-
n+=1
|
499
|
-
true
|
500
|
-
}
|
501
|
-
assert_equal(51, n)
|
502
|
-
check_size(49, @gdbm)
|
503
|
-
|
504
|
-
@gdbm.clear
|
505
|
-
|
506
|
-
# raise
|
507
|
-
v = "0"
|
508
|
-
100.times {@gdbm[v] = v; v = v.next}
|
509
|
-
check_size(100, @gdbm)
|
510
|
-
n = 0;
|
511
|
-
begin
|
512
|
-
@gdbm.delete_if {|key, val|
|
513
|
-
raise "runtime error" if n > 50
|
514
|
-
n+=1
|
515
|
-
true
|
516
|
-
}
|
517
|
-
rescue
|
518
|
-
end
|
519
|
-
assert_equal(51, n)
|
520
|
-
check_size(49, @gdbm)
|
521
|
-
end
|
522
|
-
|
523
|
-
def test_reject
|
524
|
-
v = "0"
|
525
|
-
100.times {@gdbm[v] = v; v = v.next}
|
526
|
-
|
527
|
-
hash = @gdbm.reject {|key, val| key.to_i < 50}
|
528
|
-
assert_instance_of(Hash, hash)
|
529
|
-
assert_equal(100, @gdbm.size)
|
530
|
-
|
531
|
-
assert_equal(50, hash.size)
|
532
|
-
hash.each_pair {|key,val|
|
533
|
-
assert_equal(false, key.to_i < 50)
|
534
|
-
assert_equal(key, val)
|
535
|
-
}
|
536
|
-
|
537
|
-
hash = @gdbm.reject {|key, val| key.to_i < 100}
|
538
|
-
assert_instance_of(Hash, hash)
|
539
|
-
assert_equal(true, hash.empty?)
|
540
|
-
end
|
541
|
-
|
542
|
-
def test_clear
|
543
|
-
v = "1"
|
544
|
-
100.times {v = v.next; @gdbm[v] = v}
|
545
|
-
|
546
|
-
assert_equal(@gdbm, @gdbm.clear)
|
547
|
-
|
548
|
-
# validate GDBM#size
|
549
|
-
i = 0
|
550
|
-
@gdbm.each { i += 1 }
|
551
|
-
assert_equal(@gdbm.size, i)
|
552
|
-
assert_equal(0, i)
|
553
|
-
end
|
554
|
-
|
555
|
-
def test_invert
|
556
|
-
v = "0"
|
557
|
-
100.times {@gdbm[v] = v; v = v.next}
|
558
|
-
|
559
|
-
hash = @gdbm.invert
|
560
|
-
assert_instance_of(Hash, hash)
|
561
|
-
assert_equal(100, hash.size)
|
562
|
-
hash.each_pair {|key, val|
|
563
|
-
assert_equal(key.to_i, val.to_i)
|
564
|
-
}
|
565
|
-
end
|
566
|
-
|
567
|
-
def test_update
|
568
|
-
hash = {}
|
569
|
-
v = "0"
|
570
|
-
100.times {v = v.next; hash[v] = v}
|
571
|
-
|
572
|
-
@gdbm["101"] = "101"
|
573
|
-
@gdbm.update hash
|
574
|
-
assert_equal(101, @gdbm.size)
|
575
|
-
@gdbm.each_pair {|key, val|
|
576
|
-
assert_equal(key.to_i, val.to_i)
|
577
|
-
}
|
578
|
-
end
|
579
|
-
|
580
|
-
def test_replace
|
581
|
-
hash = {}
|
582
|
-
v = "0"
|
583
|
-
100.times {v = v.next; hash[v] = v}
|
584
|
-
|
585
|
-
@gdbm["101"] = "101"
|
586
|
-
@gdbm.replace hash
|
587
|
-
assert_equal(100, @gdbm.size)
|
588
|
-
@gdbm.each_pair {|key, val|
|
589
|
-
assert_equal(key.to_i, val.to_i)
|
590
|
-
}
|
591
|
-
end
|
592
|
-
|
593
|
-
def test_reorganize
|
594
|
-
size1 = File.size(@path)
|
595
|
-
i = "1"
|
596
|
-
1000.times {i = i.next; @gdbm[i] = i}
|
597
|
-
@gdbm.clear
|
598
|
-
@gdbm.sync
|
599
|
-
|
600
|
-
size2 = File.size(@path)
|
601
|
-
@gdbm.reorganize
|
602
|
-
size3 = File.size(@path)
|
603
|
-
|
604
|
-
# p [size1, size2, size3]
|
605
|
-
assert_equal(true, size1 < size2)
|
606
|
-
# this test is failed on Cygwin98. `GDBM version 1.8.0, as of May 19, 1999'
|
607
|
-
assert_equal(true, size3 < size2)
|
608
|
-
assert_equal(size1, size3)
|
609
|
-
end
|
610
|
-
|
611
|
-
def test_sync
|
612
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0666, GDBM::FAST))
|
613
|
-
assert_equal(gdbm.sync, gdbm)
|
614
|
-
gdbm.close
|
615
|
-
assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0666))
|
616
|
-
assert_equal(gdbm.sync, gdbm)
|
617
|
-
gdbm.close
|
618
|
-
end
|
619
|
-
|
620
|
-
def test_cachesize=
|
621
|
-
assert_equal(@gdbm.cachesize = 1024, 1024)
|
622
|
-
end
|
623
|
-
|
624
|
-
def test_fastmode=
|
625
|
-
assert_equal(@gdbm.fastmode = true, true)
|
626
|
-
end
|
627
|
-
|
628
|
-
def test_syncmode=
|
629
|
-
assert_equal(@gdbm.syncmode = true, true)
|
630
|
-
end
|
631
|
-
|
632
|
-
def test_haskey?
|
633
|
-
assert_equal('bar', @gdbm['foo']='bar')
|
634
|
-
assert_equal(true, @gdbm.has_key?('foo'))
|
635
|
-
assert_equal(false, @gdbm.has_key?('bar'))
|
636
|
-
end
|
637
|
-
|
638
|
-
def test_has_value?
|
639
|
-
assert_equal('bar', @gdbm['foo']='bar')
|
640
|
-
assert_equal(true, @gdbm.has_value?('bar'))
|
641
|
-
assert_equal(false, @gdbm.has_value?('foo'))
|
642
|
-
end
|
643
|
-
|
644
|
-
def test_to_a
|
645
|
-
v = "0"
|
646
|
-
100.times {v = v.next; @gdbm[v] = v}
|
647
|
-
|
648
|
-
ary = @gdbm.to_a
|
649
|
-
assert_instance_of(Array, ary)
|
650
|
-
assert_equal(100, ary.size)
|
651
|
-
ary.each {|key,val|
|
652
|
-
assert_equal(key.to_i, val.to_i)
|
653
|
-
}
|
654
|
-
end
|
655
|
-
|
656
|
-
def test_to_hash
|
657
|
-
v = "0"
|
658
|
-
100.times {v = v.next; @gdbm[v] = v}
|
659
|
-
|
660
|
-
hash = @gdbm.to_hash
|
661
|
-
assert_instance_of(Hash, hash)
|
662
|
-
assert_equal(100, hash.size)
|
663
|
-
hash.each {|key,val|
|
664
|
-
assert_equal(key.to_i, val.to_i)
|
665
|
-
}
|
666
|
-
end
|
667
|
-
end
|
668
|
-
|
669
|
-
class TestGDBM2 < Test::Unit::TestCase
|
670
|
-
def setup
|
671
|
-
@tmproot = Dir.mktmpdir('ruby-gdbm')
|
672
|
-
end
|
673
|
-
|
674
|
-
def teardown
|
675
|
-
FileUtils.remove_entry_secure @tmproot if File.directory?(@tmproot)
|
676
|
-
end
|
677
|
-
|
678
|
-
def test_reader_open_notexist
|
679
|
-
assert_raise(Errno::ENOENT) {
|
680
|
-
GDBM.open("#{@tmproot}/a", 0666, GDBM::READER)
|
681
|
-
}
|
682
|
-
end
|
683
|
-
|
684
|
-
def test_writer_open_notexist
|
685
|
-
assert_raise(Errno::ENOENT) {
|
686
|
-
GDBM.open("#{@tmproot}/a", 0666, GDBM::WRITER)
|
687
|
-
}
|
688
|
-
end
|
689
|
-
|
690
|
-
def test_wrcreat_open_notexist
|
691
|
-
v = GDBM.open("#{@tmproot}/a", 0666, GDBM::WRCREAT)
|
692
|
-
assert_instance_of(GDBM, v)
|
693
|
-
v.close
|
694
|
-
end
|
695
|
-
|
696
|
-
def test_newdb_open_notexist
|
697
|
-
v = GDBM.open("#{@tmproot}/a", 0666, GDBM::NEWDB)
|
698
|
-
assert_instance_of(GDBM, v)
|
699
|
-
v.close
|
700
|
-
end
|
701
|
-
|
702
|
-
def test_reader_open
|
703
|
-
GDBM.open("#{@tmproot}/a.dbm") {} # create a db.
|
704
|
-
v = GDBM.open("#{@tmproot}/a.dbm", nil, GDBM::READER) {|d|
|
705
|
-
assert_raise(GDBMError) { d["k"] = "v" }
|
706
|
-
true
|
707
|
-
}
|
708
|
-
assert(v)
|
709
|
-
end
|
710
|
-
|
711
|
-
def test_newdb_open
|
712
|
-
GDBM.open("#{@tmproot}/a.dbm") {|dbm|
|
713
|
-
dbm["k"] = "v"
|
714
|
-
}
|
715
|
-
v = GDBM.open("#{@tmproot}/a.dbm", nil, GDBM::NEWDB) {|d|
|
716
|
-
assert_equal(0, d.length)
|
717
|
-
assert_nil(d["k"])
|
718
|
-
true
|
719
|
-
}
|
720
|
-
assert(v)
|
721
|
-
end
|
722
|
-
|
723
|
-
def test_freeze
|
724
|
-
GDBM.open("#{@tmproot}/a.dbm") {|d|
|
725
|
-
d.freeze
|
726
|
-
assert_raise(RuntimeError) { d["k"] = "v" }
|
727
|
-
}
|
728
|
-
end
|
729
|
-
end
|
730
|
-
else
|
731
|
-
$stderr.puts "WARNING: Did not load gdbm library."
|
732
|
-
end
|