# New Ticket Created by  Vasily Chekalkin 
# Please include the string:  [perl #55438]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=55438 >


Hello.

There is patched Test.pm which allows unittest it. Provide method to 
override 'proclaim()' from external program to check it invocation.

Also attached 'test.t' for it. I just don't know best place for this test.

And whole Test.pm just in case :)

-- 
Bacek.
diff --git a/languages/perl6/Test.pm b/languages/perl6/Test.pm
index 5cb04ae..e113af7 100644
--- a/languages/perl6/Test.pm
+++ b/languages/perl6/Test.pm
@@ -14,9 +14,16 @@ our $todo_reason = '';
 # for running the test suite multiple times in the same process
 our $testing_started;
 
+# for unittesting of Test.pm we override 'proclaim'
+our &proclaim := &real_proclaim;
+
+sub set_proclaim($proc) {
+	&proclaim := $proc;
+}
 
 ## test functions
 
+
 # Compare numeric values with approximation
 sub approx ($x, $y) {
     my $epsilon = 0.00001;
@@ -33,14 +40,14 @@ sub plan($number_of_tests) {
 
 
 multi sub ok($cond, $desc) {
-    proclaim($cond, $desc);
+    &proclaim($cond, $desc);
 }
 
 multi sub ok($cond) { ok($cond, ''); }
 
 
 multi sub nok($cond, $desc) {
-    proclaim(!$cond, $desc);
+    &proclaim(!$cond, $desc);
 }
 
 multi sub nok($cond) { nok(!$cond, ''); }
@@ -48,7 +55,7 @@ multi sub nok($cond) { nok(!$cond, ''); }
 
 multi sub is($got, $expected, $desc) {
     my $test = $got eq $expected;
-    proclaim($test, $desc);
+    &proclaim($test, $desc);
 }
 
 multi sub is($got, $expected) { is($got, $expected, ''); }
@@ -56,14 +63,14 @@ multi sub is($got, $expected) { is($got, $expected, ''); }
 
 multi sub isnt($got, $expected, $desc) {
     my $test = !($got eq $expected);
-    proclaim($test, $desc);
+    &proclaim($test, $desc);
 }
 
 multi sub isnt($got, $expected) { isnt($got, $expected, ''); }
 
 multi sub is_approx($got, $expected, $desc) {
     my $test = abs($got - $expected) <= 0.00001;
-    proclaim($test, $desc);
+    &proclaim($test, $desc);
 }
 
 multi sub is_approx($got, $expected) { is_approx($got, $expected, ''); }
@@ -78,11 +85,11 @@ multi sub todo($reason) {
     $todo_reason = '# TODO ' ~ $reason;
 }
 
-multi sub skip()                { proclaim(1, "# SKIP"); }
-multi sub skip($reason)         { proclaim(1, "# SKIP " ~ $reason); }
+multi sub skip()                { &proclaim(1, "# SKIP"); }
+multi sub skip($reason)         { &proclaim(1, "# SKIP " ~ $reason); }
 multi sub skip($count, $reason) {
     for 1..$count {
-        proclaim(1, "# SKIP " ~ $reason);
+        &proclaim(1, "# SKIP " ~ $reason);
     }
 }
 
@@ -97,16 +104,20 @@ multi sub skip_rest($reason) {
 sub diag($message) { say '# '~$message; }
 
 
-multi sub flunk($reason) { proclaim(0, "flunk $reason")}
+multi sub flunk($reason) { &proclaim(0, "flunk $reason")}
 
 
 sub isa_ok($var,$type) { ok($var.isa($type), "The object is-a '$type'"); }
 
 multi sub dies_ok($closure, $reason) {
+	our $died = 1;
     try {
         $closure();
+		$died = 0;
     }
-    proclaim((defined $!), $reason);
+	# This line is to avoid bug in rakudo. We'll remove it
+	$died = 0 + $died;
+    &proclaim($died, $reason);
 }
 multi sub dies_ok($closure) {
     dies_ok($closure, '');
@@ -115,22 +126,24 @@ multi sub dies_ok($closure) {
 multi sub lives_ok($closure, $reason) {
     try {
         $closure();
+		&proclaim(1, $reason);
     }
-    proclaim((not defined $!), $reason);
 }
 multi sub lives_ok($closure) {
     lives_ok($closure, '');
 }
 
 multi sub eval_dies_ok($code, $reason) {
-    proclaim((defined eval_exception($code)), $reason);
+	eval($code);
+    &proclaim(defined($!), $reason);
 }
 multi sub eval_dies_ok($code) {
     eval_dies_ok($code, '');
 }
 
 multi sub eval_lives_ok($code, $reason) {
-    proclaim((not defined eval_exception($code)), $reason);
+	eval($code);
+    &proclaim(!(defined $!), $reason);
 }
 multi sub eval_lives_ok($code) {
     eval_lives_ok($code, '');
@@ -139,13 +152,7 @@ multi sub eval_lives_ok($code) {
 
 ## 'private' subs
 
-sub eval_exception($code) {
-    my $eval_exception;
-    try { eval ($code); $eval_exception = $! }
-    $eval_exception // $!;
-}
-
-sub proclaim($cond, $desc) {
+sub real_proclaim($cond, $desc) {
     $testing_started  = 1;
     $num_of_tests_run = $num_of_tests_run + 1;
 
# Copyright (C) 2007, The Perl Foundation.
# $Id$

## This is a temporary Test.pm to get us started until we get pugs's Test.pm
## working. It's shamelessly stolen & adapted from MiniPerl6 in the pugs repo.

# globals to keep track of our tests
our $num_of_tests_run = 0;
our $num_of_tests_failed = 0;
our $num_of_tests_planned;
our $todo_upto_test_num = 0;
our $todo_reason = '';

# for running the test suite multiple times in the same process
our $testing_started;

# for unittesting of Test.pm we override 'proclaim'
our &proclaim := &real_proclaim;

sub set_proclaim($proc) {
	&proclaim := $proc;
}

## test functions


# Compare numeric values with approximation
sub approx ($x, $y) {
    my $epsilon = 0.00001;
    my $diff = abs($x - $y);
    ($diff < $epsilon);
}

sub plan($number_of_tests) {
    $testing_started      = 1;
    $num_of_tests_planned = $number_of_tests;

    say '1..' ~ $number_of_tests;
}


multi sub ok($cond, $desc) {
    &proclaim($cond, $desc);
}

multi sub ok($cond) { ok($cond, ''); }


multi sub nok($cond, $desc) {
    &proclaim(!$cond, $desc);
}

multi sub nok($cond) { nok(!$cond, ''); }


multi sub is($got, $expected, $desc) {
    my $test = $got eq $expected;
    &proclaim($test, $desc);
}

multi sub is($got, $expected) { is($got, $expected, ''); }


multi sub isnt($got, $expected, $desc) {
    my $test = !($got eq $expected);
    &proclaim($test, $desc);
}

multi sub isnt($got, $expected) { isnt($got, $expected, ''); }

multi sub is_approx($got, $expected, $desc) {
    my $test = abs($got - $expected) <= 0.00001;
    &proclaim($test, $desc);
}

multi sub is_approx($got, $expected) { is_approx($got, $expected, ''); }

multi sub todo($reason, $count) {
    $todo_upto_test_num = $num_of_tests_run + $count;
    $todo_reason = '# TODO ' ~ $reason;
}

multi sub todo($reason) {
    $todo_upto_test_num = $num_of_tests_run + 1;
    $todo_reason = '# TODO ' ~ $reason;
}

multi sub skip()                { &proclaim(1, "# SKIP"); }
multi sub skip($reason)         { &proclaim(1, "# SKIP " ~ $reason); }
multi sub skip($count, $reason) {
    for 1..$count {
        &proclaim(1, "# SKIP " ~ $reason);
    }
}

multi sub skip_rest() {
    skip($num_of_tests_planned - $num_of_tests_run, "");
}

multi sub skip_rest($reason) {
    skip($num_of_tests_planned - $num_of_tests_run, $reason);
}

sub diag($message) { say '# '~$message; }


multi sub flunk($reason) { &proclaim(0, "flunk $reason")}


sub isa_ok($var,$type) { ok($var.isa($type), "The object is-a '$type'"); }

multi sub dies_ok($closure, $reason) {
	our $died = 1;
    try {
        $closure();
		$died = 0;
    }
	# This line is to avoid bug in rakudo. We'll remove it
	$died = 0 + $died;
    &proclaim($died, $reason);
}
multi sub dies_ok($closure) {
    dies_ok($closure, '');
}

multi sub lives_ok($closure, $reason) {
    try {
        $closure();
		&proclaim(1, $reason);
    }
}
multi sub lives_ok($closure) {
    lives_ok($closure, '');
}

multi sub eval_dies_ok($code, $reason) {
	eval($code);
    &proclaim(defined($!), $reason);
}
multi sub eval_dies_ok($code) {
    eval_dies_ok($code, '');
}

multi sub eval_lives_ok($code, $reason) {
	eval($code);
    &proclaim(!(defined $!), $reason);
}
multi sub eval_lives_ok($code) {
    eval_lives_ok($code, '');
}


## 'private' subs

sub real_proclaim($cond, $desc) {
    $testing_started  = 1;
    $num_of_tests_run = $num_of_tests_run + 1;

    unless $cond {
        print "not ";
        $num_of_tests_failed = $num_of_tests_failed + 1
            unless  $num_of_tests_run <= $todo_upto_test_num;
    }
    print "ok ", $num_of_tests_run, " - ", $desc;
    if $todo_reason and $num_of_tests_run <= $todo_upto_test_num {
        print $todo_reason;
    }
    print "\n";
}

END {
    # until END blocks can access compile-time symbol tables of outer scopes,
    #  we need these declarations
    our $testing_started;
    our $num_of_tests_planned;
    our $num_of_tests_run;
    our $num_of_tests_failed;

    if ($testing_started and $num_of_tests_planned != $num_of_tests_run) {  ##Wrong quantity of tests
        diag("Looks like you planned $num_of_tests_planned tests, but ran $num_of_tests_run");
    }
    if ($testing_started and $num_of_tests_failed) {
        diag("Looks like you failed $num_of_tests_failed tests of $num_of_tests_run");
    }
}

Reply via email to