genomer-plugin-view 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+ require 'genomer-plugin-view/agp'
3
+
4
+ describe GenomerPluginView::Agp do
5
+
6
+ def contig(sequence)
7
+ s = mock!
8
+ stub(s).entry_type{ :sequence }
9
+ stub(s).sequence{ sequence }
10
+ s
11
+ end
12
+
13
+ def unresolved(length)
14
+ s = mock!
15
+ stub(s).entry_type{ :unresolved }
16
+ stub(s).sequence{ 'N' * length }
17
+ s
18
+ end
19
+
20
+ subject do
21
+ described_class.new(['agp'],{})
22
+ end
23
+
24
+ before do
25
+ mock(subject).scaffold do
26
+ contigs
27
+ end
28
+ end
29
+
30
+ context "where the scaffold contains a single contig" do
31
+
32
+ let (:contigs) do
33
+ [contig('AATGC')]
34
+ end
35
+
36
+ it "should return agp output" do
37
+ subject.run.should == <<-EOS.unindent
38
+ ##agp-version 2.0
39
+ scaffold 1 5 1 W contig00001 1 5 +
40
+ EOS
41
+ end
42
+
43
+ end
44
+
45
+ context "where the scaffold contains a contig with a gap" do
46
+
47
+ let (:contigs) do
48
+ [contig('AAANNNGGG')]
49
+ end
50
+
51
+ it "should return agp output" do
52
+ subject.run.should == <<-EOS.unindent
53
+ ##agp-version 2.0
54
+ scaffold 1 3 1 W contig00001 1 3 +
55
+ scaffold 4 6 2 N 3 scaffold yes internal
56
+ scaffold 7 9 3 W contig00002 1 3 +
57
+ EOS
58
+ end
59
+
60
+ end
61
+
62
+ context "where the scaffold contains an unresolved region" do
63
+
64
+ let (:contigs) do
65
+ [ contig('AAA'), unresolved(3), contig('TTT') ]
66
+ end
67
+
68
+ it "should return agp output" do
69
+ subject.run.should == <<-EOS.unindent
70
+ ##agp-version 2.0
71
+ scaffold 1 3 1 W contig00001 1 3 +
72
+ scaffold 4 6 2 N 3 scaffold yes specified
73
+ scaffold 7 9 3 W contig00002 1 3 +
74
+ EOS
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+ require 'genomer-plugin-view/fasta'
3
+
4
+ describe GenomerPluginView::Fasta do
5
+
6
+ before do
7
+ mock(subject).scaffold do
8
+ annotations
9
+ end
10
+ end
11
+
12
+ let (:annotations) do
13
+ [Sequence.new(:sequence => 'AAATGA')]
14
+ end
15
+
16
+ subject do
17
+ described_class.new(['fasta'],flags)
18
+ end
19
+
20
+ describe "with no options" do
21
+
22
+ let(:flags){ {} }
23
+
24
+ it "should return fasta output" do
25
+ subject.run.should == ">.\nAAATGA\n"
26
+ end
27
+
28
+ end
29
+
30
+ describe "run with the --identifier option" do
31
+
32
+ let(:flags){ {:identifier => 'name'} }
33
+
34
+ it "should return fasta output with the identifier" do
35
+ subject.run.should == ">name\nAAATGA\n"
36
+ end
37
+
38
+ end
39
+
40
+ describe "run with the --organism option" do
41
+
42
+ let(:flags){ {:organism => 'name'} }
43
+
44
+ it "should return fasta output with the organism modifier" do
45
+ subject.run.should == ">. [organism=name]\nAAATGA\n"
46
+ end
47
+
48
+ end
49
+
50
+ describe "run with the --strain option" do
51
+
52
+ let(:flags){ {:strain => 'name'} }
53
+
54
+ it "should return fasta output with the strain modifier" do
55
+ subject.run.should == ">. [strain=name]\nAAATGA\n"
56
+ end
57
+
58
+ end
59
+
60
+ describe "run with the identifier and a modifier option" do
61
+
62
+ let(:flags){ {:strain => 'isolate', :identifier => 'name'} }
63
+
64
+ it "should return fasta output with the strain modifier" do
65
+ subject.run.should == ">name [strain=isolate]\nAAATGA\n"
66
+ end
67
+
68
+ end
69
+
70
+ describe "run with the --contigs option" do
71
+
72
+ let(:flags){ {:contigs => true} }
73
+
74
+ context "with an ungapped contig scaffold" do
75
+
76
+ it "should return fasta output of the contig" do
77
+ subject.run.should == ">contig00001\nAAATGA\n"
78
+ end
79
+
80
+ end
81
+
82
+ context "with a gapped contig scaffold" do
83
+
84
+ let(:annotations) do
85
+ [Sequence.new(:sequence => 'AAANNNNTTT')]
86
+ end
87
+
88
+ it "should return fasta output of the contig" do
89
+ subject.run.should == ">contig00001\nAAA\n>contig00002\nTTT\n"
90
+ end
91
+
92
+ end
93
+
94
+ end
95
+
96
+ end
@@ -0,0 +1,244 @@
1
+ require 'spec_helper'
2
+ require 'genomer-plugin-view/gff_record_helper'
3
+
4
+ describe GenomerPluginView::GffRecordHelper do
5
+
6
+ describe "module" do
7
+ it "should be included in Bio::GFF::GFF3::Record" do
8
+ Bio::GFF::GFF3::Record.ancestors.should include(described_class)
9
+ end
10
+ end
11
+
12
+ describe "#negative_strand?" do
13
+
14
+ subject do
15
+ Annotation.new
16
+ end
17
+
18
+ it "should return false for a positive strand annotation" do
19
+ subject.strand('+').to_gff3_record.
20
+ negative_strand?.should be_false
21
+ end
22
+
23
+ it "should return true for a negative strand annotation" do
24
+ subject.strand('-').to_gff3_record.
25
+ negative_strand?.should be_true
26
+ end
27
+
28
+ end
29
+
30
+ describe "#to_genbank_table_entry" do
31
+
32
+ before(:each) do
33
+ @attn = Annotation.new(:start => 1, :end => 3, :strand => '+',:feature => 'gene')
34
+ end
35
+
36
+ subject do
37
+ annotation.to_gff3_record.to_genbank_table_entry
38
+ end
39
+
40
+ context "gene feature on the positive strand" do
41
+
42
+ let(:annotation) do
43
+ @attn
44
+ end
45
+
46
+ it "should return a table entry" do
47
+ subject.should == <<-EOS.unindent
48
+ 1\t3\tgene
49
+ EOS
50
+ end
51
+
52
+ end
53
+
54
+ context "gene feature on the negative strand" do
55
+
56
+ let(:annotation) do
57
+ @attn.strand('-')
58
+ end
59
+
60
+ it "should return a table entry" do
61
+ subject.should == <<-EOS.unindent
62
+ 3\t1\tgene
63
+ EOS
64
+ end
65
+
66
+ end
67
+
68
+ context "gene feature with attributes" do
69
+
70
+ let(:annotation) do
71
+ @attn.feature('gene').attributes('ID' => 'id')
72
+ end
73
+
74
+ it "should return a table entry" do
75
+ subject.should == <<-EOS.unindent
76
+ 1\t3\tgene
77
+ \t\t\tlocus_tag\tid
78
+ EOS
79
+ end
80
+
81
+ end
82
+
83
+ context "CDS feature on the positive strand" do
84
+
85
+ let(:annotation) do
86
+ @attn.feature('CDS')
87
+ end
88
+
89
+ it "should return a CDS table entry" do
90
+ subject.should == <<-EOS.unindent
91
+ 1\t3\tCDS
92
+ EOS
93
+ end
94
+
95
+ end
96
+
97
+ context "tRNA feature on the positive strand" do
98
+
99
+ let(:annotation) do
100
+ @attn.feature('tRNA')
101
+ end
102
+
103
+ it "should return a CDS table entry" do
104
+ subject.should == <<-EOS.unindent
105
+ 1\t3\ttRNA
106
+ EOS
107
+ end
108
+
109
+ end
110
+
111
+ context "tmRNA feature on the positive strand" do
112
+
113
+ let(:annotation) do
114
+ @attn.feature('tmRNA')
115
+ end
116
+
117
+ it "should return a CDS table entry" do
118
+ subject.should == <<-EOS.unindent
119
+ 1\t3\ttmRNA
120
+ EOS
121
+ end
122
+
123
+ end
124
+
125
+ context "rRNA feature on the positive strand" do
126
+
127
+ let(:annotation) do
128
+ @attn.feature('rRNA')
129
+ end
130
+
131
+ it "should return a CDS table entry" do
132
+ subject.should == <<-EOS.unindent
133
+ 1\t3\trRNA
134
+ EOS
135
+ end
136
+
137
+ end
138
+
139
+ context "miscRNA feature on the positive strand" do
140
+
141
+ let(:annotation) do
142
+ @attn.feature('miscRNA')
143
+ end
144
+
145
+ it "should return a CDS table entry" do
146
+ subject.should == <<-EOS.unindent
147
+ 1\t3\tmiscRNA
148
+ EOS
149
+ end
150
+
151
+ end
152
+
153
+ end
154
+
155
+ describe "#table_attributes" do
156
+
157
+ before(:each) do
158
+ @attn = Annotation.new(:start => 1, :end => 3, :strand => '+', :feature => 'gene')
159
+ end
160
+
161
+ subject do
162
+ annotation.to_gff3_record.table_attributes
163
+ end
164
+
165
+ context "for an unknown feature type" do
166
+
167
+ let(:annotation) do
168
+ @attn.feature('unknown')
169
+ end
170
+
171
+ it "should raise an error" do
172
+ lambda{ subject.call }.should raise_error(Genomer::Error,"Unknown feature type 'unknown'")
173
+ end
174
+
175
+ end
176
+
177
+ context "for a feature with no attributes" do
178
+
179
+ let(:annotation) do
180
+ @attn
181
+ end
182
+
183
+ it "should return an empty array" do
184
+ subject.should be_empty
185
+ end
186
+
187
+ end
188
+
189
+ context "for a feature with an unknown attribute" do
190
+
191
+ let(:annotation) do
192
+ @attn.attributes('something' => 'else')
193
+ end
194
+
195
+ it "should return an empty array" do
196
+ subject.should be_empty
197
+ end
198
+
199
+ end
200
+
201
+ feature_keys = {
202
+ :gene => {
203
+ 'Name' => 'gene',
204
+ 'ID' => 'locus_tag' },
205
+ :tRNA => {
206
+ 'product' => 'product',
207
+ 'Note' => 'note'},
208
+ :rRNA => {
209
+ 'product' => 'product',
210
+ 'Note' => 'note'},
211
+ :miscRNA => {
212
+ 'product' => 'product',
213
+ 'Note' => 'note'},
214
+ :tmRNA => {
215
+ 'product' => 'product',
216
+ 'Note' => 'note'},
217
+ :CDS => {
218
+ 'ec_number' => 'EC_number',
219
+ 'function' => 'function',
220
+ 'product' => 'product',
221
+ 'Note' => 'note',
222
+ 'ID' => 'protein_id' }}
223
+
224
+ feature_keys.each do |type,mappings|
225
+ mappings.each do |a,b|
226
+ context "#{type.to_s} feature" do
227
+
228
+ let(:annotation) do
229
+ @attn.feature(type.to_s).attributes(a => :value)
230
+ end
231
+
232
+ it "should return #{b} for the attribute #{a}" do
233
+ subject.first.should_not be_nil
234
+ subject.first.first.should == b
235
+ end
236
+
237
+ end
238
+ end
239
+ end
240
+
241
+
242
+ end
243
+
244
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+ require 'genomer-plugin-view/mapping'
3
+
4
+ describe GenomerPluginView::Mapping do
5
+
6
+ describe "#run" do
7
+
8
+ let(:annotations) do
9
+ [
10
+ gene(:start => 1, :end => 3, :attributes => {'ID' => 'gene1'}),
11
+ gene(:start => 4, :end => 6, :attributes => {'ID' => 'gene2'}),
12
+ gene(:start => 7, :end => 9, :attributes => {'ID' => 'gene3'}),
13
+ gene(:start => 10, :end => 12, :attributes => {'ID' => 'gene4'})
14
+ ]
15
+ end
16
+
17
+ before(:each) do
18
+ stub(Scaffolder::AnnotationLocator).new do
19
+ annotations
20
+ end
21
+ stub(subject).flags do
22
+ flags
23
+ end
24
+ end
25
+
26
+ subject do
27
+ described_class.new([],{})
28
+ end
29
+
30
+ describe "with no annotations or flags" do
31
+
32
+ let(:flags){ {} }
33
+
34
+ let(:annotations){ [] }
35
+
36
+ it "should return an empty mapping" do
37
+ subject.run.should == ""
38
+ end
39
+
40
+ end
41
+
42
+ describe "with some annotations" do
43
+
44
+ let(:flags){ {} }
45
+
46
+ it "should return a mapping of the same ids" do
47
+ subject.run.should == <<-EOS.unindent.strip
48
+ gene1\tgene1
49
+ gene2\tgene2
50
+ gene3\tgene3
51
+ gene4\tgene4
52
+ EOS
53
+ end
54
+
55
+ end
56
+
57
+ describe "with the prefix flag" do
58
+
59
+ let(:flags){ {:prefix => 'pre_'} }
60
+
61
+ it "should return a mapping to the prefixed ids" do
62
+ subject.run.should == <<-EOS.unindent.strip
63
+ gene1\tpre_gene1
64
+ gene2\tpre_gene2
65
+ gene3\tpre_gene3
66
+ gene4\tpre_gene4
67
+ EOS
68
+ end
69
+
70
+ end
71
+
72
+ describe "with the reset_locus_numbering flag " do
73
+
74
+ let(:flags){ {:reset_locus_numbering => true} }
75
+
76
+ it "should return a mapping to the reset ids" do
77
+ subject.run.should == <<-EOS.unindent.strip
78
+ gene1\t000001
79
+ gene2\t000002
80
+ gene3\t000003
81
+ gene4\t000004
82
+ EOS
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ end