Project

General

Profile

Download (41.4 KB) Statistics
| Branch: | Tag: | Revision:
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

    
22
import org.apache.log4j.Logger;
23
import org.junit.After;
24
import org.junit.AfterClass;
25
import org.junit.Before;
26
import org.junit.BeforeClass;
27
import org.junit.Test;
28

    
29
import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;
30
import eu.etaxonomy.cdm.model.agent.Team;
31
import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;
32
import eu.etaxonomy.cdm.model.name.BotanicalName;
33
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
34
import eu.etaxonomy.cdm.model.name.NonViralName;
35
import eu.etaxonomy.cdm.model.name.Rank;
36
import eu.etaxonomy.cdm.model.name.ZoologicalName;
37
//import eu.etaxonomy.cdm.model.reference.Article;
38
//import eu.etaxonomy.cdm.model.reference.Book;
39
//import eu.etaxonomy.cdm.model.reference.BookSection;
40
import eu.etaxonomy.cdm.model.reference.IArticle;
41
import eu.etaxonomy.cdm.model.reference.IBook;
42
import eu.etaxonomy.cdm.model.reference.IBookSection;
43
import eu.etaxonomy.cdm.model.reference.IJournal;
44
import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
45
import eu.etaxonomy.cdm.model.reference.IVolumeReference;
46
//import eu.etaxonomy.cdm.model.reference.Journal;
47
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
48
/**
49
 * @author a.mueller
50
 *
51
 */
52
public class NonViralNameParserImplTest {
53
	private static final Logger logger = Logger.getLogger(NonViralNameParserImplTest.class);
54
	
55
	final private String strNameFamily = "Asteraceae";
56
	final private String strNameGenus = "Abies Mueller";
57
	final private String strNameGenusUnicode = "Abies M\u00FCller";
58
	final private String strNameAbies1 = "Abies alba";
59
	final private String strNameAbiesSub1 = "Abies alba subsp. beta";
60
	final private String strNameAbiesAuthor1 = "Abies alba Mueller";
61
	final private String strNameAbiesAuthor1Unicode = "Abies alba M\u00FCller";
62
	final private String strNameAbiesBasionymAuthor1 = "Abies alba (Ciardelli) D'Mueller";
63
	final private String strNameAbiesBasionymAuthor1Unicode = "Abies alba (Ciardelli) D'M\u00FCller";
64
	final private String strNameAbiesBasionymExAuthor1 ="Abies alba (Ciardelli ex Doering) D'Mueller ex. de Greuther"; 
65
	final private String strNameAbiesBasionymExAuthor1Unicode ="Abies alba (Ciardelli ex D\u00F6ring) D'M\u00FCller ex. de Greuther"; 
66
	final private String strNameTeam1 = "Abies alba Mueller & L."; 
67
	final private String strNameZoo1 = "Abies alba Mueller & L., 1822";
68
	final private String strNameZoo2 = "Abies alba (Mueller, 1822) Ciardelli, 2002";
69
	
70
	final private String strNameEmpty = "";
71
	final private String strNameNull = null;
72
	
73
	private NonViralNameParserImpl parser ;
74
	private NomenclaturalCode botanicCode; 
75
	
76
	/**
77
	 * @throws java.lang.Exception
78
	 */
79
	@BeforeClass
80
	public static void setUpBeforeClass() throws Exception {
81
		DefaultTermInitializer termInitializer = new DefaultTermInitializer();
82
		termInitializer.initialize();
83
	}
84

    
85
	/**
86
	 * @throws java.lang.Exception
87
	 */
88
	@AfterClass
89
	public static void tearDownAfterClass() throws Exception {
90
	}
91

    
92
	/**
93
	 * @throws java.lang.Exception
94
	 */
95
	@Before
96
	public void setUp() throws Exception {
97
		parser = NonViralNameParserImpl.NewInstance();
98
		botanicCode = NomenclaturalCode.ICBN;
99
	}
100

    
101
	/**
102
	 * @throws java.lang.Exception
103
	 */
104
	@After
105
	public void tearDown() throws Exception {
106
	}
107

    
108
/*************** TEST *********************************************/
109
	
110
	/**
111
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#NEW_INSTANCE()}.
112
	 */
113
	@Test
114
	public final void testNewInstance() {
115
		assertNotNull(parser);
116
	}
117

    
118
	/**
119
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#TaxonNameParserBotanicalNameImpl()}.
120
	 */
121
	@Test
122
	public final void testTaxonNameParserBotanicalNameImpl() {
123
		logger.warn("Not yet implemented"); // TODO
124
	}
125

    
126
	/**
127
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSimpleName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
128
	 */
129
	@Test
130
	public final void testParseSimpleName() {
131
		
132
		//Uninomials
133
		ZoologicalName milichiidae = (ZoologicalName)parser.parseSimpleName("Milichiidae", NomenclaturalCode.ICZN, null);
134
		assertEquals("Family rank expected", Rank.FAMILY(), milichiidae.getRank());
135
		BotanicalName crepidinae = (BotanicalName)parser.parseSimpleName("Crepidinae", NomenclaturalCode.ICBN, null);
136
		assertEquals("Family rank expected", Rank.SUBTRIBE(), crepidinae.getRank());
137
		BotanicalName abies = (BotanicalName)parser.parseSimpleName("Abies", NomenclaturalCode.ICBN, null);
138
		assertEquals("Family rank expected", Rank.GENUS(), abies.getRank());
139
		
140
		abies.addParsingProblem(ParserProblem.CheckRank);
141
		parser.parseSimpleName(abies, "Abies", abies.getRank(), true);
142
		assertTrue(abies.getParsingProblems().contains(ParserProblem.CheckRank));
143
		
144
		BotanicalName rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);
145
		assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));
146
		assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));
147
		parser.parseSimpleName(rosa, "Rosaceaex", abies.getRank(), true);
148
		assertEquals("Rosaceaex have rank genus", Rank.GENUS(), rosa.getRank());
