use warnings; use strict; use Test; my ($linecount, $current_col, $tab) = (0, 0, 4); sub pr { for my $string (@_){ print $string; my $lines += () = $string =~ /[\n\r]/g; $current_col = 0 if $lines; $linecount += $lines; $string =~ s/.*[\n\r](.*)$/$1/sg; $string =~ s/\t/' ' x $tab/eg; my $bs = $string =~ tr/\b//; my $bell = $string =~ tr/\a//; $current_col += (length $string) - $bs * 2 - $bell; $current_col = 0 if $current_col < 0; $linecount += int($current_col / 80); $current_col %= 80; } } BEGIN { plan tests => 24 }; my @tests = ( ["1234567890", 0, 10], ["12345\n67890", 1, 5], ["12345\n67890\n12345", 2, 5], ["12345\r67890", 1, 5], ["12345\r67890\r12345", 2, 5], ["12345\t67890", 0, 10 + $tab], ["1234567890\b\b\b\b\b", 0, 5], [qw/1234567890 1234567890 1234567890 1234567890 1234567890/, 0, 50], ["1234567890" x 10, 1, 20], ["1234567890" x 100, 12, 40], ["1234567890" x 100, "\b" x 50, 12, 0], ["1\b2\b3\b4\b5\b6\b7\b8\b9\b0\b\n12345\t67890\n\t12345\b\b\b\b\b67890\t", 2, 5 + $tab*2], ["1234567890\a\b\a\b\a\b", 0, 7], ); for my $test (@tests){ ( $linecount, $current_col ) = ( 0, 0 ); my @strings = @$test; splice @strings, -2, 2, ''; pr $_ for @strings; print "<--\n"; ok($linecount, $test->[-2], "Linecount incorrect"); ok($current_col, $test->[-1], "Column count incorrect"); }