#!perl

use strict;
use warnings;

use Test::Exception;
use Test::More tests => 8;

use lib 't/';
use LocalTest;

use IPC::Concurrency::DBI::Application;


can_ok(
	'IPC::Concurrency::DBI::Application',
	'new',
);

my $dbh = LocalTest::ok_database_handle();

my $tests =
[
	{
		test_name         => 'Instantiate an application by name.',
		new_args          =>
		{
			database_handle   => $dbh,
			name              => 'cron_script.pl',
		},
		expected_result   => 'success',
	},
	{
		test_name         => 'Instantiate an application by ID.',
		new_args          =>
		{
			database_handle   => $dbh,
			id                => 1,
		},
		expected_result   => 'success',
	},
	{
		test_name         => 'Instantiate an application with a missing database handle.',
		new_args          =>
		{
			id                => 1,
		},
		expected_result   => 'failure',
	},
	{
		test_name         => 'Instantiate an application with neither a name nor an ID.',
		new_args          =>
		{
			database_handle   => $dbh,
		},
		expected_result   => 'failure',
	},
	{
		test_name         => 'Instantiate an application with an invalid name.',
		new_args          =>
		{
			database_handle   => $dbh,
			name              => 'cron_script_invalid.pl',
		},
		expected_result   => 'failure',
	},
	{
		test_name         => 'Instantiate an application with an invalid ID.',
		new_args          =>
		{
			database_handle   => $dbh,
			id                => 100000000,
		},
		expected_result   => 'failure',
	},
];

foreach my $test ( @$tests )
{
	subtest(
		$test->{'test_name'},
		sub
		{
			plan( tests => 2 );
			
			my $application;
			my $test_sub =
			sub
			{
				$application = IPC::Concurrency::DBI::Application->new(
					%{ $test->{'new_args'} },
				);
			};
			
			if ( $test->{'expected_result'} eq 'success' )
			{
				lives_ok(
					sub { $test_sub->(); },
					'Instantiate application.',
				);
				isa_ok(
					$application,
					'IPC::Concurrency::DBI::Application',
					'Return value of new()',
				);
			}
			else
			{
				dies_ok(
					sub { $test_sub->(); },
					'Instantiate application.',
				);
				is(
					$application,
					undef,
					'No return value.',
				);
			}
		}
	);
}

