acd450eef09d4d72aed63b89dc0bdb05fbe83008
[mussa.git] / alg / test / test_glseqbrowser.cpp
1 #define BOOST_AUTO_TEST_MAIN
2 #include <boost/test/auto_unit_test.hpp>
3 #include <boost/assign/std/vector.hpp>
4 using namespace boost::assign;
5
6 #include <boost/shared_ptr.hpp>
7
8 #include <string>
9 #include <list>
10 #include <vector>
11
12 #include "annotation_colors.hpp"
13 #include "glseqbrowser.hpp"
14 #include "mussa.hpp"
15 #include "sequence.hpp"
16
17 using namespace std;
18
19 BOOST_AUTO_TEST_CASE ( gltracks_connect )
20 {
21   string s0("AAGGCCTT");
22   string s1("TTGGCCAA");
23   string s2("GATTACAA");
24   Sequence seq0(s0);
25   Sequence seq1(s1);
26   Sequence seq2(s2);
27
28   GlSeqBrowser gt;
29   gt.push_sequence(seq0);
30   gt.push_sequence(seq1);
31   gt.push_sequence(seq2);
32
33   // make up some sample data
34   vector<bool> rc;
35   rc += false, false, false;
36   vector<int> path;
37                 path += 1,1,1; gt.link(path, rc, 1);
38   path.clear(); path += 1,1,3; gt.link(path, rc, 1); 
39   path.clear(); path += 1,2,1; gt.link(path, rc, 1);                 
40   path.clear(); path += 2,3,3; gt.link(path, rc, 1); 
41   path.clear(); path += 3,3,3; gt.link(path, rc, 1);
42
43   // this represents the "depth" of the path_segment AKA sequences -1
44   BOOST_CHECK_EQUAL( gt.path_segments.size(), 2 );
45   BOOST_CHECK_EQUAL( gt.path_segments[0].size(), 4);
46   BOOST_CHECK_EQUAL( gt.path_segments[1].size(), 4);
47   GlSeqBrowser::segment_key p11(1, 1);
48   GlSeqBrowser::segment_key p23(2, 3);
49   GlSeqBrowser::segment_key p33(3, 3);
50   GlSeqBrowser::segment_key p13(1, 3);
51   GlSeqBrowser::pair_segment_map::iterator psm_i = gt.path_segments[0].find(p11);
52   BOOST_CHECK( psm_i != gt.path_segments[0].end() );
53   BOOST_CHECK_EQUAL( psm_i->second.path_ids.size(), 2 );
54   // exaustively test the other keys in the first row
55   psm_i = gt.path_segments[0].find(p23);
56   BOOST_CHECK( psm_i != gt.path_segments[0].end());
57   psm_i = gt.path_segments[0].find(p33);
58   BOOST_CHECK( psm_i != gt.path_segments[0].end());
59   // should be missing
60   psm_i = gt.path_segments[0].find(p13); 
61   BOOST_CHECK( psm_i == gt.path_segments[0].end());
62   
63   gt.clear();
64   BOOST_CHECK_EQUAL( gt.path_segments.size(), 0 );
65 }
66
67 BOOST_AUTO_TEST_CASE ( gltracks_connect_different_lengths )
68 {
69   string s0("AAGGCCTT");
70   string s1("TTGGCCAA");
71   string s2("GATTACAA");
72   Sequence seq0(s0);
73   Sequence seq1(s1);
74   Sequence seq2(s2);
75
76   GlSeqBrowser gt;
77   gt.push_sequence(seq0);
78   gt.push_sequence(seq1);
79   gt.push_sequence(seq2);
80
81   // make up some sample data
82   vector<bool> rc;
83   rc += false, false, false;
84   vector<int> path;
85                 path += 1,1,1; gt.link(path, rc, 5);
86   path.clear(); path += 1,1,3; gt.link(path, rc, 1); 
87   path.clear(); path += 2,3,3; gt.link(path, rc, 1); 
88   path.clear(); path += 3,3,3; gt.link(path, rc, 3);
89   path.clear(); path += 4,3,3; gt.link(path, rc, 2);
90
91   // this represents the "depth" of the path_segment AKA sequences -1
92   BOOST_CHECK_EQUAL( gt.path_segments.size(), 2 );
93   BOOST_CHECK_EQUAL( gt.path_segments[0].size(), 4);
94   BOOST_CHECK_EQUAL( gt.path_segments[1].size(), 3);
95   GlSeqBrowser::segment_key p1(1, 1);
96   GlSeqBrowser::pair_segment_map::iterator psm1_i = gt.path_segments[0].find(p1);
97   BOOST_CHECK( psm1_i != gt.path_segments[0].end() );
98   BOOST_CHECK_EQUAL( psm1_i->second.start.x, 1); //start segment x coordinate
99   BOOST_CHECK_EQUAL( psm1_i->second.end.x, 1); //end segment x coordinate
100   BOOST_CHECK_EQUAL( psm1_i->second.length, 5); 
101   // there should be two paths, the sizes don't match
102   BOOST_CHECK_EQUAL( psm1_i->second.path_ids.size(), 2 );
103   
104   // look at the second row
105   GlSeqBrowser::segment_key p2(3,3);
106   GlSeqBrowser::pair_segment_map::iterator psm2_i = gt.path_segments[1].find(p2);
107   BOOST_CHECK( psm2_i != gt.path_segments[1].end() );
108   BOOST_CHECK_EQUAL( psm2_i->second.start.x, 3); //start segment x coordinate
109   BOOST_CHECK_EQUAL( psm2_i->second.end.x, 3); //end segment x coordinate
110   BOOST_CHECK_EQUAL( psm2_i->second.length, 3); 
111 }
112
113 BOOST_AUTO_TEST_CASE( glseqbrowser_center )
114 {
115   string s0("AAGGCCTT");
116   string s1("TTGGCCAA");
117   string s2("GATTACAA");
118   Sequence seq0(s0);
119   Sequence seq1(s1);
120   Sequence seq2(s2);
121   boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
122   GlSequence glseq0(seq0, cm);
123   GlSequence glseq1(seq1, cm);
124   GlSequence glseq2(seq2, cm);
125
126   GlSeqBrowser gt;
127   gt.push_sequence(glseq0);
128   gt.push_sequence(glseq1);
129   gt.push_sequence(glseq2);
130
131   vector<int> path;
132   path += 0,3,7; 
133
134   BOOST_CHECK_EQUAL( gt.left(), -gt.border() );
135   BOOST_CHECK_EQUAL( gt.right(), s0.size() + gt.border() );
136
137   gt.centerOnPath(path);
138
139   // I didn't bother to compute how the path should shift things
140   // by the magic number 3, i just ran the test and saw how it failed
141   // and hard coded this in.
142   BOOST_CHECK_EQUAL( gt.left(), -18-gt.border() );
143   BOOST_CHECK_EQUAL( gt.right(), s0.size() + gt.border()-11 );
144
145   // aparently we end up with a different glsequence in the seqbrowser
146   BOOST_CHECK( glseq1.x() != gt.sequences()[1]->x() );
147
148   BOOST_CHECK_EQUAL( gt.sequences()[0]->x(), (gt.viewportCenter()-15)-path[0] );
149   BOOST_CHECK_EQUAL( gt.sequences()[1]->x(), (gt.viewportCenter()-15)-path[1] );
150   BOOST_CHECK_EQUAL( gt.sequences()[2]->x(), (gt.viewportCenter()-15)-path[2] );
151 }
152
153 BOOST_AUTO_TEST_CASE( setSelectedPaths )
154 {
155   string s0("AAGGCCTT");
156   string s1("TTGGCCAA");
157   string s2("GATTACAA");
158   Sequence seq0(s0);
159   Sequence seq1(s1);
160   Sequence seq2(s2);
161   
162   GlSeqBrowser gt;
163   gt.push_sequence(seq0);
164   gt.push_sequence(seq1);
165   gt.push_sequence(seq2);
166
167   // make up some sample data
168   vector<bool> rc;
169   rc += false, false, false;
170   vector<int> path;
171                 path += 1,1,1; gt.link(path, rc, 1);
172   path.clear(); path += 1,1,3; gt.link(path, rc, 1); 
173   path.clear(); path += 2,3,3; gt.link(path, rc, 1); 
174   path.clear(); path += 3,3,3; gt.link(path, rc, 1);
175
176   vector<int> selected;
177   selected += 1,4;
178   BOOST_CHECK_EQUAL( gt.selectedPaths().size(), 0 );
179   gt.setSelectedPaths(selected);
180   BOOST_CHECK_EQUAL( gt.selectedPaths().size(), selected.size() );
181   gt.clear_selection();
182   BOOST_CHECK_EQUAL( gt.selectedPaths().size(), 0);
183 }
184
185 BOOST_AUTO_TEST_CASE( setSelectedTracks )
186 {
187   string s0("AAGGCCTT");
188   string s1("TTGGCCAA");
189   string s2("GATTACAA");
190   Sequence seq0(s0);
191   Sequence seq1(s1);
192   Sequence seq2(s2);
193
194   GlSeqBrowser gt;
195   gt.push_sequence(seq0);
196   gt.push_sequence(seq1);
197   gt.push_sequence(seq2);
198
199   BOOST_CHECK_EQUAL( gt.selectedTracks().size(), 0 );
200   gt.appendSelectedTrack(0, 0, seq0.size());
201   gt.appendSelectedTrack(2, 0, seq2.size());
202   BOOST_CHECK_EQUAL( gt.selectedTracks().size(), 2 );
203
204   list<Sequence> selected_sequence;
205   BOOST_CHECK_EQUAL(selected_sequence.size(), 0);
206   gt.copySelectedTracksAsSequences(selected_sequence);
207   BOOST_CHECK_EQUAL(selected_sequence.size(), 2);
208   BOOST_CHECK_EQUAL(selected_sequence.front(), seq0);
209   BOOST_CHECK_EQUAL(selected_sequence.back(), seq2);
210
211   gt.clear_selection();
212   BOOST_CHECK_EQUAL( gt.selectedPaths().size(), 0);
213
214   gt.appendSelectedTrack(0, 0, 2);
215   list<SequenceLocation> seq_locs;
216   gt.copySelectedTracksAsSeqLocation(seq_locs);
217   BOOST_CHECK_EQUAL(seq_locs.size(), 1);
218   BOOST_CHECK_EQUAL(seq_locs.front().getSequence(), seq0);
219   BOOST_CHECK_EQUAL(seq_locs.front().getLeft(), 0);
220   BOOST_CHECK_EQUAL(seq_locs.front().getRight(), 2);
221 }