]> git.vpit.fr Git - perl/modules/Scalar-Vec-Util.git/blobdiff - t/40-vshift.t
Introduce vshift()
[perl/modules/Scalar-Vec-Util.git] / t / 40-vshift.t
diff --git a/t/40-vshift.t b/t/40-vshift.t
new file mode 100644 (file)
index 0000000..39e14d5
--- /dev/null
@@ -0,0 +1,69 @@
+#!perl -T
+
+use strict;
+use warnings;
+
+use Test::More 'no_plan';
+
+use Scalar::Vec::Util qw/vshift SVU_SIZE/;
+
+my $p = SVU_SIZE;
+$p = 8 if $p < 8;
+my $n = 3 * $p;
+my $q = 2;
+
+*myfill = *Scalar::Vec::Util::vfill_pp;
+*myeq   = *Scalar::Vec::Util::veq_pp;
+
+sub rst { myfill($_[0], 0, $n, 0); $_[0] = '' }
+
+sub pat {
+ (undef, my $a, my $b, my $x) = @_;
+ $_[0] = '';
+ $x = $x ? 1 : 0;
+ if (defined $b) {
+  myfill($_[0], 0, $a, $x);
+  myfill($_[0], $a, $b, 1 - $x);
+ }
+}
+
+my ($v, $v0, $c) = ('', '') x 2;
+
+sub try {
+ my ($left, $insert) = @_;
+ my @s = ($p - $q) .. ($p + $q);
+ for my $s (@s) {
+  for my $l (0 .. $n - 1) {
+   last if $s + $l > $n;
+   pat $v0, $s, $l, 0;
+   my @b = (0);
+   my $l2 = int($l/2);
+   push @b, $l2 if $l2 != $l;
+   push @b, $l  if $l;
+   for my $b (@b) {
+    $v = $v0;
+    $c = '';
+    myfill($c, 0, $s, 0);
+    if ($left) {
+     myfill($c, $s,      $b,      defined $insert ? $insert : 1);
+     myfill($c, $s + $b, $l - $b, 1);
+    } else {
+     myfill($c, $s,           $l - $b, 1);
+     myfill($c, $s + $l - $b, $b,      defined $insert ? $insert : 1);
+    }
+    $b = -$b unless $left;
+    vshift $v, $s, $l => $b, $insert;
+    my $i = defined $insert ? $insert : 'undef';
+    ok(myeq($v, 0, $c, 0, $n), "vshift $s, $l, $b, $i");
+    is(length $v, length $c, "vshift $s, $l, $b, $i length");
+   }
+  }
+ }
+}
+
+try 1;
+try 1, 0;
+try 1, 1;
+try 0;
+try 0, 0;
+try 0, 1;