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

use v6;
use Test;

plan 12;

{
    # Compare with Perl 5:
    #   $ perl -we '
    #     my @array = qw<a b c>;
    #     my $foo = $array[100];
    #     print exists $array[30] ? "exists" : "does not exist"
    #   '
    #   does not exist
    my @array = <a b c d>;
    is +@array, 4, "basic sanity";
    my $foo = @array[20];
    # We've only *accessed* @array[20], but we haven't assigned anything to it, so
    # @array shouldn't change. But currently, @array *is* automatically extended,
    # i.e. @array is ("a", "b", "c", "d", undef, undef, ...). This is wrong.
    is +@array, 4,
      "accessing a not existing array element should not automatically extend the array";
}

{
    my @array = <a b c d>;
    @array[20] = 42;
    # Now, we did assign @array[20], so @array should get automatically extended.
    # @array should be ("a", "b", "c", "d", undef, undef, ..., 42).
    is +@array, 21,
      "creating an array element should automatically extend the array (1)";
    # And, of course, @array.exists(20) has to be true -- we've just assigned
    # @array[20].
    ok @array.exists(20),
      "creating an array element should automatically extend the array (2)";
}

{
    my @array   = <a b c d>;
    my $defined = defined @array[100];

    ok !$defined,
        'defined @array[$index_out_of_bounds] should be false';
    is +@array, 4,
        'defined @array[$index_out_of_bounds] should not have altered @array';
}

{
    my @array   = <a b c d>;
    my $defined = defined @array[-5];

    ok !$defined,
        'defined @array[$negative_index_out_of_bounds] should be false';
    is +@array, 4,
        'defined @array[$negative_index_out_of_bounds] should not have altered @array';
}

{
    my @array  = <a b c d>;
    my $exists = @array.exists(100);

    ok !$exists,
        '@array.exists($index_out_of_bounds) should be false';
    is +@array, 4,
        '@array.exists($index_out_of_bounds) should not have altered @array';
}

{
    my @array  = <a b c d>;
    my $exists = @array.exists(-5);

    ok !$exists,
        '@array.exists($negative_index_out_of_bounds) should be false';
    is +@array, 4,
        '@array.exists($negative_index_out_of_bounds) should not have altered @array';
}