The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl -T
use strict;
use warnings;

use Test::More tests => 11;

{
  package Widget::Parameterized;
  use Mixin::ExtraFields::Param -fields => { driver => 'HashGuts' };

  sub new { bless {} => shift; }
  sub id { 0 + $_[0] }
}

my $widget = Widget::Parameterized->new;

isa_ok($widget, 'Widget::Parameterized');
can_ok($widget, 'param');

{
  my @names = $widget->param;
  cmp_ok(@names, '==', 0, "there are zero params to start with");
}

is(
  $widget->param('flavor'),
  undef,
  "a specific param is also unset",
);

{
  my @names = $widget->param;
  cmp_ok(@names, '==', 0, "checking on a given param didn't create it");
}

is(
  $widget->param(flavor => 'teaberry'),
  'teaberry',
  "we set a param and got its value back",
);

is(
  $widget->param('flavor'),
  'teaberry',
  "...and that value stuck",
);

{
  my @names = $widget->param;
  cmp_ok(@names, '==', 1, "so now there is one param");
}

{
  my @values = $widget->param(size => 'big', limits => undef);
  cmp_ok(@values, '==', 2, "we get back two values");
  is_deeply(\@values, [ 'big', undef ], "...and they're the two set set");

  my @names = $widget->param;
  cmp_ok(@names, '==', 3, "we set two more, now there are three");
}