line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Test::Inline::Section; |
2
|
|
|
|
|
|
|
# ABSTRACT: Implements a section of tests |
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
#pod =pod |
5
|
|
|
|
|
|
|
#pod |
6
|
|
|
|
|
|
|
#pod =head1 DESCRIPTION |
7
|
|
|
|
|
|
|
#pod |
8
|
|
|
|
|
|
|
#pod This class implements a single section of tests. That is, a section of POD |
9
|
|
|
|
|
|
|
#pod beginning with C<=begin test> or C<=begin testing>. |
10
|
|
|
|
|
|
|
#pod |
11
|
|
|
|
|
|
|
#pod =head2 Types of Sections |
12
|
|
|
|
|
|
|
#pod |
13
|
|
|
|
|
|
|
#pod There are two types of code sections. The first, beginning with |
14
|
|
|
|
|
|
|
#pod C<=begin testing ...>, contains a set of tests and other code to be executed |
15
|
|
|
|
|
|
|
#pod at any time (within a set of specifyable constraints). The second, labelled |
16
|
|
|
|
|
|
|
#pod C<=begin testing SETUP>, contains code to be executed at the beginning of the |
17
|
|
|
|
|
|
|
#pod test script, before any of the other sections are executed. This allows |
18
|
|
|
|
|
|
|
#pod any needed variables or environment to be set up before the tests are run. |
19
|
|
|
|
|
|
|
#pod You can have more than one setup section, and they will be written to the |
20
|
|
|
|
|
|
|
#pod test file in order of appearance. |
21
|
|
|
|
|
|
|
#pod |
22
|
|
|
|
|
|
|
#pod =head2 Test Section Header Syntax |
23
|
|
|
|
|
|
|
#pod |
24
|
|
|
|
|
|
|
#pod Some examples of the different types of test headers are as follows. |
25
|
|
|
|
|
|
|
#pod |
26
|
|
|
|
|
|
|
#pod # Normal anonymous test |
27
|
|
|
|
|
|
|
#pod =begin testing |
28
|
|
|
|
|
|
|
#pod |
29
|
|
|
|
|
|
|
#pod ok( $foo == $bar, 'This is a test' ); |
30
|
|
|
|
|
|
|
#pod |
31
|
|
|
|
|
|
|
#pod =end testing |
32
|
|
|
|
|
|
|
#pod |
33
|
|
|
|
|
|
|
#pod # A named test. Also provides the number of tests to run. |
34
|
|
|
|
|
|
|
#pod # Any test section can specify the number of tests. |
35
|
|
|
|
|
|
|
#pod =begin testing my_method 1 |
36
|
|
|
|
|
|
|
#pod |
37
|
|
|
|
|
|
|
#pod ok( $foo->my_method, '->my_method returns true' ); |
38
|
|
|
|
|
|
|
#pod |
39
|
|
|
|
|
|
|
#pod =end testing |
40
|
|
|
|
|
|
|
#pod |
41
|
|
|
|
|
|
|
#pod # A named test with pre-requisites. |
42
|
|
|
|
|
|
|
#pod # Note that ONLY named tests can have pre-requisites |
43
|
|
|
|
|
|
|
#pod =begin testing this after my_method foo bar other_method Other::Class |
44
|
|
|
|
|
|
|
#pod |
45
|
|
|
|
|
|
|
#pod ok( $foo->this, '->this returns true' ); |
46
|
|
|
|
|
|
|
#pod |
47
|
|
|
|
|
|
|
#pod =end testing |
48
|
|
|
|
|
|
|
#pod |
49
|
|
|
|
|
|
|
#pod The first example shows a normal anonymous test. All anonymous test sections |
50
|
|
|
|
|
|
|
#pod are considered low priority, and we be run, in order of appearance, AFTER all |
51
|
|
|
|
|
|
|
#pod named tests have been run. |
52
|
|
|
|
|
|
|
#pod |
53
|
|
|
|
|
|
|
#pod Any and all arguments used after "testing" must be in the form of simple |
54
|
|
|
|
|
|
|
#pod space seperated words. The first word is considered the "name" of the test. |
55
|
|
|
|
|
|
|
#pod The intended use for these is generally to create one named test section for |
56
|
|
|
|
|
|
|
#pod each function or method, but you can name them as you please. Test names |
57
|
|
|
|
|
|
|
#pod B be unique, and B case sensitive. |
58
|
|
|
|
|
|
|
#pod |
59
|
|
|
|
|
|
|
#pod After the name, you can provide the word "after" and provide a list of other |
60
|
|
|
|
|
|
|
#pod named tests that must be completed first in order to run this test. This is |
61
|
|
|
|
|
|
|
#pod provided so that when errors are encounted, they are probably the result of |
62
|
|
|
|
|
|
|
#pod this method or set of tests, and not in some other method that this one |
63
|
|
|
|
|
|
|
#pod relies on. It makes debugging a lot easier. The word after is only a |
64
|
|
|
|
|
|
|
#pod keyword when after the test name, so you can use a test name of after as well. |
65
|
|
|
|
|
|
|
#pod The following are both legal |
66
|
|
|
|
|
|
|
#pod |
67
|
|
|
|
|
|
|
#pod =begin testing after after that |
68
|
|
|
|
|
|
|
#pod =begin testing this after after |
69
|
|
|
|
|
|
|
#pod |
70
|
|
|
|
|
|
|
#pod The easiest and recommended way of labeling the tests is simple to name all |
71
|
|
|
|
|
|
|
#pod tests after their methods, and put as a pre-requisite any other methods that |
72
|
|
|
|
|
|
|
#pod the method you are testing calls. Test::Inline will take care of writing the |
73
|
|
|
|
|
|
|
#pod tests to the test script in the correct order. Please note you can NOT define |
74
|
|
|
|
|
|
|
#pod circular relationships in the prerequisites, or an error will occur. |
75
|
|
|
|
|
|
|
#pod |
76
|
|
|
|
|
|
|
#pod If a number is provided as the last value, it will be taken to mean the |
77
|
|
|
|
|
|
|
#pod number of actual tests that will occur during the test section. While |
78
|
|
|
|
|
|
|
#pod preparing to write the test files, the processor will try to use these |
79
|
|
|
|
|
|
|
#pod to try to determine the number of files to write. If ALL test sections to |
80
|
|
|
|
|
|
|
#pod be written to a particular file have a test count, then the script will |
81
|
|
|
|
|
|
|
#pod use the total of these as a basic for providing Test::More with a plan. |
82
|
|
|
|
|
|
|
#pod |
83
|
|
|
|
|
|
|
#pod If ANY test sections to be written to a file do not have a test count, the |
84
|
|
|
|
|
|
|
#pod test file with use C. |
85
|
|
|
|
|
|
|
#pod |
86
|
|
|
|
|
|
|
#pod Finally, Test::Inline will try to be forgiving in it's parsing of the tests. |
87
|
|
|
|
|
|
|
#pod any missing prerequisites will be ignored. Also, as long as it does not |
88
|
|
|
|
|
|
|
#pod break a prerequisite, all named tests will be attempted to be run in their |
89
|
|
|
|
|
|
|
#pod order of appearance. |
90
|
|
|
|
|
|
|
#pod |
91
|
|
|
|
|
|
|
#pod =head1 METHODS |
92
|
|
|
|
|
|
|
#pod |
93
|
|
|
|
|
|
|
#pod =cut |
94
|
|
|
|
|
|
|
|
95
|
12
|
|
|
12
|
|
85
|
use strict; |
|
12
|
|
|
|
|
26
|
|
|
12
|
|
|
|
|
345
|
|
96
|
12
|
|
|
12
|
|
60
|
use List::Util (); |
|
12
|
|
|
|
|
22
|
|
|
12
|
|
|
|
|
215
|
|
97
|
12
|
|
|
12
|
|
55
|
use Params::Util qw{_ARRAY}; |
|
12
|
|
|
|
|
26
|
|
|
12
|
|
|
|
|
528
|
|
98
|
12
|
|
|
12
|
|
68
|
use Algorithm::Dependency::Item (); |
|
12
|
|
|
|
|
22
|
|
|
12
|
|
|
|
|
26800
|
|
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
our $VERSION = '2.214'; |
101
|
|
|
|
|
|
|
our @ISA = 'Algorithm::Dependency::Item'; |
102
|
|
|
|
|
|
|
our $errstr = ''; |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
##################################################################### |
109
|
|
|
|
|
|
|
# Constructor and Parsing |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
#pod =pod |
112
|
|
|
|
|
|
|
#pod |
113
|
|
|
|
|
|
|
#pod =head2 new |
114
|
|
|
|
|
|
|
#pod |
115
|
|
|
|
|
|
|
#pod my $Section = Test::Inline::Section->new( $pod ); |
116
|
|
|
|
|
|
|
#pod |
117
|
|
|
|
|
|
|
#pod The C constructor takes a string of POD, which must be a single section |
118
|
|
|
|
|
|
|
#pod of relevant pod ( preferably produced by L ), |
119
|
|
|
|
|
|
|
#pod and creates a new section object for it. |
120
|
|
|
|
|
|
|
#pod |
121
|
|
|
|
|
|
|
#pod Returns a new C object if passed POD in the form |
122
|
|
|
|
|
|
|
#pod C<=begin testing ...>. Returns C on error. |
123
|
|
|
|
|
|
|
#pod |
124
|
|
|
|
|
|
|
#pod =cut |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
my $RE_begin = qr/=begin\s+(?:test|testing)/; |
127
|
|
|
|
|
|
|
my $RE_example = qr/=for\s+example\s+begin/; |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
sub new { |
130
|
57
|
|
|
57
|
1
|
5319
|
$errstr = ''; |
131
|
57
|
|
|
|
|
94
|
my $class = shift; |
132
|
57
|
50
|
|
|
|
737
|
my $pod = $_[0] =~ /^(?:$RE_begin|$RE_example)\b/ ? shift : |
133
|
|
|
|
|
|
|
return $class->_error("Test section does not begin with =begin test[ing]"); |
134
|
57
|
|
|
|
|
127
|
my $context = shift; |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
# Split into lines |
137
|
57
|
|
|
|
|
741
|
my @lines = split /(?:\015{1,2}\012|\015|\012)/, $pod; |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
# Handle =for example seperately |
140
|
57
|
100
|
|
|
|
354
|
if ( $pod =~ /^$RE_example\b/ ) { |
141
|
1
|
|
|
|
|
4
|
return $class->_example( \@lines, $context ); |
142
|
|
|
|
|
|
|
} |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
# Get the begin paragraph ( yes, paragraph. NOT line ) |
145
|
56
|
|
|
|
|
104
|
my $begin = ''; |
146
|
56
|
|
66
|
|
|
323
|
while ( @lines and $lines[0] !~ /^\s*$/ ) { |
147
|
56
|
50
|
|
|
|
128
|
$begin .= ' ' if $begin; |
148
|
56
|
|
|
|
|
311
|
$begin .= shift @lines; |
149
|
|
|
|
|
|
|
} |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
# Remove the trailing end tag |
152
|
56
|
50
|
33
|
|
|
356
|
if ( @lines and $lines[-1] =~ /^=end\s+(?:test|testing)\b/o ) { |
153
|
56
|
|
|
|
|
106
|
pop @lines; |
154
|
|
|
|
|
|
|
} |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
# Do some cleaning up and checking |
157
|
56
|
|
|
|
|
193
|
$class->_trim_empty_lines( \@lines ); |
158
|
56
|
100
|
|
|
|
143
|
$class->_check_nesting( \@lines, $begin ) or return undef; |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
# Create the basic object |
161
|
|
|
|
|
|
|
my $self = bless { |
162
|
|
|
|
|
|
|
begin => $begin, |
163
|
55
|
|
|
|
|
125
|
content => join( '', map { "$_\n" } @lines ), |
|
57
|
|
|
|
|
541
|
|
164
|
|
|
|
|
|
|
setup => '', # Is this a setup section |
165
|
|
|
|
|
|
|
example => '', # Is this an example section |
166
|
|
|
|
|
|
|
context => $context, # Package context |
167
|
|
|
|
|
|
|
name => undef, # The name of the test |
168
|
|
|
|
|
|
|
tests => undef, # undef means unknown test count |
169
|
|
|
|
|
|
|
after => {}, # Other named methods this should be after |
170
|
|
|
|
|
|
|
classes => {}, # Other classes this should be after |
171
|
|
|
|
|
|
|
}, $class; |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
# Start processing the begin line |
174
|
55
|
|
|
|
|
349
|
my @parts = split /\s+/, $begin; |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
# Remove the =begin |
177
|
55
|
|
|
|
|
144
|
shift @parts; |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
# If the line contains a number then this is part of the tests |
180
|
55
|
|
|
|
|
168
|
foreach my $i ( 0 .. $#parts ) { |
181
|
191
|
100
|
|
|
|
619
|
next unless $parts[$i] =~ /^(0|[1-9]\d*)$/; |
182
|
43
|
|
|
|
|
167
|
$self->{tests} = splice @parts, $i, 1; |
183
|
43
|
|
|
|
|
88
|
last; |
184
|
|
|
|
|
|
|
} |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
# Handle setup sections via =begin test setup or =begin testing SETUP |
187
|
55
|
50
|
66
|
|
|
229
|
if ( @parts == 2 and $parts[0] eq 'test' and $parts[1] eq 'setup' ) { |
|
|
|
33
|
|
|
|
|
188
|
0
|
|
|
|
|
0
|
$self->{setup} = 1; |
189
|
|
|
|
|
|
|
} |
190
|
55
|
100
|
66
|
|
|
296
|
if ( @parts >= 2 and $parts[0] eq 'testing' and $parts[1] eq 'SETUP' ) { |
|
|
|
100
|
|
|
|
|
191
|
9
|
|
|
|
|
31
|
$self->{setup} = 1; |
192
|
|
|
|
|
|
|
} |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
# Any other form of =begin test is not allowed |
195
|
55
|
50
|
33
|
|
|
155
|
if ( $parts[0] eq 'test' and ! $self->{setup} ) { |
196
|
|
|
|
|
|
|
# Unknown =begin test line |
197
|
0
|
|
|
|
|
0
|
return $class->_error("Unsupported '=begin test' line '$begin'"); |
198
|
|
|
|
|
|
|
} |
199
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
# Remove the "testing" word |
201
|
55
|
|
|
|
|
82
|
shift @parts; |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
# If there are no remaining parts, we are anonymous, |
204
|
|
|
|
|
|
|
# and can just return as is. |
205
|
55
|
100
|
|
|
|
147
|
return $self unless @parts; |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
# Make sure all remaining parts are only words |
208
|
46
|
50
|
|
|
|
85
|
if ( grep { ! /^[\w:]+$/ } @parts ) { |
|
93
|
|
|
|
|
368
|
|
209
|
0
|
|
|
|
|
0
|
return $class->_error("Found something other than words: $begin"); |
210
|
|
|
|
|
|
|
} |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
# The first word is our name and must match the perl |
213
|
|
|
|
|
|
|
# format for a method name. |
214
|
46
|
100
|
|
|
|
129
|
if ( $self->{setup} ) { |
215
|
9
|
|
|
|
|
18
|
shift @parts; |
216
|
|
|
|
|
|
|
} else { |
217
|
37
|
|
|
|
|
73
|
$self->{name} = shift @parts; |
218
|
37
|
50
|
|
|
|
174
|
unless ( $self->{name} =~ /^[^\W\d]\w*$/ ) { |
219
|
0
|
|
|
|
|
0
|
return $class->_error("'$self->{name}' is not a valid test name: $begin"); |
220
|
|
|
|
|
|
|
} |
221
|
|
|
|
|
|
|
} |
222
|
46
|
100
|
|
|
|
173
|
return $self unless @parts; |
223
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
# The next word MUST be "after" |
225
|
19
|
50
|
|
|
|
53
|
unless ( shift @parts eq 'after' ) { |
226
|
0
|
|
|
|
|
0
|
return $class->_error("Word after test name is something other than 'after': $begin"); |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
# The remaining words are our dependencies. |
230
|
|
|
|
|
|
|
# Simple words chunks are method dependencies, and anything |
231
|
|
|
|
|
|
|
# containing :: (including at the end) is a dependency on |
232
|
|
|
|
|
|
|
# another module that should be part of the testing process. |
233
|
19
|
|
|
|
|
56
|
foreach my $part ( @parts ) { |
234
|
28
|
100
|
|
|
|
102
|
if ( $part =~ /^[^\W\d]\w*$/ ) { |
|
|
50
|
|
|
|
|
|
235
|
26
|
50
|
|
|
|
63
|
if ( $self->setup ) { |
236
|
0
|
|
|
|
|
0
|
return $class->_error("SETUP sections can only have class dependencies"); |
237
|
|
|
|
|
|
|
} |
238
|
26
|
|
|
|
|
81
|
$self->{after}->{$part} = 1; |
239
|
|
|
|
|
|
|
} elsif ( $part =~ /::/ ) { |
240
|
2
|
|
|
|
|
6
|
$part =~ s/::$//; # Strip trailing :: |
241
|
2
|
|
|
|
|
7
|
$self->{classes}->{$part} = 1; |
242
|
|
|
|
|
|
|
} else { |
243
|
0
|
|
|
|
|
0
|
return $class->_error("Unknown dependency '$part' in begin line: $begin"); |
244
|
|
|
|
|
|
|
} |
245
|
|
|
|
|
|
|
} |
246
|
|
|
|
|
|
|
|
247
|
19
|
|
|
|
|
69
|
$self; |
248
|
|
|
|
|
|
|
} |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
# Handle the creation of example sections |
251
|
|
|
|
|
|
|
sub _example { |
252
|
1
|
|
|
1
|
|
2
|
my $class = shift; |
253
|
1
|
|
|
|
|
2
|
my @lines = @{shift()}; |
|
1
|
|
|
|
|
4
|
|
254
|
1
|
|
|
|
|
2
|
my $context = shift; |
255
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
# Get the begin paragraph ( yes, paragraph. NOT line ) |
257
|
1
|
|
|
|
|
2
|
my $begin = ''; |
258
|
1
|
|
66
|
|
|
8
|
while ( @lines and $lines[0] !~ /^\s*$/ ) { |
259
|
1
|
50
|
|
|
|
3
|
$begin .= ' ' if $begin; |
260
|
1
|
|
|
|
|
5
|
$begin .= shift @lines; |
261
|
|
|
|
|
|
|
} |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
# Remove the trailing end tag |
264
|
1
|
50
|
33
|
|
|
8
|
if ( @lines and $lines[-1] =~ /^=for\s+example\s+end\b/o ) { |
265
|
1
|
|
|
|
|
3
|
pop @lines; |
266
|
|
|
|
|
|
|
} |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
# Remove any leading and trailing empty lines |
269
|
1
|
|
|
|
|
4
|
$class->_trim_empty_lines( \@lines ); |
270
|
1
|
50
|
|
|
|
3
|
$class->_check_nesting( \@lines, $begin ) or return undef; |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
# Create the basic object |
273
|
|
|
|
|
|
|
my $self = bless { |
274
|
|
|
|
|
|
|
begin => $begin, |
275
|
1
|
|
|
|
|
4
|
content => join( '', map { "$_\n" } @lines ), |
|
2
|
|
|
|
|
13
|
|
276
|
|
|
|
|
|
|
setup => '', # Is this a setup section |
277
|
|
|
|
|
|
|
example => 1, # Is this an example section |
278
|
|
|
|
|
|
|
context => $context, # Package context |
279
|
|
|
|
|
|
|
name => undef, # Examples arn't named |
280
|
|
|
|
|
|
|
tests => 1, # An example always consumes 1 test |
281
|
|
|
|
|
|
|
after => {}, # Other named methods this should be after |
282
|
|
|
|
|
|
|
classes => {}, # Other classes this should be after |
283
|
|
|
|
|
|
|
}, $class; |
284
|
|
|
|
|
|
|
|
285
|
1
|
|
|
|
|
5
|
$self; |
286
|
|
|
|
|
|
|
} |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
sub _error { |
289
|
1
|
|
|
1
|
|
13
|
$errstr = join ': ', @_; |
290
|
1
|
|
|
|
|
19
|
undef; |
291
|
|
|
|
|
|
|
} |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
sub _short { |
294
|
2
|
|
|
2
|
|
4
|
my $either = shift; |
295
|
2
|
|
|
|
|
4
|
my $string = shift; |
296
|
2
|
|
|
|
|
5
|
chomp $string; |
297
|
2
|
|
|
|
|
6
|
$string =~ s/\n/ /g; |
298
|
2
|
50
|
|
|
|
6
|
if ( length($string) > 30 ) { |
299
|
0
|
|
|
|
|
0
|
$string = substr($string, 27); |
300
|
0
|
|
|
|
|
0
|
$string =~ s/\s+$//; |
301
|
0
|
|
|
|
|
0
|
$string .= '...'; |
302
|
|
|
|
|
|
|
} |
303
|
2
|
|
|
|
|
4
|
$string; |
304
|
|
|
|
|
|
|
} |
305
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
sub _check_nesting { |
307
|
57
|
|
|
57
|
|
148
|
my ($class, $lines, $begin) = @_; |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
# In the remaining lines there shouldn't be any lines |
310
|
|
|
|
|
|
|
# that look like a POD tag. If there is there is probably |
311
|
|
|
|
|
|
|
# a nesting problem. |
312
|
57
|
|
|
62
|
|
300
|
my $bad_line = List::Util::first { /^=\w+/ } @$lines; |
|
62
|
|
|
|
|
148
|
|
313
|
57
|
100
|
|
|
|
191
|
if ( $bad_line ) { |
314
|
1
|
|
|
|
|
5
|
$bad_line = $class->_short($bad_line); |
315
|
1
|
|
|
|
|
4
|
$begin = $class->_short($begin); |
316
|
1
|
|
|
|
|
7
|
return $class->_error( |
317
|
|
|
|
|
|
|
"POD statement '$bad_line' illegally nested inside of section '$begin'" |
318
|
|
|
|
|
|
|
); |
319
|
|
|
|
|
|
|
} |
320
|
|
|
|
|
|
|
|
321
|
56
|
|
|
|
|
156
|
1; |
322
|
|
|
|
|
|
|
} |
323
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
sub _trim_empty_lines { |
325
|
57
|
|
|
57
|
|
92
|
my $lines = $_[1]; |
326
|
57
|
|
66
|
|
|
232
|
while ( @$lines and $lines->[0] eq '' ) { shift @$lines } |
|
57
|
|
|
|
|
198
|
|
327
|
57
|
|
66
|
|
|
217
|
while ( @$lines and $lines->[-1] eq '' ) { pop @$lines } |
|
57
|
|
|
|
|
203
|
|
328
|
57
|
|
|
|
|
94
|
1; |
329
|
|
|
|
|
|
|
} |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
##################################################################### |
336
|
|
|
|
|
|
|
# Main Methods |
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
#pod =pod |
339
|
|
|
|
|
|
|
#pod |
340
|
|
|
|
|
|
|
#pod =head2 parse |
341
|
|
|
|
|
|
|
#pod |
342
|
|
|
|
|
|
|
#pod my $SectionList = Test::Inline::Section( @elements ); |
343
|
|
|
|
|
|
|
#pod |
344
|
|
|
|
|
|
|
#pod Since version 1.50 L has been extracting package statements |
345
|
|
|
|
|
|
|
#pod so that as the sections are extracted, we can determine which sections |
346
|
|
|
|
|
|
|
#pod belong to which packages, and seperate them accordingly. |
347
|
|
|
|
|
|
|
#pod |
348
|
|
|
|
|
|
|
#pod The C method takes B of the elements from a file, and returns |
349
|
|
|
|
|
|
|
#pod all of the Sections. By doing it here, we can track the package context |
350
|
|
|
|
|
|
|
#pod and set it in the Sections. |
351
|
|
|
|
|
|
|
#pod |
352
|
|
|
|
|
|
|
#pod =cut |
353
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
sub parse { |
355
|
17
|
|
|
17
|
1
|
48
|
$errstr = ''; |
356
|
17
|
|
|
|
|
38
|
my $class = shift; |
357
|
17
|
50
|
|
|
|
85
|
my $elements = _ARRAY(shift) or return undef; |
358
|
17
|
|
|
|
|
43
|
my @Sections = (); |
359
|
|
|
|
|
|
|
|
360
|
|
|
|
|
|
|
# Iterate over the elements and maintain package contexts |
361
|
17
|
|
|
|
|
35
|
my $context = ''; |
362
|
17
|
|
|
|
|
48
|
foreach my $element ( @$elements ) { |
363
|
71
|
100
|
|
|
|
216
|
if ( $element =~ /^package\s+([\w:']+)/ ) { |
364
|
21
|
|
|
|
|
52
|
$context = $1; |
365
|
21
|
|
|
|
|
48
|
next; |
366
|
|
|
|
|
|
|
} |
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
# Handle weird unexpected elements |
369
|
50
|
50
|
|
|
|
153
|
unless ( $element =~ /^=/ ) { |
370
|
0
|
|
|
|
|
0
|
return $class->_error("Unexpected element '$element'"); |
371
|
|
|
|
|
|
|
} |
372
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
# Hand off to the Section constructor |
374
|
50
|
100
|
|
|
|
155
|
my $Section = Test::Inline::Section->new( $element, $context ) or return undef; |
375
|
49
|
|
|
|
|
144
|
push @Sections, $Section; |
376
|
|
|
|
|
|
|
} |
377
|
|
|
|
|
|
|
|
378
|
16
|
50
|
|
|
|
108
|
@Sections ? \@Sections : undef; |
379
|
|
|
|
|
|
|
} |
380
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
#pod =pod |
382
|
|
|
|
|
|
|
#pod |
383
|
|
|
|
|
|
|
#pod =head2 setup |
384
|
|
|
|
|
|
|
#pod |
385
|
|
|
|
|
|
|
#pod my $run_first = $Section->setup; |
386
|
|
|
|
|
|
|
#pod |
387
|
|
|
|
|
|
|
#pod The C accessor indicates that this section is a "setup" section, |
388
|
|
|
|
|
|
|
#pod to be run at the beginning of the generated test script. |
389
|
|
|
|
|
|
|
#pod |
390
|
|
|
|
|
|
|
#pod Returns true if this is a setup section, false otherwise. |
391
|
|
|
|
|
|
|
#pod |
392
|
|
|
|
|
|
|
#pod =cut |
393
|
|
|
|
|
|
|
|
394
|
173
|
|
|
173
|
1
|
2987
|
sub setup { $_[0]->{setup} } |
395
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
#pod =pod |
397
|
|
|
|
|
|
|
#pod |
398
|
|
|
|
|
|
|
#pod =head2 example |
399
|
|
|
|
|
|
|
#pod |
400
|
|
|
|
|
|
|
#pod my $just_compile = $Section->example; |
401
|
|
|
|
|
|
|
#pod |
402
|
|
|
|
|
|
|
#pod The C accessor indicates that this section is an "example" |
403
|
|
|
|
|
|
|
#pod section, to be compile-tested instead of run. |
404
|
|
|
|
|
|
|
#pod |
405
|
|
|
|
|
|
|
#pod Returns true if this is an example section, false otherwise. |
406
|
|
|
|
|
|
|
#pod |
407
|
|
|
|
|
|
|
#pod =cut |
408
|
|
|
|
|
|
|
|
409
|
44
|
|
|
44
|
1
|
139
|
sub example { $_[0]->{example} } |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
#pod =pod |
412
|
|
|
|
|
|
|
#pod |
413
|
|
|
|
|
|
|
#pod =head2 context |
414
|
|
|
|
|
|
|
#pod |
415
|
|
|
|
|
|
|
#pod The C method returns the package context of the unit test section, |
416
|
|
|
|
|
|
|
#pod or false if the unit test section appeared out of context. |
417
|
|
|
|
|
|
|
#pod |
418
|
|
|
|
|
|
|
#pod =cut |
419
|
|
|
|
|
|
|
|
420
|
54
|
|
|
54
|
1
|
180
|
sub context { $_[0]->{context} } |
421
|
|
|
|
|
|
|
|
422
|
|
|
|
|
|
|
#pod =pod |
423
|
|
|
|
|
|
|
#pod |
424
|
|
|
|
|
|
|
#pod =head2 name |
425
|
|
|
|
|
|
|
#pod |
426
|
|
|
|
|
|
|
#pod The C method returns the name of the test section, |
427
|
|
|
|
|
|
|
#pod or false if the test if anonymous. |
428
|
|
|
|
|
|
|
#pod |
429
|
|
|
|
|
|
|
#pod =cut |
430
|
|
|
|
|
|
|
|
431
|
485
|
100
|
|
485
|
1
|
1627
|
sub name { defined $_[0]->{name} and $_[0]->{name} } |
432
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
#pod =pod |
434
|
|
|
|
|
|
|
#pod |
435
|
|
|
|
|
|
|
#pod =head2 tests |
436
|
|
|
|
|
|
|
#pod |
437
|
|
|
|
|
|
|
#pod The C method returns the number of Test::Builder-compatible |
438
|
|
|
|
|
|
|
#pod tests that will run within the test section. Returns C if the |
439
|
|
|
|
|
|
|
#pod number of tests is unknown. |
440
|
|
|
|
|
|
|
#pod |
441
|
|
|
|
|
|
|
#pod =cut |
442
|
|
|
|
|
|
|
|
443
|
202
|
|
|
202
|
1
|
577
|
sub tests { $_[0]->{tests} } |
444
|
|
|
|
|
|
|
|
445
|
|
|
|
|
|
|
#pod =pod |
446
|
|
|
|
|
|
|
#pod |
447
|
|
|
|
|
|
|
#pod =head2 begin |
448
|
|
|
|
|
|
|
#pod |
449
|
|
|
|
|
|
|
#pod For use mainly in debugging, the C method returns the literal string |
450
|
|
|
|
|
|
|
#pod of the begin line/paragraph. |
451
|
|
|
|
|
|
|
#pod |
452
|
|
|
|
|
|
|
#pod =cut |
453
|
|
|
|
|
|
|
|
454
|
0
|
|
|
0
|
1
|
0
|
sub begin { $_[0]->{begin} } |
455
|
|
|
|
|
|
|
|
456
|
|
|
|
|
|
|
#pod =pod |
457
|
|
|
|
|
|
|
#pod |
458
|
|
|
|
|
|
|
#pod =head2 anonymous |
459
|
|
|
|
|
|
|
#pod |
460
|
|
|
|
|
|
|
#pod my $is_anonymous = $Section->anonymous; |
461
|
|
|
|
|
|
|
#pod |
462
|
|
|
|
|
|
|
#pod The C method returns true if the test section is an unnamed |
463
|
|
|
|
|
|
|
#pod anonymous section, or false if it is a named section or a setup section. |
464
|
|
|
|
|
|
|
#pod |
465
|
|
|
|
|
|
|
#pod =cut |
466
|
|
|
|
|
|
|
|
467
|
|
|
|
|
|
|
sub anonymous { |
468
|
29
|
|
|
29
|
1
|
45
|
my $self = shift; |
469
|
29
|
|
100
|
|
|
124
|
! (defined $self->{name} or $self->{setup}); |
470
|
|
|
|
|
|
|
} |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
#pod =pod |
473
|
|
|
|
|
|
|
#pod |
474
|
|
|
|
|
|
|
#pod =head2 after |
475
|
|
|
|
|
|
|
#pod |
476
|
|
|
|
|
|
|
#pod my @names = $Section->after; |
477
|
|
|
|
|
|
|
#pod |
478
|
|
|
|
|
|
|
#pod The C method returns the list of other named tests that this |
479
|
|
|
|
|
|
|
#pod test section says it should be run after. |
480
|
|
|
|
|
|
|
#pod |
481
|
|
|
|
|
|
|
#pod Returns a list of test name, or the null list C<()> if the test does |
482
|
|
|
|
|
|
|
#pod not have to run after any other named tests. |
483
|
|
|
|
|
|
|
#pod |
484
|
|
|
|
|
|
|
#pod =cut |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
sub after { |
487
|
130
|
|
|
130
|
1
|
1982
|
keys %{$_[0]->{after}}; |
|
130
|
|
|
|
|
522
|
|
488
|
|
|
|
|
|
|
} |
489
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
#pod =pod |
491
|
|
|
|
|
|
|
#pod |
492
|
|
|
|
|
|
|
#pod =head2 classes |
493
|
|
|
|
|
|
|
#pod |
494
|
|
|
|
|
|
|
#pod my @classes = $Section->classes; |
495
|
|
|
|
|
|
|
#pod |
496
|
|
|
|
|
|
|
#pod The C method returns the list of test classes that the test depends |
497
|
|
|
|
|
|
|
#pod on, and should be run before the tests. These values are used to determine the |
498
|
|
|
|
|
|
|
#pod set of class-level dependencies for the entire test file. |
499
|
|
|
|
|
|
|
#pod |
500
|
|
|
|
|
|
|
#pod Returns a list of class names, or the null list C<()> if the test does |
501
|
|
|
|
|
|
|
#pod not have any class-level dependencies. |
502
|
|
|
|
|
|
|
#pod |
503
|
|
|
|
|
|
|
#pod =cut |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
sub classes { |
506
|
47
|
|
|
47
|
1
|
443
|
keys %{$_[0]->{classes}}; |
|
47
|
|
|
|
|
124
|
|
507
|
|
|
|
|
|
|
} |
508
|
|
|
|
|
|
|
|
509
|
|
|
|
|
|
|
#pod =pod |
510
|
|
|
|
|
|
|
#pod |
511
|
|
|
|
|
|
|
#pod =head2 content |
512
|
|
|
|
|
|
|
#pod |
513
|
|
|
|
|
|
|
#pod my $code = $Section->content; |
514
|
|
|
|
|
|
|
#pod |
515
|
|
|
|
|
|
|
#pod The C method returns the actual testing code contents of the |
516
|
|
|
|
|
|
|
#pod section, with the leading C<=begin> and trailing C<=end> removed. |
517
|
|
|
|
|
|
|
#pod |
518
|
|
|
|
|
|
|
#pod Returns a string containing the code, or the null string C<""> if the |
519
|
|
|
|
|
|
|
#pod section was empty. |
520
|
|
|
|
|
|
|
#pod |
521
|
|
|
|
|
|
|
#pod =cut |
522
|
|
|
|
|
|
|
|
523
|
91
|
|
|
91
|
1
|
316
|
sub content { $_[0]->{content} } |
524
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
|
526
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
|
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
##################################################################### |
530
|
|
|
|
|
|
|
# Implementing the Algorithm::Dependency::Item interface |
531
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
# The ->depends method we have works the same as for |
533
|
|
|
|
|
|
|
# Algorithm::Dependency::Item already, so we just need to implement |
534
|
|
|
|
|
|
|
# it's ->id method, which is the same as our ->name method |
535
|
|
|
|
|
|
|
|
536
|
18
|
|
|
18
|
1
|
68
|
sub id { $_[0]->name } |
537
|
125
|
|
|
125
|
1
|
530
|
sub depends { $_[0]->after } |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
1; |
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
__END__ |