File Coverage

blib/lib/Test/Data/Array.pm
Criterion Covered Total %
statement 93 112 83.0
branch 26 38 68.4
condition 16 33 48.4
subroutine 16 19 84.2
pod 15 15 100.0
total 166 217 76.5


line stmt bran cond sub pod time code
1             package Test::Data::Array;
2 3     3   1851 use strict;
  3         16  
  3         108  
3              
4 3     3   18 use Exporter qw(import);
  3         6  
  3         225  
5             our $VERSION = '1.242';
6              
7             our @EXPORT = qw( array_any_ok array_none_ok array_once_ok array_multiple_ok
8             array_max_ok array_min_ok array_maxstr_ok array_minstr_ok array_sum_ok
9             array_length_ok array_empty_ok
10             array_sortedstr_ascending_ok array_sortedstr_descending_ok
11             array_sorted_ascending_ok array_sorted_descending_ok
12             );
13              
14 3     3   21 use List::Util qw(sum min max minstr maxstr);
  3         10  
  3         408  
15              
16 3     3   21 use Test::Builder;
  3         5  
  3         3714  
17             my $Test = Test::Builder->new();
18              
19             =encoding utf8
20              
21             =head1 NAME
22              
23             Test::Data::Array -- test functions for array variables
24              
25             =head1 SYNOPSIS
26              
27             use Test::Data qw(Array);
28              
29             =head1 DESCRIPTION
30              
31             =head2 Functions
32              
33             =over 4
34              
35             =item array_any_ok( ITEM, ARRAY [, NAME] )
36              
37             Ok if any element of ARRAY is ITEM.
38              
39             =cut
40              
41             sub array_any_ok($\@;$) {
42 2     2 1 2504 my $element = shift;
43 2         6 my $array = shift;
44 2   100     27 my $name = shift || 'Array contains item';
45              
46 2         8 foreach my $try ( @$array ) {
47 5 100       19 next unless $try eq $element;
48 1         10 $Test->ok( 1, $name );
49 1         751 return;
50             }
51              
52 1         6 $Test->ok( 0, $name );
53             }
54              
55             =item array_none_ok( ITEM, ARRAY [, NAME] )
56              
57             Ok if no element of ARRAY is ITEM.
58              
59             =cut
60              
61             sub array_none_ok($\@;$) {
62 1     1 1 1487 my $element = shift;
63 1         3 my $array = shift;
64 1   50     9 my $name = shift || 'Array does not contain item';
65              
66 1         5 foreach my $try ( @$array ) {
67 3 50       12 next unless $try eq $element;
68 0         0 $Test->ok( 0, $name );
69 0         0 return;
70             }
71              
72 1         6 $Test->ok( 1, $name );
73             }
74              
75             =item array_once_ok( ITEM, ARRAY [, NAME] )
76              
77             Ok if only one element of ARRAY is ITEM.
78              
79             =cut
80              
81             sub array_once_ok($\@;$) {
82 4     4 1 5302 my $element = shift;
83 4         13 my $array = shift;
84 4   50     17 my $name = shift || 'Array contains item only once';
85              
86 4         11 my %seen = ();
87              
88 4         10 my $ok = 0;
89 4         12 foreach my $item ( @$array ) { ++$seen{$item} }
  7         23  
90              
91 4 100 100     26 $ok = 1 if( defined $seen{$element} and $seen{$element} == 1 );
92              
93 4         18 $Test->ok( $ok, $name );
94             }
95              
96             =item array_multiple_ok( ITEM, ARRAY [, NAME] )
97              
98             Ok if more than one element of ARRAY is ITEM.
99              
100             =cut
101              
102             sub array_multiple_ok($\@;$) {
103 0     0 1 0 my $element = shift;
104 0         0 my $array = shift;
105 0   0     0 my $name = shift || 'Array contains item at least once';
106              
107 0         0 my %seen = ();
108 0         0 foreach my $item ( @$array )
109             {
110 0         0 $seen{$item}++;
111             }
112              
113 0 0       0 $seen{$element} > 1 ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
114             }
115              
116             =item array_max_ok( NUMBER, ARRAY [, NAME] )
117              
118             Ok if all elements of ARRAY are numerically less than
119             or equal to NUMBER.
120              
121             =cut
122              
123             sub array_max_ok($\@;$) {
124 1     1 1 326 my $item = shift;
125 1         3 my $array = shift;
126 1   50     8 my $name = shift || 'Array maximum is okay';
127              
128 1         9 my $actual = max( @$array );
129              
130 1 50       7 $actual <= $item ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
131             }
132              
133             =item array_min_ok( NUMBER, ARRAY [, NAME] )
134              
135             Ok if all elements of ARRAY are numerically greater than
136             or equal to NUMBER.
137              
138             =cut
139              
140             sub array_min_ok($\@;$) {
141 1     1 1 349 my $item = shift;
142 1         3 my $array = shift;
143 1   50     7 my $name = shift || 'Array minimum is okay';
144              
145 1         5 my $actual = min( @$array );
146              
147 1 50       7 $actual >= $item ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
148             }
149              
150             =item array_maxstr_ok( ITEM, ARRAY [, NAME] )
151              
152             Ok if all elements of ARRAY are asciibetically less than
153             or equal to MAX.
154              
155             =cut
156              
157             sub array_maxstr_ok($\@;$) {
158 0     0 1 0 my $item = shift;
159 0         0 my $array = shift;
160 0   0     0 my $name = shift || 'Array maximum string is okay';
161              
162 0         0 my $actual = maxstr( @$array );
163              
164 0 0       0 $actual ge $item ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
165             }
166              
167             =item array_minstr_ok( ITEM, ARRAY [, NAME] )
168              
169             Ok if all elements of ARRAY are asciibetically greater than
170             or equal to MAX.
171              
172             =cut
173              
174             sub array_minstr_ok($\@;$) {
175 0     0 1 0 my $item = shift;
176 0         0 my $array = shift;
177 0   0     0 my $name = shift || 'Array minimum string is okay';
178              
179 0         0 my $actual = minstr( @$array );
180              
181 0 0       0 $actual le $item ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
182             }
183              
184             =item array_sum_ok( SUM, ARRAY [, NAME] )
185              
186             Ok if the numerical sum of ARRAY is SUM.
187              
188             =cut
189              
190             sub array_sum_ok($\@;$) {
191 1     1 1 359 my $sum = shift;
192 1         4 my $array = shift;
193 1   50     11 my $name = shift || 'Array sum is correct';
194              
195 1         7 my $actual = sum( @$array );
196              
197 1 50       8 $sum == $actual ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
198             }
199              
200             =item array_empty_ok( ARRAY [, NAME] )
201              
202             Ok if the array contains no elements.
203              
204             =cut
205              
206             sub array_empty_ok(\@;$) {
207 1     1 1 320 my $array = shift;
208 1   50     8 my $name = shift || 'Array is empty';
209              
210 1 50       7 $#$array == -1 ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
211             }
212              
213              
214             =item array_length_ok( ARRAY, LENGTH [, NAME] )
215              
216             Ok if the array contains LENGTH number of elements.
217              
218             =cut
219              
220             sub array_length_ok(\@$;$) {
221 1     1 1 337 my $array = shift;
222 1         4 my $length = shift;
223 1   50     9 my $name = shift || 'Array length is correct';
224              
225 1 50       8 $#$array == $length - 1 ? $Test->ok( 1, $name ) : $Test->ok( 0, $name );
226             }
227              
228             =item array_sortedstr_ascending_ok( ARRAY, [, NAME] )
229              
230             Ok if each succeeding element is asciibetically greater than or equal
231             to the one before.
232              
233             =cut
234              
235             sub array_sortedstr_ascending_ok(\@;$) {
236 3     3 1 7110 my $array = shift;
237 3   50     21 my $name = shift || 'Array is in ascending order';
238              
239 3         9 my $last_seen = 0;
240              
241 3         13 ELEMENT: foreach my $index ( 1 .. $#$array ) {
242 12 100       43 if( $array->[ $index ] ge $array->[ $index - 1 ] ) {
243 10         20 $last_seen = $index;
244 10         23 next;
245             }
246 2         5 last;
247             }
248              
249 3 100       21 $last_seen == $#$array ?
250             $Test->ok( 1, $name )
251             :
252             $Test->ok( 0, $name );
253             }
254              
255             =item array_sortedstr_descending_ok( ARRAY, [, NAME] )
256              
257             Ok if each succeeding element is asciibetically less than or equal to
258             the one before.
259              
260             =cut
261              
262             sub array_sortedstr_descending_ok(\@;$) {
263 3     3 1 3815 my $array = shift;
264 3   50     21 my $name = shift || 'Array is in descending order';
265              
266 3         9 my $last_seen = 0;
267              
268 3         12 ELEMENT: foreach my $index ( 1 .. $#$array ) {
269 7 100       27 if( $array->[ $index ] le $array->[ $index - 1 ] )
270             {
271 5         11 $last_seen = $index;
272 5         12 next;
273             }
274 2         7 last;
275             }
276              
277 3 100       22 $last_seen == $#$array ?
278             $Test->ok( 1, $name )
279             :
280             $Test->ok( 0, $name );
281             }
282              
283             =item array_sorted_ascending_ok( ARRAY, [, NAME] )
284              
285             Ok if each succeeding element is numerically greater than or equal
286             to the one before.
287              
288             =cut
289              
290             sub array_sorted_ascending_ok(\@;$) {
291 3     3 1 7684 my $array = shift;
292 3   50     21 my $name = shift || 'Array is in ascending order';
293              
294 3         9 my $last_seen = 0;
295              
296 3         13 ELEMENT: foreach my $index ( 1 .. $#$array ) {
297 10 100       31 if( $array->[ $index ] >= $array->[ $index - 1 ] ) {
298 8         13 $last_seen = $index;
299 8         19 next;
300             }
301 2         42 last;
302             }
303              
304 3 100       22 $last_seen == $#$array ?
305             $Test->ok( 1, $name )
306             :
307             $Test->ok( 0, $name );
308             }
309              
310             =item array_sorted_descending_ok( ARRAY, [, NAME] )
311              
312             Ok if each succeeding element is numerically less than or equal to
313             the one before.
314              
315             =cut
316              
317             sub array_sorted_descending_ok(\@;$) {
318 3     3 1 3289 my $array = shift;
319 3   50     20 my $name = shift || 'Array is in descending order';
320              
321 3         8 my $last_seen = 0;
322              
323 3         12 ELEMENT: foreach my $index ( 1 .. $#$array ) {
324 6 100       22 if( $array->[ $index ] <= $array->[ $index - 1 ] ) {
325 4         9 $last_seen = $index;
326 4         9 next;
327             }
328 2         6 last;
329             }
330              
331 3 100       19 $last_seen == $#$array ?
332             $Test->ok( 1, $name )
333             :
334             $Test->ok( 0, $name );
335             }
336              
337             =back
338              
339             =head1 SEE ALSO
340              
341             L,
342             L,
343             L,
344             L,
345             L
346              
347             =head1 SOURCE AVAILABILITY
348              
349             This source is in Github:
350              
351             https://github.com/briandfoy/test-data
352              
353             =head1 AUTHOR
354              
355             brian d foy, C<< >>
356              
357             =head1 COPYRIGHT AND LICENSE
358              
359             Copyright © 2002-2018, brian d foy . All rights reserved.
360              
361             This program is free software; you can redistribute it and/or modify
362             it under the terms of the Artistic License 2.0.
363              
364             =cut
365              
366             "bumble bee";