def check_cigar(cigar, seq)
raise SamError, "Bad cigar: #{cigar}" unless cigar =~ /^(\*|([0-9]+[MIDNSHPX=])+)$/
+ # Check cigar hard clipping only at ends.
+ if cigar.gsub(/^[0-9]+H|[0-9]+H$/, "").match('H')
+ raise SamError, "Bad cigar with internal H: #{cigar}"
+ end
+
# Check cigar length matches sequence length.
unless cigar == '*' or seq == '*'
cigar_len = 0
assert_nothing_raised { sam.each }
end
+ def test_Sam_each_with_bad_cigar_hard_clip_raises
+ sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t1M1H1M\t*\t*\t\*\tAAA\t*\n"))
+ assert_raise(SamError) { sam.each }
+
+ sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t1H1M1H1M\t*\t*\t\*\tAAA\t*\n"))
+ assert_raise(SamError) { sam.each }
+
+ sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t1M1H1M1H\t*\t*\t\*\tAAA\t*\n"))
+ assert_raise(SamError) { sam.each }
+ end
+
+ def test_Sam_each_with_ok_cigar_hard_clip_dont_raise
+ sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t1H1M\t*\t*\t\*\tA\t*\n"))
+ assert_nothing_raised { sam.each }
+
+ sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t1M1H\t*\t*\t\*\tA\t*\n"))
+ assert_nothing_raised { sam.each }
+
+ sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t1H1M1H\t*\t*\t\*\tA\t*\n"))
+ assert_nothing_raised { sam.each }
+ #assert_raise(SamError) { sam.each }
+ end
+
def test_Sam_each_with_bad_cigar_length_raise
sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t6M\t*\t*\t\*\tAAAAA\t*\n"))
assert_raise(SamError) { sam.each }