1use strict; 2use warnings; 3use Test::More 0.96; 4use Test::Differences; 5 6my $mod = 'Parse::ANSIColor::Tiny'; 7eval "require $mod" or die $@; 8 9sub e { note $_[0]; $_[0] } 10 11my $p = new_ok($mod); 12 13# simplify 'reverse' (regardless of auto_reverse option) 14 15eq_or_diff 16 [$p->process_reverse(qw(bold underline red))], 17 [qw(bold underline red)], 18 'no change'; 19 20eq_or_diff 21 [$p->process_reverse(qw(bold underline red reverse))], 22 [qw(bold underline on_red black)], 23 'change preceeding fg to bg'; 24 25eq_or_diff 26 [$p->process_reverse(qw(bold reverse green))], 27 [qw(bold on_green black)], 28 'change following fg to bg'; 29 30eq_or_diff 31 [new_ok($mod, [background => 'white', foreground => 'black'])->process_reverse(qw(bold reverse green))], 32 [qw(bold on_green white)], 33 'change following fg to bg'; 34 35eq_or_diff 36 [$p->process_reverse(qw(bold underline on_red reverse))], 37 [qw(bold underline red on_white)], 38 'change preceeding bg to fg'; 39 40eq_or_diff 41 [$p->process_reverse(qw(bold reverse on_green))], 42 [qw(bold green on_white)], 43 'change following bg to fg'; 44 45eq_or_diff 46 [$p->process_reverse(qw(bold on_bright_red bright_blue reverse))], 47 [qw(bold bright_red on_bright_blue)], 48 'swap preceeding colors, fg first'; 49 50eq_or_diff 51 [$p->process_reverse(qw(bold bright_magenta on_bright_yellow reverse))], 52 [qw(bold on_bright_magenta bright_yellow)], 53 'swap preceeding colors'; 54 55eq_or_diff 56 [$p->process_reverse(qw(bold reverse green on_blue))], 57 [qw(bold on_green blue)], 58 'swap following cologs'; 59 60# reverse when no colors are present 61 62eq_or_diff 63 [$p->process_reverse(qw(bold reverse))], 64 [qw(bold on_white black)], 65 'default colors reversed'; 66 67eq_or_diff 68 [new_ok($mod, [background => 'blue'])->process_reverse(qw(bold reverse))], 69 [qw(bold on_white blue)], 70 'default colors (alternate bg) reversed'; 71 72eq_or_diff 73 [new_ok($mod, [background => 'blue', foreground => 'red'])->process_reverse(qw(bold reverse))], 74 [qw(bold on_red blue)], 75 'default colors (alternate) reversed'; 76 77# auto_reverse off by default 78 79eq_or_diff 80 $p->parse(e "\033[1;4mfoo\033[7mbar"), 81 [ 82 [ [qw(bold underline )], 'foo' ], 83 [ [qw(bold underline reverse)], 'bar' ], 84 ], 85 'no conversion (no colors to convert)'; 86 87eq_or_diff 88 $p->parse(e "\033[1;4;31mfoo\033[7mbar"), 89 [ 90 [ [qw(bold underline red )], 'foo' ], 91 [ [qw(bold underline red reverse)], 'bar' ], 92 ], 93 'no conversion'; 94 95eq_or_diff 96 $p->parse(e "foo\033[1;31mbar\033[7mbaz\033[7mbaz\033[27mqux"), 97 [ 98 [ [ ], 'foo' ], 99 [ [qw(bold red )], 'bar' ], 100 [ [qw(bold red reverse)], 'baz' ], 101 [ [qw(bold red reverse)], 'baz' ], 102 [ [qw(bold red )], 'qux' ], 103 ], 104 'double-reverse has no effect'; 105 106eq_or_diff 107 $p->parse(e "\e[32;105mfoo\033[1;7mbar\033[34mbaz\033[27mqux"), 108 [ 109 [ [qw(green on_bright_magenta )], 'foo' ], 110 [ [qw(green on_bright_magenta bold reverse)], 'bar' ], 111 [ [qw(on_bright_magenta bold reverse blue )], 'baz' ], 112 [ [qw(on_bright_magenta bold blue )], 'qux' ], 113 ], 114 'bg and fg reversed'; 115 116eq_or_diff 117 $p->parse(e " none \033[31m redfg \033[7m redbg \033[7m same \e[34m bluebg \e[27m bluefg \e[7m bluebg \e[m none \e[31m r "), 118 [ 119 [ [ ], ' none ' ], 120 [ [qw(red )], ' redfg ' ], 121 [ [qw(red reverse)], ' redbg ' ], 122 [ [qw(red reverse)], ' same ' ], 123 [ [qw(reverse blue)], ' bluebg ' ], 124 [ [qw(blue )], ' bluefg ' ], 125 [ [qw(blue reverse)], ' bluebg ' ], 126 [ [ ], ' none ' ], 127 [ [qw(red )], ' r ' ], 128 ], 129 'longer, very clear example'; 130 131# reverse automatically when enabled 132 133$p = new_ok($mod, [auto_reverse => 1]); 134 135eq_or_diff 136 $p->parse(e "\033[1;4mfoo\033[7mbar"), 137 [ 138 [ [qw(bold underline )], 'foo' ], 139 [ [qw(bold underline on_white black)], 'bar' ], 140 ], 141 'auto-reverse default colors'; 142 143eq_or_diff 144 $p->parse(e "\033[1;4;31mfoo\033[7mbar"), 145 [ 146 [ [qw(bold underline red )], 'foo' ], 147 [ [qw(bold underline on_red black)], 'bar' ], 148 ], 149 'auto-reverse fg color'; 150 151eq_or_diff 152 $p->parse(e "foo\033[1;31mbar\033[7mbaz\033[7mbaz\033[27mqux"), 153 [ 154 [ [ ], 'foo' ], 155 [ [qw(bold red )], 'bar' ], 156 [ [qw(bold on_red black)], 'baz' ], 157 [ [qw(bold on_red black)], 'baz' ], 158 [ [qw(bold red )], 'qux' ], 159 ], 160 'double-reverse has no effect'; 161 162eq_or_diff 163 $p->parse(e "\e[32;105mfoo\033[1;7mbar\033[34mbaz\033[27mqux"), 164 [ 165 [ [qw( green on_bright_magenta )], 'foo' ], 166 [ [qw(on_green bright_magenta bold)], 'bar' ], 167 [ [qw( bright_magenta bold on_blue )], 'baz' ], 168 [ [qw(on_bright_magenta bold blue )], 'qux' ], 169 ], 170 'bg and fg reversed'; 171 172eq_or_diff 173 $p->parse(e " none \033[31m redfg \033[7m redbg \033[7m same \e[34m bluebg \e[27m bluefg \e[7m bluebg \e[m none \e[31m r "), 174 [ 175 [ [ ], ' none ' ], 176 [ [qw(red )], ' redfg ' ], 177 [ [qw(on_red black)], ' redbg ' ], 178 [ [qw(on_red black)], ' same ' ], 179 [ [qw(on_blue black)], ' bluebg ' ], 180 [ [qw(blue )], ' bluefg ' ], 181 [ [qw(on_blue black)], ' bluebg ' ], 182 [ [ ], ' none ' ], 183 [ [qw(red )], ' r ' ], 184 ], 185 'longer, very clear example'; 186 187done_testing; 188