53eb171a1f93b49c97d561175e537f26ccd92c9b
[jalview.git] / test / jalview / controller / AlignViewControllerTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.controller;
22
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertTrue;
25
26 import jalview.analysis.Finder;
27 import jalview.api.AlignViewControllerI;
28 import jalview.datamodel.SearchResults;
29 import jalview.datamodel.SearchResultsI;
30 import jalview.datamodel.Sequence;
31 import jalview.datamodel.SequenceFeature;
32 import jalview.datamodel.SequenceGroup;
33 import jalview.datamodel.SequenceI;
34 import jalview.gui.AlignFrame;
35 import jalview.io.FileLoader;
36 import jalview.io.FormatAdapter;
37
38 import java.util.Arrays;
39 import java.util.BitSet;
40
41 import org.testng.annotations.Test;
42
43 public class AlignViewControllerTest
44 {
45   @Test(groups = "Functional")
46   public void testFindColumnsWithFeature()
47   {
48     SequenceI seq1 = new Sequence("seq1", "aMMMaaaaaaaaaaaaaaaa");
49     SequenceI seq2 = new Sequence("seq2", "aaaMMMMMMMaaaaaaaaaa");
50     SequenceI seq3 = new Sequence("seq3", "aaaaaaaaaaMMMMMaaaaa");
51     SequenceI seq4 = new Sequence("seq3", "aaaaaaaaaaaaaaaaaaaa");
52
53     /*
54      * features start/end are base 1
55      */
56     seq1.addSequenceFeature(new SequenceFeature("Metal", "desc", 2, 4, 0f,
57             null));
58     seq1.addSequenceFeature(new SequenceFeature("Helix", "desc", 1, 15, 0f,
59             null));
60     seq2.addSequenceFeature(new SequenceFeature("Metal", "desc", 4, 10, 0f,
61             null));
62     seq3.addSequenceFeature(new SequenceFeature("Metal", "desc", 11, 15,
63             0f, null));
64
65     /*
66      * select the first three columns --> Metal in seq1 2-3
67      */
68     SequenceGroup sg = new SequenceGroup();
69     sg.setStartRes(0); // base 0
70     sg.setEndRes(2);
71     sg.addSequence(seq1, false);
72     sg.addSequence(seq2, false);
73     sg.addSequence(seq3, false);
74     sg.addSequence(seq4, false);
75
76     BitSet bs = new BitSet();
77     int seqCount = AlignViewController.findColumnsWithFeature("Metal", sg,
78             bs);
79     assertEquals(1, seqCount);
80     assertEquals(2, bs.cardinality());
81     assertTrue(bs.get(1));
82     assertTrue(bs.get(2));
83
84     /*
85      * select the first four columns: Metal in seq1 2:4, seq2 4:4
86      */
87     sg.setEndRes(3);
88     bs.clear();
89     seqCount = AlignViewController.findColumnsWithFeature("Metal", sg, bs);
90     assertEquals(2, seqCount);
91     assertEquals(3, bs.cardinality());
92     assertTrue(bs.get(1));
93     assertTrue(bs.get(2));
94     assertTrue(bs.get(3));
95
96     /*
97      * select column 11: Metal in seq3 only
98      */
99     sg.setStartRes(10);
100     sg.setEndRes(10);
101     bs.clear();
102     seqCount = AlignViewController.findColumnsWithFeature("Metal", sg, bs);
103     assertEquals(1, seqCount);
104     assertEquals(1, bs.cardinality());
105     assertTrue(bs.get(10));
106
107     /*
108      * select columns 16-20: no Metal feature
109      */
110     sg.setStartRes(15);
111     sg.setEndRes(19);
112     bs.clear();
113     seqCount = AlignViewController.findColumnsWithFeature("Metal", sg, bs);
114     assertEquals(0, seqCount);
115     assertEquals(0, bs.cardinality());
116
117     /*
118      * look for a feature that isn't there
119      */
120     sg.setStartRes(0);
121     sg.setEndRes(19);
122     bs.clear();
123     seqCount = AlignViewController.findColumnsWithFeature("Pfam", sg, bs);
124     assertEquals(0, seqCount);
125     assertEquals(0, bs.cardinality());
126   }
127
128   /**
129    * shameless copy of test data from findFeature for testing mark columns from
130    * highlight
131    */
132   @Test(groups = "Functional")
133   public void testSelectColumnsWithHighlight()
134   {
135     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
136             "seq1 aMMMaaaaaaaaaaaaaaaa\n" + "seq2 aaaMMMMMMMaaaaaaaaaa\n"
137                     + "seq3 aaaaaaaaaaMMMMMaaaaa\n"
138                     + "seq4 aaaaaaaaaaaaaaaaaaaa\n", FormatAdapter.PASTE);
139
140     SearchResultsI sr = new SearchResults();
141     SequenceI[] sqs = af.getViewport().getAlignment().getSequencesArray();
142     SequenceI seq1 = sqs[0];
143     SequenceI seq2 = sqs[1];
144     SequenceI seq3 = sqs[2];
145     SequenceI seq4 = sqs[3];
146
147     /*
148      * features start/end are base 1
149      */
150     sr.addResult(seq1, 2, 4);
151     sr.addResult(seq2, 4, 10);
152     sr.addResult(seq3, 11, 15);
153
154     /*
155      *  test Match/Find works first
156      */
157     Finder f = new Finder(af.getViewport().getAlignment(), null);
158     f.setFindAll(true);
159     f.setCaseSensitive(true);
160     f.find("M+");
161     assertEquals(
162             "Finder found different set of results to manually created SearchResults",
163             sr, f.getSearchResults());
164
165     /*
166      * now check simple mark columns from find operation
167      */
168     af.getViewport().setSearchResults(sr);
169     AlignViewControllerI avc = af.avc;
170
171     avc.markHighlightedColumns(false, false, false);
172     assertTrue("Didn't select highlighted columns", Arrays.deepEquals(af
173             .getViewport().getColumnSelection().getSelectedRanges()
174             .toArray(), new int[][] { { 1, 14 } }));
175   }
176 }