+#!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;