]> git.donarmstrong.com Git - biopieces.git/blobdiff - code_ruby/test/maasha/test_seq.rb
refactoring of revcomp in seq.rb
[biopieces.git] / code_ruby / test / maasha / test_seq.rb
index d177d311467901296a0d2d0aa90f01dce29ffd86..8bc6852927235b939414d80a02329b3b5490def7 100755 (executable)
@@ -9,7 +9,8 @@ class TestSeq < Test::Unit::TestCase
     @entry = Seq.new
   end
 
-  #  def test_Seq# autoremoves whitespace, newlines, and carriage returns
+  #  # autoremoves whitespace, newlines, and carriage returns
+  #  def test_Seq_strip
   #    dna = Seq.new
   #    dna.seq = "A\tT\r\tC\nG  "
   #    assert_equal(dna.seq, "ATCG")
@@ -218,7 +219,15 @@ class TestSeq < Test::Unit::TestCase
 
   def test_Seq_reverse_returns_correctly
     @entry.seq = "ATCG"
-    assert_equal("GCTA", @entry.reverse.seq)
+    new_entry  = @entry.reverse
+    assert_equal("GCTA", new_entry.seq)
+    assert_equal("ATCG", @entry.seq)
+  end
+
+  def test_Seq_reverse_bang_returns_correctly
+    @entry.seq = "ATCG"
+    @entry.reverse!
+    assert_equal("GCTA", @entry.seq)
   end
 
   def test_Seq_complement_raises_if_no_sequence
@@ -235,27 +244,43 @@ class TestSeq < Test::Unit::TestCase
   def test_Seq_complement_for_DNA_is_correct
     @entry.seq  = 'ATCGatcg'
     @entry.type = 'dna'
-    assert_equal("TAGCtagc", @entry.complement)
+    comp        = @entry.complement
+    assert_equal("TAGCtagc", comp.seq)
+    assert_equal("ATCGatcg", @entry.seq)
   end
 
   def test_Seq_complement_for_RNA_is_correct
     @entry.seq  = 'AUCGaucg'
     @entry.type = 'rna'
-    assert_equal("UAGCuagc", @entry.complement)
+    comp        = @entry.complement
+    assert_equal("UAGCuagc", comp.seq)
+    assert_equal("AUCGaucg", @entry.seq)
   end
 
-  def test_Seq_reverse_complement_for_DNA_is_correct
+  def test_Seq_complement_bang_raises_if_no_sequence
+    @entry.type = 'dna'
+    assert_raise(SeqError) { @entry.complement! }
+  end
+
+  def test_Seq_complement_bang_raises_on_bad_type
+    @entry.seq  = 'ATCG'
+    @entry.type = 'protein'
+    assert_raise(SeqError) { @entry.complement! }
+  end
+
+  def test_Seq_complement_bang_for_DNA_is_correct
     @entry.seq  = 'ATCGatcg'
     @entry.type = 'dna'
-    assert_equal("cgatCGAT", @entry.reverse_complement.seq)
+    assert_equal("TAGCtagc", @entry.complement!.seq)
   end
 
-  def test_Seq_reverse_complement_for_RNA_is_correct
+  def test_Seq_complement_bang_for_RNA_is_correct
     @entry.seq  = 'AUCGaucg'
     @entry.type = 'rna'
-    assert_equal("cgauCGAU", @entry.reverse_complement.seq)
+    assert_equal("UAGCuagc", @entry.complement!.seq)
   end
 
+
   def test_Seq_hamming_distance_returns_correctly
     seq1 = Seq.new("test1", "ATCG")
     seq2 = Seq.new("test2", "atgg")
@@ -277,6 +302,19 @@ class TestSeq < Test::Unit::TestCase
     end
   end
 
+  def test_Seq_shuffle_returns_correctly
+    orig       = "actgactgactgatcgatcgatcgatcgtactg" 
+    @entry.seq = "actgactgactgatcgatcgatcgatcgtactg"
+    entry_shuf = @entry.shuffle
+    assert_equal(orig, @entry.seq)
+    assert_not_equal(@entry.seq, entry_shuf.seq)
+  end
+
+  def test_Seq_shuffle_bang_returns_correctly
+    @entry.seq = "actgactgactgatcgatcgatcgatcgtactg"
+    assert_not_equal(@entry.seq, @entry.shuffle!.seq)
+  end
+
   def test_Seq_subseq_with_start_lt_0_raises
     @entry.seq = "ATCG"
     assert_raise(SeqError) { @entry.subseq(-1, 1) }
@@ -488,6 +526,55 @@ class TestSeq < Test::Unit::TestCase
     assert_equal("-atCG", @entry.mask_seq_soft!(20).seq)
   end
 
+  # qual score detection
+
+  def test_Seq_qual_base33_returns_correctly
+    # self.qual.match(/[!-:]/)
+    @entry.qual = '!"#$%&\'()*+,-./0123456789:'
+    assert_equal(true,  @entry.qual_base33? )
+    @entry.qual = 32.chr
+    assert_equal(false, @entry.qual_base33? )
+    @entry.qual = 59.chr
+    assert_equal(false, @entry.qual_base33? )
+  end
+
+  def test_Seq_qual_base64_returns_correctly
+    # self.qual.match(/[K-h]/)
+    @entry.qual = 'KLMNOPQRSTUVWXYZ[\]^_`abcdefgh'
+    assert_equal(true,  @entry.qual_base64? )
+    @entry.qual = 74.chr
+    assert_equal(false, @entry.qual_base64? )
+    @entry.qual = 105.chr
+    assert_equal(false, @entry.qual_base64? )
+  end
+
+  def test_Seq_qual_valid_with_nil_qual_raises
+    assert_raise(SeqError) { @entry.qual_valid?("illumina1.8") }
+  end
+
+  def test_Seq_qual_valid_with_bad_encoding_raises
+    @entry.qual = "abc"
+    assert_raise(SeqError) { @entry.qual_valid?("foobar") }
+  end
+
+  def test_Seq_qual_valid_returns_correctly
+    tests = [["sanger",      0, 93, 33],
+             ["454",         0, 62, 64],
+             ["solexa",     -5, 62, 64],
+             ["illumina13",  0, 62, 64],
+             ["illumina15",  0, 62, 64],
+             ["illumina18",  0, 93, 33]]
+
+    tests.each do |test|
+      @entry.qual = (test[1] + test[-1]).chr + (test[2] + test[-1]).chr
+      assert_equal(true, @entry.qual_valid?(test[0]))
+      @entry.qual = (test[1] + test[-1] - 1).chr
+      assert_equal(false, @entry.qual_valid?(test[0]))
+      @entry.qual = (test[2] + test[-1] + 1).chr
+      assert_equal(false, @entry.qual_valid?(test[0]))
+    end
+  end
+
   # convert sanger to ...
 
   def test_Seq_convert_scores_bang_from_sanger_to_sanger_returns_OK