fileset: compare resulting data in tests
[perl/file-rewrite.git] / t / 10-fileset.t
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 13;
7 use Test::NoWarnings;
8
9 use autodie;
10 use File::Temp qw(tempdir);
11 use File::Path qw(remove_tree);
12
13 BEGIN { use_ok('File::Rewrite', 'fileset'); }
14
15 my $target = tempdir();
16
17 sub testfileset {
18         my ($name, $input, $params, $expect, $compare) = @_;
19
20         my $filename = "$target/$name";
21         open my $file, '>', $filename;
22         print {$file} $input;
23         close $file;
24
25         my $result = eval { fileset($filename, @$params) };
26         if (defined $result and defined $compare) {
27                 my $output = eval {
28                         local $/;
29                         open my $confirm, '<', $filename;
30                         readline $confirm;
31                 };
32                 if ($compare ne $output) {
33                         fail($name);
34                         diag(sprintf(
35                                 'output mismatch (got %d of %d lines with return value %s)',
36                                 $output =~ tr/\n//,
37                                 $compare =~ tr/\n//,
38                                 explain($result),
39                         ));
40                         return;
41                 }
42         }
43         is($result, $expect, $name);
44 }
45
46 my $BASICBODY = "replace$/noremove$/remove$/.$/";
47
48 testfileset('no match',      $BASICBODY,    [undef, 'nomatch'], 0, $BASICBODY);
49 testfileset('remove string', $BASICBODY,    [undef, 'remove'],  1, "replace$/noremove$/.$/");
50 testfileset('remove empty',  "$/.$/ $/$/",  [undef, ''],        2, ".$/ $/");
51 testfileset('remove regex',  $BASICBODY,    [undef, qr/^re/],   2);
52 testfileset('remove all',    $BASICBODY,    [undef, qr/./],     4, '');
53
54 testfileset('add string',     "foo$/",      ['bar'],            1, "foo$/bar$/");
55 testfileset('keep string',    "foo$/bar$/", ['foo'],            0, "foo$/bar$/");
56 testfileset('replace string', "1$/2$/3$/",  [4, 1],             2, "2$/3$/4$/");
57 testfileset('replace all',    $BASICBODY,   ['', qr/^re/],      3, "noremove$/.$/$/");
58 testfileset('keep first',     "foo$/bar$/foo$/", ['foo'],       1, "foo$/bar$/");
59
60 is(remove_tree($target), 11, 'no unexpected files');
61