Test::More 0.88 is required for done_testing
[dbsrgits/DBM-Deep.git] / t / 40_freespace.t
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,
15         fh => $fh,
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,
67         fh => $fh,
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;
79
80     my $data_sector_size = $db->_engine->data_sector_size;
81     my $expected = $size + 9 * ( 2 * $data_sector_size );
82
83     $db->{ $_ } = undef for 5 .. 17;
84
85     cmp_ok( $expected, '==', -s $filename, "No reindexing after deletion" );
86 }