build: replace deprecated create_makefile_pl by configure_requires
[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 => 21;
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') or BAIL_OUT('No 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                         diag('         got: "', join('\n', split $/, $output ), '"');
41                         diag('    expected: "', join('\n', split $/, $compare), '"');
42                         return;
43                 }
44         }
45         is($result, $expect, $name);
46 }
47
48 my $BASICBODY = "replace$/noremove$/remove$/.$/";
49
50 testfileset('no match',      $BASICBODY,    ['no'      => undef], 0, $BASICBODY);
51 testfileset('remove string', $BASICBODY,    ['remove'  => undef], 1, "replace$/noremove$/.$/");
52 testfileset('remove empty',  "$/.$/ $/$/",  [''        => undef], 2, ".$/ $/");
53 testfileset('remove regex',  $BASICBODY,    [qr/^re/   => undef], 2, "noremove$/.$/");
54 testfileset('remove all',    $BASICBODY,    [qr/./     => undef], 4, '');
55
56 testfileset('add unconditionally', "$/0$/", [undef()   => '0'], 1, "$/0$/0$/");
57 testfileset('add string',     "foo$/",      ['bar'],            1, "foo$/bar$/");
58 testfileset('keep string',    "foo$/bar$/", ['foo'],            0, "foo$/bar$/");
59 testfileset('keep first',     "foo$/FOO$/foo$/", ['foo'],       1, "foo$/FOO$/");
60 testfileset('replace string', "$/0$/1$/2$/", ['0' => 3],        2, "$/1$/2$/3$/");
61 testfileset('keep regex',     "foo$/hi$/$/", [qr/./ => 'hi'],   1, "hi$/$/");
62
63 testfileset('add new array',  ".$/",        ['' => ['foo','.']],  2, ".$/foo$/.$/");
64 testfileset('replace by array', "$/foo$/.$/", ['' => ['foo','']], 3, "foo$/.$/foo$/$/");
65 testfileset('partial add',    "foo$/$/",    ['foo' => ['foo','.']], 1, "foo$/$/.$/");
66
67 my $SAMPLE2 = "$/foo$/and$/bar$/.$/";
68 testfileset('keep pair',      $SAMPLE2, [['foo','bar']], 0, $SAMPLE2);
69 testfileset('keep order',     $SAMPLE2, [['bar','foo']], 2, "$/and$/bar$/.$/foo$/");
70 testfileset('replace pair',   $SAMPLE2, [['bar','foo'] => ['fooo','barr']], 4, "$/and$/.$/fooo$/barr$/");
71 testfileset('mixed arrays',   $SAMPLE2, [['ignore',qr/a/] => ['bar','foo','.']], 3, "$/foo$/bar$/.$/foo$/.$/");
72
73 is(remove_tree($target), 19, 'no unexpected files');
74