File Coverage

blib/lib/Test/Extreme.pm
Criterion Covered Total %
statement 315 351 89.7
branch 26 36 72.2
condition n/a
subroutine 54 65 83.0
pod 0 41 0.0
total 395 493 80.1


line stmt bran cond sub pod time code
1             package Test::Extreme;
2              
3 1     1   697 use 5.012004;
  1         3  
  1         40  
4 1     1   5 use strict;
  1         2  
  1         26  
5 1     1   5 use warnings;
  1         5  
  1         38  
6              
7 1     1   4 use Carp;
  1         2  
  1         1368  
8              
9             require Exporter;
10              
11             our @ISA = qw(Exporter);
12             our @EXPORT = qw(
13             assert
14             assert_true
15             assert_false
16             assert_passed
17             assert_failed
18             assert_some
19             assert_none
20             assert_is_array
21             assert_equals
22             assert_contains
23             assert_subset
24             assert_is_array
25             assert_is_hash
26             assert_size
27             assert_keys
28             assert_is_string
29             run_tests
30             run_tests_as_script
31             );
32              
33             our $VERSION = '1.01';
34              
35              
36             sub assert($) {
37 247 100   247 0 466 if ($_[0]) { return; }
  215         385  
38 32 50       86 if (defined($@)) { confess "Assertion failed.\n$@"; undef $@; }
  32         10306  
  0         0  
39 0         0 else { confess "Assertion failed.\n"; }
40             }
41              
42 218     218 0 370 sub assert_true($) { assert $_[0] }
43 28     28 0 51 sub assert_false($) { assert ! $_[0] }
44 23     23 0 41 sub assert_passed() { assert_false $@ }
45 33     33 0 79 sub assert_failed() { assert_true $@ }
46 2     2 0 7 sub assert_some($) { assert_true $_[0] }
47 3     3 0 8 sub assert_none($) { assert_false $_[0] }
48              
49 157     157 0 310 sub assert_equals_string($$) { assert_true($_[0] eq $_[1]) }
50              
51             sub assert_is_array($);
52              
53             sub assert_equals_array($$) {
54 17     17 0 25 my ($list0, $list1) = @_;
55 17         34 assert_is_array $list0;
56 16         33 assert_is_array $list1;
57 15         39 assert_equals_string scalar @$list0, scalar @$list1;
58 11         36 for (my $i = 0 ; $i < @$list0 ; ++$i) {
59 23         55 assert_equals( $list0->[$i], $list1->[$i] );
60             }
61             }
62              
63             sub assert_equals_hash($$) {
64 7     7 0 15 my ($hash0, $hash1) = @_;
65 7         36 assert_equals_string scalar keys %$hash0, scalar keys %$hash1;
66 4         7 for my $key (keys %{$hash0}) {
  4         11  
67 8         15 assert_true exists $hash1->{$key};
68 8         18 assert_equals($hash0->{$key}, $hash1->{$key});
69             }
70             }
71              
72             sub assert_equals($$) {
73 150 100   150 0 440 assert_equals_string $_[0], $_[1] if ref $_[0] eq '';
74 132 100       307 assert_equals_array $_[0], $_[1] if ref $_[0] eq 'ARRAY';
75 129 100       320 assert_equals_hash $_[0], $_[1] if ref $_[0] eq 'HASH';
76             }
77              
78             sub assert_contains($$) {
79 14     14 0 21 my ($element, $list) = @_;
80 14         25 assert_equals "", ref $element;
81 14         32 assert_equals "ARRAY", ref $list;
82 14         24 eval { assert_true grep { $_ eq $element } @$list } ;
  14         22  
  142         235  
83 14 100       1192 if ($@) {
84 4         35 my $list_text = "[" . join(" " => @$list) . "]";
85 4         654 confess "Did not find $element in $list_text.\n$@" ;
86             }
87             }
88              
89             sub assert_subset($$) {
90 6     6 0 13 my ($list1, $list2) = @_;
91 6         19 assert_equals "ARRAY", ref $list1;
92 6         17 assert_equals "ARRAY", ref $list2;
93 6         11 for my $element (@$list1)
94 10         21 { assert_contains $element, $list2 }
95             }
96              
97 46     46 0 110 sub assert_is_array($) { assert_equals 'ARRAY', ref $_[0] }
98              
99 11     11 0 57 sub assert_is_hash($) { assert_equals 'HASH', ref $_[0] }
100              
101             sub assert_size($$) {
102 5     5 0 9 my ($size, $array) = @_;
103 5         9 assert_is_array $array;
104 3         7 assert_equals $size, scalar @$array
105             }
106              
107             sub assert_keys($$) {
108 8     8 0 15 my ($keys, $hash) = @_;
109 8         14 assert_is_hash $hash;
110 5         13 assert_is_array $keys;
111 5         11 my @actual_keys = sort keys %{$hash};
  5         24  
112 5         15 my @expected_keys = sort @$keys;
113 5         11 assert_equals \@expected_keys, \@actual_keys
114             }
115              
116             sub assert_is_string($) {
117 3     3 0 6 my ($string) = @_;
118 3         8 assert_equals '', ref $string;
119 1         4 assert ($string =~ /\S/)
120             }
121              
122             sub _list_symbols {
123 1     1   7 use vars qw /$symbol $sym @sym %sym/;
  1         2  
  1         110  
124              
125 7     7   13 my $pkg = shift;
126 7         11 my $prefix = shift;
127              
128 1     1   5 no strict 'refs';
  1         2  
  1         41  
129 7         11 my %pkg_keys = %{$pkg};
  7         800  
130 1     1   5 use strict;
  1         8  
  1         2270  
131              
132 7         43 my $symbols = [];
133 7         70 foreach $symbol (keys %pkg_keys) {
134 499 100       1721 next if $symbol !~ /^[\:\w]+$/s; # Skip if not-word
135 257         458 my $symbol_path = $prefix . $pkg . $symbol ;
136             # Need this because Perl 5.12 deprecates defined on hash
137 257 100       437 if ($prefix eq '%') {
138 94 100       4344 push @$symbols, $symbol if eval qq[!!($symbol_path)];
139             } else {
140 163 100       7552 push @$symbols, $symbol if eval qq[ defined($symbol_path) ];
141             }
142             }
143 7         157 @$symbols = sort @$symbols;
144 7         218 return $symbols;
145             }
146              
147 6     6   18 sub _list_subs($) { return _list_symbols shift, '&' }
148              
149             sub _list_packages($) {
150 1     1   4 my $list = _list_symbols shift, '%' ;
151 1         4 @$list = grep { /::$/ } @$list ;
  60         205  
152 1         7 return $list;
153             }
154              
155             sub _list_tests($) {
156 3     3   10 my ($pkg) = @_;
157 3         7 my $list = _list_subs $pkg;
158 3         10 @$list = map { $pkg . $_ } grep { /^_*[tT]est/ } @$list ;
  22         52  
  70         152  
159 3         18 return $list;
160             }
161              
162             sub _execute_tests($$$) {
163 2     2   5 my ($all_tests, $failure_messages, $output) = @_;
164 2         5 for my $test (@$all_tests) {
165 1     1   10 no strict 'refs';
  1         2  
  1         51  
166 21         28 eval { &{$test} };
  21         23  
  21         85  
167 1     1   5 use strict;
  1         3  
  1         3595  
168 21 100       285 if ($@) {
169 1 50       5 print "F" if $output;
170 1         5 $failure_messages->{$test} = $@;
171             }
172 20 50       52 else { print "." if $output }
173             }
174 2 50       7 print "\n" if $output;
175             }
176              
177             sub _print_failure_messages($$) {
178 0     0   0 my ($all_tests, $failure_messages) = @_;
179 0         0 for my $test (sort keys %{$failure_messages}) {
  0         0  
180 0         0 print "$test: $failure_messages->{$test}"
181             }
182 0         0 print "\n";
183 0         0 my $test_count = scalar @$all_tests;
184 0         0 my $fail_count = scalar keys %{$failure_messages};
  0         0  
185 0         0 my $pass_count = $test_count - $fail_count;
186 0 0       0 my $test_or_tests = $test_count == 1 ? "test" : "tests";
187 0 0       0 if ($fail_count == 0) {
188 0         0 print "OK ($test_count $test_or_tests)\n"
189             }
190             else {
191 0         0 print "Failures!!!\n\n";
192 0         0 print "Runs: $test_count, Passes: $pass_count, Fails: $fail_count\n";
193             }
194 0         0 print "\n";
195             }
196              
197             sub run_tests {
198 0     0 0 0 my @pkgs = map { $_ . "::" } ( 'main' , @_);
  0         0  
199 0         0 my $all_tests = [];
200 0         0 for my $pkg (@pkgs) { push @$all_tests, @{ _list_tests $pkg }; }
  0         0  
  0         0  
201              
202 0         0 my $failure_messages = {};
203 0         0 _execute_tests $all_tests, $failure_messages, 1;
204 0         0 _print_failure_messages $all_tests, $failure_messages;
205             }
206              
207             sub run_tests_as_script {
208 1     1 0 11 my @pkgs = map { $_ . "::" } ( 'main' , @_);
  2         8  
209 1         3 my $all_tests = [];
210 1         4 for my $pkg (@pkgs) { push @$all_tests, @{ _list_tests $pkg }; }
  2         4  
  2         9  
211              
212 1         3 my $failure_messages = {};
213 1         6 _execute_tests $all_tests, $failure_messages, 0;
214              
215 1         11 print "1..", scalar @$all_tests, "\n";
216 1         6 for (my $i = 0 ; $i < @$all_tests ; ++$i) {
217 19         31 my $test = $all_tests->[$i];
218 19 50       32 print "not "
219             if exists $failure_messages->{$test};
220 19         41 print "ok ", 1 + $i;
221 0         0 print "\n", join "\n" =>
222 19 50       37 map { "# " . $_ ; }
223             split /\n/, $test . ": " . $failure_messages->{$test}
224             if exists $failure_messages->{$test};
225 19         42 print "\n";
226             }
227             }
228              
229              
230             #-----------------------------------------------------------------
231             # TESTS BEGIN
232             #-----------------------------------------------------------------
233              
234             sub test_assert_true() {
235 1     1 0 3 eval { assert_true 1 } ; assert_passed ;
  1         3  
  1         4  
236 1         1 eval { assert_true 0 } ; assert_failed ;
  1         3  
  1         112  
237             }
238              
239             sub test_assert_false() {
240 1     1 0 2 eval { assert_false 1 } ; assert_failed ;
  1         2  
  1         107  
241 1         2 eval { assert_false 0 } ; assert_passed ;
  1         3  
  1         3  
242             }
243              
244             sub test_assert_some() {
245 1     1 0 2 eval { assert_some 1 } ; assert_passed ;
  1         3  
  1         4  
246 1         2 eval { assert_some 0 } ; assert_failed ;
  1         2  
  1         122  
247             }
248              
249             sub test_assert_none() {
250 1     1 0 2 eval { assert_none 1 } ; assert_failed ;
  1         4  
  1         117  
251 1         1 eval { assert_none 0 } ; assert_passed ;
  1         4  
  1         3  
252             }
253              
254             sub test_assert_equals() {
255 1     1 0 2 eval { assert_equals 'a', 'a' } ; assert_passed ;
  1         5  
  1         4  
256 1         2 eval { assert_equals 'a', 'b' } ; assert_failed ;
  1         3  
  1         120  
257             }
258              
259             sub test_assert_equals_array() {
260 1     1 0 2 eval { Test::Extreme::assert_equals_array [ 'a', 'b' ], ['a', 'b'] } ; assert_passed ;
  1         6  
  1         4  
261 1         2 eval { Test::Extreme::assert_equals_array [ 'a', 'b' ], ['b', 'a'] } ; assert_failed ;
  1         5  
  1         268  
262              
263 1         2 eval { Test::Extreme::assert_equals_array [ 'a' ], ['a', 'a'] } ; assert_failed ;
  1         5  
  1         301  
264 1         2 eval { Test::Extreme::assert_equals_array [ 'a', 'b' ], ['a'] } ; assert_failed ;
  1         5  
  1         270  
265              
266 1         2 eval { Test::Extreme::assert_equals_array 'a', [ 'a' ] } ; assert_failed ;
  1         5  
  1         242  
267 1         2 eval { Test::Extreme::assert_equals_array [ 'a' ], 'a' } ; assert_failed ;
  1         5  
  1         256  
268             }
269              
270             sub test_assert_equals_hash() {
271 1     1 0 3 eval { Test::Extreme::assert_equals_hash { k1=>'v1', k2=>'v2' }, { k1=>'v1', k2=>'v2' } } ; assert_passed ;
  1         8  
  1         6  
272 1         2 eval { Test::Extreme::assert_equals_hash { k1=>'v1', k2=>'v2' }, { k1=>'v1', k2=>'v3' } } ; assert_failed ;
  1         6  
  1         305  
273              
274 1         1 eval { Test::Extreme::assert_equals_hash { k1=>'v1', k2=>'v2' }, { k1=>'v1' } } ; assert_failed ;
  1         7  
  1         342  
275              
276 1         2 eval { Test::Extreme::assert_equals_hash { k1=>'v1', k2=>'v2' }, ['a'] } ; assert_failed ;
  1         633  
  1         6  
277 1         1 eval { Test::Extreme::assert_equals_hash { k1=>'v1', k2=>'v2' }, 'a' } ; assert_failed ;
  1         5  
  1         4  
278             }
279              
280             sub test_assert_equals_polymorphic() {
281 1     1 0 2 eval { assert_equals 'a', 'a' } ; assert_passed ;
  1         3  
  1         4  
282              
283 1         1 eval { assert_equals [ 'a', 'b' ], ['a', 'b'] } ; assert_passed ;
  1         5  
  1         4  
284 1         1 eval { assert_equals [ 'a', 'b' ], ['b', 'a'] } ; assert_failed ;
  1         5  
  1         339  
285              
286 1         1 eval { assert_equals { k1 => 'v1', k2 => 'v2' }, { k1 => 'v1', k2 => 'v2' } } ; assert_passed ;
  1         7  
  1         5  
287 1         2 eval { assert_equals { k1 => 'v1', k2 => 'v2' }, { k1 => 'v1', k2 => 'v3' } } ; assert_failed ;
  1         7  
  1         338  
288             }
289              
290             sub test_assert_subset() {
291 1     1 0 2 eval { assert_subset [ 'a' ], ['a', 'b'] } ; assert_passed ;
  1         6  
  1         5  
292 1         2 eval { assert_subset ['a', 'b'], ['a', 'b', 'c'] } ; assert_passed;
  1         4  
  1         5  
293 1         1 eval { assert_subset['a', 'b'], ['a', 'b'] } ; assert_passed;
  1         7  
  1         4  
294              
295 1         1 eval { assert_subset [ 'c' ], ['a', 'b'] } ; assert_failed ;
  1         10  
  1         371  
296 1         2 eval { assert_subset [ 'a', 'c' ], ['a', 'b', 'd'] } ; assert_failed ;
  1         6  
  1         376  
297             }
298              
299             sub test_assert_contains {
300 1     1 0 2 eval { assert_contains 'a', ['a', 'b'] } ; assert_passed ;
  1         5  
  1         6  
301 1         2 eval { assert_contains 'b', ['a', 'b'] } ; assert_passed ;
  1         4  
  1         2  
302 1         1 eval { assert_contains 'c', ['a', 'b'] } ; assert_failed ;
  1         5  
  1         287  
303 1         2 eval { assert_contains '', ['a', 'b'] } ; assert_failed ;
  1         4  
  1         255  
304             }
305              
306             sub test_assert_is_array {
307 1     1 0 2 eval { assert_is_array ['a', 'b'] } ; assert_passed ;
  1         4  
  1         4  
308 1         1 eval { assert_is_array {'a', 'b'} } ; assert_failed ;
  1         5  
  1         237  
309 1         1 eval { assert_is_array 'a' } ; assert_failed ;
  1         4  
  1         113  
310             }
311            
312             sub test_assert_is_hash {
313 1     1 0 29 eval { assert_is_hash {'a', 'b'} } ; assert_passed ;
  1         5  
  1         5  
314 1         1 eval { assert_is_hash ['a', 'b'] } ; assert_failed ;
  1         4  
  1         439  
315 1         2 eval { assert_is_hash 'a' } ; assert_failed ;
  1         3  
  1         112  
316             }
317            
318             sub test_assert_size {
319 1     1 0 2 eval { assert_size 2, ['a', 'b'] } ; assert_passed ;
  1         5  
  1         3  
320 1         1 eval { assert_size 1, ['a'] } ; assert_passed ;
  1         4  
  1         4  
321 1         2 eval { assert_size 0, [] } ; assert_passed ;
  1         4  
  1         3  
322              
323 1         2 eval { assert_size 2, {'a', 'b'} } ; assert_failed ;
  1         5  
  1         374  
324 1         2 eval { assert_size 1, 'a' } ; assert_failed ;
  1         4  
  1         114  
325             }
326            
327             sub test_assert_keys {
328 1     1 0 2 eval { assert_keys ['a', 'b'], { a => 1, b => 2 } } ; assert_passed ;
  1         7  
  1         6  
329 1         1 eval { assert_keys ['b', 'a'], { a => 1, b => 2 } } ; assert_passed ;
  1         7  
  1         5  
330 1         2 eval { assert_keys ['a' ], { a => 1, b => 2 } } ; assert_failed ;
  1         4  
  1         486  
331 1         2 eval { assert_keys ['a', 'b'], { a => 1 } } ; assert_failed ;
  1         6  
  1         508  
332              
333 1         2 eval { assert_keys ['a'], ['a'] } ; assert_failed ;
  1         5  
  1         313  
334 1         1 eval { assert_keys 'a' , ['a'] } ; assert_failed ;
  1         13  
  1         307  
335 1         1 eval { assert_keys ['a'], 'a' } ; assert_failed ;
  1         4  
  1         250  
336             }
337              
338             sub test_assert_is_string {
339 1     1 0 2 eval { assert_is_string 'hello' } ; assert_passed ;
  1         4  
  1         3  
340              
341 1         2 eval { assert_is_string ['hello', 'world'] } ; assert_failed ;
  1         3  
  1         235  
342 1         2 eval { assert_is_string {'hello', 'world'} } ; assert_failed ;
  1         5  
  1         237  
343             }
344            
345              
346 0     0   0 package foo ; sub foo_1 { } sub foo_2 { } sub foo_3 { }
  0     0   0  
  0     0   0  
