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