1use Test2::Bundle::Extended;
2BEGIN { $ENV{TABLE_TERM_SIZE} = 80 }
3use Test2::Util::Table qw/table/;
4use Test2::Util::Term qw/USE_GCS/;
5
6imported_ok qw/table/;
7
8subtest unicode_display_width => sub {
9    my $wide = "foo bar baz 婧";
10
11    my $have_gcstring = eval { require Unicode::GCString; 1 };
12
13    subtest no_unicode_linebreak => sub {
14        my @table = table('header' => [ 'a', 'b'], 'rows'   => [[ '婧', '߃' ]]);
15
16        like(
17            \@table,
18            ["Unicode::GCString is not installed, table may not display all unicode characters properly"],
19            "got unicode note"
20        );
21    } unless USE_GCS;
22
23    subtest with_unicode_linebreak => sub {
24        my @table = table(
25            'header' => [ 'a', 'b'],
26            'rows'   => [[ 'a婧b', '߃' ]],
27            'max_width' => 80,
28        );
29        is(
30            \@table,
31            [
32                '+------+---+',
33                '| a    | b |',
34                '+------+---+',
35                '| a婧b | ߃ |',
36                '+------+---+',
37            ],
38            "Support for unicode characters that use multiple columns"
39        );
40    } if USE_GCS;
41};
42
43subtest width => sub {
44    my @table = table(
45        max_width => 40,
46        header => [ 'a', 'b', 'c', 'd' ],
47        rows => [
48            [ qw/aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccc ddddddddddddddddddddddddddddd/ ],
49            [ qw/AAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDDDDDDDDDDDD/ ],
50        ],
51    );
52
53    is(length($table[0]), validator('<=', '40', sub { my %p = @_; $p{got} <= $p{name} }), "width of table");
54
55    is(
56        \@table,
57        [
58            '+-------+-------+-------+-------+',
59            '| a     | b     | c     | d     |',
60            '+-------+-------+-------+-------+',
61            '| aaaaa | bbbbb | ccccc | ddddd |',
62            '| aaaaa | bbbbb | ccccc | ddddd |',
63            '| aaaaa | bbbbb | ccccc | ddddd |',
64            '| aaaaa | bbbbb | ccccc | ddddd |',
65            '| aaaaa | b     | ccc   | ddddd |',
66            '| a     |       |       | dddd  |',
67            '|       |       |       |       |',
68            '| AAAAA | BBBBB | CCCCC | DDDDD |',
69            '| AAAAA | BBBBB | CCCCC | DDDDD |',
70            '| AAAAA | BBBBB | CCCCC | DDDDD |',
71            '| AAAAA | BBBBB | CCCCC | DDDDD |',
72            '| AAAAA | B     | CCC   | DDDDD |',
73            '| A     |       |       | DDDD  |',
74            '+-------+-------+-------+-------+',
75        ],
76        "Basic table, small width"
77    );
78
79    @table = table(
80        max_width => 60,
81        header => [ 'a', 'b', 'c', 'd' ],
82        rows => [
83            [ qw/aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccc ddddddddddddddddddddddddddddd/ ],
84            [ qw/AAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDDDDDDDDDDDD/ ],
85        ],
86    );
87
88    is(length($table[0]), validator('<=', '60', sub { my %p = @_; $p{got} <= $p{name} }), "width of table");
89
90    is(
91        \@table,
92        [
93            '+------------+------------+------------+------------+',
94            '| a          | b          | c          | d          |',
95            '+------------+------------+------------+------------+',
96            '| aaaaaaaaaa | bbbbbbbbbb | cccccccccc | dddddddddd |',
97            '| aaaaaaaaaa | bbbbbbbbbb | cccccccccc | dddddddddd |',
98            '| aaaaaa     | b          | ccc        | ddddddddd  |',
99            '|            |            |            |            |',
100            '| AAAAAAAAAA | BBBBBBBBBB | CCCCCCCCCC | DDDDDDDDDD |',
101            '| AAAAAAAAAA | BBBBBBBBBB | CCCCCCCCCC | DDDDDDDDDD |',
102            '| AAAAAA     | B          | CCC        | DDDDDDDDD  |',
103            '+------------+------------+------------+------------+',
104        ],
105        "Basic table, bigger width"
106    );
107
108    @table = table(
109        max_width => 60,
110        header => [ 'a', 'b', 'c', 'd' ],
111        rows => [
112            [ qw/aaaa bbbb cccc dddd/ ],
113            [ qw/AAAA BBBB CCCC DDDD/ ],
114        ],
115    );
116
117    is(length($table[0]), validator('<=', '60', sub { my %p = @_; $p{got} <= $p{name} }), "width of table");
118
119    is(
120        \@table,
121        [
122            '+------+------+------+------+',
123            '| a    | b    | c    | d    |',
124            '+------+------+------+------+',
125            '| aaaa | bbbb | cccc | dddd |',
126            '| AAAA | BBBB | CCCC | DDDD |',
127            '+------+------+------+------+',
128        ],
129        "Short table, well under minimum",
130    );
131};
132
133subtest collapse => sub {
134    my @table = table(
135        max_width => 60,
136        collapse => 1,
137        header => [ 'a', 'b', 'c', 'd' ],
138        rows => [
139            [ qw/aaaa bbbb/, undef, qw/dddd/ ],
140            [ qw/AAAA BBBB/, '', qw/DDDD/ ],
141        ],
142    );
143
144    is(
145        \@table,
146        [
147            '+------+------+------+',
148            '| a    | b    | d    |',
149            '+------+------+------+',
150            '| aaaa | bbbb | dddd |',
151            '| AAAA | BBBB | DDDD |',
152            '+------+------+------+',
153        ],
154        "Table collapsed",
155    );
156
157    @table = table(
158        max_width => 60,
159        header => [ 'a', 'b', 'c', 'd' ],
160        rows => [
161            [ qw/aaaa bbbb/, undef, qw/dddd/ ],
162            [ qw/AAAA BBBB/, '', qw/DDDD/ ],
163        ],
164    );
165
166    is(
167        \@table,
168        [
169            '+------+------+---+------+',
170            '| a    | b    | c | d    |',
171            '+------+------+---+------+',
172            '| aaaa | bbbb |   | dddd |',
173            '| AAAA | BBBB |   | DDDD |',
174            '+------+------+---+------+',
175        ],
176        "Table not collapsed",
177    );
178
179    @table = table(
180        max_width => 60,
181        collapse => 1,
182        header => [ 'a', 'b', 'c', 'd' ],
183        rows => [
184            [ qw/aaaa bbbb/, undef, qw/dddd/ ],
185            [ qw/AAAA BBBB/, 0, qw/DDDD/ ],
186        ],
187    );
188
189    is(
190        \@table,
191        [
192            '+------+------+---+------+',
193            '| a    | b    | c | d    |',
194            '+------+------+---+------+',
195            '| aaaa | bbbb |   | dddd |',
196            '| AAAA | BBBB | 0 | DDDD |',
197            '+------+------+---+------+',
198        ],
199        "'0' value does not cause collapse",
200    );
201
202};
203
204subtest header => sub {
205    my @table = table(
206        max_width => 60,
207        header => [ 'a', 'b', 'c', 'd' ],
208        rows => [
209            [ qw/aaaa bbbb cccc dddd/ ],
210            [ qw/AAAA BBBB CCCC DDDD/ ],
211        ],
212    );
213
214    is(
215        \@table,
216        [
217            '+------+------+------+------+',
218            '| a    | b    | c    | d    |',
219            '+------+------+------+------+',
220            '| aaaa | bbbb | cccc | dddd |',
221            '| AAAA | BBBB | CCCC | DDDD |',
222            '+------+------+------+------+',
223        ],
224        "Table with header",
225    );
226};
227
228subtest no_header => sub {
229    my @table = table(
230        max_width => 60,
231        rows => [
232            [ qw/aaaa bbbb cccc dddd/ ],
233            [ qw/AAAA BBBB CCCC DDDD/ ],
234        ],
235    );
236
237    is(
238        \@table,
239        [
240            '+------+------+------+------+',
241            '| aaaa | bbbb | cccc | dddd |',
242            '| AAAA | BBBB | CCCC | DDDD |',
243            '+------+------+------+------+',
244        ],
245        "Table without header",
246    );
247};
248
249subtest mark_tail => sub {
250    my @table = table(
251        max_width => 60,
252        mark_tail => 1,
253        header => [ 'data1', 'data2' ],
254        rows => [["  abc  def   ", "  abc  def  \t"]],
255    );
256
257    is(
258        \@table,
259        [
260            '+----------------------+----------------+',
261            '| data1                | data2          |',
262            '+----------------------+----------------+',
263            '|   abc  def  \N{U+20} |   abc  def  \t |',
264            '+----------------------+----------------+',
265        ],
266        "Sanitized data"
267    );
268
269};
270
271done_testing;
272