import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
import jalview.datamodel.SequenceFeature;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.testng.annotations.Test;
+import junit.extensions.PA;
+
public class FeatureStoreTest
{
+ private FeatureStore newFeatureStore()
+ {
+ return new FeatureStore();
+ }
@Test(groups = "Functional")
public void testFindFeatures_nonNested()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
fs.addFeature(new SequenceFeature("", "", 10, 20, Float.NaN,
null));
// same range different description
fs.addFeature(new SequenceFeature("", "", 15, 25, Float.NaN, null));
fs.addFeature(new SequenceFeature("", "", 20, 35, Float.NaN, null));
- List<SequenceFeature> overlaps = fs.findOverlappingFeatures(1, 9);
+ List<SequenceFeature> overlaps = fs.findFeatures(1, 9);
assertTrue(overlaps.isEmpty());
- overlaps = fs.findOverlappingFeatures(8, 10);
+ overlaps = fs.findFeatures(8, 10);
assertEquals(overlaps.size(), 2);
assertEquals(overlaps.get(0).getEnd(), 20);
assertEquals(overlaps.get(1).getEnd(), 20);
- overlaps = fs.findOverlappingFeatures(12, 16);
+ overlaps = fs.findFeatures(12, 16);
assertEquals(overlaps.size(), 3);
assertEquals(overlaps.get(0).getEnd(), 20);
assertEquals(overlaps.get(1).getEnd(), 20);
assertEquals(overlaps.get(2).getEnd(), 25);
- overlaps = fs.findOverlappingFeatures(33, 33);
+ overlaps = fs.findFeatures(33, 33);
assertEquals(overlaps.size(), 1);
assertEquals(overlaps.get(0).getEnd(), 35);
}
- private FeatureStoreI newFeatureStore()
- {
- // return new FeatureStoreJS();
- return new FeatureStoreImpl();
- }
-
@Test(groups = "Functional")
public void testFindFeatures_nested()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
SequenceFeature sf1 = addFeature(fs, 10, 50);
SequenceFeature sf2 = addFeature(fs, 10, 40);
SequenceFeature sf3 = addFeature(fs, 20, 30);
fs.addFeature(sf4);
SequenceFeature sf5 = addFeature(fs, 35, 36);
- List<SequenceFeature> overlaps = fs.findOverlappingFeatures(1, 9);
+ List<SequenceFeature> overlaps = fs.findFeatures(1, 9);
assertTrue(overlaps.isEmpty());
- overlaps = fs.findOverlappingFeatures(10, 15);
+ overlaps = fs.findFeatures(10, 15);
assertEquals(overlaps.size(), 2);
assertTrue(overlaps.contains(sf1));
assertTrue(overlaps.contains(sf2));
- overlaps = fs.findOverlappingFeatures(45, 60);
+ overlaps = fs.findFeatures(45, 60);
assertEquals(overlaps.size(), 1);
assertTrue(overlaps.contains(sf1));
- overlaps = fs.findOverlappingFeatures(32, 38);
+ overlaps = fs.findFeatures(32, 38);
assertEquals(overlaps.size(), 3);
assertTrue(overlaps.contains(sf1));
assertTrue(overlaps.contains(sf2));
assertTrue(overlaps.contains(sf5));
- overlaps = fs.findOverlappingFeatures(15, 25);
+ overlaps = fs.findFeatures(15, 25);
assertEquals(overlaps.size(), 4);
assertTrue(overlaps.contains(sf1));
assertTrue(overlaps.contains(sf2));
@Test(groups = "Functional")
public void testFindFeatures_mixed()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
SequenceFeature sf1 = addFeature(fs, 10, 50);
SequenceFeature sf2 = addFeature(fs, 1, 15);
SequenceFeature sf3 = addFeature(fs, 20, 30);
SequenceFeature sf5 = addFeature(fs, 60, 100);
SequenceFeature sf6 = addFeature(fs, 70, 70);
- List<SequenceFeature> overlaps = fs.findOverlappingFeatures(200, 200);
+ List<SequenceFeature> overlaps = fs.findFeatures(200, 200);
assertTrue(overlaps.isEmpty());
- overlaps = fs.findOverlappingFeatures(1, 9);
+ overlaps = fs.findFeatures(1, 9);
assertEquals(overlaps.size(), 1);
assertTrue(overlaps.contains(sf2));
- overlaps = fs.findOverlappingFeatures(5, 18);
+ overlaps = fs.findFeatures(5, 18);
assertEquals(overlaps.size(), 2);
assertTrue(overlaps.contains(sf1));
assertTrue(overlaps.contains(sf2));
- overlaps = fs.findOverlappingFeatures(30, 40);
+ overlaps = fs.findFeatures(30, 40);
assertEquals(overlaps.size(), 3);
assertTrue(overlaps.contains(sf1));
assertTrue(overlaps.contains(sf3));
assertTrue(overlaps.contains(sf4));
- overlaps = fs.findOverlappingFeatures(80, 90);
+ overlaps = fs.findFeatures(80, 90);
assertEquals(overlaps.size(), 2);
assertTrue(overlaps.contains(sf4));
assertTrue(overlaps.contains(sf5));
- overlaps = fs.findOverlappingFeatures(68, 70);
+ overlaps = fs.findFeatures(68, 70);
assertEquals(overlaps.size(), 3);
assertTrue(overlaps.contains(sf4));
assertTrue(overlaps.contains(sf5));
* @param to
* @return
*/
- SequenceFeature addFeature(FeatureStoreI fs, int from, int to)
+ SequenceFeature addFeature(FeatureStore fs, int from, int to)
{
SequenceFeature sf1 = new SequenceFeature("", "", from, to, Float.NaN,
null);
@Test(groups = "Functional")
public void testFindFeatures_contactFeatures()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
SequenceFeature sf = new SequenceFeature("disulphide bond", "bond", 10,
20, Float.NaN, null);
/*
* neither contact point in range
*/
- List<SequenceFeature> overlaps = fs.findOverlappingFeatures(1, 9);
+ List<SequenceFeature> overlaps = fs.findFeatures(1, 9);
assertTrue(overlaps.isEmpty());
/*
* neither contact point in range
*/
- overlaps = fs.findOverlappingFeatures(11, 19);
+ overlaps = fs.findFeatures(11, 19);
assertTrue(overlaps.isEmpty());
/*
* first contact point in range
*/
- overlaps = fs.findOverlappingFeatures(5, 15);
+ overlaps = fs.findFeatures(5, 15);
assertEquals(overlaps.size(), 1);
assertTrue(overlaps.contains(sf));
/*
* second contact point in range
*/
- overlaps = fs.findOverlappingFeatures(15, 25);
+ overlaps = fs.findFeatures(15, 25);
assertEquals(overlaps.size(), 1);
assertTrue(overlaps.contains(sf));
/*
* both contact points in range
*/
- overlaps = fs.findOverlappingFeatures(5, 25);
+ overlaps = fs.findFeatures(5, 25);
assertEquals(overlaps.size(), 1);
assertTrue(overlaps.contains(sf));
}
@Test(groups = "Functional")
+ public void testGetPositionalFeatures_withResultList()
+ {
+ FeatureStore store = newFeatureStore();
+ SequenceFeature sf1 = new SequenceFeature("Metal", "desc", 10, 20,
+ Float.NaN, null);
+ store.addFeature(sf1);
+ // contact feature
+ SequenceFeature sf2 = new SequenceFeature("Disulphide bond", "desc", 18,
+ 45, Float.NaN, null);
+ store.addFeature(sf2);
+
+ List<SequenceFeature> features = new ArrayList<>();
+ store.getPositionalFeatures(features);
+ assertEquals(features.size(), 2);
+ assertTrue(features.contains(sf1));
+ assertTrue(features.contains(sf2));
+
+ /*
+ * no check for duplicates
+ */
+ features.remove(sf1);
+ assertEquals(features.size(), 1);
+ assertTrue(features.contains(sf2));
+ store.getPositionalFeatures(features);
+ assertEquals(features.size(), 3);
+ assertTrue(features.contains(sf1));
+ assertTrue(features.contains(sf2)); // two copies now
+ features.remove(sf2);
+ assertTrue(features.contains(sf2)); // one copy left
+ assertEquals(features.size(), 2);
+
+ /*
+ * null argument throws exception
+ */
+ try
+ {
+ store.getPositionalFeatures(null);
+ fail("expected exception");
+ } catch (NullPointerException e)
+ {
+ // expected
+ }
+ }
+
+ @Test(groups = "Functional")
+ public void testGetNonPositionalFeatures()
+ {
+ FeatureStore store = newFeatureStore();
+ List<SequenceFeature> features = store.getNonPositionalFeatures();
+ assertTrue(features.isEmpty());
+
+ SequenceFeature sf1 = new SequenceFeature("Metal", "desc", 10, 20,
+ Float.NaN, null);
+ store.addFeature(sf1);
+ assertTrue(features.isEmpty());
+
+ SequenceFeature sf2 = new SequenceFeature("Metal", "desc", 0, 0,
+ Float.NaN, null);
+ store.addFeature(sf2);
+ features = store.getNonPositionalFeatures();
+ assertEquals(features.size(), 1);
+ assertTrue(features.contains(sf2));
+
+ /*
+ * with result list argument
+ */
+ features.clear();
+ store.getNonPositionalFeatures(features);
+ assertEquals(features.size(), 1);
+ assertTrue(features.contains(sf2));
+
+ /*
+ * no check for duplicates
+ */
+ store.getNonPositionalFeatures(features);
+ assertEquals(features.size(), 2);
+ assertTrue(features.contains(sf2)); // two copies
+ features.remove(sf2);
+ assertTrue(features.contains(sf2));
+
+ /*
+ * null argument throws exception
+ */
+ try
+ {
+ store.getNonPositionalFeatures(null);
+ fail("expected exception");
+ } catch (NullPointerException e)
+ {
+ // expected
+ }
+ }
+
+ @Test(groups = "Functional")
public void testGetPositionalFeatures()
{
- FeatureStoreI store = newFeatureStore();
+ FeatureStore store = newFeatureStore();
SequenceFeature sf1 = new SequenceFeature("Metal", "desc", 10, 20,
Float.NaN, null);
store.addFeature(sf1);
@Test(groups = "Functional")
public void testDelete()
{
- FeatureStoreI store = newFeatureStore();
+ FeatureStore store = newFeatureStore();
SequenceFeature sf1 = addFeature(store, 10, 20);
assertTrue(store.getPositionalFeatures().contains(sf1));
@Test(groups = "Functional")
public void testAddFeature()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
SequenceFeature sf1 = new SequenceFeature("Cath", "", 10, 20,
Float.NaN, null);
@Test(groups = "Functional")
public void testIsEmpty()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
assertTrue(fs.isEmpty());
assertEquals(fs.getFeatureCount(true), 0);
assertEquals(fs.getFeatureCount(true), 3);
assertTrue(fs.delete(sf1));
assertEquals(fs.getFeatureCount(true), 2);
- assertEquals(fs.getFeatures().size(), 2);
+ Collection<SequenceFeature> intervalStore = (Collection<SequenceFeature>) PA
+ .getValue(fs, "features");
+ assertEquals(intervalStore.size(), 2);
assertFalse(fs.isEmpty());
assertTrue(fs.delete(sf2));
assertEquals(fs.getFeatureCount(true), 1);
@Test(groups = "Functional")
public void testGetFeatureGroups()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
assertTrue(fs.getFeatureGroups(true).isEmpty());
assertTrue(fs.getFeatureGroups(false).isEmpty());
@Test(groups = "Functional")
public void testGetTotalFeatureLength()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
assertEquals(fs.getTotalFeatureLength(), 0);
addFeature(fs, 10, 20); // 11
@Test(groups = "Functional")
public void testGetMinimumScore_getMaximumScore()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
assertEquals(fs.getMinimumScore(true), Float.NaN); // positional
assertEquals(fs.getMaximumScore(true), Float.NaN);
assertEquals(fs.getMinimumScore(false), Float.NaN); // non-positional
@Test(groups = "Functional")
public void testListContains()
{
- FeatureStoreI featureStore = newFeatureStore();
+ FeatureStore featureStore = newFeatureStore();
assertFalse(featureStore.listContains(null, null));
List<SequenceFeature> features = new ArrayList<>();
assertFalse(featureStore.listContains(features, null));
@Test(groups = "Functional")
public void testGetFeaturesForGroup()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
/*
* with no features
@Test(groups = "Functional")
public void testShiftFeatures()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
assertFalse(fs.shiftFeatures(0, 1)); // nothing to do
SequenceFeature sf1 = new SequenceFeature("Cath", "", 2, 5, 0f, null);
/*
* add a feature and a nested feature
*/
- FeatureStoreI store = newFeatureStore();
+ FeatureStore store = newFeatureStore();
SequenceFeature sf1 = addFeature(store, 10, 20);
// sf2 is nested in sf1 so will be stored in nestedFeatures
SequenceFeature sf2 = addFeature(store, 12, 14);
assertEquals(features.size(), 2);
assertTrue(features.contains(sf1));
assertTrue(features.contains(sf2));
- assertTrue(store.getFeatures().contains(sf1));
- assertTrue(store.getFeatures().contains(sf2));
+ Collection<SequenceFeature> intervalStore = (Collection<SequenceFeature>) PA
+ .getValue(store, "features");
+ assertTrue(intervalStore.contains(sf1));
+ assertTrue(intervalStore.contains(sf2));
/*
* delete the first feature
@Test(groups = "Functional")
public void testContains()
{
- FeatureStoreI fs = newFeatureStore();
+ FeatureStore fs = newFeatureStore();
SequenceFeature sf1 = new SequenceFeature("Cath", "", 10, 20,
Float.NaN, "group1");
SequenceFeature sf2 = new SequenceFeature("Cath", "", 10, 20,
assertFalse(fs.contains(sf1));
assertTrue(fs.contains(sf7));
}
+
+ @Test(groups = "Functional")
+ public void testFindFeatures_withResultList()
+ {
+ FeatureStore fs = newFeatureStore();
+ SequenceFeature sf1 = addFeature(fs, 10, 50);
+ SequenceFeature sf2 = addFeature(fs, 150, 250);
+
+ List<SequenceFeature> overlaps = new ArrayList<>();
+ List<SequenceFeature> result = fs.findFeatures(200, 200,
+ overlaps);
+ assertSame(result, overlaps);
+ assertEquals(result.size(), 1);
+ assertTrue(result.contains(sf2));
+ assertFalse(result.contains(sf1));
+
+ /*
+ * if no list supplied, method creates one
+ */
+ result = fs.findFeatures(200, 200, null);
+ assertEquals(result.size(), 1);
+ assertTrue(result.contains(sf2));
+ assertFalse(result.contains(sf1));
+ }
}