149
		assertTrue("Rosaceaex must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));
150
	
151
		//repeat but remove warning after first parse
152
		rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);
153
		assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));
154
		assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));
155
		rosa.removeParsingProblem(ParserProblem.CheckRank);
156
		parser.parseSimpleName(rosa, "Rosaceaex", rosa.getRank(), true);
157
		assertEquals("Rosaceaex have rank family", Rank.FAMILY(), rosa.getRank());
158
		assertFalse("Rosaceaex must have no rank warning", rosa.hasProblem(ParserProblem.CheckRank));
159

    
160
		
161
	}
162

    
163
	/**
164
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSubGenericFullName(java.lang.String)}.
165
	 */
166
	@Test
167
	public final void testParseSubGenericFullName() {
168
		logger.warn("Not yet implemented"); // TODO
169
	}
170

    
171
	/**
172
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseSubGenericSimpleName(java.lang.String)}.
173
	 */
174
	@Test
175
	public final void testParseSubGenericSimpleName() {
176
		logger.warn("Not yet implemented"); // TODO
177
	}
178

    
179
	/**
180
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
181
	 */
182
	@Test
183
	public final void testParseFullNameUnicode() {
184

    
185
		NonViralName nameAuthor = parser.parseFullName(strNameAbiesAuthor1Unicode, null, Rank.SPECIES());
186
		assertEquals("Abies", nameAuthor.getGenusOrUninomial());
187
		assertEquals("alba", nameAuthor.getSpecificEpithet());
188
		assertEquals("M\u00FCller", nameAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
189
		
190
		NonViralName nameBasionymAuthor = parser.parseFullName(strNameAbiesBasionymAuthor1Unicode, null, Rank.SPECIES());
191
		assertEquals("Abies", nameBasionymAuthor.getGenusOrUninomial());
192
		assertEquals("alba", nameBasionymAuthor.getSpecificEpithet());
193
		assertEquals("D'M\u00FCller", nameBasionymAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
194
		INomenclaturalAuthor basionymTeam = nameBasionymAuthor.getBasionymAuthorTeam();
195
		assertEquals("Ciardelli", basionymTeam.getNomenclaturalTitle());
196
		
197
		NonViralName nameBasionymExAuthor = parser.parseFullName(strNameAbiesBasionymExAuthor1Unicode, null, Rank.SPECIES());
198
		assertEquals("Abies", nameBasionymExAuthor.getGenusOrUninomial());
199
		assertEquals("alba", nameBasionymExAuthor.getSpecificEpithet());
200
		assertEquals("D'M\u00FCller", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
201
		assertEquals("de Greuther", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());
202
		INomenclaturalAuthor basionymTeam2 = nameBasionymExAuthor.getBasionymAuthorTeam();
203
		assertEquals("Ciardelli", basionymTeam2.getNomenclaturalTitle());
204
		INomenclaturalAuthor exBasionymTeam2 = nameBasionymExAuthor.getExBasionymAuthorTeam();
205
		assertEquals("D\u00F6ring", exBasionymTeam2.getNomenclaturalTitle());
206
		
207
		BotanicalName nameBasionymExAuthor2 = (BotanicalName)parser.parseFullName("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", null, Rank.SPECIES());
208
		assertEquals("Washingtonia", nameBasionymExAuthor2.getGenusOrUninomial());
209
		assertEquals("filifera", nameBasionymExAuthor2.getSpecificEpithet());
210
		assertEquals("H.Wendl.", nameBasionymExAuthor2.getCombinationAuthorTeam().getNomenclaturalTitle());
211
		assertEquals("de Bary", nameBasionymExAuthor2.getExCombinationAuthorTeam().getNomenclaturalTitle());
212
		INomenclaturalAuthor basionymTeam3 = nameBasionymExAuthor2.getBasionymAuthorTeam();
213
		assertEquals("Linden", basionymTeam3.getNomenclaturalTitle());
214
		INomenclaturalAuthor exBasionymTeam3 = nameBasionymExAuthor2.getExBasionymAuthorTeam();
215
		assertEquals("Andre", exBasionymTeam3.getNomenclaturalTitle());
216
		String title = nameBasionymExAuthor2.generateTitle();
217
		assertEquals("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", title);
218
	
219
	}
220
	
221
	
222
	/**
223
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.
224
	 */
225
	@Test
226
	public final void testParseFullName() {
227
		try {
228
			Method parseMethod = parser.getClass().getDeclaredMethod("parseFullName", String.class, NomenclaturalCode.class, Rank.class);
229
			testName_StringNomcodeRank(parseMethod);
230
		} catch (Exception e) {
231
			e.printStackTrace();
232
			assertTrue(false);
233
		}
234
		
235
		//Team
236
		NonViralName nameTeam1 = parser.parseFullName(strNameTeam1);
237
		assertEquals( "Abies", nameTeam1.getGenusOrUninomial());
238
		assertEquals( "alba", nameTeam1.getSpecificEpithet());
239
		assertEquals("Mueller & L.",  nameTeam1.getCombinationAuthorTeam().getNomenclaturalTitle());
240
		assertTrue(nameTeam1.getCombinationAuthorTeam() instanceof Team);
241
		Team team = (Team)nameTeam1.getCombinationAuthorTeam();
242
		assertEquals("Mueller", team.getTeamMembers().get(0).getNomenclaturalTitle());
243
		assertEquals("L.", team.getTeamMembers().get(1).getNomenclaturalTitle());
244

    
245
		//ZooName
246
		ZoologicalName nameZoo1 = (ZoologicalName)parser.parseFullName(strNameZoo1);
247
		assertEquals( "Abies", nameZoo1.getGenusOrUninomial());
248
		assertEquals( "alba", nameZoo1.getSpecificEpithet());
249
		assertEquals("Mueller & L.",  nameZoo1.getCombinationAuthorTeam().getNomenclaturalTitle());
250
		assertEquals(NomenclaturalCode.ICZN, nameZoo1.getNomenclaturalCode() );
251
		assertEquals(Integer.valueOf(1822), nameZoo1.getPublicationYear());
252
		assertTrue(nameZoo1.getCombinationAuthorTeam() instanceof Team);
253
		Team teamZoo = (Team)nameZoo1.getCombinationAuthorTeam();
254
		assertEquals("Mueller", teamZoo.getTeamMembers().get(0).getNomenclaturalTitle());
255
		assertEquals("L.", teamZoo.getTeamMembers().get(1).getNomenclaturalTitle());
256

    
257
		ZoologicalName nameZoo2 = (ZoologicalName)parser.parseFullName(strNameZoo2);
258
		assertEquals(Integer.valueOf(2002), nameZoo2.getPublicationYear());
259
		assertEquals(Integer.valueOf(1822), nameZoo2.getOriginalPublicationYear());
260
		assertEquals("Mueller",  nameZoo2.getBasionymAuthorTeam().getNomenclaturalTitle());
261
		assertEquals("Ciardelli",  nameZoo2.getCombinationAuthorTeam().getNomenclaturalTitle());
262
		
263
		//Autonym
264
		BotanicalName autonymName = (BotanicalName)parser.parseFullName("Abies alba Mill. var. alba", NomenclaturalCode.ICBN, null);
265
		assertFalse("Autonym should be parsable", autonymName.hasProblem());
266
		
267
		
268
		//empty
269
		NonViralName nameEmpty = parser.parseFullName(strNameEmpty);
270
		assertNotNull(nameEmpty);
271
		assertEquals("", nameEmpty.getTitleCache());
272
		
273
		//null
274
		NonViralName nameNull = parser.parseFullName(strNameNull);
275
		assertNull(nameNull);
276
		
277
		//some authors
278
		String fullNameString = "Abies alba (Greuther & L'Hiver & al. ex M?ller & Schmidt)Clark ex Ciardelli"; 
279
		BotanicalName authorname = (BotanicalName)parser.parseFullName(fullNameString);
280
		assertFalse(authorname.hasProblem());
281
		assertEquals("Basionym author should have 3 authors", 3, ((Team)authorname.getBasionymAuthorTeam()).getTeamMembers().size());
282
	}
283
	
284
	private void testName_StringNomcodeRank(Method parseMethod) 
285
			throws InvocationTargetException, IllegalAccessException  {
286
		NonViralName name1 = (NonViralName)parseMethod.invoke(parser, strNameAbies1, null, Rank.SPECIES());
287
		//parser.parseFullName(strNameAbies1, null, Rank.SPECIES());
288
		assertEquals("Abies", name1.getGenusOrUninomial());
289
		assertEquals("alba", name1.getSpecificEpithet());
290
		
291
		NonViralName nameAuthor = (NonViralName)parseMethod.invoke(parser, strNameAbiesAuthor1, null, Rank.SPECIES());
292
		assertEquals("Abies", nameAuthor.getGenusOrUninomial());
293
		assertEquals("alba", nameAuthor.getSpecificEpithet());
294
		assertEquals("Mueller", nameAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
295
		
296
		NonViralName nameBasionymAuthor = (NonViralName)parseMethod.invoke(parser, strNameAbiesBasionymAuthor1, null, Rank.SPECIES());
297
		assertEquals("Abies", nameBasionymAuthor.getGenusOrUninomial());
298
		assertEquals("alba", nameBasionymAuthor.getSpecificEpithet());
299
		assertEquals("D'Mueller", nameBasionymAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
300
		assertEquals("Ciardelli", nameBasionymAuthor.getBasionymAuthorTeam().getNomenclaturalTitle());
301
		
302
		NonViralName nameBasionymExAuthor = (NonViralName)parseMethod.invoke(parser, strNameAbiesBasionymExAuthor1, null, Rank.SPECIES());
303
		assertEquals("Abies", nameBasionymExAuthor.getGenusOrUninomial());
304
		assertEquals("alba", nameBasionymExAuthor.getSpecificEpithet());
305
		assertEquals("D'Mueller", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());
306
		assertEquals("de Greuther", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());
307
		assertEquals("Ciardelli", nameBasionymExAuthor.getBasionymAuthorTeam().getNomenclaturalTitle());
308
		assertEquals("Doering", nameBasionymExAuthor.getExBasionymAuthorTeam().getNomenclaturalTitle());
309
		
310
		NonViralName name2 = (NonViralName)parseMethod.invoke(parser, strNameAbiesSub1, null, Rank.SPECIES());
311
		assertEquals("Abies", name2.getGenusOrUninomial());
312
		assertEquals("alba", name2.getSpecificEpithet());
313
		assertEquals("beta", name2.getInfraSpecificEpithet());
314
		assertEquals(Rank.SUBSPECIES(), name2.getRank());
315

    
316
		
317
		// unparseable *********
318
		String problemString = "sdfjlös wer eer wer";
319
		NonViralName<?> nameProblem = (NonViralName<?>)parseMethod.invoke(parser, problemString, null, Rank.SPECIES());
320
		List<ParserProblem> list = nameProblem.getParsingProblems();
321
		assertTrue(nameProblem.getParsingProblem()!=0);
322
		assertEquals(problemString, nameProblem.getTitleCache());
323
	}
324
	
325
	/**
326
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseReferencedName(NonViralName, java.lang.String, eu.etaxonomy.cdm.model.name.Rank, boolean)(, )}.
327
	 */
328
	@Test
329
	public final void testParseReferencedName() {
330
		try {
331
			Method parseMethod = parser.getClass().getDeclaredMethod("parseReferencedName", String.class, NomenclaturalCode.class, Rank.class);
332
			testName_StringNomcodeRank(parseMethod);
333
		} catch (Exception e) {
334
			e.printStackTrace();
335
			assertTrue(false);
336
		}
337

    
338
		
339
		//null
340
		String strNull = null;
341
		NonViralName<?> nameNull = parser.parseReferencedName(strNull, null, Rank.SPECIES());
342
		assertNull(nameNull);
343
				
344
		//Empty
345
		String strEmpty = "";
346
		NonViralName<?> nameEmpty = parser.parseReferencedName(strEmpty, null, Rank.SPECIES());
347
		assertFalse(nameEmpty.hasProblem());
348
		assertEquals(strEmpty, nameEmpty.getFullTitleCache());
349
		assertNull(nameEmpty.getNomenclaturalMicroReference());
350
		
351
		
352
		//Whitespaces
353
		String strFullWhiteSpcaceAndDot = "Abies alba Mill.,  Sp.   Pl.  4:  455 .  1987 .";
354
		NonViralName<?> namefullWhiteSpcaceAndDot = parser.parseReferencedName(strFullWhiteSpcaceAndDot, null, Rank.SPECIES());
355
		assertFullRefStandard(namefullWhiteSpcaceAndDot);
356
		assertTrue(((ReferenceBase)namefullWhiteSpcaceAndDot.getNomenclaturalReference()).getType().equals(eu.etaxonomy.cdm.model.reference.ReferenceType.Book));
357
		assertEquals( "Abies alba Mill., Sp. Pl. 4: 455. 1987", namefullWhiteSpcaceAndDot.getFullTitleCache());
358

    
359
		//Book
360
		String fullReference = "Abies alba Mill., Sp. Pl. 4: 455. 1987";
361
		NonViralName<?> name1 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
362
		assertFullRefStandard(name1);
363
		assertTrue(((ReferenceBase)name1.getNomenclaturalReference()).getType().equals(eu.etaxonomy.cdm.model.reference.ReferenceType.Book));
364
		assertEquals(fullReference, name1.getFullTitleCache());
365
		assertTrue("Name author and reference author should be the same", name1.getCombinationAuthorTeam() == ((ReferenceBase)name1.getNomenclaturalReference()).getAuthorTeam());
366
		
367
		//Book Section
368
		fullReference = "Abies alba Mill. in Otto, Sp. Pl. 4(6): 455. 1987";
369
		NonViralName<?> name2 = parser.parseReferencedName(fullReference + ".", null, Rank.SPECIES());
370
		assertFullRefNameStandard(name2);
371
		assertEquals(fullReference, name2.getFullTitleCache());
372
		assertFalse(name2.hasProblem());
373
		INomenclaturalReference ref = name2.getNomenclaturalReference();
374
		assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.BookSection, ((ReferenceBase)ref).getType());
375
		IBookSection bookSection = (IBookSection) ref;
376
		IBook inBook = bookSection.getInBook();
377
		assertNotNull(inBook);
378
		assertNotNull(inBook.getAuthorTeam());
379
		assertEquals("Otto", inBook.getAuthorTeam().getTitleCache());
380
		assertEquals("Otto, Sp. Pl. 4(6)", inBook.getTitleCache());
381
		assertEquals("Sp. Pl.", inBook.getTitle());
382
		assertEquals("4(6)", inBook.getVolume());
383
		assertTrue("Name author and reference author should be the same", name2.getCombinationAuthorTeam() == ((ReferenceBase)name2.getNomenclaturalReference()).getAuthorTeam());
384
		
385
		//Article
386
		fullReference = "Abies alba Mill. in Sp. Pl. 4(6): 455. 1987";
387
		NonViralName<?> name3 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
388
		assertFullRefNameStandard(name3);
389
		assertEquals(fullReference, name3.getFullTitleCache());
390
		assertFalse(name3.hasProblem());
391
		ref = name3.getNomenclaturalReference();
392
		assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.Article, ref.getType());
393
		//Article article = (Article)ref;
394
		IJournal journal = ((IArticle)ref).getInJournal();
395
		assertNotNull(journal);
396
		//assertEquals("Sp. Pl. 4(6)", inBook.getTitleCache());
397
		assertEquals("Sp. Pl.",((ReferenceBase) journal).getTitleCache());
398
		assertEquals("Sp. Pl.", journal.getTitle());
399
		assertEquals("4(6)",((IArticle)ref).getVolume());
400
		assertTrue("Name author and reference author should be the same", name3.getCombinationAuthorTeam() == name3.getNomenclaturalReference().getAuthorTeam());
401
		
402
		//SoftArticle - having "," on position > 4
403
		String journalTitle = "Bull. Soc. Bot.France. Louis., Roi";
404
		String yearPart = " 1987 - 1989";
405
		String parsedYear = "1987-1989";
406
		String fullReferenceWithoutYear = "Abies alba Mill. in " + journalTitle + " 4(6): 455.";
407
		fullReference = fullReferenceWithoutYear + yearPart;
408
		String fullReferenceWithEnd = fullReference + ".";
409
		NonViralName<?> name4 = parser.parseReferencedName(fullReferenceWithEnd, null, Rank.SPECIES());
410
		assertFalse(name4.hasProblem());
411
		assertFullRefNameStandard(name4);
412
		assertEquals(fullReferenceWithoutYear + " " + parsedYear, name4.getFullTitleCache());
413
		ref = name4.getNomenclaturalReference();
414
		assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.Article, ref.getType());
415
		//article = (Article)ref;
416
		assertEquals(parsedYear, ref.getYear());
417
		journal = ((IArticle)ref).getInJournal();
418
		assertNotNull(journal);
419
		assertEquals(journalTitle, ((ReferenceBase) journal).getTitleCache());
420
		assertEquals(journalTitle, journal.getTitle());
421
		assertEquals("4(6)", ((IArticle)ref).getVolume());
422
		
423
		//Zoo name
424
		String strNotParsableZoo = "Abies alba M., 1923, Sp. P. xxwer4352, nom. inval.";
425
		ZoologicalName nameZooRefNotParsabel = (ZoologicalName)parser.parseReferencedName(strNotParsableZoo, null, null);
426
		assertTrue(nameZooRefNotParsabel.hasProblem());
427
		List<ParserProblem> list = nameZooRefNotParsabel.getParsingProblems();
428
		assertTrue("List must contain detail and year warning ", list.contains(ParserProblem.CheckDetailOrYear));
429
		assertEquals(21, nameZooRefNotParsabel.getProblemStarts());
430
		assertEquals(37, nameZooRefNotParsabel.getProblemEnds());
431
		assertTrue(nameZooRefNotParsabel.getNomenclaturalReference().hasProblem());
432
		list = nameZooRefNotParsabel.getNomenclaturalReference().getParsingProblems();
433
		assertTrue("List must contain detail and year warning ", list.contains(ParserProblem.CheckDetailOrYear));
434
		
435
		assertEquals(NomenclaturalCode.ICZN, nameZooRefNotParsabel.getNomenclaturalCode());
436
		assertEquals(Integer.valueOf(1923), nameZooRefNotParsabel.getPublicationYear());
437
		assertEquals(1, nameZooRefNotParsabel.getStatus().size());
438

    
439
		String strZooNameSineYear = "Homo sapiens L., 1758, Sp. An. 3: 345";
440
		ZoologicalName nameZooNameSineYear = (ZoologicalName)parser.parseReferencedName(strZooNameSineYear);
441
		assertFalse(nameZooNameSineYear.hasProblem());
442
		assertEquals("Name without reference year must have year", (Integer)1758, nameZooNameSineYear.getPublicationYear());
443
		assertEquals("Name without reference year must have year", "1758", nameZooNameSineYear.getNomenclaturalReference().getYear());
444
		
445
		String strZooNameNewCombination = "Homo sapiens (L., 1758) Mill., 1830, Sp. An. 3: 345";
446
		ZoologicalName nameZooNameNewCombination = (ZoologicalName)parser.parseReferencedName(strZooNameNewCombination);
447
		assertTrue(nameZooNameNewCombination.hasProblem());
448
		list = nameZooNameNewCombination.getParsingProblems();
449
		assertTrue("List must contain new combination has publication warning ", list.contains(ParserProblem.NewCombinationHasPublication));
450
		assertEquals(35, nameZooNameNewCombination.getProblemStarts());
451
		assertEquals(51, nameZooNameNewCombination.getProblemEnds());
452
		
453
		
454
		//Special MicroRefs
455
		String strSpecDetail1 = "Abies alba Mill. in Sp. Pl. 4(6): [455]. 1987";
456
		NonViralName<?> nameSpecDet1 = parser.parseReferencedName(strSpecDetail1 + ".", null, Rank.SPECIES());
457
		assertFalse(nameSpecDet1.hasProblem());
458
		assertEquals(strSpecDetail1, nameSpecDet1.getFullTitleCache());
459
		assertEquals("[455]", nameSpecDet1.getNomenclaturalMicroReference());
460
		
461
		//Special MicroRefs
462
		String strSpecDetail2 = "Abies alba Mill. in Sp. Pl. 4(6): couv. 2. 1987";
463
		NonViralName<?> nameSpecDet2 = parser.parseReferencedName(strSpecDetail2 + ".", null, Rank.SPECIES());
464
		assertFalse(nameSpecDet2.hasProblem());
465
		assertEquals(strSpecDetail2, nameSpecDet2.getFullTitleCache());
466
		assertEquals("couv. 2", nameSpecDet2.getNomenclaturalMicroReference());
467
		
468
		//Special MicroRefs
469
		String strSpecDetail3 = "Abies alba Mill. in Sp. Pl. 4(6): fig. 455. 1987";
470
		NonViralName<?> nameSpecDet3 = parser.parseReferencedName(strSpecDetail3 + ".", null, Rank.SPECIES());
471
		assertFalse(nameSpecDet3.hasProblem());
472
		assertEquals(strSpecDetail3, nameSpecDet3.getFullTitleCache());
473
		assertEquals("fig. 455", nameSpecDet3.getNomenclaturalMicroReference());
474
		
475
		//Special MicroRefs
476
		String strSpecDetail4 = "Abies alba Mill. in Sp. Pl. 4(6): fig. 455-567. 1987";
477
		fullReference = strSpecDetail4 + ".";
478
		NonViralName<?> nameSpecDet4 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
479
		assertFalse(nameSpecDet4.hasProblem());
480
		assertEquals(strSpecDetail4, nameSpecDet4.getFullTitleCache());
481
		assertEquals("fig. 455-567", nameSpecDet4.getNomenclaturalMicroReference());
482
		
483
		
484
		//Special MicroRefs
485
		String strSpecDetail5 = "Abies alba Mill. in Sp. Pl. 4(6): Gard n\u00B0 4. 1987";
486
		fullReference = strSpecDetail5 + ".";
487
		NonViralName<?> nameSpecDet5 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
488
		assertFalse(nameSpecDet5.hasProblem());
489
		assertEquals(strSpecDetail5, nameSpecDet5.getFullTitleCache());
490
		assertEquals("Gard n\u00B0 4", nameSpecDet5.getNomenclaturalMicroReference());
491
		
492
		//Special MicroRefs
493
		String strSpecDetail6 = "Abies alba Mill. in Sp. Pl. 4(6): 455a. 1987";
494
		fullReference = strSpecDetail6 + ".";
495
		NonViralName<?> nameSpecDet6 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
496
		assertFalse(nameSpecDet6.hasProblem());
497
		assertEquals(strSpecDetail6, nameSpecDet6.getFullTitleCache());
498
		assertEquals("455a", nameSpecDet6.getNomenclaturalMicroReference());
499
		
500
		//Special MicroRefs
501
		String strSpecDetail7 = "Abies alba Mill. in Sp. Pl. 4(6): pp.455-457. 1987";
502
		fullReference = strSpecDetail7 + ".";
503
		NonViralName<?> nameSpecDet7 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());
504
		assertFalse(nameSpecDet7.hasProblem());
505
		assertEquals(strSpecDetail7, nameSpecDet7.getFullTitleCache());
506
		assertEquals("pp.455-457", nameSpecDet7.getNomenclaturalMicroReference());
507
		
508
		//Special MicroRefs
509
		String strSpecDetail8 = "Abies alba Mill. in Sp. Pl. 4(6): ppp.455-457. 1987";
510
		NonViralName<?> nameSpecDet8 = parser.parseReferencedName(strSpecDetail8, null, Rank.SPECIES());
511
		assertTrue(nameSpecDet8.hasProblem());
512
		assertEquals(20, nameSpecDet8.getProblemStarts()); //TODO better start behind :
513
		assertEquals(51, nameSpecDet8.getProblemEnds());   //TODO better stop after -457
514
		
515

    
516
		//Special MicroRefs
517
		String strSpecDetail9 = "Abies alba Mill. in Sp. Pl. 4(6): pp. 455 - 457. 1987";
518
		NonViralName<?> nameSpecDet9 = parser.parseReferencedName(strSpecDetail9, null, Rank.SPECIES());
519
		assertFalse(nameSpecDet9.hasProblem());
520
		assertEquals(strSpecDetail9, nameSpecDet9.getFullTitleCache());
521
		assertEquals("pp. 455 - 457", nameSpecDet9.getNomenclaturalMicroReference());
522

    
523
		//Special MicroRefs
524
		String strSpecDetail10 = "Abies alba Mill. in Sp. Pl. 4(6): p 455. 1987";
525
		NonViralName<?> nameSpecDet10 = parser.parseReferencedName(strSpecDetail10, null, Rank.SPECIES());
526
		assertFalse(nameSpecDet10.hasProblem());
527
		assertEquals(strSpecDetail10, nameSpecDet10.getFullTitleCache());
528
		assertEquals("p 455", nameSpecDet10.getNomenclaturalMicroReference());
529
		
530
		//Special MicroRefs
531
		String strSpecDetail11 = "Abies alba Mill. in Sp. Pl. 4(6): p. 455 - 457. 1987";
532
		NonViralName<?> nameSpecDet11 = parser.parseReferencedName(strSpecDetail11, null, Rank.SPECIES());
533
		assertTrue(nameSpecDet11.hasProblem());
534
		list = nameSpecDet11.getParsingProblems();
535
		assertTrue("Problem is Detail. Must be pp.", list.contains(ParserProblem.CheckDetailOrYear));
536
		assertEquals(20, nameSpecDet8.getProblemStarts()); //TODO better start behind :
537
		assertEquals(51, nameSpecDet8.getProblemEnds());   //TODO better stop after - 457
538
		
539
		
540
		//no volume, no edition
541
		String strNoVolume = "Abies alba Mill., Sp. Pl.: 455. 1987";
542
		NonViralName<?> nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
543
		assertFalse(nameNoVolume.hasProblem());
544
		assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
545
		assertEquals(null, ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
546
		assertEquals(null, ((IBook)nameNoVolume.getNomenclaturalReference()).getEdition());
547

    
548
		//volume, no edition
549
		strNoVolume = "Abies alba Mill., Sp. Pl. 2: 455. 1987";
550
		nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
551
		assertFalse(nameNoVolume.hasProblem());
552
		assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
553
		assertEquals("2", ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
554
		assertEquals(null, ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());
555

    
556
		//no volume, edition
557
		strNoVolume = "Abies alba Mill., Sp. Pl. ed. 3: 455. 1987";
558
		nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
559
		assertFalse(nameNoVolume.hasProblem());
560
		assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
561
		assertEquals(null, ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
562
		assertEquals("3", ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());
563
		
564
		//volume, edition
565
		strNoVolume = "Abies alba Mill., Sp. Pl. ed. 3, 4(5): 455. 1987";
566
		nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());
567
		assertFalse(nameNoVolume.hasProblem());
568
		assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());
569
		assertEquals("4(5)", ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());
570
		assertEquals("3", ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());
571
		
572
		String strUnparsableInRef = "Abies alba Mill. in -er46: 455. 1987";
573
		NonViralName<?> nameUnparsableInRef = parser.parseReferencedName(strUnparsableInRef, null, Rank.SPECIES());
574
		assertTrue(nameUnparsableInRef.hasProblem());
575
		list = nameUnparsableInRef.getParsingProblems();
576
		assertTrue("Unparsable title", list.contains(ParserProblem.UnparsableReferenceTitle));
577
		assertEquals(strUnparsableInRef, nameUnparsableInRef.getFullTitleCache());
578
		assertEquals(20, nameUnparsableInRef.getProblemStarts()); 
579
		assertEquals(25, nameUnparsableInRef.getProblemEnds());   
580
		
581
		
582
		//volume, edition
583
		String strNoSeparator = "Abies alba Mill. Sp. Pl. ed. 3, 4(5): 455. 1987";
584
		NonViralName<?> nameNoSeparator = parser.parseReferencedName(strNoSeparator, NomenclaturalCode.ICBN, Rank.SPECIES());
585
		assertTrue(nameNoSeparator.hasProblem());
586
		list = nameNoSeparator.getParsingProblems();
587
		assertTrue("Problem is missing name-reference separator", list.contains(ParserProblem.NameReferenceSeparation));
588
		assertEquals(strNoSeparator, nameNoSeparator.getFullTitleCache());
589
		assertEquals(10, nameNoSeparator.getProblemStarts()); //TODO better start behind Mill. (?)
590
		assertEquals(47, nameNoSeparator.getProblemEnds());   //TODO better stop before :
591
		
592
		String strUnparsableInRef2 = "Hieracium pepsicum L., My Bookkkk 1. 1903";
593
		NonViralName<?> nameUnparsableInRef2 = parser.parseReferencedName(strUnparsableInRef2, null, Rank.SPECIES());
594
		assertTrue(nameUnparsableInRef2.hasProblem());
595
		list = nameUnparsableInRef2.getParsingProblems();
596
		assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
597
		assertEquals(strUnparsableInRef2, nameUnparsableInRef2.getFullTitleCache());
598
		assertEquals(23, nameUnparsableInRef2.getProblemStarts()); 
599
		assertEquals(41, nameUnparsableInRef2.getProblemEnds());   
600
	
601
		
602
		String strUnparsableInRef3 = "Hieracium pespcim N., My Bookkkk 1. 1902";
603
		NonViralName<?> nameUnparsableInRef3 = parser.parseReferencedName(strUnparsableInRef3, null, null);
604
		assertTrue(nameUnparsableInRef3.hasProblem());
605
		list = nameUnparsableInRef3.getParsingProblems();
606
		assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
607
		assertEquals(strUnparsableInRef3, nameUnparsableInRef3.getFullTitleCache());
608
		assertEquals(22, nameUnparsableInRef3.getProblemStarts()); 
609
		assertEquals(40, nameUnparsableInRef3.getProblemEnds());   
610
	
611
		String strUnparsableInRef4 = "Hieracium pepsicum (Hsllreterto) L., My Bookkkk 1. 1903";
612
		NonViralName<?> nameUnparsableInRef4 = parser.parseReferencedName(strUnparsableInRef4, null, null);
613
		assertTrue(nameUnparsableInRef4.hasProblem());
614
		list = nameUnparsableInRef4.getParsingProblems();
615
		assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
616
		assertEquals(strUnparsableInRef4, nameUnparsableInRef4.getFullTitleCache());
617
		assertEquals(37, nameUnparsableInRef4.getProblemStarts()); 
618
		assertEquals(55, nameUnparsableInRef4.getProblemEnds());   
619
		
620
		String strSameName = "Hieracium pepcum (Hsllreterto) L., My Bokkk 1. 1903";
621
		NonViralName<?> nameSameName = nameUnparsableInRef4;
622
		parser.parseReferencedName(nameSameName, strSameName, null, true);
623
		assertTrue(nameSameName.hasProblem());
624
		list = nameSameName.getParsingProblems();
625
		assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
626
		assertEquals(strSameName, nameSameName.getFullTitleCache());
627
		assertEquals(35, nameSameName.getProblemStarts()); 
628
		assertEquals(51, nameSameName.getProblemEnds());   
629
		
630
		String strGenusUnparse = "Hieracium L., jlklk";
631
		NonViralName<?> nameGenusUnparse = 
632
			parser.parseReferencedName(strGenusUnparse, null, null);
633
		assertTrue(nameGenusUnparse.hasProblem());
634
		list = nameGenusUnparse.getParsingProblems();
635
		assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));
636
		assertTrue("Problem uninomial", list.contains(ParserProblem.CheckRank));
637
		assertEquals(strGenusUnparse, nameGenusUnparse.getFullTitleCache());
638
		assertEquals(0, nameGenusUnparse.getProblemStarts()); 
639
		assertEquals(19, nameGenusUnparse.getProblemEnds());   
640
		
641
		String strGenusUnparse2 = "Hieracium L., Per Luigi: 44. 1987";
642
		NonViralName<?> nameGenusUnparse2 = 
643
			parser.parseReferencedName(strGenusUnparse2, null, Rank.FAMILY());
644
		assertFalse(nameGenusUnparse2.hasProblem());
645
		assertEquals(strGenusUnparse2, nameGenusUnparse2.getFullTitleCache());
646
		assertEquals(-1, nameGenusUnparse2.getProblemStarts()); 
647
		assertEquals(-1, nameGenusUnparse2.getProblemEnds());
648

    
649
		String strBookSection2 = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz, ed. 2, 2: 288. 1905-1907";
650
		String strBookSection2NoComma = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905-1907";
651
		NonViralName<?> nameBookSection2 = 
652
			parser.parseReferencedName(strBookSection2, null, null);
653
		assertFalse(nameBookSection2.hasProblem());
654
		assertEquals(strBookSection2NoComma, nameBookSection2.getFullTitleCache());
655
		assertEquals(-1, nameBookSection2.getProblemStarts()); 
656
		assertEquals(-1, nameBookSection2.getProblemEnds());
657
		assertNull((nameBookSection2.getNomenclaturalReference()).getDatePublished().getStart());
658
		assertEquals("1905-1907", ((IBookSection)nameBookSection2.getNomenclaturalReference()).getInBook().getDatePublished().getYear());
659

    
660
		
661
		String strBookSection = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905";
662
		NonViralName<?> nameBookSection = 
663
			parser.parseReferencedName(strBookSection, null, null);
664
		assertFalse(nameBookSection.hasProblem());
665
		assertEquals(strBookSection, nameBookSection.getFullTitleCache());
666
		assertEquals(-1, nameBookSection.getProblemStarts()); 
667
		assertEquals(-1, nameBookSection.getProblemEnds());
668
		assertNull(((IBookSection)nameBookSection.getNomenclaturalReference()).getInBook().getDatePublished().getStart());
669
		assertEquals("1905", ((IBookSection)nameBookSection.getNomenclaturalReference()).getDatePublished().getYear());
670

    
671
		String strXXXs = "Abies alba, Soer der 1987";
672
		NonViralName<?> problemName = parser.parseReferencedName(strXXXs, null, null);
673
		assertTrue(problemName.hasProblem());
674
		list = problemName.getParsingProblems();
675
		assertTrue("Problem must be name-reference separation", list.contains(ParserProblem.NameReferenceSeparation));
676
		parser.parseReferencedName(problemName, strBookSection, null, true);
677
		assertFalse(problemName.hasProblem());
678
		
679
		problemName = parser.parseFullName(strXXXs, null, null);
680
		assertTrue(problemName.hasProblem());
681
		list = problemName.getParsingProblems();
682
		assertTrue("Name part must be unparsable", list.contains(ParserProblem.UnparsableNamePart));
683
		
684
		
685
		String testParsable = "Pithecellobium macrostachyum Benth.";
686
		assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));
