_expect and other little tweaks
[p5sagit/p5-mst-13.2.git] / t / test.pl
1 #
2 # t/test.pl - most of Test::More functionality without the fuss
3 #
4
5 my $test = 1;
6 my $planned;
7
8 sub plan {
9     my $n;
10     if (@_ == 1) {
11         $n = shift;
12     } else {
13         my %plan = @_;
14         $n = $plan{tests}; 
15     }
16     print "1..$n\n";
17     $planned = $n;
18 }
19
20 END {
21     my $ran = $test - 1;
22     if (defined $planned && $planned != $ran) {
23         print "# Looks like you planned $planned tests but ran $ran.\n";
24     }
25 }
26
27 sub skip_all {
28     if (@_) {
29         print "1..0 - @_\n";
30     } else {
31         print "1..0\n";
32     }
33     exit(0);
34 }
35
36 sub _ok {
37     my ($pass, $where, @mess) = @_;
38     # Do not try to microoptimize by factoring out the "not ".
39     # VMS will avenge.
40     if (@mess) {
41         print $pass ? "ok $test - @mess\n" : "not ok $test - @mess\n";
42     } else {
43         print $pass ? "ok $test\n" : "not ok $test\n";
44     }
45     unless ($pass) {
46         print "# Failed $where\n";
47     }
48     $test++;
49
50     return $pass;
51 }
52
53 sub _where {
54     my @caller = caller(1);
55     return "at $caller[1] line $caller[2]";
56 }
57
58 sub ok {
59     my ($pass, @mess) = @_;
60     _ok($pass, _where(), @mess);
61 }
62
63 sub is {
64     my ($got, $expected, @mess) = @_;
65     my $pass = $got eq $expected;
66     unless ($pass) {
67         unshift(@mess, "\n",
68                 "#      got '$got'\n",
69                 "# expected '$expected'\n");
70     }
71     _ok($pass, _where(), @mess);
72 }
73
74 # Note: this isn't quite as fancy as Test::More::like().
75 sub like {
76     my ($got, $expected, @mess) = @_;
77     my $pass;
78     if (ref $expected eq 'Regexp') {
79         $pass = $got =~ $expected;
80         unless ($pass) {
81             unshift(@mess, "\n",
82                     "#      got '$got'\n");
83         }
84     } else {
85         $pass = $got =~ /$expected/;
86         unless ($pass) {
87             unshift(@mess, "\n",
88                     "#      got '$got'\n",
89                     "# expected /$expected/\n");
90         }
91     }
92     _ok($pass, _where(), @mess);
93 }
94
95 sub pass {
96     _ok(1, '', @_);
97 }
98
99 sub fail {
100     _ok(0, _where(), @_);
101 }
102
103 # Note: can't pass multipart messages since we try to
104 # be compatible with Test::More::skip().
105 sub skip {
106     my $mess = shift;
107     my $n    = @_ ? shift : 1;
108     for (1..$n) {
109         ok(1, "# skip:", $mess);
110     }
111     local $^W = 0;
112     last SKIP;
113 }
114
115 sub eq_array {
116     my ($ra, $rb) = @_;
117     return 0 unless $#$ra == $#$rb;
118     for my $i (0..$#$ra) {
119         return 0 unless $ra->[$i] eq $rb->[$i];
120     }
121     return 1;
122 }
123
124 sub require_ok {
125     my ($require) = @_;
126     eval <<REQUIRE_OK;
127 require $require;
128 REQUIRE_OK
129     _ok(!$@, _where(), "require $require");
130 }
131
132 sub use_ok {
133     my ($use) = @_;
134     eval <<USE_OK;
135 use $use;
136 USE_OK
137     _ok(!$@, _where(), "use $use");
138 }
139
140 1;