use strict;
use warnings;

use Sereal::Decoder;
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");
}

