Solved an issue where a reference with an uppercase word (e.g. SSSR) was not parsable
[cdmlib.git] / cdmlib-model / src / test / java / eu / etaxonomy / cdm / strategy / parser / NonViralNameParserImplTest.java
index a9c34b0823a91b89b042eaebd2a4b670a07c761b..f901667e7dc4014b87ebc4124102b533cf729387 100644 (file)
@@ -18,6 +18,10 @@ import static org.junit.Assert.assertTrue;
 import java.lang.reflect.InvocationTargetException;\r
 import java.lang.reflect.Method;\r
 import java.util.List;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import junit.framework.Assert;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.junit.After;\r
@@ -34,12 +38,18 @@ import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
 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.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.IVolumeReference;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceType;\r
+//import eu.etaxonomy.cdm.model.reference.Journal;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
 /**\r
  * @author a.mueller\r
  *\r
@@ -77,12 +87,6 @@ public class NonViralNameParserImplTest {
                termInitializer.initialize();\r
        }\r
 \r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @AfterClass\r
-       public static void tearDownAfterClass() throws Exception {\r
-       }\r
 \r
        /**\r
         * @throws java.lang.Exception\r
@@ -93,12 +97,6 @@ public class NonViralNameParserImplTest {
                botanicCode = NomenclaturalCode.ICBN;\r
        }\r
 \r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @After\r
-       public void tearDown() throws Exception {\r
-       }\r
 \r
 /*************** TEST *********************************************/\r
        \r
