package jalview.renderer.seqfeatures;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
import jalview.api.FeatureColourI;
import jalview.datamodel.SequenceFeature;
import jalview.schemes.FeatureColour;
import java.awt.Color;
+import java.util.List;
-import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
/**
private FeatureRenderer fr;
- @BeforeClass(alwaysRun = true)
+ @BeforeTest(alwaysRun = true)
public void setUp()
{
// aligned column 8 is sequence position 6
}
/**
- * Clear down any sequence features before each test
+ * Clear down any sequence features before each test (not as easy as it
+ * sounds...)
*/
@BeforeMethod(alwaysRun = true)
public void setUpBeforeTest()
{
- SequenceFeature[] sfs = seq.getSequenceFeatures();
- if (sfs != null)
+ List<SequenceFeature> sfs = seq.getSequenceFeatures();
+ for (SequenceFeature sf : sfs)
{
- for (SequenceFeature sf : sfs)
- {
- seq.deleteFeature(sf);
- }
+ seq.deleteFeature(sf);
}
fr.findAllFeatures(true);
{
fr.setGroupVisibility(group, true);
}
+
+ fr.clearRenderOrder();
+ av.setShowSequenceFeatures(true);
}
@Test(groups = "Functional")
assertEquals(c, Color.red);
}
+ /**
+ * feature colour at a gap is null (not white) - a user defined colour scheme
+ * can then provide a bespoke gap colour if configured to do so
+ */
@Test(groups = "Functional")
public void testFindFeatureColour_gapPosition()
{
fr.featuresAdded();
av.setShowSequenceFeatures(true);
Color c = finder.findFeatureColour(null, seq, 6);
- assertEquals(c, Color.white);
+ assertNull(c);
}
@Test(groups = "Functional")
/*
* the FeatureSettings transparency slider has range 0-70 which
* corresponds to a transparency value of 1 - 0.3
+ * A value of 0.4 gives a combination of
+ * 0.4 * red(255, 0, 0) + 0.6 * cyan(0, 255, 255) = (102, 153, 153)
*/
- fr.setTransparency(0.5f);
- Color c = finder.findFeatureColour(Color.blue, seq, 10);
- assertEquals(c, new Color(85, 170, 0));
+ fr.setTransparency(0.4f);
+ Color c = finder.findFeatureColour(Color.cyan, seq, 10);
+ assertEquals(c, new Color(102, 153, 153));
}
@Test(groups = "Functional")
av.setShowSequenceFeatures(true);
/*
- * Domain (green(0, 255, 0)) rendered above Metal (red(255, 0, 0))
+ * Domain (green) rendered above Metal (red) above background (cyan)
+ * 1) 0.6 * red(255, 0, 0) + 0.4 * cyan(0, 255, 255) = (153, 102, 102)
+ * 2) 0.6* green(0, 255, 0) + 0.4 * (153, 102, 102) = (61, 194, 41) rounded
*/
- fr.setTransparency(0.5f);
- Color c = finder.findFeatureColour(Color.blue, seq, 10);
- assertEquals(c, new Color(85, 170, 0));
+ fr.setTransparency(0.6f);
+ Color c = finder.findFeatureColour(Color.cyan, seq, 10);
+ assertEquals(c, new Color(61, 194, 41));
/*
* now promote Metal above Domain
* - currently no way other than mimicking reordering of
* table in Feature Settings
+ * Metal (red) rendered above Domain (green) above background (cyan)
+ * 1) 0.6 * green(0, 255, 0) + 0.4 * cyan(0, 255, 255) = (0, 255, 102)
+ * 2) 0.6* red(255, 0, 0) + 0.4 * (0, 255, 102) = (153, 102, 41) rounded
*/
Object[][] data = new Object[2][];
data[0] = new Object[] { "Metal", red, true };
data[1] = new Object[] { "Domain", green, true };
fr.setFeaturePriority(data);
- c = finder.findFeatureColour(Color.blue, seq, 10);
- assertEquals(c, new Color(153, 102, 0));
+ c = finder.findFeatureColour(Color.cyan, seq, 10);
+ assertEquals(c, new Color(153, 102, 41));
/*
* ..and turn off display of Metal
+ * Domain (green) above background (pink)
+ * 0.6 * green(0, 255, 0) + 0.4 * pink(255, 175, 175) = (102, 223, 70)
*/
data[0][2] = false;
fr.setFeaturePriority(data);
- c = finder.findFeatureColour(Color.blue, seq, 10);
- assertEquals(c, Color.green);
+ c = finder.findFeatureColour(Color.pink, seq, 10);
+ assertEquals(c, new Color(102, 223, 70));
+ }
+
+ @Test(groups = "Functional")
+ public void testNoFeaturesDisplayed()
+ {
+ /*
+ * no features on alignment to render
+ */
+ assertTrue(finder.noFeaturesDisplayed());
+
+ /*
+ * add a feature
+ * it will be automatically set visible but we leave
+ * the viewport configured not to show features
+ */
+ av.setShowSequenceFeatures(false);
+ seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
+ Float.NaN, "MetalGroup"));
+ FeatureColour red = new FeatureColour(Color.red);
+ fr.setColour("Metal", red);
+ fr.featuresAdded();
+ assertTrue(finder.noFeaturesDisplayed());
+
+ /*
+ * turn on feature display
+ */
+ av.setShowSequenceFeatures(true);
+ assertFalse(finder.noFeaturesDisplayed());
+
+ /*
+ * turn off display of Metal
+ */
+ Object[][] data = new Object[1][];
+ data[0] = new Object[] { "Metal", red, false };
+ fr.setFeaturePriority(data);
+ assertTrue(finder.noFeaturesDisplayed());
+
+ /*
+ * turn display of Metal back on
+ */
+ fr.setVisible("Metal");
+ assertFalse(finder.noFeaturesDisplayed());
+
+ /*
+ * turn off MetalGroup - has no effect here since the group of a
+ * sequence feature instance is independent of its type
+ */
+ fr.setGroupVisibility("MetalGroup", false);
+ assertFalse(finder.noFeaturesDisplayed());
+
+ /*
+ * a finder with no feature renderer
+ */
+ FeatureColourFinder finder2 = new FeatureColourFinder(null);
+ assertTrue(finder2.noFeaturesDisplayed());
}
}