687

    
688
		testParsable = "Pithecellobium macrostachyum (Benth.)";
689
		assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));
690
		
691
		testParsable = "Pithecellobium macrostachyum (Benth., 1845)";
692
		assertTrue(isParsable(testParsable, NomenclaturalCode.ICZN));
693

    
694
		testParsable = "Pithecellobium macrostachyum L., Sp. Pl. 3: n\u00B0 123. 1753."; //00B0 is degree character
695
		assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));
696
		
697
		testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur. 6: 1285. 1929";
698
		assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable, NomenclaturalCode.ICBN));
699
		
700
		testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.&Eur. 6: 1285. 1929";
701
		assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable, NomenclaturalCode.ICBN));
702
		
703
		testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur.& 6: 1285. 1929";
704
		assertFalse("Reference title should not support special characters like - and & at the end of the title", isParsable(testParsable, NomenclaturalCode.ICBN));
705
		assertTrue("Problem must be reference title", getProblems(testParsable, NomenclaturalCode.ICBN).
706
				contains(ParserProblem.UnparsableReferenceTitle));
707
		
708
		testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.:Eur. 6: 1285. 1929";
709
		assertFalse("Reference title should not support detail separator", isParsable(testParsable, NomenclaturalCode.ICBN));
710
		assertTrue("Problem must be reference title", getProblems(testParsable, NomenclaturalCode.ICBN).
711
				contains(ParserProblem.UnparsableReferenceTitle));
