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 tests => 37;

require 't/utils.pl';

use_ok 'Business::SLA';

{
    my $sla = new Business::SLA;
    isa_ok $sla, 'Business::SLA';
    ok !$sla->BusinessHours, 'empty object => empty opt';
    ok !$sla->InHoursDefault, 'empty object => empty opt';
    ok !$sla->OutOfHoursDefault, 'empty object => empty opt';
}

{
    my $sla = new Business::SLA;
    $sla->SetInHoursDefault('aaa');
    is $sla->InHoursDefault, 'aaa', "Returned same InHoursDefault";
}
{
    my $sla = Business::SLA->new( InHoursDefault => 'aaa' );
    is $sla->InHoursDefault, 'aaa', "Returned same InHoursDefault";
}

{
    my $sla = new Business::SLA;
    $sla->SetOutOfHoursDefault('aaa');
    is $sla->OutOfHoursDefault, 'aaa', "Returned same OutOfHoursDefault";
}
{
    my $sla = Business::SLA->new( OutOfHoursDefault => 'aaa' );
    is $sla->OutOfHoursDefault, 'aaa', "Returned same OutOfHoursDefault";
}

# IsInHours
{
    my $sla = new Business::SLA;
    ok $sla->IsInHours( get_inhours_time() ), "Time is in hours";
    ok $sla->IsInHours( get_outofhours_time() ), "Time is in hours";
}

# SLA
{
    my $sla = Business::SLA->new( InHoursDefault => 'in', OutOfHoursDefault => 'out' );
    is $sla->SLA( get_inhours_time() ), 'in', "No business hours => always in hours";
    is $sla->SLA( get_outofhours_time() ), 'in', "No business hours => always in hours";
}

# AddRealMinutes
{
    my $sla = new Business::SLA;
    $sla->Add( real => RealMinutes => 120 );
    $sla->Add( business => BusinessMinutes => 60 );

    is $sla->AddRealMinutes('real'),     120, "Got real minutes for added SLA";
    is $sla->AddRealMinutes('business'),   0, "Got no real minutes for business SLA";
    is $sla->AddRealMinutes('wrong'),      0, "Got no real minutes for wrong SLA";
    is $sla->AddRealMinutes( undef ),      0, "Got no real minutes for undef SLA";
}

# AddBusinessMinutes
{
    my $sla = new Business::SLA;
    $sla->Add( real => RealMinutes => 120 );
    $sla->Add( business => BusinessMinutes => 60 );

    # with no business minutes set
    is $sla->AddBusinessMinutes('real'), undef, 
        "Got undef instead of business minutes for any SLA without Business Hours";
    is $sla->AddBusinessMinutes('business'), undef, 
        "Got undef instead of business minutes for any SLA without Business Hours";
    is $sla->AddBusinessMinutes('wrong'), undef, 
        "Got undef instead of business minutes for any SLA without Business Hours";
    is $sla->AddBusinessMinutes(undef), undef, 
        "Got undef instead of business minutes for any SLA without Business Hours";
}

# Starts
{
    my $sla = new Business::SLA;
    $sla->Add( real => RealMinutes => 120 );
    $sla->Add( business => BusinessMinutes => 60 );
    $sla->Add( immediately_real => RealMinutes => 30, StartImmediately => 1 );
    $sla->Add( immediately_business => RealMinutes => 15, StartImmediately => 1 );

    my $time = get_inhours_time();
    is $sla->Starts( $time, 'real' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'business' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'immediately_real' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'immediately_business' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'wrong' ), $time, 'for a wrong service level things start immediately too';

    $time = get_outofhours_time();
    is $sla->Starts( $time, 'real' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'business' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'immediately_real' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'immediately_business' ), $time, 'no BusinessHours => things start immediately';
    is $sla->Starts( $time, 'wrong' ), $time, 'for a wrong service level things start immediately too';
}

{
    my $sla = new Business::SLA;
    $sla->Add( real => RealMinutes => 120 );
    $sla->Add( business => BusinessMinutes => 60 );

    my $time = get_inhours_time();
    is $sla->Due($time, 'real'), $time + 60*120, "Get starting time";
    is $sla->Due($time, 'business'), $time, "Get starting time";
    is $sla->Due($time, 'wrong'), $time, "Get starting time";

    $time = get_outofhours_time();
    is $sla->Due($time, 'real'), $time + 60*120, "Get starting time";
    is $sla->Due($time, 'business'), $time, "Get starting time";
    is $sla->Due($time, 'wrong'), $time, "Get starting time";
}