gdbm 0.9

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