use strict;
use warnings;

use Test::More;
use File::Spec;
use lib File::Spec->catdir(qw(t lib));

BEGIN {
    lib->import('lib')
        if !-d 't';
}
use Sereal::TestSet qw(:all);

my @tests= (
    [ 15,  alias_smallint     => 1 ],
    [ 127, alias_varint_under => 128 ],
);

if ( have_encoder_and_decoder() ) {
    my $num_tests= 0;
    $num_tests += ( ( 16 + $_->[0] + 2 ) * 2 ) for @tests;
    plan tests => $num_tests;
}
else {
    plan skip_all => 'Did not find right version of encoder';
}
foreach my $test (@tests) {
    my ( $up_to, $opt, $opt_val )= @$test;

    #diag "$up_to: $opt $opt_val";

    my $enc= Sereal::Encoder->new;
    my $dec= Sereal::Decoder->new( { $opt => $opt_val } );

    my $struct= {
        array  => [ -16 .. $up_to ],
        array2 => [ reverse -16 .. $up_to ],
        map { $_ => $_ } -16 .. $up_to,
    };
    my $got= $dec->decode( $enc->encode($struct) );

    # undef the decoder to make sure if it blows up on DESTROY it does it before we test.
    undef $dec;
    undef $enc;

    # Make sure we get the expected aliases
    for ( -16 .. $up_to ) {
        ok(
            \$got->{array}[ $_ + 16 ] == \$got->{array2}[ -1 - ( $_ + 16 ) ],
            "$opt: array alias: $_"
        );
        ok( \$got->{$_} == \$got->{array}[ $_ + 16 ], "$opt: array alias: $_" );
    }

    # Make sure the aliases are readonly.
    my $eval_ok= eval { $got->{$up_to}= 123; };
    my $error= $eval_ok ? "" : ( "$@" || "Zombie error" );
    ok( !$eval_ok, "$opt: expect modification of \$got->{$up_to} to die" );
    like( $error, qr/read-only/, "$opt: expect an error about read-only values" );
}

