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

BEGIN {
    use_ok('SVN::Class');
}

use IPC::Cmd qw( can_run run );
use File::Temp qw( tempdir );
use Data::Dump qw( dump );

my $debug = $ENV{PERL_DEBUG} || 0;    # turn on to help debug CPANTS

# create a repos
#
# Mac OSX 10.5 workaround
if ($ENV{TMPDIR} =~ m/\w+\+/) {
    $ENV{TMPDIR} = '/tmp';
}

#diag( File::Spec->tmpdir() );
my $tmpdir = $ENV{SVN_CLASS_TMP_DIR}
    || tempdir( CLEANUP => ( $debug > 1 ) ? 0 : 1 );
my $repos = Path::Class::Dir->new( $tmpdir, 'svn-class', 'repos' );
my $work  = Path::Class::Dir->new( $tmpdir, 'svn-class', 'work' );

# if we don't have svn in PATH can't do much.
SKIP: {
    skip "svn is not in PATH", 25 unless can_run('svn');

    diag( "svn command = " . can_run('svn') );

    # if running multiple times, test for existence of our repos & work dirs

SKIP: {

        if ( -d $repos && -s "$repos/format" ) {
            skip "repos setup already complete", 5;
        }

        ok( $repos->mkpath(1), "repos path made" );
        ok( $work->mkpath(1),  "work path made" );
        ok( run( command => "svnadmin create $repos" ),
            "repos $repos created" );

        # create a project in repos and check it out in $work
        ok( run( command => "svn mkdir file://$repos/test -m init" ),
            "test project created in repos" );

        ok( run( command => "svn co file://$repos/test $work" ),
            "test checked out" );

    }

    # set up is done. now let's test our SYNOPSIS.

    #  SVN::Class::File
    ok( my $file = svn_file( $work, 'test1' ), "new svn_file" );    # 1

    #$file->_debug_stdin_fh;
    #$file->_debug_stdout_fh;

    $file->debug(1) if $debug;
    ok( my $fh = $file->open('>>'), "filehandle created" );
    ok( print( {$fh} "hello world\n" ), "hello world" );
    ok( $fh->close,                        "filehandle closed" );
    ok( $file->add,                        "$file scheduled for commit" );
    ok( $file->modified,                   "$file status == modified" );   # 6
    ok( $file->commit('the file changed'), "$file committed" );
    diag( "error: " . $file->errstr . " : $!" ) if $file->error_code;
    ok( my $log = $file->log, "$file has a log" );
    is( $file->outstr, join( "\n", @$log, "" ), "outstr" );

    # SVN::Class::Dir
    ok( my $dir = svn_dir( $work, 'testdir' ), "new svn_dir" );
    $dir->debug(1) if $debug;
    ok( -d $dir ? 1 : $dir->mkpath, "$dir mkpath" );    # 11
    ok( $dir->add, "$dir scheduled for commit" );
    is( $dir->status, 'A', "dir status is schedule for Add" );

    #diag( join( "", `ls -l $work` ) );
    ok( $dir->commit('new dir'), "$dir committed" );
    diag( "error: " . $dir->errstr . " : $!" ) if $dir->error_code;
    is( $dir->status, 0, "dir status is 0 since it has not changed" );

    # SVN::Class::Info
    ok( my $info = $dir->info, "get info" );            # 16
    is( $info->path, $dir, "working path" );

    # SVN::Class::Repos
    #diag(dump $info);
    #diag($info->url);
    #diag(dump $info->url);
    is( $info->url, $info->url->info->url, "recursive URL" );
    ok( my $repos = SVN::Class::Repos->new( 'file://' . $repos ),
        "new repos object" );
    my $thisuser = getpwuid($<);
    is( $repos->info->author, $thisuser,
        "$thisuser was last author to commit to $repos" );    # 20

}    # end global SKIP