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 => 10;
BEGIN { use_ok('File::PackageIndexer') };
use Data::Dumper;

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

my @tests = (
  {
    name => 'simple',
    code => <<'HERE',
package Foo;
use base 'Bar';
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar'], },
    },
  },
  {
    name => 'two classes',
    code => <<'HERE',
package Foo;
use base 'Bar', "Baz";
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Baz'], },
    },
  },
  {
    name => 'qw',
    code => <<'HERE',
package Foo;
use base qw[Bar Baz];
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Baz'], },
    },
  },
  {
    name => 'literal',
    code => <<'HERE',
package Foo;
use base q{Baz};
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Baz'], },
    },
  },
  {
    name => 'multiple',
    code => <<'HERE',
package Foo;
use base "Bar";
use base q{Baz};
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Baz'], },
    },
  },
  {
    name => 'multiple, mixed',
    code => <<'HERE',
package Foo;
use base "Bar", qq{Buz};
use base q{Baz};
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Buz', 'Baz'], },
    },
  },
  {
    name => 'multiple, mixed',
    code => <<'HERE',
package Foo;
use base "Bar", qq{Buz};
package Arg;
use base q{Baz};
use base qw(Foo);
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Buz'], },
      Arg => { name => 'Arg', subs => {}, isa => ['Baz', 'Foo'], },
    },
  },
  {
    name => 'multiple, mixed, funny parenthesis',
    code => <<'HERE',
package Foo;
use base (((("Bar")), qq{Buz}),);
package Arg;
use base ((q{Baz},),);
use base qw(Foo);
HERE
    'cmp' => {
      Foo => { name => 'Foo', subs => {}, isa => ['Bar', 'Buz'], },
      Arg => { name => 'Arg', subs => {}, isa => ['Baz', 'Foo'], },
    },
  },
);

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;
}