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