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

use strict;
use warnings;

use Test::More 'no_plan';

use ok "Mail::Summary::Tools::Summary::Thread";

my $now     = time;
my $early   = $now - 100;
my $late    = $now + 100;
my $earlier = $early - 100;
my $later   = $late + 100;

{

	my $thread = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	my $thread_new = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $earlier,
			date_to   => $later,
		},
	);

	$thread->merge( $thread_new );

	is( $thread->extra->{date_from}, $earlier, "date_from" );
	is( $thread->extra->{date_to}, $later, "date_to" );
	ok( !$thread->extra->{out_of_date}, "not marked as out of date because no summary" );
}

{

	my $thread = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		summary    => 'oink',
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	my $thread_new = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	$thread->merge( $thread_new );

	is( $thread->extra->{date_from}, $early, "date_from" );
	is( $thread->extra->{date_to}, $late, "date_to" );
	ok( !$thread->extra->{out_of_date}, "not marked as out of date because dates didn't change" );
	is( $thread->summary, "oink", "summary" );
}

{

	my $thread = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		summary    => 'oink',
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	my $thread_new = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $earlier,
			date_to   => $later,
		},
	);

	$thread->merge( $thread_new );

	is( $thread->extra->{date_from}, $earlier, "date_from" );
	is( $thread->extra->{date_to}, $later, "date_to" );
	ok( $thread->extra->{out_of_date}, "marked as out of date" );
	is( $thread->summary, "oink", "summary" );
}
{

	my $thread = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		hidden     => 1,
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	my $thread_new = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $earlier,
			date_to   => $later,
		},
	);

	$thread->merge( $thread_new );

	is( $thread->extra->{date_from}, $earlier, "date_from" );
	is( $thread->extra->{date_to}, $later, "date_to" );
	ok( $thread->extra->{out_of_date}, "marked as out of date" );
	ok( $thread->hidden, "hidden" );
}

{

	my $thread = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $earlier,
			date_to   => $later,
		},
	);

	my $thread_new = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		summary    => 'oink',
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	$thread->merge( $thread_new );

	is( $thread->extra->{date_from}, $earlier, "date_from" );
	is( $thread->extra->{date_to}, $later, "date_to" );
	ok( $thread->extra->{out_of_date}, "marked as out of date" );
	is( $thread->summary, "oink", "summary" );
}

{

	my $thread = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		summary    => 'oink',
		extra => {
			date_from => $earlier,
			date_to   => $later,
		},
	);

	my $thread_new = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	$thread->merge( $thread_new );

	is( $thread->extra->{date_from}, $earlier, "date_from" );
	is( $thread->extra->{date_to}, $later, "date_to" );
	ok( !$thread->extra->{out_of_date}, "not marked as out of date" );
	is( $thread->summary, "oink", "summary" );
}

{

	my $thread = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		extra => {
			date_from => $early,
			date_to   => $late,
		},
	);

	my $thread_new = Mail::Summary::Tools::Summary::Thread->new(
		message_id => 'foo@bar.com',
		subject    => 'Moose',
		summary    => 'oink',
		extra => {
			date_from => $earlier,
			date_to   => $later,
		},
	);

	$thread->merge( $thread_new );

	is( $thread->extra->{date_from}, $earlier, "date_from" );
	is( $thread->extra->{date_to}, $later, "date_to" );
	ok( !$thread->extra->{out_of_date}, "not marked as out of date because summary was new" );
	is( $thread->summary, "oink", "summary" );
}