Commit | Line | Data |
2120a181 |
1 | ## |
2 | # DBM::Deep Test |
3 | ## |
4 | use strict; |
5 | use Test::More tests => 13; |
6 | use Test::Exception; |
7 | use t::common qw( new_fh ); |
8 | |
9 | use_ok( 'DBM::Deep' ); |
10 | |
11 | { |
12 | my ($fh, $filename) = new_fh(); |
13 | my $db = DBM::Deep->new({ |
14 | file => $filename, |
45f047f8 |
15 | fh => $fh, |
2120a181 |
16 | autoflush => 1, |
17 | }); |
18 | |
19 | $db->{foo} = '1234'; |
20 | $db->{foo} = '2345'; |
21 | |
22 | my $size = -s $filename; |
23 | $db->{foo} = '3456'; |
24 | cmp_ok( $size, '==', -s $filename, "A second overwrite doesn't change size" ); |
25 | |
26 | $size = -s $filename; |
27 | delete $db->{foo}; |
28 | cmp_ok( $size, '==', -s $filename, "Deleted space isn't released" ); |
29 | |
30 | $db->{bar} = '2345'; |
31 | cmp_ok( $size, '==', -s $filename, "Added a new key after a delete reuses space" ); |
32 | |
33 | $db->{baz} = {}; |
34 | $size = -s $filename; |
35 | |
36 | delete $db->{baz}; |
37 | $db->{baz} = {}; |
38 | |
39 | cmp_ok( $size, '==', -s $filename, "delete and rewrite reuses space" ); |
40 | |
41 | $db->{baz} = {}; |
42 | $size = -s $filename; |
43 | |
44 | $db->{baz} = {}; |
45 | |
46 | cmp_ok( $size, '==', -s $filename, "delete and rewrite reuses space" ); |
47 | |
48 | my $x = { foo => 'bar' }; |
49 | $db->{floober} = $x; |
50 | |
51 | delete $db->{floober}; |
52 | |
53 | ok( !exists $x->{foo}, "Deleting floober makes \$x empty (exists)" ); |
54 | is( $x->{foo}, undef, "Deleting floober makes \$x empty (read)" ); |
55 | is( delete $x->{foo}, undef, "Deleting floober makes \$x empty (delete)" ); |
56 | |
57 | eval { $x->{foo} = 'bar'; }; |
58 | like( $@, qr/Cannot write to a deleted spot in DBM::Deep/, "Exception thrown when writing" ); |
59 | |
60 | cmp_ok( scalar( keys %$x ), '==', 0, "Keys returns nothing after deletion" ); |
61 | } |
62 | |
63 | { |
64 | my ($fh, $filename) = new_fh(); |
65 | my $db = DBM::Deep->new({ |
66 | file => $filename, |
45f047f8 |
67 | fh => $fh, |
2120a181 |
68 | autoflush => 1, |
69 | }); |
70 | |
71 | $db->{ $_ } = undef for 1 .. 4; |
72 | delete $db->{ $_ } for 1 .. 4; |
73 | cmp_ok( keys %{ $db }, '==', 0, "We added and removed 4 keys" ); |
74 | |
75 | # So far, we've written 4 keys. Let's write 13 more keys. This should -not- |
76 | # trigger a reindex. This requires knowing how much space is taken. Good thing |
77 | # we wrote this dreck ... |
78 | my $size = -s $filename; |
45f047f8 |
79 | |
e9b0b5f0 |
80 | my $data_sector_size = $db->_engine->data_sector_size; |
81 | my $expected = $size + 9 * ( 2 * $data_sector_size ); |
2120a181 |
82 | |
83 | $db->{ $_ } = undef for 5 .. 17; |
84 | |
85 | cmp_ok( $expected, '==', -s $filename, "No reindexing after deletion" ); |
86 | } |