]> git.donarmstrong.com Git - biopieces.git/blob - code_ruby/test/maasha/test_sam.rb
worked on unit tests for sam.rb
[biopieces.git] / code_ruby / test / maasha / test_sam.rb
1 #!/usr/bin/env ruby
2
3 # Copyright (C) 2011 Martin A. Hansen.
4
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
19 # http://www.gnu.org/copyleft/gpl.html
20
21 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
22
23 # This software is part of the Biopieces framework (www.biopieces.org).
24
25 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
26
27 require 'test/unit'
28 require 'maasha/sam'
29 require 'pp'
30 require 'stringio'
31
32 SAM_DATA =
33 %{@HD\tVN:1.3\tSO:coordinate
34 @SQ\tSN:ref\tLN:45
35 @CO\tMyComment
36 r001\t163\tref\t7\t30\t8M2I4M1D3M\t=\t37\t39\tTTAGATAAAGGATACTG\t*
37 r002\t0\tref\t9\t30\t3S6M1P1I4M\t*\t0\t0\tAAAAGATAAGGATA\t*
38 r003\t0\tref\t9\t30\t5H6M\t*\t0\t0\tAGCTAA\t*\tNM:i:1
39 r004\t0\tref\t16\t30\t6M14N5M\t*\t0\t0\tATAGCTTCAGC\t*
40 r003\t16\tref\t29\t30\t6H5M\t*\t0\t0\tTAGGC\t*\tNM:i:0
41 r001\t83\tref\t37\t30\t9M\t=\t7\t-39\tCAGCGCCAT\t*
42 }
43
44 class SamTest < Test::Unit::TestCase
45   def setup
46     @sam = Sam.new(StringIO.new(SAM_DATA))
47   end
48
49 #  def test_Sam_header_without_entry_returns_nil
50 #    @sam.io = StringIO.new
51 #    assert_nil(@sam.header)
52 #  end
53
54   def test_Sam_header_parse_with_missing_version_number_raises
55     assert_raise(SamError) { Sam.new(StringIO.new("@HD")) }
56   end
57
58   def test_Sam_header_parse_with_bad_version_number_raises
59     assert_raise(SamError) { Sam.new(StringIO.new("@HD\tXN:1.3")) }
60   end
61
62   def test_Sam_header_parse_with_ok_version_number_returns_correctly
63     sam = Sam.new(StringIO.new("@HD\tVN:1.3"))
64     assert_equal(1.3, sam.header[:HD][:VN])
65   end
66
67   def test_Sam_header_parse_with_bad_sort_order_raises
68     assert_raise(SamError) { Sam.new(StringIO.new("@HD\tVN:1.3\tSO:fish")) }
69   end
70
71   def test_Sam_header_parse_with_ok_sort_order_returns_correctly
72     %w{unknown unsorted queryname coordinate}.each do |order|
73       sam = Sam.new(StringIO.new("@HD\tVN:1.3\tSO:#{order}"))
74       assert_equal(order, sam.header[:HD][:SO])
75     end
76   end
77
78   def test_Sam_header_parse_with_missing_sequence_name_raises
79     assert_raise(SamError) { Sam.new(StringIO.new("@SQ")) }
80   end
81
82   def test_Sam_header_parse_with_bad_sequence_name_raises
83     assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:")) }
84   end
85
86   def test_Sam_header_parse_with_ok_sequence_name_returns_correctly
87     sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45"))
88     assert_equal({:LN=>45}, sam.header[:SQ][:SN][:ref])
89   end
90
91   def test_Sam_header_parse_with_duplicate_sequence_name_raises
92     assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:ref\n@SQ\tSN:ref")) }
93   end
94
95   def test_Sam_header_parse_with_missing_sequence_length_raises
96     assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:ref")) }
97   end
98
99   def test_Sam_header_parse_with_bad_sequence_length_raises
100     assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:scaffold17_1_MH0083\tLN:x")) }
101   end
102
103   def test_Sam_header_parse_with_ok_sequence_length_returns_correctly
104     sam = Sam.new(StringIO.new("@SQ\tSN:scaffold17_1_MH0083\tLN:995"))
105     assert_equal(995, sam.header[:SQ][:SN][:scaffold17_1_MH0083][:LN])
106   end
107
108   def test_Sam_header_parse_with_full_SQ_dont_raise
109     sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\tAS:ident\tM5:87e6b2aedf51b1f9c89becfab9267f41\tSP:E.coli\tUR:http://www.biopieces.org"))
110     assert_nothing_raised { sam.header }
111   end
112
113   def test_Sam_header_parse_with_bad_read_group_identifier_raises
114     assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:")) }
115   end
116
117   def test_Sam_header_parse_with_missing_read_group_identifier_raises
118     assert_raise(SamError) { Sam.new(StringIO.new("@RG")) }
119   end
120
121   def test_Sam_header_parse_with_duplicate_read_group_identifier_raises
122     assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\n@RG\tID:123")) }
123   end
124
125   def test_Sam_header_parse_with_ok_read_group_identifier_dont_raise
126     sam = Sam.new(StringIO.new("@RG\tID:123\n@RG\tID:124"))
127     assert_nothing_raised { sam.header }
128   end
129
130   def test_Sam_header_parse_with_bad_flow_order_raises
131     assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\tFO:3")) }
132   end
133
134   def test_Sam_header_parse_with_ok_flow_order_dont_raise
135     sam = Sam.new(StringIO.new("@RG\tID:123\tFO:*"))
136     assert_nothing_raised { sam.header }
137     sam = Sam.new(StringIO.new("@RG\tID:123\tFO:ACMGRSVTWYHKDBN"))
138     assert_nothing_raised { sam.header }
139   end
140
141   def test_Sam_header_parse_with_bad_platform_raises
142     assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\tPL:maersk")) }
143   end
144
145   def test_Sam_header_parse_with_ok_platform_dont_raise
146     sam = Sam.new(StringIO.new("@RG\tID:123\tPL:ILLUMINA"))
147     assert_nothing_raised { sam.header }
148   end
149
150   def test_Sam_header_parse_with_bad_program_identifier_raises
151     assert_raise(SamError) { Sam.new(StringIO.new("@PG\tID:")) }
152   end
153
154   def test_Sam_header_parse_with_missing_program_identifier_raises
155     assert_raise(SamError) { Sam.new(StringIO.new("@PG")) }
156   end
157
158   def test_Sam_header_parse_with_duplicate_program_identifier_raises
159     assert_raise(SamError) { Sam.new(StringIO.new("@PG\tID:123\n@PG\tID:123")) }
160   end
161
162   def test_Sam_header_parse_with_bad_comment_raises
163     assert_raise(SamError) { Sam.new(StringIO.new("@CO\t")) }
164   end 
165
166   def test_Sam_header_parse_with_ok_comment_dont_raise
167     sam = Sam.new(StringIO.new("@CO\tfubar"))
168     assert_nothing_raised { sam.header }
169   end
170
171   def test_Sam_each_with_bad_field_count_raises
172     fields = []
173
174     (0 ... 11).each do |i|
175       sam = Sam.new(StringIO.new(fields.join("\t") + $/))
176       assert_raise(SamError) { sam.each }
177       fields << "*"
178     end
179   end
180
181   def test_Sam_each_with_ok_field_count_dont_raise
182     sam = Sam.new(StringIO.new(SAM_DATA))
183     assert_nothing_raised { sam.each }
184   end
185
186   def test_Sam_each_with_bad_qname_raises
187     sam = Sam.new(StringIO.new(" \t*\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
188     assert_raise(SamError) { sam.each }
189   end
190
191   def test_Sam_each_with_ok_qname_dont_raise
192     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
193     assert_nothing_raised(SamError) { sam.each }
194   end
195
196   def test_Sam_each_with_bad_flag_raises
197     sam = Sam.new(StringIO.new("*\t-1\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
198     assert_raise(SamError) { sam.each }
199
200     sam = Sam.new(StringIO.new("*\t65536\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
201     assert_raise(SamError) { sam.each }
202   end
203
204   def test_Sam_each_with_ok_flag_dont_raise
205     sam = Sam.new(StringIO.new("*\t0\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
206     assert_nothing_raised { sam.each }
207
208     sam = Sam.new(StringIO.new("*\t65535\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
209     assert_nothing_raised { sam.each }
210   end
211
212   def test_Sam_each_with_bad_rname_raises
213     sam = Sam.new(StringIO.new("*\t*\t \t*\t*\t*\t*\t*\t*\t*\t*\n"))
214     assert_raise(SamError) { sam.each }
215   end
216
217   def test_Sam_each_with_ok_rname_dont_raise
218     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
219     assert_nothing_raised { sam.each }
220   end
221
222   def test_Sam_each_with_bad_pos_raises
223     sam = Sam.new(StringIO.new("*\t*\t*\t-1\t*\t*\t*\t*\t*\t*\t*\n"))
224     assert_raise(SamError) { sam.each }
225
226     sam = Sam.new(StringIO.new("*\t*\t*\t536870912\t*\t*\t*\t*\t*\t*\t*\n"))
227     assert_raise(SamError) { sam.each }
228   end
229
230   def test_Sam_each_with_ok_pos_dont_raise
231     sam = Sam.new(StringIO.new("*\t*\t*\t0\t*\t*\t*\t*\t*\t*\t*\n"))
232     assert_nothing_raised { sam.each }
233
234     sam = Sam.new(StringIO.new("*\t*\t*\t536870911\t*\t*\t*\t*\t*\t*\t*\n"))
235     assert_nothing_raised { sam.each }
236   end
237
238   def test_Sam_each_with_bad_mapq_raises
239     sam = Sam.new(StringIO.new("*\t*\t*\t*\t-1\t*\t*\t*\t*\t*\t*\n"))
240     assert_raise(SamError) { sam.each }
241
242     sam = Sam.new(StringIO.new("*\t*\t*\t*\t256\t*\t*\t*\t*\t*\t*\n"))
243     assert_raise(SamError) { sam.each }
244   end
245
246   def test_Sam_each_with_ok_mapq_dont_raise
247     sam = Sam.new(StringIO.new("*\t*\t*\t*\t0\t*\t*\t*\t*\t*\t*\n"))
248     assert_nothing_raised { sam.each }
249
250     sam = Sam.new(StringIO.new("*\t*\t*\t*\t255\t*\t*\t*\t*\t*\t*\n"))
251     assert_nothing_raised { sam.each }
252   end
253
254   def test_Sam_each_with_bad_cigar_raises
255     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t24\t*\t*\t*\t*\t*\n"))
256     assert_raise(SamError) { sam.each }
257   end
258
259   def test_Sam_each_with_ok_cigar_dont_raise
260     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t24M2I3D\t*\t*\t*\t*\t*\n"))
261     assert_nothing_raised { sam.each }
262
263     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
264     assert_nothing_raised { sam.each }
265   end
266
267   def test_Sam_each_with_bad_rnext_raises
268     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t \t*\t*\t*\t*\n"))
269     assert_raise(SamError) { sam.each }
270   end
271
272   def test_Sam_each_with_ok_rnext_dont_raise
273     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
274     assert_nothing_raised { sam.each }
275
276     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t=\t*\t*\t*\t*\n"))
277     assert_nothing_raised { sam.each }
278
279     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t!\t*\t*\t*\t*\n"))
280     assert_nothing_raised { sam.each }
281   end
282
283   def test_Sam_each_with_bad_pnext_raises
284     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t-1\t*\t*\t*\n"))
285     assert_raise(SamError) { sam.each }
286
287     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t536870912\t*\t*\t*\n"))
288     assert_raise(SamError) { sam.each }
289   end
290
291   def test_Sam_each_with_ok_pnext_dont_raise
292     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t0\t*\t*\t*\n"))
293     assert_nothing_raised { sam.each }
294
295     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t536870911\t*\t*\t*\t*\n"))
296     assert_nothing_raised { sam.each }
297   end
298
299   def test_Sam_each_with_bad_tlen_raises
300     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t-536870912\t*\t*\n"))
301     assert_raise(SamError) { sam.each }
302
303     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t536870912\t*\t*\n"))
304     assert_raise(SamError) { sam.each }
305   end
306
307   def test_Sam_each_with_ok_tlen_dont_raise
308     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t-536870911\t*\t*\n"))
309     assert_nothing_raised { sam.each }
310
311     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t536870911\t*\t*\n"))
312     assert_nothing_raised { sam.each }
313   end
314
315   def test_Sam_each_with_bad_seq_raises
316     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t\*\t \t*\n"))
317     assert_raise(SamError) { sam.each }
318   end
319
320   def test_Sam_each_with_ok_seq_dont_raise
321     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t\*\t*\t*\n"))
322     assert_nothing_raised { sam.each }
323
324     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t\*\tATCGatcg=.\t*\n"))
325     assert_nothing_raised { sam.each }
326   end
327
328   def test_Sam_each_with_bad_qual_raises
329     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t\*\t*\t \n"))
330     assert_raise(SamError) { sam.each }
331   end
332
333   def test_Sam_each_with_ok_qual_dont_raise
334     sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t\*\t*\t@\n"))
335     assert_nothing_raised { sam.each }
336   end
337
338   def test_Sam_each_with_rname_missing_from_header_raises
339     sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\tMIS\t*\t*\t*\t*\t*\t\*\t*\t*\n"))
340     assert_raise(SamError) { sam.each }
341   end
342
343   def test_Sam_each_with_rname_present_in_header_dont_raise
344     sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\tref\t*\t*\t*\t*\t*\t\*\t*\t*\n"))
345     assert_nothing_raised { sam.each }
346
347     sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\t*\t*\t*\t*\t*\t*\t\*\t*\t*\n"))
348     assert_nothing_raised { sam.each }
349   end
350 end
351