1N/A#!/usr/bin/perl
1N/A#
1N/A# Check SPLICE function's return value
1N/A# (04_splice.t checks its effect on the file)
1N/A#
1N/A
1N/A
1N/Amy $file = "tf$$.txt";
1N/A$: = Tie::File::_default_recsep();
1N/Amy $data = "rec0$:rec1$:rec2$:";
1N/A
1N/Aprint "1..56\n";
1N/A
1N/Amy $N = 1;
1N/Ause Tie::File;
1N/Aprint "ok $N\n"; $N++; # partial credit just for showing up
1N/A
1N/Ainit_file($data);
1N/A
1N/Amy $o = tie @a, 'Tie::File', $file, autochomp => 0;
1N/Aprint $o ? "ok $N\n" : "not ok $N\n";
1N/A$N++;
1N/A
1N/Amy $n;
1N/A
1N/A# (3-12) splicing at the beginning
1N/A@r = splice(@a, 0, 0, "rec4");
1N/Acheck_result();
1N/A@r = splice(@a, 0, 1, "rec5"); # same length
1N/Acheck_result("rec4");
1N/A@r = splice(@a, 0, 1, "record5"); # longer
1N/Acheck_result("rec5");
1N/A
1N/A@r = splice(@a, 0, 1, "r5"); # shorter
1N/Acheck_result("record5");
1N/A@r = splice(@a, 0, 1); # removal
1N/Acheck_result("r5");
1N/A@r = splice(@a, 0, 0); # no-op
1N/Acheck_result();
1N/A@r = splice(@a, 0, 0, 'r7', 'rec8'); # insert more than one
1N/Acheck_result();
1N/A@r = splice(@a, 0, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
1N/Acheck_result('r7', 'rec8');
1N/A
1N/A@r = splice(@a, 0, 3, 'record9', 'rec10'); # delete more than insert
1N/Acheck_result('rec7', 'record8', 'rec9');
1N/A@r = splice(@a, 0, 2); # delete more than one
1N/Acheck_result('record9', 'rec10');
1N/A
1N/A
1N/A# (13-22) splicing in the middle
1N/A@r = splice(@a, 1, 0, "rec4");
1N/Acheck_result();
1N/A@r = splice(@a, 1, 1, "rec5"); # same length
1N/Acheck_result('rec4');
1N/A@r = splice(@a, 1, 1, "record5"); # longer
1N/Acheck_result('rec5');
1N/A
1N/A@r = splice(@a, 1, 1, "r5"); # shorter
1N/Acheck_result("record5");
1N/A@r = splice(@a, 1, 1); # removal
1N/Acheck_result("r5");
1N/A@r = splice(@a, 1, 0); # no-op
1N/Acheck_result();
1N/A@r = splice(@a, 1, 0, 'r7', 'rec8'); # insert more than one
1N/Acheck_result();
1N/A@r = splice(@a, 1, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
1N/Acheck_result('r7', 'rec8');
1N/A
1N/A@r = splice(@a, 1, 3, 'record9', 'rec10'); # delete more than insert
1N/Acheck_result('rec7', 'record8', 'rec9');
1N/A@r = splice(@a, 1, 2); # delete more than one
1N/Acheck_result('record9','rec10');
1N/A
1N/A# (23-32) splicing at the end
1N/A@r = splice(@a, 3, 0, "rec4");
1N/Acheck_result();
1N/A@r = splice(@a, 3, 1, "rec5"); # same length
1N/Acheck_result('rec4');
1N/A@r = splice(@a, 3, 1, "record5"); # longer
1N/Acheck_result('rec5');
1N/A
1N/A@r = splice(@a, 3, 1, "r5"); # shorter
1N/Acheck_result('record5');
1N/A@r = splice(@a, 3, 1); # removal
1N/Acheck_result('r5');
1N/A@r = splice(@a, 3, 0); # no-op
1N/Acheck_result();
1N/A@r = splice(@a, 3, 0, 'r7', 'rec8'); # insert more than one
1N/Acheck_result();
1N/A@r = splice(@a, 3, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
1N/Acheck_result('r7', 'rec8');
1N/A
1N/A@r = splice(@a, 3, 3, 'record9', 'rec10'); # delete more than insert
1N/Acheck_result('rec7', 'record8', 'rec9');
1N/A@r = splice(@a, 3, 2); # delete more than one
1N/Acheck_result('record9', 'rec10');
1N/A
1N/A# (33-42) splicing with negative subscript
1N/A@r = splice(@a, -1, 0, "rec4");
1N/Acheck_result();
1N/A@r = splice(@a, -1, 1, "rec5"); # same length
1N/Acheck_result('rec2');
1N/A@r = splice(@a, -1, 1, "record5"); # longer
1N/Acheck_result("rec5");
1N/A
1N/A@r = splice(@a, -1, 1, "r5"); # shorter
1N/Acheck_result("record5");
1N/A@r = splice(@a, -1, 1); # removal
1N/Acheck_result("r5");
1N/A@r = splice(@a, -1, 0); # no-op
1N/Acheck_result();
1N/A@r = splice(@a, -1, 0, 'r7', 'rec8'); # insert more than one
1N/Acheck_result();
1N/A@r = splice(@a, -1, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
1N/Acheck_result('rec4');
1N/A
1N/A@r = splice(@a, -3, 3, 'record9', 'rec10'); # delete more than insert
1N/Acheck_result('rec7', 'record8', 'rec9');
1N/A@r = splice(@a, -4, 3); # delete more than one
1N/Acheck_result('r7', 'rec8', 'record9');
1N/A
1N/A# (43) scrub it all out
1N/A@r = splice(@a, 0, 3);
1N/Acheck_result('rec0', 'rec1', 'rec10');
1N/A
1N/A# (44) put some back in
1N/A@r = splice(@a, 0, 0, "rec0", "rec1");
1N/Acheck_result();
1N/A
1N/A# (45) what if we remove too many records?
1N/A@r = splice(@a, 0, 17);
1N/Acheck_result('rec0', 'rec1');
1N/A
1N/A# (46-48) Now check the scalar context return
1N/Asplice(@a, 0, 0, qw(I like pie));
1N/Amy $r;
1N/A$r = splice(@a, 0, 0);
1N/Aprint !defined($r) ? "ok $N\n" : "not ok $N \# return should have been undef, was <$r>\n";
1N/A$N++;
1N/A
1N/A$r = splice(@a, 2, 1);
1N/Aprint $r eq "pie$:" ? "ok $N\n" : "not ok $N \# return should have been 'pie\\n', was <$r>\n";
1N/A$N++;
1N/A
1N/A$r = splice(@a, 0, 2);
1N/Aprint $r eq "like$:" ? "ok $N\n" : "not ok $N \# return should have been 'like\\n', was <$r>\n";
1N/A$N++;
1N/A
1N/A# (49-50) Test default arguments
1N/Asplice @a, 0, 0, (0..11);
1N/A@r = splice @a, 4;
1N/Acheck_result(4..11);
1N/A@r = splice @a;
1N/Acheck_result(0..3);
1N/A
1N/A# (51-56) splice with negative length was treated wrong
1N/A# 20020402 Reported by Juerd Waalboer
1N/A@a = (0..8) ;
1N/A@r = splice @a, 0, -3;
1N/Acheck_result(0..5);
1N/A@a = (0..8) ;
1N/A@r = splice @a, 1, -3;
1N/Acheck_result(1..5);
1N/A@a = (0..8) ;
1N/A@r = splice @a, 7, -3;
1N/Acheck_result();
1N/A@a = (0..2) ;
1N/A@r = splice @a, 0, -3;
1N/Acheck_result();
1N/A@a = (0..2) ;
1N/A@r = splice @a, 1, -3;
1N/Acheck_result();
1N/A@a = (0..2) ;
1N/A@r = splice @a, 7, -3;
1N/Acheck_result();
1N/A
1N/Asub init_file {
1N/A my $data = shift;
1N/A open F, "> $file" or die $!;
1N/A binmode F;
1N/A print F $data;
1N/A close F;
1N/A}
1N/A
1N/A# actual results are in @r.
1N/A# expected results are in @_
1N/Asub check_result {
1N/A my @x = @_;
1N/A s/$:$// for @r;
1N/A my $good = 1;
1N/A $good = 0 unless @r == @x;
1N/A for my $i (0 .. $#r) {
1N/A $good = 0 unless $r[$i] eq $x[$i];
1N/A }
1N/A print $good ? "ok $N\n" : "not ok $N \# was (@r); should be (@x)\n";
1N/A $N++;
1N/A}
1N/A
1N/AEND {
1N/A undef $o;
1N/A untie @a;
1N/A 1 while unlink $file;
1N/A}
1N/A