new unit test for #1556
[cdmlib.git] / cdmlib-model / src / test / java / eu / etaxonomy / cdm / strategy / parser / NonViralNameParserImplTest.java
index 4986f7175407124aa6fd335bf0d27c21d86d5761..82e0f1208e63b78317376053f0a6aa0f397c372e 100644 (file)
@@ -17,28 +17,36 @@ import static org.junit.Assert.assertTrue;
 \r
 import java.lang.reflect.InvocationTargetException;\r
 import java.lang.reflect.Method;\r
+import java.util.List;\r
+\r
+import junit.framework.Assert;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.junit.After;\r
 import org.junit.AfterClass;\r
 import org.junit.Before;\r
 import org.junit.BeforeClass;\r
-import org.junit.Ignore;\r
 import org.junit.Test;\r
 \r
+import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
+import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
-import eu.etaxonomy.cdm.model.reference.Article;\r
-import eu.etaxonomy.cdm.model.reference.Book;\r
-import eu.etaxonomy.cdm.model.reference.BookSection;\r
+//import eu.etaxonomy.cdm.model.reference.Article;\r
+//import eu.etaxonomy.cdm.model.reference.Book;\r
+//import eu.etaxonomy.cdm.model.reference.BookSection;\r
+import eu.etaxonomy.cdm.model.reference.IArticle;\r
+import eu.etaxonomy.cdm.model.reference.IBook;\r
+import eu.etaxonomy.cdm.model.reference.IBookSection;\r
+import eu.etaxonomy.cdm.model.reference.IJournal;\r
 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;\r
-import eu.etaxonomy.cdm.model.reference.Journal;\r
-import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;\r
-\r
+import eu.etaxonomy.cdm.model.reference.IVolumeReference;\r
+//import eu.etaxonomy.cdm.model.reference.Journal;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 /**\r
  * @author a.mueller\r
  *\r
@@ -48,15 +56,15 @@ public class NonViralNameParserImplTest {
        \r
        final private String strNameFamily = "Asteraceae";\r
        final private String strNameGenus = "Abies Mueller";\r
-       final private String strNameGenusUnicode = "Abies Müller";\r
+       final private String strNameGenusUnicode = "Abies M\u00FCller";\r
        final private String strNameAbies1 = "Abies alba";\r
        final private String strNameAbiesSub1 = "Abies alba subsp. beta";\r
        final private String strNameAbiesAuthor1 = "Abies alba Mueller";\r
-       final private String strNameAbiesAuthor1Unicode = "Abies alba Müller";\r
+       final private String strNameAbiesAuthor1Unicode = "Abies alba M\u00FCller";\r
        final private String strNameAbiesBasionymAuthor1 = "Abies alba (Ciardelli) D'Mueller";\r
-       final private String strNameAbiesBasionymAuthor1Unicode = "Abies alba (Ciardelli) D'Müller";\r
+       final private String strNameAbiesBasionymAuthor1Unicode = "Abies alba (Ciardelli) D'M\u00FCller";\r
        final private String strNameAbiesBasionymExAuthor1 ="Abies alba (Ciardelli ex Doering) D'Mueller ex. de Greuther"; \r
-       final private String strNameAbiesBasionymExAuthor1Unicode ="Abies alba (Ciardelli ex Döring) D'üller ex. de Greuther"; \r
+       final private String strNameAbiesBasionymExAuthor1Unicode ="Abies alba (Ciardelli ex D\u00F6ring) D'M\u00FCller ex. de Greuther"; \r
        final private String strNameTeam1 = "Abies alba Mueller & L."; \r
        final private String strNameZoo1 = "Abies alba Mueller & L., 1822";\r
        final private String strNameZoo2 = "Abies alba (Mueller, 1822) Ciardelli, 2002";\r
@@ -64,7 +72,7 @@ public class NonViralNameParserImplTest {
        final private String strNameEmpty = "";\r
        final private String strNameNull = null;\r
        \r
-       private INonViralNameParser<NonViralName<?>> parser ;\r
+       private NonViralNameParserImpl parser ;\r
        private NomenclaturalCode botanicCode; \r
        \r
        /**\r
@@ -72,6 +80,8 @@ public class NonViralNameParserImplTest {
         */\r
        @BeforeClass\r
        public static void setUpBeforeClass() throws Exception {\r
+               DefaultTermInitializer termInitializer = new DefaultTermInitializer();\r
+               termInitializer.initialize();\r
        }\r
 \r
        /**\r
@@ -87,7 +97,7 @@ public class NonViralNameParserImplTest {
        @Before\r
        public void setUp() throws Exception {\r
                parser = NonViralNameParserImpl.NewInstance();\r
-               botanicCode = NomenclaturalCode.ICBN();\r
+               botanicCode = NomenclaturalCode.ICBN;\r
        }\r
 \r
        /**\r
@@ -103,8 +113,8 @@ public class NonViralNameParserImplTest {
         * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#NEW_INSTANCE()}.\r
         */\r
        @Test\r
-       public final void testNEW_INSTANCE() {\r
-               logger.warn("Not yet implemented"); // TODO\r
+       public final void testNewInstance() {\r
+               assertNotNull(parser);\r
        }\r
 \r
        /**\r
@@ -120,7 +130,36 @@ public class NonViralNameParserImplTest {
         */\r
        @Test\r
        public final void testParseSimpleName() {\r
-               logger.warn("Not yet implemented"); // TODO\r
+               \r
+               //Uninomials\r
+               ZoologicalName milichiidae = (ZoologicalName)parser.parseSimpleName("Milichiidae", NomenclaturalCode.ICZN, null);\r
+               assertEquals("Family rank expected", Rank.FAMILY(), milichiidae.getRank());\r
+               BotanicalName crepidinae = (BotanicalName)parser.parseSimpleName("Crepidinae", NomenclaturalCode.ICBN, null);\r
+               assertEquals("Family rank expected", Rank.SUBTRIBE(), crepidinae.getRank());\r
+               BotanicalName abies = (BotanicalName)parser.parseSimpleName("Abies", NomenclaturalCode.ICBN, null);\r
+               assertEquals("Family rank expected", Rank.GENUS(), abies.getRank());\r
+               \r
+               abies.addParsingProblem(ParserProblem.CheckRank);\r
+               parser.parseSimpleName(abies, "Abies", abies.getRank(), true);\r
+               assertTrue(abies.getParsingProblems().contains(ParserProblem.CheckRank));\r
+               \r
+               BotanicalName rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);\r
+               assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));\r
+               assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+               parser.parseSimpleName(rosa, "Rosaceaex", abies.getRank(), true);\r
+               assertEquals("Rosaceaex have rank genus", Rank.GENUS(), rosa.getRank());\r
+               assertTrue("Rosaceaex must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+       \r
+               //repeat but remove warning after first parse\r
+               rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);\r
+               assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));\r
+               assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+               rosa.removeParsingProblem(ParserProblem.CheckRank);\r
+               parser.parseSimpleName(rosa, "Rosaceaex", rosa.getRank(), true);\r
+               assertEquals("Rosaceaex have rank family", Rank.FAMILY(), rosa.getRank());\r
+               assertFalse("Rosaceaex must have no rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+\r
+               \r
        }\r
 \r
        /**\r
@@ -143,29 +182,42 @@ public class NonViralNameParserImplTest {
         * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.\r
         */\r
        @Test\r
