Solved an issue where a reference with an uppercase word (e.g. SSSR) was not parsable
[cdmlib.git] / cdmlib-model / src / test / java / eu / etaxonomy / cdm / strategy / parser / NonViralNameParserImplTest.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.cdm.strategy.parser;
11
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;
17
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;
23
24 import junit.framework.Assert;
25
26 import org.apache.log4j.Logger;
27 import org.junit.After;
28 import org.junit.AfterClass;
29 import org.junit.Before;
30 import org.junit.BeforeClass;
31 import org.junit.Test;
32
33 import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;
34 import eu.etaxonomy.cdm.model.agent.Team;
35 import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;
36 import eu.etaxonomy.cdm.model.name.BotanicalName;
37 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
38 import eu.etaxonomy.cdm.model.name.NonViralName;
39 import eu.etaxonomy.cdm.model.name.Rank;
40 import eu.etaxonomy.cdm.model.name.ZoologicalName;
41 //import eu.etaxonomy.cdm.model.reference.Article;
42 //import eu.etaxonomy.cdm.model.reference.Book;
43 //import eu.etaxonomy.cdm.model.reference.BookSection;
44 import eu.etaxonomy.cdm.model.reference.IArticle;
45 import eu.etaxonomy.cdm.model.reference.IBook;
46 import eu.etaxonomy.cdm.model.reference.IBookSection;
47 import eu.etaxonomy.cdm.model.reference.IJournal;
48 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
49 import eu.etaxonomy.cdm.model.reference.IVolumeReference;
50 import eu.etaxonomy.cdm.model.reference.ReferenceType;
51 //import eu.etaxonomy.cdm.model.reference.Journal;
52 import eu.etaxonomy.cdm.model.reference.Reference;
53 /**
54 * @author a.mueller
55 *
56 */
57 public class NonViralNameParserImplTest {
58 private static final Logger logger = Logger.getLogger(NonViralNameParserImplTest.class);
59
60 final private String strNameFamily = "Asteraceae";
61 final private String strNameGenus = "Abies Mueller";
62 final private String strNameGenusUnicode = "Abies M\u00FCller";
63 final private String strNameAbies1 = "Abies alba";
64 final private String strNameAbiesSub1 = "Abies alba subsp. beta";
65 final private String strNameAbiesAuthor1 = "Abies alba Mueller";
66 final private String strNameAbiesAuthor1Unicode = "Abies alba M\u00FCller";
67 final private String strNameAbiesBasionymAuthor1 = "Abies alba (Ciardelli) D'Mueller";
68 final private String strNameAbiesBasionymAuthor1Unicode = "Abies alba (Ciardelli) D'M\u00FCller";
69 final private String strNameAbiesBasionymExAuthor1 ="Abies alba (Ciardelli ex Doering) D'Mueller ex. de Greuther";
70 final private String strNameAbiesBasionymExAuthor1Unicode ="Abies alba (Ciardelli ex D\u00F6ring) D'M\u00FCller ex. de Greuther";
71 final private String strNameTeam1 = "Abies alba Mueller & L.";
72 final private String strNameZoo1 = "Abies alba Mueller & L., 1822";
73 final private String strNameZoo2 = "Abies alba (Mueller, 1822) Ciardelli, 2002";
74
75 final private String strNameEmpty = "";
76 final private String strNameNull = null;
77
78 private NonViralNameParserImpl parser ;
79 private NomenclaturalCode botanicCode;
80
81 /**
82 * @throws java.lang.Exception
83 */
84 @BeforeClass
85 public static void setUpBeforeClass() throws Exception {
86 DefaultTermInitializer termInitializer = new DefaultTermInitializer();
87 termInitializer.initialize();
88 }
89
90
91 /**
92 * @throws java.lang.Exception
93 */
94 @Before
95 public void setUp() throws Exception {
96 parser = NonViralNameParserImpl.NewInstance();
97 botanicCode = NomenclaturalCode.ICBN;
98 }
99
100
101 /*************** TEST *********************************************/
102
103 /**
104 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#NEW_INSTANCE()}.
105 */
106 @Test
107 public final void testNewInstance() {
108 assertNotNull(parser);
109 }
110
111 /**
112 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#TaxonNameParserBotanicalNameImpl()}.
113 */
114 @Test
115 public final void testTaxonNameParserBotanicalNameImpl() {
116 logger.warn("Not yet implemented"); // TODO
117 }
118
119 /**
120 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSimpleName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
121 */
122 @Test
123 public final void testParseSimpleName() {
124
125 //Uninomials
126 ZoologicalName milichiidae = (ZoologicalName)parser.parseSimpleName("Milichiidae", NomenclaturalCode.ICZN, null);
127 assertEquals("Family rank expected", Rank.FAMILY(), milichiidae.getRank());
128 BotanicalName crepidinae = (BotanicalName)parser.parseSimpleName("Crepidinae", NomenclaturalCode.ICBN, null);
129 assertEquals("Family rank expected", Rank.SUBTRIBE(), crepidinae.getRank());
130 BotanicalName abies = (BotanicalName)parser.parseSimpleName("Abies", NomenclaturalCode.ICBN, null);
131 assertEquals("Family rank expected", Rank.GENUS(), abies.getRank());
132
133 abies.addParsingProblem(ParserProblem.CheckRank);
134 parser.parseSimpleName(abies, "Abies", abies.getRank(), true);
135 assertTrue(abies.getParsingProblems().contains(ParserProblem.CheckRank));
136
137 BotanicalName rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);
138 assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));
139 assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));
140 parser.parseSimpleName(rosa, "Rosaceaex", abies.getRank(), true);
141 assertEquals("Rosaceaex have rank genus", Rank.GENUS(), rosa.getRank());
142 assertTrue("Rosaceaex must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));
143
144 //repeat but remove warning after first parse
145 rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);
146 assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));
147 assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));
148 rosa.removeParsingProblem(ParserProblem.CheckRank);
149 parser.parseSimpleName(rosa, "Rosaceaex", rosa.getRank(), true);
150 assertEquals("Rosaceaex have rank family", Rank.FAMILY(), rosa.getRank());
151 assertFalse("Rosaceaex must have no rank warning", rosa.hasProblem(ParserProblem.CheckRank));
152
153
154 }
155
156 /**
157 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSubGenericFullName(java.lang.String)}.
158 */
159 @Test
160 public final void testParseSubGenericFullName() {
161 logger.warn("Not yet implemented"); // TODO
162 }
163
164 /**
165 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSubGenericSimpleName(java.lang.String)}.
166 */
167 @Test
168 public final void testParseSubGenericSimpleName() {
169 logger.warn("Not yet implemented"); // TODO
170 }
171
172 /**
173 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
174 */
175 @Test
176 public final void testParseFullNameUnicode() {
177
178 NonViralName nameAuthor = parser.parseFullName(strNameAbiesAuthor1Unicode, null, Rank.SPECIES());
179 assertEquals("Abies", nameAuthor.getGenusOrUninomial());
180 assertEquals("alba", nameAuthor.getSpecificEpithet());
181 assertEquals("M\u00FCller", nameAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
182
183 NonViralName nameBasionymAuthor = parser.parseFullName(strNameAbiesBasionymAuthor1Unicode, null, Rank.SPECIES());
184 assertEquals("Abies", nameBasionymAuthor.getGenusOrUninomial());
185 assertEquals("alba", nameBasionymAuthor.getSpecificEpithet());
186 assertEquals("D'M\u00FCller", nameBasionymAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
187 INomenclaturalAuthor basionymTeam = nameBasionymAuthor.getBasionymAuthorTeam();
188 assertEquals("Ciardelli", basionymTeam.getNomenclaturalTitle());
189
190 NonViralName nameBasionymExAuthor = parser.parseFullName(strNameAbiesBasionymExAuthor1Unicode, null, Rank.SPECIES());
191 assertEquals("Abies", nameBasionymExAuthor.getGenusOrUninomial());
192 assertEquals("alba", nameBasionymExAuthor.getSpecificEpithet());
193 assertEquals("D'M\u00FCller", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());
194 assertEquals("de Greuther", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
195 INomenclaturalAuthor basionymTeam2 = nameBasionymExAuthor.getExBasionymAuthorTeam();
196 assertEquals("Ciardelli", basionymTeam2.getNomenclaturalTitle());
197 INomenclaturalAuthor exBasionymTeam2 = nameBasionymExAuthor.getBasionymAuthorTeam();
198 assertEquals("D\u00F6ring", exBasionymTeam2.getNomenclaturalTitle());
199
200 BotanicalName nameBasionymExAuthor2 = (BotanicalName)parser.parseFullName("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", null, Rank.SPECIES());
201 assertEquals("Washingtonia", nameBasionymExAuthor2.getGenusOrUninomial());
202 assertEquals("filifera", nameBasionymExAuthor2.getSpecificEpithet());
203 assertEquals("H.Wendl.", nameBasionymExAuthor2.getExCombinationAuthorTeam().getNomenclaturalTitle());
204 assertEquals("de Bary", nameBasionymExAuthor2.getCombinationAuthorTeam().getNomenclaturalTitle());
205 INomenclaturalAuthor basionymTeam3 = nameBasionymExAuthor2.getBasionymAuthorTeam();
206 assertEquals("Andre", basionymTeam3.getNomenclaturalTitle());
207 INomenclaturalAuthor exBasionymTeam3 = nameBasionymExAuthor2.getExBasionymAuthorTeam();
208 assertEquals("Linden", exBasionymTeam3.getNomenclaturalTitle());
209 String title = nameBasionymExAuthor2.generateTitle();
210 assertEquals("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", title);
211
212 }
213
214
215 /**
216 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
217 */
218 @Test
219 public final void testParseFullName() {
220 try {
221 Method parseMethod = parser.getClass().getDeclaredMethod("parseFullName", String.class, NomenclaturalCode.class, Rank.class);
222 testName_StringNomcodeRank(parseMethod);
223 } catch (Exception e) {
224 e.printStackTrace();
225 assertTrue(false);
226 }
227
228 //Team
229 NonViralName nameTeam1 = parser.parseFullName(strNameTeam1);
230 assertEquals( "Abies", nameTeam1.getGenusOrUninomial());
231 assertEquals( "alba", nameTeam1.getSpecificEpithet());
232 assertEquals("Mueller & L.", nameTeam1.getCombinationAuthorTeam().getNomenclaturalTitle());
233 assertTrue(nameTeam1.getCombinationAuthorTeam() instanceof Team);
234 Team team = (Team)nameTeam1.getCombinationAuthorTeam();
235 assertEquals("Mueller", team.getTeamMembers().get(0).getNomenclaturalTitle());
236 assertEquals("L.", team.getTeamMembers().get(1).getNomenclaturalTitle());
237
238 //ZooName
239 ZoologicalName nameZoo1 = (ZoologicalName)parser.parseFullName(strNameZoo1);
240 assertEquals( "Abies", nameZoo1.getGenusOrUninomial());
241 assertEquals( "alba", nameZoo1.getSpecificEpithet());
242 assertEquals("Mueller & L.", nameZoo1.getCombinationAuthorTeam().getNomenclaturalTitle());
243 assertEquals(NomenclaturalCode.ICZN, nameZoo1.getNomenclaturalCode() );
244 assertEquals(Integer.valueOf(1822), nameZoo1.getPublicationYear());
245 assertTrue(nameZoo1.getCombinationAuthorTeam() instanceof Team);
246 Team teamZoo = (Team)nameZoo1.getCombinationAuthorTeam();
247 assertEquals("Mueller", teamZoo.getTeamMembers().get(0).getNomenclaturalTitle());
248 assertEquals("L.", teamZoo.getTeamMembers().get(1).getNomenclaturalTitle());
249
250 ZoologicalName nameZoo2 = (ZoologicalName)parser.parseFullName(strNameZoo2);
251 assertEquals(Integer.valueOf(2002), nameZoo2.getPublicationYear());
252 assertEquals(Integer.valueOf(1822), nameZoo2.getOriginalPublicationYear());
253 assertEquals("Mueller", nameZoo2.getBasionymAuthorTeam().getNomenclaturalTitle());
254 assertEquals("Ciardelli", nameZoo2.getCombinationAuthorTeam().getNomenclaturalTitle());
255
256 //Autonym
257 BotanicalName autonymName = (BotanicalName)parser.parseFullName("Abies alba Mill. var. alba", NomenclaturalCode.ICBN, null);
258 assertFalse("Autonym should be parsable", autonymName.hasProblem());
259
260
261 //empty
262 NonViralName nameEmpty = parser.parseFullName(strNameEmpty);
263 assertNotNull(nameEmpty);
264 assertEquals("", nameEmpty.getTitleCache());
265
266 //null
267 NonViralName nameNull = parser.parseFullName(strNameNull);
268 assertNull(nameNull);
269
270 //some authors
271 String fullNameString = "Abies alba (Greuther & L'Hiver & al. ex M\u00FCller & Schmidt)Clark ex Ciardelli";
272 BotanicalName authorname = (BotanicalName)parser.parseFullName(fullNameString);
273 assertFalse(authorname.hasProblem());
274 assertEquals("Basionym author should have 3 authors", 3, ((Team)authorname.getExBasionymAuthorTeam()).getTeamMembers().size());
275 }
276
277 /**
278 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
279 */
280 @Test
281 public final void testHybrids() {
282 try {
283 Method parseMethod = parser.getClass().getDeclaredMethod("parseFullName", String.class, NomenclaturalCode.class, Rank.class);
284 testName_StringNomcodeRank(parseMethod);
285 } catch (Exception e) {
286 e.printStackTrace();
287 assertTrue(false);
288 }
289
290 //Species hybrid
291 // NonViralName nameTeam1 = parser.parseFullName("Aegilops \u00D7insulae-cypri H. Scholz");
292 NonViralName name1 = parser.parseFullName("Aegilops \u00D7insulae Scholz", botanicCode, null);
293 assertTrue("Name must have binom hybrid bit set", name1.isBinomHybrid());
294 assertFalse("Name must not have monom hybrid bit set", name1.isMonomHybrid());
295 assertFalse("Name must not have trinom hybrid bit set", name1.isTrinomHybrid());
296 assertEquals("Species epithet must be 'insulae'", "insulae", name1.getSpecificEpithet());
297
298 //Uninomial hybrid
299 name1 = parser.parseFullName("x Aegilops Scholz", botanicCode, null);
300 assertTrue("Name must have monom hybrid bit set", name1.isMonomHybrid());
301 assertFalse("Name must not have binom hybrid bit set", name1.isBinomHybrid());
302 assertFalse("Name must not have trinom hybrid bit set", name1.isTrinomHybrid());
303 assertEquals("Uninomial must be 'Aegilops'", "Aegilops", name1.getGenusOrUninomial());
304
305 //Species hybrid
306 name1 = parser.parseFullName("Aegilops insulae subsp. X abies Scholz", botanicCode, null);
307 assertFalse("Name must not have monom hybrid bit set", name1.isMonomHybrid());
308 assertFalse("Name must not have binom hybrid bit set", name1.isBinomHybrid());
309 assertTrue("Name must have trinom hybrid bit set", name1.isTrinomHybrid());
310 assertEquals("Infraspecific epithet must be 'abies'", "abies", name1.getInfraSpecificEpithet());
311
312 }
313
314 private void testName_StringNomcodeRank(Method parseMethod)
315 throws InvocationTargetException, IllegalAccessException {
316 NonViralName name1 = (NonViralName)parseMethod.invoke(parser, strNameAbies1, null, Rank.SPECIES());
317 //parser.parseFullName(strNameAbies1, null, Rank.SPECIES());
318 assertEquals("Abies", name1.getGenusOrUninomial());
319 assertEquals("alba", name1.getSpecificEpithet());
320
321 NonViralName nameAuthor = (NonViralName)parseMethod.invoke(parser, strNameAbiesAuthor1, null, Rank.SPECIES());
322 assertEquals("Abies", nameAuthor.getGenusOrUninomial());
323 assertEquals("alba", nameAuthor.getSpecificEpithet());
324 assertEquals("Mueller", nameAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
325
326 NonViralName nameBasionymAuthor = (NonViralName)parseMethod.invoke(parser, strNameAbiesBasionymAuthor1, null, Rank.SPECIES());
327 assertEquals("Abies", nameBasionymAuthor.getGenusOrUninomial());
328 assertEquals("alba", nameBasionymAuthor.getSpecificEpithet());
329 assertEquals("D'Mueller", nameBasionymAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
330 assertEquals("Ciardelli", nameBasionymAuthor.getBasionymAuthorTeam().getNomenclaturalTitle());
331
332 NonViralName nameBasionymExAuthor = (NonViralName)parseMethod.invoke(parser, strNameAbiesBasionymExAuthor1, null, Rank.SPECIES());
333 assertEquals("Abies", nameBasionymExAuthor.getGenusOrUninomial());
334 assertEquals("alba", nameBasionymExAuthor.getSpecificEpithet());
335 assertEquals("D'Mueller", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());
336 assertEquals("de Greuther", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
337 assertEquals("Ciardelli", nameBasionymExAuthor.getExBasionymAuthorTeam().getNomenclaturalTitle());
338 assertEquals("Doering", nameBasionymExAuthor.getBasionymAuthorTeam().getNomenclaturalTitle());
339
340 NonViralName name2 = (NonViralName)parseMethod.invoke(parser, strNameAbiesSub1, null, Rank.SPECIES());
341 assertEquals("Abies", name2.getGenusOrUninomial());
342 assertEquals("alba", name2.getSpecificEpithet());
343 assertEquals("beta", name2.getInfraSpecificEpithet());
344 assertEquals(Rank.SUBSPECIES(), name2.getRank());
345
346
347 // unparseable *********
348 String problemString = "sdfjlös wer eer wer";
349 NonViralName<?> nameProblem = (NonViralName<?>)parseMethod.invoke(parser, problemString, null, Rank.SPECIES());
350 List<ParserProblem> list = nameProblem.getParsingProblems();
351 assertTrue(nameProblem.getParsingProblem()!=0);
352 assertEquals(problemString, nameProblem.getTitleCache());
353 }
354
355 /**
356 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseReferencedName(NonViralName, java.lang.String, eu.etaxonomy.cdm.model.name.Rank, boolean)(, )}.
357 */
358 @Test
359 public final void testParseReferencedName() {
360 try {
361 Method parseMethod = parser.getClass().getDeclaredMethod("parseReferencedName", String.class, NomenclaturalCode.class, Rank.class);
362 testName_StringNomcodeRank(parseMethod);
363 } catch (Exception e) {
364 e.printStackTrace();
365 assertTrue(false);
366 }
367
368
369 //null
370 String strNull = null;
371 NonViralName<?> nameNull = parser.parseReferencedName(strNull, null, Rank.SPECIES());
372 assertNull(nameNull);
373
374 //Empty
375 String strEmpty = "";
376 NonViralName<?> nameEmpty = parser.parseReferencedName(strEmpty, null, Rank.SPECIES());
377 assertFalse(nameEmpty.hasProblem());
378 assertEquals(strEmpty, nameEmpty.getFullTitleCache());
379 assertNull(nameEmpty.getNomenclaturalMicroReference());
380
381
382 //Whitespaces
383 String strFullWhiteSpcaceAndDot = "Abies alba Mill., Sp. Pl. 4: 455 . 1987 .";
384 NonViralName<?> namefullWhiteSpcaceAndDot = parser.parseReferencedName(strFullWhiteSpcaceAndDot, null, Rank.SPECIES());
385 assertFullRefStandard(namefullWhiteSpcaceAndDot);
386 assertTrue(((Reference)namefullWhiteSpcaceAndDot.getNomenclaturalReference()).getType().equals(eu.etaxonomy.cdm.model.reference.ReferenceType.Book));
387 assertEquals( "Abies alba Mill., Sp. Pl. 4: 455. 1987", namefullWhiteSpcaceAndDot.getFullTitleCache());
388
389 //Book
390 String fullReference = "Abies alba Mill., Sp. Pl. 4: 455. 1987";
391 NonViralName<?> name1 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
392 assertFullRefStandard(name1);
393 assertTrue(((Reference)name1.getNomenclaturalReference()).getType().equals(eu.etaxonomy.cdm.model.reference.ReferenceType.Book));
394 assertEquals(fullReference, name1.getFullTitleCache());
395 assertTrue("Name author and reference author should be the same", name1.getCombinationAuthorTeam() == ((Reference)name1.getNomenclaturalReference()).getAuthorTeam());
396
397 //Book Section
398 fullReference = "Abies alba Mill. in Otto, Sp. Pl. 4(6): 455. 1987";
399 NonViralName<?> name2 = parser.parseReferencedName(fullReference + ".", null, Rank.SPECIES());
400 assertFullRefNameStandard(name2);
401 assertEquals(fullReference, name2.getFullTitleCache());
402 assertFalse(name2.hasProblem());
403 INomenclaturalReference ref = name2.getNomenclaturalReference();
404 assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.BookSection, ((Reference)ref).getType());
405 IBookSection bookSection = (IBookSection) ref;
406 IBook inBook = bookSection.getInBook();
407 assertNotNull(inBook);
408 assertNotNull(inBook.getAuthorTeam());
409 assertEquals("Otto", inBook.getAuthorTeam().getTitleCache());
410 assertEquals("Otto, Sp. Pl. 4(6)", inBook.getTitleCache());
411 assertEquals("Sp. Pl.", inBook.getTitle());
412 assertEquals("4(6)", inBook.getVolume());
413 assertTrue("Name author and reference author should be the same", name2.getCombinationAuthorTeam() == ((Reference)name2.getNomenclaturalReference()).getAuthorTeam());
414
415 //Article
416 fullReference = "Abies alba Mill. in Sp. Pl. 4(6): 455. 1987";
417 NonViralName<?> name3 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
418 assertFullRefNameStandard(name3);
419 assertEquals(fullReference, name3.getFullTitleCache());
420 assertFalse(name3.hasProblem());
421 ref = name3.getNomenclaturalReference();
422 assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.Article, ref.getType());
423 //Article article = (Article)ref;
424 IJournal journal = ((IArticle)ref).getInJournal();
425 assertNotNull(journal);
426 //assertEquals("Sp. Pl. 4(6)", inBook.getTitleCache());
427 assertEquals("Sp. Pl.",((Reference) journal).getTitleCache());
428 assertEquals("Sp. Pl.", journal.getTitle());
429 assertEquals("4(6)",((IArticle)ref).getVolume());
430 assertTrue("Name author and reference author should be the same", name3.getCombinationAuthorTeam() == name3.getNomenclaturalReference().getAuthorTeam());
431
432 //SoftArticle - having "," on position > 4
433 String journalTitle = "Bull. Soc. Bot.France. Louis., Roi";
434 String yearPart = " 1987 - 1989";
435 String parsedYear = "1987-1989";
436 String fullReferenceWithoutYear = "Abies alba Mill. in " + journalTitle + " 4(6): 455.";
437 fullReference = fullReferenceWithoutYear + yearPart;
438 String fullReferenceWithEnd = fullReference + ".";
439 NonViralName<?> name4 = parser.parseReferencedName(fullReferenceWithEnd, null, Rank.SPECIES());
440 assertFalse(name4.hasProblem());
441 assertFullRefNameStandard(name4);
442 assertEquals(fullReferenceWithoutYear + " " + parsedYear, name4.getFullTitleCache());
443 ref = name4.getNomenclaturalReference();
444 assertEquals(ReferenceType.Article, ref.getType());
445 //article = (Article)ref;
446 assertEquals(parsedYear, ref.getYear());
447 journal = ((IArticle)ref).getInJournal();
448 assertNotNull(journal);
449 assertEquals(journalTitle, ((Reference) journal).getTitleCache());
450 assertEquals(journalTitle, journal.getTitle());
451 assertEquals("4(6)", ((IArticle)ref).getVolume());
452
453 //Zoo name
454 String strNotParsableZoo = "Abies alba M., 1923, Sp. P. xxwer4352, nom. inval.";
455 ZoologicalName nameZooRefNotParsabel = (ZoologicalName)parser.parseReferencedName(strNotParsableZoo, null, null);
456 assertTrue(nameZooRefNotParsabel.hasProblem());
457 List<ParserProblem> list = nameZooRefNotParsabel.getParsingProblems();
458 assertTrue("List must contain detail and year warning ", list.contains(ParserProblem.CheckDetailOrYear));
459 assertEquals(21, nameZooRefNotParsabel.getProblemStarts());
460 assertEquals(37, nameZooRefNotParsabel.getProblemEnds());
461 assertTrue(nameZooRefNotParsabel.getNomenclaturalReference().hasProblem());
462 list = nameZooRefNotParsabel.getNomenclaturalReference().getParsingProblems();
463 assertTrue("List must contain detail and year warning ", list.contains(ParserProblem.CheckDetailOrYear));
464
465 assertEquals(NomenclaturalCode.ICZN, nameZooRefNotParsabel.getNomenclaturalCode());
466 assertEquals(Integer.valueOf(1923), nameZooRefNotParsabel.getPublicationYear());
467 assertEquals(1, nameZooRefNotParsabel.getStatus().size());
468
469 String strZooNameSineYear = "Homo sapiens L., 1758, Sp. An. 3: 345";
470 ZoologicalName nameZooNameSineYear = (ZoologicalName)parser.parseReferencedName(strZooNameSineYear);
471 assertFalse(nameZooNameSineYear.hasProblem());
472 assertEquals("Name without reference year must have year", (Integer)1758, nameZooNameSineYear.getPublicationYear());
473 assertEquals("Name without reference year must have year", "1758", nameZooNameSineYear.getNomenclaturalReference().getYear());
474
475 String strZooNameNewCombination = "Homo sapiens (L., 1758) Mill., 1830, Sp. An. 3: 345";
476 ZoologicalName nameZooNameNewCombination = (ZoologicalName)parser.parseReferencedName(strZooNameNewCombination);
477 assertTrue(nameZooNameNewCombination.hasProblem());
478 list = nameZooNameNewCombination.getParsingProblems();
479 assertTrue("List must contain new combination has publication warning ", list.contains(ParserProblem.NewCombinationHasPublication));
480 assertEquals(35, nameZooNameNewCombination.getProblemStarts());
481 assertEquals(51, nameZooNameNewCombination.getProblemEnds());
482
483
484 //Special MicroRefs
485 String strSpecDetail1 = "Abies alba Mill. in Sp. Pl. 4(6): [455]. 1987";
486 NonViralName<?> nameSpecDet1 = parser.parseReferencedName(strSpecDetail1 + ".", null, Rank.SPECIES());
487 assertFalse(nameSpecDet1.hasProblem());
488 assertEquals(strSpecDetail1, nameSpecDet1.getFullTitleCache());
489 assertEquals("[455]", nameSpecDet1.getNomenclaturalMicroReference());
490
491 //Special MicroRefs
492 String strSpecDetail2 = "Abies alba Mill. in Sp. Pl. 4(6): couv. 2. 1987";
493 NonViralName<?> nameSpecDet2 = parser.parseReferencedName(strSpecDetail2 + ".", null, Rank.SPECIES());
494 assertFalse(nameSpecDet2.hasProblem());
495 assertEquals(strSpecDetail2, nameSpecDet2.getFullTitleCache());
496 assertEquals("couv. 2", nameSpecDet2.getNomenclaturalMicroReference());
497
498 //Special MicroRefs
499 String strSpecDetail3 = "Abies alba Mill. in Sp. Pl. 4(6): fig. 455. 1987";
500 NonViralName<?> nameSpecDet3 = parser.parseReferencedName(strSpecDetail3 + ".", null, Rank.SPECIES());
501 assertFalse(nameSpecDet3.hasProblem());
502 assertEquals(strSpecDetail3, nameSpecDet3.getFullTitleCache());
503 assertEquals("fig. 455", nameSpecDet3.getNomenclaturalMicroReference());
504
505 //Special MicroRefs
506 String strSpecDetail4 = "Abies alba Mill. in Sp. Pl. 4(6): fig. 455-567. 1987";
507 fullReference = strSpecDetail4 + ".";
508 NonViralName<?> nameSpecDet4 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
509 assertFalse(nameSpecDet4.hasProblem());
510 assertEquals(strSpecDetail4, nameSpecDet4.getFullTitleCache());
511 assertEquals("fig. 455-567", nameSpecDet4.getNomenclaturalMicroReference());
512
513
514 //Special MicroRefs
515 String strSpecDetail5 = "Abies alba Mill. in Sp. Pl. 4(6): Gard n\u00B0 4. 1987";
516 fullReference = strSpecDetail5 + ".";
517 NonViralName<?> nameSpecDet5 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
518 assertFalse(nameSpecDet5.hasProblem());
519 assertEquals(strSpecDetail5, nameSpecDet5.getFullTitleCache());
520 assertEquals("Gard n\u00B0 4", nameSpecDet5.getNomenclaturalMicroReference());
521
522 //Special MicroRefs
523 String strSpecDetail6 = "Abies alba Mill. in Sp. Pl. 4(6): 455a. 1987";
524 fullReference = strSpecDetail6 + ".";
525 NonViralName<?> nameSpecDet6 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
526 assertFalse(nameSpecDet6.hasProblem());
527 assertEquals(strSpecDetail6, nameSpecDet6.getFullTitleCache());
528 assertEquals("455a", nameSpecDet6.getNomenclaturalMicroReference());
529
530 //Special MicroRefs
531 String strSpecDetail7 = "Abies alba Mill. in Sp. Pl. 4(6): pp.455-457. 1987";
532 fullReference = strSpecDetail7 + ".";
533 NonViralName<?> nameSpecDet7 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
534 assertFalse(nameSpecDet7.hasProblem());
535 assertEquals(strSpecDetail7, nameSpecDet7.getFullTitleCache());
536 assertEquals("pp.455-457", nameSpecDet7.getNomenclaturalMicroReference());
537
538 //Special MicroRefs
539 String strSpecDetail8 = "Abies alba Mill. in Sp. Pl. 4(6): ppp.455-457. 1987";
540 NonViralName<?> nameSpecDet8 = parser.parseReferencedName(strSpecDetail8, null, Rank.SPECIES());
541 assertTrue(nameSpecDet8.hasProblem());
542 assertEquals(20, nameSpecDet8.getProblemStarts()); //TODO better start behind :
543 assertEquals(51, nameSpecDet8.getProblemEnds()); //TODO better stop after -457
544
545
546 //Special MicroRefs
547 String strSpecDetail9 = "Abies alba Mill. in Sp. Pl. 4(6): pp. 455 - 457. 1987";
548 NonViralName<?> nameSpecDet9 = parser.parseReferencedName(strSpecDetail9, null, Rank.SPECIES());
549 assertFalse(nameSpecDet9.hasProblem());
550 assertEquals(strSpecDetail9, nameSpecDet9.getFullTitleCache());
551 assertEquals("pp. 455 - 457", nameSpecDet9.getNomenclaturalMicroReference());
552
553 //Special MicroRefs
554 String strSpecDetail10 = "Abies alba Mill. in Sp. Pl. 4(6): p 455. 1987";
555 NonViralName<?> nameSpecDet10 = parser.parseReferencedName(strSpecDetail10, null, Rank.SPECIES());
556 assertFalse(nameSpecDet10.hasProblem());
557 assertEquals(strSpecDetail10, nameSpecDet10.getFullTitleCache());
558 assertEquals("p 455", nameSpecDet10.getNomenclaturalMicroReference());
559
560 //Special MicroRefs
561 String strSpecDetail11 = "Abies alba Mill. in Sp. Pl. 4(6): p. 455 - 457. 1987";
562 NonViralName<?> nameSpecDet11 = parser.parseReferencedName(strSpecDetail11, null, Rank.SPECIES());
563 assertTrue(nameSpecDet11.hasProblem());
564 list = nameSpecDet11.getParsingProblems();
565 assertTrue("Problem is Detail. Must be pp.", list.contains(ParserProblem.CheckDetailOrYear));
566 assertEquals(20, nameSpecDet8.getProblemStarts()); //TODO better start behind :
567 assertEquals(51, nameSpecDet8.getProblemEnds()); //TODO better stop after - 457
568
569
570 //no volume, no edition
571 String strNoVolume = "Abies alba Mill., Sp. Pl.: 455. 1987";
572 NonViralName<?> nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
573 assertFalse(nameNoVolume.hasProblem());
574 assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
575 assertEquals(null, ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
576 assertEquals(null, ((IBook)nameNoVolume.getNomenclaturalReference()).getEdition());
577
578 //volume, no edition
579 strNoVolume = "Abies alba Mill., Sp. Pl. 2: 455. 1987";
580 nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
581 assertFalse(nameNoVolume.hasProblem());
582 assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
583 assertEquals("2", ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
584 assertEquals(null, ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());
585
586 //no volume, edition
587 strNoVolume = "Abies alba Mill., Sp. Pl. ed. 3: 455. 1987";
588 nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
589 assertFalse(nameNoVolume.hasProblem());
590 assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
591 assertEquals(null, ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
592 assertEquals("3", ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());
593
594 //volume, edition
595 strNoVolume = "Abies alba Mill., Sp. Pl. ed. 3, 4(5): 455. 1987";
596 nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
597 assertFalse(nameNoVolume.hasProblem());
598 assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
599 assertEquals("4(5)", ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
600 assertEquals("3", ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());
601
602 String strUnparsableInRef = "Abies alba Mill. in -er46: 455. 1987";
603 NonViralName<?> nameUnparsableInRef = parser.parseReferencedName(strUnparsableInRef, null, Rank.SPECIES());
604 assertTrue(nameUnparsableInRef.hasProblem());
605 list = nameUnparsableInRef.getParsingProblems();
606 assertTrue("Unparsable title", list.contains(ParserProblem.UnparsableReferenceTitle));
607 assertEquals(strUnparsableInRef, nameUnparsableInRef.getFullTitleCache());
608 assertEquals(20, nameUnparsableInRef.getProblemStarts());
609 assertEquals(25, nameUnparsableInRef.getProblemEnds());
610
611
612 //volume, edition
613 String strNoSeparator = "Abies alba Mill. Sp. Pl. ed. 3, 4(5): 455. 1987";
614 NonViralName<?> nameNoSeparator = parser.parseReferencedName(strNoSeparator, NomenclaturalCode.ICBN, Rank.SPECIES());
615 assertTrue(nameNoSeparator.hasProblem());
616 list = nameNoSeparator.getParsingProblems();
617 assertTrue("Problem is missing name-reference separator", list.contains(ParserProblem.NameReferenceSeparation));
618 assertEquals(strNoSeparator, nameNoSeparator.getFullTitleCache());
619 assertEquals(10, nameNoSeparator.getProblemStarts()); //TODO better start behind Mill. (?)
620 assertEquals(47, nameNoSeparator.getProblemEnds()); //TODO better stop before :
621
622 String strUnparsableInRef2 = "Hieracium pepsicum L., My Bookkkk 1. 1903";
623 NonViralName<?> nameUnparsableInRef2 = parser.parseReferencedName(strUnparsableInRef2, null, Rank.SPECIES());
624 assertTrue(nameUnparsableInRef2.hasProblem());
625 list = nameUnparsableInRef2.getParsingProblems();
626 assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
627 assertEquals(strUnparsableInRef2, nameUnparsableInRef2.getFullTitleCache());
628 assertEquals(23, nameUnparsableInRef2.getProblemStarts());
629 assertEquals(41, nameUnparsableInRef2.getProblemEnds());
630
631
632 String strUnparsableInRef3 = "Hieracium pespcim N., My Bookkkk 1. 1902";
633 NonViralName<?> nameUnparsableInRef3 = parser.parseReferencedName(strUnparsableInRef3, null, null);
634 assertTrue(nameUnparsableInRef3.hasProblem());
635 list = nameUnparsableInRef3.getParsingProblems();
636 assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
637 assertEquals(strUnparsableInRef3, nameUnparsableInRef3.getFullTitleCache());
638 assertEquals(22, nameUnparsableInRef3.getProblemStarts());
639 assertEquals(40, nameUnparsableInRef3.getProblemEnds());
640
641 String strUnparsableInRef4 = "Hieracium pepsicum (Hsllreterto) L., My Bookkkk 1. 1903";
642 NonViralName<?> nameUnparsableInRef4 = parser.parseReferencedName(strUnparsableInRef4, null, null);
643 assertTrue(nameUnparsableInRef4.hasProblem());
644 list = nameUnparsableInRef4.getParsingProblems();
645 assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
646 assertEquals(strUnparsableInRef4, nameUnparsableInRef4.getFullTitleCache());
647 assertEquals(37, nameUnparsableInRef4.getProblemStarts());
648 assertEquals(55, nameUnparsableInRef4.getProblemEnds());
649
650 String strSameName = "Hieracium pepcum (Hsllreterto) L., My Bokkk 1. 1903";
651 NonViralName<?> nameSameName = nameUnparsableInRef4;
652 parser.parseReferencedName(nameSameName, strSameName, null, true);
653 assertTrue(nameSameName.hasProblem());
654 list = nameSameName.getParsingProblems();
655 assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
656 assertEquals(strSameName, nameSameName.getFullTitleCache());
657 assertEquals(35, nameSameName.getProblemStarts());
658 assertEquals(51, nameSameName.getProblemEnds());
659
660 String strGenusUnparse = "Hieracium L., jlklk";
661 NonViralName<?> nameGenusUnparse =
662 parser.parseReferencedName(strGenusUnparse, null, null);
663 assertTrue(nameGenusUnparse.hasProblem());
664 list = nameGenusUnparse.getParsingProblems();
665 assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
666 assertTrue("Problem uninomial", list.contains(ParserProblem.CheckRank));
667 assertEquals(strGenusUnparse, nameGenusUnparse.getFullTitleCache());
668 assertEquals(0, nameGenusUnparse.getProblemStarts());
669 assertEquals(19, nameGenusUnparse.getProblemEnds());
670
671 String strGenusUnparse2 = "Hieracium L., Per Luigi: 44. 1987";
672 NonViralName<?> nameGenusUnparse2 =
673 parser.parseReferencedName(strGenusUnparse2, null, Rank.FAMILY());
674 assertFalse(nameGenusUnparse2.hasProblem());
675 assertEquals(strGenusUnparse2, nameGenusUnparse2.getFullTitleCache());
676 assertEquals(-1, nameGenusUnparse2.getProblemStarts());
677 assertEquals(-1, nameGenusUnparse2.getProblemEnds());
678
679 String strBookSection2 = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz, ed. 2, 2: 288. 1905-1907";
680 String strBookSection2NoComma = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905-1907";
681 NonViralName<?> nameBookSection2 =
682 parser.parseReferencedName(strBookSection2, null, null);
683 assertFalse(nameBookSection2.hasProblem());
684 assertEquals(strBookSection2NoComma, nameBookSection2.getFullTitleCache());
685 assertEquals(-1, nameBookSection2.getProblemStarts());
686 assertEquals(-1, nameBookSection2.getProblemEnds());
687 assertNull((nameBookSection2.getNomenclaturalReference()).getDatePublished().getStart());
688 assertEquals("1905-1907", ((IBookSection)nameBookSection2.getNomenclaturalReference()).getInBook().getDatePublished().getYear());
689
690
691 String strBookSection = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905";
692 NonViralName<?> nameBookSection =
693 parser.parseReferencedName(strBookSection, null, null);
694 assertFalse(nameBookSection.hasProblem());
695 assertEquals(strBookSection, nameBookSection.getFullTitleCache());
696 assertEquals(-1, nameBookSection.getProblemStarts());
697 assertEquals(-1, nameBookSection.getProblemEnds());
698 assertNull(((IBookSection)nameBookSection.getNomenclaturalReference()).getInBook().getDatePublished().getStart());
699 assertEquals("1905", ((IBookSection)nameBookSection.getNomenclaturalReference()).getDatePublished().getYear());
700
701 String strXXXs = "Abies alba, Soer der 1987";
702 NonViralName<?> problemName = parser.parseReferencedName(strXXXs, null, null);
703 assertTrue(problemName.hasProblem());
704 list = problemName.getParsingProblems();
705 assertTrue("Problem must be name-reference separation", list.contains(ParserProblem.NameReferenceSeparation));
706 parser.parseReferencedName(problemName, strBookSection, null, true);
707 assertFalse(problemName.hasProblem());
708
709 problemName = parser.parseFullName(strXXXs, null, null);
710 assertTrue(problemName.hasProblem());
711 list = problemName.getParsingProblems();
712 assertTrue("Name part must be unparsable", list.contains(ParserProblem.UnparsableNamePart));
713
714
715 String testParsable = "Pithecellobium macrostachyum Benth.";
716 assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));
717
718 testParsable = "Pithecellobium macrostachyum (Benth.)";
719 assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));
720
721 testParsable = "Pithecellobium macrostachyum (Benth., 1845)";
722 assertTrue(isParsable(testParsable, NomenclaturalCode.ICZN));
723
724 testParsable = "Pithecellobium macrostachyum L., Sp. Pl. 3: n\u00B0 123. 1753."; //00B0 is degree character
725 assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));
726
727 testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur. 6: 1285. 1929";
728 assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable, NomenclaturalCode.ICBN));
729
730 testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.&Eur. 6: 1285. 1929";
731 assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable, NomenclaturalCode.ICBN));
732
733 testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur.& 6: 1285. 1929";
734 assertFalse("Reference title should not support special characters like - and & at the end of the title", isParsable(testParsable, NomenclaturalCode.ICBN));
735 assertTrue("Problem must be reference title", getProblems(testParsable, NomenclaturalCode.ICBN).
736 contains(ParserProblem.UnparsableReferenceTitle));
737
738 testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.:Eur. 6: 1285. 1929";
739 assertFalse("Reference title should not support detail separator", isParsable(testParsable, NomenclaturalCode.ICBN));
740 assertTrue("Problem must be reference title", getProblems(testParsable, NomenclaturalCode.ICBN).
741 contains(ParserProblem.UnparsableReferenceTitle));
742
743 testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
744 assertTrue("Reference title should support brackets", isParsable(testParsable, NomenclaturalCode.ICBN));
745
746 testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
747 assertTrue("Reference title should support brackets", isParsable(testParsable, NomenclaturalCode.ICBN));
748
749 testParsable = "Hieracium lachenalii Zahn, nom. illeg.";
750 assertTrue("Reference should not be obligatory if a nom status exist", isParsable(testParsable, NomenclaturalCode.ICBN));
751
752 testParsable = "Hieracium lachenalii, nom. illeg.";
753 assertTrue("Authorship should not be obligatory if followed by nom status", isParsable(testParsable, NomenclaturalCode.ICBN));
754
755 testParsable = "Hieracium lachenalii, Ill. Fl. (Mitt.) 6: 1285. 1929";
756 assertFalse("Author is obligatory if followed by reference", isParsable(testParsable, NomenclaturalCode.ICBN));
757 assertTrue("Problem must be name-reference separation", getProblems(testParsable, NomenclaturalCode.ICBN).
758 contains(ParserProblem.NameReferenceSeparation));
759
760 testParsable = "Hieracium lachenalii in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
761 assertFalse("Author is obligatory if followed by reference", isParsable(testParsable, NomenclaturalCode.ICBN));
762 assertTrue("Problem must be name-reference separation", getProblems(testParsable, NomenclaturalCode.ICBN).
763 contains(ParserProblem.NameReferenceSeparation));
764
765 testParsable = "Abies alba Mill. var. alba";
766 assertTrue("Autonym problem", isParsable(testParsable, NomenclaturalCode.ICBN));
767
768
769 testParsable = "Hieracium antarcticum d'Urv. in M\u00E9m. Soc. Linn. Paris 4: 608. 1826";
770 // testParsable = "Hieracium antarcticum Urv. in M\u00E9m. Soc. Linn. Paris 4: 608. 1826";
771 assertTrue("Name with apostrophe is not parsable", isParsable(testParsable, NomenclaturalCode.ICBN));
772
773 testParsable = "Cichorium intybus subsp. glaucum (Hoffmanns. & Link) Tzvelev in Komarov, Fl. SSSR 29: 17. 1964";
774 assertTrue("Name is not parsable", isParsable(testParsable, NomenclaturalCode.ICBN));
775 }
776
777
778
779 /**
780 * @param testParsable
781 * @param icbn
782 * @return
783 */
784 private List<ParserProblem> getProblems(String string, NomenclaturalCode code) {
785 List<ParserProblem> result;
786 result = parser.parseReferencedName(string, code, null).getParsingProblems();
787 return result;
788 }
789
790 private boolean isParsable(String string, NomenclaturalCode code){
791 NonViralName<?> name = parser.parseReferencedName(string, code, null);
792 return ! name.hasProblem();
793 }
794
795 private void assertFullRefNameStandard(NonViralName<?> name){
796 assertEquals("Abies", name.getGenusOrUninomial());
797 assertEquals("alba", name.getSpecificEpithet());
798 assertEquals("Mill.", name.getAuthorshipCache());
799 assertEquals("455", name.getNomenclaturalMicroReference());
800 assertNotNull(name.getNomenclaturalReference());
801 }
802
803 private void assertFullRefStandard(NonViralName<?> name){
804 assertEquals("Abies", name.getGenusOrUninomial());
805 assertEquals("alba", name.getSpecificEpithet());
806 assertEquals("Mill.", name.getAuthorshipCache());
807 assertEquals("455", name.getNomenclaturalMicroReference());
808 assertNotNull(name.getNomenclaturalReference());
809 INomenclaturalReference ref = (INomenclaturalReference)name.getNomenclaturalReference();
810 assertEquals("1987", ref.getYear());
811 Reference refBase = (Reference)ref;
812 assertEquals("Sp. Pl.", refBase.getTitle());
813 }
814
815
816 @Test
817 public void testNeverEndingParsing(){
818 //some full titles result in never ending parsing process https://dev.e-taxonomy.eu/trac/ticket/1556
819
820 String irinaExample = "Milichiidae Sharp, 1899, Insects. Part II. Hymenopteracontinued (Tubulifera and Aculeata), Coleoptera, Strepsiptera, Lepidoptera, Diptera, Aphaniptera, Thysanoptera, Hemiptera, Anoplura 6: 504. 1899";
821 // irinaExample = "Milichiidae Sharp, 1899, Insects. Part II. Uiuis Iuiui Hymenopteracontinued (Tubulifera and Aculeata), Coleoptera, Strepsiptera, Lepidoptera, Diptera, Aphaniptera, Thysanoptera, Hemiptera, Anoplura 6: 504. 1899";
822 NonViralName nvn = this.parser.parseReferencedName(irinaExample, NomenclaturalCode.ICZN, null);
823 int parsingProblem = nvn.getParsingProblem();
824 Assert.assertEquals("Name should have only rank warning", 1, parsingProblem);
825 Assert.assertEquals("Titlecache", "Milichiidae Sharp, 1899", nvn.getTitleCache());
826 Assert.assertEquals("If this line reached everything should be ok", "Milichiidae", nvn.getGenusOrUninomial());
827
828 String anotherExample = "Scorzonera hispanica var. brevifolia Boiss. & Balansa in Boissier, Diagn. Pl. Orient., ser. 2 6: 119. 1859.";
829 nvn = this.parser.parseReferencedName(anotherExample, NomenclaturalCode.ICBN, null);
830 parsingProblem = nvn.getParsingProblem();
831 Assert.assertEquals("Problem should be 0", 0, parsingProblem);
832 Assert.assertEquals("Titlecache", "Scorzonera hispanica var. brevifolia Boiss. & Balansa", nvn.getTitleCache());
833 Assert.assertEquals("If this line reached everything should be ok", "Scorzonera", nvn.getGenusOrUninomial());
834
835 String unparsable = "Taraxacum nevskii L., Trudy Bot. Inst. Nauk S.S.S.R., Ser. 1, Fl. Sist. Vyssh. Rast. 4: 293. 1937.";
836 String unparsableA = "Taraxacum nevskii L. in Trudy Bot. Inst. Nauk: 293. 1937.";
837 nvn = this.parser.parseReferencedName(unparsable, NomenclaturalCode.ICBN, null);
838 Assert.assertEquals("Titlecache", "Taraxacum nevskii L.", nvn.getTitleCache());
839 Assert.assertEquals("If this line reached everything should be ok", "Taraxacum", nvn.getGenusOrUninomial());
840 parsingProblem = nvn.getParsingProblem();
841 Assert.assertEquals("Name should no warnings or errors", 0, parsingProblem);
842
843 String unparsable2 = "Hieracium pxxx Dahlst., Kongl. Svenska Vetensk. Acad. Handl. ser. 2, 26(3): 255. 1894";
844 String unparsable2A = "Hieracium pxxx Dahlst., Kongl Svenska Vetensk Acad Handl, 26: 255. 1894.";
845 nvn = this.parser.parseReferencedName(unparsable2, NomenclaturalCode.ICBN, null);
846 Assert.assertEquals("Titlecache", "Hieracium pxxx Dahlst.", nvn.getTitleCache());
847 Assert.assertEquals("If this line reached everything should be ok", "Hieracium", nvn.getGenusOrUninomial());
848 parsingProblem = nvn.getParsingProblem();
849 Assert.assertEquals("Name should no warnings or errors", 0, parsingProblem);
850
851
852 String again = "Adiantum emarginatum Bory ex. Willd., Species Plantarum, ed. 4,5,1: 449,450. 1810";
853 nvn = this.parser.parseReferencedName(again, NomenclaturalCode.ICBN, null);
854 Assert.assertEquals("Titlecache", "Adiantum emarginatum Bory ex Willd.", nvn.getTitleCache());
855 Assert.assertEquals("If this line reached everything should be ok", "Adiantum", nvn.getGenusOrUninomial());
856
857 }
858
859 @Test
860 public final void testSeriesPart(){
861 Pattern seriesPattern = Pattern.compile(NonViralNameParserImpl.pSeriesPart);
862 Matcher matcher = seriesPattern.matcher("ser. 2");
863 Assert.assertTrue("", matcher.matches());
864 }
865
866 /**
867 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#fullTeams(java.lang.String)}.
868 */
869 @Test
870 public final void testFullTeams() {
871 logger.warn("Not yet implemented"); // TODO
872 }
873
874 /**
875 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#authorTeamAndEx(java.lang.String)}.
876 */
877 @Test
878 public final void testAuthorTeamAndEx() {
879 logger.warn("Not yet implemented"); // TODO
880 }
881
882 /**
883 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#authorTeam(java.lang.String)}.
884 */
885 @Test
886 public final void testAuthorTeam() {
887 logger.warn("Not yet implemented"); // TODO
888 }
889
890 /**
891 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseCultivar(java.lang.String)}.
892 */
893 @Test
894 public final void testParseCultivar() {
895 logger.warn("Not yet implemented"); // TODO
896 }
897
898 }