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