The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use vars qw($DEBUG);
use IO::Handle;
BEGIN { require "t/common.pl"; }

my $loaded;
BEGIN { $| = 1; print "1..51\n"; }
END {print "not ok 1\n" unless $loaded;}
use Text::BibTeX;
$loaded = 1;
print "ok 1\n";

$DEBUG = 0;

setup_stderr;

sub test_name
{
   my ($name, $parts) = @_;
   my $ok = 1;
   my @partnames = qw(first von last jr);
   my $i;

   for $i (0 .. $#partnames)
   {
      if (defined $parts->[$i])
      {
         $ok &= ($name->part ($partnames[$i]))
            && slist_equal ($parts->[$i], [$name->part ($partnames[$i])]);
      }
      else
      {
         $ok &= ! $name->part ($partnames[$i]);
      }
   }

   test (keys %$name <= 4 && $ok);
}


# ----------------------------------------------------------------------
# processing of author names

my (@names, %names, @orig_namelist, $namelist, @namelist);
my ($text, $entry);

# first just a big ol' list of names, not attached to any entry
%names =
 ('van der Graaf'          => '|van+der|Graaf|',
  'Jones'                  => '||Jones|',
  'van'                    => '||van|',
  'John Smith'             => 'John||Smith|',
  'John van Smith'         => 'John|van|Smith|',
  'John van Smith Jr.'     => 'John|van|Smith+Jr.|',
  'John Smith Jr.'         => 'John+Smith||Jr.|',
  'John van'               => 'John||van|',
  'John van der'           => 'John|van|der|',
  'John van der Graaf'     => 'John|van+der|Graaf|',
  'John van der Graaf foo' => 'John|van+der|Graaf+foo|',
  'foo Foo foo'            => '|foo|Foo+foo|',
  'Foo foo'                => 'Foo||foo|',
  'foo Foo'                => '|foo|Foo|'
 );
          
@orig_namelist = keys %names;
$namelist = join (' and ', @orig_namelist);
@namelist = Text::BibTeX::split_list
   ($namelist, 'and', 'test', 0, 'name');
test (slist_equal (\@orig_namelist, \@namelist));

my $i;
foreach $i (0 .. $#namelist)
{
   test ($namelist[$i] eq $orig_namelist[$i]);
   my %parts;
   Text::BibTeX::Name::_split (\%parts, $namelist[$i], 'test', 0, $i, 0);
   test (keys %parts <= 4);

   my @name = map { join ('+', ref $_ ? @$_ : ()) }
                  @parts{'first','von','last','jr'};
   test (join ('|', @name) eq $names{$orig_namelist[$i]});
}

# now an entry with some names in it

$text = <<'TEXT';
@article{homer97,
  author = {  Homer  Simpson    and
              Flanders, Jr.,    Ned Q. and
              {Foo  Bar and Co.}},
  title = {Territorial Imperatives in Modern Suburbia},
  journal = {Journal of Suburban Studies},
  year = 1997
}
TEXT

test ($entry = new Text::BibTeX::Entry $text);
my $author = $entry->get ('author');
test ($author
      eq 'Homer Simpson and Flanders, Jr., Ned Q. and {Foo Bar and Co.}');
@names = $entry->split ('author');
test (@names == 3 &&
      $names[0] eq 'Homer Simpson' &&
      $names[1] eq 'Flanders, Jr., Ned Q.' &&
      $names[2] eq '{Foo Bar and Co.}');
@names = $entry->names ('author');
test (@names == 3);
test_name ($names[0], [['Homer'], undef, ['Simpson'], undef]);
test_name ($names[1], [['Ned', 'Q.'], undef, ['Flanders'], ['Jr.']]);
test_name ($names[2], [undef, undef, ['{Foo Bar and Co.}']]);