712

    
713
		testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
714
		assertTrue("Reference title should support brackets", isParsable(testParsable, NomenclaturalCode.ICBN));
715

    
716
		testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
717
		assertTrue("Reference title should support brackets", isParsable(testParsable, NomenclaturalCode.ICBN));
718
		
719
		testParsable = "Hieracium lachenalii Zahn, nom. illeg.";
720
		assertTrue("Reference should not be obligatory if a nom status exist", isParsable(testParsable, NomenclaturalCode.ICBN));
721
	
722
		testParsable = "Hieracium lachenalii, nom. illeg.";
723
		assertTrue("Authorship should not be obligatory if followed by nom status", isParsable(testParsable, NomenclaturalCode.ICBN));
724

    
725
		testParsable = "Hieracium lachenalii, Ill. Fl. (Mitt.) 6: 1285. 1929";
726
		assertFalse("Author is obligatory if followed by reference", isParsable(testParsable, NomenclaturalCode.ICBN));
727
		assertTrue("Problem must be name-reference separation", getProblems(testParsable, NomenclaturalCode.ICBN).
728
				contains(ParserProblem.NameReferenceSeparation));
729

    
730
		testParsable = "Hieracium lachenalii in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";
731
		assertFalse("Author is obligatory if followed by reference", isParsable(testParsable, NomenclaturalCode.ICBN));
