#!/usr/bin/perl
use Test::More;
use BibTeX::Parser::Author;
# Names from Mittelbach, Goossens: The LaTeX Companion, Second Edition.
my %names = (
"Donald E. Knuth" => ["Donald E.", undef, "Knuth", undef],
"John Chris Smith" => ["John Chris", undef, "Smith", undef],
"Smith, John Chris" => ["John Chris", undef, "Smith", undef],
"Thomas von Neumann" => ["Thomas", "von", "Neumann", undef],
"von Neumann, Thomas" => ["Thomas", "von", "Neumann", undef],
"Lopez Fernandez, Miguel" => ["Miguel", undef, "Lopez Fernandez", undef],
"Pierre de la Porte" => ["Pierre", "de la", "Porte", undef],
"Smith, Jr., Robert" => ["Robert", undef, "Smith", "Jr."],
"von Smith, Jr., Robert" => ["Robert", "von", "Smith", "Jr."],
"Johannes Martinus Albertus van de Groene Heide" => ["Johannes Martinus Albertus", "van de", "Groene Heide", undef],
"Maria-Victoria Delgrande" => ["Maria-Victoria", undef, "Delgrande", undef],
"Anonymous" => [undef, undef, "Anonymous", undef],
"von Neumann" => [undef, "von", "Neumann", undef],
"N. Tetteh-Lartey" => ["N.", undef, "Tetteh-Lartey", undef],
"von Tetteh-Lartey, N." => ["N.", "von", "Tetteh-Lartey", undef],
"von Tetteh-Lartey, Jr., N." => ["N.", "von", "Tetteh-Lartey", "Jr."],
"" => [undef, undef, undef, undef],
" " => [undef, undef, undef, undef],
"\n" => [undef, undef, undef, undef],
"al." => [undef, undef, "al.", undef],
"et.~al." => [undef, undef, "et.~al.", undef],
"O'Malley, A." => ["A.", undef, "O'Malley", undef],
"A. O'Malley" => ["A.", undef, "O'Malley", undef],
"Arthur O'Malley" => ["Arthur", undef, "O'Malley", undef],
"O'Malley, Arthur" => ["Arthur", undef, "O'Malley", undef],
'L.M. M\"uller' => ["L.M.", undef, 'M\"uller', undef],
'M\"uller, L.M.' => ["L.M.", undef, 'M\"uller', undef],
'L.M. M"uller' => ["L.M.", undef, 'M"uller', undef],
'M"uller, L.M.' => ["L.M.", undef, 'M"uller', undef],
'van Beethoven, Ludwig' => ["Ludwig", "van", "Beethoven", undef ],
'{Barnes and Noble, Inc.}' => [undef, undef, '{Barnes and Noble, Inc.}', undef],
"Ludwigg {van Beethoven}" => ["Ludwigg", undef, "{van Beethoven}", undef],
'{van Beethoven}, Ludwig' => ["Ludwig", undef, "{van Beethoven}", undef ],
);
plan tests => (keys(%names) * 6 + 5);
my $author = new BibTeX::Parser::Author;
isa_ok($author, "BibTeX::Parser::Author", "Correct type");
is($author->first, undef, "Initial state 'first'");
is($author->von, undef, "Initial state 'von'");
is($author->last, undef, "Initial state 'last'");
is($author->jr, undef, "Initial state 'jr'");
foreach my $name (keys %names) {
is_deeply([BibTeX::Parser::Author->split($name)], $names{$name}, $name =~ /\w/ ? $name : "whitespace name: '$name'" );
$author = new BibTeX::Parser::Author $name;
isa_ok($author, "BibTeX::Parser::Author");
is($author->first, $names{$name}->[0] );
is($author->von, $names{$name}->[1]);
is($author->last, $names{$name}->[2]);
is($author->jr, $names{$name}->[3]);
}