The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;

use Test::More;

eval "require Email::Abstract; 1"
  or plan skip_all => "these tests require Email::Abstract";

plan tests => 10;

use E'Mail::Acme;#';

my $e_mail = E'Mail::Acme;#'

# Older versions of Test::More seem to force you to use the inefficient
# "double-colon" separator, probably due to bias against palindromes.
# (' comes from Ada.)
isa_ok($e_mail, "E::Mail::Acme");

$e_mail->{Received} = [
  q/r 1/,
  q/r 2/,
];

$e_mail->{From}     = q<rjbs@example.com>;
$e_mail->{To}       = q'The PEP (Perl Email Project) List <pep-l@perl.xxx>';

push @$e_mail,
  "Dear PEP Suckers,",
  "",
  "Somebody should write a SIMPLE Email::Simple replacement.",
  "",
  "In fact, someone has.  Me!  SO LONG, SUCKERS!",
  "",
  "-- ",
  "your former leader",
  "rjbs"
;

my $expected_header = <<'END_STRING';
Received: r 1
Received: r 2
From: rjbs@example.com
To: The PEP (Perl Email Project) List <pep-l@perl.xxx>
END_STRING

my $expected_body = <<'END_STRING';
Dear PEP Suckers,

Somebody should write a SIMPLE Email::Simple replacement.

In fact, someone has.  Me!  SO LONG, SUCKERS!

-- 
your former leader
rjbs
END_STRING

$expected_header =~ s/\n/\x0d\x0a/g;
$expected_body   =~ s/\n/\x0d\x0a/g;

my $expected = "$expected_header\x0d\x0a$expected_body";

is(
  "" . $e_mail,
  $expected,
  "message stringifies properly",
);

my $abstract = Email::Abstract->new($e_mail);

isa_ok($abstract, 'Email::Abstract');

is($abstract->as_string,  $expected, "as_string");
is($abstract->get_header('from'), 'rjbs@example.com', '$ get_header');
is_deeply(
  [ $abstract->get_header('received') ],
  [ 'r 1', 'r 2' ],
  '@ get_header',
);

is($abstract->get_body, $expected_body, 'get_body');

my $new_body = "I miss you guys.\n\nLots.";
$abstract->set_body($new_body);

(my $expected_new_body = $new_body) =~ s/\n/\x0d\x0a/g;
$expected_new_body .= "\x0d\x0a";

is(
  $abstract->as_string,
  "$expected_header\x0d\x0a$expected_new_body",
  "set_body; as_string",
);

$abstract->set_header(from => qw(a b));
is($abstract->get_header('from'), 'a', '$ set_header; get_header');
is_deeply(
  [ $abstract->get_header('from') ],
  [ qw(a b) ],
  '@ set_header; get_header',
);