# $Id$

use strict;
use warnings;
use Test::More tests => 19;

use TheSchwartz;
use Storable;

# With this test, all data structures are in memory so far.  Nothing's
# been inserted into the database because we have no client object
# yet with which to insert.

my $args = { scoops => 2, with => [ 'cheese', 'love' ] };
my $fargs = Storable::nfreeze($args);

my $job1 = TheSchwartz::Job->new_from_array( "feedmajor", $fargs );
isa_ok( $job1, 'TheSchwartz::Job' );
my $job2 = TheSchwartz::Job->new_from_array( "feedmajor", \$fargs );
isa_ok( $job2, 'TheSchwartz::Job' );
my $job3 = TheSchwartz::Job->new( funcname => 'feedmajor', arg => $args );
isa_ok( $job3, 'TheSchwartz::Job' );
my $job4 = TheSchwartz::Job->new( funcname => 'feedmajor', arg => $fargs );
isa_ok( $job4, 'TheSchwartz::Job' );
my $job5 = TheSchwartz::Job->new( funcname => 'feedmajor', arg => \$fargs );
isa_ok( $job5, 'TheSchwartz::Job' );

is_deeply( $job1->column_values, $job2->column_values, "job2 is equivalent" );
is_deeply( $job1->column_values, $job3->column_values, "job3 is equivalent" );
is_deeply( $job1->column_values, $job4->column_values, "job4 is equivalent" );
is_deeply( $job1->column_values, $job5->column_values, "job5 is equivalent" );

my $job6 = TheSchwartz::Job->new(
    funcname  => 'feeddog',
    run_after => time() + 60,
    priority  => 7,
    arg       => { scoops => 2, with => [ 'cheese', 'love' ] },
    coalesce  => 'major',
    jobid     => int( rand() * 5000 ),
);
isa_ok $job6, 'TheSchwartz::Job';

# second arg can also be an arrayref
my $job_a1 = TheSchwartz::Job->new_from_array( "feedmajor",
    [ 'cheese', 'water', 'beer' ] );
my $job_a2 = TheSchwartz::Job->new(
    funcname => "feedmajor",
    arg      => [ 'cheese', 'water', 'beer' ]
);
is_deeply( $job_a1->column_values, $job_a2->column_values,
    "ctors with arrayrefs match" );

my $jobbad = eval {
    TheSchwartz::Job->new(
        funcname  => 'feeddog',
        run_atter => time() + 60,    # [sic] typo
    );
};
ok( !$jobbad, "no bad job" );
ok( $@,       "error creating job with bad argument" );

# can't have multiple non-ref args
$jobbad = eval {
    TheSchwartz::Job->new_from_array( "feeddog", "scalar1", "scalar2" );
};
ok( !$jobbad, "no bad job" );
ok( $@,       "error creating job with bad argument" );

# can't have multiple non-ref args, even if first is scalarref
$jobbad = eval {
    TheSchwartz::Job->new_from_array( "feeddog", \"scalar1", "scalar2" );
};
ok( !$jobbad, "no bad job" );
ok( $@,       "error creating job with bad argument" );

# can't have multiple non-ref args, even if first is hashrf
$jobbad = eval {
    TheSchwartz::Job->new_from_array(
        "feeddog",
        { with  => 'poison' },
        { extra => 'arg' }
    );
};
ok( !$jobbad, "no bad job" );
ok( $@,       "error creating job with bad argument" );