1 #define BOOST_AUTO_TEST_MAIN
2 #include <boost/test/auto_unit_test.hpp>
3 #include <boost/test/floating_point_comparison.hpp>
4 #include <boost/shared_ptr.hpp>
8 #include "alg/annotation_colors.hpp"
9 #include "alg/glsequence.hpp"
10 #include "alg/sequence.hpp"
14 BOOST_AUTO_TEST_CASE ( glsequence_operator_assignment )
16 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
17 // I don't trust my operator= hack so lets make sure it works.
18 string s0("AAGGCCTT");
19 string s1("TTGGCCAA");
23 GlSequence glseq0(seq0, cm);
24 BOOST_CHECK (glseq0.get_sequence() == s0);
25 GlSequence glseq1(seq1, cm);
26 GlSequence glseq_copy0(glseq0);
28 BOOST_CHECK(glseq_copy0.get_sequence() == glseq0.get_sequence());
29 BOOST_CHECK( glseq_copy0.get_sequence() == glseq0.get_sequence());
32 BOOST_CHECK( glseq0.get_sequence() == s1 );
35 BOOST_AUTO_TEST_CASE( glsequence_color )
37 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
38 boost::shared_ptr<Color> black(new Color(0.0, 0.0, 0.0, 1.0));
39 boost::shared_ptr<Color> c(new Color(0.1, 0.2, 0.3, 0.4));
40 Sequence seq("AAGGCCTT");
41 GlSequence s(seq, cm);
43 BOOST_CHECK_EQUAL(*s.color(), *black );
45 BOOST_CHECK_EQUAL( *(s.color()), *c );
48 BOOST_AUTO_TEST_CASE( glsequence_renderable )
50 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
51 Sequence seq("AAGGCCTT");
52 GlSequence s(seq, cm);
54 // way more base pairs than viewport pixel width
55 BOOST_CHECK_EQUAL(s.is_sequence_renderable( 0, 1000, 500), false );
56 // way fewer basepairs than viewport pixel width
57 BOOST_CHECK_EQUAL(s.is_sequence_renderable( 0, 10, 500), true);
59 BOOST_CHECK_CLOSE((double)s.get_pixel_width(0, 100, 100), 1.0, 1e-6);
60 BOOST_CHECK_CLOSE((double)s.get_pixel_width(0, 1000, 100), 10.0, 1e-6);
63 BOOST_AUTO_TEST_CASE( glsequence_sequence )
65 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
66 string seq_string("AAGGCCTTNNAAGGCCTTNNAAGGCCTTNN");
67 string::size_type seqlen = seq_string.size();
68 Sequence seq(seq_string);
69 GlSequence glseq(seq, cm);
71 BOOST_CHECK( glseq.region_begin(0, 50) == seq.begin() );
72 // always make sure we return seq.end() regardless of how much extra
74 BOOST_CHECK( glseq.region_end(0, seqlen+10) == seq.end() );
75 // do we get the right end pointer?
76 BOOST_CHECK( glseq.region_end(0, 5) == seq.begin()+5 );
78 // when we request far too much sequence what do we get?
79 BOOST_CHECK( glseq.region_begin(seqlen+10, seqlen+20) == seq.end() );
80 BOOST_CHECK( glseq.region_end(seqlen+10, seqlen+20) == seq.end() );
82 // we cant ask for reversed sequences with region_begin/end
83 BOOST_CHECK( glseq.region_begin(10, 5) == seq.end() );
84 BOOST_CHECK( glseq.region_end(10, 5) == seq.end() );
86 Sequence::const_iterator seq_itor;
88 // if we as for an empty segment? start and end should equal
89 seq_itor = glseq.region_begin(10, 10);
90 BOOST_CHECK( seq_itor == glseq.region_end(10, 10) );
92 // reuse seq_itor downhere
93 string::const_iterator str_itor;
94 for(str_itor = seq.begin(),
95 seq_itor = glseq.begin();
96 str_itor != seq.end() and
97 seq_itor != glseq.end();
98 ++str_itor, ++seq_itor)
100 BOOST_CHECK_EQUAL( *str_itor, *seq_itor );
104 // make sure the computation of the leftmost and rightmost base is correct
105 BOOST_AUTO_TEST_CASE( glsequence_leftright_base )
107 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
108 std::string seq_string = "AAGGCCTT";
109 Sequence seq(seq_string);
110 GlSequence glseq(seq, cm);
112 BOOST_CHECK_EQUAL( glseq.leftbase( -50.0 ), 0 );
113 BOOST_CHECK_EQUAL( glseq.leftbase( 0.5 ), 1 );
114 BOOST_CHECK_EQUAL( glseq.leftbase( 5.0 ), 5 );
115 BOOST_CHECK_EQUAL( glseq.leftbase( 500.0 ), seq_string.size() );
116 BOOST_CHECK_EQUAL( glseq.rightbase( 0.0 ), 0 );
117 BOOST_CHECK_EQUAL( glseq.rightbase( 1000.0 ), seq_string.size() );
118 BOOST_CHECK_EQUAL( glseq.rightbase( seq_string.size()-0.5),
119 seq_string.size()-1);
122 // do our left and right most base computations still work if
123 // we move the sequence around?
124 BOOST_AUTO_TEST_CASE( glsequence_movex )
126 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
127 std::string seq_string = "AAGGCCTTAAGGCCTT";
128 Sequence seq(seq_string);
129 GlSequence glseq(seq, cm);
132 BOOST_CHECK_EQUAL( glseq.leftbase(-100.0), 0 );
133 BOOST_CHECK_EQUAL( glseq.leftbase( 0.0), 5 );
134 BOOST_CHECK_EQUAL( glseq.leftbase( -2.0), 3 );
135 BOOST_CHECK_EQUAL( glseq.leftbase( 100.0), seq_string.size() );
136 BOOST_CHECK_EQUAL( glseq.rightbase( 1000.0 ), seq_string.size() );
137 BOOST_CHECK_EQUAL( glseq.rightbase( 8.0 ), 8+5 );
138 BOOST_CHECK_EQUAL( glseq.rightbase( -7.0 ), 0 );
142 BOOST_AUTO_TEST_CASE( glsequence_check_iterators )
144 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
145 std::string seq_string = "AAGGCCTTAAGGCCTT";
146 Sequence seq(seq_string);
147 GlSequence glseq(seq, cm);
149 Sequence::const_iterator seq_begin_i;
150 Sequence::const_iterator seq_end_i;
152 BOOST_CHECK(glseq.region_begin(5, -5) == seq.end());
153 BOOST_CHECK(glseq.region_begin(0, 20) == seq.begin());
154 BOOST_CHECK(glseq.region_begin(10,20) == seq.begin()+10);
156 BOOST_CHECK(glseq.region_end(5, -5) == seq.end());
157 BOOST_CHECK(glseq.region_end(0, 20) == seq.end());
158 BOOST_CHECK(glseq.region_end(0, 10) == seq.begin()+10);
161 BOOST_CHECK(glseq.region_begin(0, 10) == seq.begin()+5);
162 BOOST_CHECK(glseq.region_end(0, 15) == seq.end());
165 BOOST_AUTO_TEST_CASE( glsequence_subseq )
167 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
168 boost::shared_ptr<Color> c(new Color(1.0, 0.5, 0.5));
170 GlSequence seq("AAGGCCTT", cm);
173 GlSequence subseq = seq.subseq(4,2);
174 BOOST_CHECK_EQUAL(subseq.get_sequence(), "CC");
175 BOOST_CHECK_EQUAL(subseq.color(), c);
179 BOOST_AUTO_TEST_CASE ( shared_ptr_test )
181 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
182 // I don't trust my operator= hack so lets make sure it works.
183 string s0("AAGGCCTT");
184 string s1("TTGGCCAA");
186 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
188 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
190 // make a block to test deallocation
192 GlSequence glseq0(seq0, cm);
193 BOOST_CHECK_EQUAL(seq0.use_count(), 2);
194 GlSequence glseq1(seq1, cm);
195 BOOST_CHECK_EQUAL(seq1.use_count(), 2);
198 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
199 BOOST_CHECK_EQUAL( seq1.use_count(), 3 );
201 BOOST_CHECK_EQUAL(seq0.use_count(), 1);
202 BOOST_CHECK_EQUAL(seq1.use_count(), 1);