File Coverage

inc/lib/TestML/Run/TAP.pm
Criterion Covered Total %
statement 53 120 44.1
branch 12 52 23.0
condition 3 18 16.6
subroutine 15 25 60.0
pod 0 22 0.0
total 83 237 35.0


line stmt bran cond sub pod time code
1 2     2   10 use strict; use warnings;
  2     2   13  
  2         66  
  2         10  
  2         3  
  2         229  
2             package TestML::Run::TAP;
3              
4 2     2   12 use base 'TestML::Run';
  2         5  
  2         1050  
5              
6             sub run {
7 2     2 0 8 my ($class, $file) = @_;
8 2         9 $class->new->from_file($file)->test;
9 2         276 return;
10             }
11              
12             sub new {
13 2     2 0 6 my ($class, @params) = @_;
14 2         18 my $self = $class->SUPER::new(@params);
15             ##### TODO
16 2         27 $self->{count} = 0;
17              
18 2         17 return $self;
19             }
20              
21             sub testml_begin {
22 2     2 0 4 my ($self) = @_;
23              
24 2         14 $self->{checked} = 0;
25 2         7 $self->{planned} = 0;
26             }
27              
28             sub testml_end {
29 2     2 0 5 my ($self) = @_;
30              
31             $self->tap_done
32 2 50       13 unless $self->{planned};
33             }
34              
35             sub testml_eq {
36 3     3 0 6 my ($self, $got, $want, $label, $not) = @_;
37 3         6 $self->check_plan;
38              
39 3 50 33     14 if (not $not and
    50 33        
      0        
      33        
      0        
      0        
40             $got ne $want and
41             $want =~ /\n/ and
42             (not defined $self->getv('Diff') or $self->getv('Diff')) and
43             not($ENV{TESTML_NO_DIFF}) and
44 0         0 eval { require Text::Diff }
45             ) {
46 0 0       0 $self->tap_ok(0, $label ? ($label) : ());
47              
48 0         0 my $diff = Text::Diff::diff(
49             \$want,
50             \$got,
51             {
52             FILENAME_A => 'want',
53             FILENAME_B => 'got',
54             }
55             );
56              
57 0         0 $self->tap_diag($diff);
58             }
59             elsif ($not) {
60 0 0       0 $self->tap_isnt($got, $want, $label ? ($label) : ());
61             }
62             else {
63 3 50       8 $self->tap_is($got, $want, $label ? ($label) : ());
64             }
65             }
66              
67             sub testml_like {
68 7     7 0 18 my ($self, $got, $want, $label, $not) = @_;
69 7         22 $self->check_plan;
70              
71 7 50       24 if ($not) {
72 0         0 $self->tap_unlike($got, $want, $label);
73             }
74             else {
75 7         24 $self->tap_like($got, $want, $label);
76             }
77             }
78              
79             sub testml_has {
80 0     0 0 0 my ($self, $got, $want, $label, $not) = @_;
81 0         0 $self->check_plan;
82              
83 0         0 my $index = index($got, $want);
84 0 0       0 if ($not ? ($index == -1) : ($index != -1)) {
    0          
85 0         0 $self->tap_ok(1, $label);
86             }
87             else {
88 0         0 $self->tap_ok(0, $label);
89 0 0       0 my $verb = $not ? ' does' : "doesn't";
90 0         0 $self->tap_diag(" this string: '$got'\n $verb contain: '$want'");
91             }
92             }
93              
94             sub testml_list_has {
95 0     0 0 0 my ($self, $got, $want, $label) = @_;
96 0         0 $self->check_plan;
97              
98 0         0 for my $str (@$got) {
99 0 0       0 next if ref $str;
100 0 0       0 if ($str eq $want) {
101 0         0 $self->tap_ok(1, $label);
102 0         0 return;
103             }
104             }
105 0         0 $self->tap_ok(0, $label);
106 0         0 $self->tap_diag(" this list: @$got\n doesn't contain: $want");
107             }
108              
109             sub check_plan {
110 10     10 0 17 my ($self) = @_;
111              
112 10 100       26 return if $self->{checked};
113 2         5 $self->{checked} = 1;
114              
115 2 50       29 if (my $plan = $self->{vars}{Plan}) {
116 0         0 $self->{planned} = 1;
117 0         0 $self->tap_plan($plan);
118             }
119             }
120              
121             sub tap_plan {
122 0     0 0 0 my ($self, $plan) = @_;
123 0         0 $self->out("1..$plan");
124             }
125              
126             sub tap_pass {
127 10     10 0 19 my ($self, $label) = @_;
128 10 50       20 $label = '' unless defined $label;
129 10 50       24 $label = " - $label" if $label;
130 10         15 $self->out("ok ${\ ++$self->{count}}$label");
  10         84  
131 10         65 return;
132             }
133              
134             sub tap_fail {
135 0     0 0 0 my ($self, $label) = @_;
136 0 0       0 $label = '' unless defined $label;
137 0 0       0 $label = " - $label" if $label;
138 0         0 $self->out("not ok ${\ ++$self->{count}}$label");
  0         0  
139 0         0 return;
140             }
141              
142             sub tap_ok {
143 0     0 0 0 my ($self, $ok, $label) = @_;
144 0 0       0 if ($ok) {
145 0         0 $self->tap_pass($label);
146             }
147             else {
148 0         0 $self->tap_fail($label);
149             }
150             }
151              
152             sub tap_is {
153 3     3 0 4 my ($self, $got, $want, $label) = @_;
154 3         4 my $ok = $got eq $want;
155 3 50       4 if ($ok) {
156 3         6 $self->tap_pass($label);
157             }
158             else {
159 0         0 $self->tap_fail($label);
160 0         0 $self->show_error(
161             ' got:', $got,
162             ' expected:', $want,
163             $label,
164             );
165             }
166             }
167              
168             sub tap_isnt {
169 0     0 0 0 my ($self, $got, $want, $label) = @_;
170 0         0 my $ok = $got ne $want;
171 0 0       0 if ($ok) {
172 0         0 $self->tap_pass($label);
173             }
174             else {
175 0         0 $self->tap_fail($label);
176 0         0 $self->show_error(
177             ' got:', $got,
178             ' expected:', 'anything else',
179             $label,
180             );
181             }
182             }
183              
184             sub tap_like {
185 7     7 0 15 my ($self, $got, $want, $label) = @_;
186 7 50       68 if ($got =~ $want) {
187 7         18 $self->tap_pass($label);
188             }
189             else {
190 0         0 $self->tap_fail($label);
191             }
192             }
193              
194             sub tap_unlike {
195 0     0 0 0 my ($self, $got, $want, $label) = @_;
196 0 0       0 if ($got !~ $want) {
197 0         0 $self->tap_pass($label);
198             }
199             else {
200 0         0 $self->tap_fail($label);
201             }
202             }
203              
204             sub tap_diag {
205 0     0 0 0 my ($self, $msg) = @_;
206 0         0 my $str = $msg;
207 0         0 $str =~ s/^/# /mg;
208 0         0 $self->err($str);
209             }
210              
211             sub tap_done {
212 2     2 0 3 my ($self) = @_;
213 2         6 $self->out("1..${\ $self->{count}}");
  2         9  
214             }
215              
216             sub show_error {
217 0     0 0 0 my ($self, $got_prefix, $got, $want_prefix, $want, $label) = @_;
218 0 0       0 if ($label) {
219 0         0 $self->err("# Failed test '$label'");
220             }
221             else {
222 0         0 $self->err("# Failed test");
223             }
224              
225 0 0       0 if (not ref $got) {
226 0         0 $got = "'$got'"
227             }
228 0         0 $self->tap_diag("$got_prefix $got");
229              
230 0 0       0 if (not ref $want) {
231 0         0 $want = "'$want'"
232             }
233 0         0 $self->tap_diag("$want_prefix $want");
234             }
235              
236             sub out {
237 12     12 0 22 my ($self, $str) = @_;
238 12         58 local $| = 1;
239 12         45 binmode STDOUT, ':utf8';
240 12         252 print STDOUT "$str$/";
241             }
242              
243             sub err {
244 0     0 0   my ($self, $str) = @_;
245 0           binmode STDERR, ':utf8';
246 0           print STDERR "$str$/";
247             }
248              
249             1;