Update mussa to build on ubuntu 10.04 with qt 4.6.2 +boost 1.40.0.1
[mussa.git] / alg / test / test_glseqbrowser.cpp
index 0a3f8c976204f5313d8e1dd2a5123034ba9256b2..9587472ae5ab73bbbea1ae6780d5e70a3f0230ae 100644 (file)
@@ -1,14 +1,20 @@
-#include <boost/test/auto_unit_test.hpp>
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE test_glseqbrowser
+#include <boost/test/unit_test.hpp>
+
 #include <boost/assign/std/vector.hpp>
 using namespace boost::assign;
 
+#include <boost/shared_ptr.hpp>
+
 #include <string>
 #include <list>
 #include <vector>
 
-#include "alg/annotation_colors.hpp"
-#include "alg/glseqbrowser.hpp"
-#include "alg/sequence.hpp"
+#include "annotation_colors.hpp"
+#include "glseqbrowser.hpp"
+#include "mussa.hpp"
+#include "sequence.hpp"
 
 using namespace std;
 
@@ -32,19 +38,80 @@ BOOST_AUTO_TEST_CASE ( gltracks_connect )
   vector<int> path;
                 path += 1,1,1; gt.link(path, rc, 1);
   path.clear(); path += 1,1,3; gt.link(path, rc, 1); 
+  path.clear(); path += 1,2,1; gt.link(path, rc, 1);                 
   path.clear(); path += 2,3,3; gt.link(path, rc, 1); 
   path.clear(); path += 3,3,3; gt.link(path, rc, 1);
 
+  // this represents the "depth" of the path_segment AKA sequences -1
   BOOST_CHECK_EQUAL( gt.path_segments.size(), 2 );
-  GlSeqBrowser::segment_key p(1, 1);
-  GlSeqBrowser::pair_segment_map::iterator psm_i = gt.path_segments[0].find(p);
+  BOOST_CHECK_EQUAL( gt.path_segments[0].size(), 4);
+  BOOST_CHECK_EQUAL( gt.path_segments[1].size(), 4);
+  GlSeqBrowser::segment_key p11(1, 1);
+  GlSeqBrowser::segment_key p23(2, 3);
+  GlSeqBrowser::segment_key p33(3, 3);
+  GlSeqBrowser::segment_key p13(1, 3);
+  GlSeqBrowser::pair_segment_map::iterator psm_i = gt.path_segments[0].find(p11);
   BOOST_CHECK( psm_i != gt.path_segments[0].end() );
   BOOST_CHECK_EQUAL( psm_i->second.path_ids.size(), 2 );
-
+  // exaustively test the other keys in the first row
+  psm_i = gt.path_segments[0].find(p23);
+  BOOST_CHECK( psm_i != gt.path_segments[0].end());
+  psm_i = gt.path_segments[0].find(p33);
+  BOOST_CHECK( psm_i != gt.path_segments[0].end());
+  // should be missing
+  psm_i = gt.path_segments[0].find(p13); 
+  BOOST_CHECK( psm_i == gt.path_segments[0].end());
+  
   gt.clear();
   BOOST_CHECK_EQUAL( gt.path_segments.size(), 0 );
 }
 
