14 if (! -c "/dev/null") {
15 print "1..0 # Skip: no /dev/null\n";
19 my $dev_tty = '/dev/tty';
20 $dev_tty = 'TT:' if ($^O eq 'VMS');
22 print "1..0 # Skip: no $dev_tty\n";
26 print "1..0 # Skip: \$ENV{PERL5DB} is already set to '$ENV{PERL5DB}'\n";
33 my $rc_filename = '.perldb';
36 open my $rc_fh, '>', $rc_filename
41 # overly permissive perms gives "Must not source insecure rcfile"
42 # and hangs at the DB(1> prompt
43 chmod 0644, $rc_filename;
50 open my $in, '<', $filename
51 or die "Cannot open '$filename' for slurping - $!";
61 my $out_fn = 'db.out';
65 return _slurp($out_fn);
69 # Test for Proxy constants
74 &parse_options("NonStop=0 ReadLine=0 TTY=db.out LineInfo=db.out");
86 my $output = runperl(switches => [ '-d' ], stderr => 1, progfile => '../lib/perl5db/t/proxy-constants');
87 is($output, "", "proxy constant subroutines");
90 # [perl #66110] Call a subroutine inside a regex
92 local $ENV{PERLDB_OPTS} = "ReadLine=0 NonStop=1";
93 my $output = runperl(switches => [ '-d' ], stderr => 1, progfile => '../lib/perl5db/t/rt-66110');
94 like($output, "All tests successful.", "[perl #66110]");
96 # [ perl #116769] Frame=2
98 local $ENV{PERLDB_OPTS} = "frame=2 nonstop";
99 my $output = runperl( switches => [ '-d' ], prog => 'print q{success}' );
100 is( $?, 0, '[perl #116769] frame=2 does not crash debugger, exit == 0' );
101 like( $output, 'success' , '[perl #116769] code is run' );
103 # [ perl #116771] autotrace
105 local $ENV{PERLDB_OPTS} = "autotrace nonstop";
106 my $output = runperl( switches => [ '-d' ], prog => 'print q{success}' );
107 is( $?, 0, '[perl #116771] autotrace does not crash debugger, exit == 0' );
108 like( $output, 'success' , '[perl #116771] code is run' );
113 &parse_options("NonStop=0 TTY=db.out LineInfo=db.out");
116 push (@DB::typeahead,
131 my $self = bless {}, $class;
142 $self->{_cmds} = shift;
145 return $self->{_cmds};
152 $self->{_prog} = shift;
155 return $self->{_prog};
162 $self->{_output} = shift;
165 return $self->{_output};
174 $self->{_include_t} = shift;
177 return $self->{_include_t};
186 $self->{_stderr_val} = shift;
189 return $self->{_stderr_val};
198 $self->{field} = shift;
201 return $self->{field};
210 $self->{_switches} = shift;
213 return $self->{_switches};
222 $self->{_contents} = shift;
225 return $self->{_contents};
230 my ($self, $args) = @_;
232 my $cmds = $args->{cmds};
234 if (ref($cmds) ne 'ARRAY') {
235 die "cmds must be an array of commands.";
240 my $prog = $args->{prog};
242 if (ref($prog) ne '' or !defined($prog)) {
243 die "prog should be a path to a program file.";
248 $self->_include_t($args->{include_t} ? 1 : 0);
250 $self->_stderr_val(exists($args->{stderr}) ? $args->{stderr} : 1);
252 if (exists($args->{switches}))
254 $self->_switches($args->{switches});
264 my ($self, $str) = @_;
266 $str =~ s/(["\@\$\\])/\\$1/g;
276 my $rc = qq{&parse_options("NonStop=0 TTY=db.out LineInfo=db.out");\n};
281 q#push (@DB::typeahead,#,
282 (map { $self->_quote($_) . "," } @{$self->_cmds()}),
288 # I guess two objects like that cannot be used at the same time.
296 ($self->_switches ? (@{$self->_switches()}) : ('-d')),
297 ($self->_include_t ? ('-I', '../lib/perl5db/t') : ())
299 (defined($self->_stderr_val())
300 ? (stderr => $self->_stderr_val())
303 progfile => $self->_prog()
306 $self->_output($output);
308 $self->_contents(::_out_contents());
315 return shift->_output();
319 my ($self, $re, $msg) = @_;
321 local $::Level = $::Level + 1;
322 ::like($self->_output(), $re, $msg);
326 my ($self, $re, $msg) = @_;
328 local $::Level = $::Level + 1;
329 ::unlike($self->_output(), $re, $msg);
333 my ($self, $re, $msg) = @_;
335 local $::Level = $::Level + 1;
336 ::like($self->_contents(), $re, $msg);
339 sub contents_unlike {
340 my ($self, $re, $msg) = @_;
342 local $::Level = $::Level + 1;
343 ::unlike($self->_contents(), $re, $msg);
349 local $ENV{PERLDB_OPTS} = "ReadLine=0";
350 my $target = '../lib/perl5db/t/eval-line-bug';
351 my $wrapper = DebugWrap->new(
361 "p \@{'main::_<$target'}",
367 $wrapper->contents_like(
369 'The ${main::_<filename} variable in the debugger was not destroyed',
373 sub _calc_generic_wrapper
377 my $extra_opts = delete($args->{extra_opts});
379 local $ENV{PERLDB_OPTS} = "ReadLine=0" . $extra_opts;
380 return DebugWrap->new(
382 cmds => delete($args->{cmds}),
383 prog => delete($args->{prog}),
389 sub _calc_new_var_wrapper
392 return _calc_generic_wrapper(
399 'x "new_var = <$new_var>\\n"',
407 sub _calc_threads_wrapper
411 return _calc_new_var_wrapper(
413 switches => [ '-dt', ],
421 _calc_new_var_wrapper({ prog => '../lib/perl5db/t/eval-line-bug'})
424 "no strict 'vars' in evaluated lines.",
429 _calc_new_var_wrapper(
431 prog => '../lib/perl5db/t/lvalue-bug',
436 'lvalue subs work in the debugger',
441 _calc_new_var_wrapper(
443 prog => '../lib/perl5db/t/symbol-table-bug',
444 extra_opts => "NonStop=1",
448 qr/Undefined symbols 0/,
449 'there are no undefined values in the symbol table',
455 if ( $Config{usethreads} ) {
456 skip('This perl has threads, skipping non-threaded debugger tests');
459 my $error = 'This Perl not built to support threads';
460 _calc_threads_wrapper(
462 prog => '../lib/perl5db/t/eval-line-bug',
466 'Perl debugger correctly complains that it was not built with threads',
473 if ( $Config{usethreads} ) {
474 _calc_threads_wrapper(
476 prog => '../lib/perl5db/t/symbol-table-bug',
479 qr/Undefined symbols 0/,
480 'there are no undefined values in the symbol table when running with thread support',
484 skip("This perl is not threaded, skipping threaded debugger tests");
490 local $ENV{PERLDB_OPTS};
491 my $wrapper = DebugWrap->new(
498 prog => '../lib/perl5db/t/rt-61222',
502 $wrapper->contents_unlike(qr/INCORRECT/, "[perl #61222]");
505 sub _calc_trace_wrapper
509 return _calc_generic_wrapper(
522 # [perl 104168] level option for tracing
524 my $wrapper = _calc_trace_wrapper({ prog => '../lib/perl5db/t/rt-104168' });
525 $wrapper->contents_like(qr/level 2/, "[perl #104168] - level 2 appears");
526 $wrapper->contents_unlike(qr/baz/, "[perl #104168] - no 'baz'");
531 my $wrapper = _calc_trace_wrapper(
533 prog => '../lib/perl5db/t/taint',
534 extra_opts => ' NonStop=1',
535 switches => [ '-d', '-T', ],
539 my $output = $wrapper->get_output();
540 chomp $output if $^O eq 'VMS'; # newline guaranteed at EOF
541 is($output, '[$^X][done]', "taint");
544 # Testing that we can set a line in the middle of the file.
546 my $wrapper = DebugWrap->new(
550 'b ../lib/perl5db/t/MyModule.pm:12',
552 q/do { use IO::Handle; STDOUT->autoflush(1); print "Var=$var\n"; }/,
557 prog => '../lib/perl5db/t/filename-line-breakpoint'
561 $wrapper->output_like(qr/
569 "Can set breakpoint in a line in the middle of the file.");
572 # Testing that we can set a breakpoint
574 my $wrapper = DebugWrap->new(
576 prog => '../lib/perl5db/t/breakpoint-bug',
581 q/do { use IO::Handle; STDOUT->autoflush(1); print "X={$x}\n"; }/,
588 $wrapper->output_like(
590 "Can set breakpoint in a line."
594 # Testing that we can disable a breakpoint at a numeric line.
596 my $wrapper = DebugWrap->new(
598 prog => '../lib/perl5db/t/disable-breakpoints-1',
605 q/print "X={$x}\n";/,
612 $wrapper->output_like(qr/X=\{SecondVal\}/ms,
613 "Can set breakpoint in a line.");
616 # Testing that we can re-enable a breakpoint at a numeric line.
618 my $wrapper = DebugWrap->new(
620 prog => '../lib/perl5db/t/disable-breakpoints-2',
629 q/print "X={$x}\n";/,
636 $wrapper->output_like(
638 X=\{SecondValOneHundred\}
640 "Can set breakpoint in a line."
645 # Disable and enable for breakpoints on outer files.
647 my $wrapper = DebugWrap->new(
652 'b ../lib/perl5db/t/EnableModule.pm:14',
653 'disable ../lib/perl5db/t/EnableModule.pm:14',
655 'enable ../lib/perl5db/t/EnableModule.pm:14',
657 q/print "X={$x}\n";/,
661 prog => '../lib/perl5db/t/disable-breakpoints-3',
666 $wrapper->output_like(qr/
667 X=\{SecondValTwoHundred\}
669 "Can set breakpoint in a line.");
672 # Testing that the prompt with the information appears.
674 my $wrapper = DebugWrap->new(
677 prog => '../lib/perl5db/t/disable-breakpoints-1',
681 $wrapper->contents_like(qr/
682 ^main::\([^\)]*\bdisable-breakpoints-1:2\):\n
683 2:\s+my\ \$x\ =\ "One";\n
685 "Prompt should display the first line of code.");
688 # Testing that R (restart) and "B *" work.
690 my $wrapper = DebugWrap->new(
700 q/print "X={$x};dummy={$dummy}\n";/,
703 prog => '../lib/perl5db/t/disable-breakpoints-1',
707 $wrapper->output_like(qr/
708 X=\{FirstVal\};dummy=\{1\}
710 "Restart and delete all breakpoints work properly.");
714 my $wrapper = DebugWrap->new(
719 q/print "X={$x}\n";/,
723 prog => '../lib/perl5db/t/disable-breakpoints-1',
727 $wrapper->output_like(qr/
730 "'c line_num' is working properly.");
734 my $wrapper = DebugWrap->new(
742 q/print "Exp={$exp}\n";/,
745 prog => '../lib/perl5db/t/break-on-dot',
749 $wrapper->output_like(qr/
752 "'b .' is working correctly.");
755 # Testing that the prompt with the information appears inside a subroutine call.
756 # See https://rt.perl.org/rt3/Ticket/Display.html?id=104820
758 my $wrapper = DebugWrap->new(
765 prog => '../lib/perl5db/t/with-subroutine',
769 $wrapper->contents_like(
771 ^main::back\([^\)\n]*\bwith-subroutine:15\):[\ \t]*\n
772 ^15:\s*print\ "hello\ back\\n";
774 "Prompt should display the line of code inside a subroutine.");
777 # Checking that the p command works.
779 my $wrapper = DebugWrap->new(
783 'p "<<<" . (4*6) . ">>>"',
786 prog => '../lib/perl5db/t/with-subroutine',
790 $wrapper->contents_like(
797 my $wrapper = DebugWrap->new(
804 prog => '../lib/perl5db/t/with-subroutine',
808 $wrapper->contents_like(
809 # qr/^0\s+HASH\([^\)]+\)\n\s+500 => 600\n/,
810 qr/^0\s+HASH\([^\)]+\)\n\s+500 => 600\n/ms,
815 # Tests for x with AutoTrace=1.
817 my $wrapper = DebugWrap->new(
828 prog => '../lib/perl5db/t/with-subroutine',
832 $wrapper->contents_like(
833 # qr/^0\s+HASH\([^\)]+\)\n\s+500 => 600\n/,
834 qr/^0\s+SCALAR\([^\)]+\)\n\s+-> 'hello world'\n/ms,
835 "x after AutoTrace=1 command is working."
839 # Tests for "T" (stack trace).
841 my $prog_fn = '../lib/perl5db/t/rt-104168';
842 my $wrapper = DebugWrap->new(
853 my $re_text = join('',
856 "%s = %s\\(\\) called from file " .
857 "'" . quotemeta($prog_fn) . "' line %s\\n",
858 (map { quotemeta($_) } @$_)
862 ['.', 'main::baz', 14,],
863 ['.', 'main::bar', 9,],
864 ['.', 'main::foo', 6],
867 $wrapper->contents_like(
868 # qr/^0\s+HASH\([^\)]+\)\n\s+500 => 600\n/,
876 my $wrapper = DebugWrap->new(
883 q/print "X={$x};dummy={$dummy}\n";/,
886 prog => '../lib/perl5db/t/disable-breakpoints-1'
890 $wrapper->output_like(qr/
891 X=\{SecondVal\};dummy=\{1\}
893 'test for s - single step',
898 my $wrapper = DebugWrap->new(
906 q/print "Exp={$exp}\n";/,
909 prog => '../lib/perl5db/t/break-on-dot'
913 $wrapper->output_like(qr/
916 "'b .' is working correctly.");
920 my $prog_fn = '../lib/perl5db/t/rt-104168';
921 my $wrapper = DebugWrap->new(
932 $wrapper->contents_like(
934 ^main::foo\([^\)\n]*\brt-104168:9\):[\ \t]*\n
937 'Test for the s command.',
942 my $wrapper = DebugWrap->new(
946 's uncalled_subroutine()',
951 prog => '../lib/perl5db/t/uncalled-subroutine'}
954 $wrapper->output_like(
956 'uncalled_subroutine was called after s EXPR()',
961 my $wrapper = DebugWrap->new(
965 'n uncalled_subroutine()',
969 prog => '../lib/perl5db/t/uncalled-subroutine',
973 $wrapper->output_like(
975 'uncalled_subroutine was called after n EXPR()',
980 my $wrapper = DebugWrap->new(
992 prog => '../lib/perl5db/t/fact',
996 $wrapper->output_like(
998 'b subroutine works fine',
1002 # Test for 'M' (module list).
1004 my $wrapper = DebugWrap->new(
1011 prog => '../lib/perl5db/t/load-modules'
1015 $wrapper->contents_like(
1016 qr[Scalar/Util\.pm],
1017 'M (module list) works fine',
1022 my $wrapper = DebugWrap->new(
1030 'print "Var=$var\n";',
1033 prog => '../lib/perl5db/t/test-r-statement',
1037 $wrapper->output_like(
1045 'r statement is working properly.',
1050 my $wrapper = DebugWrap->new(
1057 prog => '../lib/perl5db/t/test-l-statement-1',
1061 $wrapper->contents_like(
1063 ^1==>\s+\$x\ =\ 1;\n
1064 2:\s+print\ "1\\n";\n
1067 5:\s+print\ "2\\n";\n
1069 'l statement is working properly (test No. 1).',
1074 my $wrapper = DebugWrap->new(
1086 prog => '../lib/perl5db/t/test-l-statement-1',
1090 my $first_l_out = qr/
1092 2:\s+print\ "1\\n";\n
1095 5:\s+print\ "2\\n";\n
1098 8:\s+print\ "3\\n";\n
1103 my $second_l_out = qr/
1104 11:\s+print\ "4\\n";\n
1107 14:\s+print\ "5\\n";\n
1110 17:\s+print\ "6\\n";\n
1113 20:\s+print\ "7\\n";\n
1115 $wrapper->contents_like(
1118 [^\n]*?DB<\d+>\ \#\ After\ l\ 1\n
1120 [^\n]*?DB<\d+>\ l\s*\n
1122 [^\n]*?DB<\d+>\ \#\ After\ l\ 2\n
1124 [^\n]*?DB<\d+>\ -\s*\n
1126 [^\n]*?DB<\d+>\ \#\ After\ -\n
1128 'l followed by l and then followed by -',
1133 my $wrapper = DebugWrap->new(
1140 prog => '../lib/perl5db/t/test-l-statement-2',
1144 my $first_l_out = qr/
1146 7:\s+my\ \$n\ =\ shift;\n
1147 8:\s+if\ \(\$n\ >\ 1\)\ \{\n
1148 9:\s+return\ \$n\ \*\ fact\(\$n\ -\ 1\);
1151 $wrapper->contents_like(
1156 'l subroutine_name',
1161 my $wrapper = DebugWrap->new(
1167 # Repeat several times to avoid @typeahead problems.
1174 prog => '../lib/perl5db/t/test-l-statement-2',
1179 ^main::fact\([^\n]*?:7\):\n
1180 ^7:\s+my\ \$n\ =\ shift;\n
1183 $wrapper->contents_like(
1188 'Test the "." command',
1192 # Testing that the f command works.
1194 my $wrapper = DebugWrap->new(
1198 'f ../lib/perl5db/t/MyModule.pm',
1201 q/do { use IO::Handle; STDOUT->autoflush(1); print "Var=$var\n"; }/,
1206 prog => '../lib/perl5db/t/filename-line-breakpoint'
1210 $wrapper->output_like(qr/
1218 "f command is working.",
1222 # We broke the /pattern/ command because apparently the CORE::eval-s inside
1223 # lib/perl5db.pl cannot handle lexical variable properly. So we now fix this
1228 # 1. Go over the rest of the "eval"s in lib/perl5db.t and see if they cause
1231 my $wrapper = DebugWrap->new(
1238 prog => '../lib/perl5db/t/eval-line-bug',
1242 $wrapper->contents_like(
1243 qr/12: \s* for\ my\ \$q\ \(1\ \.\.\ 10\)\ \{/msx,
1244 "/pat/ command is working and found a match.",
1249 my $wrapper = DebugWrap->new(
1258 prog => '../lib/perl5db/t/eval-line-bug',
1262 $wrapper->contents_like(
1263 qr/12: \s* for\ my\ \$q\ \(1\ \.\.\ 10\)\ \{/msx,
1264 "?pat? command is working and found a match.",
1268 # Test the L command.
1270 my $wrapper = DebugWrap->new(
1279 prog => '../lib/perl5db/t/eval-line-bug',
1283 $wrapper->contents_like(
1285 ^\S*?eval-line-bug:\n
1286 \s*6:\s*my\ \$i\ =\ 5;\n
1287 \s*break\ if\ \(1\)\n
1288 \s*13:\s*\$i\ \+=\ \$q;\n
1289 \s*break\ if\ \(\(\$q\ ==\ 5\)\)\n
1291 "L command is listing breakpoints",
1295 # Test the L command for watch expressions.
1297 my $wrapper = DebugWrap->new(
1305 prog => '../lib/perl5db/t/eval-line-bug',
1309 $wrapper->contents_like(
1311 ^Watch-expressions:\n
1314 "L command is listing watch expressions",
1319 my $wrapper = DebugWrap->new(
1329 prog => '../lib/perl5db/t/eval-line-bug',
1333 $wrapper->contents_like(
1335 ^Watch-expressions:\n
1339 "L command is not listing deleted watch expressions",
1343 # Test the L command.
1345 my $wrapper = DebugWrap->new(
1354 prog => '../lib/perl5db/t/eval-line-bug',
1358 $wrapper->contents_like(
1360 ^\S*?eval-line-bug:\n
1361 \s*6:\s*my\ \$i\ =\ 5;\n
1362 \s*break\ if\ \(1\)\n
1363 \s*13:\s*\$i\ \+=\ \$q;\n
1364 \s*action:\s+print\ \$i\n
1366 "L command is listing actions and breakpoints",
1371 my $wrapper = DebugWrap->new(
1378 prog => '../lib/perl5db/t/rt-104168',
1382 $wrapper->contents_like(
1393 my $wrapper = DebugWrap->new(
1400 prog => '../lib/perl5db/t/rt-104168',
1404 $wrapper->contents_like(
1410 "S command with regex",
1415 my $wrapper = DebugWrap->new(
1422 prog => '../lib/perl5db/t/rt-104168',
1426 $wrapper->contents_unlike(
1430 "S command with negative regex",
1433 $wrapper->contents_like(
1437 "S command with negative regex - what it still matches",
1441 # Test the 'a' command.
1443 my $wrapper = DebugWrap->new(
1447 'a 13 print "\nVar<Q>=$q\n"',
1451 prog => '../lib/perl5db/t/eval-line-bug',
1455 $wrapper->output_like(qr#
1460 "a command is working",
1464 # Test the 'a' command with no line number.
1466 my $wrapper = DebugWrap->new(
1471 q/a print "Hello " . (3 * 4) . "\n";/,
1475 prog => '../lib/perl5db/t/test-a-statement-1',
1479 $wrapper->output_like(qr#
1480 (?:^Hello\ 12\n.*?){4}
1482 "a command with no line number is working",
1486 # Test the 'A' command
1488 my $wrapper = DebugWrap->new(
1492 'a 13 print "\nVar<Q>=$q\n"',
1497 prog => '../lib/perl5db/t/eval-line-bug',
1501 $wrapper->output_like(
1502 qr#\A\z#msx, # The empty string.
1503 "A command (for removing actions) is working",
1507 # Test the 'A *' command
1509 my $wrapper = DebugWrap->new(
1513 'a 6 print "\nFail!\n"',
1514 'a 13 print "\nVar<Q>=$q\n"',
1519 prog => '../lib/perl5db/t/eval-line-bug',
1523 $wrapper->output_like(
1524 qr#\A\z#msx, # The empty string.
1525 "'A *' command (for removing all actions) is working",
1530 my $wrapper = DebugWrap->new(
1537 'print "\nIDX=<$idx>\n"',
1540 prog => '../lib/perl5db/t/test-w-statement-1',
1545 $wrapper->contents_like(qr#
1547 \s+old\ value:\s+'1'\n
1548 \s+new\ value:\s+'2'\n
1550 'w command - watchpoint changed',
1552 $wrapper->output_like(qr#
1555 "w command - correct output from IDX",
1560 my $wrapper = DebugWrap->new(
1568 'print "\nIDX=<$idx>\n"',
1571 prog => '../lib/perl5db/t/test-w-statement-1',
1575 $wrapper->contents_unlike(qr#
1578 'W command - watchpoint was deleted',
1581 $wrapper->output_like(qr#
1584 "W command - stopped at end.",
1588 # Test the W * command.
1590 my $wrapper = DebugWrap->new(
1599 'print "\nIDX=<$idx>\n"',
1602 prog => '../lib/perl5db/t/test-w-statement-1',
1606 $wrapper->contents_unlike(qr#
1609 '"W *" command - watchpoint was deleted',
1612 $wrapper->output_like(qr#
1615 '"W *" command - stopped at end.',
1619 # Test the 'o' command (without further arguments).
1621 my $wrapper = DebugWrap->new(
1628 prog => '../lib/perl5db/t/test-w-statement-1',
1632 $wrapper->contents_like(qr#
1633 ^\s*warnLevel\ =\ '1'\n
1635 q#"o" command (without arguments) displays warnLevel#,
1638 $wrapper->contents_like(qr#
1639 ^\s*signalLevel\ =\ '1'\n
1641 q#"o" command (without arguments) displays signalLevel#,
1644 $wrapper->contents_like(qr#
1645 ^\s*dieLevel\ =\ '1'\n
1647 q#"o" command (without arguments) displays dieLevel#,
1650 $wrapper->contents_like(qr#
1651 ^\s*hashDepth\ =\ 'N/A'\n
1653 q#"o" command (without arguments) displays hashDepth#,
1657 # Test the 'o' query command.
1659 my $wrapper = DebugWrap->new(
1663 'o hashDepth? signalLevel?',
1666 prog => '../lib/perl5db/t/test-w-statement-1',
1670 $wrapper->contents_unlike(qr#warnLevel#,
1671 q#"o" query command does not display warnLevel#,
1674 $wrapper->contents_like(qr#
1675 ^\s*signalLevel\ =\ '1'\n
1677 q#"o" query command displays signalLevel#,
1680 $wrapper->contents_unlike(qr#dieLevel#,
1681 q#"o" query command does not display dieLevel#,
1684 $wrapper->contents_like(qr#
1685 ^\s*hashDepth\ =\ 'N/A'\n
1687 q#"o" query command displays hashDepth#,
1691 # Test the 'o' set command.
1693 my $wrapper = DebugWrap->new(
1701 prog => '../lib/perl5db/t/test-w-statement-1',
1705 $wrapper->contents_like(qr/
1706 ^\s*(signalLevel\ =\ '0'\n)
1710 q#o set command works#,
1713 $wrapper->contents_like(qr#
1714 ^\s*hashDepth\ =\ 'N/A'\n
1716 q#o set command - hashDepth#,
1720 # Test the '<' and "< ?" commands.
1722 my $wrapper = DebugWrap->new(
1726 q/< print "\nX=<$x>\n"/,
1732 prog => '../lib/perl5db/t/disable-breakpoints-1',
1736 $wrapper->contents_like(qr/
1737 ^pre-perl\ commands:\n
1738 \s*<\ --\ print\ "\\nX=<\$x>\\n"\n
1740 q#Test < and < ? commands - contents.#,
1743 $wrapper->output_like(qr#
1746 q#Test < and < ? commands - output.#,
1750 # Test the '< *' command.
1752 my $wrapper = DebugWrap->new(
1756 q/< print "\nX=<$x>\n"/,
1762 prog => '../lib/perl5db/t/disable-breakpoints-1',
1766 $wrapper->output_unlike(qr/FirstVal/,
1767 q#Test the '< *' command.#,
1771 # Test the '>' and "> ?" commands.
1773 my $wrapper = DebugWrap->new(
1778 q/> print "\nFOO=<$::foo>\n"/,
1784 prog => '../lib/perl5db/t/disable-breakpoints-1',
1788 $wrapper->contents_like(qr/
1789 ^post-perl\ commands:\n
1790 \s*>\ --\ print\ "\\nFOO=<\$::foo>\\n"\n
1792 q#Test > and > ? commands - contents.#,
1795 $wrapper->output_like(qr#
1798 q#Test > and > ? commands - output.#,
1802 # Test the '> *' command.
1804 my $wrapper = DebugWrap->new(
1808 q/> print "\nFOO=<$::foo>\n"/,
1814 prog => '../lib/perl5db/t/disable-breakpoints-1',
1818 $wrapper->output_unlike(qr/FOO=/,
1819 q#Test the '> *' command.#,
1823 # Test the < and > commands together
1825 my $wrapper = DebugWrap->new(
1830 q/< $::lorem += 10;/,
1831 q/> print "\nLOREM=<$::lorem>\n"/,
1838 prog => '../lib/perl5db/t/disable-breakpoints-1',
1842 $wrapper->output_like(qr#
1845 q#Test < and > commands. #,
1849 # Test the { ? and { [command] commands.
1851 my $wrapper = DebugWrap->new(
1862 prog => '../lib/perl5db/t/disable-breakpoints-1',
1866 $wrapper->contents_like(qr#
1867 ^No\ pre-debugger\ actions\.\n
1869 ^pre-debugger\ commands:\n
1872 ^5==>b\s+\$x\ =\ "FirstVal";\n
1876 9:\s+\$x\ =\ "SecondVal";\n
1879 'Test the pre-prompt debugger commands',
1883 # Test the { * command.
1885 my $wrapper = DebugWrap->new(
1893 q/print (("One" x 5), "\n");/,
1896 prog => '../lib/perl5db/t/disable-breakpoints-1',
1900 $wrapper->contents_like(qr#
1901 ^All\ \{\ actions\ cleared\.\n
1903 'Test the { * command',
1906 $wrapper->output_like(qr/OneOneOneOneOne/,
1907 '{ * test - output is OK.',
1911 # Test the ! command.
1913 my $wrapper = DebugWrap->new(
1921 prog => '../lib/perl5db/t/disable-breakpoints-1',
1925 $wrapper->contents_like(qr#
1926 (^3:\s+my\ \$dummy\ =\ 0;\n
1928 5:\s+\$x\ =\ "FirstVal";)\n
1933 'Test the ! command (along with l 3-5)',
1937 # Test the ! -number command.
1939 my $wrapper = DebugWrap->new(
1948 prog => '../lib/perl5db/t/disable-breakpoints-1',
1952 $wrapper->contents_like(qr#
1953 (^3:\s+my\ \$dummy\ =\ 0;\n
1955 5:\s+\$x\ =\ "FirstVal";)\n
1957 ^2==\>\s+my\ \$x\ =\ "One";\n
1962 'Test the ! -n command (along with l)',
1966 # Test the 'source' command.
1968 my $wrapper = DebugWrap->new(
1972 'source ../lib/perl5db/t/source-cmd-test.perldb',
1973 # If we have a 'q' here, then the typeahead will override the
1974 # input, and so it won't be reached - solution:
1975 # put a q inside the .perldb commands.
1976 # ( This may be a bug or a misfeature. )
1978 prog => '../lib/perl5db/t/disable-breakpoints-1',
1982 $wrapper->contents_like(qr#
1983 ^3:\s+my\ \$dummy\ =\ 0;\n
1985 5:\s+\$x\ =\ "FirstVal";\n
1989 9:\s+\$x\ =\ "SecondVal";\n
1992 'Test the source command (along with l)',
1996 # Test the 'source' command being traversed from withing typeahead.
1998 my $wrapper = DebugWrap->new(
2002 'source ../lib/perl5db/t/source-cmd-test-no-q.perldb',
2005 prog => '../lib/perl5db/t/disable-breakpoints-1',
2009 $wrapper->contents_like(qr#
2010 ^3:\s+my\ \$dummy\ =\ 0;\n
2012 5:\s+\$x\ =\ "FirstVal";\n
2016 9:\s+\$x\ =\ "SecondVal";\n
2019 'Test the source command inside a typeahead',
2023 # Test the 'H -number' command.
2025 my $wrapper = DebugWrap->new(
2038 prog => '../lib/perl5db/t/disable-breakpoints-1',
2042 $wrapper->contents_like(qr#
2044 \d+:\s+x\ \(20\+4\)\n
2047 \d+:\s+x\ "Hello\ World"\n
2051 'Test the H -num command',
2055 # Add a test for H (without arguments)
2057 my $wrapper = DebugWrap->new(
2070 prog => '../lib/perl5db/t/disable-breakpoints-1',
2074 $wrapper->contents_like(qr#
2075 ^\d+:\s+x\ \(20\+4\)\n
2078 \d+:\s+x\ "Hello\ World"\n
2082 'Test the H command (without a number.)',
2087 my $wrapper = DebugWrap->new(
2096 prog => '../lib/perl5db/t/test-l-statement-1',
2100 $wrapper->contents_like(
2102 ^1==>\s+\$x\ =\ 1;\n
2103 2:\s+print\ "1\\n";\n
2106 5:\s+print\ "2\\n";\n
2108 'Test the = (command alias) command.',
2112 # Test the m statement.
2114 my $wrapper = DebugWrap->new(
2121 prog => '../lib/perl5db/t/disable-breakpoints-1',
2125 $wrapper->contents_like(qr#
2126 ^via\ UNIVERSAL:\ DOES$
2128 "Test m for main - 1",
2131 $wrapper->contents_like(qr#
2132 ^via\ UNIVERSAL:\ can$
2134 "Test m for main - 2",
2138 # Test the m statement.
2140 my $wrapper = DebugWrap->new(
2149 prog => '../lib/perl5db/t/test-m-statement-1',
2153 $wrapper->contents_like(qr#^greet$#ms,
2154 "Test m for obj - 1",
2157 $wrapper->contents_like(qr#^via UNIVERSAL: can$#ms,
2158 "Test m for obj - 1",
2162 # Test the M command.
2164 my $wrapper = DebugWrap->new(
2171 prog => '../lib/perl5db/t/test-m-statement-1',
2175 $wrapper->contents_like(qr#
2176 ^'strict\.pm'\ =>\ '\d+\.\d+\ from
2183 # Test the recallCommand option.
2185 my $wrapper = DebugWrap->new(
2189 'o recallCommand=%',
2195 prog => '../lib/perl5db/t/disable-breakpoints-1',
2199 $wrapper->contents_like(qr#
2200 (^3:\s+my\ \$dummy\ =\ 0;\n
2202 5:\s+\$x\ =\ "FirstVal";)\n
2204 ^2==\>\s+my\ \$x\ =\ "One";\n
2209 'Test the o recallCommand option',
2213 # Test the dieLevel option
2215 my $wrapper = DebugWrap->new(
2223 prog => '../lib/perl5db/t/test-dieLevel-option-1',
2227 $wrapper->output_like(qr#
2228 ^This\ program\ dies\.\ at\ \S+\ line\ 18\.\n
2230 ^\s+main::baz\(\)\ called\ at\ \S+\ line\ 13\n
2231 \s+main::bar\(\)\ called\ at\ \S+\ line\ 7\n
2232 \s+main::foo\(\)\ called\ at\ \S+\ line\ 21\n
2234 'Test the o dieLevel option',
2238 # Test the warnLevel option
2240 my $wrapper = DebugWrap->new(
2248 prog => '../lib/perl5db/t/test-warnLevel-option-1',
2252 $wrapper->contents_like(qr#
2253 ^This\ is\ not\ a\ warning\.\ at\ \S+\ line\ 18\.\n
2255 ^\s+main::baz\(\)\ called\ at\ \S+\ line\ 13\n
2256 \s+main::bar\(\)\ called\ at\ \S+\ line\ 25\n
2257 \s+main::myfunc\(\)\ called\ at\ \S+\ line\ 28\n
2259 'Test the o warnLevel option',
2263 # Test the t command
2265 my $wrapper = DebugWrap->new(
2273 prog => '../lib/perl5db/t/disable-breakpoints-1',
2277 $wrapper->contents_like(qr/
2278 ^main::\([^:]+:15\):\n
2279 15:\s+\$dummy\+\+;\n
2280 main::\([^:]+:17\):\n
2281 17:\s+\$x\ =\ "FourthVal";\n
2283 'Test the t command (without a number.)',
2287 # Test the o AutoTrace command
2289 my $wrapper = DebugWrap->new(
2297 prog => '../lib/perl5db/t/disable-breakpoints-1',
2301 $wrapper->contents_like(qr/
2302 ^main::\([^:]+:15\):\n
2303 15:\s+\$dummy\+\+;\n
2304 main::\([^:]+:17\):\n
2305 17:\s+\$x\ =\ "FourthVal";\n
2307 'Test the o AutoTrace command',
2311 # Test the t command with function calls
2313 my $wrapper = DebugWrap->new(
2324 prog => '../lib/perl5db/t/test-warnLevel-option-1',
2328 $wrapper->contents_like(qr/
2329 ^main::\([^:]+:28\):\n
2331 main::myfunc\([^:]+:25\):\n
2334 'Test the t command with function calls.',
2338 # Test the o AutoTrace command with function calls
2340 my $wrapper = DebugWrap->new(
2351 prog => '../lib/perl5db/t/test-warnLevel-option-1',
2355 $wrapper->contents_like(qr/
2356 ^main::\([^:]+:28\):\n
2358 main::myfunc\([^:]+:25\):\n
2361 'Test the t command with function calls.',
2365 # Test the final message.
2367 my $wrapper = DebugWrap->new(
2374 prog => '../lib/perl5db/t/test-warnLevel-option-1',
2378 $wrapper->contents_like(qr/
2379 ^Debugged\ program\ terminated\.
2381 'Test the final "Debugged program terminated" message.',
2385 # Test the o inhibit_exit=0 command
2387 my $wrapper = DebugWrap->new(
2398 prog => '../lib/perl5db/t/test-warnLevel-option-1',
2402 $wrapper->contents_unlike(qr/
2403 ^Debugged\ program\ terminated\.
2405 'Test the o inhibit_exit=0 command.',
2409 # Test the o PrintRet=1 option
2411 my $wrapper = DebugWrap->new(
2424 prog => '../lib/perl5db/t/test-PrintRet-option-1',
2428 $wrapper->contents_like(
2429 qr/scalar context return from main::return_scalar: 20024/,
2430 "Test o PrintRet=1",
2434 # Test the o PrintRet=0 option
2436 my $wrapper = DebugWrap->new(
2449 prog => '../lib/perl5db/t/test-PrintRet-option-1',
2453 $wrapper->contents_unlike(
2455 "Test o PrintRet=0",
2459 # Test the o PrintRet=1 option in list context
2461 my $wrapper = DebugWrap->new(
2474 prog => '../lib/perl5db/t/test-PrintRet-option-1',
2478 $wrapper->contents_like(
2479 qr/list context return from main::return_list:\n0\s*'Foo'\n1\s*'Bar'\n2\s*'Baz'\n/,
2480 "Test o PrintRet=1 in list context",
2484 # Test the o PrintRet=0 option in list context
2486 my $wrapper = DebugWrap->new(
2499 prog => '../lib/perl5db/t/test-PrintRet-option-1',
2503 $wrapper->contents_unlike(
2505 "Test o PrintRet=0 in list context",
2509 # Test the o PrintRet=1 option in void context
2511 my $wrapper = DebugWrap->new(
2524 prog => '../lib/perl5db/t/test-PrintRet-option-1',
2528 $wrapper->contents_like(
2529 qr/void context return from main::return_void/,
2530 "Test o PrintRet=1 in void context",
2534 # Test the o PrintRet=1 option in void context
2536 my $wrapper = DebugWrap->new(
2549 prog => '../lib/perl5db/t/test-PrintRet-option-1',
2553 $wrapper->contents_unlike(
2555 "Test o PrintRet=0 in void context",
2559 # Test the o frame option.
2561 my $wrapper = DebugWrap->new(
2565 # This is to avoid getting the "Debugger program terminated"
2566 # junk that interferes with the normal output.
2574 prog => '../lib/perl5db/t/test-frame-option-1',
2578 $wrapper->contents_like(
2580 in\s*\.=main::my_other_func\(3,\ 1200\)\ from.*?
2581 out\s*\.=main::my_other_func\(3,\ 1200\)\ from
2583 "Test o PrintRet=0 in void context",
2588 my $wrapper = DebugWrap->new(
2592 # This is to avoid getting the "Debugger program terminated"
2593 # junk that interferes with the normal output.
2598 prog => '../lib/perl5db/t/fact',
2602 $wrapper->contents_like(
2604 (?:^main::fact.*return\ \$n\ \*\ fact\(\$n\ -\ 1\);.*)
2610 # Test the w for lexical variables expression.
2612 my $wrapper = DebugWrap->new(
2616 # This is to avoid getting the "Debugger program terminated"
2617 # junk that interferes with the normal output.
2625 prog => '../lib/perl5db/t/break-on-dot',
2629 $wrapper->contents_like(
2631 \s+old\ value:\s+'1'\n
2632 \s+new\ value:\s+'2'\n
2634 "Test w for lexical values.",
2639 1 while unlink ($rc_filename, $out_fn);