The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use Test::More tests => 24;

use strict;
use warnings;

use JavaScript;

my $rt = JavaScript::Runtime->new();
my $cx = $rt->create_context();
$cx->bind_function(ok => \&ok);

{
    my $arr = JavaScript::PerlArray->new();
    ok(defined $arr);
    isa_ok($arr, "JavaScript::PerlArray");
    ok($arr->get_ref);
    my $av = $arr->get_ref;
    is(ref $av, "ARRAY");
    is_deeply($arr->get_ref, []);
}

{
    my $arr = $cx->eval(q/
        var array = new PerlArray();
        ok(array instanceof PerlArray);
        array;
/);

    isa_ok($arr, "JavaScript::PerlArray");
    is_deeply($arr->get_ref, []);
}

{
    my $arr = JavaScript::PerlArray->new();

    push @{$arr->get_ref}, 10, 20, 30;

    $cx->eval(q/
        function check_perlarray(arr) {
            ok(arr instanceof PerlArray);
            ok(arr.length == 3);
            ok(arr[0] == 10);
            ok(arr[1] == 20);
            ok(arr[2] == 30);
            ok(arr[-1] == 30);
        }
/);

    $cx->call(check_perlarray => $arr);
}

{
    $cx->eval(q/
        var array = new PerlArray();
        
        array.push(10);
        ok(array.length == 1);
        ok(array[0] == 10);
        
        array.unshift(20, 30);
        ok(array.length == 3);
        ok(array[0] == 20 && array[1] == 30 && array[2] == 10);
        
        ok(array.shift() == 20);
        ok(array.length == 2);
        
        ok(array.pop() == 10);
        ok(array.length == 1);
    /)
}

{
    my $arr = JavaScript::PerlArray->new();
    $cx->eval(q/
        function populate_perlarray_via_index(array) {
            array[2] = 20;
        }
    /);
    is_deeply($arr->get_ref, []);
    $cx->call(populate_perlarray_via_index => $arr);
    is_deeply($arr->get_ref, [undef, undef, 20]);
}