Как я могу проверить строки, содержащие цветовые коды ANSI на эквивалентность в Perl? - PullRequest
3 голосов
/ 21 января 2011

Я пишу тесты для модуля Perl, который работает с цветовыми кодами ANSI.Я хотел бы иметь возможность протестировать две строки со встроенными цветовыми кодами ANSI, чтобы увидеть, будут ли они выводить один и тот же результат при печати.Это не простой тест на равенство строк, поскольку размещение нескольких кодов в другом порядке может привести к одному и тому же результату.Например, коды «жирный» и «синий» могут быть объединены с любым первым, чтобы получить жирный синий.

Итак, есть ли простой способ проверить две строки с цветовыми кодами ANSI на эквивалентность выходных данных?

1 Ответ

3 голосов
/ 21 января 2011

Самый простой способ - преобразовать каждую строку в представление вывода, который она выдаст, имитируя устройство . То есть создайте список из (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!");
...