2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.strategy
.parser
;
12 import static org
.junit
.Assert
.assertEquals
;
13 import static org
.junit
.Assert
.assertFalse
;
14 import static org
.junit
.Assert
.assertNotNull
;
15 import static org
.junit
.Assert
.assertNull
;
16 import static org
.junit
.Assert
.assertTrue
;
18 import java
.lang
.reflect
.InvocationTargetException
;
19 import java
.lang
.reflect
.Method
;
20 import java
.util
.List
;
21 import java
.util
.regex
.Matcher
;
22 import java
.util
.regex
.Pattern
;
24 import org
.apache
.log4j
.Logger
;
25 import org
.joda
.time
.DateTime
;
26 import org
.joda
.time
.Duration
;
27 import org
.junit
.Assert
;
28 import org
.junit
.Before
;
29 import org
.junit
.BeforeClass
;
30 import org
.junit
.Test
;
32 import eu
.etaxonomy
.cdm
.common
.UTF8
;
33 import eu
.etaxonomy
.cdm
.model
.agent
.INomenclaturalAuthor
;
34 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
35 import eu
.etaxonomy
.cdm
.model
.agent
.Team
;
36 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
37 import eu
.etaxonomy
.cdm
.model
.common
.DefaultTermInitializer
;
38 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
39 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationship
;
40 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalCode
;
41 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatus
;
42 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatusType
;
43 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
44 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
45 import eu
.etaxonomy
.cdm
.model
.name
.ZoologicalName
;
46 import eu
.etaxonomy
.cdm
.model
.reference
.IArticle
;
47 import eu
.etaxonomy
.cdm
.model
.reference
.IBook
;
48 import eu
.etaxonomy
.cdm
.model
.reference
.IBookSection
;
49 import eu
.etaxonomy
.cdm
.model
.reference
.IJournal
;
50 import eu
.etaxonomy
.cdm
.model
.reference
.INomenclaturalReference
;
51 import eu
.etaxonomy
.cdm
.model
.reference
.IReference
;
52 import eu
.etaxonomy
.cdm
.model
.reference
.IVolumeReference
;
53 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
54 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
;
55 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.StringNotParsableException
;
60 public class NonViralNameParserImplTest
{
61 private static final NomenclaturalCode ICNAFP
= NomenclaturalCode
.ICNAFP
;
62 private static final NomenclaturalCode ICZN
= NomenclaturalCode
.ICZN
;
64 private static final Logger logger
= Logger
.getLogger(NonViralNameParserImplTest
.class);
66 final private String strNameFamily
= "Asteraceae";
67 final private String strNameGenus
= "Abies Mueller";
68 final private String strNameGenusUnicode
= "Abies M\u00FCller";
69 final private String strNameAbies1
= "Abies alba";
70 final private String strNameAbiesSub1
= "Abies alba subsp. beta";
71 final private String strNameAbiesAuthor1
= "Abies alba Mueller";
72 final private String strNameAbiesAuthor1Unicode
= "Abies alba M\u00FCller";
73 final private String strNameAbiesBasionymAuthor1
= "Abies alba (Ciardelli) D'Mueller";
74 final private String strNameAbiesBasionymAuthor1Unicode
= "Abies alba (Ciardelli) D'M\u00FCller";
75 final private String strNameAbiesBasionymExAuthor1
="Abies alba (Ciardelli ex Doering) D'Mueller ex. de Greuther";
76 final private String strNameAbiesBasionymExAuthor1Unicode
="Abies alba (Ciardelli ex D\u00F6ring) D'M\u00FCller ex. de Greuther";
77 final private String strNameTeam1
= "Abies alba Mueller & L.";
78 final private String strNameZoo1
= "Abies alba Mueller & L., 1822";
79 final private String strNameZoo2
= "Abies alba (Mueller, 1822) Ciardelli, 2002";
80 final private String strNameZoo3
= "Marmota marmota normalis Ciardelli, 2002";
81 final private String strNameZoo4
= "Marmota marmota subsp. normalis Ciardelli, 2002";
82 final private String strNameZoo5
= "Marmota marmota var. normalis Ciardelli, 2002";
84 final private String strNameEmpty
= "";
85 final private String strNameNull
= null;
87 private NonViralNameParserImpl parser
;
88 private NomenclaturalCode botanicCode
;
91 * @throws java.lang.Exception
94 public static void setUpBeforeClass() throws Exception
{
95 DefaultTermInitializer termInitializer
= new DefaultTermInitializer();
96 termInitializer
.initialize();
101 * @throws java.lang.Exception
104 public void setUp() throws Exception
{
105 parser
= NonViralNameParserImpl
.NewInstance();
106 botanicCode
= ICNAFP
;
110 /*************** TEST *********************************************/
113 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#NEW_INSTANCE()}.
116 public final void testNewInstance() {
117 assertNotNull(parser
);
121 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#TaxonNameParserBotanicalNameImpl()}.
124 public final void testTaxonNameParserBotanicalNameImpl() {
125 logger
.warn("Not yet implemented"); // TODO
129 public final void testTeamSeperation(){
130 Rank speciesRank
= Rank
.SPECIES();
131 NonViralName
<?
> name
;
133 // String strNameWith1AUthorAndCommaSepEditon = "Abies alba Mill., Sp. Pl., ed. 3: 455. 1987";
134 // name = parser.parseReferencedName(strNameWith1AUthorAndCommaSepEditon, botanicCode, speciesRank);
135 // Assert.assertFalse("No problems should exist", name.hasProblem());
136 // Assert.assertEquals("Name should not include reference part", "Abies alba Mill.", name.getTitleCache());
137 // Assert.assertEquals("Mill., Sp. Pl., ed. 3. 1987", name.getNomenclaturalReference().getTitleCache());
140 // String strNameWith2Authors = "Abies alba L. & Mill., Sp. Pl., ed. 3: 455. 1987";
141 // name = parser.parseReferencedName(strNameWith2Authors, botanicCode, speciesRank);
142 // Assert.assertFalse("No problems should exist", name.hasProblem());
143 // Assert.assertEquals("Name should not include reference part", "Abies alba L. & Mill.", name.getTitleCache());
144 // Assert.assertEquals("Name should have authorteam with 2 authors", 2, ((Team)name.getCombinationAuthorship()).getTeamMembers().size());
145 // Assert.assertEquals("L. & Mill., Sp. Pl., ed. 3. 1987", name.getNomenclaturalReference().getTitleCache());
147 String strNameWith3Authors
= "Abies alba Mess., L. & Mill., Sp. Pl., ed. 3: 455. 1987";
148 name
= parser
.parseReferencedName(strNameWith3Authors
, botanicCode
, speciesRank
);
149 Assert
.assertFalse("No problems should exist", name
.hasProblem());
150 Assert
.assertEquals("Name should not include reference part", "Abies alba Mess., L. & Mill.", name
.getTitleCache());
151 Assert
.assertEquals("Name should have authorship with 2 authors", 3, ((Team
)name
.getCombinationAuthorship()).getTeamMembers().size());
152 Assert
.assertEquals("Mess., L. & Mill., Sp. Pl., ed. 3. 1987", name
.getNomenclaturalReference().getTitleCache());
157 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSimpleName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
160 public final void testParseSimpleName() {
163 ZoologicalName milichiidae
= (ZoologicalName
)parser
.parseSimpleName("Milichiidae", NomenclaturalCode
.ICZN
, null);
164 assertEquals("Family rank expected", Rank
.FAMILY(), milichiidae
.getRank());
165 BotanicalName crepidinae
= (BotanicalName
)parser
.parseSimpleName("Crepidinae", ICNAFP
, null);
166 assertEquals("Family rank expected", Rank
.SUBTRIBE(), crepidinae
.getRank());
167 BotanicalName abies
= (BotanicalName
)parser
.parseSimpleName("Abies", ICNAFP
, null);
168 assertEquals("Family rank expected", Rank
.GENUS(), abies
.getRank());
170 abies
.addParsingProblem(ParserProblem
.CheckRank
);
171 parser
.parseSimpleName(abies
, "Abies", abies
.getRank(), true);
172 assertTrue(abies
.getParsingProblems().contains(ParserProblem
.CheckRank
));
174 BotanicalName rosa
= (BotanicalName
)parser
.parseSimpleName("Rosaceae", ICNAFP
, null);
175 assertTrue("Rosaceae have rank family", rosa
.getRank().equals(Rank
.FAMILY()));
176 assertTrue("Rosaceae must have a rank warning", rosa
.hasProblem(ParserProblem
.CheckRank
));
177 parser
.parseSimpleName(rosa
, "Rosaceaex", abies
.getRank(), true);
178 assertEquals("Rosaceaex have rank genus", Rank
.GENUS(), rosa
.getRank());
179 assertTrue("Rosaceaex must have a rank warning", rosa
.hasProblem(ParserProblem
.CheckRank
));
181 //repeat but remove warning after first parse
182 rosa
= (BotanicalName
)parser
.parseSimpleName("Rosaceae", ICNAFP
, null);
183 assertTrue("Rosaceae have rank family", rosa
.getRank().equals(Rank
.FAMILY()));
184 assertTrue("Rosaceae must have a rank warning", rosa
.hasProblem(ParserProblem
.CheckRank
));
185 rosa
.removeParsingProblem(ParserProblem
.CheckRank
);
186 parser
.parseSimpleName(rosa
, "Rosaceaex", rosa
.getRank(), true);
187 assertEquals("Rosaceaex have rank family", Rank
.FAMILY(), rosa
.getRank());
188 assertFalse("Rosaceaex must have no rank warning", rosa
.hasProblem(ParserProblem
.CheckRank
));
193 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSubGenericFullName(java.lang.String)}.
196 public final void testParseSubGenericFullName() {
197 String zooSpeciesWithSubgenus
= "Bacanius (Mullerister) rombophorus (Aube, 1843)";
199 ZoologicalName zooName
= (ZoologicalName
)parser
.parseReferencedName(zooSpeciesWithSubgenus
, NomenclaturalCode
.ICZN
, Rank
.SPECIES());
200 Assert
.assertTrue(zooName
.getParsingProblems().isEmpty());
201 Assert
.assertEquals("Mullerister", zooName
.getInfraGenericEpithet());
202 Assert
.assertEquals(Integer
.valueOf(1843), zooName
.getOriginalPublicationYear());
203 //zoo as referenced name
204 zooName
= (ZoologicalName
)parser
.parseFullName(zooSpeciesWithSubgenus
, NomenclaturalCode
.ICZN
, Rank
.SPECIES());
205 Assert
.assertTrue(zooName
.getParsingProblems().isEmpty());
206 Assert
.assertEquals("Mullerister", zooName
.getInfraGenericEpithet());
207 Assert
.assertEquals(Integer
.valueOf(1843), zooName
.getOriginalPublicationYear());
210 String botSpeciesWithSubgenus
= "Bacanius (Mullerister) rombophorus (Aube) Mill.";
211 BotanicalName botName
= (BotanicalName
)parser
.parseFullName(botSpeciesWithSubgenus
, NomenclaturalCode
.ICNAFP
, Rank
.GENUS());
212 Assert
.assertTrue(botName
.getParsingProblems().isEmpty());
213 Assert
.assertEquals("Mullerister", botName
.getInfraGenericEpithet());
214 Assert
.assertEquals("rombophorus", botName
.getSpecificEpithet());
215 Assert
.assertEquals("Aube", botName
.getBasionymAuthorship().getTitleCache());
217 //bot as referenced Name
218 botName
= (BotanicalName
)parser
.parseReferencedName(botSpeciesWithSubgenus
, NomenclaturalCode
.ICNAFP
, Rank
.GENUS());
219 Assert
.assertTrue(botName
.getParsingProblems().isEmpty());
220 Assert
.assertEquals("Mullerister", botName
.getInfraGenericEpithet());
221 Assert
.assertEquals("rombophorus", botName
.getSpecificEpithet());
222 Assert
.assertEquals("Aube", botName
.getBasionymAuthorship().getTitleCache());
225 String botSpeciesWithSubgenusWithoutAuthor
= "Bacanius (Mullerister) rombophorus";
226 botName
= (BotanicalName
)parser
.parseReferencedName(botSpeciesWithSubgenusWithoutAuthor
, NomenclaturalCode
.ICNAFP
, Rank
.GENUS());
227 Assert
.assertTrue(botName
.getParsingProblems().isEmpty());
228 Assert
.assertEquals("Mullerister", botName
.getInfraGenericEpithet());
229 Assert
.assertEquals("rombophorus", botName
.getSpecificEpithet());
230 Assert
.assertEquals("", botName
.getAuthorshipCache());
234 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSubGenericSimpleName(java.lang.String)}.
237 public final void testParseSubGenericSimpleName() {
238 logger
.warn("Not yet implemented"); // TODO
242 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
245 public final void testParseFullNameUnicode() {
247 NonViralName
<?
> nameAuthor
= parser
.parseFullName(strNameAbiesAuthor1Unicode
, null, Rank
.SPECIES());
248 assertEquals("Abies", nameAuthor
.getGenusOrUninomial());
249 assertEquals("alba", nameAuthor
.getSpecificEpithet());
250 assertEquals("M\u00FCller", nameAuthor
.getCombinationAuthorship().getNomenclaturalTitle());
252 NonViralName
<?
> nameBasionymAuthor
= parser
.parseFullName(strNameAbiesBasionymAuthor1Unicode
, null, Rank
.SPECIES());
253 assertEquals("Abies", nameBasionymAuthor
.getGenusOrUninomial());
254 assertEquals("alba", nameBasionymAuthor
.getSpecificEpithet());
255 assertEquals("D'M\u00FCller", nameBasionymAuthor
.getCombinationAuthorship().getNomenclaturalTitle());
256 INomenclaturalAuthor basionymTeam
= nameBasionymAuthor
.getBasionymAuthorship();
257 assertEquals("Ciardelli", basionymTeam
.getNomenclaturalTitle());
259 NonViralName
<?
> nameBasionymExAuthor
= parser
.parseFullName(strNameAbiesBasionymExAuthor1Unicode
, null, Rank
.SPECIES());
260 assertEquals("Abies", nameBasionymExAuthor
.getGenusOrUninomial());
261 assertEquals("alba", nameBasionymExAuthor
.getSpecificEpithet());
262 assertEquals("D'M\u00FCller", nameBasionymExAuthor
.getExCombinationAuthorship().getNomenclaturalTitle());
263 assertEquals("de Greuther", nameBasionymExAuthor
.getCombinationAuthorship().getNomenclaturalTitle());
264 INomenclaturalAuthor basionymTeam2
= nameBasionymExAuthor
.getExBasionymAuthorship();
265 assertEquals("Ciardelli", basionymTeam2
.getNomenclaturalTitle());
266 INomenclaturalAuthor exBasionymTeam2
= nameBasionymExAuthor
.getBasionymAuthorship();
267 assertEquals("D\u00F6ring", exBasionymTeam2
.getNomenclaturalTitle());
269 BotanicalName nameBasionymExAuthor2
= (BotanicalName
)parser
.parseFullName("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", null, Rank
.SPECIES());
270 assertEquals("Washingtonia", nameBasionymExAuthor2
.getGenusOrUninomial());
271 assertEquals("filifera", nameBasionymExAuthor2
.getSpecificEpithet());
272 assertEquals("H.Wendl.", nameBasionymExAuthor2
.getExCombinationAuthorship().getNomenclaturalTitle());
273 assertEquals("de Bary", nameBasionymExAuthor2
.getCombinationAuthorship().getNomenclaturalTitle());
274 INomenclaturalAuthor basionymTeam3
= nameBasionymExAuthor2
.getBasionymAuthorship();
275 assertEquals("Andre", basionymTeam3
.getNomenclaturalTitle());
276 INomenclaturalAuthor exBasionymTeam3
= nameBasionymExAuthor2
.getExBasionymAuthorship();
277 assertEquals("Linden", exBasionymTeam3
.getNomenclaturalTitle());
278 String title
= nameBasionymExAuthor2
.getTitleCache();
279 assertEquals("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", title
);
285 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
288 public final void testParseFullName() {
290 Method parseMethod
= parser
.getClass().getDeclaredMethod("parseFullName", String
.class, NomenclaturalCode
.class, Rank
.class);
291 testName_StringNomcodeRank(parseMethod
);
292 } catch (Exception e
) {
298 NonViralName
<?
> nameTeam1
= parser
.parseFullName(strNameTeam1
);
299 assertEquals( "Abies", nameTeam1
.getGenusOrUninomial());
300 assertEquals( "alba", nameTeam1
.getSpecificEpithet());
301 assertEquals("Mueller & L.", nameTeam1
.getCombinationAuthorship().getNomenclaturalTitle());
302 assertTrue(nameTeam1
.getCombinationAuthorship() instanceof Team
);
303 Team team
= (Team
)nameTeam1
.getCombinationAuthorship();
304 assertEquals("Mueller", team
.getTeamMembers().get(0).getNomenclaturalTitle());
305 assertEquals("L.", team
.getTeamMembers().get(1).getNomenclaturalTitle());
308 ZoologicalName nameZoo1
= (ZoologicalName
)parser
.parseFullName(strNameZoo1
);
309 assertEquals( "Abies", nameZoo1
.getGenusOrUninomial());
310 assertEquals( "alba", nameZoo1
.getSpecificEpithet());
311 assertEquals("Mueller & L.", nameZoo1
.getCombinationAuthorship().getNomenclaturalTitle());
312 assertEquals(NomenclaturalCode
.ICZN
, nameZoo1
.getNomenclaturalCode() );
313 assertEquals(Integer
.valueOf(1822), nameZoo1
.getPublicationYear());
314 assertTrue(nameZoo1
.getCombinationAuthorship() instanceof Team
);
315 Team teamZoo
= (Team
)nameZoo1
.getCombinationAuthorship();
316 assertEquals("Mueller", teamZoo
.getTeamMembers().get(0).getNomenclaturalTitle());
317 assertEquals("L.", teamZoo
.getTeamMembers().get(1).getNomenclaturalTitle());
319 ZoologicalName nameZoo2
= (ZoologicalName
)parser
.parseFullName(strNameZoo2
);
320 assertEquals(Integer
.valueOf(2002), nameZoo2
.getPublicationYear());
321 assertEquals(Integer
.valueOf(1822), nameZoo2
.getOriginalPublicationYear());
322 assertEquals("Mueller", nameZoo2
.getBasionymAuthorship().getNomenclaturalTitle());
323 assertEquals("Ciardelli", nameZoo2
.getCombinationAuthorship().getNomenclaturalTitle());
326 ZoologicalName nameZoo3
= (ZoologicalName
)parser
.parseFullName(strNameZoo3
);
327 assertEquals("Ciardelli", nameZoo3
.getCombinationAuthorship().getNomenclaturalTitle());
328 assertFalse("Subsp. without marker should be parsable", nameZoo3
.hasProblem());
329 assertEquals("Variety should be recognized", Rank
.SUBSPECIES(), nameZoo3
.getRank());
331 ZoologicalName nameZoo4
= (ZoologicalName
)parser
.parseFullName(strNameZoo4
);
332 assertEquals("Ciardelli", nameZoo4
.getCombinationAuthorship().getNomenclaturalTitle());
333 assertFalse("Subsp. without marker should be parsable", nameZoo4
.hasProblem());
334 assertEquals("Variety should be recognized", Rank
.SUBSPECIES(), nameZoo4
.getRank());
336 ZoologicalName nameZoo5
= (ZoologicalName
)parser
.parseFullName(strNameZoo5
);
337 assertEquals("Ciardelli", nameZoo5
.getCombinationAuthorship().getNomenclaturalTitle());
338 assertFalse("Subsp. without marker should be parsable", nameZoo5
.hasProblem());
339 assertEquals("Variety should be recognized", Rank
.VARIETY(), nameZoo5
.getRank());
343 BotanicalName autonymName
= (BotanicalName
)parser
.parseFullName("Abies alba Mill. var. alba", ICNAFP
, null);
344 assertFalse("Autonym should be parsable", autonymName
.hasProblem());
348 NonViralName
<?
> nameEmpty
= parser
.parseFullName(strNameEmpty
);
349 assertNotNull(nameEmpty
);
350 assertEquals("", nameEmpty
.getTitleCache());
353 NonViralName
<?
> nameNull
= parser
.parseFullName(strNameNull
);
354 assertNull(nameNull
);
357 String fullNameString
= "Abies alba (Greuther & L'Hiver & al. ex M\u00FCller & Schmidt)Clark ex Ciardelli";
358 NonViralName
<?
> authorname
= parser
.parseFullName(fullNameString
);
359 assertFalse(authorname
.hasProblem());
360 assertEquals("Basionym author should have 3 authors", 2, ((Team
)authorname
.getExBasionymAuthorship()).getTeamMembers().size());
361 Assert
.assertTrue("ExbasionymAuthorship must have more members'", ((Team
)authorname
.getExBasionymAuthorship()).isHasMoreMembers());
363 //author with 2 capitals
364 fullNameString
= "Campanula rhodensis A. DC.";
365 NonViralName
<?
> name
= parser
.parseFullName(fullNameString
);
366 assertFalse(name
.hasProblem());
368 //author with no space #5618
369 fullNameString
= "Gordonia moaensis (Vict.)H. Keng";
370 name
= parser
.parseFullName(fullNameString
);
371 assertFalse(name
.hasProblem());
372 assertNotNull(name
.getCombinationAuthorship());
373 assertEquals("H. Keng", name
.getCombinationAuthorship().getNomenclaturalTitle());
375 //name without combination author , only to check if above fix for #5618 works correctly
376 fullNameString
= "Gordonia moaensis (Vict.)";
377 name
= parser
.parseFullName(fullNameString
);
378 assertFalse(name
.hasProblem());
379 assertNull(name
.getCombinationAuthorship());
380 assertNotNull(name
.getBasionymAuthorship());
381 assertEquals("Vict.", name
.getBasionymAuthorship().getNomenclaturalTitle());
386 public final void testEtAl() throws StringNotParsableException
{
388 String fullNameString
= "Abies alba Greuther, Hiver & al.";
389 NonViralName
<?
> authorname
= parser
.parseFullName(fullNameString
);
390 assertFalse(authorname
.hasProblem());
391 assertEquals("Basionym author should have 2 authors", 2, ((Team
)authorname
.getCombinationAuthorship()).getTeamMembers().size());
392 assertTrue("Basionym author team should have more authors", ((Team
)authorname
.getCombinationAuthorship()).isHasMoreMembers() );
395 NonViralName
<?
> nvn
= ZoologicalName
.NewInstance(null);
396 parser
.parseAuthors(nvn
, "Eckweiler, Hand et al., 2003");
397 Team team
= (Team
)nvn
.getCombinationAuthorship();
398 Assert
.assertNotNull("Comb. author must not be null", team
);
399 Assert
.assertEquals("Must be team with 2 members", 2, team
.getTeamMembers().size());
400 Assert
.assertEquals("Second member must be 'Hand'", "Hand", team
.getTeamMembers().get(1).getTitleCache());
401 Assert
.assertTrue("Team must have more members'", team
.isHasMoreMembers());
405 public final void testMultipleAuthors() {
406 //multiple authors for inReference
407 String fullTitleString
= "Abies alba L. in Mill., Gregor & Behr., Sp. Pl. 173: 384. 1982.";
408 NonViralName
<?
> multipleAuthorRefName
= parser
.parseReferencedName(fullTitleString
, NomenclaturalCode
.ICNAFP
, Rank
.SPECIES());
409 assertFalse(multipleAuthorRefName
.hasProblem());
410 assertTrue("Combination author should be a person", multipleAuthorRefName
.getCombinationAuthorship() instanceof Person
);
411 assertEquals("Combination author should be L.", "L.", ((Person
)multipleAuthorRefName
.getCombinationAuthorship()).getNomenclaturalTitle());
412 IReference nomRef
= multipleAuthorRefName
.getNomenclaturalReference();
413 Assert
.assertNotNull("nomRef must have inRef", ((Reference
)nomRef
).getInReference());
414 Reference inRef
= ((Reference
)nomRef
).getInReference();
415 String abbrevTitle
= inRef
.getAbbrevTitle();
416 assertEquals("InRef title should be Sp. Pl.", "Sp. Pl.", abbrevTitle
);
417 assertTrue(inRef
.getAuthorship() instanceof Team
);
418 Team team
= (Team
)inRef
.getAuthorship();
419 assertEquals(3, team
.getTeamMembers().size());
421 // multiple authors in Name
422 fullTitleString
= "Abies alba Mill., Aber & Schwedt";
423 NonViralName
<?
> multipleAuthorName
= parser
.parseReferencedName(fullTitleString
, NomenclaturalCode
.ICNAFP
, Rank
.SPECIES());
424 assertFalse(multipleAuthorName
.hasProblem());
425 assertTrue("Combination author should be a team", multipleAuthorName
.getCombinationAuthorship() instanceof Team
);
426 team
= (Team
)multipleAuthorName
.getCombinationAuthorship();
427 assertEquals(3, team
.getTeamMembers().size());
428 assertEquals("Second team member should be Aber", "Aber", team
.getTeamMembers().get(1).getTitleCache());
430 // multiple authors in Name with reference
431 fullTitleString
= "Abies alba Mill., Aber & Schwedt in L., Sp. Pl. 173: 384. 1982.";
432 multipleAuthorName
= parser
.parseReferencedName(fullTitleString
, NomenclaturalCode
.ICNAFP
, Rank
.SPECIES());
433 assertFalse(multipleAuthorName
.hasProblem());
434 assertTrue("Combination author should be a team", multipleAuthorName
.getCombinationAuthorship() instanceof Team
);
435 team
= (Team
)multipleAuthorName
.getCombinationAuthorship();
436 assertEquals(3, team
.getTeamMembers().size());
437 assertEquals("Second team member should be Aber", "Aber", team
.getTeamMembers().get(1).getTitleCache());
438 nomRef
= multipleAuthorName
.getNomenclaturalReference();
439 Assert
.assertNotNull("nomRef must have inRef", ((Reference
)nomRef
).getInReference());
440 inRef
= ((Reference
)nomRef
).getInReference();
441 abbrevTitle
= inRef
.getAbbrevTitle();
442 assertEquals("InRef title should be Sp. Pl.", "Sp. Pl.", abbrevTitle
);
443 assertTrue(inRef
.getAuthorship() instanceof Person
);
444 Person person
= (Person
)inRef
.getAuthorship();
445 assertEquals("Book author should be L.", "L.", person
.getNomenclaturalTitle());
448 fullTitleString
= "Abies alba Mill., Aber & Schwedt, Sp. Pl. 173: 384. 1982.";
449 multipleAuthorName
= parser
.parseReferencedName(fullTitleString
, NomenclaturalCode
.ICNAFP
, Rank
.SPECIES());
450 assertFalse(multipleAuthorName
.hasProblem());
451 assertTrue("Combination author should be a team", multipleAuthorName
.getCombinationAuthorship() instanceof Team
);
452 team
= (Team
)multipleAuthorName
.getCombinationAuthorship();
453 assertEquals(3, team
.getTeamMembers().size());
454 assertEquals("Second team member should be Aber", "Aber", team
.getTeamMembers().get(1).getTitleCache());
455 nomRef
= multipleAuthorName
.getNomenclaturalReference();
456 Assert
.assertNull("nomRef must not have inRef as it is a book itself", ((Reference
)nomRef
).getInReference());
457 abbrevTitle
= nomRef
.getAbbrevTitle();
458 assertEquals("InRef title should be Sp. Pl.", "Sp. Pl.", abbrevTitle
);
459 assertTrue(nomRef
.getAuthorship() instanceof Team
);
460 team
= (Team
)nomRef
.getAuthorship();
461 assertEquals(3, team
.getTeamMembers().size());
462 assertEquals("Second team member should be Schwedt", "Schwedt", team
.getTeamMembers().get(2).getTitleCache());
465 NonViralName
<?
> nvn
= ZoologicalName
.NewInstance(null);
466 parser
.parseReferencedName (nvn
, "Marmota marmota Eckweiler, Hand et al., 2003", Rank
.SPECIES(),true);
467 assertTrue("Combination author should be a team", nvn
.getCombinationAuthorship() instanceof Team
);
468 team
= (Team
)nvn
.getCombinationAuthorship();
469 Assert
.assertNotNull("Comb. author must not be null", team
);
470 Assert
.assertEquals("Must be team with 2 members", 2, team
.getTeamMembers().size());
471 Assert
.assertEquals("Second member must be 'Hand'", "Hand", team
.getTeamMembers().get(1).getTitleCache());
472 Assert
.assertTrue("Team must have more members'", team
.isHasMoreMembers());
477 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
480 public final void testHybrids() {
481 NonViralName
<?
> name1
;
484 //Infrageneric hybrid
485 name1
= parser
.parseFullName("Aegilops nothosubg. Insulae Scholz", botanicCode
, null);
486 assertTrue("Name must have binom hybrid bit set", name1
.isBinomHybrid());
487 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
488 assertFalse("Name must not have trinom hybrid bit set", name1
.isTrinomHybrid());
489 assertEquals("Infrageneric epithet must be 'Insulae'", "Insulae", name1
.getInfraGenericEpithet());
492 // NonViralName nameTeam1 = parser.parseFullName("Aegilops \u00D7insulae-cypri H. Scholz");
493 name1
= parser
.parseFullName("Aegilops \u00D7insulae Scholz", botanicCode
, null);
494 assertTrue("Name must have binom hybrid bit set", name1
.isBinomHybrid());
495 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
496 assertFalse("Name must not have trinom hybrid bit set", name1
.isTrinomHybrid());
497 assertEquals("Species epithet must be 'insulae'", "insulae", name1
.getSpecificEpithet());
499 name1
= parser
.parseFullName("Aegilops \u00D7 insulae Scholz", botanicCode
, null);
500 assertTrue("Name must have binom hybrid bit set", name1
.isBinomHybrid());
501 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
502 assertFalse("Name must not have trinom hybrid bit set", name1
.isTrinomHybrid());
503 assertEquals("Species epithet must be 'insulae'", "insulae", name1
.getSpecificEpithet());
506 name1
= parser
.parseFullName("x Aegilops Scholz", botanicCode
, null);
507 assertTrue("Name must have monom hybrid bit set", name1
.isMonomHybrid());
508 assertFalse("Name must not have binom hybrid bit set", name1
.isBinomHybrid());
509 assertFalse("Name must not have trinom hybrid bit set", name1
.isTrinomHybrid());
510 assertEquals("Uninomial must be 'Aegilops'", "Aegilops", name1
.getGenusOrUninomial());
512 //Subspecies hybrid with hybrid sign
513 //maybe false: see http://dev.e-taxonomy.eu/trac/ticket/3868
514 name1
= parser
.parseFullName("Aegilops insulae subsp. X abies Scholz", botanicCode
, null);
515 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
516 assertFalse("Name must not have binom hybrid bit set", name1
.isBinomHybrid());
517 assertTrue("Name must have trinom hybrid bit set", name1
.isTrinomHybrid());
518 assertEquals("Infraspecific epithet must be 'abies'", "abies", name1
.getInfraSpecificEpithet());
520 //Subspecies hybrid with notho / n
521 name1
= parser
.parseFullName("Aegilops insulae nothosubsp. abies Scholz", botanicCode
, null);
522 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
523 assertFalse("Name must not have binom hybrid bit set", name1
.isBinomHybrid());
524 assertFalse("Name must not be protected", name1
.isProtectedTitleCache());
525 assertTrue("Name must have trinom hybrid bit set", name1
.isTrinomHybrid());
526 assertEquals("Infraspecific epithet must be 'abies'", "abies", name1
.getInfraSpecificEpithet());
528 name1
= parser
.parseFullName("Aegilops insulae nsubsp. abies Scholz", botanicCode
, null);
529 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
530 assertFalse("Name must not have binom hybrid bit set", name1
.isBinomHybrid());
531 assertFalse("Name must not be protected", name1
.isProtectedTitleCache());
532 assertTrue("Name must have trinom hybrid bit set", name1
.isTrinomHybrid());
533 assertEquals("Infraspecific epithet must be 'abies'", "abies", name1
.getInfraSpecificEpithet());
536 String nameStr
= "Dactylorhiza \u00D7incarnata nothosubsp. versicolor";
537 name1
= parser
.parseFullName(nameStr
);
538 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
539 assertTrue("Name must have binom hybrid bit set", name1
.isBinomHybrid());
540 assertTrue("Name must have trinom hybrid bit set", name1
.isTrinomHybrid());
541 assertFalse("Name must not be protected", name1
.isProtectedTitleCache());
542 assertEquals(nameStr
, name1
.getTitleCache()); //we expect the cache strategy to create the same result
544 nameStr
= "Dactylorhiza \u00D7incarnata nothosubsp. versicolor";
545 name1
= parser
.parseFullName(nameStr
);
546 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
547 assertTrue("Name must have binom hybrid bit set", name1
.isBinomHybrid());
548 assertTrue("Name must have trinom hybrid bit set", name1
.isTrinomHybrid());
549 assertFalse("Name must not be protected", name1
.isProtectedTitleCache());
550 assertEquals(nameStr
, name1
.getTitleCache()); //we expect the cache strategy to create the same result
553 nameStr
= "Dactylorhiza incarnata nothovar. versicolor";
554 name1
= parser
.parseFullName(nameStr
);
555 assertFalse("Name must not have monom hybrid bit set", name1
.isMonomHybrid());
556 assertFalse("Name must have binom hybrid bit set", name1
.isBinomHybrid());
557 assertTrue("Name must have trinom hybrid bit set", name1
.isTrinomHybrid());
558 assertFalse("Name must not be protected", name1
.isProtectedTitleCache());
559 assertEquals(nameStr
, name1
.getNameCache()); //we expect the cache strategy to create the same result
564 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
567 public final void testUnrankedNames() {
569 Method parseMethod
= parser
.getClass().getDeclaredMethod("parseFullName", String
.class, NomenclaturalCode
.class, Rank
.class);
570 testName_StringNomcodeRank(parseMethod
);
571 } catch (Exception e
) {
576 //unranked infraspecific
577 String infraspecificUnranked
= "Genus species [unranked] infraspecific";
578 NonViralName
<?
> name
= parser
.parseFullName(infraspecificUnranked
);
579 assertEquals( "Genus", name
.getGenusOrUninomial());
580 assertEquals( "species", name
.getSpecificEpithet());
581 assertEquals( "infraspecific", name
.getInfraSpecificEpithet());
582 assertEquals( "Unranked rank should be parsed", Rank
.INFRASPECIFICTAXON(), name
.getRank());
584 //unranked infrageneric
585 String infraGenericUnranked
= "Genus [unranked] Infragen";
586 NonViralName
<?
> name2
= parser
.parseFullName(infraGenericUnranked
);
587 assertEquals( "Genus", name2
.getGenusOrUninomial());
588 assertEquals( null, name2
.getSpecificEpithet());
589 assertEquals( "Infragen", name2
.getInfraGenericEpithet());
590 assertEquals( "Unranked rank should be parsed", Rank
.INFRAGENERICTAXON(), name2
.getRank());
596 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
599 public final void testHybridFormulars() {
601 Method parseMethod
= parser
.getClass().getDeclaredMethod("parseFullName", String
.class, NomenclaturalCode
.class, Rank
.class);
602 testName_StringNomcodeRank(parseMethod
);
603 } catch (Exception e
) {
609 String hybridCache
= "Abies alba "+UTF8
.HYBRID
+" Pinus bus";
610 NonViralName
<?
> name1
= parser
.parseFullName(hybridCache
, botanicCode
, null);
611 assertTrue("Name must have hybrid formula bit set", name1
.isHybridFormula());
612 assertEquals("Name must have 2 hybrid parents", 2, name1
.getHybridChildRelations().size());
613 assertEquals("Title cache must be correct", hybridCache
, name1
.getTitleCache());
614 List
<HybridRelationship
> orderedRels
= name1
.getOrderedChildRelationships();
615 assertEquals("Name must have 2 hybrid parents in ordered list", 2, orderedRels
.size());
616 NonViralName
<?
> firstParent
= orderedRels
.get(0).getParentName();
617 assertEquals("Name must have Abies alba as first hybrid parent", "Abies alba", firstParent
.getTitleCache());
618 NonViralName
<?
> secondParent
= orderedRels
.get(1).getParentName();
619 assertEquals("Name must have Pinus bus as second hybrid parent", "Pinus bus", secondParent
.getTitleCache());
620 assertEquals("Hybrid name must have the lowest rank ('species') as rank", Rank
.SPECIES(), name1
.getRank());
621 assertNull("Name must not have a genus eptithet", name1
.getGenusOrUninomial());
622 assertNull("Name must not have a specific eptithet", name1
.getSpecificEpithet());
623 assertFalse("Name must not have parsing problems", name1
.hasProblem());
625 name1
= parser
.parseReferencedName(hybridCache
, botanicCode
, null);
626 assertFalse("Name must not have parsing problems", name1
.hasProblem());
629 hybridCache
= "Abies alba x Pinus bus";
630 name1
= parser
.parseFullName(hybridCache
, botanicCode
, null);
631 assertFalse("Name must be parsable", name1
.hasProblem());
632 assertTrue("Name must have hybrid formula bit set", name1
.isHybridFormula());
633 assertFalse("Name must not have parsing problems", name1
.hasProblem());
636 hybridCache
= "Orchis "+UTF8
.HYBRID
+" Platanthera";
637 name1
= parser
.parseFullName(hybridCache
, botanicCode
, null);
638 assertFalse("Name must be parsable", name1
.hasProblem());
639 assertTrue("Name must have hybrid formula bit set", name1
.isHybridFormula());
640 assertFalse("Name must not have parsing problems", name1
.hasProblem());
641 assertEquals("Title cache must be correct", hybridCache
, name1
.getTitleCache());
642 orderedRels
= name1
.getOrderedChildRelationships();
643 assertEquals("Name must have 2 hybrid parents in ordered list", 2, orderedRels
.size());
644 firstParent
= orderedRels
.get(0).getParentName();
645 assertEquals("Name must have Orchis as first hybrid parent", "Orchis", firstParent
.getTitleCache());
646 secondParent
= orderedRels
.get(1).getParentName();
647 assertEquals("Name must have Platanthera as second hybrid parent", "Platanthera", secondParent
.getTitleCache());
648 assertEquals("Hybrid name must have genus as rank", Rank
.GENUS(), name1
.getRank());
650 name1
= parser
.parseReferencedName(hybridCache
, botanicCode
, null);
651 assertFalse("Name must not have parsing problems", name1
.hasProblem());
653 //Subspecies first hybrid
654 name1
= parser
.parseFullName("Abies alba subsp. beta "+UTF8
.HYBRID
+" Pinus bus", botanicCode
, null);
655 assertTrue("Name must have hybrid formula bit set", name1
.isHybridFormula());
656 assertEquals("Name must have 2 hybrid parents", 2, name1
.getHybridChildRelations().size());
657 assertEquals("Title cache must be correct", "Abies alba subsp. beta "+UTF8
.HYBRID
+" Pinus bus", name1
.getTitleCache());
658 orderedRels
= name1
.getOrderedChildRelationships();
659 assertEquals("Name must have 2 hybrid parents in ordered list", 2, orderedRels
.size());
660 firstParent
= orderedRels
.get(0).getParentName();
661 assertEquals("Name must have Abies alba subsp. beta as first hybrid parent", "Abies alba subsp. beta", firstParent
.getTitleCache());
662 secondParent
= orderedRels
.get(1).getParentName();
663 assertEquals("Name must have Pinus bus as second hybrid parent", "Pinus bus", secondParent
.getTitleCache());
664 assertEquals("Hybrid name must have the lower rank ('subspecies') as rank", Rank
.SUBSPECIES(), name1
.getRank());
666 //variety second hybrid
667 name1
= parser
.parseFullName("Abies alba \u00D7 Pinus bus var. beta", botanicCode
, null);
668 assertTrue("Name must have hybrid formula bit set", name1
.isHybridFormula());
669 assertEquals("Name must have 2 hybrid parents", 2, name1
.getHybridChildRelations().size());
670 assertEquals("Title cache must be correct", "Abies alba \u00D7 Pinus bus var. beta", name1
.getTitleCache());
671 assertEquals("Hybrid name must have the lower rank ('variety') as rank", Rank
.VARIETY(), name1
.getRank());
673 //hybrids with authors
674 name1
= parser
.parseFullName("Abies alba L. \u00D7 Pinus bus Mill.", botanicCode
, null);
675 assertTrue("Name must have hybrid formula bit set", name1
.isHybridFormula());
676 assertEquals("Name must have 2 hybrid parents", 2, name1
.getHybridChildRelations().size());
677 assertEquals("Title cache must be correct", "Abies alba L. \u00D7 Pinus bus Mill.", name1
.getTitleCache());
678 orderedRels
= name1
.getOrderedChildRelationships();
679 assertEquals("Name must have 2 hybrid parents in ordered list", 2, orderedRels
.size());
680 firstParent
= orderedRels
.get(0).getParentName();
681 assertEquals("Name must have Abies alba L. as first hybrid parent", "Abies alba L.", firstParent
.getTitleCache());
682 secondParent
= orderedRels
.get(1).getParentName();
683 assertEquals("Name must have Pinus bus Mill. as second hybrid parent", "Pinus bus Mill.", secondParent
.getTitleCache());
684 assertEquals("Hybrid name must have the lower rank ('species') as rank", Rank
.SPECIES(), name1
.getRank());
689 public final void testHybridsRemoval(){
690 //if the parser input already has hybridrelationships they need to be removed
692 String hybridCache
= "Abies alba "+UTF8
.HYBRID
+" Pinus bus";
693 NonViralName
<?
> name1
= parser
.parseFullName(hybridCache
, botanicCode
, null);
694 assertFalse("Name must not have parsing problems", name1
.hasProblem());
695 assertTrue("", name1
.getHybridChildRelations().size() == 2);
697 hybridCache
= "Abieta albana "+UTF8
.HYBRID
+" Pinuta custa";
698 boolean makeEmpty
= true;
699 parser
.parseFullName(name1
, hybridCache
, Rank
.SPECIES(), makeEmpty
);
700 assertEquals("After parsing another string there should still be 2 parents, but different ones", 2, name1
.getHybridChildRelations().size());
701 assertFalse("Name must not have parsing problems", name1
.hasProblem());
704 hybridCache
= "Calendula arvensis Mill.";
706 parser
.parseFullName(name1
, hybridCache
, Rank
.SPECIES(), makeEmpty
);
707 assertTrue("", name1
.getHybridChildRelations().isEmpty());
708 assertFalse("Name must not have parsing problems", name1
.hasProblem());
711 //AND the same for reference parsing
712 hybridCache
= "Abies alba "+UTF8
.HYBRID
+" Pinus bus";
713 name1
= parser
.parseReferencedName(hybridCache
, botanicCode
, null);
714 assertFalse("Name must not have parsing problems", name1
.hasProblem());
715 assertTrue("", name1
.getHybridChildRelations().size() == 2);
717 hybridCache
= "Abieta albana "+UTF8
.HYBRID
+" Pinuta custa";
719 parser
.parseReferencedName(name1
, hybridCache
, Rank
.SPECIES(), makeEmpty
);
720 assertEquals("After parsing another string there should still be 2 parents, but different ones", 2, name1
.getHybridChildRelations().size());
721 assertFalse("Name must not have parsing problems", name1
.hasProblem());
724 hybridCache
= "Calendula arvensis Mill.";
726 parser
.parseReferencedName(name1
, hybridCache
, Rank
.SPECIES(), makeEmpty
);
727 assertTrue("", name1
.getHybridChildRelations().isEmpty());
728 assertFalse("Name must not have parsing problems", name1
.hasProblem());
731 private void testName_StringNomcodeRank(Method parseMethod
)
732 throws InvocationTargetException
, IllegalAccessException
{
733 NonViralName
<?
> name1
= (NonViralName
<?
>)parseMethod
.invoke(parser
, strNameAbies1
, null, Rank
.SPECIES());
734 //parser.parseFullName(strNameAbies1, null, Rank.SPECIES());
735 assertEquals("Abies", name1
.getGenusOrUninomial());
736 assertEquals("alba", name1
.getSpecificEpithet());
738 NonViralName
<?
> nameAuthor
= (NonViralName
<?
>)parseMethod
.invoke(parser
, strNameAbiesAuthor1
, null, Rank
.SPECIES());
739 assertEquals("Abies", nameAuthor
.getGenusOrUninomial());
740 assertEquals("alba", nameAuthor
.getSpecificEpithet());
741 assertEquals("Mueller", nameAuthor
.getCombinationAuthorship().getNomenclaturalTitle());
743 NonViralName
<?
> nameBasionymAuthor
= (NonViralName
<?
>)parseMethod
.invoke(parser
, strNameAbiesBasionymAuthor1
, null, Rank
.SPECIES());
744 assertEquals("Abies", nameBasionymAuthor
.getGenusOrUninomial());
745 assertEquals("alba", nameBasionymAuthor
.getSpecificEpithet());
746 assertEquals("D'Mueller", nameBasionymAuthor
.getCombinationAuthorship().getNomenclaturalTitle());
747 assertEquals("Ciardelli", nameBasionymAuthor
.getBasionymAuthorship().getNomenclaturalTitle());
749 NonViralName
<?
> nameBasionymExAuthor
= (NonViralName
<?
>)parseMethod
.invoke(parser
, strNameAbiesBasionymExAuthor1
, null, Rank
.SPECIES());
750 assertEquals("Abies", nameBasionymExAuthor
.getGenusOrUninomial());
751 assertEquals("alba", nameBasionymExAuthor
.getSpecificEpithet());
752 assertEquals("D'Mueller", nameBasionymExAuthor
.getExCombinationAuthorship().getNomenclaturalTitle());
753 assertEquals("de Greuther", nameBasionymExAuthor
.getCombinationAuthorship().getNomenclaturalTitle());
754 assertEquals("Ciardelli", nameBasionymExAuthor
.getExBasionymAuthorship().getNomenclaturalTitle());
755 assertEquals("Doering", nameBasionymExAuthor
.getBasionymAuthorship().getNomenclaturalTitle());
757 NonViralName
<?
> name2
= (NonViralName
<?
>)parseMethod
.invoke(parser
, strNameAbiesSub1
, null, Rank
.SPECIES());
758 assertEquals("Abies", name2
.getGenusOrUninomial());
759 assertEquals("alba", name2
.getSpecificEpithet());
760 assertEquals("beta", name2
.getInfraSpecificEpithet());
761 assertEquals(Rank
.SUBSPECIES(), name2
.getRank());
764 // unparseable *********
765 String problemString
= "sdfjlös wer eer wer";
766 NonViralName
<?
> nameProblem
= (NonViralName
<?
>)parseMethod
.invoke(parser
, problemString
, null, Rank
.SPECIES());
767 List
<ParserProblem
> list
= nameProblem
.getParsingProblems();
768 assertTrue(nameProblem
.getParsingProblem()!=0);
769 assertEquals(problemString
, nameProblem
.getTitleCache());
774 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseReferencedName(NonViralName, java.lang.String, eu.etaxonomy.cdm.model.name.Rank, boolean)(, )}.
777 public final void testParseNomStatus() {
779 String strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. ambig.";
780 NonViralName
<?
> nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
781 assertFullRefStandard(nameTestStatus
);
782 assertTrue(nameTestStatus
.getStatus().size()== 1);
783 assertEquals( NomenclaturalStatusType
.AMBIGUOUS(), nameTestStatus
.getStatus().iterator().next().getType());
786 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. inval.";
787 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
788 assertFullRefStandard(nameTestStatus
);
789 assertTrue(nameTestStatus
.getStatus().size()== 1);
790 assertEquals( NomenclaturalStatusType
.INVALID(), nameTestStatus
.getStatus().iterator().next().getType());
793 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. dub.";
794 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
795 assertFullRefStandard(nameTestStatus
);
796 assertTrue(nameTestStatus
.getStatus().size()== 1);
797 assertEquals( NomenclaturalStatusType
.DOUBTFUL(), nameTestStatus
.getStatus().iterator().next().getType());
800 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. confus.";
801 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
802 assertFullRefStandard(nameTestStatus
);
803 assertTrue(nameTestStatus
.getStatus().size()== 1);
804 assertEquals( NomenclaturalStatusType
.CONFUSUM(), nameTestStatus
.getStatus().iterator().next().getType());
807 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. illeg.";
808 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
809 assertFullRefStandard(nameTestStatus
);
810 assertTrue(nameTestStatus
.getStatus().size()== 1);
811 assertEquals( NomenclaturalStatusType
.ILLEGITIMATE(), nameTestStatus
.getStatus().iterator().next().getType());
814 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. superfl.";
815 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
816 assertFullRefStandard(nameTestStatus
);
817 assertTrue(nameTestStatus
.getStatus().size()== 1);
818 assertEquals( NomenclaturalStatusType
.SUPERFLUOUS(), nameTestStatus
.getStatus().iterator().next().getType());
821 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. rej.";
822 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
823 assertFullRefStandard(nameTestStatus
);
824 assertTrue(nameTestStatus
.getStatus().size()== 1);
825 assertEquals( NomenclaturalStatusType
.REJECTED(), nameTestStatus
.getStatus().iterator().next().getType());
828 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. utique rej.";
829 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
830 assertFullRefStandard(nameTestStatus
);
831 assertTrue(nameTestStatus
.getStatus().size()== 1);
832 assertEquals( NomenclaturalStatusType
.UTIQUE_REJECTED(), nameTestStatus
.getStatus().iterator().next().getType());
835 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. cons. prop.";
836 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
837 assertFullRefStandard(nameTestStatus
);
838 assertTrue(nameTestStatus
.getStatus().size()== 1);
839 assertEquals( NomenclaturalStatusType
.CONSERVED_PROP(), nameTestStatus
.getStatus().iterator().next().getType());
841 //nom. orth. cons. prop.
842 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. orth. cons. prop.";
843 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
844 assertFullRefStandard(nameTestStatus
);
845 assertTrue(nameTestStatus
.getStatus().size()== 1);
846 assertEquals( NomenclaturalStatusType
.ORTHOGRAPHY_CONSERVED_PROP(), nameTestStatus
.getStatus().iterator().next().getType());
849 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. cons. des.";
850 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
851 assertFullRefStandard(nameTestStatus
);
852 assertTrue(nameTestStatus
.getStatus().size()== 1);
853 assertEquals( NomenclaturalStatusType
.CONSERVED_DESIG(), nameTestStatus
.getStatus().iterator().next().getType());
856 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. legit.";
857 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
858 assertFullRefStandard(nameTestStatus
);
859 assertTrue(nameTestStatus
.getStatus().size()== 1);
860 assertEquals( NomenclaturalStatusType
.LEGITIMATE(), nameTestStatus
.getStatus().iterator().next().getType());
863 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. altern.";
864 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
865 assertFullRefStandard(nameTestStatus
);
866 assertTrue(nameTestStatus
.getStatus().size()== 1);
867 assertEquals( NomenclaturalStatusType
.ALTERNATIVE(), nameTestStatus
.getStatus().iterator().next().getType());
870 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. alternativ.";
871 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
872 assertFullRefStandard(nameTestStatus
);
873 assertTrue(nameTestStatus
.getStatus().size()== 1);
874 assertEquals( NomenclaturalStatusType
.ALTERNATIVE(), nameTestStatus
.getStatus().iterator().next().getType());
877 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. nov.";
878 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
879 assertFullRefStandard(nameTestStatus
);
880 assertTrue(nameTestStatus
.getStatus().size()== 1);
881 assertEquals( NomenclaturalStatusType
.NOVUM(), nameTestStatus
.getStatus().iterator().next().getType());
883 //nom. utique rej. prop.
884 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. utique rej. prop.";
885 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
886 assertFullRefStandard(nameTestStatus
);
887 assertTrue(nameTestStatus
.getStatus().size()== 1);
888 assertEquals( NomenclaturalStatusType
.UTIQUE_REJECTED_PROP(), nameTestStatus
.getStatus().iterator().next().getType());
891 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. orth. cons.";
892 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
893 assertFullRefStandard(nameTestStatus
);
894 assertTrue(nameTestStatus
.getStatus().size()== 1);
895 assertEquals( NomenclaturalStatusType
.ORTHOGRAPHY_CONSERVED(), nameTestStatus
.getStatus().iterator().next().getType());
898 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. rej. prop.";
899 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
900 assertFullRefStandard(nameTestStatus
);
901 assertTrue(nameTestStatus
.getStatus().size()== 1);
902 assertEquals( NomenclaturalStatusType
.REJECTED_PROP(), nameTestStatus
.getStatus().iterator().next().getType());
905 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. cons.";
906 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
907 assertFullRefStandard(nameTestStatus
);
908 assertTrue(nameTestStatus
.getStatus().size()== 1);
909 assertEquals( NomenclaturalStatusType
.CONSERVED(), nameTestStatus
.getStatus().iterator().next().getType());
912 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. sanct.";
913 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
914 assertFullRefStandard(nameTestStatus
);
915 assertTrue(nameTestStatus
.getStatus().size()== 1);
916 assertEquals( NomenclaturalStatusType
.SANCTIONED(), nameTestStatus
.getStatus().iterator().next().getType());
919 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. nud.";
920 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
921 assertFullRefStandard(nameTestStatus
);
922 assertTrue(nameTestStatus
.getStatus().size()== 1);
923 assertEquals( NomenclaturalStatusType
.NUDUM(), nameTestStatus
.getStatus().iterator().next().getType());
926 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, comb. inval.";
927 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
928 assertFullRefStandard(nameTestStatus
);
929 assertTrue(nameTestStatus
.getStatus().size()== 1);
930 assertEquals( NomenclaturalStatusType
.COMBINATION_INVALID(), nameTestStatus
.getStatus().iterator().next().getType());
933 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, comb. illeg.";
934 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
935 assertFullRefStandard(nameTestStatus
);
936 assertTrue(nameTestStatus
.getStatus().size()== 1);
937 assertEquals( NomenclaturalStatusType
.COMBINATION_ILLEGITIMATE(), nameTestStatus
.getStatus().iterator().next().getType());
940 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. provis.";
941 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
942 assertFullRefStandard(nameTestStatus
);
943 assertTrue(nameTestStatus
.getStatus().size()== 1);
944 assertEquals( NomenclaturalStatusType
.PROVISIONAL(), nameTestStatus
.getStatus().iterator().next().getType());
947 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. valid";
948 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
949 assertFullRefStandard(nameTestStatus
);
950 assertTrue(nameTestStatus
.getStatus().size()== 1);
951 assertEquals( NomenclaturalStatusType
.VALID(), nameTestStatus
.getStatus().iterator().next().getType());
954 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, nom. subnud.";
955 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
956 assertFullRefStandard(nameTestStatus
);
957 assertTrue(nameTestStatus
.getStatus().size()== 1);
958 assertEquals( NomenclaturalStatusType
.SUBNUDUM(), nameTestStatus
.getStatus().iterator().next().getType());
961 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, opus. utique oppr.";
962 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
963 assertFullRefStandard(nameTestStatus
);
964 assertTrue(nameTestStatus
.getStatus().size()== 1);
965 assertEquals( NomenclaturalStatusType
.OPUS_UTIQUE_OPPR(), nameTestStatus
.getStatus().iterator().next().getType());
968 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, comb. nov.";
969 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
970 assertFullRefStandard(nameTestStatus
);
971 assertTrue(nameTestStatus
.getStatus().size()== 1);
972 assertEquals( NomenclaturalStatusType
.COMB_NOV(), nameTestStatus
.getStatus().iterator().next().getType());
975 strTestStatus
= "Abies alba Mill., Sp. Pl. 4: 455. 1987, orth. rej.";
976 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
977 assertFullRefStandard(nameTestStatus
);
978 assertTrue(nameTestStatus
.getStatus().size()== 1);
979 assertEquals( NomenclaturalStatusType
.ORTHOGRAPHY_REJECTED(), nameTestStatus
.getStatus().iterator().next().getType());
982 strTestStatus
= "Houstonia macvaughii (Terrell), ined.";
983 nameTestStatus
= parser
.parseReferencedName(strTestStatus
, null, Rank
.SPECIES());
984 assertEquals("Houstonia", nameTestStatus
.getGenusOrUninomial());
985 assertEquals("macvaughii", nameTestStatus
.getSpecificEpithet());
986 assertEquals("(Terrell)", nameTestStatus
.getAuthorshipCache());
987 assertEquals(1, nameTestStatus
.getStatus().size());
988 assertEquals( NomenclaturalStatusType
.INED(), nameTestStatus
.getStatus().iterator().next().getType());
990 //not yet parsed "not avail."
994 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseReferencedName(NonViralName, java.lang.String, eu.etaxonomy.cdm.model.name.Rank, boolean)(, )}.
997 public final void testParseReferencedName() {
999 Method parseMethod
= parser
.getClass().getDeclaredMethod("parseReferencedName", String
.class, NomenclaturalCode
.class, Rank
.class);
1000 testName_StringNomcodeRank(parseMethod
);
1001 } catch (Exception e
) {
1002 e
.printStackTrace();
1008 String strNull
= null;
1009 Rank rankSpecies
= Rank
.SPECIES();
1010 NonViralName
<?
> nameNull
= parser
.parseReferencedName(strNull
, null, rankSpecies
);
1011 assertNull(nameNull
);
1014 String strEmpty
= "";
1015 NonViralName
<?
> nameEmpty
= parser
.parseReferencedName(strEmpty
, null, rankSpecies
);
1016 assertFalse(nameEmpty
.hasProblem());
1017 assertEquals(strEmpty
, nameEmpty
.getFullTitleCache());
1018 assertNull(nameEmpty
.getNomenclaturalMicroReference());
1022 String strFullWhiteSpcaceAndDot
= "Abies alba Mill., Sp. Pl. 4: 455 . 1987 .";
1023 NonViralName
<?
> namefullWhiteSpcaceAndDot
= parser
.parseReferencedName(strFullWhiteSpcaceAndDot
, null, rankSpecies
);
1024 assertFullRefStandard(namefullWhiteSpcaceAndDot
);
1025 assertTrue(((Reference
)namefullWhiteSpcaceAndDot
.getNomenclaturalReference()).getType().equals(eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
.Book
));
1026 assertEquals( "Abies alba Mill., Sp. Pl. 4: 455. 1987", namefullWhiteSpcaceAndDot
.getFullTitleCache());
1029 String fullReference
= "Abies alba Mill., Sp. Pl. 4: 455. 1987";
1030 NonViralName
<?
> name1
= parser
.parseReferencedName(fullReference
, null, rankSpecies
);
1031 assertFullRefStandard(name1
);
1032 assertTrue(((Reference
)name1
.getNomenclaturalReference()).getType().equals(eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
.Book
));
1033 assertEquals(fullReference
, name1
.getFullTitleCache());
1034 assertTrue("Name author and reference author should be the same", name1
.getCombinationAuthorship() == ((Reference
)name1
.getNomenclaturalReference()).getAuthorship());
1037 fullReference
= "Abies alba Mill. in Otto, Sp. Pl. 4(6): 455. 1987";
1038 NonViralName
<?
> name2
= parser
.parseReferencedName(fullReference
+ ".", null, rankSpecies
);
1039 assertFullRefNameStandard(name2
);
1040 assertEquals(fullReference
, name2
.getFullTitleCache());
1041 assertFalse(name2
.hasProblem());
1042 INomenclaturalReference ref
= name2
.getNomenclaturalReference();
1043 assertEquals(ReferenceType
.BookSection
, ((Reference
)ref
).getType());
1044 IBookSection bookSection
= (IBookSection
) ref
;
1045 IBook inBook
= bookSection
.getInBook();
1046 assertNotNull(inBook
);
1047 assertNotNull(inBook
.getAuthorship());
1048 assertEquals("Otto", inBook
.getAuthorship().getTitleCache());
1049 assertEquals("Otto, Sp. Pl. 4(6)", inBook
.getTitleCache());
1050 assertEquals("Sp. Pl.", inBook
.getAbbrevTitle());
1051 assertEquals("4(6)", inBook
.getVolume());
1052 assertTrue("Name author and reference author should be the same", name2
.getCombinationAuthorship() == ((Reference
)name2
.getNomenclaturalReference()).getAuthorship());
1055 fullReference
= "Abies alba Mill. in Sp. Pl. 4(6): 455. 1987";
1056 NonViralName
<?
> name3
= parser
.parseReferencedName(fullReference
, null, rankSpecies
);
1057 assertFullRefNameStandard(name3
);
1058 name3
.setTitleCache(null);
1059 assertEquals(fullReference
, name3
.getFullTitleCache());
1060 assertFalse(name3
.hasProblem());
1061 ref
= name3
.getNomenclaturalReference();
1062 assertEquals(eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
.Article
, ref
.getType());
1063 //Article article = (Article)ref;
1064 IJournal journal
= ((IArticle
)ref
).getInJournal();
1065 assertNotNull(journal
);
1066 //assertEquals("Sp. Pl. 4(6)", inBook.getTitleCache());
1067 assertEquals("Sp. Pl.",((Reference
) journal
).getTitleCache());
1068 assertEquals("Sp. Pl.", journal
.getAbbrevTitle());
1069 assertEquals("4(6)",((IArticle
)ref
).getVolume());
1070 assertTrue("Name author and reference author should be the same", name3
.getCombinationAuthorship() == name3
.getNomenclaturalReference().getAuthorship());
1072 //Article with volume range
1073 fullReference
= "Abies alba Mill. in Sp. Pl. 4(1-2): 455. 1987";
1074 NonViralName
<?
> name3a
= parser
.parseReferencedName(fullReference
, null, rankSpecies
);
1075 name3a
.setTitleCache(null);
1076 assertEquals(fullReference
, name3a
.getFullTitleCache());
1077 assertFalse(name3a
.hasProblem());
1078 ref
= name3a
.getNomenclaturalReference();
1079 assertEquals(eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
.Article
, ref
.getType());
1080 assertEquals("4(1-2)",((IArticle
)ref
).getVolume());
1082 //SoftArticle - having "," on position > 4
1083 String journalTitle
= "Bull. Soc. Bot.France. Louis., Roi";
1084 String yearPart
= " 1987 - 1989";
1085 String parsedYear
= "1987-1989";
1086 String fullReferenceWithoutYear
= "Abies alba Mill. in " + journalTitle
+ " 4(6): 455.";
1087 fullReference
= fullReferenceWithoutYear
+ yearPart
;
1088 String fullReferenceWithEnd
= fullReference
+ ".";
1089 NonViralName
<?
> name4
= parser
.parseReferencedName(fullReferenceWithEnd
, null, rankSpecies
);
1090 assertFalse(name4
.hasProblem());
1091 assertFullRefNameStandard(name4
);
1092 assertEquals(fullReferenceWithoutYear
+ " " + parsedYear
, name4
.getFullTitleCache());
1093 ref
= name4
.getNomenclaturalReference();
1094 assertEquals(ReferenceType
.Article
, ref
.getType());
1095 //article = (Article)ref;
1096 assertEquals(parsedYear
, ref
.getYear());
1097 journal
= ((IArticle
)ref
).getInJournal();
1098 assertNotNull(journal
);
1099 assertEquals(journalTitle
, ((Reference
) journal
).getTitleCache());
1100 assertEquals(journalTitle
, journal
.getAbbrevTitle());
1101 assertEquals("4(6)", ((IArticle
)ref
).getVolume());
1104 String strNotParsableZoo
= "Abies alba M., 1923, Sp. P. xxwer4352, nom. inval.";
1105 ZoologicalName nameZooRefNotParsabel
= (ZoologicalName
)parser
.parseReferencedName(strNotParsableZoo
, null, null);
1106 assertTrue(nameZooRefNotParsabel
.hasProblem());
1107 List
<ParserProblem
> list
= nameZooRefNotParsabel
.getParsingProblems();
1108 assertTrue("List must contain detail and year warning ", list
.contains(ParserProblem
.CheckDetailOrYear
));
1109 assertEquals(21, nameZooRefNotParsabel
.getProblemStarts());
1110 assertEquals(37, nameZooRefNotParsabel
.getProblemEnds());
1111 assertTrue(nameZooRefNotParsabel
.getNomenclaturalReference().hasProblem());
1112 list
= nameZooRefNotParsabel
.getNomenclaturalReference().getParsingProblems();
1113 assertTrue("List must contain detail and year warning ", list
.contains(ParserProblem
.CheckDetailOrYear
));
1115 assertEquals(NomenclaturalCode
.ICZN
, nameZooRefNotParsabel
.getNomenclaturalCode());
1116 assertEquals(Integer
.valueOf(1923), nameZooRefNotParsabel
.getPublicationYear());
1117 assertEquals(1, nameZooRefNotParsabel
.getStatus().size());
1119 String strZooNameSineYear
= "Homo sapiens L., 1758, Sp. An. 3: 345";
1120 ZoologicalName nameZooNameSineYear
= (ZoologicalName
)parser
.parseReferencedName(strZooNameSineYear
);
1121 assertFalse(nameZooNameSineYear
.hasProblem());
1122 assertEquals("Name without reference year must have year", (Integer
)1758, nameZooNameSineYear
.getPublicationYear());
1123 assertEquals("Name without reference year must have year", "1758", nameZooNameSineYear
.getNomenclaturalReference().getYear());
1125 String strZooNameNewCombination
= "Homo sapiens (L., 1758) Mill., 1830, Sp. An. 3: 345";
1126 ZoologicalName nameZooNameNewCombination
= (ZoologicalName
)parser
.parseReferencedName(strZooNameNewCombination
);
1127 assertTrue(nameZooNameNewCombination
.hasProblem());
1128 list
= nameZooNameNewCombination
.getParsingProblems();
1129 assertTrue("List must contain new combination has publication warning ", list
.contains(ParserProblem
.NewCombinationHasPublication
));
1130 assertEquals(35, nameZooNameNewCombination
.getProblemStarts());
1131 assertEquals(51, nameZooNameNewCombination
.getProblemEnds());
1135 String strSpecDetail1
= "Abies alba Mill. in Sp. Pl. 4(6): [455]. 1987";
1136 NonViralName
<?
> nameSpecDet1
= parser
.parseReferencedName(strSpecDetail1
+ ".", null, rankSpecies
);
1137 assertFalse(nameSpecDet1
.hasProblem());
1138 assertEquals(strSpecDetail1
, nameSpecDet1
.getFullTitleCache());
1139 assertEquals("[455]", nameSpecDet1
.getNomenclaturalMicroReference());
1142 String strSpecDetail2
= "Abies alba Mill. in Sp. Pl. 4(6): couv. 2. 1987";
1143 NonViralName
<?
> nameSpecDet2
= parser
.parseReferencedName(strSpecDetail2
+ ".", null, rankSpecies
);
1144 assertFalse(nameSpecDet2
.hasProblem());
1145 assertEquals(strSpecDetail2
, nameSpecDet2
.getFullTitleCache());
1146 assertEquals("couv. 2", nameSpecDet2
.getNomenclaturalMicroReference());
1149 String strSpecDetail3
= "Abies alba Mill. in Sp. Pl. 4(6): fig. 455. 1987";
1150 NonViralName
<?
> nameSpecDet3
= parser
.parseReferencedName(strSpecDetail3
+ ".", null, rankSpecies
);
1151 assertFalse(nameSpecDet3
.hasProblem());
1152 assertEquals(strSpecDetail3
, nameSpecDet3
.getFullTitleCache());
1153 assertEquals("fig. 455", nameSpecDet3
.getNomenclaturalMicroReference());
1156 String strSpecDetail4
= "Abies alba Mill. in Sp. Pl. 4(6): fig. 455-567. 1987";
1157 fullReference
= strSpecDetail4
+ ".";
1158 NonViralName
<?
> nameSpecDet4
= parser
.parseReferencedName(fullReference
, null, rankSpecies
);
1159 assertFalse(nameSpecDet4
.hasProblem());
1160 assertEquals(strSpecDetail4
, nameSpecDet4
.getFullTitleCache());
1161 assertEquals("fig. 455-567", nameSpecDet4
.getNomenclaturalMicroReference());
1165 String strSpecDetail5
= "Abies alba Mill. in Sp. Pl. 4(6): Gard n\u00B0 4. 1987";
1166 fullReference
= strSpecDetail5
+ ".";
1167 NonViralName
<?
> nameSpecDet5
= parser
.parseReferencedName(fullReference
, null, rankSpecies
);
1168 assertFalse(nameSpecDet5
.hasProblem());
1169 assertEquals(strSpecDetail5
, nameSpecDet5
.getFullTitleCache());
1170 assertEquals("Gard n\u00B0 4", nameSpecDet5
.getNomenclaturalMicroReference());
1173 String strSpecDetail6
= "Abies alba Mill. in Sp. Pl. 4(6): 455a. 1987";
1174 fullReference
= strSpecDetail6
+ ".";
1175 NonViralName
<?
> nameSpecDet6
= parser
.parseReferencedName(fullReference
, null, rankSpecies
);
1176 assertFalse(nameSpecDet6
.hasProblem());
1177 assertEquals(strSpecDetail6
, nameSpecDet6
.getFullTitleCache());
1178 assertEquals("455a", nameSpecDet6
.getNomenclaturalMicroReference());
1181 String strSpecDetail7
= "Abies alba Mill. in Sp. Pl. 4(6): pp.455-457. 1987";
1182 fullReference
= strSpecDetail7
+ ".";
1183 NonViralName
<?
> nameSpecDet7
= parser
.parseReferencedName(fullReference
, null, rankSpecies
);
1184 assertFalse(nameSpecDet7
.hasProblem());
1185 assertEquals(strSpecDetail7
, nameSpecDet7
.getFullTitleCache());
1186 assertEquals("pp.455-457", nameSpecDet7
.getNomenclaturalMicroReference());
1189 String strSpecDetail8
= "Abies alba Mill. in Sp. Pl. 4(6): ppp.455-457. 1987";
1190 NonViralName
<?
> nameSpecDet8
= parser
.parseReferencedName(strSpecDetail8
, null, rankSpecies
);
1191 assertTrue(nameSpecDet8
.hasProblem());
1192 assertEquals(20, nameSpecDet8
.getProblemStarts()); //TODO better start behind :
1193 assertEquals(51, nameSpecDet8
.getProblemEnds()); //TODO better stop after -457
1197 String strSpecDetail9
= "Abies alba Mill. in Sp. Pl. 4(6): pp. 455 - 457. 1987";
1198 NonViralName
<?
> nameSpecDet9
= parser
.parseReferencedName(strSpecDetail9
, null, rankSpecies
);
1199 assertFalse(nameSpecDet9
.hasProblem());
1200 assertEquals(strSpecDetail9
, nameSpecDet9
.getFullTitleCache());
1201 assertEquals("pp. 455 - 457", nameSpecDet9
.getNomenclaturalMicroReference());
1204 String strSpecDetail10
= "Abies alba Mill. in Sp. Pl. 4(6): p 455. 1987";
1205 NonViralName
<?
> nameSpecDet10
= parser
.parseReferencedName(strSpecDetail10
, null, rankSpecies
);
1206 assertFalse(nameSpecDet10
.hasProblem());
1207 assertEquals(strSpecDetail10
, nameSpecDet10
.getFullTitleCache());
1208 assertEquals("p 455", nameSpecDet10
.getNomenclaturalMicroReference());
1211 String strSpecDetail11
= "Abies alba Mill. in Sp. Pl. 4(6): p. 455 - 457. 1987";
1212 NonViralName
<?
> nameSpecDet11
= parser
.parseReferencedName(strSpecDetail11
, null, rankSpecies
);
1213 assertTrue(nameSpecDet11
.hasProblem());
1214 list
= nameSpecDet11
.getParsingProblems();
1215 assertTrue("Problem is Detail. Must be pp.", list
.contains(ParserProblem
.CheckDetailOrYear
));
1216 assertEquals(20, nameSpecDet8
.getProblemStarts()); //TODO better start behind :
1217 assertEquals(51, nameSpecDet8
.getProblemEnds()); //TODO better stop after - 457
1220 //no volume, no edition
1221 String strNoVolume
= "Abies alba Mill., Sp. Pl.: 455. 1987";
1222 NonViralName
<?
> nameNoVolume
= parser
.parseReferencedName(strNoVolume
, null, rankSpecies
);
1223 assertFalse(nameNoVolume
.hasProblem());
1224 assertEquals(strNoVolume
, nameNoVolume
.getFullTitleCache());
1225 assertEquals(null, ((IVolumeReference
)(nameNoVolume
.getNomenclaturalReference())).getVolume());
1226 assertEquals(null, ((IBook
)nameNoVolume
.getNomenclaturalReference()).getEdition());
1228 //volume, no edition
1229 strNoVolume
= "Abies alba Mill., Sp. Pl. 2: 455. 1987";
1230 nameNoVolume
= parser
.parseReferencedName(strNoVolume
, null, rankSpecies
);
1231 assertFalse(nameNoVolume
.hasProblem());
1232 assertEquals(strNoVolume
, nameNoVolume
.getFullTitleCache());
1233 assertEquals("2", ((IVolumeReference
)(nameNoVolume
.getNomenclaturalReference())).getVolume());
1234 assertEquals(null, ((IBook
)(nameNoVolume
.getNomenclaturalReference())).getEdition());
1236 //no volume, edition
1237 strNoVolume
= "Abies alba Mill., Sp. Pl., ed. 3: 455. 1987";
1238 nameNoVolume
= parser
.parseReferencedName(strNoVolume
, null, rankSpecies
);
1239 assertFalse(nameNoVolume
.hasProblem());
1240 assertEquals(strNoVolume
, nameNoVolume
.getFullTitleCache());
1241 assertEquals(null, ((IVolumeReference
)(nameNoVolume
.getNomenclaturalReference())).getVolume());
1242 assertEquals("3", ((IBook
)(nameNoVolume
.getNomenclaturalReference())).getEdition());
1245 strNoVolume
= "Abies alba Mill., Sp. Pl. ed. 3, 4(5): 455. 1987";
1246 nameNoVolume
= parser
.parseReferencedName(strNoVolume
, null, rankSpecies
);
1247 assertFalse(nameNoVolume
.hasProblem());
1248 assertEquals(strNoVolume
.replace(" ed.", ", ed."), nameNoVolume
.getFullTitleCache());
1249 assertEquals("4(5)", ((IVolumeReference
)(nameNoVolume
.getNomenclaturalReference())).getVolume());
1250 assertEquals("3", ((IBook
)(nameNoVolume
.getNomenclaturalReference())).getEdition());
1252 String strUnparsableInRef
= "Abies alba Mill. in -er46: 455. 1987";
1253 NonViralName
<?
> nameUnparsableInRef
= parser
.parseReferencedName(strUnparsableInRef
, null, rankSpecies
);
1254 assertTrue(nameUnparsableInRef
.hasProblem());
1255 list
= nameUnparsableInRef
.getParsingProblems();
1256 assertTrue("Unparsable title", list
.contains(ParserProblem
.UnparsableReferenceTitle
));
1257 assertEquals(strUnparsableInRef
, nameUnparsableInRef
.getFullTitleCache());
1258 assertEquals(20, nameUnparsableInRef
.getProblemStarts());
1259 assertEquals(25, nameUnparsableInRef
.getProblemEnds());
1263 String strNoSeparator
= "Abies alba Mill. Sp. Pl. ed. 3, 4(5): 455. 1987";
1264 NonViralName
<?
> nameNoSeparator
= parser
.parseReferencedName(strNoSeparator
, ICNAFP
, rankSpecies
);
1265 assertTrue(nameNoSeparator
.hasProblem());
1266 list
= nameNoSeparator
.getParsingProblems();
1267 assertTrue("Problem is missing name-reference separator", list
.contains(ParserProblem
.NameReferenceSeparation
));
1268 assertEquals(strNoSeparator
, nameNoSeparator
.getFullTitleCache());
1269 assertEquals(10, nameNoSeparator
.getProblemStarts()); //TODO better start behind Mill. (?)
1270 assertEquals(47, nameNoSeparator
.getProblemEnds()); //TODO better stop before :
1272 String strUnparsableInRef2
= "Hieracium pepsicum L., My Bookkkk 1. 1903";
1273 NonViralName
<?
> nameUnparsableInRef2
= parser
.parseReferencedName(strUnparsableInRef2
, null, rankSpecies
);
1274 assertTrue(nameUnparsableInRef2
.hasProblem());
1275 list
= nameUnparsableInRef2
.getParsingProblems();
1276 assertTrue("Problem detail", list
.contains(ParserProblem
.CheckDetailOrYear
));
1277 assertEquals(strUnparsableInRef2
, nameUnparsableInRef2
.getFullTitleCache());
1278 assertEquals(23, nameUnparsableInRef2
.getProblemStarts());
1279 assertEquals(41, nameUnparsableInRef2
.getProblemEnds());
1282 String strUnparsableInRef3
= "Hieracium pespcim N., My Bookkkk 1. 1902";
1283 NonViralName
<?
> nameUnparsableInRef3
= parser
.parseReferencedName(strUnparsableInRef3
, null, null);
1284 assertTrue(nameUnparsableInRef3
.hasProblem());
1285 list
= nameUnparsableInRef3
.getParsingProblems();
1286 assertTrue("Problem detail", list
.contains(ParserProblem
.CheckDetailOrYear
));
1287 assertEquals(strUnparsableInRef3
, nameUnparsableInRef3
.getFullTitleCache());
1288 assertEquals(22, nameUnparsableInRef3
.getProblemStarts());
1289 assertEquals(40, nameUnparsableInRef3
.getProblemEnds());
1291 String strUnparsableInRef4
= "Hieracium pepsicum (Hsllreterto) L., My Bookkkk 1. 1903";
1292 NonViralName
<?
> nameUnparsableInRef4
= parser
.parseReferencedName(strUnparsableInRef4
, null, null);
1293 assertTrue(nameUnparsableInRef4
.hasProblem());
1294 list
= nameUnparsableInRef4
.getParsingProblems();
1295 assertTrue("Problem detail", list
.contains(ParserProblem
.CheckDetailOrYear
));
1296 assertEquals(strUnparsableInRef4
, nameUnparsableInRef4
.getFullTitleCache());
1297 assertEquals(37, nameUnparsableInRef4
.getProblemStarts());
1298 assertEquals(55, nameUnparsableInRef4
.getProblemEnds());
1300 String strSameName
= "Hieracium pepcum (Hsllreterto) L., My Bokkk 1. 1903";
1301 NonViralName
<?
> nameSameName
= nameUnparsableInRef4
;
1302 parser
.parseReferencedName(nameSameName
, strSameName
, null, true);
1303 assertTrue(nameSameName
.hasProblem());
1304 list
= nameSameName
.getParsingProblems();
1305 assertTrue("Problem detail", list
.contains(ParserProblem
.CheckDetailOrYear
));
1306 assertEquals(strSameName
, nameSameName
.getFullTitleCache());
1307 assertEquals(35, nameSameName
.getProblemStarts());
1308 assertEquals(51, nameSameName
.getProblemEnds());
1310 String strGenusUnparse
= "Hieracium L., jlklk";
1311 NonViralName
<?
> nameGenusUnparse
=
1312 parser
.parseReferencedName(strGenusUnparse
, null, null);
1313 assertTrue(nameGenusUnparse
.hasProblem());
1314 list
= nameGenusUnparse
.getParsingProblems();
1315 assertTrue("Problem detail", list
.contains(ParserProblem
.CheckDetailOrYear
));
1316 assertTrue("Problem uninomial", list
.contains(ParserProblem
.CheckRank
));
1317 assertEquals(strGenusUnparse
, nameGenusUnparse
.getFullTitleCache());
1318 assertEquals(0, nameGenusUnparse
.getProblemStarts());
1319 assertEquals(19, nameGenusUnparse
.getProblemEnds());
1321 String strGenusUnparse2
= "Hieracium L., Per Luigi: 44. 1987";
1322 NonViralName
<?
> nameGenusUnparse2
=
1323 parser
.parseReferencedName(strGenusUnparse2
, null, Rank
.FAMILY());
1324 assertFalse(nameGenusUnparse2
.hasProblem());
1325 assertEquals(strGenusUnparse2
, nameGenusUnparse2
.getFullTitleCache());
1326 assertEquals(-1, nameGenusUnparse2
.getProblemStarts());
1327 assertEquals(-1, nameGenusUnparse2
.getProblemEnds());
1329 String strBookSection2
= "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz, ed. 2, 2: 288. 1905-1907";
1330 String strBookSection2NoComma
= "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905-1907";
1331 NonViralName
<?
> nameBookSection2
=
1332 parser
.parseReferencedName(strBookSection2
, null, null);
1333 assertFalse(nameBookSection2
.hasProblem());
1334 nameBookSection2
.setFullTitleCache(null, false);
1335 assertEquals(strBookSection2NoComma
.replace(" ed.", ", ed."), nameBookSection2
.getFullTitleCache());
1336 assertEquals(-1, nameBookSection2
.getProblemStarts());
1337 assertEquals(-1, nameBookSection2
.getProblemEnds());
1338 assertNull((nameBookSection2
.getNomenclaturalReference()).getDatePublished().getStart());
1339 assertEquals("1905-1907", ((IBookSection
)nameBookSection2
.getNomenclaturalReference()).getInBook().getDatePublished().getYear());
1342 String strBookSection
= "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905";
1343 NonViralName
<?
> nameBookSection
=
1344 parser
.parseReferencedName(strBookSection
, null, null);
1345 assertFalse(nameBookSection
.hasProblem());
1346 assertEquals(strBookSection
.replace(" ed.", ", ed."), nameBookSection
.getFullTitleCache());
1347 assertEquals(-1, nameBookSection
.getProblemStarts());
1348 assertEquals(-1, nameBookSection
.getProblemEnds());
1349 assertNull(((IBookSection
)nameBookSection
.getNomenclaturalReference()).getInBook().getDatePublished().getStart());
1350 assertEquals("1905", ((IBookSection
)nameBookSection
.getNomenclaturalReference()).getDatePublished().getYear());
1352 String strXXXs
= "Abies alba, Soer der 1987";
1353 NonViralName
<?
> problemName
= parser
.parseReferencedName(strXXXs
, null, null);
1354 assertTrue(problemName
.hasProblem());
1355 list
= problemName
.getParsingProblems();
1356 assertTrue("Problem must be name-reference separation", list
.contains(ParserProblem
.NameReferenceSeparation
));
1357 parser
.parseReferencedName(problemName
, strBookSection
, null, true);
1358 assertFalse(problemName
.hasProblem());
1360 problemName
= parser
.parseFullName(strXXXs
, null, null);
1361 assertTrue(problemName
.hasProblem());
1362 list
= problemName
.getParsingProblems();
1363 assertTrue("Name part must be unparsable", list
.contains(ParserProblem
.UnparsableNamePart
));
1366 String testParsable
= "Pithecellobium macrostachyum Benth.";
1367 assertTrue(isParsable(testParsable
, ICNAFP
));
1369 testParsable
= "Pithecellobium macrostachyum (Benth.)";
1370 assertTrue(isParsable(testParsable
, ICNAFP
));
1372 testParsable
= "Pithecellobium macrostachyum (Benth., 1845)";
1373 assertTrue(isParsable(testParsable
, NomenclaturalCode
.ICZN
));
1375 testParsable
= "Pithecellobium macrostachyum L., Sp. Pl. 3: n\u00B0 123. 1753."; //00B0 is degree character
1376 assertTrue(isParsable(testParsable
, ICNAFP
));
1378 testParsable
= "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur. 6: 1285. 1929";
1379 assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable
, ICNAFP
));
1381 testParsable
= "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.&Eur. 6: 1285. 1929";
1382 assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable
, ICNAFP
));
1384 testParsable
= "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur.& 6: 1285. 1929";
1385 assertFalse("Reference title should not support special characters like - and & at the end of the title", isParsable(testParsable
, ICNAFP
));
1386 assertTrue("Problem must be reference title", getProblems(testParsable
, ICNAFP
).
1387 contains(ParserProblem
.UnparsableReferenceTitle
));
1389 testParsable
= "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.:Eur. 6: 1285. 1929";
1390 assertFalse("Reference title should not support detail separator", isParsable(testParsable
, ICNAFP
));
1391 assertTrue("Problem must be reference title", getProblems(testParsable
, ICNAFP
).
1392 contains(ParserProblem
.UnparsableReferenceTitle
));
1394 testParsable
= "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
1395 assertTrue("Reference title should support brackets", isParsable(testParsable
, ICNAFP
));
1397 testParsable
= "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
1398 assertTrue("Reference title should support brackets", isParsable(testParsable
, ICNAFP
));
1400 testParsable
= "Hieracium lachenalii Zahn, nom. illeg.";
1401 assertTrue("Reference should not be obligatory if a nom status exist", isParsable(testParsable
, ICNAFP
));
1403 testParsable
= "Hieracium lachenalii, nom. illeg.";
1404 assertTrue("Authorship should not be obligatory if followed by nom status", isParsable(testParsable
, ICNAFP
));
1406 testParsable
= "Hieracium lachenalii, Ill. Fl. (Mitt.) 6: 1285. 1929";
1407 assertFalse("Author is obligatory if followed by reference", isParsable(testParsable
, ICNAFP
));
1408 assertTrue("Problem must be name-reference separation", getProblems(testParsable
, ICNAFP
).
1409 contains(ParserProblem
.NameReferenceSeparation
));
1411 testParsable
= "Hieracium lachenalii in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
1412 assertFalse("Author is obligatory if followed by reference", isParsable(testParsable
, ICNAFP
));
1413 assertTrue("Problem must be name-reference separation", getProblems(testParsable
, ICNAFP
).
1414 contains(ParserProblem
.NameReferenceSeparation
));
1416 testParsable
= "Abies alba Mill. var. alba";
1417 assertTrue("Autonym problem", isParsable(testParsable
, ICNAFP
));
1419 testParsable
= "Scleroblitum abc Ulbr. in Engler & Prantl, Nat. Pflanzenfam., ed. 2, 16c: 495. 1934.";
1420 assertTrue("Volume with subdivision", isParsable(testParsable
, ICNAFP
));
1423 testParsable
= "Hieracium antarcticum d'Urv. in M\u00E9m. Soc. Linn. Paris 4: 608. 1826";
1424 // testParsable = "Hieracium antarcticum Urv. in M\u00E9m. Soc. Linn. Paris 4: 608. 1826";
1425 assertTrue("Name with apostrophe is not parsable", isParsable(testParsable
, ICNAFP
));
1427 testParsable
= "Cichorium intybus subsp. glaucum (Hoffmanns. & Link) Tzvelev in Komarov, Fl. SSSR 29: 17. 1964";
1428 assertTrue("Reference containing a word in uppercase is not parsable", isParsable(testParsable
, ICNAFP
));
1435 * Test author with name parts van, von, de, de la, d', da, del.
1436 * See also http://dev.e-taxonomy.eu/trac/ticket/3373
1439 public final void testComposedAuthorNames(){
1441 //van author (see https://dev.e-taxonomy.eu/trac/ticket/3373)
1442 String testParsable
= "Aphelocoma unicolor subsp. griscomi van Rossem, 1928";
1443 assertTrue("Author with 'van' should be parsable", isParsable(testParsable
, ICZN
));
1445 //von author (see https://dev.e-taxonomy.eu/trac/ticket/3373)
1446 testParsable
= "Aphelocoma unicolor subsp. griscomi von Rossem, 1928";
1447 assertTrue("Author with 'von' should be parsable", isParsable(testParsable
, ICZN
));
1449 //de author (see https://dev.e-taxonomy.eu/trac/ticket/3373)
1450 testParsable
= "Aphelocoma unicolor subsp. griscomi de Rossem, 1928";
1451 assertTrue("Author with 'de' should be parsable", isParsable(testParsable
, ICZN
));
1453 //de la author (see https://dev.e-taxonomy.eu/trac/ticket/3373)
1454 testParsable
= "Aphelocoma unicolor subsp. griscomi de la Rossem, 1928";
1455 assertTrue("Author with 'de la' should be parsable", isParsable(testParsable
, ICZN
));
1457 //d' author (see https://dev.e-taxonomy.eu/trac/ticket/3373)
1458 testParsable
= "Aphelocoma unicolor subsp. griscomi d'Rossem, 1928";
1459 assertTrue("Author with \"'d'\" should be parsable", isParsable(testParsable
, ICZN
));
1461 //da author (see https://dev.e-taxonomy.eu/trac/ticket/3373)
1462 testParsable
= "Aphelocoma unicolor subsp. griscomi da Rossem, 1928";
1463 assertTrue("Author with 'da' should be parsable", isParsable(testParsable
, ICZN
));
1465 //del author (see https://dev.e-taxonomy.eu/trac/ticket/3373)
1466 testParsable
= "Aphelocoma unicolor subsp. griscomi del Rossem, 1928";
1467 assertTrue("Author with 'del' should be parsable", isParsable(testParsable
, ICZN
));
1469 //O' author (see https://dev.e-taxonomy.eu/trac/ticket/4759)
1470 testParsable
= "Aphelocoma unicolor subsp. griscomi O'Connor, 1928";
1471 assertTrue("Author with 'O'' should be parsable", isParsable(testParsable
, ICZN
));
1473 //del author (see https://dev.e-taxonomy.eu/trac/ticket/4759)
1474 testParsable
= "Aphelocoma unicolor subsp. griscomi zur Strassen, 1928";
1475 assertTrue("Author with 'zur' should be parsable", isParsable(testParsable
, ICZN
));
1482 * @param testParsable
1486 private List
<ParserProblem
> getProblems(String string
, NomenclaturalCode code
) {
1487 List
<ParserProblem
> result
;
1488 result
= parser
.parseReferencedName(string
, code
, null).getParsingProblems();
1492 private boolean isParsable(String string
, NomenclaturalCode code
){
1493 NonViralName
<?
> name
= parser
.parseReferencedName(string
, code
, null);
1494 return ! name
.hasProblem();
1497 private void assertFullRefNameStandard(NonViralName
<?
> name
){
1498 assertEquals("Abies", name
.getGenusOrUninomial());
1499 assertEquals("alba", name
.getSpecificEpithet());
1500 assertEquals("Mill.", name
.getAuthorshipCache());
1501 assertEquals("455", name
.getNomenclaturalMicroReference());
1502 assertNotNull(name
.getNomenclaturalReference());
1505 private void assertFullRefStandard(NonViralName
<?
> name
){
1506 assertEquals("Abies", name
.getGenusOrUninomial());
1507 assertEquals("alba", name
.getSpecificEpithet());
1508 assertEquals("Mill.", name
.getAuthorshipCache());
1509 assertEquals("455", name
.getNomenclaturalMicroReference());
1510 assertNotNull(name
.getNomenclaturalReference());
1511 INomenclaturalReference ref
= name
.getNomenclaturalReference();
1512 assertEquals("1987", ref
.getYear());
1513 assertEquals("Sp. Pl.", ref
.getAbbrevTitle());
1518 public void testNeverEndingParsing(){
1519 //some full titles result in never ending parsing process https://dev.e-taxonomy.eu/trac/ticket/1556
1521 String irinaExample
= "Milichiidae Sharp, 1899, Insects. Part II. Hymenopteracontinued (Tubulifera and Aculeata), Coleoptera, Strepsiptera, Lepidoptera, Diptera, Aphaniptera, Thysanoptera, Hemiptera, Anoplura 6: 504. 1899";
1522 // irinaExample = "Milichiidae Sharp, 1899, Insects. Part II. Uiuis Iuiui Hymenopteracontinued (Tubulifera and Aculeata), Coleoptera, Strepsiptera, Lepidoptera, Diptera, Aphaniptera, Thysanoptera, Hemiptera, Anoplura 6: 504. 1899";
1523 NonViralName
<?
> nvn
= this.parser
.parseReferencedName(irinaExample
, NomenclaturalCode
.ICZN
, null);
1524 int parsingProblem
= nvn
.getParsingProblem();
1525 Assert
.assertEquals("Name should have only rank warning", 1, parsingProblem
);
1526 Assert
.assertEquals("Titlecache", "Milichiidae Sharp, 1899", nvn
.getTitleCache());
1527 Assert
.assertEquals("If this line reached everything should be ok", "Milichiidae", nvn
.getGenusOrUninomial());
1529 String anotherExample
= "Scorzonera hispanica var. brevifolia Boiss. & Balansa in Boissier, Diagn. Pl. Orient., ser. 2 6: 119. 1859.";
1530 nvn
= this.parser
.parseReferencedName(anotherExample
, ICNAFP
, null);
1531 parsingProblem
= nvn
.getParsingProblem();
1532 Assert
.assertEquals("Problem should be 0", 0, parsingProblem
);
1533 Assert
.assertEquals("Titlecache", "Scorzonera hispanica var. brevifolia Boiss. & Balansa", nvn
.getTitleCache());
1534 Assert
.assertEquals("If this line reached everything should be ok", "Scorzonera", nvn
.getGenusOrUninomial());
1536 String unparsable
= "Taraxacum nevskii L., Trudy Bot. Inst. Nauk S.S.S.R., Ser. 1, Fl. Sist. Vyssh. Rast. 4: 293. 1937.";
1537 // String unparsableA = "Taraxacum nevskii L. in Trudy Bot. Inst. Nauk: 293. 1937.";
1538 nvn
= this.parser
.parseReferencedName(unparsable
, ICNAFP
, null);
1539 Assert
.assertEquals("Titlecache", "Taraxacum nevskii L.", nvn
.getTitleCache());
1540 Assert
.assertEquals("If this line reached everything should be ok", "Taraxacum", nvn
.getGenusOrUninomial());
1541 parsingProblem
= nvn
.getParsingProblem();
1542 Assert
.assertEquals("Name should no warnings or errors", 0, parsingProblem
);
1544 String unparsable2
= "Hieracium pxxx Dahlst., Kongl. Svenska Vetensk. Acad. Handl. ser. 2, 26(3): 255. 1894";
1545 // String unparsable2A = "Hieracium pxxx Dahlst., Kongl Svenska Vetensk Acad Handl, 26: 255. 1894.";
1546 nvn
= this.parser
.parseReferencedName(unparsable2
, ICNAFP
, null);
1547 Assert
.assertEquals("Titlecache", "Hieracium pxxx Dahlst.", nvn
.getTitleCache());
1548 Assert
.assertEquals("If this line reached everything should be ok", "Hieracium", nvn
.getGenusOrUninomial());
1549 parsingProblem
= nvn
.getParsingProblem();
1550 Assert
.assertEquals("Name should no warnings or errors", 0, parsingProblem
);
1553 String again
= "Adiantum emarginatum Bory ex. Willd., Species Plantarum, ed. 4,5,1: 449,450. 1810";
1554 nvn
= this.parser
.parseReferencedName(again
, ICNAFP
, null);
1555 Assert
.assertEquals("Titlecache", "Adiantum emarginatum Bory ex Willd.", nvn
.getTitleCache());
1556 Assert
.assertEquals("If this line reached everything should be ok", "Adiantum", nvn
.getGenusOrUninomial());
1561 public final void testSeriesPart(){
1562 Pattern seriesPattern
= Pattern
.compile(NonViralNameParserImplRegExBase
.pSeriesPart
);
1563 Matcher matcher
= seriesPattern
.matcher("ser. 2");
1564 Assert
.assertTrue("", matcher
.matches());
1568 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#fullTeams(java.lang.String)}.
1571 public final void testFullTeams() {
1572 logger
.warn("Not yet implemented"); // TODO
1576 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#AuthorshipAndEx(java.lang.String)}.
1577 * @throws StringNotParsableException
1580 public final void testParseAuthorsTaxonNameString() throws StringNotParsableException
{
1581 NonViralName
<?
> nvn
= ZoologicalName
.NewInstance(null);
1582 parser
.parseAuthors(nvn
, "Eckweiler & ten Hagen, 2003");
1583 Team team
= (Team
)nvn
.getCombinationAuthorship();
1584 Assert
.assertNotNull("Comb. author must not be null", team
);
1585 Assert
.assertEquals("Must be team with 2 members", 2, team
.getTeamMembers().size());
1586 Assert
.assertEquals("Second member must be 'ten Hagen'", "ten Hagen", team
.getTeamMembers().get(1).getTitleCache());
1588 //Crosson du Cormier, 1964
1589 ZoologicalName zooName
= ZoologicalName
.NewInstance(null);
1590 parser
.parseAuthors(zooName
, "Crosson du Cormier, 1964");
1591 Person person
= (Person
)zooName
.getCombinationAuthorship();
1592 Assert
.assertNotNull("Comb. author must not be null", person
);
1593 Assert
.assertEquals("Persons title must be 'Crosson du Cormier'", "Crosson du Cormier", person
.getTitleCache());
1594 Assert
.assertEquals("Year must be 1964", Integer
.valueOf(1964), zooName
.getPublicationYear() );
1596 //(van der Hoeven, 1839)
1597 zooName
= ZoologicalName
.NewInstance(null);
1598 parser
.parseAuthors(zooName
, "(van der Hoeven, 1839)");
1599 Assert
.assertNull("Combination author must be null", zooName
.getCombinationAuthorship());
1600 person
= (Person
)zooName
.getBasionymAuthorship();
1601 Assert
.assertNotNull("Basionym author must not be null", person
);
1602 Assert
.assertEquals("Persons title must be 'van der Hoeven'", "van der Hoeven", person
.getTitleCache());
1603 Assert
.assertEquals("Year must be 1839", Integer
.valueOf(1839), zooName
.getOriginalPublicationYear() );
1606 zooName
= ZoologicalName
.NewInstance(null);
1607 parser
.parseAuthors(zooName
, "le Doux, 1931");
1608 person
= (Person
)zooName
.getCombinationAuthorship();
1609 Assert
.assertNotNull("Comb. author must not be null", person
);
1610 Assert
.assertEquals("Persons title must be 'le Doux'", "le Doux", person
.getTitleCache());
1611 Assert
.assertEquals("Year must be 1931", Integer
.valueOf(1931), zooName
.getPublicationYear() );
1617 public void testParseSection(){
1618 //this test does not really test problematic cases where sect.idInVoc = "sect." instead of "sect.(bot.)"
1619 //however, by changing the csv file entry to sect. just for testing it can be used as a functional test
1620 String sectionNameStr
= "Taraxacum sect. Testtaxa M\u00fcller, Incredible Taxa: 12. 2016";
1621 NonViralName
<?
> sectionName
= parser
.parseReferencedName(sectionNameStr
, NomenclaturalCode
.ICNAFP
, null);
1622 int parsingProblem
= sectionName
.getParsingProblem();
1623 Assert
.assertEquals("Problem should be 0", 0, parsingProblem
);
1624 Rank rank
= sectionName
.getRank();
1625 Assert
.assertEquals("", Rank
.SECTION_BOTANY(), rank
);
1630 public final void testLongRunningParsingCapitals(){
1631 DateTime start
= DateTime
.now();
1632 String nameStr
= "Nazeris fujianensis JIAYAO HU, LIZHEN LI, MEIJUN ZHAO,2010"; //name from CoL that created problems
1633 NonViralName
<?
> name
= parser
.parseReferencedName(nameStr
, NomenclaturalCode
.ICZN
, null);
1634 DateTime end
= DateTime
.now();
1635 Duration duration
= new Duration(start
, end
);
1636 long seconds
= duration
.getStandardSeconds();
1637 //this is the critical part of the test that must not be changed
1638 Assert
.assertTrue("Parsing of name should take less then 3 seconds but took " + seconds
, seconds
< 3);
1643 //http://www.regular-expressions.info/catastrophic.html
1644 public final void testLongRunningParsing(){
1647 String nameStr
= "Dictyocoela berillonum R.S. Terry, J.E. Sm., R.G. Sharpe, T. Rigaud, D.T.J. Littlewood, J.E. Ironside, D. Rollinson & D. Bou";
1648 DateTime start
= DateTime
.now();
1649 NonViralName
<?
> name
= parser
.parseReferencedName(nameStr
, NomenclaturalCode
.ICNAFP
, null);
1650 DateTime end
= DateTime
.now();
1651 Duration duration
= new Duration(start
, end
);
1652 long seconds
= duration
.getStandardSeconds();
1653 //this is the critical part of the test that must not be changed
1654 Assert
.assertTrue("Parsing of name should take less then 3 seconds but took " + seconds
, seconds
< 3);
1655 //the following may be discussed
1656 Assert
.assertFalse("Name should parse without problems",name
.hasProblem());
1660 nameStr
= "Dictyocoela berillonum R.S. Terry, J.E. Sm., R.G. Sharpe, T. Rigaud, D.T.J. Littlewood, J.E. Ironside, D. Rollinson & D. Bou in Species Fauna Atlantica Of Blues Animals 3: p.345. 1758.";
1661 start
= DateTime
.now();
1662 name
= parser
.parseReferencedName(nameStr
, NomenclaturalCode
.ICNAFP
, null);
1663 end
= DateTime
.now();
1664 duration
= new Duration(start
, end
);
1665 seconds
= duration
.getStandardSeconds();
1666 //this is the critical part of the test that must not be changed
1667 Assert
.assertTrue("Parsing of name should take less then 3 seconds but took " + seconds
, seconds
< 3);
1668 //the following may be discussed
1669 Assert
.assertFalse("Name should parse without problems",name
.hasProblem());
1673 public final void testLongRunningParsingAuthors(){
1674 //http://www.regular-expressions.info/catastrophic.html
1676 //Länge des Nachnamens macht keinen Unterschied
1677 //Anzahl der "AuthorParts scheint entscheidend
1678 // & am Ende macht es langsamger (16s), als nur ","(6s))
1680 String authorStr
= "R.S. Terry J.E. Sm. R.G. Sharpe T. Rigaud T.H. Rigseaud D.T. Li, R.G. Sharpe, T. Rigaud, D.T.J. Littlewood & D. Bou";
1681 TeamOrPersonBase
[] authorArray
= new TeamOrPersonBase
[4];
1683 DateTime start
= DateTime
.now();
1684 parser
.fullAuthors(authorStr
, authorArray
, new Integer
[]{1800, null, null, null}, BotanicalName
.class);
1685 DateTime end
= DateTime
.now();
1686 Duration duration
= new Duration(start
, end
);
1687 long seconds
= duration
.getStandardSeconds();
1688 // System.out.println(seconds);
1689 //this is the critical part of the test that must not be changed
1690 Assert
.assertTrue("Parsing of name should take less then 3 seconds but took " + seconds
, seconds
< 3);
1691 } catch (StringNotParsableException e
) {
1692 e
.printStackTrace();
1693 Assert
.fail("Authors should be parsable");
1700 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#AuthorshipAndEx(java.lang.String)}.
1703 public final void testAuthorshipAndEx() {
1704 logger
.warn("Not yet implemented"); // TODO
1708 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#Authorship(java.lang.String)}.
1711 public final void testAuthorship() {
1712 logger
.warn("Not yet implemented"); // TODO
1716 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseCultivar(java.lang.String)}.
1719 public final void testParseCultivar() {
1720 logger
.warn("Not yet implemented"); // TODO
1724 public final void testNomenclaturalStatus() {
1725 BotanicalName name
= BotanicalName
.NewInstance(Rank
.FAMILY(), "Acanthopale", null, null, null, null, null, null, null);
1726 name
.addStatus(NomenclaturalStatus
.NewInstance(NomenclaturalStatusType
.ALTERNATIVE()));
1727 BotanicalName name2
= BotanicalName
.NewInstance(Rank
.FAMILY());
1728 parser
.parseReferencedName(name2
, name
.getFullTitleCache(), name2
.getRank(), true);
1729 parser
.parseReferencedName(name2
, name
.getFullTitleCache(), name2
.getRank(), true);
1730 Assert
.assertEquals("Title cache should be same. No duplication of nom. status should take place", name
.getFullTitleCache(), name2
.getFullTitleCache());
1734 public final void testSpecificAuthors(){
1736 NonViralName
<?
> name
= parser
.parseFullName("Psidium longipes var. orbiculare (O.Berg) McVaugh");
1737 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1738 TeamOrPersonBase
<?
> combinationAuthor
= name
.getCombinationAuthorship();
1739 assertEquals( "McVaugh", combinationAuthor
.getNomenclaturalTitle());
1740 TeamOrPersonBase
<?
> basionymAuthor
= name
.getBasionymAuthorship();
1741 assertEquals( "O.Berg", basionymAuthor
.getNomenclaturalTitle());
1743 // Campanula rhodensis A. DC.
1748 public final void testExistingProblems(){
1749 //Canabio, issue with space
1750 NonViralName
<?
> name
= parser
.parseReferencedName("Machaonia erythrocarpa var. hondurensis (Standl.) Borhidi"
1751 + " in Acta Bot. Hung. 46 (1-2): 30. 2004");
1752 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1753 TeamOrPersonBase
<?
> combinationAuthor
= name
.getCombinationAuthorship();
1754 assertEquals( "Borhidi", combinationAuthor
.getNomenclaturalTitle());
1755 Reference nomRef
= (Reference
)name
.getNomenclaturalReference();
1756 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1757 assertEquals("46 (1-2)", nomRef
.getVolume());
1759 //Canabio, detail with fig.
1760 name
= parser
.parseReferencedName("Didymaea floribunda Rzed."
1761 + " in Bol. Soc. Bot. Mex. 44: 72, fig. 1. 1983");
1762 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1763 combinationAuthor
= name
.getCombinationAuthorship();
1764 assertEquals( "Rzed.", combinationAuthor
.getNomenclaturalTitle());
1765 nomRef
= (Reference
)name
.getNomenclaturalReference();
1766 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1767 assertEquals("44", nomRef
.getVolume());
1768 assertEquals("72, fig. 1", name
.getNomenclaturalMicroReference());
1770 //fig with a-c and without dot
1771 name
= parser
.parseReferencedName("Deppea guerrerensis Dwyer & Lorence"
1772 + " in Allertonia 4: 428. fig 4a-c. 1988"); //
1773 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1774 combinationAuthor
= name
.getCombinationAuthorship();
1775 assertEquals( "Dwyer & Lorence", combinationAuthor
.getNomenclaturalTitle());
1776 nomRef
= (Reference
)name
.getNomenclaturalReference();
1777 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1778 assertEquals("4", nomRef
.getVolume());
1779 assertEquals("428. fig 4a-c", name
.getNomenclaturalMicroReference());
1781 //issue with EN_DASH (3–4)
1782 name
= parser
.parseReferencedName("Arachnothryx tacanensis (Lundell) Borhidi"
1783 + " in Acta Bot. Hung. 33 (3" + UTF8
.EN_DASH
+ "4): 303. 1987");
1784 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1785 combinationAuthor
= name
.getCombinationAuthorship();
1786 assertEquals( "Borhidi", combinationAuthor
.getNomenclaturalTitle());
1787 nomRef
= (Reference
)name
.getNomenclaturalReference();
1788 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1789 assertEquals("33 (3" + UTF8
.EN_DASH
+ "4)", nomRef
.getVolume());
1790 assertEquals("303", name
.getNomenclaturalMicroReference());
1793 name
= parser
.parseReferencedName("Stenotis Terrell"
1794 + " in Sida 19(4): 901" + UTF8
.EN_DASH
+ "911, f. 1" + UTF8
.EN_DASH
+ "2. 2001");
1795 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1796 combinationAuthor
= name
.getCombinationAuthorship();
1797 assertEquals( "Terrell", combinationAuthor
.getNomenclaturalTitle());
1798 nomRef
= (Reference
)name
.getNomenclaturalReference();
1799 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1800 assertEquals("19(4)", nomRef
.getVolume());
1801 assertEquals("901" + UTF8
.EN_DASH
+ "911, f. 1" + UTF8
.EN_DASH
+ "2", name
.getNomenclaturalMicroReference());
1804 name
= parser
.parseReferencedName("Randia sonorensis Wiggins"
1805 + " in Contr. Dudley Herb. 3: 75, figs 4-6. 1940");
1806 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1807 combinationAuthor
= name
.getCombinationAuthorship();
1808 assertEquals( "Wiggins", combinationAuthor
.getNomenclaturalTitle());
1809 nomRef
= (Reference
)name
.getNomenclaturalReference();
1810 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1811 assertEquals("3", nomRef
.getVolume());
1812 assertEquals("75, figs 4-6", name
.getNomenclaturalMicroReference());
1814 //detail with pl. and figs
1815 name
= parser
.parseReferencedName("Randia sonorensis Wiggins"
1816 + " in Contr. Dudley Herb. 3: 75, pl. 19, figs 4-6. 1940");
1817 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1818 combinationAuthor
= name
.getCombinationAuthorship();
1819 assertEquals( "Wiggins", combinationAuthor
.getNomenclaturalTitle());
1820 nomRef
= (Reference
)name
.getNomenclaturalReference();
1821 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1822 assertEquals("3", nomRef
.getVolume());
1823 assertEquals("75, pl. 19, figs 4-6", name
.getNomenclaturalMicroReference());
1827 name
= parser
.parseReferencedName("Carapichea Aubl."
1828 + " in Hist. Pl. Guiane 1: 167, pl. 64. 1775");
1829 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1830 combinationAuthor
= name
.getCombinationAuthorship();
1831 assertEquals( "Aubl.", combinationAuthor
.getNomenclaturalTitle());
1832 nomRef
= (Reference
)name
.getNomenclaturalReference();
1833 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1834 assertEquals("1", nomRef
.getVolume());
1835 assertEquals("167, pl. 64", name
.getNomenclaturalMicroReference());
1838 name
= parser
.parseReferencedName("Hoffmannia ixtlanensis Lorence"
1839 + " in Novon 4: 121. fig. 2a, b. 1994");
1840 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1841 combinationAuthor
= name
.getCombinationAuthorship();
1842 assertEquals( "Lorence", combinationAuthor
.getNomenclaturalTitle());
1843 nomRef
= (Reference
)name
.getNomenclaturalReference();
1844 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1845 assertEquals("4", nomRef
.getVolume());
1846 assertEquals("121. fig. 2a, b", name
.getNomenclaturalMicroReference());
1848 //detail with , to number
1849 name
= parser
.parseReferencedName("Deppea martinez-calderonii Lorence"
1850 + " in Allertonia 4: 399. figs 1e, 2. 1988");
1851 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1852 combinationAuthor
= name
.getCombinationAuthorship();
1853 assertEquals( "Lorence", combinationAuthor
.getNomenclaturalTitle());
1854 nomRef
= (Reference
)name
.getNomenclaturalReference();
1855 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1856 assertEquals("4", nomRef
.getVolume());
1857 assertEquals("399. figs 1e, 2", name
.getNomenclaturalMicroReference());
1860 name
= parser
.parseReferencedName("Manettia costaricensis Wernham"
1861 + " in J. Bot. 57(Suppl.): 38. 1919");
1862 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1863 combinationAuthor
= name
.getCombinationAuthorship();
1864 assertEquals( "Wernham", combinationAuthor
.getNomenclaturalTitle());
1865 nomRef
= (Reference
)name
.getNomenclaturalReference();
1866 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1867 assertEquals("57(Suppl.)", nomRef
.getVolume());
1868 assertEquals("38", name
.getNomenclaturalMicroReference());
1871 name
= parser
.parseReferencedName("Crusea psyllioides (Kunth) W.R. Anderson"
1872 + " in Mem. NY. Bot. Gard. 22: 75. 1972");
1873 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1874 combinationAuthor
= name
.getCombinationAuthorship();
1875 assertEquals( "W.R. Anderson", combinationAuthor
.getNomenclaturalTitle());
1876 nomRef
= (Reference
)name
.getNomenclaturalReference();
1877 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1878 assertEquals("22", nomRef
.getVolume());
1879 assertEquals("75", name
.getNomenclaturalMicroReference());
1881 //apostroph word in title
1882 name
= parser
.parseReferencedName("Sabicea glabrescens Benth."
1883 + " in Hooker's J. Bot. Kew Gard. Misc. 3: 219. 1841");
1884 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1885 combinationAuthor
= name
.getCombinationAuthorship();
1886 assertEquals( "Benth.", combinationAuthor
.getNomenclaturalTitle());
1887 nomRef
= (Reference
)name
.getNomenclaturalReference();
1888 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1889 assertEquals("3", nomRef
.getVolume());
1890 assertEquals("219", name
.getNomenclaturalMicroReference());
1892 // place published e.g. (Hannover)
1893 name
= parser
.parseReferencedName("Pittoniotis trichantha Griseb."
1894 + " in Bonplandia (Hannover) 6 (1): 8. 1858");
1895 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1896 combinationAuthor
= name
.getCombinationAuthorship();
1897 assertEquals( "Griseb.", combinationAuthor
.getNomenclaturalTitle());
1898 nomRef
= (Reference
)name
.getNomenclaturalReference();
1899 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1900 assertEquals("6 (1)", nomRef
.getVolume());
1901 assertEquals("8", name
.getNomenclaturalMicroReference());
1903 //komplex / incorrect year without quotation marks
1904 name
= parser
.parseReferencedName("Javorkaea Borhidi & Jarai-Koml."
1905 + " in Acta Bot. Hung. 29(1\u20134): 16, f. 1\u20132, t. 1-8. 1983 [1984]");
1906 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1907 combinationAuthor
= name
.getCombinationAuthorship();
1908 assertEquals( "Borhidi & Jarai-Koml.", combinationAuthor
.getNomenclaturalTitle());
1909 nomRef
= (Reference
)name
.getNomenclaturalReference();
1910 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1911 assertEquals("29(1\u20134)", nomRef
.getVolume());
1912 assertEquals("16, f. 1\u20132, t. 1-8", name
.getNomenclaturalMicroReference());
1913 assertEquals("1983 [1984]", nomRef
.getDatePublishedString());
1914 assertEquals("1984", nomRef
.getYear());
1916 //incorrect year with \u201e \u201f (s. eu.etaxonomy.cdm.common.UTF8.ENGLISH_QUOT_START
1917 name
= parser
.parseReferencedName("Javorkaea Borhidi & Jarai-Koml."
1918 + " in Acta Bot. Hung. 29(1-4): 16, f. 1-2. \u201e1983\u201f [1984]");
1919 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1920 combinationAuthor
= name
.getCombinationAuthorship();
1921 assertEquals( "Borhidi & Jarai-Koml.", combinationAuthor
.getNomenclaturalTitle());
1922 nomRef
= (Reference
)name
.getNomenclaturalReference();
1923 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1924 assertEquals("29(1-4)", nomRef
.getVolume());
1925 assertEquals("16, f. 1-2", name
.getNomenclaturalMicroReference());
1926 assertEquals("\u201e1983\u201f [1984]", nomRef
.getDatePublishedString());
1927 assertEquals("1984", nomRef
.getYear());
1929 //incorrect year with "
1930 name
= parser
.parseReferencedName("Javorkaea Borhidi & Jarai-Koml."
1931 + " in Acta Bot. Hung. 29(1-4): 16, f. 1-2. \"1983\" [1984]");
1932 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1933 combinationAuthor
= name
.getCombinationAuthorship();
1934 assertEquals( "Borhidi & Jarai-Koml.", combinationAuthor
.getNomenclaturalTitle());
1935 nomRef
= (Reference
)name
.getNomenclaturalReference();
1936 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1937 assertEquals("29(1-4)", nomRef
.getVolume());
1938 assertEquals("16, f. 1-2", name
.getNomenclaturalMicroReference());
1939 assertEquals("\"1983\" [1984]", nomRef
.getDatePublishedString());
1940 assertEquals("1984", nomRef
.getYear());
1943 name
= parser
.parseReferencedName("Psychotria capitata Ruiz & Pav."
1944 + " in Fl. Peruv. 2: 59, pl. 206, fig. a. 1799");
1945 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1946 combinationAuthor
= name
.getCombinationAuthorship();
1947 assertEquals( "Ruiz & Pav.", combinationAuthor
.getNomenclaturalTitle());
1948 nomRef
= (Reference
)name
.getNomenclaturalReference();
1949 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1950 assertEquals("2", nomRef
.getVolume());
1951 assertEquals("59, pl. 206, fig. a", name
.getNomenclaturalMicroReference());
1954 name
= parser
.parseReferencedName("Rogiera elegans Planch."
1955 + " in Fl. Serres Jard. Eur. 5: 442A. 1849");
1956 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1957 combinationAuthor
= name
.getCombinationAuthorship();
1958 assertEquals( "Planch.", combinationAuthor
.getNomenclaturalTitle());
1959 nomRef
= (Reference
)name
.getNomenclaturalReference();
1960 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1961 assertEquals("5", nomRef
.getVolume());
1962 assertEquals("442A", name
.getNomenclaturalMicroReference());
1965 name
= parser
.parseReferencedName("Coussarea imitans L.O. Williams"
1966 + " in Phytologia 26 (6): 488-489, f. 1973");
1967 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1968 combinationAuthor
= name
.getCombinationAuthorship();
1969 assertEquals( "L.O. Williams", combinationAuthor
.getNomenclaturalTitle());
1970 nomRef
= (Reference
)name
.getNomenclaturalReference();
1971 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1972 assertEquals("26 (6)", nomRef
.getVolume());
1973 assertEquals("488-489, f", name
.getNomenclaturalMicroReference());
1976 name
= parser
.parseReferencedName("Coccocypselum cordifolium Nees & Mart."
1977 + " in Nova Acta Phys.-Med. Acad. Caes.\u2013Leop. Nat. Cur. 12: 14. 1824");
1978 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
1979 combinationAuthor
= name
.getCombinationAuthorship();
1980 assertEquals( "Nees & Mart.", combinationAuthor
.getNomenclaturalTitle());
1981 nomRef
= (Reference
)name
.getNomenclaturalReference();
1982 assertEquals(ReferenceType
.Article
, nomRef
.getType());
1983 assertEquals("Nova Acta Phys.-Med. Acad. Caes.\u2013Leop. Nat. Cur.", nomRef
.getInReference().getAbbrevTitle());
1984 assertEquals("12", nomRef
.getVolume());
1985 assertEquals("14", name
.getNomenclaturalMicroReference());
1986 assertEquals("1824", nomRef
.getYear());
1989 // Syst. Nat. (ed. 10) 2: 930. 1759
1990 // name = parser.parseReferencedName("Erithalis fruticosa L."
1991 // + ", Syst. Nat. ed. 10, 2: 930. 1759");
1992 // Assert.assertFalse("Name should be parsable", name.isProtectedTitleCache());
1993 // combinationAuthor = name.getCombinationAuthorship();
1994 // assertEquals( "L.", combinationAuthor.getNomenclaturalTitle());
1995 // nomRef = (Reference)name.getNomenclaturalReference();
1996 // assertEquals(ReferenceType.Book, nomRef.getType());
1997 // assertEquals("2", nomRef.getVolume());
1998 // assertEquals("10", nomRef.getEdition());
1999 // assertEquals("930", name.getNomenclaturalMicroReference());
2000 // assertEquals("1759", nomRef.getYear());
2002 //issue with letter "(1a)"
2003 name
= parser
.parseReferencedName("Arthraerua (Kuntze) Schinz,"
2004 + " Nat. Pflanzenfam. 3(1a): 109. 1893");
2005 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
2006 combinationAuthor
= name
.getCombinationAuthorship();
2007 assertEquals( "Schinz", combinationAuthor
.getNomenclaturalTitle());
2008 nomRef
= (Reference
)name
.getNomenclaturalReference();
2009 Assert
.assertFalse("Reference should be parsable", nomRef
.isProtectedTitleCache());
2010 assertEquals(ReferenceType
.Book
, nomRef
.getType());
2011 assertEquals("Nat. Pflanzenfam.", nomRef
.getAbbrevTitle());
2012 assertEquals("3(1a)", nomRef
.getVolume());
2013 assertEquals("109", name
.getNomenclaturalMicroReference());
2014 assertEquals("1893", nomRef
.getYear());
2016 //Accent graph in author name #6057
2017 name
= parser
.parseReferencedName("Sedum plicatum O`Brian");
2018 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
2019 assertEquals( "O`Brian", name
.getCombinationAuthorship().getNomenclaturalTitle());
2022 name
= parser
.parseReferencedName("Thamniopsis stenodictyon (Sehnem) Oliveira-e-Silva & O.Yano");
2023 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
2024 Team team
= (Team
)name
.getCombinationAuthorship();
2025 assertEquals( "Oliveira-e-Silva", team
.getTeamMembers().get(0).getNomenclaturalTitle());
2028 name
= parser
.parseReferencedName("Ophrys hystera Kreutz & Ruedi Peter in J. Eur. Orchideen 30(Vorabdr.): 128. 1997");
2029 Assert
.assertFalse("Name should be parsable", name
.isProtectedTitleCache());
2030 assertEquals( "30(Vorabdr.)", ((Reference
)name
.getNomenclaturalReference()).getVolume());
2032 /* test case disabled, would fail! This is not due to the '´t' it rather might be caused by the & in the basionym authors
2033 // Sempervivum globiferum subsp. allionii (Jord. & Fourr.) ´t Hart & Bleij
2034 name = parser.parseReferencedName("Sempervivum globiferum subsp. allionii (Jord. & Fourr.) ´t Hart & Bleij");
2035 Assert.assertFalse("Name should be parsable", name.isProtectedTitleCache());