// Copyright 2013 Michel Kraemer
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package de.undercouch.citeproc.bibtex;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import de.undercouch.citeproc.csl.CSLName;
/**
* Tests the name parser
* @author Michel Kraemer
*/
public class NameParserTest {
/**
* Tests if a family name can be parsed
*/
@Test
public void familyOnly() {
CSLName[] names = NameParser.parse("Thompson");
assertEquals(1, names.length);
assertEquals("Thompson", names[0].getFamily());
}
/**
* Tests if a simple name can be parsed
*/
@Test
public void simple() {
CSLName[] names = NameParser.parse("Ken Thompson");
assertEquals(1, names.length);
assertEquals("Ken", names[0].getGiven());
assertEquals("Thompson", names[0].getFamily());
}
/**
* Tests if a name with a middle initial can be parsed
*/
@Test
public void middleName() {
CSLName[] names = NameParser.parse("Dennis M. Ritchie");
assertEquals(1, names.length);
assertEquals("Dennis M.", names[0].getGiven());
assertEquals("Ritchie", names[0].getFamily());
}
/**
* Tests if a name with initials can be parsed
*/
@Test
public void initials() {
CSLName[] names = NameParser.parse("S. C. Johnson");
assertEquals(1, names.length);
assertEquals("S. C.", names[0].getGiven());
assertEquals("Johnson", names[0].getFamily());
}
/**
* Tests if a name with a non-dropping particle can be parsed
*/
@Test
public void nonDroppingParticle() {
CSLName[] names = NameParser.parse("Michael van Gerwen");
assertEquals(1, names.length);
assertEquals("Michael", names[0].getGiven());
assertEquals("van", names[0].getNonDroppingParticle());
assertEquals("Gerwen", names[0].getFamily());
}
/**
* Tests if a family name with a non-dropping particle can be parsed
*/
@Test
public void nonDroppingParticleFamilyOnly() {
CSLName[] names = NameParser.parse("van Gerwen");
assertEquals(1, names.length);
assertEquals("van", names[0].getNonDroppingParticle());
assertEquals("Gerwen", names[0].getFamily());
}
/**
* Tests if a name with a comma can be parsed
*/
@Test
public void comma() {
CSLName[] names = NameParser.parse("Thompson, Ken");
assertEquals(1, names.length);
assertEquals("Ken", names[0].getGiven());
assertEquals("Thompson", names[0].getFamily());
}
/**
* Tests if a name with a suffix can be parsed
*/
@Test
public void commaJunior() {
CSLName[] names = NameParser.parse("Friedman, Jr., George");
assertEquals(1, names.length);
assertEquals("George", names[0].getGiven());
assertEquals("Jr.", names[0].getSuffix());
assertEquals("Friedman", names[0].getFamily());
}
/**
* Tests if a name with a given name and two family names can be
* parsed correctly and if the given name is not parsed as suffix
*/
@Test
public void commaNoJunior() {
CSLName[] names = NameParser.parse("Familya Familyb, Given");
assertEquals(1, names.length);
assertEquals("Given", names[0].getGiven());
assertEquals("Familya Familyb", names[0].getFamily());
}
/**
* Tests if a name with a comma and a middle initial can be parsed
*/
@Test
public void commaInitials() {
CSLName[] names = NameParser.parse("Ritchie, Dennis M.");
assertEquals(1, names.length);
assertEquals("Dennis M.", names[0].getGiven());
assertEquals("Ritchie", names[0].getFamily());
}
/**
* Tests if a name with a comma and a non-dropping particle can be parsed
*/
@Test
public void commaNonDroppingParticle() {
CSLName[] names = NameParser.parse("van Gerwen, Michael");
assertEquals(1, names.length);
assertEquals("Michael", names[0].getGiven());
assertEquals("van", names[0].getNonDroppingParticle());
assertEquals("Gerwen", names[0].getFamily());
}
/**
* Tests if a name with a comma and multiple non-dropping particles can be parsed
*/
@Test
public void commaNonDroppingParticles() {
CSLName[] names = NameParser.parse("Van der Voort, Vincent");
assertEquals(1, names.length);
assertEquals("Vincent", names[0].getGiven());
assertEquals("Van der", names[0].getNonDroppingParticle());
assertEquals("Voort", names[0].getFamily());
}
/**
* Tests if multiple names can be parsed
*/
@Test
public void and() {
CSLName[] names = NameParser.parse("Michael van Gerwen and Vincent van der Voort");
assertEquals(2, names.length);
assertEquals("Michael", names[0].getGiven());
assertEquals("van", names[0].getNonDroppingParticle());
assertEquals("Gerwen", names[0].getFamily());
assertEquals("Vincent", names[1].getGiven());
assertEquals("van der", names[1].getNonDroppingParticle());
assertEquals("Voort", names[1].getFamily());
}
/**
* Tests if multiple names with commas can be parsed
*/
@Test
public void andComma() {
CSLName[] names = NameParser.parse("van Gerwen, Michael and Van der Voort, Vincent");
assertEquals(2, names.length);
assertEquals("Michael", names[0].getGiven());
assertEquals("van", names[0].getNonDroppingParticle());
assertEquals("Gerwen", names[0].getFamily());
assertEquals("Vincent", names[1].getGiven());
assertEquals("Van der", names[1].getNonDroppingParticle());
assertEquals("Voort", names[1].getFamily());
}
/**
* Tests if multiple names with commas can be parsed
*/
@Test
public void andComma2() {
CSLName[] names = NameParser.parse("van Gerwen, Michael and van der Voort, Vincent");
assertEquals(2, names.length);
assertEquals("Michael", names[0].getGiven());
assertEquals("van", names[0].getNonDroppingParticle());
assertEquals("Gerwen", names[0].getFamily());
assertEquals("Vincent", names[1].getGiven());
assertEquals("van der", names[1].getNonDroppingParticle());
assertEquals("Voort", names[1].getFamily());
}
/**
* Tests if multiple names with commas can be parsed
*/
@Test
public void andCommaMix() {
CSLName[] names = NameParser.parse("van Gerwen, Michael and Vincent van der Voort");
assertEquals(2, names.length);
assertEquals("Michael", names[0].getGiven());
assertEquals("van", names[0].getNonDroppingParticle());
assertEquals("Gerwen", names[0].getFamily());
assertEquals("Vincent", names[1].getGiven());
assertEquals("van der", names[1].getNonDroppingParticle());
assertEquals("Voort", names[1].getFamily());
}
/**
* Tests if a name with a suffix can be parsed
*/
@Test
public void junior() {
CSLName[] names = NameParser.parse("George Friedman, Jr.");
assertEquals(1, names.length);
assertEquals("George", names[0].getGiven());
assertEquals("Jr.", names[0].getSuffix());
assertEquals("Friedman", names[0].getFamily());
}
/**
* Tests if a non-parseable name renders a literal string
*/
@Test
public void nonParseable() {
String str = "Jerry Peek and Tim O'Reilly and Mike Loukides and other authors of the Nutshell handbooks";
CSLName[] names = NameParser.parse(str);
assertEquals(1, names.length);
assertEquals(str, names[0].getLiteral());
}
}