在Perl中如何测试包含ANSI颜色代码的字符串是否相等?

3
我正在为一个处理ANSI颜色代码的Perl模块编写测试。我希望能够测试两个包含嵌入式ANSI颜色代码的字符串,以查看它们如果被打印出来是否会产生相同的输出结果。这不是一个简单的字符串相等测试,因为将多个代码按不同顺序组合仍然可能产生相同的结果。例如,“bold”和“blue”的代码可以一起放置,其中任意一个都可以先出现,从而生成粗体蓝色。
那么,有没有一种简单的方法可以测试带有ANSI颜色代码的两个字符串的输出等价性呢?
1个回答

3

最简单的方法是将每个字符串转换为模拟设备所产生输出的表示形式。即,生成一个列表,其中包含(字符、颜色、粗细)元组(添加任何其他要跟踪的属性),每个字符都会产生一个元组输出。然后,您可以直接比较这些输出是否相等。

以下是一个示例,供您参考:

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!");

当然,这个模拟器可能足够复杂,需要自己的测试体系... :) 为了测试符合性,您可能希望生成许多包含随机插入 ANSI 控制代码的短随机序列,将它们通过实际的 ANSI 设备并捕获结果输出状态,然后将其用作与您的模拟器进行比较的基准。 - j_random_hacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接