Mark real sequence instead of Ns
[mussa.git] / qui / seqbrowser / test / TestSequenceBrowserWidget.hpp
1 #ifndef TESTSEQUENCEBROWSERWIDGET_HPP_
2 #define TESTSEQUENCEBROWSERWIDGET_HPP_
3 #include <QtGui>
4 #include <QVariant>
5 #include <QtTest/QtTest>
6 #include <QtTest/QSignalSpy>
7
8 #include <vector>
9
10 #include <boost/shared_ptr.hpp>
11
12 #include "alg/sequence.hpp"
13 #include "qui/seqbrowser/SequenceBrowserWidget.hpp"
14
15 class TestSequenceBrowserWidget : public QObject
16 {
17   Q_OBJECT
18
19 private slots:
20
21   void testSimpleConstructor() {
22     boost::shared_ptr<QDir> d(new QDir("."));
23     SequenceBrowserWidget *browser = new SequenceBrowserWidget(d);
24   }
25
26   // do we have the right colors?
27   void testChangeMotifColor() {
28     boost::shared_ptr<QDir> d(new QDir("."));
29
30     std::vector<Sequence> motifs;
31     motifs.push_back("AAGG");
32     std::vector<Color> colors1;
33     colors1.push_back(Color(0.0, 0.0, 1.0));
34         
35     MussaRef m(new Mussa);
36     m->append_sequence("AAAAGGGGTTTT");
37     m->set_motifs(motifs, colors1);
38     QVERIFY(m->sequences().size() == 1);
39     QVERIFY(m->sequences()[0]->motifs().size() == 1);
40     QVERIFY(m->sequences()[0]->motifs().front().sequence == "AAGG");
41     QVERIFY(m->colorMapper()->lookup("motif", "AAGG") == colors1[0]);
42
43     SequenceBrowserWidget *browser = new SequenceBrowserWidget(d);
44     browser->setSequences(m->sequences(), m->colorMapper());
45     std::vector<GlSequenceRef> glseqs1(browser->sequences());
46     QVERIFY(glseqs1.size() == 1);
47     QVERIFY(glseqs1[0]->colorMapper() == m->colorMapper());
48     QVERIFY(glseqs1[0]->colorMapper()->lookup("motif", "AAGG") == colors1[0]);
49     
50     std::vector<Color> colors2;
51     colors2.push_back(Color(1.0, 0.0, 0.0));
52     m->set_motifs(motifs, colors2);
53     QVERIFY(m->sequences().size() == 1);
54     QVERIFY(m->sequences()[0]->motifs().size() == 1);
55     QVERIFY(m->sequences()[0]->motifs().front().sequence == "AAGG");
56     QVERIFY(m->colorMapper()->lookup("motif", "AAGG") == colors2[0]);
57     
58     std::vector<GlSequenceRef> glseqs2(browser->sequences());
59     QVERIFY(glseqs2.size() == 1);
60     QVERIFY(glseqs2[0]->colorMapper() == m->colorMapper());
61     QVERIFY(glseqs2[0]->colorMapper()->lookup("motif", "AAGG") == colors2[0]);
62   }
63   
64   // do we have the right colors?
65   void testChangeMotifSequencer() {
66     boost::shared_ptr<QDir> d(new QDir("."));
67
68     std::string aagg("AAGG");
69     std::vector<Sequence> motifs1;
70     motifs1.push_back(aagg);
71     std::vector<Color> colors1;
72     colors1.push_back(Color(0.0, 0.0, 1.0));
73         
74     MussaRef m(new Mussa);
75     m->append_sequence("AAAAGGGG");
76     m->append_sequence("AAAACCCC");
77     m->set_motifs(motifs1, colors1);
78     QVERIFY(m->sequences().size() == 2);
79     QVERIFY(m->sequences()[0]->motifs().size() == 1);
80     QVERIFY(m->sequences()[0]->motifs().front().sequence == aagg);
81     QVERIFY(m->sequences()[1]->motifs().size() == 0);
82     QVERIFY(m->colorMapper()->lookup("motif", aagg) == colors1[0]);
83
84     SequenceBrowserWidget *browser = new SequenceBrowserWidget(d);
85     browser->setSequences(m->sequences(), m->colorMapper());
86     // does the sequence browser have the right motif pattern?
87     std::vector<GlSequenceRef> glseqs1(browser->sequences());
88     QVERIFY(glseqs1.size() == 2);
89     QVERIFY(glseqs1[0]->motifs().size() == 1);
90     QVERIFY(glseqs1[0]->motifs().front().sequence == aagg);
91     QVERIFY(glseqs1[1]->motifs().size() == 0);
92     QVERIFY(glseqs1[0]->colorMapper() == m->colorMapper());
93     QVERIFY(glseqs1[0]->colorMapper()->lookup("motif", aagg) == colors1[0]);
94     
95     std::vector<Sequence> motifs2;
96     std::string aacc("AACC");
97     motifs2.push_back(aacc);
98     m->set_motifs(motifs2, colors1);
99     // did the copy of our sequences in the mussa analysis object get updated?
100     QVERIFY(m->sequences().size() == 2);
101     QVERIFY(m->sequences()[0]->motifs().size() == 0);
102     QVERIFY(m->sequences()[1]->motifs().size() == 1);
103     QVERIFY(m->sequences()[1]->motifs().front().sequence == aacc);
104     QVERIFY(m->colorMapper()->lookup("motif", aacc) == colors1[0]);
105     
106     // did the copy of our sequences in the browser get updated?
107     std::vector<GlSequenceRef> glseqs2(browser->sequences());
108     QVERIFY(glseqs2.size() == 2);
109     QVERIFY(glseqs2[0]->motifs().size() == 0);
110     QVERIFY(glseqs2[1]->motifs().size() == 1);
111     QVERIFY(glseqs2[1]->motifs().front().sequence == aacc);
112     QVERIFY(glseqs2[0]->colorMapper() == m->colorMapper());
113     QVERIFY(glseqs2[0]->colorMapper()->lookup("motif", aacc) == colors1[0]);
114   }  
115   
116   void testAnnotationsInTwoBrowsers()
117   {
118     // Make sure that our annotations parent is pointing to the 
119     // most right seqspan parent
120     boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
121     std::vector<SequenceRef> seqs;
122     SequenceRef seq0(new Sequence("AAAAGGGG"));
123     seq0->add_annotation("A","A", 0, 4);
124     seqs.push_back(seq0);
125     SequenceRef seq1(new Sequence("GGGGTTTT"));
126     seqs.push_back(seq1);
127
128     QVERIFY(seq0->annotations().size() == 1);
129     QVERIFY(seq0->seqspan() == seq0->annotations().front()->parent() );
130     
131     boost::shared_ptr<QDir> d(new QDir("."));
132     SequenceBrowserWidget *b1 = new SequenceBrowserWidget(d);
133     b1->setSequences(seqs, cm );
134     QVERIFY( b1->sequences().size() == 2);
135     // annotations().size() now always has the base 
136     // where is the sequence annotation
137     QVERIFY( b1->sequences()[0]->annotations().size() == 2 );
138     QVERIFY( b1->sequences()[0]->seqspan() == 
139              b1->sequences()[0]->annotations().front()->parent() );
140
141     SequenceBrowserWidget *b2 = new SequenceBrowserWidget(d);
142     b2->setSequences(seqs, cm);
143     
144     QVERIFY( b2->sequences()[0]->annotations().size() == 2 );
145     QVERIFY( b2->sequences()[0]->seqspan() == 
146              b2->sequences()[0]->annotations().front()->parent() );
147   }
148 };
149 #endif /*TESTSEQUENCEBROWSERWIDGET_HPP_*/