github.com/biogo/biogo@v1.0.4/alphabet/alphabet_test.go (about)

     1  // Copyright ©2011-2012 The bíogo Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package alphabet
     6  
     7  import (
     8  	"strings"
     9  	"testing"
    10  	"unicode"
    11  
    12  	"gopkg.in/check.v1"
    13  )
    14  
    15  // Tests
    16  func Test(t *testing.T) { check.TestingT(t) }
    17  
    18  type S struct{}
    19  
    20  var _ = check.Suite(&S{})
    21  
    22  func (s *S) TestInterfaces(c *check.C) {
    23  	var (
    24  		alpha Alphabet
    25  		comp  Complementor
    26  	)
    27  
    28  	for _, a := range []interface{}{DNA, RNA, Protein} {
    29  		c.Check(a, check.Implements, &alpha)
    30  	}
    31  
    32  	for _, a := range []interface{}{DNA, DNAredundant, RNA, RNAredundant} {
    33  		c.Check(a, check.Implements, &comp)
    34  	}
    35  
    36  	c.Check(Protein, check.Not(check.Implements), &comp)
    37  }
    38  
    39  type testAlphabets struct {
    40  	alphabet Alphabet
    41  	letters  string
    42  }
    43  
    44  func (s *S) TestIsValid(c *check.C) {
    45  	for _, t := range []testAlphabets{
    46  		{DNA, "acgt"},
    47  		{DNAgapped, "-acgt"},
    48  		{RNA, "acgu"},
    49  		{RNAgapped, "-acgu"},
    50  		{Protein, "-abcdefghijklmnpqrstvwxyz*"},
    51  	} {
    52  		for i := 0; i < 256; i++ {
    53  			c.Check(t.alphabet.IsValid(Letter(i)), check.Equals, strings.ContainsRune(t.letters, unicode.ToUpper(rune(i))) || strings.ContainsRune(t.letters, unicode.ToLower(rune(i))))
    54  		}
    55  	}
    56  }
    57  
    58  func uc(l Letter) Letter {
    59  	return Letter(unicode.ToUpper(rune(l)))
    60  }
    61  
    62  func (s *S) TestLetter(c *check.C) {
    63  	for _, t := range []Alphabet{
    64  		DNA,
    65  		RNA,
    66  		Protein,
    67  	} {
    68  		for i := 0; i < t.Len(); i++ {
    69  			c.Check(t.IndexOf(t.Letter(i)), check.Equals, i,
    70  				check.Commentf("Index %d: %c == %d", i, t.Letter(i), t.IndexOf(t.Letter(i))))
    71  			c.Check(t.IndexOf(uc(t.Letter(i))), check.Equals, i,
    72  				check.Commentf("Index %d: %c == %d", i, uc(t.Letter(i)), t.IndexOf(uc(t.Letter(i)))))
    73  		}
    74  	}
    75  }
    76  
    77  func (s *S) TestComplement(c *check.C) {
    78  	for _, t := range []Complementor{
    79  		DNA,
    80  		RNA,
    81  	} {
    82  		for i := 0; i < 256; i++ {
    83  			if sc, ok := t.Complement(Letter(i)); ok {
    84  				dc, ok := t.Complement(sc)
    85  				c.Check(ok, check.Equals, true)
    86  				c.Check(dc, check.Equals, Letter(i))
    87  			}
    88  		}
    89  	}
    90  }
    91  
    92  func (s *S) TestComplementDirect(c *check.C) {
    93  	for _, t := range []Complementor{
    94  		DNA,
    95  		RNA,
    96  	} {
    97  		complement := t.ComplementTable()
    98  		for i := 0; i < 256; i++ {
    99  			if sc := complement[i]; sc <= unicode.MaxASCII {
   100  				dc := complement[sc]
   101  				c.Check(dc <= unicode.MaxASCII, check.Equals, true)
   102  				c.Check(dc, check.Equals, Letter(i))
   103  			} else {
   104  				c.Check(sc&unicode.MaxASCII, check.Equals, Letter(i&unicode.MaxASCII))
   105  			}
   106  		}
   107  	}
   108  }
   109  
   110  func (s *S) TestLetters(c *check.C) {
   111  	for _, t := range []testAlphabets{
   112  		{DNA, "acgtACGT"},
   113  		{DNA, "acgtACGT"},
   114  		{RNAgapped, "-acgu-ACGU"},
   115  		{RNAgapped, "-acgu-ACGU"},
   116  		{Protein, "-abcdefghijklmnpqrstvwxyz*-ABCDEFGHIJKLMNPQRSTVWXYZ*"},
   117  	} {
   118  		c.Check(t.alphabet.Letters(), check.Equals, t.letters)
   119  	}
   120  }
   121  
   122  func (s *S) TestRangeCheck(c *check.C) {
   123  	var err error
   124  	_, err = newAlphabet(string([]rune{256}), 0, 0, 0, !CaseSensitive)
   125  	c.Check(err, check.Not(check.IsNil))
   126  	_, err = newAlphabet(string([]rune{0}), 0, 0, 0, !CaseSensitive)
   127  	c.Check(err, check.IsNil)
   128  	_, err = newAlphabet(string([]rune{127}), 0, 0, 0, !CaseSensitive)
   129  	c.Check(err, check.IsNil)
   130  	_, err = newAlphabet(string([]rune{-1}), 0, 0, 0, !CaseSensitive)
   131  	c.Check(err, check.Not(check.IsNil))
   132  }
   133  
   134  func BenchmarkIsValid(b *testing.B) {
   135  	g, _ := newAlphabet("-abcdefghijklmnpqrstvwxyz*", 0, 0, 0, !CaseSensitive)
   136  	b.ResetTimer()
   137  	for i := 0; i < b.N; i++ {
   138  		g.IsValid(Letter(i))
   139  	}
   140  }
   141  
   142  func BenchmarkIsValidProtein(b *testing.B) {
   143  	for i := 0; i < b.N; i++ {
   144  		Protein.IsValid(Letter(i))
   145  	}
   146  }
   147  
   148  func BenchmarkIsValidDNA(b *testing.B) {
   149  	for i := 0; i < b.N; i++ {
   150  		DNA.IsValid(Letter(i))
   151  	}
   152  }
   153  
   154  func BenchmarkIsValidDNADirect(b *testing.B) {
   155  	valid := DNA.ValidLetters()
   156  	for i := 0; i < b.N; i++ {
   157  		_ = valid[byte(i)]
   158  	}
   159  }
   160  
   161  func BenchmarkIndexDNA(b *testing.B) {
   162  	for i := 0; i < b.N; i++ {
   163  		DNA.IndexOf(Letter(i))
   164  	}
   165  }
   166  
   167  func BenchmarkIndexDNADirect(b *testing.B) {
   168  	index := DNA.LetterIndex()
   169  	for i := 0; i < b.N; i++ {
   170  		_ = index[byte(i)]
   171  	}
   172  }
   173  
   174  func BenchmarkComplementDNA(b *testing.B) {
   175  	for i := 0; i < b.N; i++ {
   176  		DNA.Complement(Letter(i))
   177  	}
   178  }
   179  
   180  func BenchmarkComplementDNADirect(b *testing.B) {
   181  	comp := DNA.ComplementTable()
   182  	var c Letter
   183  	for i := 0; i < b.N; i++ {
   184  		if c = comp[Letter(i)]; c != 0x80 {
   185  		}
   186  	}
   187  }