#!/usr/local/bin/perl -w

=head1 NAME

00rev.t - testing of VCP::Rev services

=cut

use strict ;

use Carp ;
use Test ;
use VCP::Rev ;
use VCP::Utils qw( empty );

## TODO: Add lots of tests to 00rev.t

my $r ;

my @tests = (
## Test some utility functions first
sub { ok join( ",", VCP::Rev->split_id( "1"       ) ), "1"       },
sub { ok join( ",", VCP::Rev->split_id( "1a"      ) ), "1,a"     },
sub { ok join( ",", VCP::Rev->split_id( "1.2"     ) ), "1,,2"    },
sub { ok join( ",", VCP::Rev->split_id( "1a.2"    ) ), "1,a,2"   },
sub { ok join( ",", VCP::Rev->split_id( "1a.2b"   ) ), "1,a,2,b" },

sub { ok( VCP::Rev->cmp_id( [qw( 1 a 2 )], [qw( 1 b 1 )] ) < 0 ) },
sub { ok( VCP::Rev->cmp_id( "1a2", "1b1" ) < 0 ) },
sub { ok( VCP::Rev->cmp_id( [qw( 1 a 2 )], [qw( 1 a 1 )] ) > 0 ) },
sub { ok( VCP::Rev->cmp_id( [qw( 1 b 2 )], [qw( 1 a 1 )] ) > 0 ) },
sub { ok( VCP::Rev->cmp_id( [qw( 10 )],    [qw( 1 )] ) > 0 ) },

## now test methods
sub { $r = VCP::Rev->new() ; ok( ref $r, "VCP::Rev" ) },

( map {
      my $field = lc $_;
      (
         sub {
            ok ! defined $r->$field, 1, "! defined $field";
         },
         sub {
            $r->$field( 10 );
            ok $r->$field, 10, "$field";
         },
         sub {
            $r->$field( undef );
            ok ! defined $r->$field, 1, "! defined $field #2";
         },
      );
   } (
   ## 'ID',  ## this has a default value, tested below
   'NAME',
   'SOURCE_NAME',
   'SOURCE_FILEBRANCH_ID',
   'SOURCE_REPO_ID',
   'TYPE',
   'BRANCH_ID',
   'SOURCE_BRANCH_ID',
   'REV_ID',
   'SOURCE_REV_ID',
   'CHANGE_ID',
   'SOURCE_CHANGE_ID',
   'P4_INFO',
   'CVS_INFO',
   'TIME',
   'MOD_TIME',
   'USER_ID',
   #'LABELS',  ## different beast, tested below
   'COMMENT',
   'ACTION',
   'PREVIOUS_ID',
   'WORK_PATH',
   'DEST_WORK_PATH',
   'VCP_SOURCE_SCM_FN',
   # 'PREVIOUS', ## Different
   'AVG_COMMENT_TIME',
   'SORT_TIME',
   'IS_FOUNDING_REV',
   )
),

sub { ok ! $r->labels },

sub {
   $r->add_label( "l1" ) ;
   ok( join( ",", $r->labels ), "l1" ) ;
},

sub {
   $r->add_label( "l2", "l3" ) ;
   ok( join( ",", $r->labels ), "l1,l2,l3" ) ;
},

sub {
   $r->add_label( "l2", "l3" ) ;
   ok( join( ",", $r->labels ), "l1,l2,l3" ) ;
},

sub {
   $r->set_labels( [ "l4", "l5" ] ) ;
   ok( join( ",", $r->labels ), "l4,l5" ) ;
},

sub {
   $r->name( "foo" );
   $r->source_rev_id( "1" );
   ok $r->id, "foo#1";
},

sub {
   ok ! defined $r->previous;
},

sub {
   $r->previous( VCP::Rev->new );
   ok ref $r->previous;
},

sub {
   $r->previous( VCP::Rev->new );
   ok UNIVERSAL::isa( $r->previous, "VCP::Rev" );
},

sub {
   $r->previous( undef );
   ok ! defined $r->previous;
},

## now test setting a few things in the ctor
sub {
   $r = VCP::Rev->new(
      name   => "Name",
      labels => [ "l1", "l2" ],
      type   => "Type",
   );
   ok ref $r, "VCP::Rev";
},

sub { ok $r->name, "Name" },
sub { ok join( ",", $r->labels ), "l1,l2" },
sub { ok $r->type, "Type" },
sub { ok ! defined $r->user_id, 1, "! defined user_id" },
sub { ok ! defined $r->comment, 1, "! defined comment" },
sub { ok ! defined $r->vcp_source_scm_fn, 1, "! defined vcp_source_scm_fn" },

) ;

plan tests => scalar( @tests ) ;

$_->() for @tests ;
