+ 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
+ \r
+ \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
+ 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
+ \r
+ 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
+ \r
+ \r
+ 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
+ \r
+ 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
+ \r
+ String strSameName = "Hieracium pepcum (Hsllreterto) L., My Bokkk 1. 1903";\r
+ 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
+ \r
+ String strGenusUnparse = "Hieracium L., jlklk";\r
+ 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
+ \r
+ String strGenusUnparse2 = "Hieracium L., Per Luigi: 44. 1987";\r
+ NonViralName<?> nameGenusUnparse2 = \r
+ parser.parseReferencedName(strGenusUnparse2, null, Rank.FAMILY());\r
+ assertFalse(nameGenusUnparse2.hasProblem());\r
+ 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
+ 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
+ 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