#!/usr/bin/perl

use Carp;
use Manager;
use Employee;

$| = 1;
my $testno = 1;
print "1..47\n";

alarm(5) unless $^P;

my $p1 = Manager->new();
ok($p1);
ok(! defined($p1->name));
ok(! defined($p1->age));
ok(! defined($p1->spouse));
my $p2 = Manager->new("N2");
ok($p2);
ok($p2->name, "N2");
ok(! defined($p2->age));
ok(! defined($p2->spouse));
my $p3 = Manager->new("N3", 30);
ok($p3);
ok($p3->name, "N3");
ok($p3->age, 30);
ok(! defined($p3->spouse));

$p1->name("N1");
ok($p1->name, "N1");
$p2->name("NN2");
ok($p2->name, "NN2");

$p2->age("22");
ok($p2->age, "22");
$p3->age("33");
ok($p3->age, "33");

ok(! defined($p1->spouse));
ok(! defined($p2->spouse));
ok(! defined($p3->spouse));

$p2->spouse($p3);
ok($p2->spouse->name, $p3->name);
ok($p3->spouse->name, $p2->name);
ok(! defined($p1->spouse));

$p2->spouse($p1);
$p1->age(31);
ok($p2->spouse->name, $p1->name);
ok($p1->spouse->name, $p2->name);
ok(! defined($p3->spouse));

ok($p1->as_string, "Manager  N1 is 31 years old and is married to NN2"); 
ok($p2->as_string, "Manager  NN2 is 22 years old and is married to N1"); 
ok($p3->as_string, "Manager  N3 is 33 years old"); 

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

ok(! defined $p1->department);
ok(! defined $p2->department);
ok(! defined $p3->department);
$p2->department('Finance');
$p2->boss($p1);
ok($p2->department, 'Finance');
ok($p2->boss, $p1);

$p3->department('Finance');
$p3->boss($p2);
ok($p3->department, 'Finance');
ok($p3->boss, $p2);

my $p4 = Employee->new();
$p4->department('Programming');
$p4->boss($p2);
ok($p4->department, 'Programming');
ok($p4->boss, $p2);

ok($p1->is_important);
ok($p2->is_important);
ok(! $p3->is_important);
ok($p4->is_important);

lok([$p1->team], [$p2]);
lok([$p2->team], [$p3, $p4]);
# lok([$p3->team], []);
# lok([$p4->team], []);

$p1->team_add($p3);
lok([$p1->team], [$p2, $p3]);
ok($p3->boss, $p2);

$p1->team_remove($p2);
lok([$p1->team], [$p3]);
ok($p2->boss, $p1);

sub lok {
  my ($l1, $l2) = @_;
  return ok(0) unless @$l1 == @$l2;
  if (@$l1 == 0) {
    return ok(1);
  } elsif (@$l1 == 1) {
    return ok($l1->[0], $l2->[0]) ;
  } elsif (@$l1 == 2) {
    return ok($l1->[0] eq $l2->[0] && $l1->[1] eq $l2->[1] 
	      || 
	      $l1->[0] eq $l2->[1] && $l1->[1] eq $l2->[0] 
	      );
  } else {
    croak "Comparison of large arrays unsupported";
  }
}

sub ok {
  if (@_ == 1) {
    print "not " unless $_[0];
    print "ok ", $testno++;
    if (! $_[0]) {
      my $n = 1;
      my ($l) = 'lok';
      $l = (caller($n))[2] while $l =~ /ok$/;
      print " # at line $l";
    }
    print "\n";
  } elsif (@_ == 2) {
    my ($ac, $ex) = @_;
    my $bad = ($ex ne $ac);
    print "not " if $bad;
    print "ok ", $testno++;
    if ($bad) {
      for ($ex, $ac) { tr/\n//d } 
      print " # expected '$ex'; received '$ac'";
    }
    print "\n";
  } else {
    croak "Usage: ok(success?) or ok(actual, expected)";
  }
}
