File Coverage

blib/lib/Test/BDD/Cucumber/Harness/Data.pm
Criterion Covered Total %
statement 55 55 100.0
branch n/a
condition n/a
subroutine 16 16 100.0
pod 10 10 100.0
total 81 81 100.0


line stmt bran cond sub pod time code
1 10     10   111878 use v5.14;
  10         61  
2 10     10   77 use warnings;
  10         37  
  10         492  
3              
4             package Test::BDD::Cucumber::Harness::Data 0.85;
5              
6             =head1 NAME
7              
8             Test::BDD::Cucumber::Harness::Data - Builds up an internal data representation of test passes / failures
9              
10             =head1 VERSION
11              
12             version 0.85
13              
14             =head1 DESCRIPTION
15              
16             A L subclass which collates test data
17              
18             =cut
19              
20 10     10   633 use Moo;
  10         11868  
  10         65  
21 10     10   5456 use Types::Standard qw( HashRef ArrayRef );
  10         77102  
  10         117  
22 10     10   9886 use Test::More;
  10         32  
  10         132  
23 10     10   4446 use Test::BDD::Cucumber::Model::Result;
  10         36  
  10         8268  
24              
25             extends 'Test::BDD::Cucumber::Harness';
26              
27             =head1 ATTRIBUTES
28              
29             =head2 features
30              
31             An array-ref in which we store all the features executed, and completed. Until
32             C is called, it won't be in here.
33              
34             =cut
35              
36             has 'features' => ( is => 'rw', isa => ArrayRef, default => sub { [] } );
37              
38             =head2 current_feature
39              
40             =head2 current_scenario
41              
42             =head2 current_step
43              
44             The current feature/step/scenario for which we've had the starting method, but
45             not the C<_done> method.
46              
47             =cut
48              
49             has 'current_feature' =>
50             ( is => 'rw', isa => HashRef, default => sub { {} } );
51             has 'current_scenario' =>
52             ( is => 'rw', isa => HashRef, default => sub { {} } );
53             has 'current_step' => ( is => 'rw', isa => HashRef, default => sub { {} } );
54              
55             =head2 feature
56              
57             =head2 feature_done
58              
59             Feature hashref looks like:
60              
61             {
62             object => Test::BDD::Cucumber::Model::Feature object
63             scenarios => []
64             }
65              
66             =cut
67              
68             # We will keep track of where we are each time...
69             sub feature {
70 13     13 1 38 my ( $self, $feature ) = @_;
71 13         50 my $feature_ref = {
72             object => $feature,
73             scenarios => []
74             };
75 13         257 $self->current_feature($feature_ref);
76             }
77              
78             sub feature_done {
79 17     17 1 37 my $self = shift;
80 17         34 push( @{ $self->features }, $self->current_feature );
  17         340  
81 17         1117 $self->current_feature( {} );
82             }
83              
84             =head2 scenario
85              
86             =head2 scenario_done
87              
88             Scenario hashref looks like:
89              
90             {
91             object => Test::BDD::Cucumber::Model::Scenario object
92             dataset => Data hash the scenario was invoked with
93             steps => [],
94             }
95              
96             =cut
97              
98             sub scenario {
99 26     26 1 128 my ( $self, $scenario, $dataset ) = @_;
100 26         114 my $scenario_ref = {
101             object => $scenario,
102             dataset => $dataset,
103             steps => [],
104             };
105 26         550 $self->current_scenario($scenario_ref);
106             }
107              
108             sub scenario_done {
109 26     26 1 54 my $self = shift;
110 26         55 push( @{ $self->current_feature->{'scenarios'} }, $self->current_scenario );
  26         542  
111 26         1162 $self->current_scenario( {} );
112             }
113              
114             =head2 step
115              
116             =head2 step_done
117              
118             Step hashref looks like:
119              
120             {
121             context => Test::BDD::Cucumber::StepContext object
122             result => Test::BDD::Cucumber::Model::Result object (after step_done)
123             }
124              
125             =cut
126              
127             sub step {
128 60     60 1 139 my ( $self, $step_context ) = @_;
129 60         185 my $step_ref = { context => $step_context };
130 60         1169 $self->current_step($step_ref);
131             }
132              
133             sub step_done {
134 60     60 1 172 my ( $self, $context, $result, $highlights ) = @_;
135              
136 60         1459 $self->current_step->{'result'} = $result;
137 60         1368 $self->current_step->{'highlights'} = $highlights;
138 60         365 push( @{ $self->current_scenario->{'steps'} }, $self->current_step );
  60         993  
139 60         2243 $self->current_step( {} );
140             }
141              
142             =head2 feature_status
143              
144             =head2 scenario_status
145              
146             =head2 step_status
147              
148             Accepting one of the data-hashes above, returns a
149             L object representing it. If it's a Feature
150             or a Scenario, then it returns one representing all the child objects.
151              
152             =cut
153              
154             # Status methods
155             sub feature_status {
156 2     2 1 96 my ( $self, $feature ) = @_;
157             return Test::BDD::Cucumber::Model::Result->from_children(
158 2         7 map { $self->scenario_status($_) } @{ $feature->{'scenarios'} } );
  1         3  
  2         11  
159             }
160              
161             sub scenario_status {
162 16     16 1 3324 my ( $self, $scenario ) = @_;
163             return Test::BDD::Cucumber::Model::Result->from_children(
164 16         43 map { $self->step_status($_) } @{ $scenario->{'steps'} } );
  48         119  
  16         54  
165             }
166              
167             sub step_status {
168 55     55 1 1562 my ( $self, $step ) = @_;
169 55         217 return $step->{'result'};
170             }
171              
172             =head2 find_scenario_step_by_name
173              
174             Given a Scenario and a string, searches through the steps for it and returns
175             the data-hash where the Step Object's C<<->text>> matches the string.
176              
177             =cut
178              
179             # Find a step
180             sub find_scenario_step_by_name {
181 3     3 1 30 my ( $self, $scenario, $name ) = @_;
182             my ($step) =
183 3         9 grep { $_->{'context'}->text eq $name } @{ $scenario->{'steps'} };
  6         24  
  3         7  
184              
185 3         10 return $step;
186             }
187              
188             =head1 AUTHOR
189              
190             Peter Sergeant C
191              
192             =head1 LICENSE
193              
194             Copyright 2019-2023, Erik Huelsmann
195             Copyright 2011-2019, Peter Sergeant; Licensed under the same terms as Perl
196              
197             =cut
198              
199             1;