#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 37;

use_ok('TVGuide');

can_ok('TVGuide', 'new');
my $init_sched = { 4 => 'Buffy', 5=> 'Star Trek', 6 => 'Survivor', 8 => 'Lost' };
my $guide = TVGuide->new(4, $init_sched );

isa_ok($guide, 'TVGuide');

my %hash_guide = %{$guide};
is_deeply(\%hash_guide, { channel => 4, schedule => $init_sched }, 
  "\$guide contains the channel and initial schedule");

can_ok($guide, qw/get_channel get_show now_showing change_channel add_show/);

cmp_ok($guide->get_channel(), '==', 4, "Current channel is 4");
for my $ch (sort {$a <=> $b} keys %{$init_sched}) {
   is($guide->get_show($ch), $init_sched->{$ch}, "$init_sched->{$ch} is showing on channel $ch");
}

is($guide->now_showing(), $guide->get_show($guide->get_channel()), "now_showing() returns show on current channel");

$guide->change_channel(5);
cmp_ok($guide->get_channel(), '==', 5, "Successfully chagned channel to 5");

is($guide->now_showing(), $guide->get_show($guide->get_channel()), "now_showing() returns show on new channel");


$guide->add_show(10, 'American Idol');
my %sched = %{$init_sched};
$sched{10} = 'American Idol';

%hash_guide = %{$guide};
is_deeply(\%hash_guide, { channel => 5, schedule => \%sched }, 
  "\$guide contains the updated channel and schedule");


for my $ch (sort {$a <=> $b} keys %sched) {
   is($guide->get_show($ch), $sched{$ch}, "$sched{$ch} is showing on channel $ch");
}

my %later = ( 5 => 'Daily Show', 7 => 'Late Show', 10 => 'Tonight Show' );
my $later_guide = TVGuide->new(7, \%later);

isa_ok($later_guide, 'TVGuide');

my %hash_later_guide = %{$later_guide};
is_deeply(\%hash_later_guide, { channel => 7, schedule => \%later },
   "\$later_guide is the new guide and channel");

%hash_guide = %{$guide};
is_deeply(\%hash_guide, { channel => 5, schedule => \%sched },    
  "\$guide contains the old channel and schedule");

$later_guide->change_channel(8);
cmp_ok($later_guide->get_channel(), '==', 8, "Changed later guide's channel");
cmp_ok($guide->get_channel(), '==', 5, "Did not change later guide's channel");

ok(!defined($later_guide->now_showing()), "Nothing showing on current channel of \$later_guide");

SKIP: {
   skip("No overload behavior for +", 6) unless defined overload::Method($guide, '+');
   $guide->change_channel(4);
   $guide = $guide + 2;
   cmp_ok($guide->get_channel(), '==', 6, "Changed channel to 6 via +");
   $guide++;
   cmp_ok($guide->get_channel(), '==', 7, "Changed channel to 7 via ++");

   $guide->change_channel(4);
   my $new_guide = $guide + 2;
   cmp_ok($guide->get_channel(), '==', 4, "Original guide still on 4");
   cmp_ok($new_guide->get_channel(), '==', 6, "New guide created on 6");

   $new_guide->add_show(67, 'Yankees Baseball');
   is($new_guide->get_show(67), 'Yankees Baseball', "New Guide has Yankees at 67");
   ok(!defined($guide->get_show(67)), 'Old Guide has nothing at 67');
   
}

SKIP: {
   skip("No overload behavior for -", 6) unless defined overload::Method($guide, '-');
   $guide->change_channel(8);
   $guide = $guide - 3;
   cmp_ok($guide->get_channel(), '==', 5, "Changed channel to 5 via -");
   $guide--;
   cmp_ok($guide->get_channel(), '==', 4, "Changed channel to 4 via --");
   
   $guide->change_channel(8);
   my $new_guide = $guide - 3;
   cmp_ok($guide->get_channel(), '==', 8, "Original guide still on 8");
   cmp_ok($new_guide->get_channel(), '==', 5, "New guide created on 5");

   $new_guide->add_show(67, 'Yankees Baseball');
   is($new_guide->get_show(67), 'Yankees Baseball', "New Guide has Yankees at 67");
   ok(!defined($guide->get_show(67)), 'Old Guide has nothing at 67');
}









