view Lib/IMPL/Test.pm @ 159:f8de52d3c112

IMPL::Test::Unit minor changes
author wizard
date Mon, 27 Dec 2010 01:37:44 +0300
parents e568c7c8b743
children 76515373dac0
line wrap: on
line source

package IMPL::Test;
use strict;
use warnings;

require IMPL::Test::SkipException;

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(&test &shared &failed &cmparray &skip &run_plan);

require IMPL::Test::Unit;
require IMPL::Test::Plan;
require IMPL::Test::TAPListener;
use IMPL::Class::Member;

sub test($$) {
    my ($name,$code) = @_;
    my $class = caller;
    
    $class->set_meta(
        new IMPL::Test::Unit::TestInfo( $name, $code )
    );
}

sub shared($) {
    my ($propInfo) = @_;
    
    my $class = caller;
    
    die new IMPL::Exception("Only properties could be declared as shared",$propInfo->Name) unless eval {$propInfo->isa('IMPL::Class::PropertyInfo')};
    die new IMPL::Exception("You can't mark the readonly property as shared",$propInfo->Name) unless $propInfo->canSet;
    die new IMPL::Exception("Only public properties could be declared as shared",$propInfo->Name) unless $propInfo->Access == IMPL::Class::Member::MOD_PUBLIC;
    
    $class->set_meta(new IMPL::Test::Unit::SharedData($propInfo->Name));
}

sub failed($;@) {
    die new IMPL::Test::FailException(@_);
}

sub skip($;@) {
	die new IMPL::Test::SkipException(@_);
}

sub cmparray {
    my ($a,$b) = @_;
    
    return 0 unless @$a == @$b;
    
    for (my $i=0; $i < @$a; $i++ ) {
        return 0 unless $a->[$i] eq $b->[$i];
    }
    
    return 1;
}

sub run_plan {
	my (@units) = @_;
	
	my $plan = new IMPL::Test::Plan(@units);
	
	$plan->Prepare;
	$plan->AddListener(new IMPL::Test::TAPListener);
	$plan->Run;
}
1;