/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
*/
package org.biojava.nbio.structure.align.client;
import static org.biojava.nbio.structure.align.client.StructureName.Source.*;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.biojava.nbio.structure.StructureException;
import org.junit.Ignore;
import org.junit.Test;
public class TestStructureName {
@Test
public void testMultiCharChainIds() throws StructureException {
String str = "4V4F.AL";
StructureName sn = new StructureName(str);
assertEquals("AL", sn.getChainId());
assertEquals("4V4F", sn.getPdbId());
str = "4v4f.AL";
sn = new StructureName(str);
assertEquals("AL", sn.getChainId());
assertEquals("4V4F", sn.getPdbId());
str = "4v4f.al";
sn = new StructureName(str);
assertEquals("al", sn.getChainId());
assertEquals("4V4F", sn.getPdbId());
str = "4v4f.ABCD";
sn = new StructureName(str);
assertEquals("ABCD", sn.getChainId());
assertEquals("4V4F", sn.getPdbId());
// More than 4 characters should work too. In principle there's no limit in mmCIF, though the PDB is
// restricting chain ids to 4 chars
str = "4v4f.ABCDEFGHIJ";
sn = new StructureName(str);
assertEquals("ABCDEFGHIJ", sn.getChainId());
assertEquals("4V4F", sn.getPdbId());
}
@Test
public void testSingleCharChainIds() throws StructureException {
String str = "1SMT.A";
StructureName sn = new StructureName(str);
assertEquals("A", sn.getChainId());
assertEquals("1SMT", sn.getPdbId());
str = "1SMT.a";
sn = new StructureName(str);
assertEquals("a", sn.getChainId());
assertEquals("1SMT", sn.getPdbId());
}
@Test
public void testFiles() throws IOException {
File f = new File("hopefully_this_doesnt_exist_nalkjas3");
assertFalse(f.exists());
assertNull(f.getParentFile());
StructureName sn = new StructureName("hopefully_this_doesnt_exist_nalkjas3");
assertFalse(sn.isFile());
assertTrue(sn.isPdbId());
}
/**
* Test explicit prefixes
* @throws StructureException
*/
@Test
public void testPrefixes() throws StructureException {
StructureName sn;
// Basic case
sn = new StructureName("PDB:4hhb");
assertTrue(sn.isPdbId());
assertTrue(sn.getSource() == PDB);
assertEquals("4HHB",sn.getPdbId());
sn = new StructureName("PDB:4hhb.A:1-50");
assertTrue(sn.isPdbId());
assertTrue(sn.getSource() == PDB);
assertEquals("4HHB",sn.getPdbId());
// Invalid strings work too, they just don't load
sn = new StructureName("PDB:x");
assertTrue(sn.isPdbId());
assertTrue(sn.getSource() == PDB);
assertEquals("x",sn.getPdbId());
// SCOP
sn = new StructureName("SCOP:d2gs2a_");
assertTrue(sn.isScopName());
assertTrue(sn.getSource() == SCOP);
assertEquals("2GS2",sn.getPdbId());
// CATH
sn = new StructureName("CATH:1qvrC03");
assertTrue(sn.isCathID());
assertTrue(sn.getSource() == CATH);
assertEquals("1QVR",sn.getPdbId());
// PDP
sn = new StructureName("PDP:4HHBAa");
assertTrue(sn.isPDPDomain());
assertTrue(sn.getSource() == PDP);
assertEquals("4HHB",sn.getPdbId());
// URL
sn = new StructureName("URL:http://www.rcsb.org/pdb/files/1B8G.pdb.gz");
assertTrue(sn.isURL());
assertTrue(sn.getSource() == URL);
assertEquals("1B8G",sn.getPdbId());
sn = new StructureName("URL:file:///4hhb.pdb");
assertTrue(sn.isURL());
assertTrue(sn.getSource() == URL);
assertEquals("4HHB",sn.getPdbId());
// File: expand home directory (invalid URL)
sn = new StructureName("FILE:~/4hhb.pdb");
assertTrue(sn.isFile());
assertTrue(sn.getSource() == FILE);
assertEquals("4HHB",sn.getPdbId());
// Relative file (invalid URL)
sn = new StructureName("file:4hhb.pdb");
assertTrue(sn.isFile());
assertTrue(sn.getSource() == FILE);
assertEquals("4HHB",sn.getPdbId());
// Absolute paths are valid URLs
sn = new StructureName("file:/4hhb_other.pdb");
assertTrue(sn.isURL());
assertTrue(sn.getSource() == URL);
assertEquals("4HHB",sn.getPdbId());
// ECOD
sn = new StructureName("e1lyw.1");
assertTrue(sn.isEcodDomain());
assertTrue(sn.getSource() == ECOD);
assertEquals("1LYW",sn.getPdbId());
// BIO
sn = new StructureName("BIO:2ehz:1");
assertTrue(sn.isBioAssembly());
assertTrue(sn.getSource() == BIO);
assertEquals("2EHZ",sn.getPdbId());
// Invalid prefix
sn = new StructureName("XXX:2ehz");
assertTrue(sn.isPdbId());
assertTrue(sn.getSource() == PDB);
assertEquals("XXX:2ehz",sn.getPdbId());
}
/**
* Test without prefixes
* @throws StructureException
*/
@Test
public void testGuesses() throws StructureException {
StructureName sn;
// Basic case
sn = new StructureName("4hhb");
assertTrue(sn.isPdbId());
assertTrue(sn.getSource() == PDB);
assertEquals("4HHB",sn.getPdbId());
sn = new StructureName("4hhb.A:1-50");
assertTrue(sn.isPdbId());
assertTrue(sn.getSource() == PDB);
assertEquals("4HHB",sn.getPdbId());
// Invalid strings work too, they just don't load
sn = new StructureName("x");
assertTrue(sn.isPdbId());
assertTrue(sn.getSource() == PDB);
assertEquals("x",sn.getPdbId());
// SCOP
sn = new StructureName("d2gs2a_");
assertTrue(sn.isScopName());
assertTrue(sn.getSource() == SCOP);
assertEquals("2GS2",sn.getPdbId());
// CATH
sn = new StructureName("1qvrC03");
assertTrue(sn.isCathID());
assertTrue(sn.getSource() == CATH);
assertEquals("1QVR",sn.getPdbId());
// PDP is not guessed
sn = new StructureName("4HHBAa");
assertFalse(sn.isPDPDomain());
assertTrue(sn.getSource() == PDB);
assertEquals("4HHBAa",sn.getPdbId());
// URL
sn = new StructureName("http://www.rcsb.org/pdb/files/1B8G.pdb.gz");
assertTrue(sn.isURL());
assertTrue(sn.getSource() == URL);
assertEquals("1B8G",sn.getPdbId());
sn = new StructureName("file:///4hhb.pdb");
assertTrue(sn.isURL());
assertTrue(sn.getSource() == URL);
assertEquals("4HHB",sn.getPdbId());
// Files are hard to test, since they rely on existing files
// You can run these tests locally after updating the hard-coded paths
//sn = new StructureName("~/pdb/4hhb.pdb");
//assertTrue(sn.isFile());
//assertTrue(sn.getSource() == FILE);
//assertEquals("4HHB",sn.getPdbId());
//sn = new StructureName("/Users/blivens/pdb/4hhb.pdb");
//assertTrue(sn.isFile());
//assertTrue(sn.getSource() == FILE);
//assertEquals("4HHB",sn.getPdbId());
//sn = new StructureName("~/pdb/1f9m-1.pdb");
//assertTrue(sn.isFile());
//assertTrue(sn.getSource() == FILE);
//assertEquals("1F9M",sn.getPdbId());
// ECOD
sn = new StructureName("e1lyw.1");
assertTrue(sn.isEcodDomain());
assertTrue(sn.getSource() == ECOD);
assertEquals("1LYW",sn.getPdbId());
// BIO is not guessed
sn = new StructureName("2ehz:1");
assertFalse(sn.isBioAssembly());
assertTrue(sn.getSource() == PDB);
assertEquals("2ehz:1",sn.getPdbId());
}
// Not really a test, but rather documenting Java's URL behavior
@Ignore
@Test
public void testURLs() throws MalformedURLException {
URL url;
// Tilde doesn't get expanded
url = new URL("file://~/1abc.pdb");
assertEquals("/1abc.pdb", url.getPath());
assertEquals("~",url.getHost());
url = new URL("file:///~/1abc.pdb");
assertEquals("/~/1abc.pdb", url.getPath());
assertEquals("",url.getHost());
// Supports omitting the initial slashes
url = new URL("file:~/1abc.pdb");
assertEquals("~/1abc.pdb", url.getPath());
assertEquals("",url.getHost());
// proper case. Three slashes gives empty host
url = new URL("file:///1abc.pdb");
assertEquals("/1abc.pdb", url.getPath());
assertEquals("",url.getHost());
// Two slashes triggers host
url = new URL("file://1abc.pdb");
assertEquals("", url.getPath());
assertEquals("1abc.pdb",url.getHost());
// One slash treated like zero slashes
url = new URL("file:/1abc.pdb");
assertEquals("/1abc.pdb", url.getPath());
assertEquals("",url.getHost());
assertEquals("file",url.getProtocol());
// Surprise! url: prefix already works
url = new URL("url:file://localhost/1abc.pdb");
assertEquals("/1abc.pdb", url.getPath());
assertEquals("localhost",url.getHost());
assertEquals("file",url.getProtocol());
url = new URL("URL:file://localhost/1abc.pdb");
assertEquals("/1abc.pdb", url.getPath());
assertEquals("localhost",url.getHost());
assertEquals("file",url.getProtocol());
// But doubling the file prefix doesn't. Is that OK?
url = new URL("file:file://localhost/1abc.pdb");
assertEquals("file://localhost/1abc.pdb", url.getPath());
assertEquals("",url.getHost());
assertEquals("file",url.getProtocol());
}
}