+package jalview.controller;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertTrue;
+
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+
+import java.util.BitSet;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+public class AlignViewControllerTest
+{
+ @Test(groups = "Functional")
+ public void testFindColumnsWithFeature()
+ {
+ SequenceI seq1 = new Sequence("seq1", "aMMMaaaaaaaaaaaaaaaa");
+ SequenceI seq2 = new Sequence("seq2", "aaaMMMMMMMaaaaaaaaaa");
+ SequenceI seq3 = new Sequence("seq3", "aaaaaaaaaaMMMMMaaaaa");
+ SequenceI seq4 = new Sequence("seq3", "aaaaaaaaaaaaaaaaaaaa");
+
+ /*
+ * features start/end are base 1
+ */
+ seq1.addSequenceFeature(new SequenceFeature("Metal", "desc", 2, 4, 0f,
+ null));
+ seq1.addSequenceFeature(new SequenceFeature("Helix", "desc", 1, 15, 0f,
+ null));
+ seq2.addSequenceFeature(new SequenceFeature("Metal", "desc", 4, 10, 0f,
+ null));
+ seq3.addSequenceFeature(new SequenceFeature("Metal", "desc", 11, 15,
+ 0f, null));
+
+ /*
+ * select the first three columns --> seq1 2-3
+ */
+ SequenceGroup sg = new SequenceGroup();
+ sg.setStartRes(0); // base 0
+ sg.setEndRes(2);
+ sg.addSequence(seq1, false);
+ sg.addSequence(seq2, false);
+ sg.addSequence(seq3, false);
+ sg.addSequence(seq4, false);
+
+ BitSet bs = new BitSet();
+ int seqCount = AlignViewController.findColumnsWithFeature("Metal", sg,
+ bs);
+ assertEquals(1, seqCount);
+ assertEquals(2, bs.cardinality());
+ assertTrue(bs.get(1));
+ assertTrue(bs.get(2));
+
+ /*
+ * select the first four columns: seq1 2:4, seq2 4:4
+ */
+ sg.setEndRes(3);
+ bs.clear();
+ seqCount = AlignViewController.findColumnsWithFeature("Metal", sg,
+ bs);
+ assertEquals(2, seqCount);
+ assertEquals(3, bs.cardinality());
+ assertTrue(bs.get(1));
+ assertTrue(bs.get(2));
+ assertTrue(bs.get(3));
+
+ /*
+ * select column 11: seq3 only
+ */
+ sg.setStartRes(10);
+ sg.setEndRes(10);
+ bs.clear();
+ seqCount = AlignViewController.findColumnsWithFeature("Metal", sg, bs);
+ assertEquals(1, seqCount);
+ assertEquals(1, bs.cardinality());
+ assertTrue(bs.get(10));
+
+ /*
+ * select columns 16-20: no Metal feature
+ */
+ sg.setStartRes(15);
+ sg.setEndRes(19);
+ bs.clear();
+ seqCount = AlignViewController.findColumnsWithFeature("Metal", sg, bs);
+ assertEquals(0, seqCount);
+ assertEquals(0, bs.cardinality());
+
+ /*
+ * look for a feature that isn't there
+ */
+ sg.setStartRes(0);
+ sg.setEndRes(19);
+ bs.clear();
+ seqCount = AlignViewController.findColumnsWithFeature("Pfam", sg, bs);
+ assertEquals(0, seqCount);
+ assertEquals(0, bs.cardinality());
+ }
+
+ @Test(groups = "Functional")
+ public void testSelectMarkedColumns_invert()
+ {
+ ColumnSelection cs = new ColumnSelection();
+ cs.addElement(5); // this will be cleared
+ BitSet toMark = new BitSet();
+ toMark.set(1);
+ toMark.set(3);
+ toMark.set(6);
+ toMark.set(9);
+
+ /*
+ * inverted selection of {3, 6} should select {4, 5, 7, 8}
+ */
+ assertTrue(AlignViewController.selectMarkedColumns(cs, true, false,
+ false, toMark, 3, 8));
+ List<Integer> selected = cs.getSelected();
+ assertEquals(4, selected.size());
+ assertTrue(selected.contains(4));
+ assertTrue(selected.contains(5));
+ assertTrue(selected.contains(7));
+ assertTrue(selected.contains(8));
+ }
+
+ @Test(groups = "Functional")
+ public void testSelectMarkedColumns()
+ {
+ ColumnSelection cs = new ColumnSelection();
+ cs.addElement(5); // this will be cleared
+ BitSet toMark = new BitSet();
+ toMark.set(1);
+ toMark.set(3);
+ toMark.set(6);
+ toMark.set(9);
+
+ assertTrue(AlignViewController.selectMarkedColumns(cs, false, false,
+ false, toMark, 3, 8));
+ List<Integer> selected = cs.getSelected();
+ assertEquals(2, selected.size());
+ assertTrue(selected.contains(3));
+ assertTrue(selected.contains(6));
+ }
+
+ @Test(groups = "Functional")
+ public void testSelectMarkedColumns_extend()
+ {
+ ColumnSelection cs = new ColumnSelection();
+ cs.addElement(1);
+ cs.addElement(5);
+ BitSet toMark = new BitSet();
+ toMark.set(1);
+ toMark.set(3);
+ toMark.set(6);
+ toMark.set(9);
+
+ /*
+ * extending selection of {3, 6} should leave {1, 3, 5, 6} selected
+ */
+ assertTrue(AlignViewController.selectMarkedColumns(cs, false, true,
+ false, toMark, 3, 8));
+ List<Integer> selected = cs.getSelected();
+ assertEquals(4, selected.size());
+ assertTrue(selected.contains(1));
+ assertTrue(selected.contains(3));
+ assertTrue(selected.contains(5));
+ assertTrue(selected.contains(6));
+ }
+
+ @Test(groups = "Functional")
+ public void testSelectMarkedColumns_toggle()
+ {
+ ColumnSelection cs = new ColumnSelection();
+ cs.addElement(1); // outside change range
+ cs.addElement(3);
+ cs.addElement(4);
+ cs.addElement(10); // outside change range
+ BitSet toMark = new BitSet();
+ toMark.set(1);
+ toMark.set(3);
+ toMark.set(6);
+ toMark.set(9);
+
+ /*
+ * toggling state of {3, 6} should leave {1, 4, 6, 10} selected
+ */
+ assertTrue(AlignViewController.selectMarkedColumns(cs, false, false,
+ true, toMark, 3, 8));
+ List<Integer> selected = cs.getSelected();
+ assertEquals(4, selected.size());
+ assertTrue(selected.contains(1));
+ assertTrue(selected.contains(4));
+ assertTrue(selected.contains(6));
+ assertTrue(selected.contains(10));
+ }
+ // TODO testSelectMarkedColumns with combinations of invert/extend/toggle set
+}