/**
* @covers PersonStringNlm30NameSchemaFilter
* @covers Nlm30PersonStringFilter
* @depends testExecuteWithSinglePersonString
*/
public function testExecuteWithMultiplePersonsStrings()
{
$personsString = 'MULLER:IFC Peterberg:Peters HC:Yu QK:Hans Peter B. Sperling:et al';
$expectedResults = array(array(null, null, null, 'Muller'), array(null, array('I', 'F', 'C'), null, 'Peterberg'), array(null, array('H', 'C'), null, 'Peters'), array(null, array('Q', 'K'), null, 'Yu'), array(null, array('Hans', 'Peter', 'B'), null, 'Sperling'));
$personStringNlm30NameSchemaFilter = new PersonStringNlm30NameSchemaFilter(ASSOC_TYPE_AUTHOR, PERSON_STRING_FILTER_MULTIPLE);
$personDescriptions =& $personStringNlm30NameSchemaFilter->execute($personsString);
// The last description should be an 'et-al' string
self::assertEquals(PERSON_STRING_FILTER_ETAL, array_pop($personDescriptions));
foreach ($personDescriptions as $testNumber => $personDescription) {
$this->assertPerson($expectedResults[$testNumber], $personDescription, $testNumber);
}
// Test again, this time with title and degrees
$personsString = 'Dr. MULLER; IFC Peterberg; Prof. Peters HC, MSc.; Yu QK;Hans Peter B. Sperling; etal';
$expectedResults = array(array('Dr.', null, null, 'Muller'), array(null, array('I', 'F', 'C'), null, 'Peterberg'), array('Prof. - MSc', array('H', 'C'), null, 'Peters'), array(null, array('Q', 'K'), null, 'Yu'), array(null, array('Hans', 'Peter', 'B'), null, 'Sperling'));
$personStringNlm30NameSchemaFilter->setFilterTitle(true);
$personStringNlm30NameSchemaFilter->setFilterDegrees(true);
$personDescriptions =& $personStringNlm30NameSchemaFilter->execute($personsString);
// The last description should be an 'et-al' string
self::assertEquals(PERSON_STRING_FILTER_ETAL, array_pop($personDescriptions));
foreach ($personDescriptions as $testNumber => $personDescription) {
$this->assertPerson($expectedResults[$testNumber], $personDescription, $testNumber);
}
// Test whether Vancouver style comma separation works correctly
$personsString = 'Peterberg IFC, Peters HC, Sperling HP';
$expectedResults = array(array(null, array('I', 'F', 'C'), null, 'Peterberg'), array(null, array('H', 'C'), null, 'Peters'), array(null, array('H', 'P'), null, 'Sperling'));
$personStringNlm30NameSchemaFilter->setFilterTitle(false);
$personStringNlm30NameSchemaFilter->setFilterDegrees(false);
$personDescriptions =& $personStringNlm30NameSchemaFilter->execute($personsString);
foreach ($personDescriptions as $testNumber => $personDescription) {
$this->assertPerson($expectedResults[$testNumber], $personDescription, $testNumber);
}
// Single name strings should not be cut when separated by comma.
$personsString = 'Willinsky, John';
$expectedResult = array(null, array('John'), null, 'Willinsky');
$personDescriptions =& $personStringNlm30NameSchemaFilter->execute($personsString);
$this->assertEquals(1, count($personDescriptions));
$this->assertPerson($expectedResult, $personDescriptions[0], $testNumber);
// Test APA style author tokenization.
$singleAuthor = array(1 => 'Berndt, T. J.');
$twoAuthors = array(2 => 'Wegener-Prent, D. T., & Petty, R. E.');
$threeToSevenAuthors = array(6 => 'Kernis Wettelberger, M. H., Cornell, D. P., Sun, C. R., Berry, A., Harlow, T., & Bach, J. S.');
$moreThanSevenAuthors = array(7 => 'Miller, F. H., Choi, M.J., Angeli, L. L., Harland, A. A., Stamos, J. A., Thomas, S. T., . . . Rubin, L. H.');
$singleEditor = array(1 => 'A. Editor');
$twoEditors = array(2 => 'A. Editor-Double & B. Editor');
$threeToSevenEditors = array(6 => 'M.H. Kernis Wettelberger, D. P. Cornell, C.R. Sun, A. Berry, T. Harlow & J.S. Bach');
$moreThanSevenEditors = array(7 => 'F. H. Miller, M. J. Choi, L. L. Angeli, A. A. Harland, J. A. Stamos, S. T. Thomas . . . L. H. Rubin');
foreach (array($singleAuthor, $twoAuthors, $threeToSevenAuthors, $moreThanSevenAuthors, $singleEditor, $twoEditors, $threeToSevenEditors, $moreThanSevenEditors) as $test) {
$expectedNumber = key($test);
$testString = current($test);
$personDescriptions =& $personStringNlm30NameSchemaFilter->execute($testString);
$this->assertEquals($expectedNumber, count($personDescriptions), 'Offending string: ' . $testString);
}
}