sub
expect {
my
$self
=
shift
;
my
$name
=
shift
;
my
@checks
=
@_
;
foreach
my
$check
(
@checks
) {
$check
=
$self
->_translate_Failed_check(
$check
);
push
@{
$self
->wanted->{
$name
} },
ref
$check
?
$check
:
"$check\n"
;
}
}
sub
_translate_Failed_check {
my
(
$self
,
$check
) =
@_
;
if
(
$check
=~ /\A(.*)
$check
=
"/\Q$1\E#\\s+\Q$2\E.*?\\n?.*?\Qat $3\E line \Q$4\E.*\\n?/"
;
}
return
$check
;
}
sub
check {
my
$self
=
shift
;
my
$name
=
shift
;
local
$^W = 0;
my
@checks
= @{
$self
->wanted->{
$name
} };
my
$got
=
$self
->
read
(
$name
);
foreach
my
$check
(
@checks
) {
$check
=
"\Q$check\E"
unless
(
$check
=~ s,^/(.*)/$,$1, or
ref
$check
);
return
0
unless
$got
=~ s/^
$check
//;
}
return
length
$got
== 0;
}
has
'name2handle'
=>
is
=>
'ro'
,
isa
=>
'HashRef'
,
default
=>
sub
{
return
{
out
=>
'STDOUT'
,
err
=>
'STDERR'
}
};
sub
complaint {
my
$self
=
shift
;
my
$name
=
shift
;
my
$type
=
$self
->name2handle->{
$name
};
my
$got
=
$self
->output_for(
$name
);
my
$wanted
=
join
"\n"
, @{
$self
->wanted->{
$name
} };
if
(Test::Builder::Tester::color()) {
unless
($@) {
my
$green
= Term::ANSIColor::color(
"black"
) . Term::ANSIColor::color(
"on_green"
);
my
$red
= Term::ANSIColor::color(
"black"
) . Term::ANSIColor::color(
"on_red"
);
my
$reset
= Term::ANSIColor::color(
"reset"
);
my
$char
= 0;
$char
++
while
substr
(
$got
,
$char
, 1 ) eq
substr
(
$wanted
,
$char
, 1 );
my
$start
=
$green
.
substr
(
$wanted
, 0,
$char
);
my
$gotend
=
$red
.
substr
(
$got
,
$char
) .
$reset
;
my
$wantedend
=
$red
.
substr
(
$wanted
,
$char
) .
$reset
;
$start
=~ s/\n/
$reset
\n
$green
/g;
$gotend
=~ s/\n/
$reset
\n
$red
/g;
$wantedend
=~ s/\n/
$reset
\n
$red
/g;
$got
=
$start
.
$gotend
;
$wanted
=
$start
.
$wantedend
;
}
}
return
"$type is:\n"
.
"$got\nnot:\n$wanted\nas expected"
;
}
has
'wanted'
=>
is
=>
'rw'
,
isa
=>
'HashRef'
,
default
=>
sub
{
return
{
out
=> [],
err
=> [],
}
}
;
sub
clear {
my
$self
=
shift
;
$self
->SUPER::clear;
%{
$self
->wanted} = (
out
=> [],
err
=> [] );
return
;
}
1;