1 package TAP::Parser::Result;
4 use vars qw($VERSION @ISA);
13 my @attrs = qw( plan pragma test comment bailout version unknown yaml );
15 for my $token (@attrs) {
16 my $method = "is_$token";
17 *$method = sub { return $token eq shift->type };
21 ##############################################################################
25 TAP::Parser::Result - Base class for TAP::Parser output objects
37 # abstract class - not meany to be used directly
38 # see TAP::Parser::ResultFactory for preferred usage
41 use TAP::Parser::Result;
43 my $result = TAP::Parser::Result->new( $token );
47 This is a simple base class used by L<TAP::Parser> to store objects that
48 represent the current bit of test output data from TAP (usually a single
49 line). Unless you're subclassing, you probably won't need to use this module
56 # see TAP::Parser::ResultFactory for preferred usage
59 my $result = TAP::Parser::Result->new($token);
61 Returns an instance the appropriate class for the test token passed in.
65 # new() implementation provided by TAP::Object
68 my ( $self, $token ) = @_;
71 # make a shallow copy of the token:
72 $self->{$_} = $token->{$_} for ( keys %$token );
77 ##############################################################################
79 =head2 Boolean methods
81 The following methods all return a boolean value and are to be overridden in
82 the appropriate subclass.
88 Indicates whether or not this is the test plan line.
94 Indicates whether or not this is a pragma line.
100 Indicates whether or not this is a test line.
104 =item * C<is_comment>
106 Indicates whether or not this is a comment.
110 =item * C<is_bailout>
112 Indicates whether or not this is bailout line.
114 Bail out! We're out of dilithium crystals.
116 =item * C<is_version>
118 Indicates whether or not this is a TAP version line.
122 =item * C<is_unknown>
124 Indicates whether or not the current line could be parsed.
126 ... this line is junk ...
130 Indicates whether or not this is a YAML chunk.
136 ##############################################################################
142 Returns the original line of text which was parsed.
146 sub raw { shift->{raw} }
148 ##############################################################################
152 my $type = $result->type;
154 Returns the "type" of a token, such as C<comment> or C<test>.
158 sub type { shift->{type} }
160 ##############################################################################
164 print $result->as_string;
166 Prints a string representation of the token. This might not be the exact
167 output, however. Tests will have test numbers added if not present, TODO and
168 SKIP directives will be capitalized and, in general, things will be cleaned
169 up. If you need the original text for the token, see the C<raw> method.
173 sub as_string { shift->{raw} }
175 ##############################################################################
179 if ( $result->is_ok ) { ... }
181 Reports whether or not a given result has passed. Anything which is B<not> a
182 test result returns true. This is merely provided as a convenient shortcut.
188 ##############################################################################
192 Deprecated. Please use C<is_ok> instead.
197 warn 'passed() is deprecated. Please use "is_ok()"';
201 ##############################################################################
203 =head3 C<has_directive>
205 if ( $result->has_directive ) {
209 Indicates whether or not the given result has a TODO or SKIP directive.
215 return ( $self->has_todo || $self->has_skip );
218 ##############################################################################
222 if ( $result->has_todo ) {
226 Indicates whether or not the given result has a TODO directive.
230 sub has_todo { 'TODO' eq ( shift->{directive} || '' ) }
232 ##############################################################################
236 if ( $result->has_skip ) {
240 Indicates whether or not the given result has a SKIP directive.
244 sub has_skip { 'SKIP' eq ( shift->{directive} || '' ) }
246 =head3 C<set_directive>
248 Set the directive associated with this token. Used internally to fake
254 my ( $self, $dir ) = @_;
255 $self->{directive} = $dir;
262 Please see L<TAP::Parser/SUBCLASSING> for a subclassing overview.
264 Remember: if you want your subclass to be automatically used by the parser,
265 you'll have to register it with L<TAP::Parser::ResultFactory/register_type>.
267 If you're creating a completely new result I<type>, you'll probably need to
268 subclass L<TAP::Parser::Grammar> too, or else it'll never get used.
277 @ISA = 'TAP::Parser::Result';
279 # register with the factory:
280 TAP::Parser::ResultFactory->register_type( 'my_type' => __PACKAGE__ );
282 sub as_string { 'My results all look the same' }
288 L<TAP::Parser::ResultFactory>,
289 L<TAP::Parser::Result::Bailout>,
290 L<TAP::Parser::Result::Comment>,
291 L<TAP::Parser::Result::Plan>,
292 L<TAP::Parser::Result::Pragma>,
293 L<TAP::Parser::Result::Test>,
294 L<TAP::Parser::Result::Unknown>,
295 L<TAP::Parser::Result::Version>,
296 L<TAP::PARSER::RESULT::YAML>,