732
		assertTrue("Problem must be name-reference separation", getProblems(testParsable, NomenclaturalCode.ICBN).
733
				contains(ParserProblem.NameReferenceSeparation));
734
		
735
		testParsable = "Abies alba Mill. var. alba";
736
		assertTrue("Autonym problem", isParsable(testParsable, NomenclaturalCode.ICBN));
737

    
738
	}
739
	
740
	/**
741
	 * @param testParsable
742
	 * @param icbn
743
	 * @return
744
	 */
745
	private List<ParserProblem> getProblems(String string, NomenclaturalCode code) {
746
		List<ParserProblem> result;
747
		result = parser.parseReferencedName(string, code, null).getParsingProblems();
748
		return result;
749
	}
750

    
751
	private boolean isParsable(String string, NomenclaturalCode code){
752
		NonViralName<?> name = parser.parseReferencedName(string, code, null);
753
		return ! name.hasProblem();
754
	}
755

    
756
	private void assertFullRefNameStandard(NonViralName<?> name){
757
		assertEquals("Abies", name.getGenusOrUninomial());
758
		assertEquals("alba", name.getSpecificEpithet());
759
		assertEquals("Mill.", name.getAuthorshipCache());
760
		assertEquals("455", name.getNomenclaturalMicroReference());
761
		assertNotNull(name.getNomenclaturalReference());
762
	}
