Mercurial > pub > Impl
diff lib/IMPL/Test.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/IMPL/Test.pm Fri Sep 04 19:40:23 2015 +0300 @@ -0,0 +1,104 @@ +package IMPL::Test; +use strict; +use warnings; + +use IMPL::lang qw(equals_s); +use IMPL::Const qw(:access); +require IMPL::Test::SkipException; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(&test &shared &failed &cmparray &skip &run_plan &assert &assertarray &GetCallerSourceLine); + +require IMPL::Test::Unit; +require IMPL::Test::Plan; +require IMPL::Test::TAPListener; + +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->setter; + die new IMPL::Exception("Only public properties could be declared as shared",$propInfo->name) unless $propInfo->access == ACCESS_PUBLIC; + + $class->set_meta(new IMPL::Test::Unit::SharedData($propInfo->name)); +} + +sub failed($;@) { + die new IMPL::Test::FailException(@_); +} + +sub assert { + my ($condition,@params) = @_; + + die new IMPL::Test::FailException(@params ? @params : ("Assertion failed" , _GetSourceLine( (caller)[1,2] )) ) unless $condition; +} + +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 + equals_s($a->[$i], $b->[$i]); + } + + return 1; +} + +sub assertarray { + my ($a,$b) = @_; + + + die IMPL::Test::FailException->new( + "Assert arrays failed", + _GetSourceLine( (caller)[1,2] ), + join(', ', map defined($_) ? $_ : '<undef>', @$a), + join(', ', map defined($_) ? $_ : '<undef>', @$b) + ) + unless cmparray($a,$b); +} + +sub _GetSourceLine { + my ($file,$line) = @_; + + open my $hFile, $file or return "failed to open file: $file: $!"; + + my $text; + $text = <$hFile> for ( 1 .. $line); + chomp $text; + $text =~ s/^\s+//; + return "line $line: $text"; +} + +sub GetCallerSourceLine { + my $line = shift || 0; + return _GetSourceLine( (caller($line + 1))[1,2] ) +} + +sub run_plan { + my (@units) = @_; + + my $plan = new IMPL::Test::Plan(@units); + + $plan->Prepare; + $plan->AddListener(new IMPL::Test::TAPListener); + $plan->Run; +} +1;