1#!perl 2 3BEGIN { 4 if ($] <= 5.010) { 5 print "1..0 # skip this test requires perl 5.010 or greater\n"; 6 exit 0; 7 } 8} 9 10use strict; 11use warnings "FATAL" => "all"; 12use Text::Wrap; 13 14$Text::Wrap::columns = 72; 15 16require bytes; 17 18our $Errors = 0; 19 20$/ = q(); 21binmode(DATA, ":utf8") || die "can't binmode DATA to utf8: $!"; 22 23our @DATA = ( 24 [ # paragraph 0 25 sub { die "there is no paragraph 0" } 26 ], 27 { # paragraph 1 28 OLD => { BYTES => 44, CHARS => 44, CHUNKS => 44, WORDS => 7, TABS => 3, LINES => 4 }, 29 NEW => { BYTES => 44, CHARS => 44, CHUNKS => 44, WORDS => 7, TABS => 3, LINES => 4 }, 30 }, 31 { # paragraph 2 32 OLD => { BYTES => 1766, CHARS => 1635, CHUNKS => 1507, WORDS => 275, TABS => 0, LINES => 2 }, 33 NEW => { BYTES => 1766, CHARS => 1635, CHUNKS => 1507, WORDS => 275, TABS => 0, LINES => 24 }, 34 }, 35 { # paragraph 3 36 OLD => { BYTES => 157, CHARS => 148, CHUNKS => 139, WORDS => 27, TABS => 0, LINES => 2 }, 37 NEW => { BYTES => 157, CHARS => 148, CHUNKS => 139, WORDS => 27, TABS => 0, LINES => 3 }, 38 }, 39 { # paragraph 4 40 OLD => { BYTES => 30, CHARS => 25, CHUNKS => 24, WORDS => 3, TABS => 4, LINES => 1 }, 41 NEW => { BYTES => 30, CHARS => 25, CHUNKS => 24, WORDS => 3, TABS => 4, LINES => 1 }, 42 }, 43); 44 45$| = 1; 46my $numtests = @DATA; 47print "1..$numtests\n"; 48 49$Errors += table_ok(); 50check_data(); 51 52if ($Errors) { 53 die "Error count: $Errors"; 54} else { 55 exit(0); 56} 57 58 59# first some sanity checks 60sub table_ok { 61 my $bad = 0; 62 for my $i ( 1 .. $#DATA ) { 63 for my $item (qw[ bytes chars chunks words tabs ]) { 64 if ( $DATA[$i]{NEW}{uc $item} != $DATA[$i]{OLD}{uc $item} ) { 65 warn "\u$item count shouldn't change upon wrapping at table paragraph $i"; 66 $bad++; 67 } 68 } 69 } 70 print $bad ? "not " : "", "ok 1\n"; 71 return $bad; 72} 73 74sub check($$$$) { 75 die "expected 4 arguments" unless @_ == 4; 76 my ($found, $index, $version, $item) = @_; 77 my $expected = $DATA[$index]{$version}{$item}; 78 return 1 if $found == $expected; 79 warn sprintf("%s paragraph %d expected %d %s, found %d instead", 80 ucfirst(lc($version)), 81 $index, $expected, 82 lc($item), 83 $found); 84 return 0; 85} 86 87sub check_data { 88 89 binmode(DATA, ":utf8") || die "can't binmode DATA to utf8: $!"; 90 local($_); 91 while ( <DATA> ) { 92 93 my $bad = 0; 94 95 if ($. > $#DATA) { 96 die "too many paragraphs of data"; 97 } 98 99 $DATA[$.]{OLD}{DATA} = $_; 100 101 my($char_count, $byte_count, $chunk_count, $word_count, $tab_count, $line_count); 102 103 $byte_count = bytes::length($_); 104 $char_count = length(); 105 $chunk_count = () = /\X/g; 106 $word_count = () = /(?:(?=\pL)\X)+/g; 107 $tab_count = y/\t//; 108 $line_count = y/\n//; 109 110 $bad++ unless check($byte_count, $., "OLD", "BYTES"); 111 $bad++ unless check($char_count, $., "OLD", "CHARS"); 112 $bad++ unless check($chunk_count, $., "OLD", "CHUNKS"); 113 $bad++ unless check($word_count, $., "OLD", "WORDS"); 114 $bad++ unless check($tab_count, $., "OLD", "TABS"); 115 $bad++ unless check($line_count, $., "OLD", "LINES"); 116 117 my $nl = "\n" x chomp; 118 119 $_ = wrap("", "", $_) . $nl; 120 121 $byte_count = bytes::length($_); 122 $char_count = length(); 123 $chunk_count = () = /\X/g; 124 $word_count = () = /(?:(?=\pL)\X)+/g; 125 $tab_count = y/\t//; 126 $line_count = y/\n//; 127 128 $bad++ unless check($byte_count, $., "NEW", "BYTES"); 129 $bad++ unless check($char_count, $., "NEW", "CHARS"); 130 $bad++ unless check($chunk_count, $., "NEW", "CHUNKS"); 131 $bad++ unless check($word_count, $., "NEW", "WORDS"); 132 $bad++ unless check($tab_count, $., "NEW", "TABS"); 133 $bad++ unless check($line_count, $., "NEW", "LINES"); 134 135 my $num = $. + 1; 136 print $bad ? "not " : "", "ok $num\n"; 137 $Errors += $bad; 138 139 } 140 141} 142 143__DATA__ 144 Los dos reyes 145 y 146 Los dos laberintos 147 148Cuentan los hombres dignos de fe (pero A̳l̳á̳ sabe más) que en los primeros días hubo un rey de l̲a̲s̲ i̲s̲l̲a̲s̲ d̲e̲ B̲a̲b̲i̲l̲o̲n̲i̲a̲ que congregó a sus arquitectos y magos y les mandó construir un laberinto tan perplejo y sutil que los varones más prudentes no se aventuraban a entrar, y los que entraban se perdían. Esa obra era un escándalo, porque la confusión y la maravilla son operaciones propias de D̳i̳o̳s̳ y no de los hombres. Con el andar del tiempo vino a su corte un rey de los árabes, y el rey de B̲a̲b̲i̲l̲o̲n̲i̲a̲ (para hacer burla de la simplicidad de su huésped) lo hizo penetrar en el laberinto, donde vagó afrentado y confundido hasta la declinación de la tarde. Entonces imploró socorro divino y dio con la puerta. Sus labios no profirieron queja ninguna, pero le dijo al rey de B̲a̲b̲i̲l̲o̲n̲i̲a̲ que él en A̲r̲a̲b̲i̲a̲ tenía otro laberinto y que, si D̳i̳o̳s̳ era servido, se lo daría a conocer algún día. Luego regresó a A̲r̲a̲b̲i̲a̲, juntó sus capitanes y sus alcaides y estragó l̲o̲s̲ r̲e̲i̲n̲o̲s̲ d̲e̲ B̲a̲b̲i̲l̲o̲n̲i̲a̲ con tan venturosa fortuna que derribó sus castillos, rompió sus gentes e hizo cautivo al mismo rey. Lo amarró encima de un camello veloz y lo llevó al desierto. Cabalgaron tres días, y le dijo: «¡Oh, rey del tiempo y substancia y cifra del siglo!, en B̲a̲b̲i̲l̲o̲n̲i̲a̲ me quisiste perder en un laberinto de bronce con muchas escaleras, puertas y muros; ahora e̳l̳ P̳o̳d̳e̳r̳o̳s̳o̳ ha tenido a bien que te muestre el mío, donde no hay escaleras que subir, ni puertas que forzar, ni fatigosas galerías que recorrer, ni muros que te veden el paso.» 149 150Luego le desató las ligaduras y lo abandonó en mitad del desierto, donde murió de hambre y de sed. La gloria sea con A̳q̳u̳é̳l̳ que no muere. 151 152 ——Jorge Luís Borges 153