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

use_ok('Pizza');

can_ok('Pizza', 'new');

my $pizza = Pizza->new( size => '8-cut' );
isa_ok($pizza, 'Pizza');
isa_ok($pizza, 'Moose::Object');

can_ok($pizza, qw/size add_topping toppings price/);

is($pizza->size(), '8-cut', 'Size initialized correctly');
is_deeply($pizza->toppings(), [ ], 'toppings initialized to empty array');

cmp_ok($pizza->price(), '==', 5, 'Small pizza is $5.00');

$pizza->size('12-cut');
is($pizza->size(), '12-cut', 'Size changed correctly');
cmp_ok($pizza->price(), '==', 7.5, 'Medium pizza is $7.50');

$pizza->size('16-cut');
is($pizza->size(), '16-cut', 'Size changed correctly again');
cmp_ok($pizza->price(), '==', 10, 'Large pizza is $10.00');

$pizza->add_topping('mushrooms');
is_deeply( $pizza->toppings(), [ qw/mushrooms/ ], 'Mushrooms added');
cmp_ok($pizza->price(), '==', 10.5, 'Large pizza w/ mushrooms = $10.50');

$pizza->add_topping('pepperoni');
is_deeply( $pizza->toppings() , [ qw/mushrooms pepperoni/ ], 'Pepperoni added');
cmp_ok($pizza->price(), '==', 11.5, 'Large pizza w/ mushrooms & pepperoni = $11.50');

$pizza->size('8-cut');
cmp_ok($pizza->price(), '==', 6.5, 'Small pizza w/ mushrooms & pepperoni = $6.50');

$pizza->add_topping('buffalo chicken');
is_deeply( $pizza->toppings() , [ qw/mushrooms pepperoni/, 'buffalo chicken' ], 'Buf Chicken added');
cmp_ok($pizza->price(), '==', 8, 'Small pizza w/ mushrooms, pepperoni, & Buf chicken = $8.00');


eval {
  my $p2 = Pizza->new( size => 'large' );
};
ok(defined($@) && length($@), "Invalid value of size in constructor causes failure ($@)");

eval {
   $pizza->size('medium');
};
ok(defined($@) && length($@), "Invalid value of size in size() causes failure ($@)");

eval {
   $pizza->add_topping('anchovies');
};
ok(defined($@) && length($@), "Trying to add an unknown topping causes failure ($@)");

eval {
   $pizza->toppings(['pineapple']);
};
ok(defined($@) && length($@), "Trying to change the entire toppings array causes failure ($@)");








