package tests.net.sf.jabref.imports; import java.io.IOException; import java.io.StringReader; import java.util.Collection; import java.util.Iterator; import java.util.Set; import junit.framework.TestCase; import net.sf.jabref.BibtexEntry; import net.sf.jabref.BibtexEntryType; import net.sf.jabref.imports.BibtexParser; import net.sf.jabref.imports.ParserResult; /** * Test the BibtexParser * * @version $revision: 1.1$ $date: $ * * @author Christopher Oezbek <oezi@oezi.de> */ public class BibtexParserTest extends TestCase { public void testParseReader() throws IOException { ParserResult result = BibtexParser.parse(new StringReader( "@article{test,author={Ed von Test}}")); Collection<BibtexEntry> c = result.getDatabase().getEntries(); assertEquals(1, c.size()); BibtexEntry e = c.iterator().next(); assertEquals("test", e.getCiteKey()); assertEquals(2, e.getAllFields().size()); Set<String> o = e.getAllFields(); assertTrue(o.contains("author")); assertEquals("Ed von Test", e.getField("author")); } public void testBibtexParser() { try { new BibtexParser(null); fail("Should not accept null."); } catch (NullPointerException npe) { } } public void testIsRecognizedFormat() throws IOException { assertTrue(BibtexParser .isRecognizedFormat(new StringReader( "This file was created with JabRef 2.1 beta 2." + "\n" + "Encoding: Cp1252" + "\n" + "" + "\n" + "@INPROCEEDINGS{CroAnnHow05," + "\n" + " author = {Crowston, K. and Annabi, H. and Howison, J. and Masango, C.}," + "\n" + " title = {Effective work practices for floss development: A model and propositions}," + "\n" + " booktitle = {Hawaii International Conference On System Sciences (HICSS)}," + "\n" + " year = {2005}," + "\n" + " owner = {oezbek}," + "\n" + " timestamp = {2006.05.29}," + "\n" + " url = {http://james.howison.name/publications.html}" + "\n" + "}))"))); assertTrue(BibtexParser.isRecognizedFormat(new StringReader( "This file was created with JabRef 2.1 beta 2." + "\n" + "Encoding: Cp1252" + "\n"))); assertTrue(BibtexParser .isRecognizedFormat(new StringReader( "@INPROCEEDINGS{CroAnnHow05," + "\n" + " author = {Crowston, K. and Annabi, H. and Howison, J. and Masango, C.}," + "\n" + " title = {Effective work practices for floss development: A model and propositions}," + "\n" + " booktitle = {Hawaii International Conference On System Sciences (HICSS)}," + "\n" + " year = {2005}," + "\n" + " owner = {oezbek}," + "\n" + " timestamp = {2006.05.29}," + "\n" + " url = {http://james.howison.name/publications.html}" + "\n" + "}))"))); assertFalse(BibtexParser .isRecognizedFormat(new StringReader( " author = {Crowston, K. and Annabi, H. and Howison, J. and Masango, C.}," + "\n" + " title = {Effective work practices for floss development: A model and propositions}," + "\n" + " booktitle = {Hawaii International Conference On System Sciences (HICSS)}," + "\n" + " year = {2005}," + "\n" + " owner = {oezbek}," + "\n" + " timestamp = {2006.05.29}," + "\n" + " url = {http://james.howison.name/publications.html}" + "\n" + "}))"))); assertFalse(BibtexParser.isRecognizedFormat(new StringReader( "This was created with JabRef 2.1 beta 2." + "\n" + "Encoding: Cp1252" + "\n"))); } public void testFromString() throws Exception { { // Simple case Collection<BibtexEntry> c = BibtexParser.fromString("@article{test,author={Ed von Test}}"); assertEquals(1, c.size()); BibtexEntry e = c.iterator().next(); assertEquals("test", e.getCiteKey()); assertEquals(2, e.getAllFields().size()); assertTrue(e.getAllFields().contains("author")); assertEquals("Ed von Test", e.getField("author")); } { // Empty String Collection<BibtexEntry> c = BibtexParser.fromString(""); assertEquals(0, c.size()); } { // Error Collection<BibtexEntry> c = BibtexParser.fromString("@@article@@{{{{{{}"); assertEquals(null, c); } } public void testFromSingle2() { /** * More */ Collection<BibtexEntry> c = BibtexParser.fromString("@article{canh05," + " author = {Crowston, K. and Annabi, H.},\n" + " title = {Title A}}\n" + "@inProceedings{foo," + " author={Norton Bar}}"); assertEquals(2, c.size()); Iterator<BibtexEntry> i = c.iterator(); BibtexEntry a = i.next(); BibtexEntry b = i.next(); if (a.getCiteKey().equals("foo")) { BibtexEntry tmp = a; a = b; b = tmp; } assertEquals("canh05", a.getCiteKey()); assertEquals("Crowston, K. and Annabi, H.", a.getField("author")); assertEquals("Title A", a.getField("title")); assertEquals(BibtexEntryType.ARTICLE, a.getType()); assertEquals("foo", b.getCiteKey()); assertEquals("Norton Bar", b.getField("author")); assertEquals(BibtexEntryType.INPROCEEDINGS, b.getType()); } public void testFromStringSingle() { BibtexEntry a = BibtexParser.singleFromString("@article{canh05," + " author = {Crowston, K. and Annabi, H.},\n" + " title = {Title A}}\n"); assertEquals("canh05", a.getCiteKey()); assertEquals("Crowston, K. and Annabi, H.", a.getField("author")); assertEquals("Title A", a.getField("title")); assertEquals(BibtexEntryType.ARTICLE, a.getType()); BibtexEntry b = BibtexParser.singleFromString("@article{canh05," + " author = {Crowston, K. and Annabi, H.},\n" + " title = {Title A}}\n" + "@inProceedings{foo," + " author={Norton Bar}}"); if (!(b.getCiteKey().equals("canh05") || b.getCiteKey().equals("foo"))){ fail(); } } public void testParse() throws IOException { // Test Standard parsing BibtexParser parser = new BibtexParser(new StringReader( "@article{test,author={Ed von Test}}")); ParserResult result = parser.parse(); Collection<BibtexEntry> c = result.getDatabase().getEntries(); assertEquals(1, c.size()); BibtexEntry e = c.iterator().next(); assertEquals("test", e.getCiteKey()); assertEquals(2, e.getAllFields().size()); assertTrue(e.getAllFields().contains("author")); assertEquals("Ed von Test", e.getField("author")); // Calling parse again will return the same result assertEquals(result, parser.parse()); } public void testParse2() throws IOException { BibtexParser parser = new BibtexParser(new StringReader( "@article{test,author={Ed von Test}}")); ParserResult result = parser.parse(); BibtexEntry e = new BibtexEntry("", BibtexEntryType.ARTICLE); e.setField("author", "Ed von Test"); e.setField("bibtexkey", "test"); Collection<BibtexEntry> c = result.getDatabase().getEntries(); assertEquals(1, c.size()); BibtexEntry e2 = c.iterator().next(); assertNotSame(e.getId(), e2.getId()); for (String field : e.getAllFields()){ if (!e.getField(field.toString()).equals(e2.getField(field.toString()))) { fail("e and e2 differ in field " + field.toString()); } } } /** * Test for [ 1594123 ] Failure to import big numbers * * Issue Reported by Ulf Martin. * * @throws IOException */ public void testBigNumbers() throws IOException { ParserResult result = BibtexParser.parse(new StringReader("@article{canh05," + "isbn = 1234567890123456789,\n" + "isbn2 = {1234567890123456789},\n" + "small = 1234,\n" + "}")); Collection<BibtexEntry> c = result.getDatabase().getEntries(); BibtexEntry e = c.iterator().next(); assertEquals("1234567890123456789", e.getField("isbn")); assertEquals("1234567890123456789", e.getField("isbn2")); assertEquals("1234", e.getField("small")); } public void testBigNumbers2() throws IOException { ParserResult result = BibtexParser.parse(new StringReader("" + "@string{bourdieu = {Bourdieu, Pierre}}" + "@book{bourdieu-2002-questions-sociologie, " + " Address = {Paris}," + " Author = bourdieu," + " Isbn = 2707318256," + " Publisher = {Minuit}," + " Title = {Questions de sociologie}," + " Year = 2002" + "}")); Collection<BibtexEntry> c = result.getDatabase().getEntries(); assertEquals(1, c.size()); BibtexEntry e = c.iterator().next(); assertEquals("bourdieu-2002-questions-sociologie", e.getCiteKey()); assertEquals(BibtexEntryType.BOOK, e.getType()); assertEquals("2707318256", e.getField("isbn")); assertEquals("Paris", e.getField("address")); assertEquals("Minuit", e.getField("publisher")); assertEquals("Questions de sociologie", e.getField("title")); assertEquals("#bourdieu#", e.getField("author")); assertEquals("2002", e.getField("year")); } public void testNewlineHandling() throws IOException { BibtexEntry e = BibtexParser.singleFromString("@article{canh05," + "a = {a\nb}," + "b = {a\n\nb}," + "c = {a\n \nb}," + "d = {a \n \n b}," + "title = {\nHallo \nWorld \nthis \n is\n\nnot \n\nan \n\n exercise \n \n.\n \n\n},\n" + "tabs = {\nHallo \tWorld \tthis \t is\t\tnot \t\tan \t\n exercise \t \n.\t \n\t},\n" + "file = {Bemerkung:H:\\bla\\ups sala.pdf:PDF}, \n" + "}"); assertEquals("canh05", e.getCiteKey()); assertEquals(BibtexEntryType.ARTICLE, e.getType()); assertEquals("a b", e.getField("a")); assertEquals("a\nb", e.getField("b")); assertEquals("a b", e.getField("c")); assertEquals("a b", e.getField("d")); // I think the last \n is a bug in the parser... assertEquals("Hallo World this is\nnot \nan \n exercise . \n\n", e.getField("title")); assertEquals("Hallo World this isnot an exercise . ", e.getField("tabs")); } /** * Test for [2022983] * * @author Uwe Kuehn * @author Andrei Haralevich */ public void testFileNaming(){ BibtexEntry e = BibtexParser.singleFromString("@article{canh05," + "title = {\nHallo \nWorld \nthis \n is\n\nnot \n\nan \n\n exercise \n \n.\n \n\n},\n" + "tabs = {\nHallo \tWorld \tthis \t is\t\tnot \t\tan \t\n exercise \t \n.\t \n\t},\n" + "file = {Bemerkung:H:\\bla\\ups sala.pdf:PDF}, \n" + "}"); assertEquals("Bemerkung:H:\\bla\\ups sala.pdf:PDF", e.getField("file")); } /** * Test for [2022983] * * @author Uwe Kuehn * @author Andrei Haralevich */ public void testFileNaming1(){ BibtexEntry e = BibtexParser.singleFromString("@article{canh05," + "title = {\nHallo \nWorld \nthis \n is\n\nnot \n\nan \n\n exercise \n \n.\n \n\n},\n" + "tabs = {\nHallo \tWorld \tthis \t is\t\tnot \t\tan \t\n exercise \t \n.\t \n\t},\n" + "file = {Bemerkung:H:\\bla\\ups \tsala.pdf:PDF}, \n" + "}"); assertEquals("Bemerkung:H:\\bla\\ups sala.pdf:PDF", e.getField("file")); } /** * Test for [2022983] * * @author Uwe Kuehn * @author Andrei Haralevich */ public void testFileNaming3(){ BibtexEntry e = BibtexParser.singleFromString("@article{canh05," + "title = {\nHallo \nWorld \nthis \n is\n\nnot \n\nan \n\n exercise \n \n.\n \n\n},\n" + "tabs = {\nHallo \tWorld \tthis \t is\t\tnot \t\tan \t\n exercise \t \n.\t \n\t},\n" + "file = {Bemerkung:H:\\bla\\ups \n\tsala.pdf:PDF}, \n" + "}"); assertEquals("Bemerkung:H:\\bla\\ups sala.pdf:PDF", e.getField("file")); } }