'''
Created on Jun 4, 2010

@author: sau
'''
import os, unittest
from erange import ReadDataset
from erange import getSNPs


class TestGetSNPs(unittest.TestCase):

    def setUp(self):
        self.rdsDNA = ReadDataset.ReadDataset("testDNARDSForUnitTests.rds", True, "DNA", verbose=True)

        uniqueInsertList = [("uniqueID1", "chr1", 10, 20, "+", 1.0, "", ""),
                            ("uniqueID2", "chr1", 100, 200, "+", 1.0, "", ""),
                            ("uniqueID3", "chr1", 1000, 2000, "+", 1.0, "", "G10A")]

        multiInsertList = [("multiID1", "chr2", 1010, 1020, "+", 0.5, "", ""),
                           ("multiID1", "chr2", 1010, 1020, "+", 0.5, "", ""),
                           ("multiID2", "chr2", 10100, 10200, "+", 0.25, "", ""),
                           ("multiID2", "chr2", 10100, 10200, "+", 0.25, "", ""),
                           ("multiID2", "chr2", 10100, 10200, "+", 0.25, "", ""),
                           ("multiID2", "chr2", 10100, 10200, "+", 0.25, "", "")]

        self.rdsDNA.insertUniqs(uniqueInsertList)
        self.rdsDNA.insertMulti(multiInsertList)
        self.rdsDNA.insertMetadata([("readsize", 100)])


    def tearDown(self):
        os.remove("./testDNARDSForUnitTests.rds")
        self.rdsDNA = None


    def testGetMatchDict(self):
        uniqueTestDict = getSNPs.getMatchDict(self.rdsDNA, "chr1", withSplices=False)

        self.assertEqual(uniqueTestDict[10][0], 20, "incorrect result for unique chr position 10")
        self.assertEqual(uniqueTestDict[100][0], 200, "incorrect result for unique chr position 100")
        self.assertEqual(uniqueTestDict[1000][0], 2000, "incorrect result for unique chr position 1000")

        self.assertRaises(KeyError, getSNPs.getMatchDict, self.rdsDNA, "chr2", withSplices=False)


    def testGetMismatchDict(self):
        mismatchDict = getSNPs.getMismatchDict(self.rdsDNA, "chr1")
        result = {1009: {"totalBaseDict": {"A-G": 1},
                         "uniqueReadCount": 1,
                         "uniqBaseDict": {"A-G": 1},
                         "back": "1000:A-G", "totalCount": 1
                         }
        }
        self.assertEquals(result, mismatchDict)


    #TODO: write unit test
    def testGetSNPs(self):
        pass


    #TODO: write unit test
    def testWriteSNPsToFile(self):
        pass


    def testDoNotProcessChromosome(self):
        self.assertFalse(getSNPs.doNotProcessChromosome(True, "chr1"))
        self.assertFalse(getSNPs.doNotProcessChromosome(False, "chr1"))
        self.assertFalse(getSNPs.doNotProcessChromosome(False, "badName"))
        self.assertTrue(getSNPs.doNotProcessChromosome(True, "badName"))
        self.assertTrue(getSNPs.doNotProcessChromosome(True, ""))


def suite():
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(TestGetSNPs))

    return suite


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()