Upgrade to Test::Harness 3.14
[p5sagit/p5-mst-13.2.git] / ext / Test / Harness / t / prove.t
CommitLineData
b965d173 1#!/usr/bin/perl -w
2
3BEGIN {
5e2a19fc 4 if ( $ENV{PERL_CORE} ) {
5 chdir 't';
6dcddb87 6 @INC = ( '../lib', '../ext/Test/Harness/t/lib' );
5e2a19fc 7 }
8 else {
9 unshift @INC, 't/lib';
b965d173 10 }
11}
12
13use strict;
b965d173 14
15use Test::More;
16use File::Spec;
17
18use App::Prove;
19
20package FakeProve;
21use vars qw( @ISA );
22
23@ISA = qw( App::Prove );
24
25sub new {
26 my $class = shift;
27 my $self = $class->SUPER::new(@_);
28 $self->{_log} = [];
29 return $self;
30}
31
32sub _color_default {0}
33
34sub _runtests {
35 my $self = shift;
36 push @{ $self->{_log} }, [ '_runtests', @_ ];
37}
38
39sub get_log {
40 my $self = shift;
41 my @log = @{ $self->{_log} };
42 $self->{_log} = [];
43 return @log;
44}
45
46sub _shuffle {
47 my $self = shift;
48 s/^/xxx/ for @_;
49}
50
51package main;
52
53sub mabs {
54 my $ar = shift;
55 return [ map { File::Spec->rel2abs($_) } @$ar ];
56}
57
58{
59 my @import_log = ();
60
61 sub test_log_import { push @import_log, [@_] }
62
63 sub get_import_log {
64 my @log = @import_log;
65 @import_log = ();
66 return @log;
67 }
68}
69
70my ( @ATTR, %DEFAULT_ASSERTION, @SCHEDULE );
71
72# see the "ACTUAL TEST" section at the bottom
73
74BEGIN { # START PLAN
75
76 # list of attributes
77 @ATTR = qw(
f7c69158 78 archive argv blib color directives exec extension failures
79 formatter harness includes lib merge parse quiet really_quiet
80 recurse backwards shuffle taint_fail taint_warn verbose
81 warnings_fail warnings_warn
b965d173 82 );
83
84 # what we expect if the 'expect' hash does not define it
85 %DEFAULT_ASSERTION = map { $_ => undef } @ATTR;
86
87 $DEFAULT_ASSERTION{includes} = $DEFAULT_ASSERTION{argv}
88 = sub { 'ARRAY' eq ref shift };
89
90 my @dummy_tests = map { File::Spec->catdir( 't', 'sample-tests', $_ ) }
91 qw(simple simple_yaml);
92 my $dummy_test = $dummy_tests[0];
93
94 ########################################################################
95 # declarations - this drives all of the subtests.
96 # The cheatsheet follows.
97 # required: name, expect
98 # optional:
99 # args - arguments to constructor
100 # switches - command-line switches
101 # runlog - expected results of internal calls to _runtests, must
102 # match FakeProve's _log attr
103 # run_error - depends on 'runlog' (if missing, asserts no error)
104 # extra - follow-up check to handle exceptional cleanup / verification
105 # class - The App::Prove subclass to test. Defaults to FakeProve
106 @SCHEDULE = (
107 { name => 'Create empty',
108 expect => {}
109 },
110 { name => 'Set all options via constructor',
111 args => {
112 archive => 1,
113 argv => [qw(one two three)],
114 blib => 2,
115 color => 3,
116 directives => 4,
117 exec => 5,
118 failures => 7,
119 formatter => 8,
120 harness => 9,
121 includes => [qw(four five six)],
122 lib => 10,
123 merge => 11,
124 parse => 13,
125 quiet => 14,
126 really_quiet => 15,
127 recurse => 16,
128 backwards => 17,
129 shuffle => 18,
130 taint_fail => 19,
131 taint_warn => 20,
132 verbose => 21,
133 warnings_fail => 22,
134 warnings_warn => 23,
135 },
136 expect => {
137 archive => 1,
138 argv => [qw(one two three)],
139 blib => 2,
140 color => 3,
141 directives => 4,
142 exec => 5,
143 failures => 7,
144 formatter => 8,
145 harness => 9,
146 includes => [qw(four five six)],
147 lib => 10,
148 merge => 11,
149 parse => 13,
150 quiet => 14,
151 really_quiet => 15,
152 recurse => 16,
153 backwards => 17,
154 shuffle => 18,
155 taint_fail => 19,
156 taint_warn => 20,
157 verbose => 21,
158 warnings_fail => 22,
159 warnings_warn => 23,
160 }
161 },
162 { name => 'Call with defaults',
163 args => { argv => [qw( one two three )] },
164 expect => {},
165 runlog => [
166 [ '_runtests',
27fc0087 167 { verbosity => 0,
168 show_count => 1,
169 },
b965d173 170 'TAP::Harness',
27fc0087 171 'one', 'two', 'three'
b965d173 172 ]
173 ],
174 },
175
176 # Test all options individually
177
178 # { name => 'Just archive',
179 # args => {
180 # argv => [qw( one two three )],
181 # archive => 1,
182 # },
183 # expect => {
184 # archive => 1,
185 # },
186 # runlog => [
187 # [ { archive => 1,
188 # },
189 # 'TAP::Harness',
190 # 'one', 'two',
191 # 'three'
192 # ]
193 # ],
194 # },
195 { name => 'Just argv',
196 args => {
197 argv => [qw( one two three )],
198 },
199 expect => {
200 argv => [qw( one two three )],
201 },
202 runlog => [
203 [ '_runtests',
27fc0087 204 { verbosity => 0, show_count => 1 },
b965d173 205 'TAP::Harness',
206 'one', 'two',
207 'three'
208 ]
209 ],
210 },
211 { name => 'Just blib',
212 args => {
213 argv => [qw( one two three )],
214 blib => 1,
215 },
216 expect => {
217 blib => 1,
218 },
219 runlog => [
220 [ '_runtests',
221 { lib => mabs( [ 'blib/lib', 'blib/arch' ] ),
27fc0087 222 verbosity => 0,
223 show_count => 1,
b965d173 224 },
225 'TAP::Harness',
226 'one', 'two', 'three'
227 ]
228 ],
229 },
230
231 { name => 'Just color',
232 args => {
233 argv => [qw( one two three )],
234 color => 1,
235 },
236 expect => {
237 color => 1,
238 },
239 runlog => [
240 [ '_runtests',
27fc0087 241 { color => 1,
242 verbosity => 0,
243 show_count => 1,
b965d173 244 },
245 'TAP::Harness',
246 'one', 'two', 'three'
247 ]
248 ],
249 },
250
251 { name => 'Just directives',
252 args => {
253 argv => [qw( one two three )],
254 directives => 1,
255 },
256 expect => {
257 directives => 1,
258 },
259 runlog => [
260 [ '_runtests',
261 { directives => 1,
27fc0087 262 verbosity => 0,
263 show_count => 1,
b965d173 264 },
265 'TAP::Harness',
266 'one', 'two', 'three'
267 ]
268 ],
269 },
270 { name => 'Just exec',
271 args => {
272 argv => [qw( one two three )],
273 exec => 1,
274 },
275 expect => {
276 exec => 1,
277 },
278 runlog => [
279 [ '_runtests',
27fc0087 280 { exec => [1],
281 verbosity => 0,
282 show_count => 1,
b965d173 283 },
284 'TAP::Harness',
285 'one', 'two', 'three'
286 ]
287 ],
288 },
289 { name => 'Just failures',
290 args => {
291 argv => [qw( one two three )],
292 failures => 1,
293 },
294 expect => {
295 failures => 1,
296 },
297 runlog => [
298 [ '_runtests',
27fc0087 299 { failures => 1,
300 verbosity => 0,
301 show_count => 1,
b965d173 302 },
303 'TAP::Harness',
304 'one', 'two', 'three'
305 ]
306 ],
307 },
308
309 { name => 'Just formatter',
310 args => {
311 argv => [qw( one two three )],
312 formatter => 'TAP::Harness',
313 },
314 expect => {
315 formatter => 'TAP::Harness',
316 },
317 runlog => [
318 [ '_runtests',
319 { formatter_class => 'TAP::Harness',
27fc0087 320 verbosity => 0,
321 show_count => 1,
b965d173 322 },
323 'TAP::Harness',
324 'one', 'two', 'three'
325 ]
326 ],
327 },
328
329 { name => 'Just includes',
330 args => {
331 argv => [qw( one two three )],
332 includes => [qw( four five six )],
333 },
334 expect => {
335 includes => [qw( four five six )],
336 },
337 runlog => [
338 [ '_runtests',
339 { lib => mabs( [qw( four five six )] ),
27fc0087 340 verbosity => 0,
341 show_count => 1,
b965d173 342 },
343 'TAP::Harness',
344 'one', 'two', 'three'
345 ]
346 ],
347 },
348 { name => 'Just lib',
349 args => {
350 argv => [qw( one two three )],
351 lib => 1,
352 },
353 expect => {
354 lib => 1,
355 },
356 runlog => [
357 [ '_runtests',
358 { lib => mabs( ['lib'] ),
27fc0087 359 verbosity => 0,
360 show_count => 1,
b965d173 361 },
362 'TAP::Harness',
363 'one', 'two', 'three'
364 ]
365 ],
366 },
367 { name => 'Just merge',
368 args => {
369 argv => [qw( one two three )],
370 merge => 1,
371 },
372 expect => {
373 merge => 1,
374 },
375 runlog => [
376 [ '_runtests',
27fc0087 377 { merge => 1,
378 verbosity => 0,
379 show_count => 1,
b965d173 380 },
381 'TAP::Harness',
382 'one', 'two', 'three'
383 ]
384 ],
385 },
386 { name => 'Just parse',
387 args => {
388 argv => [qw( one two three )],
389 parse => 1,
390 },
391 expect => {
392 parse => 1,
393 },
394 runlog => [
395 [ '_runtests',
27fc0087 396 { errors => 1,
397 verbosity => 0,
398 show_count => 1,
b965d173 399 },
400 'TAP::Harness',
401 'one', 'two', 'three'
402 ]
403 ],
404 },
405 { name => 'Just quiet',
406 args => {
407 argv => [qw( one two three )],
408 quiet => 1,
409 },
410 expect => {
411 quiet => 1,
412 },
413 runlog => [
414 [ '_runtests',
27fc0087 415 { verbosity => -1,
416 show_count => 1,
b965d173 417 },
418 'TAP::Harness',
419 'one', 'two', 'three'
420 ]
421 ],
422 },
423 { name => 'Just really_quiet',
424 args => {
425 argv => [qw( one two three )],
426 really_quiet => 1,
427 },
428 expect => {
429 really_quiet => 1,
430 },
431 runlog => [
432 [ '_runtests',
27fc0087 433 { verbosity => -2,
434 show_count => 1,
b965d173 435 },
436 'TAP::Harness',
437 'one', 'two', 'three'
438 ]
439 ],
440 },
441 { name => 'Just recurse',
442 args => {
443 argv => [qw( one two three )],
444 recurse => 1,
445 },
446 expect => {
447 recurse => 1,
448 },
449 runlog => [
450 [ '_runtests',
27fc0087 451 { verbosity => 0,
452 show_count => 1,
453 },
b965d173 454 'TAP::Harness',
455 'one', 'two', 'three'
456 ]
457 ],
458 },
459 { name => 'Just reverse',
460 args => {
461 argv => [qw( one two three )],
462 backwards => 1,
463 },
464 expect => {
465 backwards => 1,
466 },
467 runlog => [
468 [ '_runtests',
27fc0087 469 { verbosity => 0,
470 show_count => 1,
471 },
b965d173 472 'TAP::Harness',
473 'three', 'two', 'one'
474 ]
475 ],
476 },
477
478 { name => 'Just shuffle',
479 args => {
480 argv => [qw( one two three )],
481 shuffle => 1,
482 },
483 expect => {
484 shuffle => 1,
485 },
486 runlog => [
487 [ '_runtests',
27fc0087 488 { verbosity => 0,
489 show_count => 1,
490 },
b965d173 491 'TAP::Harness',
492 'xxxone', 'xxxtwo',
493 'xxxthree'
494 ]
495 ],
496 },
497 { name => 'Just taint_fail',
498 args => {
499 argv => [qw( one two three )],
500 taint_fail => 1,
501 },
502 expect => {
503 taint_fail => 1,
504 },
505 runlog => [
506 [ '_runtests',
27fc0087 507 { switches => ['-T'],
508 verbosity => 0,
509 show_count => 1,
b965d173 510 },
511 'TAP::Harness',
512 'one', 'two', 'three'
513 ]
514 ],
515 },
516 { name => 'Just taint_warn',
517 args => {
518 argv => [qw( one two three )],
519 taint_warn => 1,
520 },
521 expect => {
522 taint_warn => 1,
523 },
524 runlog => [
525 [ '_runtests',
27fc0087 526 { switches => ['-t'],
527 verbosity => 0,
528 show_count => 1,
b965d173 529 },
530 'TAP::Harness',
531 'one', 'two', 'three'
532 ]
533 ],
534 },
535 { name => 'Just verbose',
536 args => {
537 argv => [qw( one two three )],
538 verbose => 1,
539 },
540 expect => {
541 verbose => 1,
542 },
543 runlog => [
544 [ '_runtests',
27fc0087 545 { verbosity => 1,
546 show_count => 1,
b965d173 547 },
548 'TAP::Harness',
549 'one', 'two', 'three'
550 ]
551 ],
552 },
553 { name => 'Just warnings_fail',
554 args => {
555 argv => [qw( one two three )],
556 warnings_fail => 1,
557 },
558 expect => {
559 warnings_fail => 1,
560 },
561 runlog => [
562 [ '_runtests',
27fc0087 563 { switches => ['-W'],
564 verbosity => 0,
565 show_count => 1,
b965d173 566 },
567 'TAP::Harness',
568 'one', 'two', 'three'
569 ]
570 ],
571 },
572 { name => 'Just warnings_warn',
573 args => {
574 argv => [qw( one two three )],
575 warnings_warn => 1,
576 },
577 expect => {
578 warnings_warn => 1,
579 },
580 runlog => [
581 [ '_runtests',
27fc0087 582 { switches => ['-w'],
583 verbosity => 0,
584 show_count => 1,
b965d173 585 },
586 'TAP::Harness',
587 'one', 'two', 'three'
588 ]
589 ],
590 },
591
592 # Command line parsing
593 { name => 'Switch -v',
594 args => {
595 argv => [qw( one two three )],
596 },
597 switches => [ '-v', $dummy_test ],
598 expect => {
599 verbose => 1,
600 },
601 runlog => [
602 [ '_runtests',
27fc0087 603 { verbosity => 1,
604 show_count => 1,
b965d173 605 },
606 'TAP::Harness',
607 $dummy_test
608 ]
609 ],
610 },
611
612 { name => 'Switch --verbose',
613 args => {
614 argv => [qw( one two three )],
615 },
616 switches => [ '--verbose', $dummy_test ],
617 expect => {
618 verbose => 1,
619 },
620 runlog => [
621 [ '_runtests',
27fc0087 622 { verbosity => 1,
623 show_count => 1,
b965d173 624 },
625 'TAP::Harness',
626 $dummy_test
627 ]
628 ],
629 },
630
631 { name => 'Switch -f',
632 args => {
633 argv => [qw( one two three )],
634 },
635 switches => [ '-f', $dummy_test ],
636 expect => { failures => 1 },
637 runlog => [
638 [ '_runtests',
27fc0087 639 { failures => 1,
640 verbosity => 0,
641 show_count => 1,
b965d173 642 },
643 'TAP::Harness',
644 $dummy_test
645 ]
646 ],
647 },
648
649 { name => 'Switch --failures',
650 args => {
651 argv => [qw( one two three )],
652 },
653 switches => [ '--failures', $dummy_test ],
654 expect => { failures => 1 },
655 runlog => [
656 [ '_runtests',
27fc0087 657 { failures => 1,
658 verbosity => 0,
659 show_count => 1,
b965d173 660 },
661 'TAP::Harness',
662 $dummy_test
663 ]
664 ],
665 },
666
667 { name => 'Switch -l',
668 args => {
669 argv => [qw( one two three )],
670 },
671 switches => [ '-l', $dummy_test ],
672 expect => { lib => 1 },
673 runlog => [
674 [ '_runtests',
675 { lib => mabs( ['lib'] ),
27fc0087 676 verbosity => 0,
677 show_count => 1,
b965d173 678 },
679 'TAP::Harness',
680 $dummy_test
681 ]
682 ],
683 },
684
685 { name => 'Switch --lib',
686 args => {
687 argv => [qw( one two three )],
688 },
689 switches => [ '--lib', $dummy_test ],
690 expect => { lib => 1 },
691 runlog => [
692 [ '_runtests',
693 { lib => mabs( ['lib'] ),
27fc0087 694 verbosity => 0,
695 show_count => 1,
b965d173 696 },
697 'TAP::Harness',
698 $dummy_test
699 ]
700 ],
701 },
702
703 { name => 'Switch -b',
704 args => {
705 argv => [qw( one two three )],
706 },
707 switches => [ '-b', $dummy_test ],
708 expect => { blib => 1 },
709 runlog => [
710 [ '_runtests',
711 { lib => mabs( [ 'blib/lib', 'blib/arch' ] ),
27fc0087 712 verbosity => 0,
713 show_count => 1,
b965d173 714 },
715 'TAP::Harness',
716 $dummy_test
717 ]
718 ],
719 },
720
721 { name => 'Switch --blib',
722 args => {
723 argv => [qw( one two three )],
724 },
725 switches => [ '--blib', $dummy_test ],
726 expect => { blib => 1 },
727 runlog => [
728 [ '_runtests',
729 { lib => mabs( [ 'blib/lib', 'blib/arch' ] ),
27fc0087 730 verbosity => 0,
731 show_count => 1,
b965d173 732 },
733 'TAP::Harness',
734 $dummy_test
735 ]
736 ],
737 },
738
739 { name => 'Switch -s',
740 args => {
741 argv => [qw( one two three )],
742 },
743 switches => [ '-s', $dummy_test ],
744 expect => { shuffle => 1 },
745 runlog => [
746 [ '_runtests',
27fc0087 747 { verbosity => 0,
748 show_count => 1,
749 },
b965d173 750 'TAP::Harness',
751 "xxx$dummy_test"
752 ]
753 ],
754 },
755
756 { name => 'Switch --shuffle',
757 args => {
758 argv => [qw( one two three )],
759 },
760 switches => [ '--shuffle', $dummy_test ],
761 expect => { shuffle => 1 },
762 runlog => [
763 [ '_runtests',
27fc0087 764 { verbosity => 0,
765 show_count => 1,
766 },
b965d173 767 'TAP::Harness',
768 "xxx$dummy_test"
769 ]
770 ],
771 },
772
773 { name => 'Switch -c',
774 args => {
775 argv => [qw( one two three )],
776 },
777 switches => [ '-c', $dummy_test ],
778 expect => { color => 1 },
779 runlog => [
780 [ '_runtests',
27fc0087 781 { color => 1,
782 verbosity => 0,
783 show_count => 1,
b965d173 784 },
785 'TAP::Harness',
786 $dummy_test
787 ]
788 ],
789 },
790
791 { name => 'Switch -r',
792 args => {
793 argv => [qw( one two three )],
794 },
795 switches => [ '-r', $dummy_test ],
796 expect => { recurse => 1 },
797 runlog => [
798 [ '_runtests',
27fc0087 799 { verbosity => 0,
800 show_count => 1,
801 },
b965d173 802 'TAP::Harness',
803 $dummy_test
804 ]
805 ],
806 },
807
808 { name => 'Switch --recurse',
809 args => {
810 argv => [qw( one two three )],
811 },
812 switches => [ '--recurse', $dummy_test ],
813 expect => { recurse => 1 },
814 runlog => [
815 [ '_runtests',
27fc0087 816 { verbosity => 0,
817 show_count => 1,
818 },
b965d173 819 'TAP::Harness',
820 $dummy_test
821 ]
822 ],
823 },
824
825 { name => 'Switch --reverse',
826 args => {
827 argv => [qw( one two three )],
828 },
829 switches => [ '--reverse', @dummy_tests ],
830 expect => { backwards => 1 },
831 runlog => [
832 [ '_runtests',
27fc0087 833 { verbosity => 0,
834 show_count => 1,
835 },
b965d173 836 'TAP::Harness',
837 reverse @dummy_tests
838 ]
839 ],
840 },
841
842 { name => 'Switch -p',
843 args => {
844 argv => [qw( one two three )],
845 },
846 switches => [ '-p', $dummy_test ],
847 expect => {
848 parse => 1,
849 },
850 runlog => [
851 [ '_runtests',
27fc0087 852 { errors => 1,
853 verbosity => 0,
854 show_count => 1,
b965d173 855 },
856 'TAP::Harness',
857 $dummy_test
858 ]
859 ],
860 },
861
862 { name => 'Switch --parse',
863 args => {
864 argv => [qw( one two three )],
865 },
866 switches => [ '--parse', $dummy_test ],
867 expect => {
868 parse => 1,
869 },
870 runlog => [
871 [ '_runtests',
27fc0087 872 { errors => 1,
873 verbosity => 0,
874 show_count => 1,
b965d173 875 },
876 'TAP::Harness',
877 $dummy_test
878 ]
879 ],
880 },
881
882 { name => 'Switch -q',
883 args => {
884 argv => [qw( one two three )],
885 },
886 switches => [ '-q', $dummy_test ],
887 expect => { quiet => 1 },
888 runlog => [
889 [ '_runtests',
27fc0087 890 { verbosity => -1,
891 show_count => 1,
b965d173 892 },
893 'TAP::Harness',
894 $dummy_test
895 ]
896 ],
897 },
898
899 { name => 'Switch --quiet',
900 args => {
901 argv => [qw( one two three )],
902 },
903 switches => [ '--quiet', $dummy_test ],
904 expect => { quiet => 1 },
905 runlog => [
906 [ '_runtests',
27fc0087 907 { verbosity => -1,
908 show_count => 1,
b965d173 909 },
910 'TAP::Harness',
911 $dummy_test
912 ]
913 ],
914 },
915
916 { name => 'Switch -Q',
917 args => {
918 argv => [qw( one two three )],
919 },
920 switches => [ '-Q', $dummy_test ],
921 expect => { really_quiet => 1 },
922 runlog => [
923 [ '_runtests',
27fc0087 924 { verbosity => -2,
925 show_count => 1,
b965d173 926 },
927 'TAP::Harness',
928 $dummy_test
929 ]
930 ],
931 },
932
933 { name => 'Switch --QUIET',
934 args => {
935 argv => [qw( one two three )],
936 },
937 switches => [ '--QUIET', $dummy_test ],
938 expect => { really_quiet => 1 },
939 runlog => [
940 [ '_runtests',
27fc0087 941 { verbosity => -2,
942 show_count => 1,
b965d173 943 },
944 'TAP::Harness',
945 $dummy_test
946 ]
947 ],
948 },
949
950 { name => 'Switch -m',
951 args => {
952 argv => [qw( one two three )],
953 },
954 switches => [ '-m', $dummy_test ],
955 expect => { merge => 1 },
956 runlog => [
957 [ '_runtests',
27fc0087 958 { merge => 1,
959 verbosity => 0,
960 show_count => 1,
b965d173 961 },
962 'TAP::Harness',
963 $dummy_test
964 ]
965 ],
966 },
967
968 { name => 'Switch --merge',
969 args => {
970 argv => [qw( one two three )],
971 },
972 switches => [ '--merge', $dummy_test ],
973 expect => { merge => 1 },
974 runlog => [
975 [ '_runtests',
27fc0087 976 { merge => 1,
977 verbosity => 0,
978 show_count => 1,
b965d173 979 },
980 'TAP::Harness',
981 $dummy_test
982 ]
983 ],
984 },
985
986 { name => 'Switch --directives',
987 args => {
988 argv => [qw( one two three )],
989 },
990 switches => [ '--directives', $dummy_test ],
991 expect => { directives => 1 },
992 runlog => [
993 [ '_runtests',
994 { directives => 1,
27fc0087 995 verbosity => 0,
996 show_count => 1,
b965d173 997 },
998 'TAP::Harness',
999 $dummy_test
1000 ]
1001 ],
1002 },
1003
1004 # Executing one word (why would it be a -s though?)
1005 { name => 'Switch --exec -s',
1006 args => {
1007 argv => [qw( one two three )],
1008 },
1009 switches => [ '--exec', '-s', $dummy_test ],
1010 expect => { exec => '-s' },
1011 runlog => [
27fc0087 1012 [ '_runtests',
1013 { exec => ['-s'],
1014 verbosity => 0,
1015 show_count => 1,
1016 },
b965d173 1017 'TAP::Harness',
1018 $dummy_test
1019 ]
1020 ],
1021 },
1022
1023 # multi-part exec
1024 { name => 'Switch --exec "/foo/bar/perl -Ilib"',
1025 args => {
1026 argv => [qw( one two three )],
1027 },
1028 switches => [ '--exec', '/foo/bar/perl -Ilib', $dummy_test ],
1029 expect => { exec => '/foo/bar/perl -Ilib' },
1030 runlog => [
1031 [ '_runtests',
27fc0087 1032 { exec => [qw(/foo/bar/perl -Ilib)],
1033 verbosity => 0,
1034 show_count => 1,
b965d173 1035 },
1036 'TAP::Harness',
1037 $dummy_test
1038 ]
1039 ],
1040 },
1041
1042 # null exec (run tests as compiled binaries)
1043 { name => 'Switch --exec ""',
1044 switches => [ '--exec', '', $dummy_test ],
1045 expect => {
1046 exec => # ick, must workaround the || default bit with a sub
1047 sub { my $val = shift; defined($val) and !length($val) }
1048 },
1049 runlog => [
1050 [ '_runtests',
27fc0087 1051 { exec => [],
1052 verbosity => 0,
1053 show_count => 1,
1054 },
b965d173 1055 'TAP::Harness',
1056 $dummy_test
1057 ]
1058 ],
1059 },
1060
1061 # Plugins
1062 { name => 'Load plugin',
1063 switches => [ '-P', 'Dummy', $dummy_test ],
1064 args => {
1065 argv => [qw( one two three )],
1066 },
1067 expect => {
1068 plugins => ['Dummy'],
1069 },
1070 extra => sub {
1071 my @loaded = get_import_log();
1072 is_deeply \@loaded, [ ['App::Prove::Plugin::Dummy'] ],
1073 "Plugin loaded OK";
1074 },
1075 plan => 1,
1076 runlog => [
1077 [ '_runtests',
27fc0087 1078 { verbosity => 0,
1079 show_count => 1,
1080 },
b965d173 1081 'TAP::Harness',
1082 $dummy_test
1083 ]
1084 ],
1085 },
1086
1087 { name => 'Load plugin (args)',
1088 switches => [ '-P', 'Dummy=cracking,cheese,gromit', $dummy_test ],
1089 args => {
1090 argv => [qw( one two three )],
1091 },
1092 expect => {
1093 plugins => ['Dummy'],
1094 },
1095 extra => sub {
1096 my @loaded = get_import_log();
1097 is_deeply \@loaded,
1098 [ [ 'App::Prove::Plugin::Dummy', 'cracking', 'cheese',
1099 'gromit'
1100 ]
1101 ],
1102 "Plugin loaded OK";
1103 },
1104 plan => 1,
1105 runlog => [
1106 [ '_runtests',
27fc0087 1107 { verbosity => 0,
1108 show_count => 1,
1109 },
b965d173 1110 'TAP::Harness',
1111 $dummy_test
1112 ]
1113 ],
1114 },
1115
1116 { name => 'Load plugin (explicit path)',
1117 switches => [ '-P', 'App::Prove::Plugin::Dummy', $dummy_test ],
1118 args => {
1119 argv => [qw( one two three )],
1120 },
1121 expect => {
1122 plugins => ['Dummy'],
1123 },
1124 extra => sub {
1125 my @loaded = get_import_log();
1126 is_deeply \@loaded, [ ['App::Prove::Plugin::Dummy'] ],
1127 "Plugin loaded OK";
1128 },
1129 plan => 1,
1130 runlog => [
1131 [ '_runtests',
27fc0087 1132 { verbosity => 0,
1133 show_count => 1,
1134 },
b965d173 1135 'TAP::Harness',
1136 $dummy_test
1137 ]
1138 ],
1139 },
1140
1141 { name => 'Load module',
1142 switches => [ '-M', 'App::Prove::Plugin::Dummy', $dummy_test ],
1143 args => {
1144 argv => [qw( one two three )],
1145 },
1146 expect => {
1147 plugins => ['Dummy'],
1148 },
1149 extra => sub {
1150 my @loaded = get_import_log();
1151 is_deeply \@loaded, [ ['App::Prove::Plugin::Dummy'] ],
1152 "Plugin loaded OK";
1153 },
1154 plan => 1,
1155 runlog => [
1156 [ '_runtests',
27fc0087 1157 { verbosity => 0,
1158 show_count => 1,
1159 },
b965d173 1160 'TAP::Harness',
1161 $dummy_test
1162 ]
1163 ],
1164 },
1165
1166 # TODO
1167 # Hmm, that doesn't work...
1168 # { name => 'Switch -h',
1169 # args => {
1170 # argv => [qw( one two three )],
1171 # },
1172 # switches => [ '-h', $dummy_test ],
1173 # expect => {},
1174 # runlog => [
1175 # [ '_runtests',
1176 # {},
1177 # 'TAP::Harness',
1178 # $dummy_test
1179 # ]
1180 # ],
1181 # },
1182
1183 # { name => 'Switch --help',
1184 # args => {
1185 # argv => [qw( one two three )],
1186 # },
1187 # switches => [ '--help', $dummy_test ],
1188 # expect => {},
1189 # runlog => [
1190 # [ {},
1191 # 'TAP::Harness',
1192 # $dummy_test
1193 # ]
1194 # ],
1195 # },
1196 # { name => 'Switch -?',
1197 # args => {
1198 # argv => [qw( one two three )],
1199 # },
1200 # switches => [ '-?', $dummy_test ],
1201 # expect => {},
1202 # runlog => [
1203 # [ {},
1204 # 'TAP::Harness',
1205 # $dummy_test
1206 # ]
1207 # ],
1208 # },
1209 #
1210 # { name => 'Switch -H',
1211 # args => {
1212 # argv => [qw( one two three )],
1213 # },
1214 # switches => [ '-H', $dummy_test ],
1215 # expect => {},
1216 # runlog => [
1217 # [ {},
1218 # 'TAP::Harness',
1219 # $dummy_test
1220 # ]
1221 # ],
1222 # },
1223 #
1224 # { name => 'Switch --man',
1225 # args => {
1226 # argv => [qw( one two three )],
1227 # },
1228 # switches => [ '--man', $dummy_test ],
1229 # expect => {},
1230 # runlog => [
1231 # [ {},
1232 # 'TAP::Harness',
1233 # $dummy_test
1234 # ]
1235 # ],
1236 # },
1237 #
1238 # { name => 'Switch -V',
1239 # args => {
1240 # argv => [qw( one two three )],
1241 # },
1242 # switches => [ '-V', $dummy_test ],
1243 # expect => {},
1244 # runlog => [
1245 # [ {},
1246 # 'TAP::Harness',
1247 # $dummy_test
1248 # ]
1249 # ],
1250 # },
1251 #
1252 # { name => 'Switch --version',
1253 # args => {
1254 # argv => [qw( one two three )],
1255 # },
1256 # switches => [ '--version', $dummy_test ],
1257 # expect => {},
1258 # runlog => [
1259 # [ {},
1260 # 'TAP::Harness',
1261 # $dummy_test
1262 # ]
1263 # ],
1264 # },
1265 #
1266 # { name => 'Switch --color!',
1267 # args => {
1268 # argv => [qw( one two three )],
1269 # },
1270 # switches => [ '--color!', $dummy_test ],
1271 # expect => {},
1272 # runlog => [
1273 # [ {},
1274 # 'TAP::Harness',
1275 # $dummy_test
1276 # ]
1277 # ],
1278 # },
1279 #
1280 { name => 'Switch -I=s@',
1281 args => {
1282 argv => [qw( one two three )],
1283 },
1284 switches => [ '-Ilib', $dummy_test ],
1285 expect => {
1286 includes => sub {
1287 my ( $val, $attr ) = @_;
1288 return
1289 'ARRAY' eq ref $val
1290 && 1 == @$val
1291 && $val->[0] =~ /lib$/;
1292 },
1293 },
1294 },
1295
1296 # { name => 'Switch -a',
1297 # args => {
1298 # argv => [qw( one two three )],
1299 # },
1300 # switches => [ '-a', $dummy_test ],
1301 # expect => {},
1302 # runlog => [
1303 # [ {},
1304 # 'TAP::Harness',
1305 # $dummy_test
1306 # ]
1307 # ],
1308 # },
1309 #
1310 # { name => 'Switch --archive=-s',
1311 # args => {
1312 # argv => [qw( one two three )],
1313 # },
1314 # switches => [ '--archive=-s', $dummy_test ],
1315 # expect => {},
1316 # runlog => [
1317 # [ {},
1318 # 'TAP::Harness',
1319 # $dummy_test
1320 # ]
1321 # ],
1322 # },
1323 #
1324 # { name => 'Switch --formatter=-s',
1325 # args => {
1326 # argv => [qw( one two three )],
1327 # },
1328 # switches => [ '--formatter=-s', $dummy_test ],
1329 # expect => {},
1330 # runlog => [
1331 # [ {},
1332 # 'TAP::Harness',
1333 # $dummy_test
1334 # ]
1335 # ],
1336 # },
1337 #
1338 # { name => 'Switch -e',
1339 # args => {
1340 # argv => [qw( one two three )],
1341 # },
1342 # switches => [ '-e', $dummy_test ],
1343 # expect => {},
1344 # runlog => [
1345 # [ {},
1346 # 'TAP::Harness',
1347 # $dummy_test
1348 # ]
1349 # ],
1350 # },
1351 #
1352 # { name => 'Switch --harness=-s',
1353 # args => {
1354 # argv => [qw( one two three )],
1355 # },
1356 # switches => [ '--harness=-s', $dummy_test ],
1357 # expect => {},
1358 # runlog => [
1359 # [ {},
1360 # 'TAP::Harness',
1361 # $dummy_test
1362 # ]
1363 # ],
1364 # },
1365
1366 );
1367
1368 # END SCHEDULE
1369 ########################################################################
1370
1371 my $extra_plan = 0;
1372 for my $test (@SCHEDULE) {
1373 $extra_plan += $test->{plan} || 0;
1374 $extra_plan += 2 if $test->{runlog};
1375 $extra_plan += 1 if $test->{switches};
1376 }
1377
1378 plan tests => @SCHEDULE * ( 3 + @ATTR ) + $extra_plan;
1379} # END PLAN
1380
1381# ACTUAL TEST
1382for my $test (@SCHEDULE) {
1383 my $name = $test->{name};
1384 my $class = $test->{class} || 'FakeProve';
1385
9965363e 1386 local $ENV{HARNESS_TIMER};
1387
b965d173 1388 ok my $app = $class->new( exists $test->{args} ? $test->{args} : () ),
1389 "$name: App::Prove created OK";
1390
1391 isa_ok $app, 'App::Prove';
1392 isa_ok $app, $class;
1393
1394 # Optionally parse command args
1395 if ( my $switches = $test->{switches} ) {
1396 eval { $app->process_args( '--norc', @$switches ) };
1397 if ( my $err_pattern = $test->{parse_error} ) {
1398 like $@, $err_pattern, "$name: expected parse error";
1399 }
1400 else {
1401 ok !$@, "$name: no parse error";
1402 }
1403 }
1404
1405 my $expect = $test->{expect} || {};
1406 for my $attr ( sort @ATTR ) {
1407 my $val = $app->$attr();
1408 my $assertion = $expect->{$attr} || $DEFAULT_ASSERTION{$attr};
1409 my $is_ok = undef;
1410
1411 if ( 'CODE' eq ref $assertion ) {
1412 $is_ok = ok $assertion->( $val, $attr ),
1413 "$name: $attr has the expected value";
1414 }
1415 elsif ( 'Regexp' eq ref $assertion ) {
1416 $is_ok = like $val, $assertion, "$name: $attr matches $assertion";
1417 }
1418 else {
1419 $is_ok = is_deeply $val, $assertion,
1420 "$name: $attr has the expected value";
1421 }
1422
1423 unless ($is_ok) {
1424 diag "got $val for $attr";
1425 }
1426 }
1427
1428 if ( my $runlog = $test->{runlog} ) {
1429 eval { $app->run };
1430 if ( my $err_pattern = $test->{run_error} ) {
1431 like $@, $err_pattern, "$name: expected error OK";
1432 pass;
1433 pass for 1 .. $test->{plan};
1434 }
1435 else {
1436 unless ( ok !$@, "$name: no error OK" ) {
1437 diag "$name: error: $@\n";
1438 }
1439
1440 my $gotlog = [ $app->get_log ];
1441
1442 if ( my $extra = $test->{extra} ) {
1443 $extra->($gotlog);
1444 }
1445
1446 unless (
1447 is_deeply $gotlog, $runlog,
1448 "$name: run results match"
1449 )
1450 {
1451 use Data::Dumper;
1452 diag Dumper( { wanted => $runlog, got => $gotlog } );
1453 }
1454 }
1455 }
1456}