Merged with master and am ready to merge back
[dbsrgits/DBM-Deep.git] / t / 14_filter.t
1 use strict;
2 use warnings FATAL => 'all';
3
4 use Test::More;
5 use Test::Deep;
6
7 use t::common qw( new_dbm );
8
9 use_ok( 'DBM::Deep' );
10
11 sub my_filter_store_key { return 'MYFILTER' . $_[0]; }
12 sub my_filter_store_value { return 'MYFILTER' . $_[0]; }
13
14 sub my_filter_fetch_key { $_[0] =~ s/^MYFILTER//; return $_[0]; }
15 sub my_filter_fetch_value { $_[0] =~ s/^MYFILTER//; return $_[0]; }
16
17 my $dbm_factory = new_dbm();
18 while ( my $dbm_maker = $dbm_factory->() ) {
19     my $db = $dbm_maker->();
20
21     ok( !$db->set_filter( 'floober', sub {} ), "floober isn't a value filter key" );
22
23     ##
24     # First try store filters only (values will be unfiltered)
25     ##
26     ok( $db->set_filter( 'store_key', \&my_filter_store_key ), "set the store_key filter" );
27     ok( $db->set_filter( 'store_value', \&my_filter_store_value ), "set the store_value filter" );
28
29     $db->{key1} = "value1";
30     $db->{key2} = "value2";
31
32     is($db->{key1}, "MYFILTERvalue1", "The value for key1 was filtered correctly" );
33     is($db->{key2}, "MYFILTERvalue2", "The value for key2 was filtered correctly" );
34
35     ##
36     # Now try fetch filters as well
37     ##
38     ok( $db->set_filter( 'fetch_key', \&my_filter_fetch_key ), "Set the fetch_key filter" );
39     ok( $db->set_filter( 'fetch_value', \&my_filter_fetch_value), "Set the fetch_value filter" );
40
41     is($db->{key1}, "value1", "Fetchfilters worked right");
42     is($db->{key2}, "value2", "Fetchfilters worked right");
43
44     ##
45     # Try fetching keys as well as values
46     ##
47     cmp_bag( [ keys %$db ], [qw( key1 key2 )], "DB keys correct" );
48
49     # Exists and delete tests
50     ok( exists $db->{key1}, "Key1 exists" );
51     ok( exists $db->{key2}, "Key2 exists" );
52
53     is( delete $db->{key1}, 'value1', "Delete returns the right value" );
54
55     ok( !exists $db->{key1}, "Key1 no longer exists" );
56     ok( exists $db->{key2}, "Key2 exists" );
57
58     ##
59     # Now clear all filters, and make sure all is unfiltered
60     ##
61     ok( $db->filter_store_key( undef ), "Unset store_key filter" );
62     ok( $db->filter_store_value( undef ), "Unset store_value filter" );
63     ok( $db->filter_fetch_key( undef ), "Unset fetch_key filter" );
64     ok( $db->filter_fetch_value( undef ), "Unset fetch_value filter" );
65
66     is( $db->{MYFILTERkey2}, "MYFILTERvalue2", "We get the right unfiltered value" );
67 }
68
69 done_testing;