X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fdatamodel%2Ffeatures%2FSequenceFeaturesTest.java;h=b51075e8af9c96db0e5df3c081c5b17405467fad;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=bdf2cab4e9b9c00d18cc9ed8a2f2dbab19475d98;hpb=58242624a72b103d2cd6b130d2efb7d57cf5f104;p=jalview.git diff --git a/test/jalview/datamodel/features/SequenceFeaturesTest.java b/test/jalview/datamodel/features/SequenceFeaturesTest.java index bdf2cab..b51075e 100644 --- a/test/jalview/datamodel/features/SequenceFeaturesTest.java +++ b/test/jalview/datamodel/features/SequenceFeaturesTest.java @@ -5,18 +5,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 +77,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 +142,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 +155,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 +163,7 @@ public class SequenceFeaturesTest assertEquals(features.size(), 2); assertTrue(features.contains(sf3)); assertTrue(features.contains(sf6)); - + /* * get contact features by type */ @@ -172,11 +171,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 +194,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 +211,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 +220,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 +250,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 +272,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 +376,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 +449,7 @@ public class SequenceFeaturesTest { SequenceFeaturesI sf = new SequenceFeatures(); assertTrue(sf.getFeatureTypesForGroups(true, (String) null).isEmpty()); - + /* * add feature with group = "Uniprot", type = "helix" */ @@ -465,7 +461,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 +522,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 +566,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 +605,7 @@ public class SequenceFeaturesTest SequenceFeaturesI store = new SequenceFeatures(); assertEquals(store.getFeatureCount(true), 0); assertEquals(store.getFeatureCount(false), 0); - + /* * add positional */ @@ -626,7 +623,7 @@ public class SequenceFeaturesTest assertFalse(store.add(sf2)); assertEquals(store.getFeatureCount(true), 1); assertEquals(store.getFeatureCount(false), 0); - + /* * add non-positional feature */ @@ -635,16 +632,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 +666,7 @@ public class SequenceFeaturesTest assertTrue(store.delete(sf3)); assertEquals(store.getFeatureCount(true), 3); assertEquals(store.getFeatureCount(false), 0); - + /* * delete second Pfam (positional) */ @@ -684,21 +681,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 +705,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 +738,7 @@ public class SequenceFeaturesTest assertTrue(features.contains(sf1)); assertTrue(features.contains(sf3)); assertTrue(features.contains(sf5)); - + /* * delete first Pfam */ @@ -749,7 +746,7 @@ public class SequenceFeaturesTest features = store.getAllFeatures(); assertEquals(features.size(), 4); assertFalse(features.contains(sf3)); - + /* * delete second Pfam */ @@ -787,8 +784,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 +937,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 +961,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,34 +1001,45 @@ 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()); @@ -1040,8 +1048,8 @@ public class SequenceFeaturesTest @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, @@ -1050,18 +1058,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") @@ -1098,12 +1120,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)); @@ -1119,7 +1143,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); @@ -1164,17 +1189,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); @@ -1191,7 +1216,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