'''
Created on Sep 15, 2010

@author: sau
'''
import unittest
import os
from erange.chiapet import markLinkers


class TestMarkLinkers(unittest.TestCase):
    linkerFileName = "/Users/sau/Eclipse/erange/source/Erange/chiapet/linkers.fa"
    inFileName = "linkerTestIn.txt"
    outFileName = "linkerTestOut.txt"

    def setUp(self):
        infile = open(self.inFileName, "w")
        infile.close()


    def tearDown(self):
        try:
            os.remove(self.inFileName)
        except OSError:
            pass

        try:
            os.remove(self.outFileName)
        except OSError:
            pass


    def testMarkLinkers(self):
        markLinkers.markLinkers(self.linkerFileName, self.inFileName, self.outFileName)
        output = open(self.outFileName)
        for line in output:
            self.assertEquals("", line)

        output.close()
        os.remove(self.outFileName)

        infile = open(self.inFileName, "w")
        print >> infile, ""
        print >> infile, "@Linker1"
        print >> infile, "........................GTTGGATAAGATATCGCGG....."
        print >> infile, "@NoLinker"
        print >> infile, "GATTACA.GATTACA.GATTACA.GATTACA.GATTACA.GATTACA."
        print >> infile, "@Linker2"
        print >> infile, "........................GTTGGAATGTATATCGCGG....."
        print >> infile, "@Linker1Short"
        print >> infile, "..............GTTGGAATGTATATCGCGG..............."
        print >> infile, "@Linker2Short"
        print >> infile, "..............GTTGGAATGTATATCGCGG..............."
        infile.close()

        markLinkers.markLinkers(self.linkerFileName, self.inFileName, self.outFileName)
        output = open(self.outFileName)
        self.assertEquals(">L1_Linker1\n", output.readline())
        self.assertEquals("....................\n", output.readline())
        self.assertEquals(">NA_NoLinker\n", output.readline())
        self.assertEquals("GATTACA.GATTACA.GATT\n", output.readline())
        self.assertEquals(">NA_NoLinker\n", output.readline())
        self.assertEquals("GATTACA.GATTACA.GATT\n", output.readline())
        self.assertEquals(">NA_Linker2\n", output.readline())
        self.assertEquals("....................\n", output.readline())
        self.assertEquals(">L2_Linker2\n", output.readline())
        self.assertEquals("....................\n", output.readline())
        self.assertEquals(">NA_Linker1Short\n", output.readline())
        self.assertEquals("..............GTTGGA\n", output.readline())
        self.assertEquals(">NA_Linker1Short\n", output.readline())
        self.assertEquals("..............GTTGGA\n", output.readline())
        self.assertEquals(">NA_Linker2Short\n", output.readline())
        self.assertEquals("..............GTTGGA\n", output.readline())
        self.assertEquals(">NA_Linker2Short\n", output.readline())
        self.assertEquals("..............GTTGGA\n", output.readline())

        output.close()
        #TODO: Check that we really do want to output the same line
        #multiple times in the case where neither linker is detected.
        #See if downstream there is a real reason for doing it this way
        #or if it was handled as a bug introduced at this stage of the
        #analysis.


    def testGetLinkerInformation(self):
        linkerDict, linkerList = markLinkers.getLinkerInformation([])
        resultDict = {}
        resultList = []
        self.assertEquals(resultDict, linkerDict)
        self.assertEquals(resultList, linkerList)

        linkerData = [">linker_b.1",
                      "GTTGGATAAGATATCGCGG",
                      ">linker_b.2",
                      "GTTGGAATGTATATCGCGG"
        ]
        linkerDict, linkerList = markLinkers.getLinkerInformation(linkerData)
        resultDict = {"linker_b.1": "GTTGGATAAG",
                      "linker_b.2": "GTTGGAATGT"
        }
        resultList = ["linker_b.1", "linker_b.2"]
        self.assertEquals(resultDict, linkerDict)
        self.assertEquals(resultList, linkerList)


    def testGetLinkerInformationFromFile(self):
        linkerDict, linkerList = markLinkers.getLinkerInformationFromFile("bad file name")
        resultDict = {}
        resultList = []
        self.assertEquals(resultDict, linkerDict)
        self.assertEquals(resultList, linkerList)

        linkerDict, linkerList = markLinkers.getLinkerInformationFromFile(self.linkerFileName)
        resultDict = {"linker_b.1": "GTTGGATAAG",
                      "linker_b.2": "GTTGGAATGT"
        }
        resultList = ["linker_b.1", "linker_b.2"]
        self.assertEquals(resultDict, linkerDict)
        self.assertEquals(resultList, linkerList)


    def testMain(self):
        argv = ["markLinkers", self.linkerFileName, self.inFileName, self.outFileName]
        markLinkers.main(argv)
        output = open(self.outFileName)
        for line in output:
            self.assertEquals("", line)

        output.close()
        os.remove(self.outFileName)


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

    return suite


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