1 #include <boost/test/auto_unit_test.hpp>
2 #include <boost/test/floating_point_comparison.hpp>
3 #include <boost/shared_ptr.hpp>
7 #include "alg/annotation_colors.hpp"
8 #include "alg/glsequence.hpp"
9 #include "alg/sequence.hpp"
13 BOOST_AUTO_TEST_CASE ( glsequence_operator_assignment )
15 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
16 // I don't trust my operator= hack so lets make sure it works.
17 string s0("AAGGCCTT");
18 string s1("TTGGCCAA");
19 boost::shared_ptr<Sequence> seq0(new Sequence(s0));
20 boost::shared_ptr<Sequence> seq1(new Sequence(s1));
22 GlSequence glseq0(seq0, cm);
23 BOOST_CHECK (glseq0.sequence() == s0);
24 GlSequence glseq1(seq1, cm);
25 GlSequence glseq_copy0(glseq0);
27 BOOST_CHECK(glseq_copy0.sequence() == glseq0.sequence());
28 BOOST_CHECK( &(glseq_copy0.sequence()) == &(glseq0.sequence()));
31 BOOST_CHECK( glseq0.sequence() == s1 );
34 BOOST_AUTO_TEST_CASE( glsequence_color )
36 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
37 Color black(0.0, 0.0, 0.0, 0.0);
38 Color c(0.1, 0.2, 0.3, 0.4);
39 boost::shared_ptr<Sequence> seq(new Sequence("AAGGCCTT"));
40 GlSequence s(seq, cm);
42 BOOST_CHECK_EQUAL(s.color(), black );
44 BOOST_CHECK_EQUAL( s.color(), c );
47 BOOST_AUTO_TEST_CASE( glsequence_renderable )
49 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
50 boost::shared_ptr<Sequence> seq(new Sequence("AAGGCCTT"));
51 GlSequence s(seq, cm);
53 // way more base pairs than viewport pixel width
54 BOOST_CHECK_EQUAL(s.is_sequence_renderable( 0, 1000, 500), false );
55 // way fewer basepairs than viewport pixel width
56 BOOST_CHECK_EQUAL(s.is_sequence_renderable( 0, 10, 500), true);
58 BOOST_CHECK_CLOSE((double)s.get_pixel_width(0, 100, 100), 1.0, 1e-6);
59 BOOST_CHECK_CLOSE((double)s.get_pixel_width(0, 1000, 100), 10.0, 1e-6);
62 BOOST_AUTO_TEST_CASE( glsequence_sequence )
64 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
65 string seq_string("AAGGCCTTNNAAGGCCTTNNAAGGCCTTNN");
66 string::size_type seqlen = seq_string.size();
67 boost::shared_ptr<Sequence> seq(new Sequence(seq_string));
68 GlSequence glseq(seq, cm);
70 BOOST_CHECK( glseq.sequence_begin(0, 50) == seq->begin() );
71 // always make sure we return seq->end() regardless of how much extra
73 BOOST_CHECK( glseq.sequence_end(0, seqlen+10) == seq->end() );
74 // do we get the right end pointer?
75 BOOST_CHECK( glseq.sequence_end(0, 5) == seq->begin()+5 );
77 // when we request far too much sequence what do we get?
78 BOOST_CHECK( glseq.sequence_begin(seqlen+10, seqlen+20) == seq->end() );
79 BOOST_CHECK( glseq.sequence_end(seqlen+10, seqlen+20) == seq->end() );
81 // we cant ask for reversed sequences with sequence_begin/end
82 BOOST_CHECK( glseq.sequence_begin(10, 5) == seq->end() );
83 BOOST_CHECK( glseq.sequence_end(10, 5) == seq->end() );
85 Sequence::const_iterator seq_itor;
87 // if we as for an empty segment? start and end should equal
88 seq_itor = glseq.sequence_begin(10, 10);
89 BOOST_CHECK( seq_itor == glseq.sequence_end(10, 10) );
91 // reuse seq_itor downhere
92 string::const_iterator str_itor;
93 for(str_itor = seq->begin(),
94 seq_itor = glseq.sequence_begin();
95 str_itor != seq->end() and
96 seq_itor != glseq.sequence_end();
97 ++str_itor, ++seq_itor)
99 BOOST_CHECK_EQUAL( *str_itor, *seq_itor );
103 // make sure the computation of the leftmost and rightmost base is correct
104 BOOST_AUTO_TEST_CASE( glsequence_leftright_base )
106 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
107 std::string seq_string = "AAGGCCTT";
108 boost::shared_ptr<Sequence> seq(new Sequence(seq_string));
109 GlSequence glseq(seq, cm);
111 BOOST_CHECK_EQUAL( glseq.leftbase( -50.0 ), 0 );
112 BOOST_CHECK_EQUAL( glseq.leftbase( 0.5 ), 1 );
113 BOOST_CHECK_EQUAL( glseq.leftbase( 5.0 ), 5 );
114 BOOST_CHECK_EQUAL( glseq.leftbase( 500.0 ), seq_string.size() );
115 BOOST_CHECK_EQUAL( glseq.rightbase( 0.0 ), 0 );
116 BOOST_CHECK_EQUAL( glseq.rightbase( 1000.0 ), seq_string.size() );
117 BOOST_CHECK_EQUAL( glseq.rightbase( seq_string.size()-0.5),
118 seq_string.size()-1);
121 // do our left and right most base computations still work if
122 // we move the sequence around?
123 BOOST_AUTO_TEST_CASE( glsequence_movex )
125 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
126 std::string seq_string = "AAGGCCTTAAGGCCTT";
127 boost::shared_ptr<Sequence> seq(new Sequence(seq_string));
128 GlSequence glseq(seq, cm);
131 BOOST_CHECK_EQUAL( glseq.leftbase(-100.0), 0 );
132 BOOST_CHECK_EQUAL( glseq.leftbase( 0.0), 5 );
133 BOOST_CHECK_EQUAL( glseq.leftbase( -2.0), 3 );
134 BOOST_CHECK_EQUAL( glseq.leftbase( 100.0), seq_string.size() );
135 BOOST_CHECK_EQUAL( glseq.rightbase( 1000.0 ), seq_string.size() );
136 BOOST_CHECK_EQUAL( glseq.rightbase( 8.0 ), 8+5 );
137 BOOST_CHECK_EQUAL( glseq.rightbase( -7.0 ), 0 );
141 BOOST_AUTO_TEST_CASE( glsequence_check_iterators )
143 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
144 std::string seq_string = "AAGGCCTTAAGGCCTT";
145 boost::shared_ptr<Sequence> seq(new Sequence(seq_string));
146 GlSequence glseq(seq, cm);
148 Sequence::const_iterator seq_begin_i;
149 Sequence::const_iterator seq_end_i;
151 BOOST_CHECK(glseq.sequence_begin(5, -5) == seq->end());
152 BOOST_CHECK(glseq.sequence_begin(0, 20) == seq->begin());
153 BOOST_CHECK(glseq.sequence_begin(10,20) == seq->begin()+10);
155 BOOST_CHECK(glseq.sequence_end(5, -5) == seq->end());
156 BOOST_CHECK(glseq.sequence_end(0, 20) == seq->end());
157 BOOST_CHECK(glseq.sequence_end(0, 10) == seq->begin()+10);
160 BOOST_CHECK(glseq.sequence_begin(0, 10) == seq->begin()+5);
161 BOOST_CHECK(glseq.sequence_end(0, 15) == seq->end());
164 BOOST_AUTO_TEST_CASE ( shared_ptr_test )
166 boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
167 // I don't trust my operator= hack so lets make sure it works.
168 string s0("AAGGCCTT");
169 string s1("TTGGCCAA");
170 boost::shared_ptr<Sequence> seq0(new Sequence(s0));
171 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
172 boost::shared_ptr<Sequence> seq1(new Sequence(s1));
173 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
175 // make a block to test deallocation
177 GlSequence glseq0(seq0, cm);
178 BOOST_CHECK_EQUAL(seq0.use_count(), 2);
179 GlSequence glseq1(seq1, cm);
180 BOOST_CHECK_EQUAL(seq1.use_count(), 2);
183 BOOST_CHECK_EQUAL( seq0.use_count(), 1 );
184 BOOST_CHECK_EQUAL( seq1.use_count(), 3 );
186 BOOST_CHECK_EQUAL(seq0.use_count(), 1);
187 BOOST_CHECK_EQUAL(seq1.use_count(), 1);