763
	
764
	private void assertFullRefStandard(NonViralName<?> name){
765
		assertEquals("Abies", name.getGenusOrUninomial());
766
		assertEquals("alba", name.getSpecificEpithet());
767
		assertEquals("Mill.", name.getAuthorshipCache());
768
		assertEquals("455", name.getNomenclaturalMicroReference());
769
		assertNotNull(name.getNomenclaturalReference());
770
		INomenclaturalReference ref = (INomenclaturalReference)name.getNomenclaturalReference();
771
		assertEquals("1987", ref.getYear());
772
		ReferenceBase refBase = (ReferenceBase)ref;
773
		assertEquals("Sp. Pl.", refBase.getTitle());
774
	}
775

    
776
	/**
777
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#fullTeams(java.lang.String)}.
778
	 */
779
	@Test
780
	public final void testFullTeams() {
781
		logger.warn("Not yet implemented"); // TODO
782
	}
783

    
784
	/**
785
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#authorTeamAndEx(java.lang.String)}.
786
	 */
787
	@Test
788
	public final void testAuthorTeamAndEx() {
789
		logger.warn("Not yet implemented"); // TODO
790
	}
791

    
792
	/**
793
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#authorTeam(java.lang.String)}.
794
	 */
795
	@Test
796
	public final void testAuthorTeam() {
797
		logger.warn("Not yet implemented"); // TODO
798
	}
799

    
800
	/**
801
	 * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseCultivar(java.lang.String)}.
802
	 */
803
	@Test
804
	public final void testParseCultivar() {
805
		logger.warn("Not yet implemented"); // TODO
806
	}
807

    
808
}
(1-1/2)