The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 7;
use Test::NoWarnings;

use strict;
use warnings;

use LaTeX::Table;
use English qw( -no_match_vars );

my $header = [ [ 'A', 'B', 'C', ], ];
my $data = [
    [ '123.45678', '   12345678901234567890', '12345', ],
    [ '123.45',    ' A ',           '12345', ],
];

my $table = LaTeX::Table->new(
    {   header    => $header,
        data      => $data,
    }
);

my $output = $table->generate_string();

my $expected_output = <<'EOT';
\begin{table}
\centering
\begin{tabular}{llr}
\toprule
A & B & C \\
\midrule
123.45678 & 12345678901234567890 & 12345 \\
123.45    & A                    & 12345 \\
\bottomrule
\end{tabular}
\end{table}
EOT

is_deeply(
    [ split( "\n", $output ) ],
    [ split( "\n", $expected_output ) ],
    'three number columns'
);

  $table->set_coldef_strategy({
    NUMBER   => qr{\A \s* \d+ \s* \z}xms, # integers only
    LONG_COL => '>{\raggedright\arraybackslash}p{7cm}', # non-justified
  });

$output = $table->generate_string();

$expected_output = <<'EOT';
\begin{table}
\centering
\begin{tabular}{llr}
\toprule
A & B & C \\
\midrule
123.45678 & 12345678901234567890 & 12345 \\
123.45    & A                    & 12345 \\
\bottomrule
\end{tabular}
\end{table}
EOT

is_deeply(
    [ split( "\n", $output ) ],
    [ split( "\n", $expected_output ) ],
    'three number columns'
);

  $table->set_coldef_strategy({
    NUMBER   => qr{\A \s* \d+ \s* \z}xms, # integers only
    NUMBER_MUST_MATCH_ALL => 0,
    LONG_COL => '>{\raggedright\arraybackslash}p{7cm}', # non-justified
  });


$output = $table->generate_string();

$expected_output = <<'EOT';
\begin{table}
\centering
\begin{tabular}{lrr}
\toprule
A & B & C \\
\midrule
123.45678 & 12345678901234567890 & 12345 \\
123.45    & A                    & 12345 \\
\bottomrule
\end{tabular}
\end{table}
EOT

is_deeply(
    [ split( "\n", $output ) ],
    [ split( "\n", $expected_output ) ],
    'three number columns'
);

$data = [
    [ '123.45678', '   12345678901123456789011234567890  ', '12345', ],
    [ '123.45',    ' 1234567898 ',           '12345', ],
];
$table = LaTeX::Table->new(
    {   header    => $header,
        data      => $data,
    }
);

$table->set_coldef_strategy({
NUMBER   => qr{\A \s* \d+ \s* \z}xms, # integers only
LONG_COL => '>{\raggedright\arraybackslash}p{7cm}', # non-justified
});


$output = $table->generate_string();

$expected_output = <<'EOT';
\begin{table}
\centering
\begin{tabular}{lrr}
\toprule
A & B & C \\
\midrule
123.45678 & 12345678901123456789011234567890 & 12345 \\
123.45    & 1234567898                       & 12345 \\
\bottomrule
\end{tabular}
\end{table}
EOT

is_deeply(
    [ split( "\n", $output ) ],
    [ split( "\n", $expected_output ) ],
    'LONG NUMBER Is NUMBER'
);

# not a number anymore
$table->set_data([
    [ '123.45678', '   1234567890 1234567890 1234567890', '12345', ],
    [ '123.45',    ' 1234567898.122 ',           '12345', ],
]);

$output = $table->generate_string();

$expected_output = <<'EOT';
\begin{table}
\centering
\begin{tabular}{l>{\raggedright\arraybackslash}p{7cm}r}
\toprule
A & B & C \\
\midrule
123.45678 & 1234567890 1234567890 1234567890 & 12345 \\
123.45    & 1234567898.122                   & 12345 \\
\bottomrule
\end{tabular}
\end{table}
EOT

is_deeply(
    [ split( "\n", $output ) ],
    [ split( "\n", $expected_output ) ],
    'LONG Is LONG'
);

$table->set_coldef_strategy({
URL   => qr{\A \s* http }xms,
URL_COL => 'U', # centered
});

$table->set_data([
    [ '123.45678', '   http://www.google.com', '12345', ],
    [ '123.45',    ' http://www.slashdot.org ',           '12345', ],
]);

$output = $table->generate_string();

$expected_output = <<'EOT';
\begin{table}
\centering
\begin{tabular}{lUr}
\toprule
A & B & C \\
\midrule
123.45678 & http://www.google.com   & 12345 \\
123.45    & http://www.slashdot.org & 12345 \\
\bottomrule
\end{tabular}
\end{table}
EOT

is_deeply(
    [ split( "\n", $output ) ],
    [ split( "\n", $expected_output ) ],
    'new column type'
);