The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use lib './t/lib';

use Test::Builder::Tester tests => 8;

use File::Path qw( rmtree );

use File::Find::Object::TreeCreate;
use Test::TrailingSpace;

{
    my $test_id = "no-trailing-space-1";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "b.pm",
                        'contents' => "This file was spotted in the wild.",
                    },
                ],
            },
            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            filename_regex => qr/\.(?:pm|txt)\z/,
        }
    );

    test_out("ok 1 - no trailing space FOO");
    $finder->no_trailing_space("no trailing space FOO");
    test_test("no trailing space was reported");
    rmtree($t->get_path("./$test_dir"))
}

{
    my $test_id = "with-trailing-space-1";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "b.pm",
                        'contents' =>
                        "This file.    \nI don't like it.",
                    },
                ],
            },
            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            filename_regex => qr/\.(?:pm|txt)\z/,
        }
    );

    test_out("not ok 1 - with trailing space CLAM");
    test_fail(+1);
    $finder->no_trailing_space("with trailing space CLAM");
    test_test(title => "with trailing space was reported", skip_err => 1,);
    rmtree($t->get_path("./$test_dir"))
}

{
    my $test_id = "no-trailing-space-2";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "b.pm",
                        'contents' => "This file was spotted in the wild.",
                    },
                ],
            },
            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
            {
                'name' => "lib/",
                subs =>
                [
                    {
                        'name' => "foo.pm",
                        'contents' => "File with trailing space     \nhello\n",
                    }
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            filename_regex => qr/\.(?:pm|txt)\z/,
            abs_path_prune_re => qr#\blib\b#ms,
        }
    );

    test_out("ok 1 - no trailing space BAR");
    $finder->no_trailing_space("no trailing space BAR");
    test_test("no trailing space was reported");
    rmtree($t->get_path("./$test_dir"))
}

{
    my $test_id = "no-trailing-space-in-hg";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "b.pm",
                        'contents' => "This file was spotted in the wild.",
                    },
                ],
            },
            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
            {
                'name' => ".hg/",
                subs =>
                [
                    {
                        'name' => "foo.pm",
                        'contents' => "File with trailing space     \nhello\n",
                    }
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            filename_regex => qr/\.(?:pm|txt)\z/,
        }
    );

    test_out("ok 1 - trailing space in .hg is ignored.");
    $finder->no_trailing_space("trailing space in .hg is ignored.");
    test_test("no trailing space was reported");
    rmtree($t->get_path("./$test_dir"))
}

{
    my $test_id = "no-trailing-space-in-hg-with-abs-path-re";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "b.pm",
                        'contents' => "This file was spotted in the wild.",
                    },
                ],
            },

            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
            {
                'name' => ".hg/",
                subs =>
                [
                    {
                        'name' => "foo.pm",
                        'contents' => "File with trailing space     \nhello\n",
                    }
                ],
            },
            {
                'name' => "lib/",
                subs =>
                [
                    {
                        'name' => "MyFileWithSpace.pm",
                        'contents' => "Trailing space===    \nFoo\n",
                    },
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            filename_regex => qr/\.(?:pm|txt)\z/,
            abs_path_prune_re => qr#\blib\b#ms,
        }
    );

    test_out("ok 1 - trailing space.");
    $finder->no_trailing_space("trailing space.");
    test_test("no trailing space was reported with abs_path_prune_re and .hg");
    rmtree($t->get_path("./$test_dir"))
}

{
    my $test_id = "with-trailing-space-prune-hg";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "WithTrailingSpace.pm",
                        'contents' => "Trail space here =     \nGamp\n",
                    },
                ],
            },

            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
            {
                'name' => ".hg/",
                subs =>
                [
                    {
                        'name' => "foo.pm",
                        'contents' => "File with trailing space     \nhello\n",
                    }
                ],
            },
            {
                'name' => "lib/",
                subs =>
                [
                    {
                        'name' => "MyFileWithSpace.pm",
                        'contents' => "Trailing space===    \nFoo\n",
                    },
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            filename_regex => qr/\.(?:pm|txt)\z/,
            abs_path_prune_re => qr#\blib\b#ms,
        }
    );

    test_out("not ok 1 - with trailing space OGLO");
    test_fail(+1);
    $finder->no_trailing_space("with trailing space OGLO");
    test_test(title => "with trailing space was reported for abs_path_prune_re", skip_err => 1,);
    rmtree($t->get_path("./$test_dir"))
}

{
    my $test_id = "no-trailing-space-with-unrecognized-filename";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "b.pm",
                        'contents' => "This file was spotted in the wild.",
                    },
                ],
            },

            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
            {
                'name' => ".hg/",
                subs =>
                [
                    {
                        'name' => "foo.pm",
                        'contents' => "File with trailing space     \nhello\n",
                    }
                ],
            },
            {
                'name' => "eclim/",
                subs =>
                [
                    {
                        'name' => "MyFileWithSpace.tar.gz",
                        'contents' => "Trailing space===    \nFoo\n",
                    },
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            filename_regex => qr/\.(?:pm|txt)\z/,
            abs_path_prune_re => qr#\blib\b#ms,
        }
    );

    test_out("ok 1 - trailing space.");
    $finder->no_trailing_space("trailing space.");
    test_test("no trailing space was with unrecognized filename.");
    rmtree($t->get_path("./$test_dir"))
}

{
    my $test_id = "prune-files";
    my $test_dir = "t/sample-data/$test_id";
    my $tree =
    {
        'name' => "$test_id/",
        'subs' =>
        [
            {
                'name' => "a/",
                subs =>
                [
                    {
                        'name' => "b.pm",
                        'contents' => "This file was spotted in the wild.",
                    },
                    {
                        'name' => "mypatch.patch",
                        'contents' => "+foo\n \n-Lambda\n",
                    },
                ],
            },
            {
                'name' => "foo/",
                'subs' =>
                [
                    {
                        'name' => "t.door.txt",
                        'contents' => "A T Door",
                    },
                    {
                        'name' => "yet/",
                    },
                ],
            },
            {
                'name' => ".hg/",
                subs =>
                [
                    {
                        'name' => "foo.pm",
                        'contents' => "File with trailing space     \nhello\n",
                    }
                ],
            },
        ],
    };

    my $t = File::Find::Object::TreeCreate->new();
    $t->create_tree("./t/sample-data/", $tree);

    my $finder = Test::TrailingSpace->new(
        {
            root => $t->get_path("./$test_dir"),
            # Match all.
            filename_regex => qr/./,
            abs_path_prune_re => qr#(?:\blib\b)|(?:\.patch\z)#ms,
        }
    );

    test_out("ok 1 - trailing space.");
    $finder->no_trailing_space("trailing space.");
    test_test("no trailing space was with unrecognized filename.");
    rmtree($t->get_path("./$test_dir"))
}