@@ -192,12 +190,25 @@ public class NonViralNameParserImplTest {
                NonViralName nameBasionymExAuthor = parser.parseFullName(strNameAbiesBasionymExAuthor1Unicode, null, Rank.SPECIES());\r
                assertEquals("Abies", nameBasionymExAuthor.getGenusOrUninomial());\r
                assertEquals("alba", nameBasionymExAuthor.getSpecificEpithet());\r
-               assertEquals("D'M\u00FCller", nameBasionymExAuthor.getCombinationAuthorTeam().getNomenclaturalTitle());\r
-               assertEquals("de Greuther", nameBasionymExAuthor.getExCombinationAuthorTeam().getNomenclaturalTitle());\r
-               INomenclaturalAuthor basionymTeam2 = nameBasionymExAuthor.getBasionymAuthorTeam();\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.getExBasionymAuthorTeam();\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
@@ -257,10 +268,47 @@ public class NonViralNameParserImplTest {
                assertNull(nameNull);\r
                \r
                //some authors\r
-               String fullNameString = "Abies alba (Greuther & L'Hiver & al. ex MΓΌller & Schmidt)Clark ex Ciardelli"; \r
+               String fullNameString = "Abies alba (Greuther & L'Hiver & al. ex M\u00FCller & 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.getBasionymAuthorTeam()).getTeamMembers().size());\r
+               assertEquals("Basionym author should have 3 authors", 3, ((Team)authorname.getExBasionymAuthorTeam()).getTeamMembers().size());\r
+       }\r
+       \r
+       /**\r
+        * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#parseFullName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)}.\r
+        */\r
+       @Test\r
+       public final void testHybrids() {\r
+               try {\r
+                       Method parseMethod = parser.getClass().getDeclaredMethod("parseFullName", String.class, NomenclaturalCode.class, Rank.class);\r
+                       testName_StringNomcodeRank(parseMethod);\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+                       assertTrue(false);\r
+               }\r
+               \r
+               //Species hybrid\r
+//             NonViralName nameTeam1 = parser.parseFullName("Aegilops \u00D7insulae-cypri H. Scholz");\r
+               NonViralName name1 = parser.parseFullName("Aegilops \u00D7insulae Scholz", botanicCode, null);\r
+               assertTrue("Name must have binom hybrid bit set", name1.isBinomHybrid());\r
+               assertFalse("Name must not have monom hybrid bit set", name1.isMonomHybrid());\r
+               assertFalse("Name must not have trinom hybrid bit set", name1.isTrinomHybrid());\r
+               assertEquals("Species epithet must be 'insulae'", "insulae", name1.getSpecificEpithet());\r
+               \r
+               //Uninomial hybrid\r
+               name1 = parser.parseFullName("x Aegilops Scholz", botanicCode, null);\r
+               assertTrue("Name must have monom hybrid bit set", name1.isMonomHybrid());\r
+               assertFalse("Name must not have binom hybrid bit set", name1.isBinomHybrid());\r
+               assertFalse("Name must not have trinom hybrid bit set", name1.isTrinomHybrid());\r
+               assertEquals("Uninomial must be 'Aegilops'", "Aegilops", name1.getGenusOrUninomial());\r
+\r
+               //Species hybrid\r
+               name1 = parser.parseFullName("Aegilops insulae subsp. X abies Scholz", botanicCode, null);\r
+               assertFalse("Name must not have monom hybrid bit set", name1.isMonomHybrid());\r
+               assertFalse("Name must not have binom hybrid bit set", name1.isBinomHybrid());\r
+               assertTrue("Name must have trinom hybrid bit set", name1.isTrinomHybrid());\r
+               assertEquals("Infraspecific epithet must be 'abies'", "abies", name1.getInfraSpecificEpithet());\r
+\r
        }\r
        \r
        private void testName_StringNomcodeRank(Method parseMethod) \r
@@ -284,10 +332,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
@@ -335,16 +383,16 @@ public class NonViralNameParserImplTest {
                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(((Reference)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(((Reference)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() == name1.getNomenclaturalReference().getAuthorTeam());\r
+               assertTrue("Name author and reference author should be the same", name1.getCombinationAuthorTeam() == ((Reference)name1.getNomenclaturalReference()).getAuthorTeam());\r
                \r
                //Book Section\r
                fullReference = "Abies alba Mill. in Otto, Sp. Pl. 4(6): 455. 1987";\r
@@ -352,17 +400,17 @@ public class NonViralNameParserImplTest {
                assertFullRefNameStandard(name2);\r
                assertEquals(fullReference, name2.getFullTitleCache());\r
                assertFalse(name2.hasProblem());\r
-               INomenclaturalReference ref = (INomenclaturalReference)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, ((Reference)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)", inBook.getTitleCache());\r
                assertEquals("Sp. Pl.", inBook.getTitle());\r
                assertEquals("4(6)", inBook.getVolume());\r
-               assertTrue("Name author and reference author should be the same", name2.getCombinationAuthorTeam() == name2.getNomenclaturalReference().getAuthorTeam());\r
+               assertTrue("Name author and reference author should be the same", name2.getCombinationAuthorTeam() == ((Reference)name2.getNomenclaturalReference()).getAuthorTeam());\r
                \r
                //Article\r
                fullReference = "Abies alba Mill. in Sp. Pl. 4(6): 455. 1987";\r
@@ -370,15 +418,15 @@ public class NonViralNameParserImplTest {
                assertFullRefNameStandard(name3);\r
                assertEquals(fullReference, name3.getFullTitleCache());\r
                assertFalse(name3.hasProblem());\r
-               ref = (INomenclaturalReference)name3.getNomenclaturalReference();\r
-               assertEquals(Article.class, ref.getClass());\r
-               Article article = (Article)ref;\r
-               Journal journal = article.getInJournal();\r
+               ref = name3.getNomenclaturalReference();\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.",((Reference) 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
@@ -392,15 +440,15 @@ public class NonViralNameParserImplTest {
                assertFalse(name4.hasProblem());\r
                assertFullRefNameStandard(name4);\r
                assertEquals(fullReferenceWithoutYear + " " + parsedYear, name4.getFullTitleCache());\r
-               ref = (INomenclaturalReference)name4.getNomenclaturalReference();\r
-               assertEquals(Article.class, ref.getClass());\r
-               article = (Article)ref;\r
+               ref = name4.getNomenclaturalReference();\r
+               assertEquals(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, ((Reference) 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
@@ -418,6 +466,21 @@ public class NonViralNameParserImplTest {
                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
@@ -509,32 +572,32 @@ 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
@@ -621,8 +684,8 @@ public class NonViralNameParserImplTest {
                assertEquals(strBookSection2NoComma, nameBookSection2.getFullTitleCache());\r
                assertEquals(-1, nameBookSection2.getProblemStarts()); \r
                assertEquals(-1, nameBookSection2.getProblemEnds());\r
-               assertNull(((BookSection)nameBookSection2.getNomenclaturalReference()).getDatePublished().getStart());\r
-               assertEquals("1905-1907", ((BookSection)nameBookSection2.getNomenclaturalReference()).getInBook().getDatePublished().getYear());\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
@@ -632,8 +695,8 @@ public class NonViralNameParserImplTest {
                assertEquals(strBookSection, nameBookSection.getFullTitleCache());\r
                assertEquals(-1, nameBookSection.getProblemStarts()); \r
                assertEquals(-1, nameBookSection.getProblemEnds());\r
-               assertNull(((BookSection)nameBookSection.getNomenclaturalReference()).getInBook().getDatePublished().getStart());\r
-               assertEquals("1905", ((BookSection)nameBookSection.getNomenclaturalReference()).getDatePublished().getYear());\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
@@ -702,8 +765,17 @@ public class NonViralNameParserImplTest {
                testParsable = "Abies alba Mill. var. alba";\r
                assertTrue("Autonym problem", isParsable(testParsable, NomenclaturalCode.ICBN));\r
 \r
+               \r
+               testParsable = "Hieracium antarcticum d'Urv. in M\u00E9m. Soc. Linn. Paris 4: 608. 1826";\r
+//             testParsable = "Hieracium antarcticum Urv. in M\u00E9m. Soc. Linn. Paris 4: 608. 1826";\r
+               assertTrue("Name with apostrophe is not parsable", isParsable(testParsable, NomenclaturalCode.ICBN));\r
+\r
+               testParsable = "Cichorium intybus subsp. glaucum (Hoffmanns. & Link) Tzvelev in Komarov, Fl. SSSR 29: 17. 1964";\r
+               assertTrue("Name is not parsable", isParsable(testParsable, NomenclaturalCode.ICBN));\r
        }\r
        \r
+       \r
+       \r
        /**\r
         * @param testParsable\r
         * @param icbn\r
@@ -736,9 +808,60 @@ public class NonViralNameParserImplTest {
                assertNotNull(name.getNomenclaturalReference());\r
                INomenclaturalReference ref = (INomenclaturalReference)name.getNomenclaturalReference();\r
                assertEquals("1987", ref.getYear());\r
-               ReferenceBase refBase = (ReferenceBase)ref;\r
+               Reference refBase = (Reference)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
+//             irinaExample = "Milichiidae Sharp, 1899, Insects. Part II. Uiuis Iuiui 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
+               int parsingProblem = nvn.getParsingProblem();\r
+               Assert.assertEquals("Name should have only rank warning", 1, parsingProblem);\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
+               parsingProblem = nvn.getParsingProblem();\r
+               Assert.assertEquals("Problem should be 0", 0, parsingProblem);\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
+               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
+               parsingProblem = nvn.getParsingProblem();\r
+               Assert.assertEquals("Name should no warnings or errors", 0, parsingProblem);\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
+               parsingProblem = nvn.getParsingProblem();\r
+               Assert.assertEquals("Name should no warnings or errors", 0, parsingProblem);\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
+       @Test\r
+       public final void testSeriesPart(){\r
+               Pattern seriesPattern = Pattern.compile(NonViralNameParserImpl.pSeriesPart);\r
+               Matcher matcher = seriesPattern.matcher("ser. 2");\r
+               Assert.assertTrue("", matcher.matches());\r
+       }\r
 \r
        /**\r
         * Test method for {@link eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl#fullTeams(java.lang.String)}.\r