我正在为一个用ANSI颜色代码做事的Perl模块编写测试。我希望能够测试两个带有嵌入式ANSI颜色代码的字符串,看看它们是否会在打印时产生相同的输出。这不是一个简单的字符串相等测试,因为以不同的顺序放置多个代码仍然可以产生相同的结果。例如,“粗体”和“蓝色”的代码可以与任何一个一起放在一起以产生粗体蓝色。
那么,有没有简单的方法来测试两个使用ANSI颜色代码的字符串以确定输出的等效性?
答案 0 :(得分:3)
最简单的方法是将每个字符串转换为模拟设备将产生的输出表示。即生成(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!");