The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -I../lib

use strict;
use warnings;
use Test::Simple tests => 16;

use Mail::DKIM::TextWrap;

my $tw;
$tw = Mail::DKIM::TextWrap->new;
ok($tw, "new() works");

my $output = "";
my @lines;

$tw = Mail::DKIM::TextWrap->new(
		Margin => 10,
		Output => \$output,
		);
$tw->add("Mary had a little lamb, whose fleece was white as snow.\n");
$tw->finish;
my $saved1 = $output;
check_output("basic wrapping");
ok(@lines == 7, "basic wrapping got expected number of lines");

foreach ("Mary ", "had ", "a ", "little ", "lamb, ", "whose ", "fleece ",
		"was ", "white ", "as ", "snow.\n")
{
	$tw->add($_);
}
$tw->finish;
my $saved2 = $output;
check_output("basic wrapping- words added separately, space following each");
ok($saved1 eq $saved2, "same result when words added separately, space following each");

foreach ("Mary", " had", " a", " little", " lamb,", " whose", " fleece",
		" was", " white", " as", " snow.\n")
{
	$tw->add($_);
}
$tw->finish;
my $saved3 = $output;
check_output("basic wrapping- words added separately, space preceding each");
ok($saved1 eq $saved3, "same result when words added separately, space preceding each");

$tw->{Separator} = "\n  ";
$tw->add("Mary had a little lamb, whose fleece was white as snow.\n");
$tw->finish;
check_output("with second-line indent");
ok($lines[0] =~ /^Mary had a/, "first line looks ok");

$tw = Mail::DKIM::TextWrap->new(
		Margin => 10,
		Output => \$output,
		Break => qr/[\s:]/,
		);
$tw->add("apple:orange:banana:apricot:blueberry:strawberry-kiwi\n");
$tw->finish;
check_output("colon-separated list");
ok($lines[0] eq "apple:", "first line looks ok");
ok($lines[1] eq "orange:", "second line looks ok");
ok($lines[$#lines] =~ "strawberry-kiwi", "over-long word did not get split");

$tw->add(" apple : orange : apricot : kiwi \n");
$tw->finish;
check_output("colon-separated list with spaces");
ok($lines[0] =~ /^\s/, "first line begins with space");
ok($lines[$#lines] =~ /\s$/, "last line ends with space");
ok(grep(!/(^\s|\s$)/, @lines[1 .. ($#lines - 1)]), "middle lines neither begin nor end with space");

$tw = Mail::DKIM::TextWrap->new(
		Margin => 10,
		Output => \$output,
		Break => qr/[\s:]/,
		BreakBefore => qr/[:]/,
		);
$tw->add("apple:orange:banana:apricot:lime:kiwi\n");
$tw->finish;
check_output("colon-separated list, split before colons");
ok($lines[0] eq "apple", "first line looks ok");
ok($lines[1] eq ":orange", "second line looks ok");
ok($lines[$#lines] =~ /:kiwi$/, "last line looks ok");

$tw = Mail::DKIM::TextWrap->new(
		Margin => 10,
		Output => \$output,
		);
$tw->add("apple");
$tw->add("orange");
$tw->add("banana");
$tw->add("apricot");
$tw->finish;
check_output("");
ok(@lines == 1, "no wrapping took place");

$tw = Mail::DKIM::TextWrap->new(
		Margin => 10,
		Output => \$output,
		);
foreach (qw(apple orange banana apricot))
{
	$tw->add($_);
	$tw->flush;
}
$tw->finish;
check_output("");
ok(!(grep { length($_) > 10 } @lines), "no long lines");

sub check_output
{
	my ($test_name) = @_;
	@lines = split /\n/, $output;
	$output = "";

	print "# $test_name\n";
	print "# " . ('-' x $tw->{Margin}) . "\n";
	foreach my $l (@lines)
	{
		print "# $l\n";
	}
	print "# " . ('-' x $tw->{Margin}) . "\n";
}