0.11 release to fix crazy errors that somehow the tests did not catch
[gitmo/MooseX-UndefTolerant.git] / t / constructor.t
CommitLineData
0dd9c65b 1use Test::More;
5cc8d5b3 2use Test::Fatal;
5447ee45 3
5cc8d5b3 4{
5 package Foo;
6 use Moose;
7
8 has 'attr1' => (
9 traits => [ qw(MooseX::UndefTolerant::Attribute)],
10 is => 'ro',
11 isa => 'Num',
36bf5c4d 12 predicate => 'has_attr1',
5cc8d5b3 13 );
5cc8d5b3 14 has 'attr2' => (
15 is => 'ro',
16 isa => 'Num',
36bf5c4d 17 predicate => 'has_attr2',
5cc8d5b3 18 );
3991a5d2 19 has 'attr3' => (
20 is => 'ro',
21 isa => 'Maybe[Num]',
22 predicate => 'has_attr3',
23 );
5cc8d5b3 24}
5447ee45 25
5cc8d5b3 26{
27 package Bar;
28 use Moose;
29 use MooseX::UndefTolerant;
30
31 has 'attr1' => (
32 is => 'ro',
33 isa => 'Num',
36bf5c4d 34 predicate => 'has_attr1',
5cc8d5b3 35 );
36 has 'attr2' => (
37 is => 'ro',
38 isa => 'Num',
36bf5c4d 39 predicate => 'has_attr2',
5cc8d5b3 40 );
3991a5d2 41 has 'attr3' => (
42 is => 'ro',
43 isa => 'Maybe[Num]',
44 predicate => 'has_attr3',
45 );
5cc8d5b3 46}
5447ee45 47
48package main;
49
8055a641 50sub do_tests
5447ee45 51{
8055a641 52 note 'Testing class with a single UndefTolerant attribute';
53 {
54 my $obj = Foo->new;
55 ok(!$obj->has_attr1, 'attr1 has no value before it is assigned');
56 ok(!$obj->has_attr2, 'attr2 has no value before it is assigned');
3991a5d2 57 ok(!$obj->has_attr3, 'attr3 has no value before it is assigned');
8055a641 58 }
59
60 {
61 my $obj = Foo->new(attr1 => undef);
62 ok(!$obj->has_attr1, 'UT attr1 has no value when assigned undef in constructor');
3991a5d2 63 isnt (exception { $obj = Foo->new(attr2 => undef) }, undef,
8055a641 64 'But assigning undef to attr2 generates a type constraint error');
3991a5d2 65
66 is (exception { $obj = Foo->new(attr3 => undef) }, undef,
67 'assigning undef to attr3 is acceptable');
68 ok($obj->has_attr3, 'attr3 retains its undef value when assigned undef in constructor');
8055a641 69 }
70
71 {
3991a5d2 72 my $obj = Foo->new(attr1 => 1234, attr2 => 5678, attr3 => 9012);
8055a641 73 is($obj->attr1, 1234, 'assigning a defined value during construction works as normal');
74 ok($obj->has_attr1, '...and the predicate returns true as normal');
3991a5d2 75
8055a641 76 is($obj->attr2, 5678, 'assigning a defined value during construction works as normal');
77 ok($obj->has_attr2, '...and the predicate returns true as normal');
3991a5d2 78
79 is($obj->attr3, 9012, 'assigning a defined value during construction works as normal');
80 ok($obj->has_attr3, '...and the predicate returns true as normal');
8055a641 81 }
82
83
84 note '';
85 note 'Testing class with the entire class being UndefTolerant';
86 {
87 my $obj = Bar->new;
88 ok(!$obj->has_attr1, 'attr1 has no value before it is assigned');
3991a5d2 89 ok(!$obj->has_attr2, 'attr2 has no value before it is assigned');
90 ok(!$obj->has_attr3, 'attr3 has no value before it is assigned');
8055a641 91 }
92
93 {
94 my $obj = Bar->new(attr1 => undef);
95 ok(!$obj->has_attr1, 'attr1 has no value when assigned undef in constructor');
3991a5d2 96 # note this test differs from the Foo case above
015b9167 97 is (exception { $obj = Bar->new(attr2 => undef) }, undef,
8055a641 98 'assigning undef to attr2 does not produce an error');
99 ok(!$obj->has_attr2, 'attr2 has no value when assigned undef in constructor');
3991a5d2 100
101 is( exception { $obj = Foo->new(attr3 => undef) }, undef,
102 'assigning undef to attr3 is acceptable');
103 ok($obj->has_attr3, 'attr3 retains its undef value when assigned undef in constructor');
8055a641 104 }
105
106 {
3991a5d2 107 my $obj = Bar->new(attr1 => 1234, attr2 => 5678, attr3 => 9012);
8055a641 108 is($obj->attr1, 1234, 'assigning a defined value during construction works as normal');
109 ok($obj->has_attr1, '...and the predicate returns true as normal');
3991a5d2 110
111 is($obj->attr2, 5678, 'assigning a defined value during construction works as normal');
112 ok($obj->has_attr2, '...and the predicate returns true as normal');
113
114 is($obj->attr3, 9012, 'assigning a defined value during construction works as normal');
115 ok($obj->has_attr3, '...and the predicate returns true as normal');
8055a641 116 }
5447ee45 117}
118
5cc8d5b3 119
8055a641 120note 'Constructor behaviour: mutable classes';
5cc8d5b3 121note '';
8055a641 122do_tests;
5447ee45 123
8055a641 124note '';
125note 'Constructor behaviour: immutable classes';
126note '';
127Foo->meta->make_immutable;
128Bar->meta->make_immutable;
129TODO: {
130 local $TODO = 'some immutable cases are not handled yet';
131 # for now, catch errors
015b9167 132 is(exception { do_tests }, undef, 'tests do not die');
8055a641 133
134 is(Test::More->builder->current_test, 28, 'if we got here, we can declare victory!');
5cc8d5b3 135}
136
8055a641 137done_testing;
5cc8d5b3 138