#!perl -T
use strict;

use Test::More;

use lib 't/lib';
use Test::EmailAbstract;

my @classes
  = qw(Email::MIME Email::Simple MIME::Entity Mail::Internet Mail::Message);

plan tests => 2
            + (@classes * 2 + 1) * Test::EmailAbstract->tests_per_object
            + (@classes + 2) * Test::EmailAbstract->tests_per_class
            + 1;

use_ok("Email::Abstract");

open FILE, '<t/example.msg';
my $message = do { local $/; <FILE>; };
close FILE;

# Let's be generous and start with real CRLF, no matter what stupid thing the
# VCS or archive tools have done to the message.
$message =~ s/\x0a\x0d|\x0d\x0a|\x0d|\x0a/\x0d\x0a/g;

my $tester = Test::EmailAbstract->new($message);

is(
  substr($message, -2, 2),
  "\x0d\x0a",
  "the message ends in a CRLF",
);

for my $class (@classes) {
  SKIP: {
    $tester->load($class);

    {
      my $obj = Email::Abstract->cast($message, $class);
      my $email_abs = Email::Abstract->new($obj);
      $tester->object_ok($class, $email_abs, 0);
    }

    {
      my $simple = Email::Simple->new($message);
      my $obj = Email::Abstract->cast($simple, $class);
      my $email_abs = Email::Abstract->new($obj);
      $tester->object_ok($class, $email_abs, 0);
    }

    {
      my $obj = Email::Abstract->cast($message, $class);
      $tester->class_ok($class, $obj, 0);
    }
  }
}

{
  my $email_abs = Email::Abstract->new($message);
  $tester->object_ok('plaintext',        $email_abs, 0);
  $tester->class_ok('plaintext (class)', $message,   1);
}

{
  my $email_abs = Email::Abstract->new($message);
  $tester->class_ok('Email::Abstract', $email_abs,   0);
}

{
  # Ensure that we can use Email::Abstract->header($abstract, 'foo')
  my $email_abs = Email::Abstract->new($message);

  my $email_abs_new = Email::Abstract->new($email_abs);
  ok(
    $email_abs == $email_abs_new,
    "trying to wrap a wrapper returns the wrapper; it doesn't re-wrap",
  );
}


syntax highlighted by Code2HTML, v. 0.9.1