File Coverage

blib/lib/Test/Stream/Table/LineBreak.pm
Criterion Covered Total %
statement 50 53 94.3
branch 12 18 66.6
condition n/a
subroutine 9 9 100.0
pod 0 4 0.0
total 71 84 84.5


line stmt bran cond sub pod time code
1             package Test::Stream::Table::LineBreak;
2 102     102   1174 use strict;
  102         198  
  102         3707  
3 102     102   501 use warnings;
  102         195  
  102         2799  
4              
5 102     102   500 use Carp qw/croak/;
  102         192  
  102         5215  
6 102     102   569 use Scalar::Util qw/blessed/;
  102         194  
  102         8853  
7              
8             # Optional.
9             eval { require Unicode::GCString; 1 };
10              
11             use Test::Stream::HashBase(
12 102         1081 accessors => [qw/string gcstring lbreak _parts idx/],
13 102     102   541 );
  102         202  
14              
15             sub init {
16 1776     1776 0 2341 my $self = shift;
17              
18             croak "string is a required attribute"
19 1776 50       3757 unless defined $self->{+STRING};
20              
21 1776 50       5077 return unless $INC{'Unicode/GCString.pm'};
22 0         0 $self->{+GCSTRING} = Unicode::GCString->new($self->{+STRING});
23             }
24              
25             sub columns {
26 1592     1592 0 1869 my $self = shift;
27 1592 50       3095 return $self->{+GCSTRING}->columns if $self->{+GCSTRING};
28 1592         9019 return length($self->{+STRING});
29             }
30              
31             sub break {
32 1340     1340 0 1714 my $self = shift;
33 1340         1726 my ($len) = @_;
34              
35 1340         2066 $self->{+IDX} = 0;
36 1340         2191 my $str = $self->{+STRING} . ""; # Force stringification
37              
38 1340         3730 binmode(STDOUT, ':utf8');
39 1340         1420 my @parts;
40 1340         3431 my @chars = split //, $str;
41 1340         3044 while (@chars) {
42 1299         1539 my $size = 0;
43 1299         1662 my $part = '';
44 1299         2482 until ($size == $len) {
45 7300         9512 my $char = shift @chars;
46 7300 100       14569 $char = '' unless defined $char;
47 7300 50       12365 my $l = $INC{'Unicode/GCString.pm'} ? Unicode::GCString->new("$char")->columns : length($char);
48 7300 100       12606 last unless $l;
49 6692 50       12184 if ($size + $l > $len) {
50 0         0 unshift @chars => $char;
51 0         0 last;
52             }
53 6692         6684 $size += $l;
54 6692         13761 $part .= $char;
55             }
56 1299         2683 until ($size == $len) {
57 3989         4621 $part .= ' ';
58 3989         7422 $size += 1;
59             }
60 1299         3813 push @parts => $part;
61             }
62              
63 1340         4686 $self->{+_PARTS} = \@parts;
64             }
65              
66             sub next {
67 2374     2374 0 2821 my $self = shift;
68              
69             croak "String has not yet been broken"
70 2374 50       4802 unless $self->{+_PARTS};
71              
72 2374         3174 my $idx = $self->{+IDX}++;
73 2374         3007 my $parts = $self->{+_PARTS};
74              
75 2374 100       5851 return undef if $idx >= @$parts;
76 1299         3689 return $parts->[$idx];
77             }
78              
79             1;
80              
81             __END__