JAL-2174 bug fixes + refactoring to allow + unit tests
[jalview.git] / test / jalview / controller / AlignViewControllerTest.java
1 package jalview.controller;
2
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertTrue;
5
6 import jalview.datamodel.ColumnSelection;
7 import jalview.datamodel.Sequence;
8 import jalview.datamodel.SequenceFeature;
9 import jalview.datamodel.SequenceGroup;
10 import jalview.datamodel.SequenceI;
11
12 import java.util.BitSet;
13 import java.util.List;
14
15 import org.testng.annotations.Test;
16
17 public class AlignViewControllerTest
18 {
19   @Test(groups = "Functional")
20   public void testFindColumnsWithFeature()
21   {
22     SequenceI seq1 = new Sequence("seq1", "aMMMaaaaaaaaaaaaaaaa");
23     SequenceI seq2 = new Sequence("seq2", "aaaMMMMMMMaaaaaaaaaa");
24     SequenceI seq3 = new Sequence("seq3", "aaaaaaaaaaMMMMMaaaaa");
25     SequenceI seq4 = new Sequence("seq3", "aaaaaaaaaaaaaaaaaaaa");
26
27     /*
28      * features start/end are base 1
29      */
30     seq1.addSequenceFeature(new SequenceFeature("Metal", "desc", 2, 4, 0f,
31             null));
32     seq1.addSequenceFeature(new SequenceFeature("Helix", "desc", 1, 15, 0f,
33             null));
34     seq2.addSequenceFeature(new SequenceFeature("Metal", "desc", 4, 10, 0f,
35             null));
36     seq3.addSequenceFeature(new SequenceFeature("Metal", "desc", 11, 15,
37             0f, null));
38
39     /*
40      * select the first three columns --> seq1 2-3
41      */
42     SequenceGroup sg = new SequenceGroup();
43     sg.setStartRes(0); // base 0
44     sg.setEndRes(2);
45     sg.addSequence(seq1, false);
46     sg.addSequence(seq2, false);
47     sg.addSequence(seq3, false);
48     sg.addSequence(seq4, false);
49
50     BitSet bs = new BitSet();
51     int seqCount = AlignViewController.findColumnsWithFeature("Metal", sg,
52             bs);
53     assertEquals(1, seqCount);
54     assertEquals(2, bs.cardinality());
55     assertTrue(bs.get(1));
56     assertTrue(bs.get(2));
57     
58     /*
59      * select the first four columns: seq1 2:4, seq2 4:4
60      */
61     sg.setEndRes(3);
62     bs.clear();
63     seqCount = AlignViewController.findColumnsWithFeature("Metal", sg,
64             bs);
65     assertEquals(2, seqCount);
66     assertEquals(3, bs.cardinality());
67     assertTrue(bs.get(1));
68     assertTrue(bs.get(2));
69     assertTrue(bs.get(3));
70
71     /*
72      * select column 11: seq3 only
73      */
74     sg.setStartRes(10);
75     sg.setEndRes(10);
76     bs.clear();
77     seqCount = AlignViewController.findColumnsWithFeature("Metal", sg, bs);
78     assertEquals(1, seqCount);
79     assertEquals(1, bs.cardinality());
80     assertTrue(bs.get(10));
81
82     /*
83      * select columns 16-20: no Metal feature
84      */
85     sg.setStartRes(15);
86     sg.setEndRes(19);
87     bs.clear();
88     seqCount = AlignViewController.findColumnsWithFeature("Metal", sg, bs);
89     assertEquals(0, seqCount);
90     assertEquals(0, bs.cardinality());
91
92     /*
93      * look for a feature that isn't there
94      */
95     sg.setStartRes(0);
96     sg.setEndRes(19);
97     bs.clear();
98     seqCount = AlignViewController.findColumnsWithFeature("Pfam", sg, bs);
99     assertEquals(0, seqCount);
100     assertEquals(0, bs.cardinality());
101   }
102
103   @Test(groups = "Functional")
104   public void testSelectMarkedColumns_invert()
105   {
106     ColumnSelection cs = new ColumnSelection();
107     cs.addElement(5); // this will be cleared
108     BitSet toMark = new BitSet();
109     toMark.set(1);
110     toMark.set(3);
111     toMark.set(6);
112     toMark.set(9);
113
114     /*
115      * inverted selection of {3, 6} should select {4, 5, 7, 8}
116      */
117     assertTrue(AlignViewController.selectMarkedColumns(cs, true, false,
118             false, toMark, 3, 8));
119     List<Integer> selected = cs.getSelected();
120     assertEquals(4, selected.size());
121     assertTrue(selected.contains(4));
122     assertTrue(selected.contains(5));
123     assertTrue(selected.contains(7));
124     assertTrue(selected.contains(8));
125   }
126
127   @Test(groups = "Functional")
128   public void testSelectMarkedColumns()
129   {
130     ColumnSelection cs = new ColumnSelection();
131     cs.addElement(5); // this will be cleared
132     BitSet toMark = new BitSet();
133     toMark.set(1);
134     toMark.set(3);
135     toMark.set(6);
136     toMark.set(9);
137   
138     assertTrue(AlignViewController.selectMarkedColumns(cs, false, false,
139             false, toMark, 3, 8));
140     List<Integer> selected = cs.getSelected();
141     assertEquals(2, selected.size());
142     assertTrue(selected.contains(3));
143     assertTrue(selected.contains(6));
144   }
145
146   @Test(groups = "Functional")
147   public void testSelectMarkedColumns_extend()
148   {
149     ColumnSelection cs = new ColumnSelection();
150     cs.addElement(1);
151     cs.addElement(5);
152     BitSet toMark = new BitSet();
153     toMark.set(1);
154     toMark.set(3);
155     toMark.set(6);
156     toMark.set(9);
157   
158     /*
159      * extending selection of {3, 6} should leave {1, 3, 5, 6} selected
160      */
161     assertTrue(AlignViewController.selectMarkedColumns(cs, false, true,
162             false, toMark, 3, 8));
163     List<Integer> selected = cs.getSelected();
164     assertEquals(4, selected.size());
165     assertTrue(selected.contains(1));
166     assertTrue(selected.contains(3));
167     assertTrue(selected.contains(5));
168     assertTrue(selected.contains(6));
169   }
170
171   @Test(groups = "Functional")
172   public void testSelectMarkedColumns_toggle()
173   {
174     ColumnSelection cs = new ColumnSelection();
175     cs.addElement(1); // outside change range
176     cs.addElement(3);
177     cs.addElement(4);
178     cs.addElement(10); // outside change range
179     BitSet toMark = new BitSet();
180     toMark.set(1);
181     toMark.set(3);
182     toMark.set(6);
183     toMark.set(9);
184   
185     /*
186      * toggling state of {3, 6} should leave {1, 4, 6, 10} selected
187      */
188     assertTrue(AlignViewController.selectMarkedColumns(cs, false, false,
189             true, toMark, 3, 8));
190     List<Integer> selected = cs.getSelected();
191     assertEquals(4, selected.size());
192     assertTrue(selected.contains(1));
193     assertTrue(selected.contains(4));
194     assertTrue(selected.contains(6));
195     assertTrue(selected.contains(10));
196   }
197   // TODO testSelectMarkedColumns with combinations of invert/extend/toggle set
198 }