The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings;
use lib 'lib';
use Test::More tests => 29;
use Devel::ebug;
use File::Spec;

my $ebug = Devel::ebug->new;
$ebug->program("t/calc.pl");
$ebug->backend("$^X bin/ebug_backend_perl");
$ebug->load;

my @trace = $ebug->stack_trace;
is(scalar(@trace), 0);
$ebug->break_point(12);

$ebug->run;
@trace = $ebug->stack_trace;
is(scalar(@trace), 1);

# use YAML; warn Dump \@trace;

my $trace = $trace[0];
is($trace->package   , "main");
is($trace->filename , File::Spec->catfile('t','calc.pl'), "trace is on correct file name");
is($trace->subroutine, "main::add");
ok(! $trace->wantarray ); # Forced boolean context
is($trace->line      , 5);
is_deeply([$trace->args], [1, 2]);

@trace = $ebug->stack_trace_human;
is(scalar(@trace), 1);
is($trace[0], 'add(1, 2)');

$ebug = Devel::ebug->new;
$ebug->program("t/calc_oo.pl");
$ebug->backend("$^X bin/ebug_backend_perl");
$ebug->load;
$ebug->break_point("t/Calc.pm", 19);

$ebug->run;
@trace = $ebug->stack_trace_human;
is(scalar(@trace), 1);
is($trace[0], '$calc->fib1(15)');

$ebug->run;
@trace = $ebug->stack_trace_human;
is(scalar(@trace), 2);
is($trace[1], '$calc->fib1(15)');
is($trace[0], '$self->fib1(14)');

$ebug = Devel::ebug->new;
$ebug->program("t/koremutake.pl");
$ebug->backend("$^X bin/ebug_backend_perl");
$ebug->load;

$ebug->step;
@trace = $ebug->stack_trace_human;
is(scalar(@trace), 1);
is($trace[0], 'String::Koremutake->new()');

$ebug = Devel::ebug->new;
$ebug->program("t/koremutake.pl");
$ebug->backend("$^X bin/ebug_backend_perl");
$ebug->load;
$ebug->break_point_subroutine("String::Koremutake::integer_to_koremutake");

$ebug->run;
@trace = $ebug->stack_trace_human;
is(scalar(@trace), 1);
is($trace[0], '$koremutake->integer_to_koremutake(65535)');

$ebug = Devel::ebug->new;
$ebug->program("t/stack.pl");
$ebug->backend("$^X bin/ebug_backend_perl");
$ebug->load;
$ebug->break_point_subroutine("main::show");

$ebug->run;
@trace = $ebug->stack_trace_human;
is(scalar(@trace), 1);
is($trace[0], 'show()');

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], 'show(1, undef, 2)');

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], 'show(123)');

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], 'show(-0.3)');

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], "show('a')");

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], 'show("orange o rama")');

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], 'show([...])');

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], 'show({...})');

$ebug->run;
@trace = $ebug->stack_trace_human;
is($trace[0], 'show($koremutake)');

# use YAML; warn Dump \@trace;