package org.jabref.model.entry.identifier;
import java.util.Optional;
import org.junit.Assert;
import org.junit.Test;
public class DOITest {
@Test
public void acceptPlainDoi() {
Assert.assertEquals("10.1006/jmbi.1998.2354", new DOI("10.1006/jmbi.1998.2354").getDOI());
Assert.assertEquals("10.231/JIM.0b013e31820bab4c", new DOI("10.231/JIM.0b013e31820bab4c").getDOI());
Assert.assertEquals("10.1002/(SICI)1522-2594(199911)42:5<952::AID-MRM16>3.0.CO;2-S",
new DOI("10.1002/(SICI)1522-2594(199911)42:5<952::AID-MRM16>3.0.CO;2-S").getDOI());
Assert.assertEquals("10.1126/sciadv.1500214", new DOI("10.1126/sciadv.1500214").getDOI());
}
@Test
public void ignoreLeadingAndTrailingWhitespaces() {
Assert.assertEquals("10.1006/jmbi.1998.2354", new DOI(" 10.1006/jmbi.1998.2354 ").getDOI());
}
@Test(expected = IllegalArgumentException.class)
public void rejectEmbeddedDoi() {
new DOI("other stuff 10.1006/jmbi.1998.2354 end");
}
@Test(expected = IllegalArgumentException.class)
public void rejectInvalidDirectoryIndicator() {
// wrong directory indicator
new DOI("12.1006/jmbi.1998.2354 end");
}
@Test(expected = IllegalArgumentException.class)
public void rejectInvalidDoiUri() {
new DOI("https://thisisnouri");
}
@Test(expected = IllegalArgumentException.class)
public void rejectMissingDivider() {
// missing divider
new DOI("10.1006jmbi.1998.2354 end");
}
@Test
public void acceptDoiPrefix() {
// Doi prefix
Assert.assertEquals("10.1006/jmbi.1998.2354", new DOI("doi:10.1006/jmbi.1998.2354").getDOI());
}
@Test
public void acceptURNPrefix() {
Assert.assertEquals("10.123/456", new DOI("urn:10.123/456").getDOI());
Assert.assertEquals("10.123/456", new DOI("urn:doi:10.123/456").getDOI());
Assert.assertEquals("10.123/456", new DOI("http://doi.org/urn:doi:10.123/456").getDOI());
// : is also allowed as divider, will be replaced by RESOLVER
Assert.assertEquals("10.123:456ABC/zyz", new DOI("http://doi.org/urn:doi:10.123:456ABC%2Fzyz").getDOI());
}
@Test
public void acceptURLDoi() {
// http
Assert.assertEquals("10.1006/jmbi.1998.2354", new DOI("http://doi.org/10.1006/jmbi.1998.2354").getDOI());
// https
Assert.assertEquals("10.1006/jmbi.1998.2354", new DOI("https://doi.org/10.1006/jmbi.1998.2354").getDOI());
// other domains
Assert.assertEquals("10.1145/1294928.1294933", new DOI("http://doi.acm.org/10.1145/1294928.1294933").getDOI());
Assert.assertEquals("10.1145/1294928.1294933", new DOI("http://doi.acm.net/10.1145/1294928.1294933").getDOI());
Assert.assertEquals("10.1145/1294928.1294933", new DOI("http://doi.acm.com/10.1145/1294928.1294933").getDOI());
Assert.assertEquals("10.1145/1294928.1294933", new DOI("http://doi.acm.de/10.1145/1294928.1294933").getDOI());
Assert.assertEquals("10.1007/978-3-642-15618-2_19",
new DOI("http://dx.doi.org/10.1007/978-3-642-15618-2_19").getDOI());
Assert.assertEquals("10.1007/978-3-642-15618-2_19",
new DOI("http://dx.doi.net/10.1007/978-3-642-15618-2_19").getDOI());
Assert.assertEquals("10.1007/978-3-642-15618-2_19",
new DOI("http://dx.doi.com/10.1007/978-3-642-15618-2_19").getDOI());
Assert.assertEquals("10.1007/978-3-642-15618-2_19",
new DOI("http://dx.doi.de/10.1007/978-3-642-15618-2_19").getDOI());
Assert.assertEquals("10.4108/ICST.COLLABORATECOM2009.8275",
new DOI("http://dx.doi.org/10.4108/ICST.COLLABORATECOM2009.8275").getDOI());
Assert.assertEquals("10.1109/MIC.2012.43",
new DOI("http://doi.ieeecomputersociety.org/10.1109/MIC.2012.43").getDOI());
}
@Test
public void correctlyDecodeHttpDOIs() {
// See http://www.doi.org/doi_handbook/2_Numbering.html#2.5.2.4
// % -> (%25)
Assert.assertEquals("10.1006/rwei.1999%.0001", new DOI("http://doi.org/10.1006/rwei.1999%25.0001").getDOI());
// " -> (%22)
Assert.assertEquals("10.1006/rwei.1999\".0001", new DOI("http://doi.org/10.1006/rwei.1999%22.0001").getDOI());
// # -> (%23)
Assert.assertEquals("10.1006/rwei.1999#.0001", new DOI("http://doi.org/10.1006/rwei.1999%23.0001").getDOI());
// SPACE -> (%20)
Assert.assertEquals("10.1006/rwei.1999 .0001", new DOI("http://doi.org/10.1006/rwei.1999%20.0001").getDOI());
// ? -> (%3F)
Assert.assertEquals("10.1006/rwei.1999?.0001", new DOI("http://doi.org/10.1006/rwei.1999%3F.0001").getDOI());
}
@Test
public void correctlyEncodeDOIs() {
// See http://www.doi.org/doi_handbook/2_Numbering.html#2.5.2.4
// % -> (%25)
Assert.assertEquals("http://doi.org/10.1006/rwei.1999%25.0001",
new DOI("http://doi.org/10.1006/rwei.1999%25.0001").getURIAsASCIIString());
// " -> (%22)
Assert.assertEquals("http://doi.org/10.1006/rwei.1999%22.0001",
new DOI("http://doi.org/10.1006/rwei.1999%22.0001").getURIAsASCIIString());
// # -> (%23)
Assert.assertEquals("http://doi.org/10.1006/rwei.1999%23.0001",
new DOI("http://doi.org/10.1006/rwei.1999%23.0001").getURIAsASCIIString());
// SPACE -> (%20)
Assert.assertEquals("http://doi.org/10.1006/rwei.1999%20.0001",
new DOI("http://doi.org/10.1006/rwei.1999%20.0001").getURIAsASCIIString());
// ? -> (%3F)
Assert.assertEquals("http://doi.org/10.1006/rwei.1999%3F.0001",
new DOI("http://doi.org/10.1006/rwei.1999%3F.0001").getURIAsASCIIString());
}
@Test
public void constructCorrectURLForDoi() {
// add / to RESOLVER url if missing
Assert.assertEquals("http://doi.org/10.1006/jmbi.1998.2354",
new DOI("10.1006/jmbi.1998.2354").getURIAsASCIIString());
Assert.assertEquals("http://doi.org/10.1006/jmbi.1998.2354",
new DOI("http://doi.org/10.1006/jmbi.1998.2354").getURIAsASCIIString());
Assert.assertEquals("http://doi.org/10.1109/VLHCC.2004.20",
new DOI("doi:10.1109/VLHCC.2004.20").getURIAsASCIIString());
}
@Test
public void findDoiInsideArbitraryText() {
Assert.assertEquals("10.1006/jmbi.1998.2354",
DOI.findInText("other stuff 10.1006/jmbi.1998.2354 end").get().getDOI());
}
@Test
public void noDOIFoundInsideArbitraryText() {
Assert.assertEquals(Optional.empty(), DOI.findInText("text without 28282 a doi"));
}
}