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 string s0("AAGGCCTT");
18 string s1("TTGGCCAA");
22 GlSequence glseq0(seq0, cm);
23 BOOST_CHECK (glseq0.get_sequence() == s0);
24 GlSequence glseq1(seq1, cm);
25 GlSequence glseq_copy0(glseq0);
27 BOOST_CHECK(glseq_copy0.get_sequence() == glseq0.get_sequence());
28 BOOST_CHECK( glseq_copy0.get_sequence() == glseq0.get_sequence());
31 BOOST_CHECK( glseq0.get_sequence() == s1 );
34 BOOST_AUTO_TEST_CASE( glsequence_copy_constructor )
36 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
37 string s0("AAAAAAGGGGGG");
39 GlSequenceRef glsp0(new GlSequence(s0, cm));
41 BOOST_CHECK_EQUAL(glsp0->get_sequence(), s0);
42 BOOST_CHECK_EQUAL(glsp0->y(), 100.0);
44 GlSequenceRef glsp0ref(glsp0);
45 GlSequenceRef glsp0copy(new GlSequence(glsp0));
46 BOOST_CHECK_EQUAL(glsp0->get_sequence(), s0);
47 BOOST_CHECK_EQUAL(glsp0->y(), 100.0);
48 BOOST_CHECK_EQUAL(glsp0ref->get_sequence(), s0);
49 BOOST_CHECK_EQUAL(glsp0ref->y(), 100.0);
50 BOOST_CHECK_EQUAL(glsp0copy->get_sequence(), s0);
51 BOOST_CHECK_EQUAL(glsp0copy->y(), 100.0);
54 BOOST_CHECK_EQUAL(glsp0->y(), 50.0);
55 BOOST_CHECK_EQUAL(glsp0ref->y(), 50.0);
56 BOOST_CHECK_EQUAL(glsp0copy->y(), 100.0);
58 glsp0copy->setY(75.0);
59 BOOST_CHECK_EQUAL(glsp0->y(), 50.0);
60 BOOST_CHECK_EQUAL(glsp0ref->y(), 50.0);
61 BOOST_CHECK_EQUAL(glsp0copy->y(), 75.0);
64 BOOST_AUTO_TEST_CASE( glsequence_color )
66 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
67 boost::shared_ptr<Color> black(new Color(0.0, 0.0, 0.0, 1.0));
68 boost::shared_ptr<Color> c(new Color(0.1, 0.2, 0.3, 0.4));
69 Sequence seq("AAGGCCTT");
70 GlSequence s(seq, cm);
72 BOOST_CHECK_EQUAL(*s.color(), *black );
74 BOOST_CHECK_EQUAL( *(s.color()), *c );
77 BOOST_AUTO_TEST_CASE( glsequence_renderable )
79 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
80 Sequence seq("AAGGCCTT");
81 GlSequence s(seq, cm);
83 // way more base pairs than viewport pixel width
84 BOOST_CHECK_EQUAL(s.is_sequence_renderable( 0, 1000, 500), false );
85 // way fewer basepairs than viewport pixel width
86 BOOST_CHECK_EQUAL(s.is_sequence_renderable( 0, 10, 500), true);
88 BOOST_CHECK_CLOSE((double)s.pixelWidth(0, 100, 100), 1.0, 1e-6);
89 BOOST_CHECK_CLOSE((double)s.pixelWidth(0, 1000, 100), 10.0, 1e-6);
92 BOOST_AUTO_TEST_CASE( glsequence_sequence )
94 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
95 string seq_string("AAGGCCTTNNAAGGCCTTNNAAGGCCTTNN");
96 string::size_type seqlen = seq_string.size();
97 Sequence seq(seq_string);
98 GlSequence glseq(seq, cm);
100 BOOST_CHECK( glseq.region_begin(0, 50) == seq.begin() );
101 // always make sure we return seq.end() regardless of how much extra
103 BOOST_CHECK( glseq.region_end(0, seqlen+10) == seq.end() );
104 // do we get the right end pointer?
105 BOOST_CHECK( glseq.region_end(0, 5) == seq.begin()+5 );
107 // when we request far too much sequence what do we get?
108 BOOST_CHECK( glseq.region_begin(seqlen+10, seqlen+20) == seq.end() );
109 BOOST_CHECK( glseq.region_end(seqlen+10, seqlen+20) == seq.end() );
111 // we cant ask for reversed sequences with region_begin/end
112 BOOST_CHECK( glseq.region_begin(10, 5) == seq.end() );
113 BOOST_CHECK( glseq.region_end(10, 5) == seq.end() );
115 Sequence::const_iterator seq_itor;
117 // if we as for an empty segment? start and end should equal
118 seq_itor = glseq.region_begin(10, 10);
119 BOOST_CHECK( seq_itor == glseq.region_end(10, 10) );
121 // reuse seq_itor downhere
122 string::const_iterator str_itor;
123 for(str_itor = seq.begin(),
124 seq_itor = glseq.begin();
125 str_itor != seq.end() and
126 seq_itor != glseq.end();
127 ++str_itor, ++seq_itor)
129 BOOST_CHECK_EQUAL( *str_itor, *seq_itor );
133 // make sure the computation of the leftmost and rightmost base is correct
134 BOOST_AUTO_TEST_CASE( glsequence_leftright_base )
136 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
137 std::string seq_string = "AAGGCCTT";
138 Sequence seq(seq_string);
139 GlSequence glseq(seq, cm);
141 BOOST_CHECK_EQUAL( glseq.leftbase( -50.0 ), 0 );
142 BOOST_CHECK_EQUAL( glseq.leftbase( 0.5 ), 1 );
143 BOOST_CHECK_EQUAL( glseq.leftbase( 5.0 ), 5 );
144 BOOST_CHECK_EQUAL( glseq.leftbase( 500.0 ), seq_string.size() );
145 BOOST_CHECK_EQUAL( glseq.rightbase( 0.0 ), 0 );
146 BOOST_CHECK_EQUAL( glseq.rightbase( 1000.0 ), seq_string.size() );
147 BOOST_CHECK_EQUAL( glseq.rightbase( seq_string.size()-0.5),
148 seq_string.size()-1);
151 // do our left and right most base computations still work if
152 // we move the sequence around?
153 BOOST_AUTO_TEST_CASE( glsequence_movex )
155 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
156 std::string seq_string = "AAGGCCTTAAGGCCTT";
157 Sequence seq(seq_string);
158 GlSequence glseq(seq, cm);
161 BOOST_CHECK_EQUAL( glseq.leftbase(-100.0), 0 );
162 BOOST_CHECK_EQUAL( glseq.leftbase( 0.0), 5 );
163 BOOST_CHECK_EQUAL( glseq.leftbase( -2.0), 3 );
164 BOOST_CHECK_EQUAL( glseq.leftbase( 100.0), seq_string.size() );
165 BOOST_CHECK_EQUAL( glseq.rightbase( 1000.0 ), seq_string.size() );
166 BOOST_CHECK_EQUAL( glseq.rightbase( 8.0 ), 8+5 );
167 BOOST_CHECK_EQUAL( glseq.rightbase( -7.0 ), 0 );
171 BOOST_AUTO_TEST_CASE( glsequence_check_iterators )
173 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
174 std::string seq_string = "AAGGCCTTAAGGCCTT";
175 Sequence seq(seq_string);
176 GlSequence glseq(seq, cm);
178 Sequence::const_iterator seq_begin_i;
179 Sequence::const_iterator seq_end_i;
181 BOOST_CHECK(glseq.region_begin(5, -5) == seq.end());
182 BOOST_CHECK(glseq.region_begin(0, 20) == seq.begin());
183 BOOST_CHECK(glseq.region_begin(10,20) == seq.begin()+10);
185 BOOST_CHECK(glseq.region_end(5, -5) == seq.end());
186 BOOST_CHECK(glseq.region_end(0, 20) == seq.end());
187 BOOST_CHECK(glseq.region_end(0, 10) == seq.begin()+10);
190 BOOST_CHECK(glseq.region_begin(0, 10) == seq.begin()+5);
191 BOOST_CHECK(glseq.region_end(0, 15) == seq.end());
194 BOOST_AUTO_TEST_CASE( glsequence_subseq )
196 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
197 boost::shared_ptr<Color> c(new Color(1.0, 0.5, 0.5));
199 GlSequence seq("AAGGCCTT", cm);
202 GlSequence subseq = seq.subseq(4,2);
203 BOOST_CHECK_EQUAL(subseq.get_sequence(), "CC");
204 BOOST_CHECK_EQUAL(subseq.color(), c);
208 BOOST_AUTO_TEST_CASE ( shared_ptr_test )
210 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
211 // I don't trust my operator= hack so lets make sure it works.
212 string s0("AAGGCCTT");
213 string s1("TTGGCCAA");
215 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
217 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
219 // make a block to test deallocation
221 GlSequence glseq0(seq0, cm);
222 BOOST_CHECK_EQUAL(seq0.use_count(), 2);
223 GlSequence glseq1(seq1, cm);
224 BOOST_CHECK_EQUAL(seq1.use_count(), 2);
227 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
228 BOOST_CHECK_EQUAL( seq1.use_count(), 3 );
230 BOOST_CHECK_EQUAL(seq0.use_count(), 1);
231 BOOST_CHECK_EQUAL(seq1.use_count(), 1);