/
structured.t
88 lines (71 loc) · 1.87 KB
/
structured.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use strict;
use warnings;
use Test::More tests => 18;
use Moose::Util::TypeConstraints;
use MooseX::Types::Moose qw/Defined Object Maybe Str Int/;
use MooseX::Types::Structured qw/Dict Tuple Optional/;
use MooseX::Method::Signatures;
my $o = bless {}, 'Class';
{ # ($foo, $bar?)
my $meth = method ($foo, $bar?) {
$bar ||= 'default';
return "${\ref $self} ${foo} ${bar}";
};
my $expected = Tuple[Tuple[Object,Defined,Maybe[Defined]], Dict[]];
is($meth->type_constraint->name, $expected->name);
eval {
is($o->${\$meth->body}('foo', 'bar'), 'Class foo bar');
};
ok(!$@);
eval {
is($o->${\$meth->body}('foo'), 'Class foo default');
};
ok(!$@);
eval {
$o->${\$meth->body}();
};
ok($@);
}
{
my $meth = method (:$foo!, :$bar) {
$bar ||= 'default';
return "${\ref $self} ${foo} ${bar}";
};
my $expected = Tuple[Tuple[Object], Dict[foo => Defined, bar => Optional[Defined]]];
is($meth->type_constraint->name, $expected->name);
eval {
is($o->${\$meth->body}(foo => 1, bar => 2), 'Class 1 2');
};
ok(!$@);
eval {
is($o->${\$meth->body}(foo => 1), 'Class 1 default');
};
ok(!$@);
eval {
$o->${\$meth->body}(foo => 1, bar => 2, baz => 3);
};
ok($@);
eval {
$o->${\$meth->body}(bar => 1);
};
ok($@);
eval {
$o->${\$meth->body}();
};
ok($@);
}
{
my $meth = method ($class: Str $foo, Int $bar where { $_ % 2 == 0 }) {
return "${class} ${foo} ${bar}";
};
my $expected = Tuple[Tuple[Defined, Str, subtype(Int, where { $_ % 2 == 0 })], Dict[]];
is($meth->type_constraint->name, $expected->name);
eval {
is(Class->${\$meth->body}('foo', 42), 'Class foo 42');
};
ok(!$@);
eval {
Class->${\$meth->body}('foo', 23);
};
ok($@);
}