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