File Coverage

blib/lib/Data/Random/NL.pm
Criterion Covered Total %
statement 67 69 97.1
branch 13 18 72.2
condition 2 3 66.6
subroutine 9 9 100.0
pod 3 3 100.0
total 94 102 92.1


line stmt bran cond sub pod time code
1             package Data::Random::NL;
2 1     1   58616 use warnings;
  1         10  
  1         25  
3 1     1   5 use strict;
  1         2  
  1         28  
4              
5             # ABSTRACT: Tools for generating random Dutch numbers
6             our $VERSION = '1.4';
7              
8 1     1   4 use Exporter qw(import);
  1         2  
  1         33  
9 1     1   5 use Carp qw(croak);
  1         2  
  1         624  
10              
11             our @EXPORT_OK = (
12             qw(
13             generate_bsn
14             generate_rsin
15             generate_kvk
16             ),
17             );
18              
19             our %EXPORT_TAGS = (
20             all => \@EXPORT_OK,
21             );
22              
23             sub generate_bsn {
24 2     2 1 1298 my $begin = shift;
25 2         4 my @bsn;
26              
27 2         3 eval { _starts_with(\@bsn, $begin) };
  2         6  
28 2 50       6 croak "$@" if $@;
29              
30 2         5 while(@bsn < 9) {
31 17         56 push(@bsn, int(rand(10)));
32             }
33              
34             # A BSN cannot start with a 00
35 2   66     10 while ($bsn[0] == 0 && $bsn[1] == 0) {
36 0         0 $bsn[1] = int(rand(10));
37             }
38              
39 2         4 @bsn = reverse(@bsn);
40              
41 2         3 my $sum = 0;
42 2         5 foreach my $i (reverse(1..8)) {
43 16         21 $sum += (($i + 1) * $bsn[$i]);
44             }
45              
46 2         6 my $last_number = $sum % 11;
47             # if the last number is 10, we have an invalid number
48 2 50       3 return generate_bsn($begin) if $last_number > 9;
49              
50 2         2 @bsn = reverse(@bsn);
51              
52 2         3 $bsn[-1] = $last_number;
53 2         12 return join("", @bsn);
54             }
55              
56             sub generate_kvk {
57 4     4 1 1326 my $begin = shift;
58 4         6 my @kvk;
59              
60 4         8 push(@kvk, 0); # first number is always a 0
61              
62 4         7 eval { _starts_with(\@kvk, $begin) };
  4         10  
63 4 50       9 croak "$@" if $@;
64              
65 4         11 while(@kvk < 9) {
66 30         62 push(@kvk, int(rand(10)));
67             }
68              
69 4         10 @kvk = _get_last_number(@kvk);
70 4 100       10 if (@kvk) {
71 2         4 shift @kvk;
72 2         12 return join("", @kvk);
73             }
74 2         5 return generate_kvk($begin);
75             }
76              
77             sub generate_rsin {
78 2     2 1 1270 my $begin = shift;
79 2         3 my @rsin;
80              
81 2         4 eval { _starts_with(\@rsin, $begin) };
  2         4  
82 2 50       6 croak "$@" if $@;
83              
84 2         4 while(@rsin < 9) {
85 17         29 push(@rsin, int(rand(10)));
86             }
87              
88 2         5 @rsin = _get_last_number(@rsin);
89 2 50       12 return join("", @rsin) if @rsin;
90 0         0 return generate_rsin($begin);
91             }
92              
93             sub _get_last_number {
94 6     6   13 my @set = @_;
95              
96 6         9 @set = reverse(@set);
97              
98 6         8 my $sum = 0;
99 6         10 foreach my $i (reverse(1..8)) {
100 48         71 $sum += (($i + 1) * $set[$i]);
101             }
102              
103 6         8 my $left = $sum % 11;
104 6         9 my $last_number = abs($left - 11);
105              
106             # if the last number is 10, we have an invalid number
107 6 100       14 return if $last_number > 9;
108              
109 4         5 $set[0] = $last_number;
110 4         10 return reverse(@set);
111             }
112              
113             sub _starts_with {
114 11     11   2452 my ($ref, $begin) = @_;
115              
116 11 100       30 if (defined $begin) {
117 7 100       33 if ($begin !~ /^[0-9]$/) {
118 2         15 die("You did not provide a number", $/);
119             }
120 5         18 push(@$ref, $begin);
121 5         13 return 1;
122             }
123             }
124              
125             1;
126              
127             __END__