/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.ws.dbsources;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
import jalview.datamodel.SequenceI;
import jalview.gui.JvOptionPane;
import jalview.xml.binding.uniprot.DbReferenceType;
import jalview.xml.binding.uniprot.Entry;
import jalview.xml.binding.uniprot.FeatureType;
import jalview.xml.binding.uniprot.LocationType;
import jalview.xml.binding.uniprot.PositionType;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.util.List;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class UniprotTest
{
@BeforeClass(alwaysRun = true)
public void setUpJvOptionPane()
{
JvOptionPane.setInteractiveMode(false);
JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
}
// adapted from http://www.uniprot.org/uniprot/A9CKP4.xml
private static final String UNIPROT_XML = ""
+ ""
+ ""
+ "A9CKP4"
+ "A9CKP5"
+ "A9CKP4_AGRT5"
+ "A9CKP4_AGRT6"
+ "Mitogen-activated protein kinase 13"
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ "ML"
+ "ML"
+ "M"
+ "LLMVM"
+ "LLLMVML"
+ "LLLMVKMLML"
+ "MHAPL VSKDL"
+ "";
/**
* Test the method that unmarshals XML to a Uniprot model
*
* @throws UnsupportedEncodingException
*/
@Test(groups = { "Functional" })
public void testGetUniprotEntries() throws UnsupportedEncodingException
{
Uniprot u = new Uniprot();
InputStream is = new ByteArrayInputStream(UNIPROT_XML.getBytes());
List entries = u.getUniprotEntries(is);
assertEquals(1, entries.size());
Entry entry = entries.get(0);
assertEquals(2, entry.getName().size());
assertEquals("A9CKP4_AGRT5", entry.getName().get(0));
assertEquals("A9CKP4_AGRT6", entry.getName().get(1));
assertEquals(2, entry.getAccession().size());
assertEquals("A9CKP4", entry.getAccession().get(0));
assertEquals("A9CKP5", entry.getAccession().get(1));
assertEquals("MHAPL VSKDL", entry.getSequence().getValue());
assertEquals("Mitogen-activated protein kinase 13", entry.getProtein()
.getRecommendedName().getFullName().getValue());
/*
* Check sequence features
*/
List features = entry.getFeature();
assertEquals(9, features.size());
FeatureType sf = features.get(0);
assertEquals("signal peptide", sf.getType());
assertNull(sf.getDescription());
assertNull(sf.getStatus());
assertNull(sf.getLocation().getPosition());
assertEquals(1, sf.getLocation().getBegin().getPosition().intValue());
assertEquals(18, sf.getLocation().getEnd().getPosition().intValue());
sf = features.get(1);
assertEquals("propeptide", sf.getType());
assertEquals("Activation peptide", sf.getDescription());
assertNull(sf.getLocation().getPosition());
assertEquals(19, sf.getLocation().getBegin().getPosition().intValue());
assertEquals(20, sf.getLocation().getEnd().getPosition().intValue());
sf = features.get(2);
assertEquals("chain", sf.getType());
assertEquals("Granzyme B", sf.getDescription());
assertNull(sf.getLocation().getPosition());
assertEquals(21, sf.getLocation().getBegin().getPosition().intValue());
assertEquals(247, sf.getLocation().getEnd().getPosition().intValue());
sf = features.get(3);
assertEquals("sequence variant", sf.getType());
assertNull(sf.getDescription());
assertEquals(41,
sf.getLocation().getPosition().getPosition().intValue());
assertNull(sf.getLocation().getBegin());
assertNull(sf.getLocation().getEnd());
sf = features.get(4);
assertEquals("sequence variant", sf.getType());
assertEquals("Pathogenic", sf.getDescription());
assertEquals(41,
sf.getLocation().getPosition().getPosition().intValue());
assertNull(sf.getLocation().getBegin());
assertNull(sf.getLocation().getEnd());
sf = features.get(5);
assertEquals("sequence variant", sf.getType());
assertEquals("Pathogenic", sf.getDescription());
assertEquals(41,
sf.getLocation().getPosition().getPosition().intValue());
assertNull(sf.getLocation().getBegin());
assertNull(sf.getLocation().getEnd());
sf = features.get(6);
assertEquals("sequence variant", sf.getType());
assertEquals("Foo",
sf.getDescription());
assertEquals(42,
sf.getLocation().getPosition().getPosition().intValue());
assertNull(sf.getLocation().getBegin());
assertNull(sf.getLocation().getEnd());
Assert.assertEquals(Uniprot.getDescription(sf),
"p.Met42Leu" + "
"
+ "p.Met42LeuMetVal Foo");
sf = features.get(7);
assertNull(sf.getLocation().getPosition());
assertEquals(42, sf.getLocation().getBegin().getPosition().intValue());
assertEquals(43, sf.getLocation().getEnd().getPosition().intValue());
Assert.assertEquals(Uniprot.getDescription(sf),
"p.MetLeu42LeuLeu" + "
"
+ "p.MetLeu42LeuMetVal Foo");
sf = features.get(8);
assertNull(sf.getLocation().getPosition());
assertEquals(42, sf.getLocation().getBegin().getPosition().intValue());
assertEquals(45, sf.getLocation().getEnd().getPosition().intValue());
Assert.assertEquals(Uniprot.getDescription(sf),
"p.MLML42LeuLeu" + "
"
+ "p.MLML42LMVK Foo Too");
/*
* Check cross-references
*/
List xrefs = entry.getDbReference();
assertEquals(3, xrefs.size());
DbReferenceType xref = xrefs.get(0);
assertEquals("2FSQ", xref.getId());
assertEquals("PDB", xref.getType());
assertEquals("X-ray",
Uniprot.getProperty(xref.getProperty(), "method"));
assertEquals("1.40",
Uniprot.getProperty(xref.getProperty(), "resolution"));
xref = xrefs.get(1);
assertEquals("2FSR", xref.getId());
assertEquals("PDBsum", xref.getType());
assertTrue(xref.getProperty().isEmpty());
xref = xrefs.get(2);
assertEquals("AE007869", xref.getId());
assertEquals("EMBL", xref.getType());
assertEquals("AAK85932.1",
Uniprot.getProperty(xref.getProperty(), "protein sequence ID"));
assertEquals("Genomic_DNA",
Uniprot.getProperty(xref.getProperty(), "molecule type"));
}
@Test(groups = { "Functional" })
public void testGetUniprotSequence() throws UnsupportedEncodingException
{
InputStream is = new ByteArrayInputStream(UNIPROT_XML.getBytes());
Entry entry = new Uniprot().getUniprotEntries(
is).get(0);
SequenceI seq = new Uniprot().uniprotEntryToSequence(entry);
assertNotNull(seq);
assertEquals(6, seq.getDBRefs().size()); // 2*Uniprot, PDB, PDBsum, 2*EMBL
assertEquals(seq.getSequenceAsString(),
seq.createDatasetSequence().getSequenceAsString());
}
/**
* Test the method that formats the sequence id
*
* @throws UnsupportedEncodingException
*/
@Test(groups = { "Functional" })
public void testGetUniprotEntryId() throws UnsupportedEncodingException
{
InputStream is = new ByteArrayInputStream(UNIPROT_XML.getBytes());
Entry entry = new Uniprot().getUniprotEntries(is).get(0);
/*
* name formatted with Uniprot Entry name
*/
String expectedName = "A9CKP4_AGRT5|A9CKP4_AGRT6";
assertEquals(expectedName,
Uniprot.getUniprotEntryId(entry));
}
/**
* Test the method that formats the sequence description
*
* @throws UnsupportedEncodingException
*/
@Test(groups = { "Functional" })
public void testGetUniprotEntryDescription()
throws UnsupportedEncodingException
{
InputStream is = new ByteArrayInputStream(UNIPROT_XML.getBytes());
Entry entry = new Uniprot().getUniprotEntries(is).get(0);
assertEquals("Mitogen-activated protein kinase 13",
Uniprot.getUniprotEntryDescription(entry));
}
@Test(groups = { "Functional" })
public void testGetDescription()
{
FeatureType ft = new FeatureType();
assertEquals("", Uniprot.getDescription(ft));
ft.setDescription("Hello");
assertEquals("Hello", Uniprot.getDescription(ft));
ft.setLocation(new LocationType());
ft.getLocation().setPosition(new PositionType());
ft.getLocation().getPosition().setPosition(BigInteger.valueOf(23));
ft.setOriginal("K");
ft.getVariation().add("y");
assertEquals("p.Lys23Tyr Hello", Uniprot.getDescription(ft));
// multiple variants generate an html description over more than one line
ft.getVariation().add("W");
assertEquals("p.Lys23Tyr
p.Lys23Trp Hello",
Uniprot.getDescription(ft));
/*
* indel cases
* up to 3 bases (original or variant) are shown using 3 letter code
*/
ft.getVariation().clear();
ft.getVariation().add("KWE");
ft.setOriginal("KLS");
assertEquals("p.LysLeuSer23LysTrpGlu Hello",
Uniprot.getDescription(ft));
// adding a fourth original base switches to single letter code
ft.setOriginal("KLST");
assertEquals("p.KLST23LysTrpGlu Hello", Uniprot.getDescription(ft));
// adding a fourth variant switches to single letter code
ft.getVariation().clear();
ft.getVariation().add("KWES");
assertEquals("p.KLST23KWES Hello", Uniprot.getDescription(ft));
ft.getVariation().clear();
ft.getVariation().add("z"); // unknown variant - fails gracefully
ft.setOriginal("K");
assertEquals("p.Lys23z Hello", Uniprot.getDescription(ft));
ft.getVariation().clear(); // variant missing - is ignored
assertEquals("Hello", Uniprot.getDescription(ft));
}
}