'''
Created on Aug 26, 2010

@author: sau
'''
import unittest
from erange import getSNPGeneInfo


class TestGetSNPGeneInfo(unittest.TestCase):


    def setUp(self):
        self.geneDict = {}
        self.snpDict = {}
        self.rpkmDict = {}
        self.withSense = False


    def tearDown(self):
        pass


    def testDoNotProcessLine(self):
        self.assertTrue(getSNPGeneInfo.doNotProcessLine("#anything"))
        self.assertFalse(getSNPGeneInfo.doNotProcessLine("line to process"))


    def testGetSNPGeneInfoList(self):
        geneInfoList = getSNPGeneInfo.getSNPGeneInfoList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense)
        self.assertEquals([], geneInfoList)

        badGeneDict = {"badEntry": "foo"}
        self.assertRaises(ValueError, getSNPGeneInfo.getSNPGeneInfoList, badGeneDict, self.snpDict, self.rpkmDict, self.withSense)

        self.geneDict[("gene1", "ID1")] = {"position": [("1", 1)], "sense": "+"}
        self.assertRaises(KeyError, getSNPGeneInfo.getSNPGeneInfoList, self.geneDict, self.snpDict, self.rpkmDict, self.withSense)

        self.snpDict[("1", 1)] = "chr1\tpos 1\n"
        result = [{"symbol": "gene1",
                   "rpkm": "N\\A",
                   "geneID": "ID1",
                   "snpDescription": "chr1\tpos 1" }
        ]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneInfoList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))

        self.rpkmDict["ID1"] = 300
        result = [{"symbol": "gene1",
                   "rpkm": "300",
                   "geneID": "ID1",
                   "snpDescription": "chr1\tpos 1" }
        ]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneInfoList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))

        self.geneDict[("gene1", "ID1")] = {"position": [("1", 1), ("1", 1)], "sense": "+"}
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneInfoList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))

        result = [{"symbol": "gene1",
                   "sense": "+",
                   "rpkm": "300",
                   "geneID": "ID1",
                   "snpDescription": "chr1\tpos 1" }
        ]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneInfoList(self.geneDict, self.snpDict, self.rpkmDict, True))

        self.geneDict[("gene1", "ID1")] = {"position": [("1", 1), ("1", 10)], "sense": "+"}
        self.snpDict[("1", 10)] = "chr1\tpos 10\n"
        result = [{"symbol": "gene1",
                   "rpkm": "300",
                   "geneID": "ID1",
                   "snpDescription": "chr1\tpos 10" },
                  {"symbol": "gene1",
                   "rpkm": "300",
                   "geneID": "ID1",
                   "snpDescription": "chr1\tpos 1" }
        ]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneInfoList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))


    #TODO: write test
    def testGetSNPGeneInfo(self):
        pass


    def testGetSNPGeneOutputList(self):
        geneOutputList = getSNPGeneInfo.getSNPGeneOutputList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense)
        self.assertEquals([], geneOutputList)

        badGeneDict = {"badEntry": "foo"}
        self.assertRaises(ValueError, getSNPGeneInfo.getSNPGeneOutputList, badGeneDict, self.snpDict, self.rpkmDict, self.withSense)

        self.geneDict[("gene1", "ID1")] = {"position": [("1", 1)], "sense": "+"}
        self.assertRaises(KeyError, getSNPGeneInfo.getSNPGeneOutputList, self.geneDict, self.snpDict, self.rpkmDict, self.withSense)

        self.snpDict[("1", 1)] = "chr1\tpos 1\n"
        result = ["chr1\tpos 1\tgene1\tID1\tN\\A"]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneOutputList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))

        self.rpkmDict["ID1"] = 300
        result = ["chr1\tpos 1\tgene1\tID1\t300"]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneOutputList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))

        self.geneDict[("gene1", "ID1")] = {"position": [("1", 1), ("1", 1)], "sense": "+"}
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneOutputList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))

        result = ["chr1\tpos 1\tgene1\tID1\t300\t+"]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneOutputList(self.geneDict, self.snpDict, self.rpkmDict, True))

        self.geneDict[("gene1", "ID1")] = {"position": [("1", 1), ("1", 10)], "sense": "+"}
        self.snpDict[("1", 10)] = "chr1\tpos 10\n"
        result = ["chr1\tpos 10\tgene1\tID1\t300",
                  "chr1\tpos 1\tgene1\tID1\t300"
        ]
        self.assertEquals(result, getSNPGeneInfo.getSNPGeneOutputList(self.geneDict, self.snpDict, self.rpkmDict, self.withSense))


    #TODO: write test
    def testWriteSNPGeneInfo(self):
        pass


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

    return suite


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