]> git.donarmstrong.com Git - biopieces.git/commitdiff
worked on unit tests for sam.rb
authormartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Wed, 24 Aug 2011 19:22:39 +0000 (19:22 +0000)
committermartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Wed, 24 Aug 2011 19:22:39 +0000 (19:22 +0000)
git-svn-id: http://biopieces.googlecode.com/svn/trunk@1495 74ccb610-7750-0410-82ae-013aeee3265d

code_ruby/lib/maasha/sam.rb
code_ruby/test/maasha/test_sam.rb

index 900df867d8a70166f91b9a9cfc5d616e08b7f27f..2a3e5868d36aed6ee0c8fa85ef1b249f6dd0842d 100644 (file)
@@ -253,7 +253,7 @@ class Sam < Filesys
     check_rname(rname)
     check_pos(pos)
     check_mapq(mapq)
-    check_cigar(cigar)
+    check_cigar(cigar, seq)
     check_rnext(rnext)
     check_pnext(pnext)
     check_tlen(tlen)
@@ -306,12 +306,25 @@ class Sam < Filesys
 
   # Method to check mapq.
   def check_mapq(mapq)
-    raise SamError, "Bad mapq: #{mapq}"   unless (0 .. 2**8 - 1).include? mapq
+    raise SamError, "Bad mapq: #{mapq}" unless (0 .. 2**8 - 1).include? mapq
   end
 
   # Method to check cigar.
-  def check_cigar(cigar)
+  def check_cigar(cigar, seq)
     raise SamError, "Bad cigar: #{cigar}" unless cigar =~ /^(\*|([0-9]+[MIDNSHPX=])+)$/
+
+    # Check cigar length matches sequence length.
+    unless cigar == '*' or seq == '*'
+      cigar_len = 0
+      
+      cigar.scan(/([0-9]+)([MIDNSHPX=])/).each do |len, op|
+        cigar_len += len.to_i if op =~ /[MISX=]/
+      end
+
+      if cigar_len != seq.length
+        raise SamError, "cigar and sequence length mismatch: #{cigar_len} != #{seq.length}"
+      end
+    end
   end
 
   # Method to check if rnext, when not '*' or '='
index 6421ffbe14e49d9e9517b15ea853c245d13d5ae5..bf814265f98e500b85f6245fc83808ebba5f477e 100755 (executable)
@@ -358,5 +358,18 @@ class SamTest < Test::Unit::TestCase
     sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\t*\t*\t*\t*\tref\t*\t\*\t*\t*\n"))
     assert_nothing_raised { 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 }
+
+    sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t6M\t*\t*\t\*\tAAAAAAA\t*\n"))
+    assert_raise(SamError) { sam.each }
+  end
+
+  def test_Sam_each_with_ok_cigar_length_dont_raise
+    sam = Sam.new(StringIO.new("*\t*\t*\t*\t*\t6M\t*\t*\t\*\tAAAAAA\t*\n"))
+    assert_nothing_raised { sam.each }
+  end
 end