/* * 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.sifts; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import jalview.api.DBRefEntryI; import jalview.bin.Cache; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.gui.JvOptionPane; import jalview.io.DataSourceType; import jalview.structure.StructureMapping; import jalview.structure.StructureMappingClient.StructureMappingException; import jalview.xml.binding.sifts.Entry.Entity; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.testng.Assert; import org.testng.FileAssert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import MCview.Atom; import MCview.PDBfile; public class SiftsClientTest { @BeforeClass(alwaysRun = true) public void setUpJvOptionPane() { JvOptionPane.setInteractiveMode(false); JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); } public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = System .getProperty("user.home") + File.separatorChar + ".sifts_downloads" + File.separatorChar; private String testPDBId = "1a70"; private SiftsClient siftsClient = null; SequenceI testSeq = new Sequence( "P00221", "MAAT..TTTMMG..MATTFVPKPQAPPMMAALPSNTGR..SLFGLKT.GSR..GGRMTMA" + "AYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDD" + "QSFLDDDQIDEGWVLTCAAYPVSDVTIETHKEEELTA.", 1, 147); int u = SiftsClient.UNASSIGNED; HashMap expectedMapping = new HashMap(); @BeforeTest(alwaysRun = true) public void populateExpectedMapping() throws SiftsException { expectedMapping.put(51, new int[] { 1, 2 }); expectedMapping.put(52, new int[] { 2, 7 }); expectedMapping.put(53, new int[] { 3, 12 }); expectedMapping.put(54, new int[] { 4, 24 }); expectedMapping.put(55, new int[] { 5, 33 }); expectedMapping.put(56, new int[] { 6, 40 }); expectedMapping.put(57, new int[] { 7, 47 }); expectedMapping.put(58, new int[] { 8, 55 }); expectedMapping.put(59, new int[] { 9, 62 }); expectedMapping.put(60, new int[] { 10, 69 }); expectedMapping.put(61, new int[] { 11, 76 }); expectedMapping.put(62, new int[] { 12, 83 }); expectedMapping.put(63, new int[] { 13, 87 }); expectedMapping.put(64, new int[] { 14, 95 }); expectedMapping.put(65, new int[] { 15, 102 }); expectedMapping.put(66, new int[] { 16, 111 }); expectedMapping.put(67, new int[] { 17, 122 }); expectedMapping.put(68, new int[] { 18, 131 }); expectedMapping.put(69, new int[] { 19, 137 }); expectedMapping.put(70, new int[] { 20, 144 }); expectedMapping.put(71, new int[] { 21, 152 }); expectedMapping.put(72, new int[] { 22, 160 }); expectedMapping.put(73, new int[] { 23, 167 }); expectedMapping.put(74, new int[] { 24, 179 }); expectedMapping.put(75, new int[] { 25, 187 }); expectedMapping.put(76, new int[] { 26, 195 }); expectedMapping.put(77, new int[] { 27, 203 }); expectedMapping.put(78, new int[] { 28, 208 }); expectedMapping.put(79, new int[] { 29, 213 }); expectedMapping.put(80, new int[] { 30, 222 }); expectedMapping.put(81, new int[] { 31, 231 }); expectedMapping.put(82, new int[] { 32, 240 }); expectedMapping.put(83, new int[] { 33, 244 }); expectedMapping.put(84, new int[] { 34, 252 }); expectedMapping.put(85, new int[] { 35, 260 }); expectedMapping.put(86, new int[] { 36, 268 }); expectedMapping.put(87, new int[] { 37, 275 }); expectedMapping.put(88, new int[] { 38, 287 }); expectedMapping.put(89, new int[] { 39, 293 }); expectedMapping.put(90, new int[] { 40, 299 }); expectedMapping.put(91, new int[] { 41, 310 }); expectedMapping.put(92, new int[] { 42, 315 }); expectedMapping.put(93, new int[] { 43, 319 }); expectedMapping.put(94, new int[] { 44, 325 }); expectedMapping.put(95, new int[] { 45, 331 }); expectedMapping.put(96, new int[] { 46, 337 }); expectedMapping.put(97, new int[] { 47, 343 }); expectedMapping.put(98, new int[] { 48, 349 }); expectedMapping.put(99, new int[] { 49, 354 }); expectedMapping.put(100, new int[] { 50, 358 }); expectedMapping.put(101, new int[] { 51, 367 }); expectedMapping.put(102, new int[] { 52, 375 }); expectedMapping.put(103, new int[] { 53, 384 }); expectedMapping.put(104, new int[] { 54, 391 }); expectedMapping.put(105, new int[] { 55, 395 }); expectedMapping.put(106, new int[] { 56, 401 }); expectedMapping.put(107, new int[] { 57, 409 }); expectedMapping.put(108, new int[] { 58, 417 }); expectedMapping.put(109, new int[] { 59, 426 }); expectedMapping.put(110, new int[] { 60, 434 }); expectedMapping.put(111, new int[] { 61, 442 }); expectedMapping.put(112, new int[] { 62, 451 }); expectedMapping.put(113, new int[] { 63, 457 }); expectedMapping.put(114, new int[] { 64, 468 }); expectedMapping.put(115, new int[] { 65, 476 }); expectedMapping.put(116, new int[] { 66, 484 }); expectedMapping.put(117, new int[] { 67, 492 }); expectedMapping.put(118, new int[] { 68, 500 }); expectedMapping.put(119, new int[] { 69, 509 }); expectedMapping.put(120, new int[] { 70, 517 }); expectedMapping.put(121, new int[] { 71, 525 }); expectedMapping.put(122, new int[] { 72, 534 }); expectedMapping.put(123, new int[] { 73, 538 }); expectedMapping.put(124, new int[] { 74, 552 }); expectedMapping.put(125, new int[] { 75, 559 }); expectedMapping.put(126, new int[] { 76, 567 }); expectedMapping.put(127, new int[] { 77, 574 }); expectedMapping.put(128, new int[] { 78, 580 }); expectedMapping.put(129, new int[] { 79, 585 }); expectedMapping.put(130, new int[] { 80, 590 }); expectedMapping.put(131, new int[] { 81, 602 }); expectedMapping.put(132, new int[] { 82, 609 }); expectedMapping.put(133, new int[] { 83, 616 }); expectedMapping.put(134, new int[] { 84, 622 }); expectedMapping.put(135, new int[] { 85, 630 }); expectedMapping.put(136, new int[] { 86, 637 }); expectedMapping.put(137, new int[] { 87, 644 }); expectedMapping.put(138, new int[] { 88, 652 }); expectedMapping.put(139, new int[] { 89, 661 }); expectedMapping.put(140, new int[] { 90, 668 }); expectedMapping.put(141, new int[] { 91, 678 }); expectedMapping.put(142, new int[] { 92, 687 }); expectedMapping.put(143, new int[] { 93, 696 }); expectedMapping.put(144, new int[] { 94, 705 }); expectedMapping.put(145, new int[] { 95, 714 }); expectedMapping.put(146, new int[] { 96, 722 }); expectedMapping.put(147, new int[] { 97, 729 }); } @BeforeTest(alwaysRun = true) public void setUpSiftsClient() throws SiftsException, IOException { // read test props before manipulating config Cache.loadProperties("test/jalview/io/testProps.jvprops"); // SIFTs entries are updated weekly - so use saved SIFTs file to enforce // test reproducibility new SiftsSettings(); SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache.getDefault( "sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR)); SiftsSettings.setMapWithSifts(true); SiftsSettings.setCacheThresholdInDays("2"); SiftsSettings.setFailSafePIDThreshold("70"); PDBfile pdbFile; pdbFile = new PDBfile(false, false, false, "test/jalview/io/" + testPDBId + ".pdb", DataSourceType.FILE); siftsClient = new SiftsClient(pdbFile); } @AfterTest(alwaysRun = true) public void cleanUpSiftsClient() { siftsClient = null; } @Test(groups = { "Network" }) public void getSIFTsFileTest() throws SiftsException, IOException { File siftsFile; siftsFile = SiftsClient.downloadSiftsFile(testPDBId); FileAssert.assertFile(siftsFile); long t1 = siftsFile.lastModified(); // re-read file should be returned from cache siftsFile = SiftsClient.downloadSiftsFile(testPDBId); FileAssert.assertFile(siftsFile); long t2 = siftsFile.lastModified(); assertEquals(t1, t2); /* * force fetch by having 0 expiry of cache * also wait one second, because file timestamp does not * give millisecond resolution :-( */ synchronized (this) { try { wait(1000); } catch (InterruptedException e) { } } SiftsSettings.setCacheThresholdInDays("0"); siftsFile = SiftsClient.getSiftsFile(testPDBId); FileAssert.assertFile(siftsFile); long t3 = siftsFile.lastModified(); assertTrue(t3 > t2, "file timestamp unchanged at " + t3); SiftsSettings.setCacheThresholdInDays("2"); } @Test(groups = { "Network" }) public void downloadSiftsFileTest() throws SiftsException, IOException { // Assert that file isn't yet downloaded - if already downloaded, assert it // is deleted Assert.assertTrue(SiftsClient.deleteSiftsFileByPDBId(testPDBId)); File siftsFile; siftsFile = SiftsClient.downloadSiftsFile(testPDBId); FileAssert.assertFile(siftsFile); SiftsClient.downloadSiftsFile(testPDBId); } @Test(groups = { "Network" }) public void getAllMappingAccessionTest() { Assert.assertNotNull(siftsClient); Assert.assertNotNull(siftsClient.getAllMappingAccession()); Assert.assertTrue(siftsClient.getAllMappingAccession().size() > 1); } @Test(groups = { "Network" }) public void getGreedyMappingTest() { Assert.assertNotNull(siftsClient); Assert.assertNotNull(testSeq); Assert.assertNotNull(expectedMapping); // TODO delete when auto-fetching of DBRefEntry is implemented DBRefEntry dbRef = new DBRefEntry("uniprot", "", "P00221"); testSeq.addDBRef(dbRef); // testSeq.setSourceDBRef(dbRef); try { HashMap actualMapping = siftsClient.getGreedyMapping( "A", testSeq, null); Assert.assertEquals(testSeq.getStart(), 1); Assert.assertEquals(testSeq.getEnd(), 147); <<<<<<< HEAD // Can't do Assert.assertEquals(actualMapping, expectedMapping); // because this fails in our version of TestNG Assert.assertEquals(actualMapping.size(), expectedMapping.size()); Iterator> it = expectedMapping.entrySet() .iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); Assert.assertTrue(actualMapping.containsKey(pair.getKey())); Assert.assertEquals(actualMapping.get(pair.getKey()), pair.getValue()); } ======= // Assert.assertEquals(actualMapping, expectedMapping); Assert.assertEquals(actualMapping.size(), expectedMapping.size()); // Test key set Assert.assertEquals(actualMapping.keySet(), expectedMapping.keySet()); // Test entry set for (int key : expectedMapping.keySet()) { Assert.assertTrue(Arrays.equals(expectedMapping.get(key), actualMapping.get(key))); } >>>>>>> f80180a53bf16dc72ecdd4ace0f70c83cb0d274a } catch (Exception e) { e.printStackTrace(); Assert.fail("Exception thrown while generating mapping..."); } } @Test(groups = { "Network" }) private void getAtomIndexTest() { ArrayList atoms = new ArrayList(); Atom atom = new Atom(u, u, u); atom.resNumber = 43; atom.atomIndex = 7; atoms.add(atom); int actualAtomIndex = siftsClient.getAtomIndex(1, atoms); Assert.assertEquals(actualAtomIndex, -1); actualAtomIndex = siftsClient.getAtomIndex(43, atoms); Assert.assertEquals(actualAtomIndex, 7); } @Test( groups = { "Network" }, expectedExceptions = IllegalArgumentException.class) private void getAtomIndexNullTest() { siftsClient.getAtomIndex(1, null); } @Test(groups = { "Network" }) private void padWithGapsTest() { } @Test( groups = { "Network" }, expectedExceptions = StructureMappingException.class) private void populateAtomPositionsNullTest1() throws IllegalArgumentException, StructureMappingException { siftsClient.populateAtomPositions(null, null); } @Test( groups = { "Network" }, expectedExceptions = StructureMappingException.class) private void populateAtomPositionsNullTest2() throws IllegalArgumentException, StructureMappingException { siftsClient.populateAtomPositions("A", null); } @Test(groups = { "Network" }) public void getValidSourceDBRefTest() throws SiftsException { DBRefEntryI actualValidSrcDBRef = siftsClient .getValidSourceDBRef(testSeq); DBRefEntryI expectedDBRef = new DBRefEntry(); expectedDBRef.setSource(DBRefSource.UNIPROT); expectedDBRef.setAccessionId("P00221"); expectedDBRef.setVersion(""); Assert.assertEquals(actualValidSrcDBRef, expectedDBRef); } @Test( groups = { "Network" }, expectedExceptions = SiftsException.class) public void getValidSourceDBRefExceptionTest() throws SiftsException { SequenceI invalidTestSeq = new Sequence("testSeq", "ABCDEFGH"); siftsClient.getValidSourceDBRef(invalidTestSeq); } @Test( groups = { "Network" }, expectedExceptions = SiftsException.class) public void getValidSourceDBRefExceptionXTest() throws SiftsException { SequenceI invalidTestSeq = new Sequence("testSeq", "ABCDEFGH"); DBRefEntry invalidDBRef = new DBRefEntry(); invalidDBRef.setAccessionId("BLAR"); invalidTestSeq.addDBRef(invalidDBRef); siftsClient.getValidSourceDBRef(invalidTestSeq); } @Test(groups = { "Network" }) public void isValidDBRefEntryTest() { DBRefEntryI validDBRef = new DBRefEntry(); validDBRef.setSource(DBRefSource.UNIPROT); validDBRef.setAccessionId("P00221"); validDBRef.setVersion(""); Assert.assertTrue(siftsClient.isValidDBRefEntry(validDBRef)); } @Test(groups = { "Network" }) public void getSiftsStructureMappingTest() throws StructureMappingException, Exception { Assert.assertTrue(SiftsSettings.isMapWithSifts()); StructureMapping strucMapping = siftsClient.getStructureMapping( testSeq, testPDBId, "A"); String expectedMappingOutput = "\nSequence ⟷ Structure mapping details\n" + "Method: SIFTS\n\n" + "P00221 : 51 - 147 Maps to \n" + "1A70|A : 1 - 97\n\n" + "P00221 AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLD\n" + " |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n" + "1A70|A AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLD\n\n" + "P00221 DDQIDEGWVLTCAAYPVSDVTIETHKEEELTA\n" + " |||||||||||||||||||||||||| |||||\n" + "1A70|A DDQIDEGWVLTCAAYPVSDVTIETHKKEELTA\n\n" + "Length of alignment = 97\n" + "Percentage ID = 98.97\n"; Assert.assertEquals(strucMapping.getMappingDetailsOutput(), expectedMappingOutput); <<<<<<< HEAD // Can't do Assert.assertEquals(strucMapping.getMapping(), expectedMapping); // because this fails in our version of TestNG Assert.assertEquals(strucMapping.getMapping().size(), expectedMapping.size()); Iterator> it = expectedMapping.entrySet() .iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); Assert.assertTrue(strucMapping.getMapping() .containsKey(pair.getKey())); Assert.assertEquals(strucMapping.getMapping().get(pair.getKey()), pair.getValue()); ======= // Assert.assertEquals(strucMapping.getMapping(), expectedMapping); Assert.assertEquals(strucMapping.getMapping().size(), expectedMapping.size()); // Test key set Assert.assertEquals(strucMapping.getMapping().keySet(), expectedMapping.keySet()); // Test entry set for (int key : expectedMapping.keySet()) { Assert.assertTrue(Arrays.equals(expectedMapping.get(key), strucMapping.getMapping().get(key))); >>>>>>> f80180a53bf16dc72ecdd4ace0f70c83cb0d274a } } @Test(groups = { "Network" }) public void getEntityCountTest() { int actualEntityCount = siftsClient.getEntityCount(); System.out.println("actual entity count : " + actualEntityCount); Assert.assertEquals(actualEntityCount, 1); } @Test(groups = { "Network" }) public void getDbAccessionIdTest() { String actualDbAccId = siftsClient.getDbAccessionId(); System.out.println("Actual Db Accession Id: " + actualDbAccId); Assert.assertEquals(actualDbAccId, "1a70"); } @Test(groups = { "Network" }) public void getDbCoordSysTest() { String actualDbCoordSys = siftsClient.getDbCoordSys(); System.out.println("Actual DbCoordSys: " + actualDbCoordSys); Assert.assertEquals(actualDbCoordSys, "PDBe"); } @Test(groups = { "Network" }) public void getDbSourceTest() { String actualDbSource = siftsClient.getDbSource(); System.out.println("Actual DbSource: " + actualDbSource); Assert.assertEquals(actualDbSource, "PDBe"); } @Test(groups = { "Network" }) public void getDbVersionTest() { String actualDbVersion = siftsClient.getDbVersion(); System.out.println("Actual DbVersion: " + actualDbVersion); Assert.assertEquals(actualDbVersion, "2.0"); } @Test(groups = { "Network" }) public void getEntityByMostOptimalMatchedIdTest1() throws IOException, SiftsException { SiftsClient siftsClientX = null; PDBfile pdbFile; pdbFile = new PDBfile(false, false, false, "test/jalview/io/2nq2" + ".pdb", DataSourceType.FILE); siftsClientX = new SiftsClient(pdbFile); Entity entityA = siftsClientX.getEntityByMostOptimalMatchedId("A"); Assert.assertEquals(entityA.getEntityId(), "A"); Entity entityB = siftsClientX.getEntityByMostOptimalMatchedId("B"); Assert.assertEquals(entityB.getEntityId(), "C"); Entity entityC = siftsClientX.getEntityByMostOptimalMatchedId("C"); Assert.assertEquals(entityC.getEntityId(), "B"); Entity entityD = siftsClientX.getEntityByMostOptimalMatchedId("D"); Assert.assertEquals(entityD.getEntityId(), "D"); } @Test(groups = { "Network" }) public void getEntityByMostOptimalMatchedIdTest2() throws IOException, SiftsException { // This test is for a SIFTS file in which entity A should map to chain P for // the given PDB Id. All the other chains shouldn't be mapped as there are // no SIFTS entity records for them. SiftsClient siftsClientX = null; PDBfile pdbFile; pdbFile = new PDBfile(false, false, false, "test/jalview/io/3ucu.cif", DataSourceType.FILE); siftsClientX = new SiftsClient(pdbFile); Entity entityA = siftsClientX.getEntityByMostOptimalMatchedId("P"); Entity entityP = siftsClientX.getEntityByMostOptimalMatchedId("A"); Entity entityR = siftsClientX.getEntityByMostOptimalMatchedId("R"); Assert.assertEquals(entityA.getEntityId(), "A"); Assert.assertNotEquals(entityR, "A"); Assert.assertNotEquals(entityP, "A"); Assert.assertNotEquals(entityR, "R"); Assert.assertNotEquals(entityP, "P"); Assert.assertNull(entityR); Assert.assertNull(entityP); } }