bio-velvet 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,91 @@
1
+ require 'files'
2
+ require 'systemu'
3
+
4
+ module Bio
5
+ module Velvet
6
+ class Runner
7
+ include Bio::Velvet::Logging
8
+
9
+ # Run velveth and then velvetg, with the given kmer size. Returned
10
+ # is a Bio::Velvet::Result class, stored in a temporary directory.
11
+ # The temporary directory is removed upon program exit.
12
+ #
13
+ # The velveth_options and velvetg_options are strings to pass as arguments
14
+ # to velveth and velvetg, respectively.
15
+ #
16
+ # The final options argument is used to specify bio-velvet wrapper options. Currently:
17
+ # :output_assembly_path: a directory where the assembly takes place (by default, a temporary directory)
18
+ def velvet(kmer_length, velveth_options_string, velvetg_options_string='', options={})
19
+ res = velveth kmer_length, velveth_options_string, options
20
+ velvetg res, velvetg_options_string
21
+ end
22
+
23
+ def velveth(kmer_length, velveth_arguments, options={})
24
+ result = Result.new
25
+ outdir = nil
26
+ if options[:output_assembly_path]
27
+ log.debug "Using pre-defined assembly directory: #{options[:output_assembly_path]}"
28
+ outdir = options[:output_assembly_path]
29
+ else
30
+ outdir = Files.create.root
31
+ end
32
+ result.result_directory = outdir
33
+
34
+ # Run velveth
35
+ cmd = "velveth #{result.result_directory} #{kmer_length} #{velveth_arguments}"
36
+ log.info "Running velveth: #{cmd}" if log.info?
37
+ status, stdout, stderr = systemu cmd
38
+ if status.exitstatus != 0
39
+ raise VelvetRunnerException, "Error running velveth: #{stderr}\n#{stdout}"
40
+ end
41
+ result.velveth_stdout = stdout
42
+ result.velveth_stderr = stderr
43
+
44
+ return result
45
+ end
46
+
47
+ # Run velvetg, with a Bio::Velvet::Result object
48
+ # generated with velveth
49
+ def velvetg(velveth_result_object, velvetg_arguments)
50
+ cmd = "velvetg #{velveth_result_object.result_directory} #{velvetg_arguments}"
51
+ log.info "Running velvetg: #{cmd}" if log.info?
52
+ status, stdout, stderr = systemu cmd
53
+ if status.exitstatus != 0
54
+ raise VelvetRunnerException, "Error running velvetg: #{stderr}\n#{stdout}"
55
+ end
56
+ velveth_result_object.velvetg_stdout = stdout
57
+ velveth_result_object.velvetg_stderr = stderr
58
+
59
+ return velveth_result_object
60
+ end
61
+ end
62
+
63
+ class VelvetRunnerException < Exception; end
64
+
65
+ class Result
66
+ attr_accessor :velveth_stdout, :velveth_stderr
67
+ attr_accessor :velvetg_stdout, :velvetg_stderr
68
+ attr_accessor :result_directory
69
+
70
+ # Path to the LastGraph output from velvetg
71
+ def last_graph_path
72
+ File.join result_directory, 'LastGraph'
73
+ end
74
+
75
+ # Path to the contigs.fa output from velvetg
76
+ def contigs_path
77
+ File.join result_directory, 'contigs.fa'
78
+ end
79
+
80
+ # Path to the stats.txt output from velvetg
81
+ def stats_path
82
+ File.join result_directory, 'stats.txt'
83
+ end
84
+
85
+ # Return a Bio::Velvet::Graph object built from the LastGraph file
86
+ def last_graph
87
+ Bio::Velvet::Graph.parse_from_file(last_graph_path)
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,123 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'bio'
3
+
4
+ include Bio::Velvet
5
+
6
+ describe "ArcArray" do
7
+ it 'should push' do
8
+ node1 = Graph::Node.new
9
+ node1.node_id = 1
10
+ node2 = Graph::Node.new
11
+ node2.node_id = 2
12
+ arc = Graph::Arc.new
13
+ arc.begin_node_id = 1
14
+ arc.end_node_id = 2
15
+
16
+ ary = Graph::ArcArray.new
17
+ ary.push arc
18
+ ary.to_a.should == [arc]
19
+
20
+ arc2 = Graph::Arc.new
21
+ arc2.begin_node_id = 1
22
+ arc2.end_node_id = 2
23
+
24
+ ary.push arc2
25
+ ary.to_a.should == [arc,arc2]
26
+ end
27
+
28
+ it 'should get arcs right' do
29
+ node1 = Graph::Node.new
30
+ node1.node_id = 1
31
+ node2 = Graph::Node.new
32
+ node2.node_id = 2
33
+ arc = Graph::Arc.new
34
+ arc.begin_node_id = 1
35
+ arc.end_node_id = 2
36
+
37
+ ary = Graph::ArcArray.new
38
+ ary.push arc
39
+ ary.get_arcs_by_node_id(1,2).should == [arc]
40
+ ary.get_arcs_by_node_id(2,1).should == [arc]
41
+ ary.get_arcs_by_node_id(1).should == [arc]
42
+ ary.get_arcs_by_node_id(2).should == [arc]
43
+ ary.get_arcs_by_node_id(3).should == []
44
+
45
+ arc2 = Graph::Arc.new
46
+ arc2.begin_node_id = 1
47
+ arc2.end_node_id = 2
48
+ ary.push arc2
49
+ ary.get_arcs_by_node_id(1,2).should == [arc, arc2]
50
+ ary.get_arcs_by_node_id(2,1).should == [arc, arc2]
51
+ ary.get_arcs_by_node_id(1).should == [arc, arc2]
52
+ ary.get_arcs_by_node_id(2).should == [arc, arc2]
53
+ ary.get_arcs_by_node_id(3).should == []
54
+
55
+
56
+ ary = Graph::ArcArray.new
57
+ arc = Graph::Arc.new
58
+ arc.begin_node_id = 1
59
+ arc.end_node_id = 1
60
+ ary.push arc
61
+ ary.get_arcs_by_node_id(1).should == [arc]
62
+ ary.get_arcs_by_node_id(1,1).should == [arc]
63
+
64
+ arc2 = Graph::Arc.new
65
+ arc2.begin_node_id = 1
66
+ arc2.end_node_id = 2
67
+ ary.push arc2
68
+ ary.get_arcs_by_node_id(1).should == [arc, arc2]
69
+ ary.get_arcs_by_node_id(2).should == [arc2]
70
+ end
71
+
72
+
73
+ it 'should length' do
74
+ node1 = Graph::Node.new
75
+ node1.node_id = 1
76
+ node2 = Graph::Node.new
77
+ node2.node_id = 2
78
+ arc = Graph::Arc.new
79
+ arc.begin_node_id = 1
80
+ arc.end_node_id = 2
81
+
82
+ ary = Graph::ArcArray.new
83
+ ary.length.should == 0
84
+ ary.push arc
85
+ ary.length.should == 1
86
+
87
+ arc2 = Graph::Arc.new
88
+ arc2.begin_node_id = 1
89
+ arc2.end_node_id = 2
90
+
91
+ ary.push arc2
92
+ ary.length.should == 2
93
+ end
94
+
95
+ it 'should delete' do
96
+ node1 = Graph::Node.new
97
+ node1.node_id = 1
98
+ node2 = Graph::Node.new
99
+ node2.node_id = 2
100
+ arc = Graph::Arc.new
101
+ arc.begin_node_id = 1
102
+ arc.end_node_id = 2
103
+
104
+ ary = Graph::ArcArray.new
105
+ ary.push arc
106
+ ary.to_a.should == [arc]
107
+ ary.delete arc
108
+ ary.to_a.should == []
109
+
110
+ ary.push arc
111
+
112
+ arc2 = Graph::Arc.new
113
+ arc2.begin_node_id = 1
114
+ arc2.end_node_id = 2
115
+ ary.push arc2
116
+ ary.length.should == 2
117
+ ary.delete arc2
118
+ ary.to_a.should == [arc]
119
+ ary.push arc2
120
+ ary.delete arc
121
+ ary.to_a.should == [arc2]
122
+ end
123
+ end
@@ -0,0 +1,290 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'bio'
3
+
4
+ class String
5
+ def revcom
6
+ Bio::Sequence::NA.new(self).reverse_complement.to_s.upcase
7
+ end
8
+ end
9
+
10
+ describe "BioVelvet" do
11
+ it "should be able to parse a graph 1" do
12
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'velvet_test_reads_assembly','Graph')
13
+ graph.should be_kind_of(Bio::Velvet::Graph)
14
+
15
+ graph.number_of_nodes.should eq(967)
16
+ graph.number_of_sequences.should eq(50000)
17
+ graph.hash_length.should eq(31)
18
+
19
+ graph.nodes[1].should be_kind_of(Bio::Velvet::Graph::Node)
20
+ graph.nodes.length.should eq(967)
21
+ graph.nodes[1].node_id.should eq(1)
22
+ graph.nodes[3].length.should == 3
23
+ graph.nodes[3].coverages.should eq([236,205,0,0])
24
+ graph.nodes[3].ends_of_kmers_of_node.should eq('TTG')
25
+ graph.nodes[3].ends_of_kmers_of_twin_node.should eq('ACA')
26
+
27
+ graph.arcs.length.should eq(563)
28
+ arcs = graph.get_arcs_by_node_id(2,712)
29
+ arcs.length.should == 1
30
+ arcs[0].begin_node_id.should eq(2)
31
+ arcs[0].end_node_id.should eq(712)
32
+ arcs[0].begin_node_direction.should eq(true)
33
+ arcs[0].end_node_direction.should eq(false)
34
+ arcs[0].multiplicity.should eq(1)
35
+ end
36
+
37
+ it "should be able to parse a graph that has read tracking" do
38
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'velvet_test_reads_assembly_read_tracking','Graph2')
39
+ graph.should be_kind_of(Bio::Velvet::Graph)
40
+
41
+ graph.number_of_nodes.should eq(967)
42
+ graph.number_of_sequences.should eq(50000)
43
+ graph.hash_length.should eq(31)
44
+
45
+ graph.nodes[1].should be_kind_of(Bio::Velvet::Graph::Node)
46
+ graph.nodes.length.should eq(967)
47
+ graph.nodes[1].node_id.should eq(1)
48
+ graph.nodes[3].length.should == 3
49
+ graph.nodes[3].coverages.should eq([236,205,0,0])
50
+ graph.nodes[3].ends_of_kmers_of_node.should eq('TTG')
51
+ graph.nodes[3].ends_of_kmers_of_twin_node.should eq('ACA')
52
+
53
+
54
+ arcs = graph.get_arcs_by_node_id(2,712)
55
+ arcs.length.should == 1
56
+ arcs[0].begin_node_id.should eq(2)
57
+ arcs[0].end_node_id.should eq(712)
58
+ arcs[0].begin_node_direction.should eq(true)
59
+ arcs[0].end_node_direction.should eq(false)
60
+ arcs[0].multiplicity.should eq(1)
61
+
62
+ # NR -967 1
63
+ # 49982 0 0
64
+ # === later
65
+ # NR 967 1
66
+ # 49981 0 0
67
+ node = graph.nodes[967]
68
+ node.short_reads.nil?.should eq(false)
69
+ node.short_reads.length.should eq(2), node.inspect
70
+ node.short_reads[0].read_id.should eq(49982)
71
+ node.short_reads[0].offset_from_start_of_node.should eq(0)
72
+ node.short_reads[0].start_coord.should eq(0)
73
+ node.short_reads[0].direction.should eq(false)
74
+ node.short_reads[1].read_id.should eq(49981)
75
+ node.short_reads[1].offset_from_start_of_node.should eq(0)
76
+ node.short_reads[1].start_coord.should eq(0)
77
+ node.short_reads[1].direction.should eq(true)
78
+
79
+ # NR -951 2
80
+ #47210 0 0
81
+ #47223 41 0
82
+ # ====later
83
+ # NR 951 2
84
+ # 47209 54 0
85
+ # 47224 0 0
86
+ node = graph.nodes[951]
87
+ node.short_reads.length.should eq(4)
88
+ node.number_of_short_reads.should eq(4)
89
+ node.short_reads[1].offset_from_start_of_node.should eq(41)
90
+
91
+ # grep -A 50000 ^NR velvet_test_reads_assembly_read_tracking/Graph2 |grep -v NR |wc -l
92
+ # 40327
93
+ graph.nodes.collect{|n| n.short_reads.nil? ? 0 : n.short_reads.length}.reduce(:+).should eq(40327)
94
+ end
95
+
96
+ it 'should return sets of arcs by id' do
97
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'velvet_test_reads_assembly','LastGraph')
98
+ # ARC 2 -578 1
99
+ # ARC 2 -473 30
100
+ # ARC -2 650 3
101
+ # ARC -2 959 24
102
+ # ARC 3 4 81
103
+ # ARC -3 -786 61
104
+ # ARC -3 -740 1
105
+ # ARC -3 -568 1
106
+ # ARC -3 754 6
107
+ # ....
108
+ #Bio::Log::CLI.logger('stderr'); Bio::Log::CLI.trace('info'); log = Bio::Log::LoggerPlus.new('bio-velvet'); Bio::Log::CLI.configure('bio-velvet')
109
+
110
+ arcs = graph.get_arcs_by_node_id(2,578)
111
+ arcs.length.should eq(1)
112
+ arcs[0].begin_node_forward?.should eq(true)
113
+ arcs[0].begin_node_id.should == 2
114
+ arcs[0].end_node_id.should == 578
115
+
116
+ arcs = graph.get_arcs_by_node_id(578,2)
117
+ arcs.length.should eq(1)
118
+ arcs[0].begin_node_forward?.should eq(true)
119
+ arcs[0].begin_node_id.should == 2
120
+ arcs[0].end_node_id.should == 578
121
+
122
+ arcs = graph.get_arcs_by_node_id(2,178)
123
+ arcs.length.should == 0
124
+ end
125
+
126
+ it 'should return a set of arcs by node objects' do
127
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'velvet_test_reads_assembly','LastGraph')
128
+ # ARC 2 -578 1
129
+ # ARC 2 -473 30
130
+ # ARC -2 650 3
131
+ # ARC -2 959 24
132
+ # ARC 3 4 81
133
+ # ARC -3 -786 61
134
+ # ARC -3 -740 1
135
+ # ARC -3 -568 1
136
+ # ARC -3 754 6
137
+ # ....
138
+ #Bio::Log::CLI.logger('stderr'); Bio::Log::CLI.trace('info'); log = Bio::Log::LoggerPlus.new('bio-velvet'); Bio::Log::CLI.configure('bio-velvet')
139
+
140
+ node2 = graph.nodes.select{|n| n.node_id == 2}[0]
141
+ node650 = graph.nodes.select{|n| n.node_id == 650}[0]
142
+ node754 = graph.nodes.select{|n| n.node_id == 754}[0]
143
+
144
+ # forward
145
+ arcs = graph.get_arcs_by_node(node2, node650)
146
+ arcs.length.should eq(1)
147
+ arcs[0].begin_node_forward?.should eq(false)
148
+ arcs[0].begin_node_id.should == 2
149
+ arcs[0].end_node_id.should == 650
150
+
151
+ #reverse
152
+ arcs = graph.get_arcs_by_node(node650, node2)
153
+ arcs.length.should eq(1)
154
+ arcs[0].begin_node_forward?.should eq(false)
155
+ arcs[0].begin_node_id.should == 2
156
+ arcs[0].end_node_id.should == 650
157
+
158
+ # no connection
159
+ arcs = graph.get_arcs_by_node(node2, node754)
160
+ arcs.length.should == 0
161
+ end
162
+
163
+ it 'should have a functioning NodeArray class' do
164
+ na = Bio::Velvet::Graph::NodeArray.new
165
+ na.length.should eq(0)
166
+ node = Bio::Velvet::Graph::Node.new
167
+ na[1] = node
168
+ na.length.should eq(1)
169
+ na[1].should eq(node)
170
+ end
171
+
172
+ it "arcs should directions_opposing?" do
173
+ arc = Bio::Velvet::Graph::Arc.new
174
+ arc.begin_node_direction = true
175
+ arc.end_node_direction = true
176
+ arc.directions_opposing?.should eq(false)
177
+
178
+ arc.begin_node_direction = true
179
+ arc.end_node_direction = false
180
+ arc.directions_opposing?.should eq(true)
181
+
182
+ arc.begin_node_direction = false
183
+ arc.end_node_direction = false
184
+ arc.directions_opposing?.should eq(false)
185
+ end
186
+
187
+ it "nodes should correctly respond to #sequence" do
188
+ graph = Bio::Velvet::Graph.new
189
+ graph.hash_length = 31
190
+ node = Bio::Velvet::Graph::Node.new
191
+ node.parent_graph = graph
192
+ node.ends_of_kmers_of_node = 'AATCAAACTATAAAGTTTTAGAAGATAAAGTAACAACTTATACATGGGGATTCGGAGTTAAAAAAGTAGATTCAGAAAATATTTCAATAGATCTTGCAGGCGCAGCTTTTTCTGTTAGGGATAAAAATGGTAATGTAATTGGTAAATATACGTATGATTCTACTGGAAATGTGGTTTTATTAAAAGGAAAGGGTGTAACTGATAAAAATGGACGAGTTATATTTACTGGTTTAAAAGAAGGAGATTACTTTATAAAAGAAGAAAAAGCTCCTAAAGGGTATAGCCTTTTAAAAGAACCAGTAAAAGTTACTATAACAGCTCAAAAAGATGATAATGGAGAGTATACTGGTCAAGCAACTATATCTGTAACTAATGGCAATGAAGCTGGAAGTATAATAAATAATATTACTATGAATGATGGCAATGTATTATTTAATGTACAAATTAAAAACTATGCTGGTATTTCACTTCCAGGTACAGG'
193
+ node.ends_of_kmers_of_twin_node = 'TTTTTAATTTGTACATTAAATAATACATTGCCATCATTCATAGTAATATTATTTATTATACTTCCAGCTTCATTGCCATTAGTTACAGATATAGTTGCTTGACCAGTATACTCTCCATTATCATCTTTTTGAGCTGTTATAGTAACTTTTACTGGTTCTTTTAAAAGGCTATACCCTTTAGGAGCTTTTTCTTCTTTTATAAAGTAATCTCCTTCTTTTAAACCAGTAAATATAACTCGTCCATTTTTATCAGTTACACCCTTTCCTTTTAATAAAACCACATTTCCAGTAGAATCATACGTATATTTACCAATTACATTACCATTTTTATCCCTAACAGAAAAAGCTGCGCCTGCAAGATCTATTGAAATATTTTCTGAATCTACTTTTTTAACTCCGAATCCCCATGTATAAGTTGTTACTTTATCTTCTAAAACTTTATAGTTTGATTCTAAATCGTGATCTTTGGTAGAGATAAGTG'
194
+ node.sequence.should eq('CACTTATCTCTACCAAAGATCACGATTTAGAATCAAACTATAAAGTTTTAGAAGATAAAG
195
+ TAACAACTTATACATGGGGATTCGGAGTTAAAAAAGTAGATTCAGAAAATATTTCAATAG
196
+ ATCTTGCAGGCGCAGCTTTTTCTGTTAGGGATAAAAATGGTAATGTAATTGGTAAATATA
197
+ CGTATGATTCTACTGGAAATGTGGTTTTATTAAAAGGAAAGGGTGTAACTGATAAAAATG
198
+ GACGAGTTATATTTACTGGTTTAAAAGAAGGAGATTACTTTATAAAAGAAGAAAAAGCTC
199
+ CTAAAGGGTATAGCCTTTTAAAAGAACCAGTAAAAGTTACTATAACAGCTCAAAAAGATG
200
+ ATAATGGAGAGTATACTGGTCAAGCAACTATATCTGTAACTAATGGCAATGAAGCTGGAA
201
+ GTATAATAAATAATATTACTATGAATGATGGCAATGTATTATTTAATGTACAAATTAAAA
202
+ ACTATGCTGGTATTTCACTTCCAGGTACAGG'.gsub(/\n/,''))
203
+ end
204
+
205
+ it 'short nodes should respond to sequence properly 1' do
206
+ #Bio::Log::CLI.logger('stderr'); Bio::Log::CLI.trace('debug'); log = Bio::Log::LoggerPlus.new('bio-velvet'); Bio::Log::CLI.configure('bio-velvet')
207
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR,'short_node_LastGraph')
208
+ graph.nodes.length.should == 4
209
+ expect {graph.nodes[2].sequence}.to raise_error(Bio::Velvet::NotImplementedException)
210
+ end
211
+
212
+ it 'should really correctly respond to #sequence on real data' do
213
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'node_sequence','LastGraph')
214
+ graph.should be_kind_of(Bio::Velvet::Graph)
215
+
216
+ contig_seq_hash = {}
217
+ Bio::FlatFile.foreach(File.join(TEST_DATA_DIR, 'node_sequence','contigs.fa')) do |seq|
218
+ node_id = seq.definition.match(/^NODE_(\d+)_/)[1]
219
+ contig_seq_hash[node_id] = seq.seq
220
+ end
221
+ graph.nodes.each do |node|
222
+ seq = node.sequence
223
+ exp = contig_seq_hash[node.node_id.to_s]
224
+ seq.should eq(exp), "Node #{node.node_id}. Found\n#{seq}\nExpected\n#{exp}"
225
+ end
226
+ end
227
+
228
+ it 'should delete nodes correctly path nodes' do
229
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'short_node_LastGraph')
230
+ graph.should be_kind_of(Bio::Velvet::Graph)
231
+
232
+ deleted_nodes, deleted_arcs = graph.delete_nodes_if do |node|
233
+ node.node_id == 3
234
+ end
235
+ deleted_nodes.collect{|n| n.node_id}.sort.should == [3]
236
+ graph.nodes.collect{|n| n.node_id}.sort.should == [1,2,4]
237
+ deleted_arcs.collect{|a| [a.begin_node_id, a.end_node_id]}.sort.should == [[1,3],[3,4]]
238
+ graph.arcs.collect{|a| [a.begin_node_id, a.end_node_id]}.sort.should == [[1,2],[2,4]]
239
+
240
+ graph.nodes[1].node_id.should == 1
241
+ graph.nodes[3].should == nil
242
+ graph.nodes[4].node_id.should == 4
243
+ end
244
+
245
+ it 'should delete nodes correctly cap nodes' do
246
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'short_node_LastGraph')
247
+ graph.should be_kind_of(Bio::Velvet::Graph)
248
+
249
+ deleted_nodes, deleted_arcs = graph.delete_nodes_if do |node|
250
+ node.node_id == 4
251
+ end
252
+ deleted_nodes.collect{|n| n.node_id}.sort.should == [4]
253
+ graph.nodes.collect{|n| n.node_id}.sort.should == [1,2,3]
254
+ deleted_arcs.collect{|a| [a.begin_node_id, a.end_node_id]}.sort.should == [[2,4],[3,4]]
255
+ graph.arcs.collect{|a| [a.begin_node_id, a.end_node_id]}.sort.should == [[1,2],[1,3]]
256
+
257
+ graph.nodes[4].should == nil
258
+ graph.nodes[1].node_id.should == 1
259
+ end
260
+
261
+ it 'node#coverage' do
262
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'short_node_LastGraph')
263
+ graph.should be_kind_of(Bio::Velvet::Graph)
264
+
265
+ graph.nodes[1].coverage.should == 1140.0/228
266
+ graph.nodes[2].coverage.should == 58.0/29
267
+ graph.nodes[3].coverage.should == 114.0/38
268
+ graph.nodes[4].coverage.should == 1120.0/224
269
+ end
270
+
271
+ it 'should get neighbours_off_end' do
272
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'short_node_LastGraph')
273
+ graph.should be_kind_of(Bio::Velvet::Graph)
274
+
275
+ graph.neighbours_off_end(graph.nodes[1]).should == [graph.nodes[2], graph.nodes[3]]
276
+ graph.neighbours_off_end(graph.nodes[2]).should == [graph.nodes[4]]
277
+ graph.neighbours_off_end(graph.nodes[3]).should == [graph.nodes[4]]
278
+ graph.neighbours_off_end(graph.nodes[4]).should == [graph.nodes[2], graph.nodes[3]] #node 4 is revcom
279
+ end
280
+
281
+ it 'should get neighbours_into_start' do
282
+ graph = Bio::Velvet::Graph.parse_from_file File.join(TEST_DATA_DIR, 'short_node_LastGraph')
283
+ graph.should be_kind_of(Bio::Velvet::Graph)
284
+
285
+ graph.neighbours_into_start(graph.nodes[1]) == []
286
+ graph.neighbours_into_start(graph.nodes[2]) == [graph.nodes[1]]
287
+ graph.neighbours_into_start(graph.nodes[3]) == [graph.nodes[1]]
288
+ graph.neighbours_into_start(graph.nodes[4]) == []
289
+ end
290
+ end