1#!/usr/bin/perl 2# 3# Check SPLICE function's return value 4# (04_splice.t checks its effect on the file) 5# 6 7use strict; 8use warnings; 9 10my $file = "tf11-$$.txt"; 11my $data = "rec0blahrec1blahrec2blah"; 12 13print "1..50\n"; 14 15my $N = 1; 16use Tie::File; 17print "ok $N\n"; $N++; # partial credit just for showing up 18 19init_file($data); 20 21my @a; 22my $o = tie @a, 'Tie::File', $file, autochomp => 0, recsep => 'blah'; 23print $o ? "ok $N\n" : "not ok $N\n"; 24$N++; 25 26my $n; 27 28# (3-12) splicing at the beginning 29my @r = splice(@a, 0, 0, "rec4"); 30check_result(); 31@r = splice(@a, 0, 1, "rec5"); # same length 32check_result("rec4"); 33@r = splice(@a, 0, 1, "record5"); # longer 34check_result("rec5"); 35 36@r = splice(@a, 0, 1, "r5"); # shorter 37check_result("record5"); 38@r = splice(@a, 0, 1); # removal 39check_result("r5"); 40@r = splice(@a, 0, 0); # no-op 41check_result(); 42@r = splice(@a, 0, 0, 'r7', 'rec8'); # insert more than one 43check_result(); 44@r = splice(@a, 0, 2, 'rec7', 'record8', 'rec9'); # insert more than delete 45check_result('r7', 'rec8'); 46 47@r = splice(@a, 0, 3, 'record9', 'rec10'); # delete more than insert 48check_result('rec7', 'record8', 'rec9'); 49@r = splice(@a, 0, 2); # delete more than one 50check_result('record9', 'rec10'); 51 52 53# (13-22) splicing in the middle 54@r = splice(@a, 1, 0, "rec4"); 55check_result(); 56@r = splice(@a, 1, 1, "rec5"); # same length 57check_result('rec4'); 58@r = splice(@a, 1, 1, "record5"); # longer 59check_result('rec5'); 60 61@r = splice(@a, 1, 1, "r5"); # shorter 62check_result("record5"); 63@r = splice(@a, 1, 1); # removal 64check_result("r5"); 65@r = splice(@a, 1, 0); # no-op 66check_result(); 67@r = splice(@a, 1, 0, 'r7', 'rec8'); # insert more than one 68check_result(); 69@r = splice(@a, 1, 2, 'rec7', 'record8', 'rec9'); # insert more than delete 70check_result('r7', 'rec8'); 71 72@r = splice(@a, 1, 3, 'record9', 'rec10'); # delete more than insert 73check_result('rec7', 'record8', 'rec9'); 74@r = splice(@a, 1, 2); # delete more than one 75check_result('record9','rec10'); 76 77# (23-32) splicing at the end 78@r = splice(@a, 3, 0, "rec4"); 79check_result(); 80@r = splice(@a, 3, 1, "rec5"); # same length 81check_result('rec4'); 82@r = splice(@a, 3, 1, "record5"); # longer 83check_result('rec5'); 84 85@r = splice(@a, 3, 1, "r5"); # shorter 86check_result('record5'); 87@r = splice(@a, 3, 1); # removal 88check_result('r5'); 89@r = splice(@a, 3, 0); # no-op 90check_result(); 91@r = splice(@a, 3, 0, 'r7', 'rec8'); # insert more than one 92check_result(); 93@r = splice(@a, 3, 2, 'rec7', 'record8', 'rec9'); # insert more than delete 94check_result('r7', 'rec8'); 95 96@r = splice(@a, 3, 3, 'record9', 'rec10'); # delete more than insert 97check_result('rec7', 'record8', 'rec9'); 98@r = splice(@a, 3, 2); # delete more than one 99check_result('record9', 'rec10'); 100 101# (33-42) splicing with negative subscript 102@r = splice(@a, -1, 0, "rec4"); 103check_result(); 104@r = splice(@a, -1, 1, "rec5"); # same length 105check_result('rec2'); 106@r = splice(@a, -1, 1, "record5"); # longer 107check_result("rec5"); 108 109@r = splice(@a, -1, 1, "r5"); # shorter 110check_result("record5"); 111@r = splice(@a, -1, 1); # removal 112check_result("r5"); 113@r = splice(@a, -1, 0); # no-op 114check_result(); 115@r = splice(@a, -1, 0, 'r7', 'rec8'); # insert more than one 116check_result(); 117@r = splice(@a, -1, 2, 'rec7', 'record8', 'rec9'); # insert more than delete 118check_result('rec4'); 119 120@r = splice(@a, -3, 3, 'record9', 'rec10'); # delete more than insert 121check_result('rec7', 'record8', 'rec9'); 122@r = splice(@a, -4, 3); # delete more than one 123check_result('r7', 'rec8', 'record9'); 124 125# (43) scrub it all out 126@r = splice(@a, 0, 3); 127check_result('rec0', 'rec1', 'rec10'); 128 129# (44) put some back in 130@r = splice(@a, 0, 0, "rec0", "rec1"); 131check_result(); 132 133# (45) what if we remove too many records? 134@r = splice(@a, 0, 17); 135check_result('rec0', 'rec1'); 136 137# (46-48) Now check the scalar context return 138splice(@a, 0, 0, qw(I like pie)); 139my $r; 140$r = splice(@a, 0, 0); 141print !defined($r) ? "ok $N\n" : "not ok $N \# return should have been undef\n"; 142$N++; 143 144$r = splice(@a, 2, 1); 145print $r eq "pieblah" ? "ok $N\n" : "not ok $N \# return should have been 'pie'\n"; 146$N++; 147 148$r = splice(@a, 0, 2); 149print $r eq "likeblah" ? "ok $N\n" : "not ok $N \# return should have been 'like'\n"; 150$N++; 151 152# (49-50) Test default arguments 153splice @a, 0, 0, (0..11); 154@r = splice @a, 4; 155check_result(4..11); 156@r = splice @a; 157check_result(0..3); 158 159sub init_file { 160 my $data = shift; 161 open F, '>', $file or die $!; 162 binmode F; 163 print F $data; 164 close F; 165} 166 167# actual results are in @r. 168# expected results are in @_ 169sub check_result { 170 my @x = @_; 171 s/blah$// for @r; 172 my $good = 1; 173 $good = 0 unless @r == @x; 174 for my $i (0 .. $#r) { 175 $good = 0 unless $r[$i] eq $x[$i]; 176 } 177 print $good ? "ok $N\n" : "not ok $N \# was (@r); should be (@x)\n"; 178 $N++; 179} 180 181END { 182 undef $o; 183 untie @a; 184 1 while unlink $file; 185} 186 187