"""
Tests for `bx.seqmapping`.
"""

import unittest
import bx.seqmapping

from numpy import array, allclose
from StringIO import StringIO

class CharMappingTests( unittest.TestCase ):
    def test_DNA( self ):
        assert( allclose( bx.seqmapping.DNA.translate( "ACGTacgt-?X" ),
                          [ 0, 1, 2, 3, 0, 1, 2, 3, 4, -1, -1 ] ) )
    def test_DNA_list( self ):
        assert( allclose( bx.seqmapping.DNA.translate_list( [ "ACGTA", "TGCAX" ] ),
                          [ 0 + 3*6, 1 + 2*6, 2 + 1*6, 3 + 0*6, -1 ] ) )
    def test_other( self ):
        m = bx.seqmapping.CharToIntArrayMapping()
        m.set_mapping( "A", 0 )
        m.set_mapping( "B", 7 )
        assert( allclose( m.translate( "ABCCBA" ), [ 0, 7, -1, -1, 7, 0 ] ) )
        
class IntMappingTests( unittest.TestCase ):
    def test_simple( self ):
        m = bx.seqmapping.IntToIntMapping( 4 )
        m.set_mapping( 0, 0 )
        m.set_mapping( 2, 0 )
        m.set_mapping( 1, 1 )
        m.set_mapping( 3, 1 )
        assert( allclose( m.translate( array( [ 0, 1, 2, 3, 4 ], 'i' ) ), array( [ 0, 1, 0, 1, -1 ] ) ) )
   
eight_species_mapping = """TTTTTTTT 0
CCCCCCCC 4
AAAAAAAA 1
GGGGGGGG 5
AAAAA*AA 2
TTTTT*TT 0
GGGGG*GG 5
CCCCC*CC 4
GGGG*GGG 5
TTTT*TTT 2
GGGAAGGG 5
AAAA*AAA 2
TTTTT*T* 2
CCCCC*C* 4
CCCTTCCC 4
CCCC*CCC 4
TTTT**TT 2
AAAA**AA 2
AAAAA*A* 2
GGGGG*G* 5
AAAAAGAA 2
TTTTTCTT 2
GGGAA*GG 5
TTTT**T* 2
TTTCCTTT 0
AAAAAAA* 1
CCCTT*CC 3
TTTTTTT* 2
CC*CC*CC 3
AAAGGAAA 2
------G- 2
"""
       
rows = [ "AAATTGT-----ATGTCCATCCTTTAAAGGTCATTCCTTTAATGGTCTTTTCTGGACACCACTAGGGGTCAGAAGTAGTTCATCAAAC-----------------TTTCTTCCCTCCC-TACTTCAGTG",
         "AAATTGT-----ATGTCCATCCTTTAAAGGTCATTCCTTTAATGGTCTTTTCTGGACACCACTAGGGGTCAGAAGTAGTTCATCAAAC-----------------TTTCTTCCCTCCC-TACTTCAGTG",
         "AAATTTT-----ATGTCTATCCTTTAAAGGTCATTCCTCTAATAGTCTTTTCTGGACACCACTAGGGGTCAGAAGTAGTTCATTAAAC-----------------TTTCTTCCCTCCC-TACCTCAGTG",
         "AAACTGT-----ATCACCACCTTTTTAAGGTCATTTCTCTAATGATCCTGTT-GCATACCAGTAGGGGGCAGAAGTGTTCCGCTGATTTCCGCCCTCCTCCCCACCCCCCCACCCCCC-TTATTCAAAG",
         "*********************************************************************************************************************************",
         "-TATTAT-----ATGGCCATGTTCAAAAGGTTGTTTCTCTAATGATTCCTTC-TGATACCAGTAGGGGTCAGAAGTGGTCCATTGATT---------------------CTTTTCCTC-TGATTC-AAG",
         "AAATTGA--AAGATCTCACTCTTTGCCAGGTAGTCCATCTAAGGGTCACATATGGATACCAGCAGGGCCT-GAAGAAGCCCATTGAAT------------------------TTTCCC-ATCTTCAAGG",
         "AAATTCATGATAGTGTCACTCTTAAATAGATGATTC--------TTCACAT---GATGCCAGCAGGGGGC-AGAGCAGGCTGTGAAAT------------------------TTTCCCTTTCTTCAAAG" ]
        
class AlignmentMappingTests( unittest.TestCase ):
    def test_largescale( self ):
       f = StringIO( eight_species_mapping )
       n, m = bx.seqmapping.alignment_mapping_from_file( f )
       t = bx.seqmapping.DNA.translate_list( rows )
       i = m.translate( t )
        
        
test_classes = [ AlignmentMappingTests, CharMappingTests, IntMappingTests ]
suite = unittest.TestSuite( [ unittest.makeSuite( c ) for c in test_classes ] )
