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;
use Test::Fatal;

use Struct::Dumb;

struct Colour => [qw( red green blue )], named_constructor => 1;

{
   my $colour = Colour( red => 1, green => 0, blue => 0 );

   can_ok( $colour, "red" );
   is( $colour->red, 1, '$colour->red is 1' );
}

{
   my $colour = Colour( green => 1, blue => 0.5, red => 0 );

   is( $colour->blue, 0.5, '$colour->blue is 0.5' );
}

{
   package named::default;
   use Struct::Dumb qw( -named_constructors );

   struct Point3D => [qw( x y z )];

   my $point = Point3D( x => 1, z => 3, y => 2 );
   ::is( $point->z, 3, '$point->z from default named constructor' );
}

like( exception { Colour( red => 0, green => 0 ) },
      qr/^usage: main::Colour requires 'blue' at \S+ line \d+\.?\n/,
      'Colour() without blue throws usage exception' );

like( exception { Colour( red => 0, green => 0, blue => 0, yellow => 1 ) },
      qr/^usage: main::Colour does not recognise 'yellow' at \S+ line \d+\.?\n/,
      'Colour() with yellow throws usage exception' );

done_testing;