Commit | Line | Data |
33459055 |
1 | #!perl -w |
3f2ec160 |
2 | |
15db8fc4 |
3 | BEGIN { |
a9153838 |
4 | if( $ENV{PERL_CORE} ) { |
5 | chdir 't'; |
6 | @INC = ('../lib', 'lib'); |
7 | } |
8 | else { |
9 | unshift @INC, 't/lib'; |
10 | } |
15db8fc4 |
11 | } |
12 | |
33459055 |
13 | use strict; |
33459055 |
14 | |
15 | require Test::Simple::Catch; |
16 | my($out, $err) = Test::Simple::Catch::caught(); |
30e302f8 |
17 | local $ENV{HARNESS_ACTIVE} = 0; |
33459055 |
18 | |
19 | |
3f2ec160 |
20 | # Can't use Test.pm, that's a 5.005 thing. |
21 | package My::Test; |
22 | |
b1ddf169 |
23 | # This has to be a require or else the END block below runs before |
24 | # Test::Builder's own and the ending diagnostics don't come out right. |
25 | require Test::Builder; |
26 | my $TB = Test::Builder->create; |
2c4d5b9b |
27 | $TB->plan(tests => 80); |
b1ddf169 |
28 | |
29 | sub like ($$;$) { |
30 | $TB->like(@_); |
3f2ec160 |
31 | } |
32 | |
b1ddf169 |
33 | sub is ($$;$) { |
34 | $TB->is_eq(@_); |
35 | } |
3f2ec160 |
36 | |
3e887aae |
37 | sub main::out_ok ($$) { |
38 | $TB->is_eq( $out->read, shift ); |
39 | $TB->is_eq( $err->read, shift ); |
30e302f8 |
40 | } |
41 | |
3e887aae |
42 | sub main::out_like ($$) { |
43 | my($output, $failure) = @_; |
ccbd73a4 |
44 | |
3e887aae |
45 | $TB->like( $out->read, qr/$output/ ); |
46 | $TB->like( $err->read, qr/$failure/ ); |
ccbd73a4 |
47 | } |
48 | |
30e302f8 |
49 | |
3f2ec160 |
50 | package main; |
d020a79a |
51 | |
3f2ec160 |
52 | require Test::More; |
3e887aae |
53 | our $TODO; |
2c4d5b9b |
54 | my $Total = 38; |
a9153838 |
55 | Test::More->import(tests => $Total); |
3e887aae |
56 | $out->read; # clear the plan from $out |
3f2ec160 |
57 | |
c00d8759 |
58 | # This should all work in the presence of a __DIE__ handler. |
59 | local $SIG{__DIE__} = sub { $TB->ok(0, "DIE handler called: ".join "", @_); }; |
60 | |
61 | |
30e302f8 |
62 | my $tb = Test::More->builder; |
63 | $tb->use_numbers(0); |
64 | |
b1ddf169 |
65 | my $Filename = quotemeta $0; |
66 | |
3e887aae |
67 | |
33459055 |
68 | #line 38 |
3f2ec160 |
69 | ok( 0, 'failing' ); |
3e887aae |
70 | out_ok( <<OUT, <<ERR ); |
71 | not ok - failing |
72 | OUT |
b1ddf169 |
73 | # Failed test 'failing' |
b7f9bbeb |
74 | # at $0 line 38. |
30e302f8 |
75 | ERR |
a9153838 |
76 | |
3e887aae |
77 | |
a9153838 |
78 | #line 40 |
79 | is( "foo", "bar", 'foo is bar?'); |
3e887aae |
80 | out_ok( <<OUT, <<ERR ); |
81 | not ok - foo is bar? |
82 | OUT |
b1ddf169 |
83 | # Failed test 'foo is bar?' |
b7f9bbeb |
84 | # at $0 line 40. |
3f2ec160 |
85 | # got: 'foo' |
86 | # expected: 'bar' |
3e887aae |
87 | ERR |
88 | |
89 | #line 89 |
90 | is( undef, '', 'undef is empty string?'); |
91 | out_ok( <<OUT, <<ERR ); |
92 | not ok - undef is empty string? |
93 | OUT |
b1ddf169 |
94 | # Failed test 'undef is empty string?' |
3e887aae |
95 | # at $0 line 89. |
a9153838 |
96 | # got: undef |
97 | # expected: '' |
3e887aae |
98 | ERR |
99 | |
100 | #line 99 |
101 | is( undef, 0, 'undef is 0?'); |
102 | out_ok( <<OUT, <<ERR ); |
103 | not ok - undef is 0? |
104 | OUT |
b1ddf169 |
105 | # Failed test 'undef is 0?' |
3e887aae |
106 | # at $0 line 99. |
a9153838 |
107 | # got: undef |
108 | # expected: '0' |
3e887aae |
109 | ERR |
110 | |
111 | #line 110 |
112 | is( '', 0, 'empty string is 0?' ); |
113 | out_ok( <<OUT, <<ERR ); |
114 | not ok - empty string is 0? |
115 | OUT |
b1ddf169 |
116 | # Failed test 'empty string is 0?' |
3e887aae |
117 | # at $0 line 110. |
a9153838 |
118 | # got: '' |
119 | # expected: '0' |
30e302f8 |
120 | ERR |
121 | |
3e887aae |
122 | #line 121 |
30e302f8 |
123 | isnt("foo", "foo", 'foo isnt foo?' ); |
3e887aae |
124 | out_ok( <<OUT, <<ERR ); |
125 | not ok - foo isnt foo? |
126 | OUT |
b1ddf169 |
127 | # Failed test 'foo isnt foo?' |
3e887aae |
128 | # at $0 line 121. |
ccbd73a4 |
129 | # got: 'foo' |
130 | # expected: anything else |
3e887aae |
131 | ERR |
132 | |
133 | #line 132 |
134 | isn't("foo", "foo",'foo isn\'t foo?' ); |
135 | out_ok( <<OUT, <<ERR ); |
136 | not ok - foo isn't foo? |
137 | OUT |
b1ddf169 |
138 | # Failed test 'foo isn\'t foo?' |
3e887aae |
139 | # at $0 line 132. |
ccbd73a4 |
140 | # got: 'foo' |
141 | # expected: anything else |
3e887aae |
142 | ERR |
143 | |
144 | #line 143 |
145 | isnt(undef, undef, 'undef isnt undef?'); |
146 | out_ok( <<OUT, <<ERR ); |
147 | not ok - undef isnt undef? |
148 | OUT |
b1ddf169 |
149 | # Failed test 'undef isnt undef?' |
3e887aae |
150 | # at $0 line 143. |
ccbd73a4 |
151 | # got: undef |
152 | # expected: anything else |
30e302f8 |
153 | ERR |
154 | |
3e887aae |
155 | #line 154 |
30e302f8 |
156 | like( "foo", '/that/', 'is foo like that' ); |
3e887aae |
157 | out_ok( <<OUT, <<ERR ); |
158 | not ok - is foo like that |
159 | OUT |
b1ddf169 |
160 | # Failed test 'is foo like that' |
3e887aae |
161 | # at $0 line 154. |
3f2ec160 |
162 | # 'foo' |
163 | # doesn't match '/that/' |
3e887aae |
164 | ERR |
165 | |
166 | #line 165 |
167 | unlike( "foo", '/foo/', 'is foo unlike foo' ); |
168 | out_ok( <<OUT, <<ERR ); |
169 | not ok - is foo unlike foo |
170 | OUT |
b1ddf169 |
171 | # Failed test 'is foo unlike foo' |
3e887aae |
172 | # at $0 line 165. |
a9153838 |
173 | # 'foo' |
174 | # matches '/foo/' |
30e302f8 |
175 | ERR |
176 | |
177 | # Nick Clark found this was a bug. Fixed in 0.40. |
3e887aae |
178 | # line 177 |
30e302f8 |
179 | like( "bug", '/(%)/', 'regex with % in it' ); |
3e887aae |
180 | out_ok( <<OUT, <<ERR ); |
181 | not ok - regex with % in it |
182 | OUT |
b1ddf169 |
183 | # Failed test 'regex with % in it' |
3e887aae |
184 | # at $0 line 177. |
a9153838 |
185 | # 'bug' |
186 | # doesn't match '/(%)/' |
30e302f8 |
187 | ERR |
188 | |
3e887aae |
189 | #line 188 |
30e302f8 |
190 | fail('fail()'); |
3e887aae |
191 | out_ok( <<OUT, <<ERR ); |
192 | not ok - fail() |
193 | OUT |
b1ddf169 |
194 | # Failed test 'fail()' |
3e887aae |
195 | # at $0 line 188. |
30e302f8 |
196 | ERR |
197 | |
3e887aae |
198 | #line 197 |
30e302f8 |
199 | can_ok('Mooble::Hooble::Yooble', qw(this that)); |
3e887aae |
200 | out_ok( <<OUT, <<ERR ); |
201 | not ok - Mooble::Hooble::Yooble->can(...) |
202 | OUT |
b1ddf169 |
203 | # Failed test 'Mooble::Hooble::Yooble->can(...)' |
3e887aae |
204 | # at $0 line 197. |
d020a79a |
205 | # Mooble::Hooble::Yooble->can('this') failed |
206 | # Mooble::Hooble::Yooble->can('that') failed |
3e887aae |
207 | ERR |
208 | |
209 | #line 208 |
210 | can_ok('Mooble::Hooble::Yooble', ()); |
211 | out_ok( <<OUT, <<ERR ); |
212 | not ok - Mooble::Hooble::Yooble->can(...) |
213 | OUT |
b1ddf169 |
214 | # Failed test 'Mooble::Hooble::Yooble->can(...)' |
3e887aae |
215 | # at $0 line 208. |
a9153838 |
216 | # can_ok() called with no methods |
3e887aae |
217 | ERR |
218 | |
219 | #line 218 |
220 | can_ok(undef, undef); |
221 | out_ok( <<OUT, <<ERR ); |
222 | not ok - ->can(...) |
223 | OUT |
68938d83 |
224 | # Failed test '->can(...)' |
3e887aae |
225 | # at $0 line 218. |
68938d83 |
226 | # can_ok() called with empty class or reference |
3e887aae |
227 | ERR |
228 | |
229 | #line 228 |
230 | can_ok([], "foo"); |
231 | out_ok( <<OUT, <<ERR ); |
232 | not ok - ARRAY->can('foo') |
233 | OUT |
c00d8759 |
234 | # Failed test 'ARRAY->can('foo')' |
3e887aae |
235 | # at $0 line 228. |
c00d8759 |
236 | # ARRAY->can('foo') failed |
30e302f8 |
237 | ERR |
238 | |
3e887aae |
239 | #line 238 |
30e302f8 |
240 | isa_ok(bless([], "Foo"), "Wibble"); |
3e887aae |
241 | out_ok( <<OUT, <<ERR ); |
242 | not ok - The object isa Wibble |
243 | OUT |
b1ddf169 |
244 | # Failed test 'The object isa Wibble' |
3e887aae |
245 | # at $0 line 238. |
6686786d |
246 | # The object isn't a 'Wibble' it's a 'Foo' |
3e887aae |
247 | ERR |
248 | |
249 | #line 248 |
250 | isa_ok(42, "Wibble", "My Wibble"); |
251 | out_ok( <<OUT, <<ERR ); |
252 | not ok - My Wibble isa Wibble |
253 | OUT |
b1ddf169 |
254 | # Failed test 'My Wibble isa Wibble' |
3e887aae |
255 | # at $0 line 248. |
256 | # My Wibble isn't a class or reference |
257 | ERR |
258 | |
2c4d5b9b |
259 | #line 248 |
260 | isa_ok(42, "Wibble"); |
261 | out_ok( <<OUT, <<ERR ); |
262 | not ok - The thing isa Wibble |
263 | OUT |
264 | # Failed test 'The thing isa Wibble' |
265 | # at $0 line 248. |
266 | # The thing isn't a class or reference |
267 | ERR |
268 | |
3e887aae |
269 | #line 258 |
270 | isa_ok(undef, "Wibble", "Another Wibble"); |
271 | out_ok( <<OUT, <<ERR ); |
272 | not ok - Another Wibble isa Wibble |
273 | OUT |
b1ddf169 |
274 | # Failed test 'Another Wibble isa Wibble' |
3e887aae |
275 | # at $0 line 258. |
33459055 |
276 | # Another Wibble isn't defined |
30e302f8 |
277 | ERR |
278 | |
3e887aae |
279 | #line 268 |
280 | isa_ok([], "HASH"); |
281 | out_ok( <<OUT, <<ERR ); |
282 | not ok - The reference isa HASH |
283 | OUT |
284 | # Failed test 'The reference isa HASH' |
285 | # at $0 line 268. |
286 | # The reference isn't a 'HASH' it's a 'ARRAY' |
287 | ERR |
ccbd73a4 |
288 | |
3e887aae |
289 | #line 278 |
ccbd73a4 |
290 | new_ok(undef); |
3e887aae |
291 | out_like( <<OUT, <<ERR ); |
292 | not ok - new\\(\\) died |
293 | OUT |
ccbd73a4 |
294 | # Failed test 'new\\(\\) died' |
3e887aae |
295 | # at $Filename line 278. |
ccbd73a4 |
296 | # Error was: Can't call method "new" on an undefined value at .* |
297 | ERR |
298 | |
3e887aae |
299 | #line 288 |
ccbd73a4 |
300 | new_ok( "Does::Not::Exist" ); |
3e887aae |
301 | out_like( <<OUT, <<ERR ); |
302 | not ok - new\\(\\) died |
303 | OUT |
ccbd73a4 |
304 | # Failed test 'new\\(\\) died' |
3e887aae |
305 | # at $Filename line 288. |
ccbd73a4 |
306 | # Error was: Can't locate object method "new" via package "Does::Not::Exist" .* |
307 | ERR |
308 | |
3e887aae |
309 | |
ccbd73a4 |
310 | { package Foo; sub new { } } |
311 | { package Bar; sub new { {} } } |
312 | { package Baz; sub new { bless {}, "Wibble" } } |
313 | |
3e887aae |
314 | #line 303 |
ccbd73a4 |
315 | new_ok( "Foo" ); |
3e887aae |
316 | out_ok( <<OUT, <<ERR ); |
317 | not ok - The object isa Foo |
318 | OUT |
ccbd73a4 |
319 | # Failed test 'The object isa Foo' |
3e887aae |
320 | # at $0 line 303. |
ccbd73a4 |
321 | # The object isn't defined |
322 | ERR |
323 | |
3e887aae |
324 | # line 313 |
ccbd73a4 |
325 | new_ok( "Bar" ); |
3e887aae |
326 | out_ok( <<OUT, <<ERR ); |
327 | not ok - The object isa Bar |
328 | OUT |
ccbd73a4 |
329 | # Failed test 'The object isa Bar' |
3e887aae |
330 | # at $0 line 313. |
ccbd73a4 |
331 | # The object isn't a 'Bar' it's a 'HASH' |
332 | ERR |
333 | |
3e887aae |
334 | #line 323 |
ccbd73a4 |
335 | new_ok( "Baz" ); |
3e887aae |
336 | out_ok( <<OUT, <<ERR ); |
337 | not ok - The object isa Baz |
338 | OUT |
ccbd73a4 |
339 | # Failed test 'The object isa Baz' |
3e887aae |
340 | # at $0 line 323. |
ccbd73a4 |
341 | # The object isn't a 'Baz' it's a 'Wibble' |
342 | ERR |
343 | |
3e887aae |
344 | #line 333 |
ccbd73a4 |
345 | new_ok( "Baz", [], "no args" ); |
3e887aae |
346 | out_ok( <<OUT, <<ERR ); |
347 | not ok - no args isa Baz |
348 | OUT |
ccbd73a4 |
349 | # Failed test 'no args isa Baz' |
3e887aae |
350 | # at $0 line 333. |
ccbd73a4 |
351 | # no args isn't a 'Baz' it's a 'Wibble' |
352 | ERR |
353 | |
3e887aae |
354 | #line 343 |
30e302f8 |
355 | cmp_ok( 'foo', 'eq', 'bar', 'cmp_ok eq' ); |
3e887aae |
356 | out_ok( <<OUT, <<ERR ); |
357 | not ok - cmp_ok eq |
358 | OUT |
b1ddf169 |
359 | # Failed test 'cmp_ok eq' |
3e887aae |
360 | # at $0 line 343. |
a9153838 |
361 | # got: 'foo' |
362 | # expected: 'bar' |
3e887aae |
363 | ERR |
364 | |
365 | #line 354 |
366 | cmp_ok( 42.1, '==', 23, , ' ==' ); |
367 | out_ok( <<OUT, <<ERR ); |
368 | not ok - == |
369 | OUT |
b1ddf169 |
370 | # Failed test ' ==' |
3e887aae |
371 | # at $0 line 354. |
a9153838 |
372 | # got: 42.1 |
373 | # expected: 23 |
3e887aae |
374 | ERR |
375 | |
376 | #line 365 |
377 | cmp_ok( 42, '!=', 42 , ' !=' ); |
378 | out_ok( <<OUT, <<ERR ); |
379 | not ok - != |
380 | OUT |
b1ddf169 |
381 | # Failed test ' !=' |
3e887aae |
382 | # at $0 line 365. |
ccbd73a4 |
383 | # got: 42 |
384 | # expected: anything else |
3e887aae |
385 | ERR |
386 | |
387 | #line 376 |
388 | cmp_ok( 1, '&&', 0 , ' &&' ); |
389 | out_ok( <<OUT, <<ERR ); |
390 | not ok - && |
391 | OUT |
b1ddf169 |
392 | # Failed test ' &&' |
3e887aae |
393 | # at $0 line 376. |
a9153838 |
394 | # '1' |
395 | # && |
396 | # '0' |
b1ddf169 |
397 | ERR |
398 | |
3e887aae |
399 | # line 388 |
b1ddf169 |
400 | cmp_ok( 42, 'eq', "foo", ' eq with numbers' ); |
3e887aae |
401 | out_ok( <<OUT, <<ERR ); |
402 | not ok - eq with numbers |
403 | OUT |
b1ddf169 |
404 | # Failed test ' eq with numbers' |
3e887aae |
405 | # at $0 line 388. |
a9153838 |
406 | # got: '42' |
407 | # expected: 'foo' |
30e302f8 |
408 | ERR |
409 | |
b1ddf169 |
410 | { |
3e887aae |
411 | my $warnings = ''; |
b1ddf169 |
412 | local $SIG{__WARN__} = sub { $warnings .= join '', @_ }; |
413 | |
3e887aae |
414 | # line 404 |
b1ddf169 |
415 | cmp_ok( 42, '==', "foo", ' == with strings' ); |
3e887aae |
416 | out_ok( <<OUT, <<ERR ); |
417 | not ok - == with strings |
418 | OUT |
b1ddf169 |
419 | # Failed test ' == with strings' |
3e887aae |
420 | # at $0 line 404. |
b1ddf169 |
421 | # got: 42 |
422 | # expected: foo |
423 | ERR |
3e887aae |
424 | My::Test::like( |
425 | $warnings, |
426 | qr/^Argument "foo" isn't numeric in .* at cmp_ok \[from $Filename line 404\] line 1\.\n$/ |
427 | ); |
428 | $warnings = ''; |
429 | } |
b1ddf169 |
430 | |
3e887aae |
431 | |
432 | { |
433 | my $warnings = ''; |
434 | local $SIG{__WARN__} = sub { $warnings .= join '', @_ }; |
435 | |
436 | #line 426 |
437 | cmp_ok( undef, "ne", "", "undef ne empty string" ); |
438 | |
439 | $TB->is_eq( $out->read, <<OUT ); |
440 | not ok - undef ne empty string |
441 | OUT |
442 | |
443 | TODO: { |
444 | local $::TODO = 'cmp_ok() gives the wrong "expected" for undef'; |
445 | |
446 | $TB->is_eq( $err->read, <<ERR ); |
447 | # Failed test 'undef ne empty string' |
448 | # at $0 line 426. |
449 | # got: undef |
450 | # expected: '' |
451 | ERR |
452 | } |
453 | |
454 | My::Test::like( |
455 | $warnings, |
456 | qr/^Use of uninitialized value.* in string ne at cmp_ok \[from $Filename line 426\] line 1\.\n\z/ |
457 | ); |
b1ddf169 |
458 | } |
459 | |
460 | |
30e302f8 |
461 | # generate a $!, it changes its value by context. |
462 | -e "wibblehibble"; |
463 | my $Errno_Number = $!+0; |
464 | my $Errno_String = $!.''; |
3e887aae |
465 | #line 425 |
30e302f8 |
466 | cmp_ok( $!, 'eq', '', ' eq with stringified errno' ); |
3e887aae |
467 | out_ok( <<OUT, <<ERR ); |
468 | not ok - eq with stringified errno |
469 | OUT |
b1ddf169 |
470 | # Failed test ' eq with stringified errno' |
3e887aae |
471 | # at $0 line 425. |
a9153838 |
472 | # got: '$Errno_String' |
473 | # expected: '' |
3e887aae |
474 | ERR |
475 | |
476 | #line 436 |
477 | cmp_ok( $!, '==', -1, ' eq with numerified errno' ); |
478 | out_ok( <<OUT, <<ERR ); |
479 | not ok - eq with numerified errno |
480 | OUT |
b1ddf169 |
481 | # Failed test ' eq with numerified errno' |
3e887aae |
482 | # at $0 line 436. |
a9153838 |
483 | # got: $Errno_Number |
484 | # expected: -1 |
3f2ec160 |
485 | ERR |
486 | |
3e887aae |
487 | #line 447 |
30e302f8 |
488 | use_ok('Hooble::mooble::yooble'); |
b1ddf169 |
489 | my $more_err_re = <<ERR; |
490 | # Failed test 'use Hooble::mooble::yooble;' |
3e887aae |
491 | # at $Filename line 447\\. |
b1ddf169 |
492 | # Tried to use 'Hooble::mooble::yooble'. |
493 | # Error: Can't locate Hooble.* in \\\@INC .* |
b1ddf169 |
494 | ERR |
3e887aae |
495 | out_like( |
496 | qr/^\Qnot ok - use Hooble::mooble::yooble;\E\n\z/, |
497 | qr/^$more_err_re/ |
498 | ); |
b1ddf169 |
499 | |
3e887aae |
500 | #line 460 |
30e302f8 |
501 | require_ok('ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble'); |
b1ddf169 |
502 | $more_err_re = <<ERR; |
503 | # Failed test 'require ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble;' |
3e887aae |
504 | # at $Filename line 460\\. |
b1ddf169 |
505 | # Tried to require 'ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble'. |
506 | # Error: Can't locate ALL.* in \\\@INC .* |
507 | ERR |
3e887aae |
508 | out_like( |
509 | qr/^\Qnot ok - require ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble;\E\n\z/, |
510 | qr/^$more_err_re/ |
511 | ); |
b1ddf169 |
512 | |
30e302f8 |
513 | |
30e302f8 |
514 | END { |
3e887aae |
515 | out_like( <<OUT, <<ERR ); |
30e302f8 |
516 | OUT |
a9153838 |
517 | # Looks like you failed $Total tests of $Total. |
3f2ec160 |
518 | ERR |
519 | |
3f2ec160 |
520 | exit(0); |
521 | } |