'''
Created on Aug 27, 2010

@author: sau
'''
import unittest
import os
from erange import getfasta
#from erange import ReadDataset
from erange import ReadDataset

testDBName = "testRDS.rds"


class TestGetFasta(unittest.TestCase):


    def setUp(self):
        self.regionDict = {}
        self.minHitThresh = -1
        self.maxsize = 3000
        self.outfilename = "testFileForTestGetFasta.fa"


    def tearDown(self):
        try:
            os.remove(self.outfilename)
        except OSError:
            print "fasta file does not exist"

        try:
            os.remove(testDBName)
        except OSError:
            print "RDS file does not exist"


    def testGetDefaultRegion(self):
        self.assertEquals({}, getfasta.getDefaultRegion(self.regionDict, self.maxsize))

        regionDict = {"1": [],
                      "2": []
        }
        result = {"2": [],
                  "1": []
        }
        self.assertEquals(result, getfasta.getDefaultRegion(regionDict, self.maxsize))

        regionDict = {"1": [(10, 20, 10)],
                      "2": []
        }
        result = {"2": [],
                  "1": [{"start": 10, "length": 10, "topPos": [-1]}]
        }
        self.assertEquals(result, getfasta.getDefaultRegion(regionDict, self.maxsize))

        regionDict = {"1": [(10, 20, 10)],
                      "2": [(11, 21, 11)]
        }
        result = {"2": [{"start": 11, "length": 11, "topPos": [-1]}],
                  "1": [{"start": 10, "length": 10, "topPos": [-1]}]
        }
        self.assertEquals(result, getfasta.getDefaultRegion(regionDict, self.maxsize))

        regionDict = {"1": [(10, 20, 10), (100, 4000, 3900)],
                      "2": [(11, 21, 11)]
        }
        result = {"2": [{"start": 11, "length": 11, "topPos": [-1]}],
                  "1": [{"start": 10, "length": 10, "topPos": [-1]}]
        }
        self.assertEquals(result, getfasta.getDefaultRegion(regionDict, self.maxsize))

        regionDict = {"1": [(10, 20, 10), (100, 4000, 3900), (50, 60, 10)],
                      "2": [(11, 21, 11)]
        }
        result = {"2": [{"start": 11, "length": 11, "topPos": [-1]}],
                  "1": [{"start": 10, "length": 10, "topPos": [-1]},
                        {"start": 50, "length": 10, "topPos": [-1]}]
        }
        self.assertEquals(result, getfasta.getDefaultRegion(regionDict, self.maxsize))


    def testGetRegionUsingPeaks(self):
        self.assertEquals({}, getfasta.getRegionUsingPeaks(self.regionDict, self.minHitThresh, self.maxsize))

        regionDict = {"1": [],
                      "2": []
        }
        result = {"2": [],
                  "1": []
        }
        self.assertEquals(result, getfasta.getRegionUsingPeaks(regionDict, self.minHitThresh, self.maxsize))

        regionDict = {"1": [(10, 20, 10, 15, 1)],
                      "2": []
        }
        result = {"2": [],
                  "1": [{"start": 10, "length": 10, "topPos": [5]}]
        }
        self.assertEquals(result, getfasta.getRegionUsingPeaks(regionDict, self.minHitThresh, self.maxsize))

        result = {"2": [],
                  "1": []
        }
        self.assertEquals(result, getfasta.getRegionUsingPeaks(regionDict, 3, self.maxsize))

        regionDict = {"1": [(10, 20, 10, 15, 1)],
                      "2": [(11, 21, 11, 18, 1)]
        }
        result = {"2": [{"start": 11, "length": 11, "topPos": [7]}],
                  "1": [{"start": 10, "length": 10, "topPos": [5]}]
        }
        self.assertEquals(result, getfasta.getRegionUsingPeaks(regionDict, self.minHitThresh, self.maxsize))

        regionDict = {"1": [(10, 20, 10, 15, 1), (100, 4000, 3900, 111, 1)],
                      "2": [(11, 21, 11, 18, 1)]
        }
        result = {"2": [{"start": 11, "length": 11, "topPos": [7]}],
                  "1": [{"start": 10, "length": 10, "topPos": [5]}]
        }
        self.assertEquals(result, getfasta.getRegionUsingPeaks(regionDict, self.minHitThresh, self.maxsize))

        regionDict = {"1": [(10, 20, 10, 15, 1), (100, 4000, 3900, 111, 1), (50, 60, 10, 59, 1)],
                      "2": [(11, 21, 11, 18, 1)]
        }
        result = {"2": [{"start": 11, "length": 11, "topPos": [7]}],
                  "1": [{"start": 10, "length": 10, "topPos": [5]},
                        {"start": 50, "length": 10, "topPos": [9]}]
        }
        self.assertEquals(result, getfasta.getRegionUsingPeaks(regionDict, self.minHitThresh, self.maxsize))


    #TODO: write test.  This seems to not make sense.  We are always returning a "topPos" of range(rlen).
    # need to check to see if the issue might be with commoncode.findPeak as there is a lot of questionable
    # logic in that one
    def testGetRegionUsingRDS(self):
        rds = ReadDataset.ReadDataset(testDBName, initialize=True, datasetType="DNA", verbose=False)
        rds.insertMetadata([("readsize", "100")])
        rdsEntryList = [("testRead", "chr1", 10, 100, "+", 1.0, "", "")]
        rds.insertUniqs(rdsEntryList)
        self.assertEquals({}, getfasta.getRegionUsingRDS(self.regionDict, rds, self.minHitThresh, self.maxsize))

        regionDict = {"1": [],
                      "2": []
        }
        result = {"2": [],
                  "1": []
        }
        self.assertEquals(result, getfasta.getRegionUsingRDS(regionDict, rds, self.minHitThresh, self.maxsize))

        # Ack with a capital ACK.
        regionDict = {"1": [(1, 600, 5)],
                      "2": []
        }
        result = {"1": [{"start": 1, "length": 5, "topPos": [0, 1, 2, 3, 4]}],
                  "2": []
        }
        self.assertEquals(result, getfasta.getRegionUsingRDS(regionDict, rds, self.minHitThresh, self.maxsize))

        del(rds)


    def testWriteFastaFile(self):
        ncregions = {}
        getfasta.writeFastaFile(ncregions, "hsapiens", self.outfilename)
        for line in open(self.outfilename):
            self.assertEquals("", line)

        ncregions = {"1": [],
                     "2": []
        }
        getfasta.writeFastaFile(ncregions, "hsapiens", self.outfilename)
        for line in open(self.outfilename):
            self.assertEquals("", line)

        ncregions = {"1": [{"start": 12000, "length": 50, "topPos": [6]}],
                     "2": []
        }
        getfasta.writeFastaFile(ncregions, "hsapiens", self.outfilename)
        fastaFile = open(self.outfilename)
        self.assertEquals(">chr1:11956-12057\n", fastaFile.readline())
        self.assertEquals("tcatagtcccctggccccattaatggattctgggatagacatgaggaccaagccaggTGGGATGAGTGAGTGTGGCTTCTGGAGGAAGTGGGGACACAGGA\n", fastaFile.readline())
        self.assertEquals("", fastaFile.readline())

        ncregions = {"1": [{"start": 12000, "length": 50, "topPos": [6]}],
                     "2": [{"start": 18000, "length": 50, "topPos": [30]}]
        }
        getfasta.writeFastaFile(ncregions, "hsapiens", self.outfilename)
        fastaFile = open(self.outfilename)
        self.assertEquals(">chr1:11956-12057\n", fastaFile.readline())
        self.assertEquals("tcatagtcccctggccccattaatggattctgggatagacatgaggaccaagccaggTGGGATGAGTGAGTGTGGCTTCTGGAGGAAGTGGGGACACAGGA\n", fastaFile.readline())
        self.assertEquals(">chr2:17980-18081\n", fastaFile.readline())
        self.assertEquals("ATCATTTCAAGGATGCTTTGAGGGTAAAAAGAATGATCAATTGTGAAGCAGTGAATTGTGCTGCCAGGCACAATTCATTGGGTAATAGAAAGCTTCATTTA\n", fastaFile.readline())
        self.assertEquals("", fastaFile.readline())

        ncregions = {"1": [{"start": 12000, "length": 50, "topPos": [6, 20]}],
                     "2": [{"start": 18000, "length": 50, "topPos": [30]}]
        }
        getfasta.writeFastaFile(ncregions, "hsapiens", self.outfilename)
        fastaFile = open(self.outfilename)
        self.assertEquals(">chr1:11956-12057\n", fastaFile.readline())
        self.assertEquals("tcatagtcccctggccccattaatggattctgggatagacatgaggaccaagccaggTGGGATGAGTGAGTGTGGCTTCTGGAGGAAGTGGGGACACAGGA\n", fastaFile.readline())
        self.assertEquals(">chr2:17980-18081\n", fastaFile.readline())
        self.assertEquals("ATCATTTCAAGGATGCTTTGAGGGTAAAAAGAATGATCAATTGTGAAGCAGTGAATTGTGCTGCCAGGCACAATTCATTGGGTAATAGAAAGCTTCATTTA\n", fastaFile.readline())
        self.assertEquals("", fastaFile.readline())

        ncregions = {"1": [{"start": 12000, "length": 50, "topPos": [6]},
                           {"start": 15000, "length": 50, "topPos": [2]}
                          ],
                     "2": [{"start": 18000, "length": 50, "topPos": [30]}]
        }
        getfasta.writeFastaFile(ncregions, "hsapiens", self.outfilename)
        fastaFile = open(self.outfilename)
        self.assertEquals(">chr1:11956-12057\n", fastaFile.readline())
        self.assertEquals("tcatagtcccctggccccattaatggattctgggatagacatgaggaccaagccaggTGGGATGAGTGAGTGTGGCTTCTGGAGGAAGTGGGGACACAGGA\n", fastaFile.readline())
        self.assertEquals(">chr1:14952-15053\n", fastaFile.readline())
        self.assertEquals("AGTGAATGAGGGAAAGGGCAGGGCCCGGGACTGGGGAATCTGTAGGGTCAATGGAGGAGTTCAGAGAAGGTGCAACATTTCTGACCCCCTACAAGGTGCTT\n", fastaFile.readline())
        self.assertEquals(">chr2:17980-18081\n", fastaFile.readline())
        self.assertEquals("ATCATTTCAAGGATGCTTTGAGGGTAAAAAGAATGATCAATTGTGAAGCAGTGAATTGTGCTGCCAGGCACAATTCATTGGGTAATAGAAAGCTTCATTTA\n", fastaFile.readline())
        self.assertEquals("", fastaFile.readline())


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

    return suite


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