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

use strict;
use warnings;

use File::Spec;
#use Test::More "no_plan";
use Test::More tests => 83;
use Test::NoWarnings;

BEGIN {
    use_ok ("VCS::SCCS");
    }

like (VCS::SCCS::version (),  qr{^\d+\.\d+$},	"Module version function");
like (VCS::SCCS->version (),  qr{^\d+\.\d+$},	"Module version method");

my $sccs;

my $testfile = "files/SCCS/s.base.dta";

sub e_is
{
    my ($expr, @args) = @_;
    my $msg = @args ? defined $args[0] ? qq{"$args[0]"} : "undef" : "";
    eval { $sccs = VCS::SCCS->new (@args) };
    is ($sccs, undef, "new->($msg)");
    like ($@, $expr,  ".. fail msg");
    } # e_is

ok (1, "Constructor");
    open my $empty, ">", "s.empty.c";
e_is (qr{needs a valid file name});
e_is (qr{needs a valid file name},		undef);
e_is (qr{needs a valid file name},		"");
e_is (qr{does not exist},			"xxxxx");
e_is (qr{is empty},				"s.empty.c");
    print $empty "Not anymore\n";
    close $empty;
    chmod 0000, "s.empty.c";	# Might not be effective on Win32 or cygwin!
e_is (qr{Cannot open|start with a checksum},	"s.empty.c");
    unlink "s.empty.c";
e_is (qr{is not a file|does not exist|nul is empty}, # Win32--
						File::Spec->devnull ());
e_is (qr{is not a file},			"files");
e_is (qr{start with a checksum},		"Makefile");

ok (1, "Parsing");
ok ($sccs = VCS::SCCS->new ($testfile), "Read and parse large SCCS file");

ok (1, "Metadata");
is ($sccs->file (),		"files/base.dta",	"file ()");
is ($sccs->checksum (),		52534,		"checksum ()");
is (scalar $sccs->current (),	70,		"current () scalar");
is_deeply ([ $sccs->current () ],
	[ 70, "5.39", 5, 39, undef, undef ],	"current () list");

ok (1, "Deltas");
is ($sccs->version,		"5.39",		"version ()");
is ($sccs->version (undef),	"5.39",		"version (undef)");
is ($sccs->version (0),		"5.39",		"version (0)");
is ($sccs->version (""),	"5.39",		"version ('')");
is ($sccs->version (53),	"5.22",		"version (53)");
is ($sccs->version (99),	undef,		"version (99)");
is ($sccs->revision,		70,		"revision ()");
is ($sccs->revision (undef),	70,		"revision (undef)");
is ($sccs->revision (0),	70,		"revision (0)");
is ($sccs->revision (""),	70,		"revision ('')");
is ($sccs->revision ("5.38"),	69,		"revision ('5.38')");
is ($sccs->revision ("9.99"),	undef,		"revision ('9.99')");

my $delta;
ok ($delta = $sccs->delta,			"delta ()");
is ($delta->{version},		"5.39",		"  {version}");
is ($delta->{release},		5,		"  {release}");
is ($delta->{level},		39,		"  {level}");
is ($delta->{branch},		undef,		"  {branch}");
is ($delta->{sequence},		undef,		"  {sequence}");
is ($delta->{date},		"07/11/09",	"  {date}");
ok ($delta = $sccs->delta (2),			"delta (2)");
is ($delta->{version},		"4.2",		"  {version}");
ok ($delta = $sccs->delta ("4.3"),		"delta ('4.3')");
is ($delta->{date},		"98/02/06",	"  {date}");
is ($delta = $sccs->delta (99),	undef,		"delta (99)");

my $f;
ok ($f = $sccs->flags (),			"flags ()");
is (ref $f,			"HASH",		".. is hashref");
my %f = %{$f};
ok (exists $f{q},				".. {q} exists");
is ($f{q},			"main_app",	".. {q} has value");
ok (exists $f{v},				".. {v} exists");
is ($f{v},			undef,		".. {v} has no value");

my @users;
ok (@users = $sccs->users (),			"users ()");
is (scalar @users,		3,		".. has 3 users");
is ($users[0],			"merijn",	".. user 0");
is ($users[1],			"testuser1",	".. user 1");
is ($users[2],			"testuser2",	".. user 2");

is ($sccs->comment (),		"test\n",	"comment ()");

my $revmap;
ok ($revmap = $sccs->revision_map (),		"revision_map ()");
is (ref $revmap,		"ARRAY",	".. is arrayref");
is (ref $revmap->[0],		"ARRAY",	".. of arrayrefs");
is ($revmap->[0][0],		1,		".. revision 1");
is ($revmap->[0][1],		"4.1",		".. version  4.1");
is ($revmap->[69][0],		70,		".. revision 70");
is ($revmap->[69][1],		"5.39",		".. version  5.39");

is (length ($sccs->body ()),		261840,	"body ()      scalar");
is (length ($sccs->body (0)),		261840,	"body (0)     scalar");
is (length ($sccs->body ("")),		261840,	"body ('')    scalar");
is (length ($sccs->body (2)),		160788,	"body (2)     scalar");
is (length ($sccs->body ("4.2")),	160788,	"body ('4.2') scalar");

my @body;
ok (@body = $sccs->body (),			"body ()      list");
is ($#body,			6484,		".. 6484 lines");
ok (@body = $sccs->body ("4.2"),		"body ('4.2') list");
is ($#body,			4237,		".. 4237 lines");