The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- Perl -*-

# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl 1.t'

#########################

# change 'tests => 1' to 'tests => last_test_to_print';

use Test::More tests => 1 + 5 + 4 + 6 + 11 + 6 + 9;
BEGIN { use_ok('Convert::yEnc::Entry') };

#########################

use strict;
use warnings;

Create();
Load  ();
EntryS();
EntryM();
Parts_homo  ();
Parts_hetero();

sub Create
{
    my $undef = new Convert::yEnc::Entry;
    is($undef, undef, "new w/bad args");

    my $entryS = new Convert::yEnc::Entry { size => 10000 };
    isa_ok($entryS, "Convert::yEnc::EntryS", "EntryS creation");
    isa_ok($entryS, "Convert::yEnc::Entry" , "EntryS subclasses Entry");

    my $entryM = new Convert::yEnc::Entry { size => 10000, part => 1 };
    isa_ok($entryM, "Convert::yEnc::EntryM", "EntryM creation");
    isa_ok($entryM, "Convert::yEnc::Entry" , "EntryM subclasses Entry");
}

sub Load
{
    my $entryS = load Convert::yEnc::Entry "10000\t10000";
    isa_ok($entryS, "Convert::yEnc::EntryS", "EntryS loading");
    isa_ok($entryS, "Convert::yEnc::Entry" , "EntryS subclasses Entry");

    my $entryM = load Convert::yEnc::Entry "10000\t5000\t1-5" ;
    isa_ok($entryM, "Convert::yEnc::EntryM", "EntryM loading");
    isa_ok($entryM, "Convert::yEnc::Entry" , "EntryM subclasses Entry");
}


sub EntryS
{
    my($ok, $complete);

    my $entryS = new Convert::yEnc::Entry { size => 10000 };
    $ok = $entryS->yend( { size=>10000 } );
    ok($ok, "entryS->yend");

    $complete = $entryS->complete;
    ok($complete, "entryS complete");
    
    ok(! $entryS->yend  , "entryS->yend out of order");
    ok(! $entryS->ybegin, "entryS->ybegin");
    ok(! $entryS->ypart , "entryS->ypart" );  

    my $save = "$entryS";
    is($save, "10000\t10000", "entryS to_string");
}


sub EntryM
{
    my($ok, $complete);

    my $entryM = new Convert::yEnc::Entry { size => 10000, part => 1 };

    $ok = $entryM->ybegin;
    ok(!$ok, "entryM begin out of order");

    $ok = $entryM->ypart({ begin=>1, end=>5000 } );
    ok($ok, "entryM->ypart");

    $ok = $entryM->yend({ size=>5000, part=>1 } );
    ok($ok, "entryM->ypart");

    $complete = $entryM->complete;
    ok(!$complete, "entryM not complete");


    $ok = $entryM->ybegin({ size => 10000, part => 2 } );
    ok($ok, "entryM->ybegin");

    $ok = $entryM->ypart({ begin=>5001, end=>10000 } );
    ok($ok, "entryM->ypart");

    $ok = $entryM->yend({ size=>5000, part=>2 } );
    ok($ok, "entryM->ypart");

    $complete = $entryM->complete;
    ok($complete, "entryM complete");

    my $save = "$entryM";
    is($save, "10000\t1-10000\t1-2", "entryM to_string");

    ok(! $entryM->ypart , "entryM->ypart out of order");  
    ok(! $entryM->yend  , "entryM->yend  out of order");
}

sub Parts_homo
{
    my $ok;
    my $entryM = new Convert::yEnc::Entry { size => 24, part => 1 };

    ok($entryM->ypart ({ begin =>  1, end  => 12 } ), "part 1" 	);
    ok($entryM->yend  ({ size  => 12, part =>  1 } ), "end 1"  	);

    ok($entryM->ybegin({ size  => 24, part =>  2 } ), "begin 2"	);
    ok($entryM->ypart ({ begin => 13, end  => 24 } ), "part 2" 	);
    ok($entryM->yend  ({ size  => 12, part =>  2 } ), "end 2"  	);

    ok($entryM->complete                            , "complete");
}

sub Parts_hetero
{
    my $ok;
    my $entryM = new Convert::yEnc::Entry { size => 24, part => 1 };

    ok($entryM->ypart ({ begin =>  1, end  => 12 } ), "part 1" 	);
    ok($entryM->yend  ({ size  => 12, part =>  1 } ), "end 1"  	);

    ok($entryM->ybegin({ size  => 24, part =>  2 } ), "begin 2"	);
    ok($entryM->ypart ({ begin =>  9, end  => 16 } ), "part 2" 	);
    ok($entryM->yend  ({ size  => 12, part =>  2 } ), "end 2"  	);

    ok($entryM->ybegin({ size  => 24, part =>  3 } ), "begin 3"	);
    ok($entryM->ypart ({ begin => 17, end  => 24 } ), "part 3" 	);
    ok($entryM->yend  ({ size  => 12, part =>  3 } ), "end 3"  	);

    ok($entryM->complete                            , "complete");
}


__END__