#!/usr/bin/env perl
require 5.008;
use warnings;
use strict;

chdir("base64") or die "chdir testdir failed: $!\n";

require TestDriver;

my $td = new TestDriver('base64');

cleanup();

# ** Do not use normalize newlines on these tests. **

my $n = 5;
for (my $i = 1; $i <= $n; ++$i)
{
    $td->runtest("encode $i",
                 {$td->COMMAND => "base64 encode < $i.dec"},
                 {$td->FILE => "$i.enc", $td->EXIT_STATUS => 0});
    $td->runtest("code $i",
                 {$td->COMMAND => "base64 decode < $i.enc"},
                 {$td->FILE => "$i.dec", $td->EXIT_STATUS => 0});
}

$td->runtest("non-zero discard bits",
             {$td->COMMAND => "echo c2FsYWR= | base64 decode"},
             {$td->STRING => "salad", $td->EXIT_STATUS => 0});
$td->runtest("write with +/",
             {$td->COMMAND => "echo +/== | base64 decode > a"},
             {$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("write with -_",
             {$td->COMMAND => "echo -_== | base64 decode > b"},
             {$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("interchangeability of +/ and -_",
             {$td->FILE => "a"},
             {$td->FILE => "b"});

$td->runtest("invalid characters",
             {$td->COMMAND => "echo aaaaa! | base64 decode"},
             {$td->REGEXP => ".*invalid input.*", $td->EXIT_STATUS => 2});
$td->runtest("invalid pad",
             {$td->COMMAND => "echo a= | base64 decode"},
             {$td->REGEXP => ".*invalid input.*", $td->EXIT_STATUS => 2});
$td->runtest("data after pad",
             {$td->COMMAND => "echo aa==potato | base64 decode"},
             {$td->REGEXP => ".*data follows pad characters.*",
                  $td->EXIT_STATUS => 2});

cleanup();

$td->report(7 + (2 * $n));

sub cleanup
{
    unlink('a', 'b');
}
