The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 12;
BEGIN { use_ok('File::PackageIndexer') };
use Data::Dumper;

my $indexer = File::PackageIndexer->new();
isa_ok($indexer, 'File::PackageIndexer');

my @tests = (
  {
    name => 'simple assign',
    code => <<'HERE',
package Foo;
our @ISA;
@ISA = ("Bar", "Baz");
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Baz'], },
    },
  },
  {
    name => 'simple assign twice',
    code => <<'HERE',
package Foo;
our @ISA;
@ISA = ("Bar", "Baz");
@ISA = ("Bur", "Buz");
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bur', 'Buz'], },
    },
  },
  {
    name => 'simple assign BEGIN',
    code => <<'HERE',
package Foo;
our @ISA;
BEGIN {@ISA = ("Bar", "Baz");}
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Baz'], },
    },
  },
  {
    name => 'simple assign twice BEGIN',
    code => <<'HERE',
package Foo;
our @ISA;
BEGIN {@ISA = ("Bar", "Baz");}
@ISA = ("Bur", "Buz");
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bur', 'Buz'], },
    },
  },
  {
    name => 'push, assign',
    code => <<'HERE',
package Foo;
our @ISA;
push @ISA, 'Baz';
@ISA = ("Bur", "Buz");
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bur', 'Buz'], },
    },
  },
  {
    name => 'push, assign, unshift',
    code => <<'HERE',
package Foo;
our @ISA;
push @ISA, 'Baz';
@ISA = ("Bur", "Buz");
unshift @ISA, 'Frob';
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Frob', 'Bur', 'Buz'], },
    },
  },
  {
    name => 'push, BEGIN assign, unshift',
    code => <<'HERE',
package Foo;
our @ISA;
push @ISA, 'Baz';
BEGIN {@ISA = ("Bur", "Buz");}
unshift @ISA, 'Frob';
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Frob', 'Bur', 'Buz', 'Baz'], },
    },
  },
  {
    name => 'push, END assign, unshift',
    code => <<'HERE',
package Foo;
our @ISA;
push @ISA, 'Baz';
END {@ISA = ("Bur", "Buz");}
unshift @ISA, 'Frob';
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Frob', 'Baz'], },
    },
  },
  {
    name => 'base, push, BEGIN assign, unshift',
    code => <<'HERE',
package Foo;
our @ISA;
use base 'Frab';
push @ISA, 'Baz';
BEGIN {@ISA = ("Bur", "Buz");}
unshift @ISA, 'Frob';
push @ISA, 'Frub';
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Frob', 'Bur', 'Buz', 'Baz', 'Frub'], },
    },
  },
  {
    name => 'declare assign',
    code => <<'HERE',
package Foo;
our @ISA = qw(Frob);
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Frob'], },
    },
  },
);

foreach my $test (@tests) {
  my $name = $test->{name};
  my $code = $test->{code};
  my $ref = $test->{"cmp"};
  my $index = $indexer->parse($code);
  is_deeply($index, $ref, "equivalence test: $name") or warn Dumper $index;
}