fixing bug;
[gitmo/Moose.git] / t / 100_bugs / 011_DEMOLISH_eats_exceptions.t
CommitLineData
7c60f730 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More no_plan => 1;
7use Test::Exception;
8use Test::Deep;
9
10use Data::Dumper;
11
12BEGIN
13{
14 use_ok('Moose');
15}
16
17{
18 use Moose::Util::TypeConstraints;
19
20 subtype 'FilePath'
21 => as 'Str'
22 => where { $_ =~ m#^(/[a-zA-Z0-9_.-]+)+$#; }; # '/' (root) forbidden!
23}
24
25{
26 package Baz;
27 use Moose;
28 use Moose::Util::TypeConstraints;
29
30 has 'path' =>
31 (
32 is => 'ro',
33 isa => 'FilePath',
34 required => 1,
35 );
36
37 sub BUILD
38 {
39 my ( $self, $params ) = @_;
40
41 confess $params->{path} . " does not exist" unless -e $params->{path};
42
43 # open files etc.
44 }
45
46 # Defining this causes the FIRST call to Baz->new w/o param to fail,
47 # if no call to ANY Moose::Object->new was done before.
48 #
49 sub DEMOLISH
50 {
51 my ( $self ) = @_;
52
53 # cleanup files etc.
54 }
55}
56
57{
58 package Qee;
59 use Moose;
60 use Moose::Util::TypeConstraints;
61
62 has 'path' =>
63 (
64 is => 'ro',
65 isa => 'FilePath',
66 required => 1,
67 );
68
69 sub BUILD
70 {
71 my ( $self, $params ) = @_;
72
73 confess $params->{path} . " does not exist" unless -e $params->{path};
74
75 # open files etc.
76 }
77
78 # Defining this causes the FIRST call to Qee->new w/o param to fail...
79 # if no call to ANY Moose::Object->new was done before.
80 #
81 sub DEMOLISH
82 {
83 my ( $self ) = @_;
84
85 # cleanup files etc.
86 }
87}
88
89{
90 package Foo;
91 use Moose;
92 use Moose::Util::TypeConstraints;
93
94 has 'path' =>
95 (
96 is => 'ro',
97 isa => 'FilePath',
98 required => 1,
99 );
100
101 sub BUILD
102 {
103 my ( $self, $params ) = @_;
104
105 confess $params->{path} . " does not exist" unless -e $params->{path};
106
107 # open files etc.
108 }
109
110 # Having no DEMOLISH, everything works as expected...
111 #
112}
113
114# Uncomment only one block per test run:
115#
116
117#=pod
118check_em ( 'Baz' ); # 'Baz plain' will fail, aka NO error
119check_em ( 'Qee' ); # ok
120check_em ( 'Foo' ); # ok
121#=cut
122
123#=pod
124check_em ( 'Qee' ); # 'Qee plain' will fail, aka NO error
125check_em ( 'Baz' ); # ok
126check_em ( 'Foo' ); # ok
127#=cut
128
129#=pod
130check_em ( 'Foo' ); # ok
131check_em ( 'Baz' ); # ok !
132check_em ( 'Qee' ); # ok
133#=cut
134
135
136sub check_em
137{
138 my ( $pkg ) = @_;
139
140 my ( %param, $obj );
141
142# Uncomment to see, that it is really any first call.
143# Subsequents calls will not fail, aka giving the correct error.
144 #
145 #=pod
146 {
147 local $@;
148 my $obj = eval { $pkg->new; };
149 ::like ( $@, qr/is required/, "... $pkg plain" );
150 ::is ( $obj, undef, "" );
151 }
152 {
153 local $@;
154 my $obj = eval { $pkg->new(); };
155 ::like ( $@, qr/is required/, "... $pkg empty" );
156 ::is ( $obj, undef, "" );
157 }
158 {
159 local $@;
160 my $obj = eval { $pkg->new ( undef ); };
161 ::like ( $@, qr/is required/, "... $pkg undef" );
162 ::is ( $obj, undef, "" );
163 }
164 #=cut
165 {
166 local $@;
167 my $obj = eval { $pkg->new ( %param ); };
168 ::like ( $@, qr/is required/, "... $pkg undef param" );
169 ::is ( $obj, undef, "" );
170 }
171 {
172 local $@;
173 my $obj = eval { $pkg->new ( path => '/' ); };
174 ::like ( $@, qr/does not pass the type constraint/, "... $pkg root path forbidden" );
175 ::is ( $obj, undef, "" );
176 }
177 {
178 local $@;
179 my $obj = eval { $pkg->new ( path => '/this_path/does/not_exist' ); };
180 ::like ( $@, qr/does not exist/, "... $pkg non existing path" );
181 ::is ( $obj, undef, "" );
182 }
183 {
184 local $@;
185 my $obj = eval { $pkg->new ( path => '/tmp' ); };
186 ::is ( $@, '', "... $pkg no error" );
187 ::isa_ok ( $obj, $pkg );
188 ::isa_ok ( $obj, 'Moose::Object' );
189 ::is ( $obj->path, '/tmp', "... $pkg got the right value" );
190 }
191}