Самый простой способ - преобразовать каждую строку в представление вывода, который она выдаст, имитируя устройство . То есть создайте список из (character, colour, boldness)
кортежей (добавьте любые другие атрибуты, которые вы хотите отслеживать), по одному для каждого символа, который будет выводиться. Затем вы можете сравнить эти результаты непосредственно на равенство.
Вот пример, с которого можно начать:
sub simulate($) {
my ($s) = @_;
my $colour = 'black';
my $bold = 0;
my @output;
while (length $s) {
if ($s =~ s/\A\x1B\[1m//) { $bold = 1; }
elsif ($s =~ s/\A\x1B\[22m//) { $bold = 0; }
elsif ($s =~ s/\A\x1B\[30m//) { $colour = 'black'; }
elsif ($s =~ s/\A\x1B\[31m//) { $colour = 'red'; }
# ...
else { # Plain character to be output
s/\A(.)//s;
push @output, [ $1, $colour, $bold ];
}
}
return @output;
}
# Example usage
use Test::More;
is_deeply(
simulate("Hi \x1B[31\x1B[1mthere!"),
simulate("Hi \x1B[1\x1B[31mthere!"),
"FTW!");