From: martinahansen Date: Tue, 23 Aug 2011 14:29:01 +0000 (+0000) Subject: worked on unit tests for sam.rb X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=0b081027ab042ab553b034cdded4c50e36d1ed7d;p=biopieces.git worked on unit tests for sam.rb git-svn-id: http://biopieces.googlecode.com/svn/trunk@1493 74ccb610-7750-0410-82ae-013aeee3265d --- diff --git a/code_ruby/lib/maasha/sam.rb b/code_ruby/lib/maasha/sam.rb index 3ffc56d..f29e621 100644 --- a/code_ruby/lib/maasha/sam.rb +++ b/code_ruby/lib/maasha/sam.rb @@ -248,19 +248,17 @@ class Sam < Filesys seq = fields[9] qual = fields[10] - raise SamError, "Bad qname: #{qname}" unless qname =~ /^[!-?A-~]{1,255}$/ - raise SamError, "Bad flag: #{flag}" unless (0 .. 2**16 - 1).include? flag - raise SamError, "Bad rname: #{rname}" unless rname =~ /^(\*|[!-()+-<>-~][!-~]*)$/ - raise SamError, "Bad pos: #{pos}" unless (0 .. 2**29 - 1).include? pos - raise SamError, "Bad mapq: #{mapq}" unless (0 .. 2**8 - 1).include? mapq - raise SamError, "Bad cigar: #{cigar}" unless cigar =~ /^(\*|([0-9]+[MIDNSHPX=])+)$/ - raise SamError, "Bad rnext: #{rnext}" unless rnext =~ /^(\*|=|[!-()+-<>-~][!-~]*)$/ - raise SamError, "Bad pnext: #{pnext}" unless (0 .. 2**29 - 1).include? pnext - raise SamError, "Bad tlen: #{tlen}" unless (-2**29 + 1 .. 2**29 - 1).include? tlen - raise SamError, "Bad seq: #{seq}" unless seq =~ /^(\*|[A-Za-z=.]+)$/ - raise SamError, "Bad qual: #{qual}" unless qual =~ /^[!-~]+$/ - + check_qname(qname) + check_flag(flag) check_rname(rname) + check_pos(pos) + check_mapq(mapq) + check_cigar(cigar) + check_rnext(rnext) + check_pnext(pnext) + check_tlen(tlen) + check_seq(seq) + check_qual(qual) entry = {} entry[:QNAME] = qname @@ -272,16 +270,28 @@ class Sam < Filesys entry[:RNEXT] = rnext entry[:PNEXT] = pnext entry[:TLEN] = tlen - entry[:SEQ] = seq + entry[:SEQ] = Seq.new(qname, seq) entry[:QUAL] = qual entry end + # Method to check qname. + def check_qname(qname) + raise SamError, "Bad qname: #{qname}" unless qname =~ /^[!-?A-~]{1,255}$/ + end + + # Method to check flag. + def check_flag(flag) + raise SamError, "Bad flag: #{flag}" unless (0 .. 2**16 - 1).include? flag + end + # Method to check if rname, when not '*' and # @SQ header lines are present, is located in # the header hash. def check_rname(rname) + raise SamError, "Bad rname: #{rname}" unless rname =~ /^(\*|[!-()+-<>-~][!-~]*)$/ + unless @header.empty? or rname == '*' unless @header[:SQ][:SN].has_key? rname.to_sym raise SamError, "rname not found in header hash: #{rname}" @@ -289,16 +299,53 @@ class Sam < Filesys end end + # Method to check pos. + def check_pos(pos) + raise SamError, "Bad pos: #{pos}" unless (0 .. 2**29 - 1).include? pos + end + + # Method to check mapq. + def check_mapq(mapq) + raise SamError, "Bad mapq: #{mapq}" unless (0 .. 2**8 - 1).include? mapq + end + + # Method to check cigar. + def check_cigar(cigar) + raise SamError, "Bad cigar: #{cigar}" unless cigar =~ /^(\*|([0-9]+[MIDNSHPX=])+)$/ + end + # Method to check if rnext, when not '*' or '=' # and @SQ header lines are present, is located # in the header hash. def check_rnext(rnext) + raise SamError, "Bad rnext: #{rnext}" unless rnext =~ /^(\*|=|[!-()+-<>-~][!-~]*)$/ + unless @header.empty? or rnext == '*' or rnext == '=' unless @header[:SQ][:SN].has_key? rnext.to_sym raise SamError, "rnext not found in header hash: #{rnext}" end end end + + # Method to check pnext. + def check_pnext(pnext) + raise SamError, "Bad pnext: #{pnext}" unless (0 .. 2**29 - 1).include? pnext + end + + # Method to check tlen. + def check_tlen(tlen) + raise SamError, "Bad tlen: #{tlen}" unless (-2**29 + 1 .. 2**29 - 1).include? tlen + end + + # Method to check seq. + def check_seq(seq) + raise SamError, "Bad seq: #{seq}" unless seq =~ /^(\*|[A-Za-z=.]+)$/ + end + + # Method to check qual. + def check_qual(qual) + raise SamError, "Bad qual: #{qual}" unless qual =~ /^[!-~]+$/ + end end diff --git a/code_ruby/test/maasha/test_sam.rb b/code_ruby/test/maasha/test_sam.rb index 8642f64..6421ffb 100755 --- a/code_ruby/test/maasha/test_sam.rb +++ b/code_ruby/test/maasha/test_sam.rb @@ -46,124 +46,119 @@ class SamTest < Test::Unit::TestCase @sam = Sam.new(StringIO.new(SAM_DATA)) end -# def test_Sam_header_without_entry_returns_nil -# @sam.io = StringIO.new -# assert_nil(@sam.header) -# end - - def test_Sam_header_parse_with_missing_version_number_raises + def test_Sam_new_with_missing_version_number_raises assert_raise(SamError) { Sam.new(StringIO.new("@HD")) } end - def test_Sam_header_parse_with_bad_version_number_raises + def test_Sam_new_with_bad_version_number_raises assert_raise(SamError) { Sam.new(StringIO.new("@HD\tXN:1.3")) } end - def test_Sam_header_parse_with_ok_version_number_returns_correctly + def test_Sam_new_with_ok_version_number_returns_correctly sam = Sam.new(StringIO.new("@HD\tVN:1.3")) assert_equal(1.3, sam.header[:HD][:VN]) end - def test_Sam_header_parse_with_bad_sort_order_raises + def test_Sam_new_with_bad_sort_order_raises assert_raise(SamError) { Sam.new(StringIO.new("@HD\tVN:1.3\tSO:fish")) } end - def test_Sam_header_parse_with_ok_sort_order_returns_correctly + def test_Sam_new_with_ok_sort_order_returns_correctly %w{unknown unsorted queryname coordinate}.each do |order| sam = Sam.new(StringIO.new("@HD\tVN:1.3\tSO:#{order}")) assert_equal(order, sam.header[:HD][:SO]) end end - def test_Sam_header_parse_with_missing_sequence_name_raises + def test_Sam_new_with_missing_sequence_name_raises assert_raise(SamError) { Sam.new(StringIO.new("@SQ")) } end - def test_Sam_header_parse_with_bad_sequence_name_raises + def test_Sam_new_with_bad_sequence_name_raises assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:")) } end - def test_Sam_header_parse_with_ok_sequence_name_returns_correctly + def test_Sam_new_with_ok_sequence_name_returns_correctly sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45")) assert_equal({:LN=>45}, sam.header[:SQ][:SN][:ref]) end - def test_Sam_header_parse_with_duplicate_sequence_name_raises + def test_Sam_new_with_duplicate_sequence_name_raises assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:ref\n@SQ\tSN:ref")) } end - def test_Sam_header_parse_with_missing_sequence_length_raises + def test_Sam_new_with_missing_sequence_length_raises assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:ref")) } end - def test_Sam_header_parse_with_bad_sequence_length_raises + def test_Sam_new_with_bad_sequence_length_raises assert_raise(SamError) { Sam.new(StringIO.new("@SQ\tSN:scaffold17_1_MH0083\tLN:x")) } end - def test_Sam_header_parse_with_ok_sequence_length_returns_correctly + def test_Sam_new_with_ok_sequence_length_returns_correctly sam = Sam.new(StringIO.new("@SQ\tSN:scaffold17_1_MH0083\tLN:995")) assert_equal(995, sam.header[:SQ][:SN][:scaffold17_1_MH0083][:LN]) end - def test_Sam_header_parse_with_full_SQ_dont_raise + def test_Sam_new_with_full_SQ_dont_raise sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\tAS:ident\tM5:87e6b2aedf51b1f9c89becfab9267f41\tSP:E.coli\tUR:http://www.biopieces.org")) assert_nothing_raised { sam.header } end - def test_Sam_header_parse_with_bad_read_group_identifier_raises + def test_Sam_new_with_bad_read_group_identifier_raises assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:")) } end - def test_Sam_header_parse_with_missing_read_group_identifier_raises + def test_Sam_new_with_missing_read_group_identifier_raises assert_raise(SamError) { Sam.new(StringIO.new("@RG")) } end - def test_Sam_header_parse_with_duplicate_read_group_identifier_raises + def test_Sam_new_with_duplicate_read_group_identifier_raises assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\n@RG\tID:123")) } end - def test_Sam_header_parse_with_ok_read_group_identifier_dont_raise + def test_Sam_new_with_ok_read_group_identifier_dont_raise sam = Sam.new(StringIO.new("@RG\tID:123\n@RG\tID:124")) assert_nothing_raised { sam.header } end - def test_Sam_header_parse_with_bad_flow_order_raises + def test_Sam_new_with_bad_flow_order_raises assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\tFO:3")) } end - def test_Sam_header_parse_with_ok_flow_order_dont_raise + def test_Sam_new_with_ok_flow_order_dont_raise sam = Sam.new(StringIO.new("@RG\tID:123\tFO:*")) assert_nothing_raised { sam.header } sam = Sam.new(StringIO.new("@RG\tID:123\tFO:ACMGRSVTWYHKDBN")) assert_nothing_raised { sam.header } end - def test_Sam_header_parse_with_bad_platform_raises + def test_Sam_new_with_bad_platform_raises assert_raise(SamError) { Sam.new(StringIO.new("@RG\tID:123\tPL:maersk")) } end - def test_Sam_header_parse_with_ok_platform_dont_raise + def test_Sam_new_with_ok_platform_dont_raise sam = Sam.new(StringIO.new("@RG\tID:123\tPL:ILLUMINA")) assert_nothing_raised { sam.header } end - def test_Sam_header_parse_with_bad_program_identifier_raises + def test_Sam_new_with_bad_program_identifier_raises assert_raise(SamError) { Sam.new(StringIO.new("@PG\tID:")) } end - def test_Sam_header_parse_with_missing_program_identifier_raises + def test_Sam_new_with_missing_program_identifier_raises assert_raise(SamError) { Sam.new(StringIO.new("@PG")) } end - def test_Sam_header_parse_with_duplicate_program_identifier_raises + def test_Sam_new_with_duplicate_program_identifier_raises assert_raise(SamError) { Sam.new(StringIO.new("@PG\tID:123\n@PG\tID:123")) } end - def test_Sam_header_parse_with_bad_comment_raises + def test_Sam_new_with_bad_comment_raises assert_raise(SamError) { Sam.new(StringIO.new("@CO\t")) } end - def test_Sam_header_parse_with_ok_comment_dont_raise + def test_Sam_new_with_ok_comment_dont_raise sam = Sam.new(StringIO.new("@CO\tfubar")) assert_nothing_raised { sam.header } end @@ -347,5 +342,21 @@ class SamTest < Test::Unit::TestCase sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\t*\t*\t*\t*\t*\t*\t\*\t*\t*\n")) assert_nothing_raised { sam.each } end + + def test_Sam_each_with_rnext_missing_from_header_raises + sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\t*\t*\t*\t*\tMIS\t*\t\*\t*\t*\n")) + assert_raise(SamError) { sam.each } + end + + def test_Sam_each_with_rnext_present_in_header_dont_raise + sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\t*\t*\t*\t*\t*\t*\t\*\t*\t*\n")) + assert_nothing_raised { sam.each } + + sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45\n*\t*\t*\t*\t*\t*\t=\t*\t\*\t*\t*\n")) + assert_nothing_raised { sam.each } + + 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 end