3 # Copyright (C) 2011 Martin A. Hansen.
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.
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.
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.
19 # http://www.gnu.org/copyleft/gpl.html
21 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
23 # This software is part of the Biopieces framework (www.biopieces.org).
25 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
33 %{@HD\tVN:1.3\tSO:coordinate
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*
44 class SamTest < Test::Unit::TestCase
46 @sam = Sam.new(StringIO.new(SAM_DATA))
49 # def test_Sam_header_without_entry_returns_nil
50 # @sam.io = StringIO.new
51 # assert_nil(@sam.header)
54 def test_Sam_header_parse_with_missing_version_number_raises
55 assert_raise(SamError) { Sam.new(StringIO.new("@HD")) }
58 def test_Sam_header_parse_with_bad_version_number_raises
59 assert_raise(SamError) { Sam.new(StringIO.new("@HD\tXN:1.3")) }
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])
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")) }
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])
78 def test_Sam_header_parse_with_missing_sequence_name_raises
79 assert_raise(SamError) { Sam.new(StringIO.new("@SQ")) }
82 def test_Sam_header_parse_with_bad_sequence_name_raises
83 assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:")) }
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])
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")) }
95 def test_Sam_header_parse_with_missing_sequence_length_raises
96 assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:ref")) }
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")) }
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])
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 }
113 def test_Sam_header_parse_with_bad_read_group_identifier_raises
114 assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:")) }
117 def test_Sam_header_parse_with_missing_read_group_identifier_raises
118 assert_raise(SamError) { Sam.new(StringIO.new("@RG")) }
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")) }
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 }
130 def test_Sam_header_parse_with_bad_flow_order_raises
131 assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\tFO:3")) }
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 }
141 def test_Sam_header_parse_with_bad_platform_raises
142 assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\tPL:maersk")) }
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 }
150 def test_Sam_header_parse_with_bad_program_identifier_raises
151 assert_raise(SamError) { Sam.new(StringIO.new("@PG\tID:")) }
154 def test_Sam_header_parse_with_missing_program_identifier_raises
155 assert_raise(SamError) { Sam.new(StringIO.new("@PG")) }
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")) }
162 def test_Sam_header_parse_with_bad_comment_raises
163 assert_raise(SamError) { Sam.new(StringIO.new("@CO\t")) }
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 }
171 def test_Sam_each_with_bad_field_count_raises
174 (0 ... 11).each do |i|
175 sam = Sam.new(StringIO.new(fields.join("\t") + $/))
176 assert_raise(SamError) { sam.each }
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 }
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 }
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 }
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 }
200 sam = Sam.new(StringIO.new("*\t65536\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
201 assert_raise(SamError) { sam.each }
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 }
208 sam = Sam.new(StringIO.new("*\t65535\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
209 assert_nothing_raised { sam.each }
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 }
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 }
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 }
226 sam = Sam.new(StringIO.new("*\t*\t*\t536870912\t*\t*\t*\t*\t*\t*\t*\n"))
227 assert_raise(SamError) { sam.each }
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 }
234 sam = Sam.new(StringIO.new("*\t*\t*\t536870911\t*\t*\t*\t*\t*\t*\t*\n"))
235 assert_nothing_raised { sam.each }
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 }
242 sam = Sam.new(StringIO.new("*\t*\t*\t*\t256\t*\t*\t*\t*\t*\t*\n"))
243 assert_raise(SamError) { sam.each }
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 }
250 sam = Sam.new(StringIO.new("*\t*\t*\t*\t255\t*\t*\t*\t*\t*\t*\n"))
251 assert_nothing_raised { sam.each }
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 }
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 }
263 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t*\t*\t*\n"))
264 assert_nothing_raised { sam.each }
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 }
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 }
276 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t=\t*\t*\t*\t*\n"))
277 assert_nothing_raised { sam.each }
279 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t!\t*\t*\t*\t*\n"))
280 assert_nothing_raised { sam.each }
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 }
287 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t536870912\t*\t*\t*\n"))
288 assert_raise(SamError) { sam.each }
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 }
295 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t536870911\t*\t*\t*\t*\n"))
296 assert_nothing_raised { sam.each }
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 }
303 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t536870912\t*\t*\n"))
304 assert_raise(SamError) { sam.each }
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 }
311 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t536870911\t*\t*\n"))
312 assert_nothing_raised { sam.each }
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 }
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 }
324 sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t*\t*\t*\t\*\tATCGatcg=.\t*\n"))
325 assert_nothing_raised { sam.each }
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 }
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 }
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 }
343 def test_Sam_each_wtih_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 }
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 }