The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# perl
use strict;
use warnings;
use Carp;
use Cwd;
use File::Basename;
use File::Temp qw( tempdir );
use IO::CaptureOutput qw( capture );
use Test::More qw( no_plan );
use Tie::File;
use lib qw( ./lib );
use Text::FixedWidth::Helper qw( d2fw );

my ($input, $output, $produced, $base, $tdir);
my $cwd = cwd();

{
    $input = "$cwd/t/testlib/01-sample.txt";
    $base = basename($input);
    $tdir = tempdir( CLEANUP => 1 );
    $output = "$tdir/$base.transformed";
    $produced = d2fw( $input, $output );
    ok( ( -f $produced ), "Output file produced" );

    my @lines;
    tie @lines, 'Tie::File', $produced
        or croak "Unable to tie to $produced";
    like( $lines[0], qr/^(?:1234567890)+/,
        "Got index line" );
    like( $lines[1], qr/^[\s|]+$/, "Got a spacer line" );
    like( $lines[2],
        qr/^Sylvester\s{6}JGomez\s{10}M789294592Rochester\s{11}NY14618$/,
        "Got expected fixed-width line" );
    untie @lines or croak "Cannot untie from $produced";
}

{
    $input = "$cwd/foobar";
    $base = basename($input);
    $tdir = tempdir( CLEANUP => 1 );
    $output = "$tdir/$base.transformed";
    eval {
        $produced = d2fw( $input, $output );
    };
    like( $@, qr/Could not locate input file $input/,
        "Got expected death message: input not found" );
}

{
    $input = "$cwd/t/testlib/01-sample.txt";
    $base = basename($input);
    $tdir = tempdir( CLEANUP => 1 );
    $produced = d2fw( $input );
    ok( ( -f $produced ), "Output file produced" );
    is( $produced, "$input.out",
        "Output file name defaulted to expected value" );

    my @lines;
    tie @lines, 'Tie::File', $produced
        or croak "Unable to tie to $produced";
    like( $lines[0], qr/^(?:1234567890)+/,
        "Got index line" );
    like( $lines[1], qr/^[\s|]+$/, "Got a spacer line" );
    like( $lines[2],
        qr/^Sylvester\s{6}JGomez\s{10}M789294592Rochester\s{11}NY14618$/,
        "Got expected fixed-width line" );
    untie @lines or croak "Cannot untie from $produced";
    unlink $produced;
}

{
    $input = "$cwd/t/testlib/03-toolong.txt";
    $base = basename($input);
    $tdir = tempdir( CLEANUP => 1 );
    $output = "$tdir/$base.transformed";
    eval {
        $produced = d2fw( $input, $output );
    };
    like( $@,
        qr/Text::FixedWidth::Helper restricts records to 1000 characters/,
        "Got expected death message: template too long" );
}

{
    $input = "$cwd/t/testlib/04-toomanyrecords.txt";
    $base = basename($input);
    $tdir = tempdir( CLEANUP => 1 );
    $output = "$tdir/$base.transformed";
    {
        my ($stdout, $stderr);
        capture(
            sub { $produced = d2fw( $input, $output ); },
            \$stdout,
            \$stderr,
        );
        like( $stderr,
            qr/Text::FixedWidth::Helper restricts you to 3 input records/,
            "Got expected warning: too many sample records" );
        ok( ( -f $produced ), "Output file produced" );
    
        my @lines;
        tie @lines, 'Tie::File', $produced
            or croak "Unable to tie to $produced";
        like( $lines[0], qr/^(?:1234567890)+/,
            "Got index line" );
        like( $lines[1], qr/^[\s|]+$/, "Got a spacer line" );
        like( $lines[$#lines],
            qr/^Kasimir/,
            "Got expected last fixed-width line" );
        unlike( $lines[$#lines],
            qr/^Horace/,
            "Did not get extra fixed-width line" );
        untie @lines or croak "Cannot untie from $produced";
    };
}

{
    $input = "$cwd/t/testlib/05-badmetadata.txt";
    $base = basename($input);
    $tdir = tempdir( CLEANUP => 1 );
    eval {
        $produced = d2fw( $input );
    };
    like( $@,
        qr/In metadata section, value of.*must be numeric/,
        "Got expected death message: non-numeric metadata value" );
}

__END__
12345678901234567890123456789012345678901234567890123456789012345678
|              ||              |         |                   | |    
Sylvester      JGomez          M789294592Rochester           NY14618
Arthur         XFridrikkson    M783891590Oakland             CA94601
Kasimir        EKristemanaczewsN389182992Buffalo             NY14214