+BOOST_AUTO_TEST_CASE ( gltracks_connect_different_lengths )
+{
+  string s0("AAGGCCTT");
+  string s1("TTGGCCAA");
+  string s2("GATTACAA");
+  Sequence seq0(s0);
+  Sequence seq1(s1);
+  Sequence seq2(s2);
+
+  GlSeqBrowser gt;
+  gt.push_sequence(seq0);
+  gt.push_sequence(seq1);
+  gt.push_sequence(seq2);
+
+  // make up some sample data
+  vector<bool> rc;
+  rc += false, false, false;
+  vector<int> path;
+                path += 1,1,1; gt.link(path, rc, 5);
+  path.clear(); path += 1,1,3; gt.link(path, rc, 1); 
+  path.clear(); path += 2,3,3; gt.link(path, rc, 1); 
+  path.clear(); path += 3,3,3; gt.link(path, rc, 3);
+  path.clear(); path += 4,3,3; gt.link(path, rc, 2);
+
+  // this represents the "depth" of the path_segment AKA sequences -1
+  BOOST_CHECK_EQUAL( gt.path_segments.size(), 2 );
+  BOOST_CHECK_EQUAL( gt.path_segments[0].size(), 4);
+  BOOST_CHECK_EQUAL( gt.path_segments[1].size(), 3);
+  GlSeqBrowser::segment_key p1(1, 1);
+  GlSeqBrowser::pair_segment_map::iterator psm1_i = gt.path_segments[0].find(p1);
+  BOOST_CHECK( psm1_i != gt.path_segments[0].end() );
+  BOOST_CHECK_EQUAL( psm1_i->second.start.x, 1); //start segment x coordinate
+  BOOST_CHECK_EQUAL( psm1_i->second.end.x, 1); //end segment x coordinate
+  BOOST_CHECK_EQUAL( psm1_i->second.length, 5); 
+  // there should be two paths, the sizes don't match
+  BOOST_CHECK_EQUAL( psm1_i->second.path_ids.size(), 2 );
+  
+  // look at the second row
+  GlSeqBrowser::segment_key p2(3,3);
+  GlSeqBrowser::pair_segment_map::iterator psm2_i = gt.path_segments[1].find(p2);
+  BOOST_CHECK( psm2_i != gt.path_segments[1].end() );
+  BOOST_CHECK_EQUAL( psm2_i->second.start.x, 3); //start segment x coordinate
+  BOOST_CHECK_EQUAL( psm2_i->second.end.x, 3); //end segment x coordinate
+  BOOST_CHECK_EQUAL( psm2_i->second.length, 3); 
+}
+
 BOOST_AUTO_TEST_CASE( glseqbrowser_center )
 {
   string s0("AAGGCCTT");
@@ -53,7 +120,7 @@ BOOST_AUTO_TEST_CASE( glseqbrowser_center )
   Sequence seq0(s0);
   Sequence seq1(s1);
   Sequence seq2(s2);
-  AnnotationColors cm;
+  boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
   GlSequence glseq0(seq0, cm);
   GlSequence glseq1(seq1, cm);
   GlSequence glseq2(seq2, cm);
@@ -78,9 +145,79 @@ BOOST_AUTO_TEST_CASE( glseqbrowser_center )
   BOOST_CHECK_EQUAL( gt.right(), s0.size() + gt.border()-11 );
 
   // aparently we end up with a different glsequence in the seqbrowser
-  BOOST_CHECK( glseq1.x() != gt.sequences()[1].x() );
+  BOOST_CHECK( glseq1.x() != gt.sequences()[1]->x() );
+
+  BOOST_CHECK_EQUAL( gt.sequences()[0]->x(), (gt.viewportCenter()-15)-path[0] );
+  BOOST_CHECK_EQUAL( gt.sequences()[1]->x(), (gt.viewportCenter()-15)-path[1] );
+  BOOST_CHECK_EQUAL( gt.sequences()[2]->x(), (gt.viewportCenter()-15)-path[2] );
+}
+
+BOOST_AUTO_TEST_CASE( setSelectedPaths )
+{
+  string s0("AAGGCCTT");
+  string s1("TTGGCCAA");
+  string s2("GATTACAA");
+  Sequence seq0(s0);
+  Sequence seq1(s1);
+  Sequence seq2(s2);
+  
+  GlSeqBrowser gt;
+  gt.push_sequence(seq0);
+  gt.push_sequence(seq1);
+  gt.push_sequence(seq2);
+
+  // make up some sample data
+  vector<bool> rc;
+  rc += false, false, false;
+  vector<int> path;
+                path += 1,1,1; gt.link(path, rc, 1);
+  path.clear(); path += 1,1,3; gt.link(path, rc, 1); 
+  path.clear(); path += 2,3,3; gt.link(path, rc, 1); 
+  path.clear(); path += 3,3,3; gt.link(path, rc, 1);
+
+  vector<int> selected;
+  selected += 1,4;
+  BOOST_CHECK_EQUAL( gt.selectedPaths().size(), 0 );
+  gt.setSelectedPaths(selected);
+  BOOST_CHECK_EQUAL( gt.selectedPaths().size(), selected.size() );
+  gt.clear_selection();
+  BOOST_CHECK_EQUAL( gt.selectedPaths().size(), 0);
+}
+
+BOOST_AUTO_TEST_CASE( setSelectedTracks )
+{
+  string s0("AAGGCCTT");
+  string s1("TTGGCCAA");
+  string s2("GATTACAA");
+  Sequence seq0(s0);
+  Sequence seq1(s1);
+  Sequence seq2(s2);
+
+  GlSeqBrowser gt;
+  gt.push_sequence(seq0);
+  gt.push_sequence(seq1);
+  gt.push_sequence(seq2);
 
-  BOOST_CHECK_EQUAL( gt.sequences()[0].x(), (gt.viewportCenter()-15)-path[0] );
-  BOOST_CHECK_EQUAL( gt.sequences()[1].x(), (gt.viewportCenter()-15)-path[1] );
-  BOOST_CHECK_EQUAL( gt.sequences()[2].x(), (gt.viewportCenter()-15)-path[2] );
+  BOOST_CHECK_EQUAL( gt.selectedTracks().size(), 0 );
+  gt.appendSelectedTrack(0, 0, seq0.size());
+  gt.appendSelectedTrack(2, 0, seq2.size());
+  BOOST_CHECK_EQUAL( gt.selectedTracks().size(), 2 );
+
+  list<Sequence> selected_sequence;
+  BOOST_CHECK_EQUAL(selected_sequence.size(), 0);
+  gt.copySelectedTracksAsSequences(selected_sequence);
+  BOOST_CHECK_EQUAL(selected_sequence.size(), 2);
+  BOOST_CHECK_EQUAL(selected_sequence.front(), seq0);
+  BOOST_CHECK_EQUAL(selected_sequence.back(), seq2);
+
+  gt.clear_selection();
+  BOOST_CHECK_EQUAL( gt.selectedPaths().size(), 0);
+
+  gt.appendSelectedTrack(0, 0, 2);
+  list<SequenceLocation> seq_locs;
+  gt.copySelectedTracksAsSeqLocation(seq_locs);
+  BOOST_CHECK_EQUAL(seq_locs.size(), 1);
+  BOOST_CHECK_EQUAL(seq_locs.front().getSequence(), seq0);
+  BOOST_CHECK_EQUAL(seq_locs.front().getLeft(), 0);
+  BOOST_CHECK_EQUAL(seq_locs.front().getRight(), 2);
 }