-       @Ignore //TODO Character encoding in svn\r
        public final void testParseFullNameUnicode() {\r
 \r
                NonViralName nameAuthor = parser.parseFullName(strNameAbiesAuthor1Unicode, null, Rank.SPECIES());\r
                assertEquals("Abies", nameAuthor.getGenusOrUninomial());\r
                assertEquals("alba", nameAuthor.getSpecificEpithet());\r
-               assertEquals("Müller", nameAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("M\u00FCller", nameAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
                \r
                NonViralName nameBasionymAuthor = parser.parseFullName(strNameAbiesBasionymAuthor1Unicode, null, Rank.SPECIES());\r
                assertEquals("Abies", nameBasionymAuthor.getGenusOrUninomial());\r
                assertEquals("alba", nameBasionymAuthor.getSpecificEpithet());\r
-               assertEquals("D'Müller", nameBasionymAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
-               BotanicalName basionym = (BotanicalName)nameBasionymAuthor.getBasionym();\r
-               assertEquals("Ciardelli", basionym.getCombinationAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("D'M\u00FCller", nameBasionymAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
+               INomenclaturalAuthor basionymTeam = nameBasionymAuthor.getBasionymAuthorTeam();\r
+               assertEquals("Ciardelli", basionymTeam.getNomenclaturalTitle());\r
                \r
                NonViralName nameBasionymExAuthor = parser.parseFullName(strNameAbiesBasionymExAuthor1Unicode, null, Rank.SPECIES());\r
                assertEquals("Abies", nameBasionymExAuthor.getGenusOrUninomial());\r
                assertEquals("alba", nameBasionymExAuthor.getSpecificEpithet());\r
-               assertEquals("D'Müller", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
-               assertEquals("de Greuther", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());\r
-               BotanicalName basionym2 = (BotanicalName)nameBasionymExAuthor.getBasionym();\r
-               assertEquals("Ciardelli", basionym2.getCombinationAuthorTeam().getNomenclaturalTitle());\r
-               assertEquals("Döring", basionym2.getExCombinationAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("D'M\u00FCller", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("de Greuther", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
+               INomenclaturalAuthor basionymTeam2 = nameBasionymExAuthor.getExBasionymAuthorTeam();\r
+               assertEquals("Ciardelli", basionymTeam2.getNomenclaturalTitle());\r
+               INomenclaturalAuthor exBasionymTeam2 = nameBasionymExAuthor.getBasionymAuthorTeam();\r
+               assertEquals("D\u00F6ring", exBasionymTeam2.getNomenclaturalTitle());\r
+               \r
+               BotanicalName nameBasionymExAuthor2 = (BotanicalName)parser.parseFullName("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", null, Rank.SPECIES());\r
+               assertEquals("Washingtonia", nameBasionymExAuthor2.getGenusOrUninomial());\r
+               assertEquals("filifera", nameBasionymExAuthor2.getSpecificEpithet());\r
+               assertEquals("H.Wendl.", nameBasionymExAuthor2.getExCombinationAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("de Bary", nameBasionymExAuthor2.getCombinationAuthorTeam().getNomenclaturalTitle());\r
+               INomenclaturalAuthor basionymTeam3 = nameBasionymExAuthor2.getBasionymAuthorTeam();\r
+               assertEquals("Andre", basionymTeam3.getNomenclaturalTitle());\r
+               INomenclaturalAuthor exBasionymTeam3 = nameBasionymExAuthor2.getExBasionymAuthorTeam();\r
+               assertEquals("Linden", exBasionymTeam3.getNomenclaturalTitle());\r
+               String title = nameBasionymExAuthor2.generateTitle();\r
+               assertEquals("Washingtonia filifera (Linden ex Andre) H.Wendl. ex de Bary", title);\r
+       \r
        }\r
        \r
        \r
@@ -197,7 +249,7 @@ public class NonViralNameParserImplTest {
                assertEquals( "Abies", nameZoo1.getGenusOrUninomial());\r
                assertEquals( "alba", nameZoo1.getSpecificEpithet());\r
                assertEquals("Mueller & L.",  nameZoo1.getCombinationAuthorTeam().getNomenclaturalTitle());\r
-               assertEquals(NomenclaturalCode.ICZN(), nameZoo1.getNomenclaturalCode() );\r
+               assertEquals(NomenclaturalCode.ICZN, nameZoo1.getNomenclaturalCode() );\r
                assertEquals(Integer.valueOf(1822), nameZoo1.getPublicationYear());\r
                assertTrue(nameZoo1.getCombinationAuthorTeam() instanceof Team);\r
                Team teamZoo = (Team)nameZoo1.getCombinationAuthorTeam();\r
@@ -210,6 +262,9 @@ public class NonViralNameParserImplTest {
                assertEquals("Mueller",  nameZoo2.getBasionymAuthorTeam().getNomenclaturalTitle());\r
                assertEquals("Ciardelli",  nameZoo2.getCombinationAuthorTeam().getNomenclaturalTitle());\r
                \r
+               //Autonym\r
+               BotanicalName autonymName = (BotanicalName)parser.parseFullName("Abies alba Mill. var. alba", NomenclaturalCode.ICBN, null);\r
+               assertFalse("Autonym should be parsable", autonymName.hasProblem());\r
                \r
                \r
                //empty\r
@@ -220,6 +275,12 @@ public class NonViralNameParserImplTest {
                //null\r
                NonViralName nameNull = parser.parseFullName(strNameNull);\r
                assertNull(nameNull);\r
+               \r
+               //some authors\r
+               String fullNameString = "Abies alba (Greuther & L'Hiver & al. ex Müller & Schmidt)Clark ex Ciardelli"; \r
+               BotanicalName authorname = (BotanicalName)parser.parseFullName(fullNameString);\r
+               assertFalse(authorname.hasProblem());\r
+               assertEquals("Basionym author should have 3 authors", 3, ((Team)authorname.getExBasionymAuthorTeam()).getTeamMembers().size());\r
        }\r
        \r
        private void testName_StringNomcodeRank(Method parseMethod) \r
@@ -243,10 +304,10 @@ public class NonViralNameParserImplTest {
                NonViralName nameBasionymExAuthor = (NonViralName)parseMethod.invoke(parser, strNameAbiesBasionymExAuthor1, null, Rank.SPECIES());\r
                assertEquals("Abies", nameBasionymExAuthor.getGenusOrUninomial());\r
                assertEquals("alba", nameBasionymExAuthor.getSpecificEpithet());\r
-               assertEquals("D'Mueller", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
-               assertEquals("de Greuther", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());\r
-               assertEquals("Ciardelli", nameBasionymExAuthor.getBasionymAuthorTeam().getNomenclaturalTitle());\r
-               assertEquals("Doering", nameBasionymExAuthor.getExBasionymAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("D'Mueller", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("de Greuther", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("Ciardelli", nameBasionymExAuthor.getExBasionymAuthorTeam().getNomenclaturalTitle());\r
+               assertEquals("Doering", nameBasionymExAuthor.getBasionymAuthorTeam().getNomenclaturalTitle());\r
                \r
                NonViralName name2 = (NonViralName)parseMethod.invoke(parser, strNameAbiesSub1, null, Rank.SPECIES());\r
                assertEquals("Abies", name2.getGenusOrUninomial());\r
@@ -258,7 +319,8 @@ public class NonViralNameParserImplTest {
                // unparseable *********\r
                String problemString = "sdfjlös wer eer wer";\r
                NonViralName<?> nameProblem = (NonViralName<?>)parseMethod.invoke(parser, problemString, null, Rank.SPECIES());\r
-               assertTrue(nameProblem.getHasProblem());\r
+               List<ParserProblem> list = nameProblem.getParsingProblems();\r
+               assertTrue(nameProblem.getParsingProblem()!=0);\r
                assertEquals(problemString, nameProblem.getTitleCache());\r
        }\r
        \r
@@ -274,12 +336,13 @@ public class NonViralNameParserImplTest {
                        e.printStackTrace();\r
                        assertTrue(false);\r
                }\r
+\r
                \r
                //null\r
                String strNull = null;\r
                NonViralName<?> nameNull = parser.parseReferencedName(strNull, null, Rank.SPECIES());\r
                assertNull(nameNull);\r
-               \r
+                               \r
                //Empty\r
                String strEmpty = "";\r
                NonViralName<?> nameEmpty = parser.parseReferencedName(strEmpty, null, Rank.SPECIES());\r
@@ -288,20 +351,20 @@ public class NonViralNameParserImplTest {
                assertNull(nameEmpty.getNomenclaturalMicroReference());\r
                \r
                \r
-               \r
                //Whitespaces\r
                String strFullWhiteSpcaceAndDot = "Abies alba Mill.,  Sp.   Pl.  4:  455 .  1987 .";\r
                NonViralName<?> namefullWhiteSpcaceAndDot = parser.parseReferencedName(strFullWhiteSpcaceAndDot, null, Rank.SPECIES());\r
                assertFullRefStandard(namefullWhiteSpcaceAndDot);\r
-               assertTrue(namefullWhiteSpcaceAndDot.getNomenclaturalReference() instanceof Book);\r
+               assertTrue(((ReferenceBase)namefullWhiteSpcaceAndDot.getNomenclaturalReference()).getType().equals(eu.etaxonomy.cdm.model.reference.ReferenceType.Book));\r
                assertEquals( "Abies alba Mill., Sp. Pl. 4: 455. 1987", namefullWhiteSpcaceAndDot.getFullTitleCache());\r
 \r
                //Book\r
                String fullReference = "Abies alba Mill., Sp. Pl. 4: 455. 1987";\r
                NonViralName<?> name1 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());\r
                assertFullRefStandard(name1);\r
-               assertTrue(name1.getNomenclaturalReference() instanceof Book);\r
+               assertTrue(((ReferenceBase)name1.getNomenclaturalReference()).getType().equals(eu.etaxonomy.cdm.model.reference.ReferenceType.Book));\r
                assertEquals(fullReference, name1.getFullTitleCache());\r
+               assertTrue("Name author and reference author should be the same", name1.getCombinationAuthorTeam() == ((ReferenceBase)name1.getNomenclaturalReference()).getAuthorTeam());\r
                \r
                //Book Section\r
                fullReference = "Abies alba Mill. in Otto, Sp. Pl. 4(6): 455. 1987";\r
@@ -309,17 +372,17 @@ public class NonViralNameParserImplTest {
                assertFullRefNameStandard(name2);\r
                assertEquals(fullReference, name2.getFullTitleCache());\r
                assertFalse(name2.hasProblem());\r
-               INomenclaturalReference<?> ref = name2.getNomenclaturalReference();\r
-               assertEquals(BookSection.class, ref.getClass());\r
-               BookSection bookSection = (BookSection)ref;\r
-               Book inBook = bookSection.getInBook();\r
+               INomenclaturalReference ref = name2.getNomenclaturalReference();\r
+               assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.BookSection, ((ReferenceBase)ref).getType());\r
+               IBookSection bookSection = (IBookSection) ref;\r
+               IBook inBook = bookSection.getInBook();\r
                assertNotNull(inBook);\r
                assertNotNull(inBook.getAuthorTeam());\r
                assertEquals("Otto", inBook.getAuthorTeam().getTitleCache());\r
-               assertEquals("Otto, Sp. Pl. 4(6). 1987", inBook.getTitleCache());\r
+               assertEquals("Otto, Sp. Pl. 4(6)", inBook.getTitleCache());\r
                assertEquals("Sp. Pl.", inBook.getTitle());\r
                assertEquals("4(6)", inBook.getVolume());\r
-\r
+               assertTrue("Name author and reference author should be the same", name2.getCombinationAuthorTeam() == ((ReferenceBase)name2.getNomenclaturalReference()).getAuthorTeam());\r
                \r
                //Article\r
                fullReference = "Abies alba Mill. in Sp. Pl. 4(6): 455. 1987";\r
@@ -328,14 +391,15 @@ public class NonViralNameParserImplTest {
                assertEquals(fullReference, name3.getFullTitleCache());\r
                assertFalse(name3.hasProblem());\r
                ref = name3.getNomenclaturalReference();\r
-               assertEquals(Article.class, ref.getClass());\r
-               Article article = (Article)ref;\r
-               Journal journal = article.getInJournal();\r
+               assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.Article, ref.getType());\r
+               //Article article = (Article)ref;\r
+               IJournal journal = ((IArticle)ref).getInJournal();\r
                assertNotNull(journal);\r
                //assertEquals("Sp. Pl. 4(6)", inBook.getTitleCache());\r
-               assertEquals("Sp. Pl.", journal.getTitleCache());\r
+               assertEquals("Sp. Pl.",((ReferenceBase) journal).getTitleCache());\r
                assertEquals("Sp. Pl.", journal.getTitle());\r
-               assertEquals("4(6)", article.getVolume());\r
+               assertEquals("4(6)",((IArticle)ref).getVolume());\r
+               assertTrue("Name author and reference author should be the same", name3.getCombinationAuthorTeam() == name3.getNomenclaturalReference().getAuthorTeam());\r
                \r
                //SoftArticle - having "," on position > 4\r
                String journalTitle = "Bull. Soc. Bot.France. Louis., Roi";\r
@@ -349,26 +413,46 @@ public class NonViralNameParserImplTest {
                assertFullRefNameStandard(name4);\r
                assertEquals(fullReferenceWithoutYear + " " + parsedYear, name4.getFullTitleCache());\r
                ref = name4.getNomenclaturalReference();\r
-               assertEquals(Article.class, ref.getClass());\r
-               article = (Article)ref;\r
+               assertEquals(eu.etaxonomy.cdm.model.reference.ReferenceType.Article, ref.getType());\r
+               //article = (Article)ref;\r
                assertEquals(parsedYear, ref.getYear());\r
-               journal = article.getInJournal();\r
+               journal = ((IArticle)ref).getInJournal();\r
                assertNotNull(journal);\r
-               assertEquals(journalTitle, journal.getTitleCache());\r
+               assertEquals(journalTitle, ((ReferenceBase) journal).getTitleCache());\r
                assertEquals(journalTitle, journal.getTitle());\r
-               assertEquals("4(6)", article.getVolume());\r
+               assertEquals("4(6)", ((IArticle)ref).getVolume());\r
                \r
                //Zoo name\r
                String strNotParsableZoo = "Abies alba M., 1923, Sp. P. xxwer4352, nom. inval.";\r
                ZoologicalName nameZooRefNotParsabel = (ZoologicalName)parser.parseReferencedName(strNotParsableZoo, null, null);\r
                assertTrue(nameZooRefNotParsabel.hasProblem());\r
+               List<ParserProblem> list = nameZooRefNotParsabel.getParsingProblems();\r
+               assertTrue("List must contain detail and year warning ", list.contains(ParserProblem.CheckDetailOrYear));\r
                assertEquals(21, nameZooRefNotParsabel.getProblemStarts());\r
                assertEquals(37, nameZooRefNotParsabel.getProblemEnds());\r
                assertTrue(nameZooRefNotParsabel.getNomenclaturalReference().hasProblem());\r
-               assertEquals(NomenclaturalCode.ICZN(), nameZooRefNotParsabel.getNomenclaturalCode());\r
+               list = nameZooRefNotParsabel.getNomenclaturalReference().getParsingProblems();\r
+               assertTrue("List must contain detail and year warning ", list.contains(ParserProblem.CheckDetailOrYear));\r
+               \r
+               assertEquals(NomenclaturalCode.ICZN, nameZooRefNotParsabel.getNomenclaturalCode());\r
                assertEquals(Integer.valueOf(1923), nameZooRefNotParsabel.getPublicationYear());\r
                assertEquals(1, nameZooRefNotParsabel.getStatus().size());\r
 \r
+               String strZooNameSineYear = "Homo sapiens L., 1758, Sp. An. 3: 345";\r
+               ZoologicalName nameZooNameSineYear = (ZoologicalName)parser.parseReferencedName(strZooNameSineYear);\r
+               assertFalse(nameZooNameSineYear.hasProblem());\r
+               assertEquals("Name without reference year must have year", (Integer)1758, nameZooNameSineYear.getPublicationYear());\r
+               assertEquals("Name without reference year must have year", "1758", nameZooNameSineYear.getNomenclaturalReference().getYear());\r
+               \r
+               String strZooNameNewCombination = "Homo sapiens (L., 1758) Mill., 1830, Sp. An. 3: 345";\r
+               ZoologicalName nameZooNameNewCombination = (ZoologicalName)parser.parseReferencedName(strZooNameNewCombination);\r
+               assertTrue(nameZooNameNewCombination.hasProblem());\r
+               list = nameZooNameNewCombination.getParsingProblems();\r
+               assertTrue("List must contain new combination has publication warning ", list.contains(ParserProblem.NewCombinationHasPublication));\r
+               assertEquals(35, nameZooNameNewCombination.getProblemStarts());\r
+               assertEquals(51, nameZooNameNewCombination.getProblemEnds());\r
+               \r
+               \r
                //Special MicroRefs\r
                String strSpecDetail1 = "Abies alba Mill. in Sp. Pl. 4(6): [455]. 1987";\r
                NonViralName<?> nameSpecDet1 = parser.parseReferencedName(strSpecDetail1 + ".", null, Rank.SPECIES());\r
@@ -400,12 +484,12 @@ public class NonViralNameParserImplTest {
                \r
                \r
                //Special MicroRefs\r
-               String strSpecDetail5 = "Abies alba Mill. in Sp. Pl. 4(6): Gard n° 4. 1987";\r
+               String strSpecDetail5 = "Abies alba Mill. in Sp. Pl. 4(6): Gard n\u00B0 4. 1987";\r
                fullReference = strSpecDetail5 + ".";\r
                NonViralName<?> nameSpecDet5 = parser.parseReferencedName(fullReference, null, Rank.SPECIES());\r
                assertFalse(nameSpecDet5.hasProblem());\r
                assertEquals(strSpecDetail5, nameSpecDet5.getFullTitleCache());\r
-               assertEquals("Gard n° 4", nameSpecDet5.getNomenclaturalMicroReference());\r
+               assertEquals("Gard n\u00B0 4", nameSpecDet5.getNomenclaturalMicroReference());\r
                \r
                //Special MicroRefs\r
                String strSpecDetail6 = "Abies alba Mill. in Sp. Pl. 4(6): 455a. 1987";\r
@@ -449,6 +533,8 @@ public class NonViralNameParserImplTest {
                String strSpecDetail11 = "Abies alba Mill. in Sp. Pl. 4(6): p. 455 - 457. 1987";\r
                NonViralName<?> nameSpecDet11 = parser.parseReferencedName(strSpecDetail11, null, Rank.SPECIES());\r
                assertTrue(nameSpecDet11.hasProblem());\r
+               list = nameSpecDet11.getParsingProblems();\r
+               assertTrue("Problem is Detail. Must be pp.", list.contains(ParserProblem.CheckDetailOrYear));\r
                assertEquals(20, nameSpecDet8.getProblemStarts()); //TODO better start behind :\r
                assertEquals(51, nameSpecDet8.getProblemEnds());   //TODO better stop after - 457\r
                \r
@@ -458,36 +544,38 @@ public class NonViralNameParserImplTest {
                NonViralName<?> nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());\r
                assertFalse(nameNoVolume.hasProblem());\r
                assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());\r
-               assertEquals(null, ((Book)nameNoVolume.getNomenclaturalReference()).getVolume());\r
-               assertEquals(null, ((Book)nameNoVolume.getNomenclaturalReference()).getEdition());\r
+               assertEquals(null, ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());\r
+               assertEquals(null, ((IBook)nameNoVolume.getNomenclaturalReference()).getEdition());\r
 \r
                //volume, no edition\r
                strNoVolume = "Abies alba Mill., Sp. Pl. 2: 455. 1987";\r
                nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());\r
                assertFalse(nameNoVolume.hasProblem());\r
                assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());\r
-               assertEquals("2", ((Book)nameNoVolume.getNomenclaturalReference()).getVolume());\r
-               assertEquals(null, ((Book)nameNoVolume.getNomenclaturalReference()).getEdition());\r
+               assertEquals("2", ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());\r
+               assertEquals(null, ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());\r
 \r
                //no volume, edition\r
                strNoVolume = "Abies alba Mill., Sp. Pl. ed. 3: 455. 1987";\r
                nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());\r
                assertFalse(nameNoVolume.hasProblem());\r
                assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());\r
-               assertEquals(null, ((Book)nameNoVolume.getNomenclaturalReference()).getVolume());\r
-               assertEquals("3", ((Book)nameNoVolume.getNomenclaturalReference()).getEdition());\r
+               assertEquals(null, ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());\r
+               assertEquals("3", ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());\r
                \r
                //volume, edition\r
                strNoVolume = "Abies alba Mill., Sp. Pl. ed. 3, 4(5): 455. 1987";\r
                nameNoVolume = parser.parseReferencedName(strNoVolume, null, Rank.SPECIES());\r
                assertFalse(nameNoVolume.hasProblem());\r
                assertEquals(strNoVolume, nameNoVolume.getFullTitleCache());\r
-               assertEquals("4(5)", ((Book)nameNoVolume.getNomenclaturalReference()).getVolume());\r
-               assertEquals("3", ((Book)nameNoVolume.getNomenclaturalReference()).getEdition());\r
+               assertEquals("4(5)", ((IVolumeReference)(nameNoVolume.getNomenclaturalReference())).getVolume());\r
+               assertEquals("3", ((IBook)(nameNoVolume.getNomenclaturalReference())).getEdition());\r
                \r
                String strUnparsableInRef = "Abies alba Mill. in -er46: 455. 1987";\r
                NonViralName<?> nameUnparsableInRef = parser.parseReferencedName(strUnparsableInRef, null, Rank.SPECIES());\r
                assertTrue(nameUnparsableInRef.hasProblem());\r
+               list = nameUnparsableInRef.getParsingProblems();\r
+               assertTrue("Unparsable title", list.contains(ParserProblem.UnparsableReferenceTitle));\r
                assertEquals(strUnparsableInRef, nameUnparsableInRef.getFullTitleCache());\r
                assertEquals(20, nameUnparsableInRef.getProblemStarts()); \r
                assertEquals(25, nameUnparsableInRef.getProblemEnds());   \r
@@ -495,8 +583,10 @@ public class NonViralNameParserImplTest {
                \r
                //volume, edition\r
                String strNoSeparator = "Abies alba Mill. Sp. Pl. ed. 3, 4(5): 455. 1987";\r
-               NonViralName<?> nameNoSeparator = parser.parseReferencedName(strNoSeparator, NomenclaturalCode.ICBN(), Rank.SPECIES());\r
+               NonViralName<?> nameNoSeparator = parser.parseReferencedName(strNoSeparator, NomenclaturalCode.ICBN, Rank.SPECIES());\r
                assertTrue(nameNoSeparator.hasProblem());\r
+               list = nameNoSeparator.getParsingProblems();\r
+               assertTrue("Problem is missing name-reference separator", list.contains(ParserProblem.NameReferenceSeparation));\r
                assertEquals(strNoSeparator, nameNoSeparator.getFullTitleCache());\r
                assertEquals(10, nameNoSeparator.getProblemStarts()); //TODO better start behind Mill. (?)\r
                assertEquals(47, nameNoSeparator.getProblemEnds());   //TODO better stop before :\r
@@ -504,6 +594,8 @@ public class NonViralNameParserImplTest {
                String strUnparsableInRef2 = "Hieracium pepsicum L., My Bookkkk 1. 1903";\r
                NonViralName<?> nameUnparsableInRef2 = parser.parseReferencedName(strUnparsableInRef2, null, Rank.SPECIES());\r
                assertTrue(nameUnparsableInRef2.hasProblem());\r
+               list = nameUnparsableInRef2.getParsingProblems();\r
+               assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));\r
                assertEquals(strUnparsableInRef2, nameUnparsableInRef2.getFullTitleCache());\r
                assertEquals(23, nameUnparsableInRef2.getProblemStarts()); \r
                assertEquals(41, nameUnparsableInRef2.getProblemEnds());   \r
@@ -512,6 +604,8 @@ public class NonViralNameParserImplTest {
                String strUnparsableInRef3 = "Hieracium pespcim N., My Bookkkk 1. 1902";\r
                NonViralName<?> nameUnparsableInRef3 = parser.parseReferencedName(strUnparsableInRef3, null, null);\r
                assertTrue(nameUnparsableInRef3.hasProblem());\r
+               list = nameUnparsableInRef3.getParsingProblems();\r
+               assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));\r
                assertEquals(strUnparsableInRef3, nameUnparsableInRef3.getFullTitleCache());\r
                assertEquals(22, nameUnparsableInRef3.getProblemStarts()); \r
                assertEquals(40, nameUnparsableInRef3.getProblemEnds());   \r
@@ -519,6 +613,8 @@ public class NonViralNameParserImplTest {
                String strUnparsableInRef4 = "Hieracium pepsicum (Hsllreterto) L., My Bookkkk 1. 1903";\r
                NonViralName<?> nameUnparsableInRef4 = parser.parseReferencedName(strUnparsableInRef4, null, null);\r
                assertTrue(nameUnparsableInRef4.hasProblem());\r
+               list = nameUnparsableInRef4.getParsingProblems();\r
+               assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));\r
                assertEquals(strUnparsableInRef4, nameUnparsableInRef4.getFullTitleCache());\r
                assertEquals(37, nameUnparsableInRef4.getProblemStarts()); \r
                assertEquals(55, nameUnparsableInRef4.getProblemEnds());   \r
@@ -527,6 +623,8 @@ public class NonViralNameParserImplTest {
                NonViralName<?> nameSameName = nameUnparsableInRef4;\r
                parser.parseReferencedName(nameSameName, strSameName, null, true);\r
                assertTrue(nameSameName.hasProblem());\r
+               list = nameSameName.getParsingProblems();\r
+               assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));\r
                assertEquals(strSameName, nameSameName.getFullTitleCache());\r
                assertEquals(35, nameSameName.getProblemStarts()); \r
                assertEquals(51, nameSameName.getProblemEnds());   \r
@@ -535,6 +633,9 @@ public class NonViralNameParserImplTest {
                NonViralName<?> nameGenusUnparse = \r
                        parser.parseReferencedName(strGenusUnparse, null, null);\r
                assertTrue(nameGenusUnparse.hasProblem());\r
+               list = nameGenusUnparse.getParsingProblems();\r
+               assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));\r
+               assertTrue("Problem uninomial", list.contains(ParserProblem.CheckRank));\r
                assertEquals(strGenusUnparse, nameGenusUnparse.getFullTitleCache());\r
                assertEquals(0, nameGenusUnparse.getProblemStarts()); \r
                assertEquals(19, nameGenusUnparse.getProblemEnds());   \r
@@ -546,17 +647,113 @@ public class NonViralNameParserImplTest {
                assertEquals(strGenusUnparse2, nameGenusUnparse2.getFullTitleCache());\r
                assertEquals(-1, nameGenusUnparse2.getProblemStarts()); \r
                assertEquals(-1, nameGenusUnparse2.getProblemEnds());\r
+\r
+               String strBookSection2 = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz, ed. 2, 2: 288. 1905-1907";\r
+               String strBookSection2NoComma = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905-1907";\r
+               NonViralName<?> nameBookSection2 = \r
+                       parser.parseReferencedName(strBookSection2, null, null);\r
+               assertFalse(nameBookSection2.hasProblem());\r
+               assertEquals(strBookSection2NoComma, nameBookSection2.getFullTitleCache());\r
+               assertEquals(-1, nameBookSection2.getProblemStarts()); \r
+               assertEquals(-1, nameBookSection2.getProblemEnds());\r
+               assertNull((nameBookSection2.getNomenclaturalReference()).getDatePublished().getStart());\r
+               assertEquals("1905-1907", ((IBookSection)nameBookSection2.getNomenclaturalReference()).getInBook().getDatePublished().getYear());\r
+\r
                \r
-               String strBookSection = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz, ed. 2, 2: 288. 1905";\r
+               String strBookSection = "Hieracium vulgatum subsp. acuminatum (Jord.) Zahn in Schinz & Keller, Fl. Schweiz ed. 2, 2: 288. 1905";\r
                NonViralName<?> nameBookSection = \r
                        parser.parseReferencedName(strBookSection, null, null);\r
                assertFalse(nameBookSection.hasProblem());\r
                assertEquals(strBookSection, nameBookSection.getFullTitleCache());\r
                assertEquals(-1, nameBookSection.getProblemStarts()); \r
-               assertEquals(-1, nameBookSection.getProblemEnds());   \r
+               assertEquals(-1, nameBookSection.getProblemEnds());\r
+               assertNull(((IBookSection)nameBookSection.getNomenclaturalReference()).getInBook().getDatePublished().getStart());\r
+               assertEquals("1905", ((IBookSection)nameBookSection.getNomenclaturalReference()).getDatePublished().getYear());\r
+\r
+               String strXXXs = "Abies alba, Soer der 1987";\r
+               NonViralName<?> problemName = parser.parseReferencedName(strXXXs, null, null);\r
+               assertTrue(problemName.hasProblem());\r
+               list = problemName.getParsingProblems();\r
+               assertTrue("Problem must be name-reference separation", list.contains(ParserProblem.NameReferenceSeparation));\r
+               parser.parseReferencedName(problemName, strBookSection, null, true);\r
+               assertFalse(problemName.hasProblem());\r
+               \r
+               problemName = parser.parseFullName(strXXXs, null, null);\r
+               assertTrue(problemName.hasProblem());\r
+               list = problemName.getParsingProblems();\r
+               assertTrue("Name part must be unparsable", list.contains(ParserProblem.UnparsableNamePart));\r
+               \r
+               \r
+               String testParsable = "Pithecellobium macrostachyum Benth.";\r
+               assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));\r
 \r
+               testParsable = "Pithecellobium macrostachyum (Benth.)";\r
+               assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               \r
+               testParsable = "Pithecellobium macrostachyum (Benth., 1845)";\r
+               assertTrue(isParsable(testParsable, NomenclaturalCode.ICZN));\r
+\r
+               testParsable = "Pithecellobium macrostachyum L., Sp. Pl. 3: n\u00B0 123. 1753."; //00B0 is degree character\r
+               assertTrue(isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               \r
+               testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur. 6: 1285. 1929";\r
+               assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               \r
+               testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.&Eur. 6: 1285. 1929";\r
+               assertTrue("Reference title should support special characters as separators like - and &", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               \r
+               testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.-Eur.& 6: 1285. 1929";\r
+               assertFalse("Reference title should not support special characters like - and & at the end of the title", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               assertTrue("Problem must be reference title", getProblems(testParsable, NomenclaturalCode.ICBN).\r
+                               contains(ParserProblem.UnparsableReferenceTitle));\r
+               \r
+               testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. Mitt.:Eur. 6: 1285. 1929";\r
+               assertFalse("Reference title should not support detail separator", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               assertTrue("Problem must be reference title", getProblems(testParsable, NomenclaturalCode.ICBN).\r
+                               contains(ParserProblem.UnparsableReferenceTitle));\r
+\r
+               testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";\r
+               assertTrue("Reference title should support brackets", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+\r
+               testParsable = "Hieracium lachenalii subsp. acuminatum (Jord.) Zahn in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";\r
+               assertTrue("Reference title should support brackets", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               \r
+               testParsable = "Hieracium lachenalii Zahn, nom. illeg.";\r
+               assertTrue("Reference should not be obligatory if a nom status exist", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+       \r
+               testParsable = "Hieracium lachenalii, nom. illeg.";\r
+               assertTrue("Authorship should not be obligatory if followed by nom status", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+\r
+               testParsable = "Hieracium lachenalii, Ill. Fl. (Mitt.) 6: 1285. 1929";\r
+               assertFalse("Author is obligatory if followed by reference", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               assertTrue("Problem must be name-reference separation", getProblems(testParsable, NomenclaturalCode.ICBN).\r
+                               contains(ParserProblem.NameReferenceSeparation));\r
+\r
+               testParsable = "Hieracium lachenalii in Hegi, Ill. Fl. (Mitt.) 6: 1285. 1929";\r
+               assertFalse("Author is obligatory if followed by reference", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+               assertTrue("Problem must be name-reference separation", getProblems(testParsable, NomenclaturalCode.ICBN).\r
+                               contains(ParserProblem.NameReferenceSeparation));\r
+               \r
+               testParsable = "Abies alba Mill. var. alba";\r
+               assertTrue("Autonym problem", isParsable(testParsable, NomenclaturalCode.ICBN));\r
 \r
        }\r
+       \r
+       /**\r
+        * @param testParsable\r
+        * @param icbn\r
+        * @return\r
+        */\r
+       private List<ParserProblem> getProblems(String string, NomenclaturalCode code) {\r
+               List<ParserProblem> result;\r
+               result = parser.parseReferencedName(string, code, null).getParsingProblems();\r
+               return result;\r
+       }\r
+\r
+       private boolean isParsable(String string, NomenclaturalCode code){\r
+               NonViralName<?> name = parser.parseReferencedName(string, code, null);\r
+               return ! name.hasProblem();\r
+       }\r
 \r
        private void assertFullRefNameStandard(NonViralName<?> name){\r
                assertEquals("Abies", name.getGenusOrUninomial());\r
@@ -572,11 +769,47 @@ public class NonViralNameParserImplTest {
                assertEquals("Mill.", name.getAuthorshipCache());\r
                assertEquals("455", name.getNomenclaturalMicroReference());\r
                assertNotNull(name.getNomenclaturalReference());\r
-               INomenclaturalReference<?> ref = name.getNomenclaturalReference();\r
+               INomenclaturalReference ref = (INomenclaturalReference)name.getNomenclaturalReference();\r
                assertEquals("1987", ref.getYear());\r
-               StrictReferenceBase refBase = (StrictReferenceBase)ref;\r
+               ReferenceBase refBase = (ReferenceBase)ref;\r
                assertEquals("Sp. Pl.", refBase.getTitle());\r
        }\r
+       \r
+       \r
+       @Test\r
+       public void testNeverEndingParsing(){\r
+               //some full titles result in never ending parsing process https://dev.e-taxonomy.eu/trac/ticket/1556\r
+\r
+               String irinaExample = "Milichiidae Sharp, 1899, Insects. Part II. Hymenopteracontinued (Tubulifera and Aculeata), Coleoptera, Strepsiptera, Lepidoptera, Diptera, Aphaniptera, Thysanoptera, Hemiptera, Anoplura 6: 504. 1899";\r
+               NonViralName nvn = this.parser.parseReferencedName(irinaExample, NomenclaturalCode.ICZN, null);\r
+               Assert.assertEquals("Titlecache", "Milichiidae Sharp, 1899", nvn.getTitleCache());\r
+               Assert.assertEquals("If this line reached everything should be ok", "Milichiidae", nvn.getGenusOrUninomial());\r
+               \r
+               String anotherExample = "Scorzonera hispanica var. brevifolia Boiss. & Balansa in Boissier, Diagn. Pl. Orient., ser. 2 6: 119. 1859.";\r
+               nvn = this.parser.parseReferencedName(anotherExample, NomenclaturalCode.ICBN, null);\r
+               Assert.assertEquals("Titlecache", "Scorzonera hispanica var. brevifolia Boiss. & Balansa", nvn.getTitleCache());\r
+               Assert.assertEquals("If this line reached everything should be ok", "Scorzonera", nvn.getGenusOrUninomial());\r
+               \r
+               String unparsable = "Taraxacum nevskii L., Trudy Bot. Inst. Nauk S.S.S.R., Ser. 1, Fl. Sist. Vyssh. Rast. 4: 293. 1937.";\r
+               String unparsableA = "Taraxacum nevskii L. in Trudy Bot. Inst. Nauk: 293. 1937.";\r
+               \r
+               nvn = this.parser.parseReferencedName(unparsable, NomenclaturalCode.ICBN, null);\r
+               Assert.assertEquals("Titlecache", "Taraxacum nevskii L.", nvn.getTitleCache());\r
+               Assert.assertEquals("If this line reached everything should be ok", "Taraxacum", nvn.getGenusOrUninomial());\r
+               \r
+               String unparsable2 = "Hieracium pxxx Dahlst., Kongl. Svenska Vetensk. Acad. Handl. ser. 2, 26(3): 255. 1894";\r
+               String unparsable2A = "Hieracium pxxx Dahlst., Kongl Svenska Vetensk Acad Handl, 26: 255. 1894.";\r
+               nvn = this.parser.parseReferencedName(unparsable2, NomenclaturalCode.ICBN, null);\r
+               Assert.assertEquals("Titlecache", "Hieracium pxxx Dahlst.", nvn.getTitleCache());\r
+               Assert.assertEquals("If this line reached everything should be ok", "Hieracium", nvn.getGenusOrUninomial());\r
+               \r
+               \r
+               String again = "Adiantum emarginatum Bory ex. Willd., Species Plantarum, ed. 4,5,1: 449,450. 1810";\r
+               nvn = this.parser.parseReferencedName(again, NomenclaturalCode.ICBN, null);\r
+               Assert.assertEquals("Titlecache", "Adiantum emarginatum Bory ex Willd.", nvn.getTitleCache());\r
+               Assert.assertEquals("If this line reached everything should be ok", "Adiantum", nvn.getGenusOrUninomial());\r
+               \r
+       }\r
 \r
        /**\r
         * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#fullTeams(java.lang.String)}.\r