347 0     0   0 package bar ; sub bar_1 { } sub bar_2 { } sub bar_3 { }
  0     0   0  
  0     0   0  
348             package Test::Extreme;
349              
350             sub test_list_subs {
351 1     1 0 6 assert_equals [ 'foo_1', 'foo_2', 'foo_3' ], Test::Extreme::_list_subs 'main::foo::';
352 1         6 assert_equals [ 'foo_1', 'foo_2', 'foo_3' ], Test::Extreme::_list_subs 'foo::';
353 1         6 assert_equals [ 'bar_1', 'bar_2', 'bar_3' ], Test::Extreme::_list_subs 'bar::';
354             }
355              
356             sub test_list_packages()
357             {
358 1     1 0 5 my $packages = Test::Extreme::_list_packages 'main::';
359 1         7 assert_subset ['foo::', 'bar::'], $packages;
360 1         3 assert_none grep { ! /::$/ } @$packages;
  57         132  
361             }
362              
363 0     0   0 package foo_test ; sub test_1 { } sub test_2 { } sub test_3 { }
  0     0   0  
  0     0   0  
364             package Test::Extreme;
365              
366             sub test_list_tests() {
367 1     1 0 5 my $list = Test::Extreme::_list_tests 'foo_test::';
368 1         3 my $expected = [qw( foo_test::test_1 foo_test::test_2 foo_test::test_3 )];
369 1         4 assert_equals $expected, $list;
370             }
371              
372 1     1 0 4 sub this_will_pass { assert_true 1 }
373 1     1 0 5 sub this_will_fail { assert_true 0 }
374              
375             sub test_execute_tests {
376 1     1 0 4 my $all_tests = ['Test::Extreme::this_will_pass', 'Test::Extreme::this_will_fail'];
377 1         2 my $failure_messages = { };
378 1         6 Test::Extreme::_execute_tests $all_tests, $failure_messages, 0;
379 1         5 assert_keys ['Test::Extreme::this_will_fail'], $failure_messages;
380             }
381              
382             run_tests_as_script 'Test::Extreme' if $0 =~ /Extreme.pm$/;
383              
384             #-----------------------------------------------------------------
385             # TESTS END
386             #-----------------------------------------------------------------
387              
388             1;
389             __END__