1#!perl
2use 5.008;
3use strict;
4use warnings FATAL => 'all';
5use lib 't';
6use Test::More;
7use Test::Exception;
8
9use lib 'lib';
10use Mail::AuthenticationResults::Header;
11use Mail::AuthenticationResults::Header::AuthServID;
12use Mail::AuthenticationResults::Header::Base;
13use Mail::AuthenticationResults::Header::Comment;
14use Mail::AuthenticationResults::Header::Entry;
15use Mail::AuthenticationResults::Header::Group;
16use Mail::AuthenticationResults::Header::SubEntry;
17use Mail::AuthenticationResults::Header::Version;
18
19my ( $Header, $Base, $Comment, $Entry, $Group, $SubEntry, $AuthServID, $Version );
20my ( $Header2, $Base2, $Comment2, $Entry2, $Group2, $SubEntry2, $AuthServID2, $Version2 );
21
22sub setup {
23
24    $Header = Mail::AuthenticationResults::Header->new();
25    $Base = Mail::AuthenticationResults::Header::Base->new();
26    $Comment = Mail::AuthenticationResults::Header::Comment->new();
27    $Entry = Mail::AuthenticationResults::Header::Entry->new();
28    $Group = Mail::AuthenticationResults::Header::Group->new();
29    $SubEntry = Mail::AuthenticationResults::Header::SubEntry->new();
30    $AuthServID = Mail::AuthenticationResults::Header::AuthServID->new();
31    $Version = Mail::AuthenticationResults::Header::Version->new();
32
33    $Header2 = Mail::AuthenticationResults::Header->new();
34    $Base2 = Mail::AuthenticationResults::Header::Base->new();
35    $Comment2 = Mail::AuthenticationResults::Header::Comment->new();
36    $Entry2 = Mail::AuthenticationResults::Header::Entry->new();
37    $Group2 = Mail::AuthenticationResults::Header::Group->new();
38    $SubEntry2 = Mail::AuthenticationResults::Header::SubEntry->new();
39    $AuthServID2 = Mail::AuthenticationResults::Header::AuthServID->new();
40    $Version2 = Mail::AuthenticationResults::Header::Version->new();
41}
42
43subtest 'orphan' => sub{
44    setup();
45    dies_ok( sub{ $Header->orphan() }, 'Cannot orphan Header' );
46    dies_ok( sub{ $Base->orphan() }, 'Cannot orphan Header' );
47    dies_ok( sub{ $Comment->orphan() }, 'Cannot orphan Header' );
48    dies_ok( sub{ $Entry->orphan() }, 'Cannot orphan Header' );
49    dies_ok( sub{ $Group->orphan() }, 'Cannot orphan Header' );
50    dies_ok( sub{ $Header->orphan() }, 'Cannot orphan Header' );
51    dies_ok( sub{ $Header->orphan() }, 'Cannot orphan Header' );
52    dies_ok( sub{ $Header->orphan() }, 'Cannot orphan Header' );
53};
54
55subtest 'self' => sub{
56    setup();
57    dies_ok( sub{ $Header->add_child( $Header ) }, 'Header Header self dies' );
58    dies_ok( sub{ $Base->add_child( $Base ) }, 'Base Base self dies' );
59    dies_ok( sub{ $Comment->add_child( $Comment ) }, 'Comment Comment self dies' );
60    dies_ok( sub{ $Entry->add_child( $Entry ) }, 'Entry Entry self dies' );
61    dies_ok( sub{ $Group->add_child( $Group ) }, 'Group Group self dies' );
62    dies_ok( sub{ $SubEntry->add_child( $SubEntry ) }, 'SubEntry SubEntry self dies' );
63    dies_ok( sub{ $AuthServID->add_child( $AuthServID ) }, 'AuthServID AuthServID self dies' );
64    dies_ok( sub{ $Version->add_child( $Version ) }, 'Version Version self dies' );
65};
66
67subtest 'self type' => sub{
68    setup();
69    dies_ok( sub{ $Header->add_child( $Header2 ) }, 'Header Header dies' );
70    dies_ok( sub{ $Header->add_child( $Base2 ) }, 'Header Base dies' );
71    lives_ok( sub{ $Header->add_child( $Comment2 ) }, 'Header Comment lives' );
72    lives_ok( sub{ $Header->add_child( $Entry2 ) }, 'Header Entry lives' );
73    dies_ok( sub{ $Header->add_child( $Group2 ) }, 'Header Group dies' );
74    dies_ok( sub{ $Header->add_child( $Entry2 ) }, 'Header Entry repeat dies' );
75    dies_ok( sub{ $Header->add_child( $SubEntry2 ) }, 'Header SubEntry dies' );
76    dies_ok( sub{ $Header->add_child( $AuthServID) }, 'Header AuthServID dies' );
77    dies_ok( sub{ $Header->add_child( $Version ) }, 'Header Version dies' );
78
79    lives_ok( sub{ $Header->remove_child( $Comment2 ) }, 'Header Comment remove lives' );
80    lives_ok( sub{ $Header->remove_child( $Entry2 ) }, 'Header Entry remove lives' );
81    lives_ok( sub{ $Header->add_child( $Comment2 ) }, 'Header Comment lives' );
82    lives_ok( sub{ $Header->add_child( $Entry2 ) }, 'Header Entry lives' );
83};
84
85subtest 'base' => sub{
86    setup();
87    dies_ok( sub{ $Base->add_child( $Header2 ) }, 'Base Header dies' );
88    dies_ok( sub{ $Base->add_child( $Base2 ) }, 'Base Base dies' );
89    dies_ok( sub{ $Base->add_child( $Comment2 ) }, 'Base Comment dies' );
90    dies_ok( sub{ $Base->add_child( $Entry2 ) }, 'Base Entry dies' );
91    dies_ok( sub{ $Base->add_child( $Group2 ) }, 'Base Group dies' );
92    dies_ok( sub{ $Base->add_child( $SubEntry2 ) }, 'Base SubEntry dies' );
93    dies_ok( sub{ $Base->add_child( $AuthServID) }, 'Base AuthServID dies' );
94    dies_ok( sub{ $Base->add_child( $Version ) }, 'Base Version dies' );
95};
96
97subtest 'comment' => sub{
98    setup();
99    dies_ok( sub{ $Comment->add_child( $Header2 ) }, 'Comment Header dies' );
100    dies_ok( sub{ $Comment->add_child( $Base2 ) }, 'Comment Base dies' );
101    dies_ok( sub{ $Comment->add_child( $Comment2 ) }, 'Comment Comment dies' );
102    dies_ok( sub{ $Comment->add_child( $Entry2 ) }, 'Comment Entry dies' );
103    dies_ok( sub{ $Comment->add_child( $Group2 ) }, 'Comment Group dies' );
104    dies_ok( sub{ $Comment->add_child( $SubEntry2 ) }, 'Comment SubEntry dies' );
105    dies_ok( sub{ $Comment->add_child( $AuthServID) }, 'Comment AuthServID dies' );
106    dies_ok( sub{ $Comment->add_child( $Version ) }, 'Comment Version dies' );
107};
108
109subtest 'entry' => sub{
110    setup();
111    dies_ok( sub{ $Entry->add_child( $Header2 ) }, 'Entry Header dies' );
112    dies_ok( sub{ $Entry->add_child( $Base2 ) }, 'Entry Base dies' );
113    lives_ok( sub{ $Entry->add_child( $Comment2 ) }, 'Entry Comment lives' );
114    dies_ok( sub{ $Entry->add_child( $Comment2 ) }, 'Entry Comment repeat dies' );
115    dies_ok( sub{ $Entry->add_child( $Entry2 ) }, 'Entry Entry dies' );
116    dies_ok( sub{ $Entry->add_child( $Group2 ) }, 'Entry Group dies' );
117    lives_ok( sub{ $Entry->add_child( $SubEntry2 ) }, 'Entry SubEntry lives' );
118    dies_ok( sub{ $Entry->add_child( $AuthServID) }, 'Entry AuthServID dies' );
119    lives_ok( sub{ $Entry->add_child( $Version ) }, 'Entry Version lives' );
120
121    lives_ok( sub{ $Entry->remove_child( $Comment2 ) }, 'Entry Comment remove lives' );
122    lives_ok( sub{ $Entry->remove_child( $SubEntry2 ) }, 'Entry SubEntry remove lives' );
123    lives_ok( sub{ $Entry->remove_child( $Version ) }, 'Entry Version remove lives' );
124    lives_ok( sub{ $Entry->add_child( $Comment2 ) }, 'Entry Comment lives' );
125    lives_ok( sub{ $Entry->add_child( $SubEntry2 ) }, 'Entry SubEntry lives' );
126    lives_ok( sub{ $Entry->add_child( $Version ) }, 'Entry Version lives' );
127};
128
129subtest 'group' => sub{
130    setup();
131    lives_ok( sub{ $Group->add_child( $Header2 ) }, 'Group Header lives' );
132    dies_ok( sub{ $Group->add_child( $Base2 ) }, 'Group Base dies' );
133    lives_ok( sub{ $Group->add_child( $Comment2 ) }, 'Group Comment lives' );
134    lives_ok( sub{ $Group->add_child( $Entry2 ) }, 'Group Entry lives' );
135    lives_ok( sub{ $Group->add_child( $Group2 ) }, 'Group Group lives' );
136    lives_ok( sub{ $Group->add_child( $SubEntry2 ) }, 'Group SubEntry lives' );
137    lives_ok( sub{ $Group->add_child( $AuthServID) }, 'Group AuthServID lives' );
138    lives_ok( sub{ $Group->add_child( $Version ) }, 'Group Version lives' );
139
140    # Group repeats should not die, but should not result in duplicates
141    is( scalar @{$Group->children()}, 6, 'Has 6 children' );
142    lives_ok( sub{ $Group->add_child( $Header2 ) }, 'Group Header repeat lives' );
143    lives_ok( sub{ $Group->add_child( $Comment2 ) }, 'Group Comment repeat lives' );
144    lives_ok( sub{ $Group->add_child( $Entry2 ) }, 'Group Entry repeat lives' );
145    lives_ok( sub{ $Group->add_child( $Group2 ) }, 'Group Group repeat lives' );
146    lives_ok( sub{ $Group->add_child( $SubEntry2 ) }, 'Group SubEntry repeat lives' );
147    lives_ok( sub{ $Group->add_child( $AuthServID) }, 'Group AuthServID repeat lives' );
148    lives_ok( sub{ $Group->add_child( $Version ) }, 'Group Version repeat lives' );
149    is( scalar @{$Group->children()}, 6, 'Still has 6 children' );
150
151    lives_ok( sub{ $Group->remove_child( $Header2 ) }, 'Group Header remove lives' );
152    lives_ok( sub{ $Group->remove_child( $Comment2 ) }, 'Group Comment remove lives' );
153    lives_ok( sub{ $Group->remove_child( $Entry2 ) }, 'Group Entry remove lives' );
154    lives_ok( sub{ $Group->remove_child( $SubEntry2 ) }, 'Group SubEntry remove lives' );
155    lives_ok( sub{ $Group->remove_child( $AuthServID) }, 'Group AuthServID remove lives' );
156    lives_ok( sub{ $Group->remove_child( $Version ) }, 'Group Version remove lives' );
157    is( scalar @{$Group->children()}, 0, 'Now has 0 children' );
158};
159
160subtest 'subentry' => sub{
161    setup();
162    dies_ok( sub{ $SubEntry->add_child( $Header2 ) }, 'SubEntry Header dies' );
163    dies_ok( sub{ $SubEntry->add_child( $Base2 ) }, 'SubEntry Base dies' );
164    lives_ok( sub{ $SubEntry->add_child( $Comment2 ) }, 'SubEntry Comment lives' );
165    dies_ok( sub{ $SubEntry->add_child( $Comment2 ) }, 'SubEntry Comment repeat dies' );
166    dies_ok( sub{ $SubEntry->add_child( $Entry2 ) }, 'SubEntry Entry dies' );
167    dies_ok( sub{ $SubEntry->add_child( $Group2 ) }, 'SubEntry Group dies' );
168    dies_ok( sub{ $SubEntry->add_child( $SubEntry2 ) }, 'SubEntry SubEntry dies' );
169    dies_ok( sub{ $SubEntry->add_child( $AuthServID) }, 'SubEntry AuthServID dies' );
170    lives_ok( sub{ $SubEntry->add_child( $Version ) }, 'SubEntry Version lives' );
171
172    lives_ok( sub{ $SubEntry->remove_child( $Comment2 ) }, 'SubEntry Comment remove lives' );
173    lives_ok( sub{ $SubEntry->remove_child( $Version ) }, 'SubEntry Version remove lives' );
174    lives_ok( sub{ $SubEntry->add_child( $Comment2 ) }, 'SubEntry Comment lives' );
175    lives_ok( sub{ $SubEntry->add_child( $Version ) }, 'SubEntry Version lives' );
176};
177
178subtest 'authservid' => sub{
179    setup();
180    dies_ok( sub{ $AuthServID->add_child( $Header2 ) }, 'AuthServID Header dies' );
181    dies_ok( sub{ $AuthServID->add_child( $Base2 ) }, 'AuthServID Base dies' );
182    lives_ok( sub{ $AuthServID->add_child( $Comment2 ) }, 'AuthServID Comment lives' );
183    dies_ok( sub{ $AuthServID->add_child( $Comment2 ) }, 'AuthServID Comment repeat dies' );
184    dies_ok( sub{ $AuthServID->add_child( $Entry2 ) }, 'AuthServID Entry dies' );
185    dies_ok( sub{ $AuthServID->add_child( $Group2 ) }, 'AuthServID Group dies' );
186    lives_ok( sub{ $AuthServID->add_child( $SubEntry2 ) }, 'AuthServID SubEntry lives' );
187    dies_ok( sub{ $AuthServID->add_child( $AuthServID) }, 'AuthServID AuthServID dies' );
188    lives_ok( sub{ $AuthServID->add_child( $Version ) }, 'AuthServID Version lives' );
189
190    lives_ok( sub{ $AuthServID->remove_child( $Comment2 ) }, 'AuthServID Comment remove lives' );
191    lives_ok( sub{ $AuthServID->remove_child( $SubEntry2 ) }, 'AuthServID SubEntry remove lives' );
192    lives_ok( sub{ $AuthServID->remove_child( $Version ) }, 'AuthServID Version remove lives' );
193    lives_ok( sub{ $AuthServID->add_child( $Comment2 ) }, 'AuthServID Comment lives' );
194    lives_ok( sub{ $AuthServID->add_child( $SubEntry2 ) }, 'AuthServID SubEntry lives' );
195    lives_ok( sub{ $AuthServID->add_child( $Version ) }, 'AuthServID Version lives' );
196};
197
198subtest 'version' => sub{
199    setup();
200    dies_ok( sub{ $Version->add_child( $Header2 ) }, 'Version Header dies' );
201    dies_ok( sub{ $Version->add_child( $Base2 ) }, 'Version Base dies' );
202    dies_ok( sub{ $Version->add_child( $Comment2 ) }, 'Version Comment dies' );
203    dies_ok( sub{ $Version->add_child( $Comment2 ) }, 'Version Comment repeat dies' );
204    dies_ok( sub{ $Version->add_child( $Entry2 ) }, 'Version Entry dies' );
205    dies_ok( sub{ $Version->add_child( $Group2 ) }, 'Version Group dies' );
206    dies_ok( sub{ $Version->add_child( $SubEntry2 ) }, 'Version SubEntry dies' );
207    dies_ok( sub{ $Version->add_child( $AuthServID) }, 'Version AuthServID dies' );
208    dies_ok( sub{ $Version->add_child( $Version ) }, 'Version Version dies' );
209};
210
211done_testing();
212
213