The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
# vim: set ft=perl :

use strict;
use Test::More tests => 16;
use Tie::Simple;

my @y = qw(A B C);
my $c = 3;
tie my @x, 'Tie::Simple', [ \@y, \$c ],
	FETCH     => sub { my ($a, $i) = @_; $$a[0][$i] },
	STORE     => sub { my ($a, $i, $v) = @_; $$a[0][$i] = $v },
	FETCHSIZE => sub { my $a = shift; scalar @{$$a[0]} },
	STORESIZE => sub { my ($a, $c) = @_; $#{$$a[0]} = $c - 1 },
	EXTEND    => sub { my ($a, $c) = @_; ${$$a[1]} = $c },
	EXISTS    => sub { my ($a, $i) = @_; exists $$a[0][$i] },
	DELETE    => sub { my ($a, $i) = @_; delete $$a[0][$i] },
	CLEAR     => sub { my $a = shift; @{$$a[0]} = () },
	PUSH      => sub { my $a = shift; push @{$$a[0]}, @_ },
	POP       => sub { my $a = shift; pop @{$$a[0]} },
	SHIFT     => sub { my $a = shift; shift @{$$a[0]} },
	UNSHIFT   => sub { my $a = shift; unshift @{$$a[0]}, @_ },
	SPLICE    => sub { my ($a, $o, $c, @l) = @_; splice @{$$a[0]}, $o, $c, @l };

is_deeply(\@x, [ qw(A B C) ], 'FETCH');
($x[0], $x[1], $x[2]) = qw(X Y Z);
is_deeply(\@y, [ qw(X Y Z) ], 'STORE');
is(@x, 3, 'FETCHSIZE');
$#x = 4;
is(scalar @y, 5, 'STORESIZE');
ok(exists $x[$_], "EXISTS $_") foreach (0 .. 2);
ok(!exists $x[3], "EXISTS 3");
delete $x[0];
ok(!defined $y[0], 'DELETE');
@x = ();
is($c, 0, 'EXTEND');
is(scalar @y, 0, 'CLEAR');
push @x, 'M', 'N', 'O', 'P';
is_deeply(\@y, [ qw(M N O P) ], 'PUSH');
pop @x;
is_deeply(\@y, [ qw(M N O) ], 'POP');
shift @x;
is_deeply(\@y, [ qw(N O) ], 'SHIFT');
unshift @x, qw(Q R S);
is_deeply(\@y, [ qw(Q R S N O) ], 'UNSHIFT');
splice @x, 2, 2, qw(F G H);
is_deeply(\@y, [ qw(Q R F G H O) ], 'SPLICE');