provide a user interface to edit motifs
[mussa.git] / alg / test / test_mussa.cpp
1 #include <boost/test/auto_unit_test.hpp>
2
3 #include <string>
4 #include <sstream>
5 #include <vector>
6
7 #include "alg/mussa.hpp"
8
9 using namespace std;
10
11 //! can we initialize a mussa object?
12 BOOST_AUTO_TEST_CASE( mussa_simple )
13 {
14   Mussa m;
15   BOOST_CHECK_EQUAL(m.get_name(), "" );
16   BOOST_CHECK_EQUAL(m.get_window(), 0);
17   BOOST_CHECK_EQUAL(m.get_threshold(), 0);
18   BOOST_CHECK_EQUAL(m.get_analysis_mode(), Mussa::TransitiveNway);
19   m.set_name( "hello" );
20   BOOST_CHECK_EQUAL(m.get_name(), "hello" );
21   m.set_window(30);
22   BOOST_CHECK_EQUAL(m.get_window(), 30);
23   m.set_threshold(21);
24   BOOST_CHECK_EQUAL(m.get_threshold(), 21);
25   m.set_analysis_mode(Mussa::RadialNway);
26   BOOST_CHECK_EQUAL(m.get_analysis_mode(), Mussa::RadialNway);
27     
28   m.clear();
29   BOOST_CHECK_EQUAL(m.get_name(), "" );
30   BOOST_CHECK_EQUAL(m.get_window(), 0);
31   BOOST_CHECK_EQUAL(m.get_threshold(), 0);
32   BOOST_CHECK_EQUAL(m.get_analysis_mode(), Mussa::TransitiveNway);
33 }
34
35 BOOST_AUTO_TEST_CASE( mussa_analysis_name )
36 {
37   Mussa m;
38   m.set_analysis_mode( Mussa::TransitiveNway );
39   BOOST_CHECK_EQUAL( m.get_analysis_mode_name(), "Transitive" );
40   m.set_analysis_mode( Mussa::RadialNway );
41   BOOST_CHECK_EQUAL( m.get_analysis_mode_name(), "Radial" );
42   m.set_analysis_mode( Mussa::EntropyNway );
43   BOOST_CHECK_EQUAL( m.get_analysis_mode_name(), "Entropy" );
44   m.set_analysis_mode( Mussa::RecursiveNway);
45   BOOST_CHECK_EQUAL( m.get_analysis_mode_name(), "[deprecated] Recursive" );
46 }
47
48 BOOST_AUTO_TEST_CASE( mussa_sequences )
49 {
50   std::string s0("AAAANNNN");
51   std::string s1("GGGGNNNN");
52   std::string s2("TTTTNNNN");
53
54   Mussa analysis;
55   analysis.add_a_seq(s0);
56   analysis.add_a_seq(s1);
57   analysis.add_a_seq(s2);
58
59   BOOST_CHECK_EQUAL( analysis.sequences().size(), 3 );
60   BOOST_CHECK_EQUAL( analysis.sequences()[0].get_seq(), s0);
61   BOOST_CHECK_EQUAL( analysis.sequences()[1].get_seq(), s1);
62   BOOST_CHECK_EQUAL( analysis.sequences()[2].get_seq(), s2);
63 }
64
65 // for some reason we can call nway once safely but it
66 // somehow changed things and caused a segfault
67 // fixed by adding a return statement in trans_path_search 
68 BOOST_AUTO_TEST_CASE ( empty_mussa_set_threshold )
69 {
70   Mussa m;
71   m.set_soft_thres(15);
72   m.nway();
73
74   m.set_soft_thres(25);
75   m.nway();
76 }
77
78 #include <unistd.h>
79 BOOST_AUTO_TEST_CASE( mussa_load_mupa )
80 {
81   Mussa m1;
82   chdir( "examples" );
83   m1.load_mupa_file( "mck3test.mupa" );
84   m1.analyze(0, 0);
85   BOOST_CHECK_EQUAL( m1.get_name(), std::string("mck3test") );
86   BOOST_CHECK( m1.size() > 0 );
87
88   Mussa m2;
89   std::string saved_analysis_path("mck3test_w30_t20");
90   m2.load( saved_analysis_path  );
91   chdir( ".." );
92
93   BOOST_CHECK_EQUAL( m2.get_name(), saved_analysis_path );
94   BOOST_CHECK_EQUAL( m1.size(), m2.size() );
95
96 }
97
98 BOOST_AUTO_TEST_CASE( mussa_load_full_path )
99 {
100   Mussa m1;
101   chdir( "examples" );
102   const int bufsize = 1024;
103   char path_buf[bufsize];
104   getcwd(path_buf, bufsize);
105   std::string path(path_buf);
106   chdir( ".." );
107   path += "/mck3test.mupa";
108   m1.load_mupa_file( path );
109   m1.analyze(0, 0);
110
111   BOOST_CHECK( m1.size() > 0);
112 }
113
114 BOOST_AUTO_TEST_CASE( mussa_load_motif )
115 {
116   string data = "AAGG 1.0 1.0 0.0\n"
117                 "GGTT 0.0 0.1 1.0\n"
118                 "ZXY 2 1.9 0\n";
119
120   istringstream test_istream(data);
121
122   Mussa m1;
123   m1.add_a_seq("AAAAGGGGTTTT");
124   m1.add_a_seq("GGGCCCCTTGGTT");
125   m1.load_motifs(test_istream);
126
127   for (vector<Sequence>::const_iterator seq_i = m1.sequences().begin();
128        seq_i != m1.sequences().end();
129        ++seq_i)
130   {
131     BOOST_CHECK( seq_i->motifs().size() > 0 );
132   }
133 }
134
135 BOOST_AUTO_TEST_CASE( mussa_add_motif )
136 {
137   vector<string> motifs;
138   motifs.push_back("AAGG");
139   vector<Color> colors;
140   colors.push_back(Color(1.0, 0.0, 0.0));
141   
142   Mussa m1;
143   m1.add_a_seq("AAAAGGGGTTTT");
144   m1.add_a_seq("GGGCCCCTTGGTT");
145   m1.add_motifs(motifs, colors);
146   int first_size = m1.motifs().size();
147   BOOST_CHECK_EQUAL( first_size, 1 );
148   m1.add_motifs(motifs, colors);
149   BOOST_CHECK_EQUAL( first_size, m1.motifs().size() );
150 }