#! /usr/bin/perl -w use strict; # $Id: tree.t 822 2005-02-11 09:54:10Z abeltje $ use Data::Dumper; use File::Spec::Functions qw( :DEFAULT abs2rel rel2abs splitpath splitdir ); use File::Find; use Cwd; use Test::More tests => 22; # We need to test SourceTree.pm sub mani_file_from_list($;@) { my( $mani_file, @list ) = @_; local *MANIFEST; open MANIFEST, "> $mani_file" or die "Can't create '$mani_file': $!"; print MANIFEST "$_\n" for grep length $_ => @list; close MANIFEST; } sub MANIFEST_from_dir($) { my( $path ) = @_; my $cwd = cwd(); chdir $path or die "Cannot chdir($path): $!\n"; my @files = qw( MANIFEST ); find sub { -f or return; my $relfile = canonpath( $File::Find::name ); my( undef, $dirs, $file ) = splitpath( $relfile ); my @dirs = grep $_ && length $_ => splitdir( $dirs ); $^O eq 'VMS' and $file =~ s/\.$//; push @dirs, $file; push @files, join '/', @dirs; }, '.'; chdir $cwd; my $mani_file = File::Spec->catfile( $path, 'MANIFEST' ); mani_file_from_list( $mani_file => @files ); } BEGIN { use_ok( 'Test::Smoke::SourceTree', ':const' ); } my $cwd = cwd(); chdir 't' or die "Cannot chdir(t): $!"; my $path = File::Spec->canonpath( cwd() ); chdir $cwd; { my $tree = Test::Smoke::SourceTree->new( 't' ); isa_ok( $tree, 'Test::Smoke::SourceTree' ); is( $tree->canonpath, File::Spec->canonpath( $path ) , "canonpath" ); is( $tree->rel2abs, $path, "rel2abs" ); my $rel = File::Spec->abs2rel( $path ); is( $tree->abs2rel, $rel, "abs2rel" ); is( $tree->mani2abs( 'win32/Makefile' ), File::Spec->catfile( $path, split m|/|, 'win32/Makefile' ), "mani2abs complex" ); } SKIP: { eval { MANIFEST_from_dir 't' }; $@ and skip $@, 3; my $tree = Test::Smoke::SourceTree->new( 't' ); isa_ok( $tree, 'Test::Smoke::SourceTree' ); my $mani_check = $tree->check_MANIFEST; is( keys %$mani_check, 0, "No dubious files" ) or diag Dumper $mani_check; my $mani_file = File::Spec->catfile( $tree->canonpath, 'MANIFEST' ); is( $tree->abs2mani( $mani_file ), 'MANIFEST', "abs2mani" ); 1 while unlink $mani_file; } SKIP: { # Check that we can pass extra files to check_MANIFEST() eval { MANIFEST_from_dir 't' }; $@ and skip $@, 1; my $tree = Test::Smoke::SourceTree->new( 't' ); my $mani_check = $tree->check_MANIFEST( 'does_not_exist' ); is( keys %$mani_check, 0, "No dubious files [skips are not reported]" ) or diag Dumper $mani_check; my $mani_file = File::Spec->catfile( $tree->canonpath, 'MANIFEST' ); 1 while unlink $mani_file; } SKIP: { # Check that check_MANIFEST() finds dubious files my $missing = File::Spec->catfile( 't', 'missing' ); $missing = File::Spec->rel2abs( $missing ); local *FH; { open FH, "> $missing" or skip "Cannot create '$missing': $!", 3; close FH; } eval { MANIFEST_from_dir 't' }; $@ and skip $@, 3; 1 while unlink $missing; my $undeclared = File::Spec->catfile( 't', 'undeclared' ); $undeclared = File::Spec->rel2abs( $undeclared ); { open FH, "> $undeclared" or skip "Cannot create '$undeclared': $!", 3; close FH; } my $skipit = File::Spec->catfile( 't', 'skip_it' ); $skipit = File::Spec->rel2abs( $skipit ); { open FH, "> $skipit" or skip "Cannot create '$skipit': $!", 3; close FH; } my $tree = Test::Smoke::SourceTree->new( 't' ); my $mani_check = $tree->check_MANIFEST( 'skip_it' ); is( keys %$mani_check, 2, "Two dubious files" ) or diag Dumper $mani_check; my $check = { undeclared => ST_UNDECLARED, missing => ST_MISSING }; if ( $Test::Smoke::SourceTree::NOCASE ) { my %uccheck = map { ( uc $_ => $check->{ $_ } ) } keys %$check; $check = \%uccheck; } is_deeply( $mani_check, $check, "Hash contents" ); my $und_cnt = grep $mani_check->{ $_ } == ST_UNDECLARED() => keys %$mani_check; is( $und_cnt, 1, "One undeclared file" ); my $mis_cnt = grep $mani_check->{ $_ } == ST_MISSING() => keys %$mani_check; is( $mis_cnt, 1, "One missing file" ); my $mani_file = File::Spec->catfile( $tree->canonpath, 'MANIFEST' ); 1 while unlink $mani_file; 1 while unlink $undeclared; 1 while unlink $skipit; } SKIP: { # Check that check_MANIFEST() finds dubious files with MANIFEST.SKIP my $missing = File::Spec->catfile( 't', 'missing' ); $missing = File::Spec->rel2abs( $missing ); local *FH; { open FH, "> $missing" or skip "Cannot create '$missing': $!", 3; close FH; } eval { MANIFEST_from_dir 't' }; $@ and skip $@, 3; 1 while unlink $missing; # make it missing! my $undeclared = File::Spec->catfile( 't', 'undeclared' ); $undeclared = File::Spec->rel2abs( $undeclared ); { open FH, "> $undeclared" or skip "Cannot create '$undeclared': $!", 3; close FH; } my $skipit = File::Spec->catfile( 't', 'skip_it' ); $skipit = File::Spec->rel2abs( $skipit ); { open FH, "> $skipit" or skip "Cannot create '$skipit': $!", 3; close FH; } my $mani_skip = File::Spec->catfile( 't', 'MANIFEST.SKIP' ); mani_file_from_list( $mani_skip, 'skip_it' ); my $tree = Test::Smoke::SourceTree->new( 't' ); my $mani_check = $tree->check_MANIFEST( ); is( keys %$mani_check, 2, "[MANIFEST.SKIP] Two dubious files" ) or diag Dumper $mani_check; my $check = { undeclared => ST_UNDECLARED, missing => ST_MISSING }; if ( $Test::Smoke::SourceTree::NOCASE ) { my %uccheck = map { ( uc $_ => $check->{ $_ } ) } keys %$check; $check = \%uccheck; } is_deeply( $mani_check, $check, "[MANIFEST.SKIP] Hash contents" ); my $und_cnt = grep $mani_check->{ $_ } == ST_UNDECLARED() => keys %$mani_check; is( $und_cnt, 1, "[MANIFEST.SKIP] One undeclared file" ); my $mis_cnt = grep $mani_check->{ $_ } == ST_MISSING() => keys %$mani_check; is( $mis_cnt, 1, "[MANIFEST.SKIP] One missing file" ); my $mani_file = File::Spec->catfile( $tree->canonpath, 'MANIFEST' ); 1 while unlink $mani_file; 1 while unlink $mani_skip; 1 while unlink $undeclared; 1 while unlink $skipit; } { # my $tree1 = Test::Smoke::SourceTree->new( 't' ); my $tree2 = $tree1->new( 't' ); isa_ok $tree2, 'Test::Smoke::SourceTree'; my $empty = $tree2->_read_mani_file( 'MANIFEST.SKIP', 1 ); is_deeply $empty, { }, "Return empty hashref [no MANIFEST]"; } { # check new() croak()s without an argument #line 300 my $tree = eval { Test::Smoke::SourceTree->new() }; ok( $@, "new() must have arguments" ); like( $@, "/Usage:.*?at \Q$0\E line 300/", "it croak()s alright" ); }