【问题标题】:How can I test strings containing ANSI color codes for equivalence in Perl?如何在 Perl 中测试包含 ANSI 颜色代码的字符串是否等效?
【发布时间】:2011-06-12 21:46:28
【问题描述】:

我正在为一个使用 ANSI 颜色代码的 Perl 模块编写测试。我希望能够测试两个带有嵌入式 ANSI 颜色代码的字符串,看看它们在打印时是否会产生相同的输出。这不是一个简单的字符串相等测试,因为以不同的顺序放置多个代码仍然可以产生相同的结果。例如,“粗体”和“蓝色”的代码可以与任何一个放在一起以产生粗体蓝色。

那么,有什么简单的方法可以用 ANSI 颜色代码测试两个字符串的输出等价性吗?

【问题讨论】:

    标签: perl testing terminal ansi-colors


    【解决方案1】:

    最简单的方法是将每个字符串转换为通过模拟设备产生的输出的表示。 IE。生成(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!");
    

    【讨论】:

    • 当然,这个模拟器可能足够复杂,足以证明它自己的测试制度... :) 要测试一致性,您可能想要生成许多包含随机散布的 ANSI 控制代码的短随机序列,运行它们通过实际的 ANSI 设备并捕获生成的输出状态,然后将它们用作与模拟器进行比较的黄金标准。
    猜你喜欢
    • 2016-12-25
    • 2021-01-02
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2014-09-11
    • 2016-07-21
    相关资源
    最近更新 更多