The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Test::More;
use Test::Exception;

use lib 't/lib';
use Pinto::Tester;

#------------------------------------------------------------------------------

my $t = Pinto::Tester->new;

#------------------------------------------------------------------------------

{
  # Create a stack...
  my $stack = $t->pinto->repo->create_stack(name => 'test');

  # Set a property...
  $stack->set_property(a => 1);
  is $stack->get_property('a'), 1,
    'set/get one property';

  # Set several properties...
  $stack->set_properties({b => 2, c => 3});
  is_deeply $stack->get_properties, { a => 1, b => 2, c => 3 },
    'get/set many props at once';

  # Copy stack...
  my $new_stack = $t->pinto->repo->copy_stack(stack => $stack, name => 'qa');
  my $new_props = $new_stack->get_properties;

  # All the copied properties should be identical
  is_deeply $new_props, $stack->get_properties,
    'Copied stack has same properties';

  # Delete a property...
  $new_stack->delete_property('a');
  ok ! exists $new_stack->get_properties->{'a'},
    'Deleted a prop';

# Delete a property by setting to empty string...
  $new_stack->set_property(a => '');
  ok ! exists $new_stack->get_properties->{'a'},
    'Deleted a prop by setting to empty';

  # Invalid property name..
  throws_ok { $new_stack->set_property('foo#bar' => 4) }
    qr{Invalid property name};

  # Property names forced to lowercase...
  $new_stack->set_property(SHOUTING => 4);
  ok exists $new_stack->get_properties->{'shouting'},
    'Get/Set property irrespective of case';

  # Property names forced to lowercase...
  $new_stack->delete_property('ShOuTiNg');
  ok ! exists $new_stack->get_properties->{'shouting'},
    'Delete property irrespective of case';

}


#------------------------------------------------------------------------------

done_testing;