package org.jabref.logic.xmp; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.jabref.BibtexTestData; import org.jabref.logic.bibtex.FieldContentParserPreferences; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.model.entry.BibEntry; import org.apache.jempbox.impl.XMLUtil; import org.apache.jempbox.xmp.XMPMetadata; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class XMPSchemaBibtexTest { @Mock private ImportFormatPreferences prefs; public void assertEqualsBibtexEntry(BibEntry e, BibEntry x) { Assert.assertNotNull(e); Assert.assertNotNull(x); Assert.assertEquals(e.getCiteKeyOptional(), x.getCiteKeyOptional()); Assert.assertEquals(e.getType(), x.getType()); Assert.assertEquals(e.getFieldNames().size(), x.getFieldNames().size()); for (String name : e.getFieldNames()) { Assert.assertEquals(e.getField(name), x.getField(name)); } } @Test public void testXMPSchemaBibtexXMPMetadata() throws IOException { XMPMetadata xmp = new XMPMetadata(); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(xmp); Assert.assertNotNull(bibtex.getElement()); Assert.assertEquals("rdf:Description", bibtex.getElement().getTagName()); } @Test public void testXMPSchemaBibtexElement() throws ParserConfigurationException { DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); Element e = builder.newDocument().createElement("rdf:Description"); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(e, "bibtex"); Assert.assertEquals(e, bibtex.getElement()); Assert.assertEquals("rdf:Description", bibtex.getElement().getTagName()); } @Test public void testGetSetPersonList() throws IOException { XMPMetadata xmp = new XMPMetadata(); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(xmp); bibtex.setPersonList("author", "Tom DeMarco and Kent Beck"); Element e = bibtex.getElement(); NodeList l1 = e.getElementsByTagName("bibtex:author"); Assert.assertEquals(1, l1.getLength()); NodeList l = e.getElementsByTagName("rdf:li"); Assert.assertEquals(2, l.getLength()); Assert.assertEquals("Tom DeMarco", XMLUtil .getStringValue((Element) l.item(0))); Assert.assertEquals("Kent Beck", XMLUtil.getStringValue((Element) l.item(1))); List<String> authors = bibtex.getPersonList("author"); Assert.assertEquals(2, authors.size()); Assert.assertEquals("Tom DeMarco", authors.get(0)); Assert.assertEquals("Kent Beck", authors.get(1)); } @Test public void testSetGetTextPropertyString() throws IOException { XMPMetadata xmp = new XMPMetadata(); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(xmp); bibtex.setTextProperty("title", "The advanced Flux-Compensation for Delawney-Separation"); Element e = bibtex.getElement(); Assert.assertEquals("The advanced Flux-Compensation for Delawney-Separation", e.getAttribute("bibtex:title")); Assert.assertEquals("The advanced Flux-Compensation for Delawney-Separation", bibtex.getTextProperty("title")); bibtex.setTextProperty("title", "The advanced Flux-Correlation for Delawney-Separation"); e = bibtex.getElement(); Assert.assertEquals("The advanced Flux-Correlation for Delawney-Separation", e .getAttribute("bibtex:title")); Assert.assertEquals("The advanced Flux-Correlation for Delawney-Separation", bibtex.getTextProperty("title")); bibtex .setTextProperty( "abstract", " The abstract\n can go \n \n on several \n lines with \n many \n\n empty ones in \n between."); Assert.assertEquals( " The abstract\n can go \n \n on several \n lines with \n many \n\n empty ones in \n between.", bibtex.getTextProperty("abstract")); } @Test public void testSetGetBagListString() throws IOException { XMPMetadata xmp = new XMPMetadata(); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(xmp); bibtex.addBagValue("author", "Tom DeMarco"); bibtex.addBagValue("author", "Kent Beck"); { List<String> l = bibtex.getBagList("author"); Assert.assertEquals(2, l.size()); Assert.assertTrue(l.get(0).equals("Tom DeMarco") || l.get(1).equals("Tom DeMarco")); Assert.assertTrue(l.get(0).equals("Kent Beck") || l.get(1).equals("Kent Beck")); } { bibtex.removeBagValue("author", "Kent Beck"); List<String> l = bibtex.getBagList("author"); Assert.assertEquals(1, l.size()); Assert.assertTrue(l.get(0).equals("Tom DeMarco")); } { // Already removed bibtex.removeBagValue("author", "Kent Beck"); List<String> l = bibtex.getBagList("author"); Assert.assertEquals(1, l.size()); Assert.assertTrue(l.get(0).equals("Tom DeMarco")); } { // Duplicates allowed! bibtex.addBagValue("author", "Tom DeMarco"); List<String> l = bibtex.getBagList("author"); Assert.assertEquals(2, l.size()); Assert.assertTrue(l.get(0).equals("Tom DeMarco")); Assert.assertTrue(l.get(1).equals("Tom DeMarco")); } // Removes both bibtex.removeBagValue("author", "Tom DeMarco"); List<String> l = bibtex.getBagList("author"); Assert.assertEquals(0, l.size()); } @Test public void testGetSequenceListString() throws IOException { XMPMetadata xmp = new XMPMetadata(); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(xmp); bibtex.addSequenceValue("author", "Tom DeMarco"); bibtex.addSequenceValue("author", "Kent Beck"); { List<String> l = bibtex.getSequenceList("author"); Assert.assertEquals(2, l.size()); Assert.assertEquals("Tom DeMarco", l.get(0)); Assert.assertEquals("Kent Beck", l.get(1)); } { bibtex.removeSequenceValue("author", "Tom DeMarco"); List<String> l = bibtex.getSequenceList("author"); Assert.assertEquals(1, l.size()); Assert.assertTrue(l.get(0).equals("Kent Beck")); } { // Already removed bibtex.removeSequenceValue("author", "Tom DeMarco"); List<String> l = bibtex.getSequenceList("author"); Assert.assertEquals(1, l.size()); Assert.assertTrue(l.get(0).equals("Kent Beck")); } { // Duplicates allowed! bibtex.addSequenceValue("author", "Kent Beck"); List<String> l = bibtex.getSequenceList("author"); Assert.assertEquals(2, l.size()); Assert.assertTrue(l.get(0).equals("Kent Beck")); Assert.assertTrue(l.get(1).equals("Kent Beck")); } // Remvoes all bibtex.removeSequenceValue("author", "Kent Beck"); List<String> l = bibtex.getSequenceList("author"); Assert.assertEquals(0, l.size()); } @Test public void testGetAllProperties() throws IOException { XMPMetadata xmp = new XMPMetadata(); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(xmp); bibtex.setTextProperty("title", "BlaBla Ta Ta\nHello World"); bibtex.setTextProperty("abstract", "BlaBla Ta Ta\nHello World"); bibtex.setTextProperty("review", "BlaBla Ta Ta\nHello World"); bibtex.setTextProperty("note", "BlaBla Ta Ta\nHello World"); bibtex.setPersonList("author", "Mouse, Mickey and Bond, James"); Map<String, String> s = XMPSchemaBibtex.getAllProperties(bibtex, "bibtex"); Assert.assertEquals(5, s.size()); Assert.assertTrue(s.containsKey("title")); Assert.assertTrue(s.containsKey("author")); Assert.assertEquals("BlaBla Ta Ta Hello World", s.get("title")); Assert.assertEquals("BlaBla Ta Ta\nHello World", s.get("abstract")); Assert.assertEquals("BlaBla Ta Ta\nHello World", s.get("review")); Assert.assertEquals("BlaBla Ta Ta\nHello World", s.get("note")); Assert.assertEquals("Mickey Mouse and James Bond", s.get("author")); } @Test public void testSetBibtexEntry() throws IOException { when(prefs.getFieldContentParserPreferences()).thenReturn(new FieldContentParserPreferences()); XMPMetadata xmp = new XMPMetadata(); XMPSchemaBibtex bibtex = new XMPSchemaBibtex(xmp); BibEntry e = BibtexTestData.getBibtexEntry(prefs); bibtex.setBibtexEntry(e, null); BibEntry e2 = bibtex.getBibtexEntry(); assertEqualsBibtexEntry(e, e2); } @Test public void testGetTextContent() throws IOException { String bibtexString = "<bibtex:year>2003</bibtex:year>\n" + "<bibtex:title>\n " + "Beach sand convolution by surf-wave optimzation\n" + "</bibtex:title>\n" + "<bibtex:bibtexkey>OezbekC06</bibtex:bibtexkey>\n"; bibtexString = XMPUtilTest.bibtexXPacket(XMPUtilTest .bibtexDescription(bibtexString)); Document d = XMLUtil.parse(new ByteArrayInputStream(bibtexString .getBytes(StandardCharsets.UTF_8))); Assert.assertEquals("Beach sand convolution by surf-wave optimzation", XMPSchemaBibtex.getTextContent( d.getElementsByTagName("bibtex:title").item(0)).trim()); } }