The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;

use Git::Database::DirectoryEntry;

my @methods = qw(
    is_tree
    is_blob
    is_executable
    is_link
    is_submodule
);

# only tests the modes that Git produces
my @tests = (
    [ '040000', 1,  '', '', '', '' ],    # subdirectory (tree)
    [ '100644', '', 1,  '', '', '' ],    # file (blob)
    [ '100755', '', 1,  1,  '', '' ],    # executable (blob)
    [ '120000', '', 1,  '', 1,  '' ],    # symlink
    [ '160000', '', 1,  '', '', 1 ],     # submodule (commit)
);

for my $t (@tests) {
    my ( $mode, @bool ) = @$t;

    my $de = Git::Database::DirectoryEntry->new(
        mode     => $mode,
        filename => 'hello',
        digest   => '0000000000000000000000000000000000000000',    # not used
    );

    # test boolean methods
    is( $de->$_, shift @bool, "$mode - $_" ) for @methods;

    # test output methods
    is( $de->as_content, sprintf( "$mode %s\0" . "\0" x 20, $de->filename ),
        'as_content' );
    is( $de->as_string,
        sprintf(
            "$mode %s %s\t%s\n",
            $de->is_tree ? 'tree' : 'blob',
            '0' x 40, $de->filename
        ),
        'as_string'
    );
}

done_testing;