X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=test%2Fjalview%2Fdatamodel%2Ffeatures%2FSequenceFeaturesTest.java;h=7dde97b6006b5db39bf4b91115963de7efa3f37c;hb=a73dbb370e06bfaae2caf3487fde655d9b177045;hp=bcc11d7285b25f447addf74fc560de52371e7f13;hpb=8fbe19697fc4f60d7534899a274fdef9803fb0d7;p=jalview.git
diff --git a/test/jalview/datamodel/features/SequenceFeaturesTest.java b/test/jalview/datamodel/features/SequenceFeaturesTest.java
index bcc11d7..7dde97b 100644
--- a/test/jalview/datamodel/features/SequenceFeaturesTest.java
+++ b/test/jalview/datamodel/features/SequenceFeaturesTest.java
@@ -1,3 +1,23 @@
+/*
+ * 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.datamodel.features;
import static org.testng.Assert.assertEquals;
@@ -5,18 +25,17 @@ import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
-import jalview.datamodel.SequenceFeature;
-
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import junit.extensions.PA;
-
import org.testng.annotations.Test;
+import jalview.datamodel.SequenceFeature;
+import junit.extensions.PA;
+
public class SequenceFeaturesTest
{
@Test(groups = "Functional")
@@ -78,8 +97,8 @@ public class SequenceFeaturesTest
Float.NaN, null);
store.add(sf6);
// contact feature
- SequenceFeature sf7 = new SequenceFeature("Disulphide bond", "desc",
- 18, 45, Float.NaN, null);
+ SequenceFeature sf7 = new SequenceFeature("Disulphide bond", "desc", 18,
+ 45, Float.NaN, null);
store.add(sf7);
// different feature type
SequenceFeature sf8 = new SequenceFeature("Pfam", "desc", 30, 40,
@@ -143,8 +162,8 @@ public class SequenceFeaturesTest
Float.NaN, null);
store.add(sf2);
// contact feature
- SequenceFeature sf3 = new SequenceFeature("Disulphide bond", "desc",
- 18, 45, Float.NaN, null);
+ SequenceFeature sf3 = new SequenceFeature("Disulphide bond", "desc", 18,
+ 45, Float.NaN, null);
store.add(sf3);
// repeat for different feature type
SequenceFeature sf4 = new SequenceFeature("Pfam", "desc", 10, 20,
@@ -156,7 +175,7 @@ public class SequenceFeaturesTest
SequenceFeature sf6 = new SequenceFeature("Disulfide bond", "desc", 18,
45, Float.NaN, null);
store.add(sf6);
-
+
/*
* get all contact features
*/
@@ -164,7 +183,7 @@ public class SequenceFeaturesTest
assertEquals(features.size(), 2);
assertTrue(features.contains(sf3));
assertTrue(features.contains(sf6));
-
+
/*
* get contact features by type
*/
@@ -172,11 +191,11 @@ public class SequenceFeaturesTest
assertTrue(store.getContactFeatures("Cath").isEmpty());
assertTrue(store.getContactFeatures("Pfam").isEmpty());
assertTrue(store.getContactFeatures("DISULPHIDE BOND").isEmpty());
-
+
features = store.getContactFeatures("Disulphide bond");
assertEquals(features.size(), 1);
assertTrue(features.contains(sf3));
-
+
features = store.getContactFeatures("Disulfide bond");
assertEquals(features.size(), 1);
assertTrue(features.contains(sf6));
@@ -195,8 +214,8 @@ public class SequenceFeaturesTest
Float.NaN, null);
store.add(sf2);
// contact feature
- SequenceFeature sf3 = new SequenceFeature("Disulphide bond", "desc",
- 18, 45, Float.NaN, null);
+ SequenceFeature sf3 = new SequenceFeature("Disulphide bond", "desc", 18,
+ 45, Float.NaN, null);
store.add(sf3);
// repeat for different feature type
SequenceFeature sf4 = new SequenceFeature("Pfam", "desc", 10, 20,
@@ -212,7 +231,7 @@ public class SequenceFeaturesTest
SequenceFeature sf7 = new SequenceFeature("Pfam", "desc2", 0, 0,
Float.NaN, null);
store.add(sf7);
-
+
/*
* get all non-positional features
*/
@@ -221,18 +240,18 @@ public class SequenceFeaturesTest
assertTrue(features.contains(sf2));
assertTrue(features.contains(sf5));
assertTrue(features.contains(sf7));
-
+
/*
* get non-positional features by type
*/
assertTrue(store.getNonPositionalFeatures((String) null).isEmpty());
assertTrue(store.getNonPositionalFeatures("Cath").isEmpty());
assertTrue(store.getNonPositionalFeatures("PFAM").isEmpty());
-
+
features = store.getNonPositionalFeatures("Metal");
assertEquals(features.size(), 1);
assertTrue(features.contains(sf2));
-
+
features = store.getNonPositionalFeatures("Pfam");
assertEquals(features.size(), 2);
assertTrue(features.contains(sf5));
@@ -251,8 +270,7 @@ public class SequenceFeaturesTest
SequenceFeature addFeature(SequenceFeaturesI sf, String type, int from,
int to)
{
- SequenceFeature sf1 = new SequenceFeature(type, "", from, to,
- Float.NaN,
+ SequenceFeature sf1 = new SequenceFeature(type, "", from, to, Float.NaN,
null);
sf.add(sf1);
return sf1;
@@ -274,31 +292,31 @@ public class SequenceFeaturesTest
SequenceFeature sf10 = addFeature(sf, "Cath", 40, 100);
SequenceFeature sf11 = addFeature(sf, "Cath", 60, 100);
SequenceFeature sf12 = addFeature(sf, "Cath", 70, 70);
-
+
List overlaps = sf.findFeatures(200, 200, "Pfam");
assertTrue(overlaps.isEmpty());
-
- overlaps = sf.findFeatures( 1, 9, "Pfam");
+
+ overlaps = sf.findFeatures(1, 9, "Pfam");
assertEquals(overlaps.size(), 1);
assertTrue(overlaps.contains(sf2));
-
- overlaps = sf.findFeatures( 5, 18, "Pfam");
+
+ overlaps = sf.findFeatures(5, 18, "Pfam");
assertEquals(overlaps.size(), 2);
assertTrue(overlaps.contains(sf1));
assertTrue(overlaps.contains(sf2));
-
+
overlaps = sf.findFeatures(30, 40, "Pfam");
assertEquals(overlaps.size(), 3);
assertTrue(overlaps.contains(sf1));
assertTrue(overlaps.contains(sf3));
assertTrue(overlaps.contains(sf4));
-
- overlaps = sf.findFeatures( 80, 90, "Pfam");
+
+ overlaps = sf.findFeatures(80, 90, "Pfam");
assertEquals(overlaps.size(), 2);
assertTrue(overlaps.contains(sf4));
assertTrue(overlaps.contains(sf5));
-
- overlaps = sf.findFeatures( 68, 70, "Pfam");
+
+ overlaps = sf.findFeatures(68, 70, "Pfam");
assertEquals(overlaps.size(), 3);
assertTrue(overlaps.contains(sf4));
assertTrue(overlaps.contains(sf5));
@@ -378,12 +396,10 @@ public class SequenceFeaturesTest
* add, then delete, more non-positional features of different types
*/
SequenceFeature sfy = new SequenceFeature("AnotherType", "Desc", 0, 0,
- 0f,
- "AnotherGroup");
+ 0f, "AnotherGroup");
sf.add(sfy);
SequenceFeature sfz = new SequenceFeature("AThirdType", "Desc", 0, 0,
- 0f,
- null);
+ 0f, null);
sf.add(sfz);
groups = sf.getFeatureGroups(false);
assertEquals(groups.size(), 3);
@@ -453,7 +469,7 @@ public class SequenceFeaturesTest
{
SequenceFeaturesI sf = new SequenceFeatures();
assertTrue(sf.getFeatureTypesForGroups(true, (String) null).isEmpty());
-
+
/*
* add feature with group = "Uniprot", type = "helix"
*/
@@ -465,7 +481,7 @@ public class SequenceFeaturesTest
assertEquals(groups.size(), 1);
assertTrue(groups.contains("helix"));
assertTrue(sf.getFeatureTypesForGroups(true, (String) null).isEmpty());
-
+
/*
* add feature with group = "Uniprot", type = "strand"
*/
@@ -526,8 +542,9 @@ public class SequenceFeaturesTest
assertTrue(groups.contains("turn"));
assertTrue(groups.contains("strand"));
// alternative vararg syntax
- groups = sf.getFeatureTypesForGroups(true, new String[] { "Cath",
- "Scop" });
+ groups = sf.getFeatureTypesForGroups(true,
+ new String[]
+ { "Cath", "Scop" });
assertEquals(groups.size(), 2);
assertTrue(groups.contains("turn"));
assertTrue(groups.contains("strand"));
@@ -569,8 +586,8 @@ public class SequenceFeaturesTest
/*
* add contact feature
*/
- SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc",
- 10, 20, Float.NaN, null);
+ SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc", 10,
+ 20, Float.NaN, null);
store.add(sf4);
types = store.getFeatureTypes();
assertEquals(types.size(), 3);
@@ -608,7 +625,7 @@ public class SequenceFeaturesTest
SequenceFeaturesI store = new SequenceFeatures();
assertEquals(store.getFeatureCount(true), 0);
assertEquals(store.getFeatureCount(false), 0);
-
+
/*
* add positional
*/
@@ -626,7 +643,7 @@ public class SequenceFeaturesTest
assertFalse(store.add(sf2));
assertEquals(store.getFeatureCount(true), 1);
assertEquals(store.getFeatureCount(false), 0);
-
+
/*
* add non-positional feature
*/
@@ -635,16 +652,16 @@ public class SequenceFeaturesTest
store.add(sf3);
assertEquals(store.getFeatureCount(true), 1);
assertEquals(store.getFeatureCount(false), 1);
-
+
/*
* add contact feature (counts as 1)
*/
- SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc",
- 10, 20, Float.NaN, null);
+ SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc", 10,
+ 20, Float.NaN, null);
store.add(sf4);
assertEquals(store.getFeatureCount(true), 2);
assertEquals(store.getFeatureCount(false), 1);
-
+
/*
* add another Pfam but this time as a positional feature
*/
@@ -669,7 +686,7 @@ public class SequenceFeaturesTest
assertTrue(store.delete(sf3));
assertEquals(store.getFeatureCount(true), 3);
assertEquals(store.getFeatureCount(false), 0);
-
+
/*
* delete second Pfam (positional)
*/
@@ -684,21 +701,21 @@ public class SequenceFeaturesTest
SequenceFeaturesI store = new SequenceFeatures();
List features = store.getAllFeatures();
assertTrue(features.isEmpty());
-
+
SequenceFeature sf1 = new SequenceFeature("Metal", "desc", 10, 20,
Float.NaN, null);
store.add(sf1);
features = store.getAllFeatures();
assertEquals(features.size(), 1);
assertTrue(features.contains(sf1));
-
+
SequenceFeature sf2 = new SequenceFeature("Metallic", "desc", 10, 20,
Float.NaN, null);
store.add(sf2);
features = store.getAllFeatures();
assertEquals(features.size(), 2);
assertTrue(features.contains(sf2));
-
+
/*
* add non-positional feature
*/
@@ -708,17 +725,17 @@ public class SequenceFeaturesTest
features = store.getAllFeatures();
assertEquals(features.size(), 3);
assertTrue(features.contains(sf3));
-
+
/*
* add contact feature
*/
- SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc",
- 10, 20, Float.NaN, null);
+ SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc", 10,
+ 20, Float.NaN, null);
store.add(sf4);
features = store.getAllFeatures();
assertEquals(features.size(), 4);
assertTrue(features.contains(sf4));
-
+
/*
* add another Pfam
*/
@@ -741,7 +758,7 @@ public class SequenceFeaturesTest
assertTrue(features.contains(sf1));
assertTrue(features.contains(sf3));
assertTrue(features.contains(sf5));
-
+
/*
* delete first Pfam
*/
@@ -749,7 +766,7 @@ public class SequenceFeaturesTest
features = store.getAllFeatures();
assertEquals(features.size(), 4);
assertFalse(features.contains(sf3));
-
+
/*
* delete second Pfam
*/
@@ -787,8 +804,8 @@ public class SequenceFeaturesTest
/*
* add contact feature - counts 1 to feature length
*/
- SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc",
- 10, 20, Float.NaN, null);
+ SequenceFeature sf4 = new SequenceFeature("Disulphide Bond", "desc", 10,
+ 20, Float.NaN, null);
store.add(sf4);
assertEquals(store.getTotalFeatureLength(), 12);
@@ -940,14 +957,14 @@ public class SequenceFeaturesTest
assertFalse(iterator.hasNext());
/*
- * two types specified - get sorted alphabetically
+ * two types specified - order is preserved
*/
types = sf.varargToTypes("Metal", "Cath");
iterator = types.iterator();
assertTrue(iterator.hasNext());
- assertSame(iterator.next(), featureStores.get("Cath"));
- assertTrue(iterator.hasNext());
assertSame(iterator.next(), featureStores.get("Metal"));
+ assertTrue(iterator.hasNext());
+ assertSame(iterator.next(), featureStores.get("Cath"));
assertFalse(iterator.hasNext());
/*
@@ -964,7 +981,7 @@ public class SequenceFeaturesTest
public void testGetFeatureTypes_byOntology()
{
SequenceFeaturesI store = new SequenceFeatures();
-
+
SequenceFeature sf1 = new SequenceFeature("transcript", "desc", 10, 20,
Float.NaN, null);
store.add(sf1);
@@ -1004,41 +1021,55 @@ public class SequenceFeaturesTest
assertTrue(features.isEmpty());
assertTrue(store.getFeaturesByOntology(new String[] {}).isEmpty());
assertTrue(store.getFeaturesByOntology((String[]) null).isEmpty());
-
- SequenceFeature sf1 = new SequenceFeature("transcript", "desc", 10, 20,
- Float.NaN, null);
- store.add(sf1);
- // mRNA isA transcript; added here 'as if' non-positional
- // just to show that non-positional features are included in results
- SequenceFeature sf2 = new SequenceFeature("mRNA", "desc", 0, 0,
- Float.NaN, null);
- store.add(sf2);
+ SequenceFeature transcriptFeature = new SequenceFeature("transcript",
+ "desc", 10, 20, Float.NaN, null);
+ store.add(transcriptFeature);
- SequenceFeature sf3 = new SequenceFeature("Pfam", "desc", 30, 40,
+ /*
+ * mRNA is a sub-type of transcript; added here 'as if' non-positional
+ * just to show that non-positional features are included in results
+ */
+ SequenceFeature mrnaFeature = new SequenceFeature("mRNA", "desc", 0, 0,
Float.NaN, null);
- store.add(sf3);
+ store.add(mrnaFeature);
+
+ SequenceFeature pfamFeature = new SequenceFeature("Pfam", "desc", 30,
+ 40, Float.NaN, null);
+ store.add(pfamFeature);
+ /*
+ * "transcript" matches both itself and the sub-term "mRNA"
+ */
features = store.getFeaturesByOntology("transcript");
assertEquals(features.size(), 2);
- assertTrue(features.contains(sf1));
- assertTrue(features.contains(sf2));
+ assertTrue(features.contains(transcriptFeature));
+ assertTrue(features.contains(mrnaFeature));
+ /*
+ * "mRNA" matches itself but not parent term "transcript"
+ */
features = store.getFeaturesByOntology("mRNA");
assertEquals(features.size(), 1);
- assertTrue(features.contains(sf2));
+ assertTrue(features.contains(mrnaFeature));
+ /*
+ * "pfam" is not an SO term but is included as an exact match
+ */
features = store.getFeaturesByOntology("mRNA", "Pfam");
assertEquals(features.size(), 2);
- assertTrue(features.contains(sf2));
- assertTrue(features.contains(sf3));
+ assertTrue(features.contains(mrnaFeature));
+ assertTrue(features.contains(pfamFeature));
+
+ features = store.getFeaturesByOntology("sequence_variant");
+ assertTrue(features.isEmpty());
}
@Test(groups = "Functional")
public void testSortFeatures()
{
- List sfs = new ArrayList();
- SequenceFeature sf1 = new SequenceFeature("Pfam", "desc", 30, 80,
+ List sfs = new ArrayList<>();
+ SequenceFeature sf1 = new SequenceFeature("Pfam", "desc", 30, 60,
Float.NaN, null);
sfs.add(sf1);
SequenceFeature sf2 = new SequenceFeature("Rfam", "desc", 40, 50,
@@ -1047,18 +1078,32 @@ public class SequenceFeaturesTest
SequenceFeature sf3 = new SequenceFeature("Rfam", "desc", 50, 60,
Float.NaN, null);
sfs.add(sf3);
+ SequenceFeature sf4 = new SequenceFeature("Xfam", "desc", 30, 80,
+ Float.NaN, null);
+ sfs.add(sf4);
+ SequenceFeature sf5 = new SequenceFeature("Xfam", "desc", 30, 90,
+ Float.NaN, null);
+ sfs.add(sf5);
- // sort by end position descending
+ /*
+ * sort by end position descending, order unchanged if matched
+ */
SequenceFeatures.sortFeatures(sfs, false);
- assertSame(sfs.get(0), sf1);
- assertSame(sfs.get(1), sf3);
- assertSame(sfs.get(2), sf2);
+ assertSame(sfs.get(0), sf5); // end 90
+ assertSame(sfs.get(1), sf4); // end 80
+ assertSame(sfs.get(2), sf1); // end 60, start 50
+ assertSame(sfs.get(3), sf3); // end 60, start 30
+ assertSame(sfs.get(4), sf2); // end 50
- // sort by start position ascending
+ /*
+ * resort {5, 4, 1, 3, 2} by start position ascending, end descending
+ */
SequenceFeatures.sortFeatures(sfs, true);
- assertSame(sfs.get(0), sf1);
- assertSame(sfs.get(1), sf2);
- assertSame(sfs.get(2), sf3);
+ assertSame(sfs.get(0), sf5); // start 30, end 90
+ assertSame(sfs.get(1), sf4); // start 30, end 80
+ assertSame(sfs.get(2), sf1); // start 30, end 60
+ assertSame(sfs.get(3), sf2); // start 40
+ assertSame(sfs.get(4), sf3); // start 50
}
@Test(groups = "Functional")
@@ -1095,12 +1140,14 @@ public class SequenceFeaturesTest
assertTrue(features.contains(sf5));
// positional features for null group, specified type
- features = store.getFeaturesForGroup(true, null, new String[] { "Pfam",
- "Xfam" });
+ features = store.getFeaturesForGroup(true, null,
+ new String[]
+ { "Pfam", "Xfam" });
assertEquals(features.size(), 1);
assertTrue(features.contains(sf1));
- features = store.getFeaturesForGroup(true, null, new String[] { "Pfam",
- "Xfam", "Cath" });
+ features = store.getFeaturesForGroup(true, null,
+ new String[]
+ { "Pfam", "Xfam", "Cath" });
assertEquals(features.size(), 2);
assertTrue(features.contains(sf1));
assertTrue(features.contains(sf5));
@@ -1116,7 +1163,8 @@ public class SequenceFeaturesTest
"Rfam");
assertEquals(features.size(), 1);
assertTrue(features.contains(sf3));
- assertTrue(store.getFeaturesForGroup(true, "Uniprot", "Cath").isEmpty());
+ assertTrue(
+ store.getFeaturesForGroup(true, "Uniprot", "Cath").isEmpty());
// non-positional features for null group, any type
features = store.getFeaturesForGroup(false, null);
@@ -1161,17 +1209,17 @@ public class SequenceFeaturesTest
// non-positional feature:
SequenceFeature sf4 = new SequenceFeature("Pfam", "", 0, 0, 0f, null);
store.add(sf4);
-
+
/*
* shift features right by 5
*/
assertTrue(store.shiftFeatures(0, 5));
-
+
// non-positional features untouched:
List nonPos = store.getNonPositionalFeatures();
assertEquals(nonPos.size(), 1);
assertTrue(nonPos.contains(sf4));
-
+
// positional features are replaced
List pos = store.getPositionalFeatures();
assertEquals(pos.size(), 3);
@@ -1188,7 +1236,7 @@ public class SequenceFeaturesTest
assertEquals(pos.get(2).getBegin(), 28);
assertEquals(pos.get(2).getEnd(), 37);
assertEquals(pos.get(2).getType(), "Disulfide bond");
-
+
/*
* now shift left by 15
* feature at [7-10] should be removed