'''
Created on Sep 15, 2010

@author: sau
'''
import unittest
import os
from erange.rnapath import processvelvet


class TestProcessVelvet(unittest.TestCase):
    inFileName = "testProcessVelvetIn.txt"
    filterFileName = "testProcessVelvetFilter.txt"
    outFileName = "testProcessVelvetOut.txt"


    def setUp(self):
        infile = open(self.inFileName, "w")
        infile.close()
        filter = open(self.filterFileName, "w")
        filter.write("0\t1\t2\t3\t4\t5\t6\t7\t8\tNODE1-1_0\n")
        filter.close()


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

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

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


    def testProcessVelvet(self):
        processvelvet.processvelvet(self.inFileName, self.outFileName)
        outfile = open(self.outFileName)
        for line in outfile:
            self.assertEquals("", line)

        os.remove(self.outFileName)

        infile = open(self.inFileName, "w")
        print >> infile, ">NODE1-1_0"
        print >> infile, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
        infile.close()

        processvelvet.processvelvet(self.inFileName, self.outFileName)
        outfile = open(self.outFileName)
        self.assertEquals(">chr0\n", outfile.readline())
        self.assertEquals("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n", outfile.readline())
        self.assertEquals("", outfile.readline())
        outfile.close()
        os.remove(self.outFileName)
        processvelvet.processvelvet(self.inFileName, self.outFileName, filterFileName=self.filterFileName)
        outfile = open(self.outFileName)
        self.assertEquals("", outfile.readline())
        outfile.close()
        os.remove(self.outFileName)

        infile = open(self.inFileName, "w")
        print >> infile, ">NODE1-1_1"
        print >> infile, "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"
        print >> infile, ">NODE1-1_0"
        print >> infile, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
        infile.close()

        processvelvet.processvelvet(self.inFileName, self.outFileName)
        outfile = open(self.outFileName)
        self.assertEquals(">chr1\n", outfile.readline())
        self.assertEquals("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n", outfile.readline())
        self.assertEquals(">chr0\n", outfile.readline())
        self.assertEquals("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n", outfile.readline())
        self.assertEquals("", outfile.readline())
        outfile.close()
        os.remove(self.outFileName)
        processvelvet.processvelvet(self.inFileName, self.outFileName, filterFileName=self.filterFileName)
        outfile = open(self.outFileName)
        self.assertEquals(">chr1\n", outfile.readline())
        self.assertEquals("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n", outfile.readline())
        self.assertEquals("", outfile.readline())
        outfile.close()
        os.remove(self.outFileName)

        infile = open(self.inFileName, "w")
        print >> infile, ">NODE1-1_1"
        print >> infile, "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"
        print >> infile, ">NODE1-1_0"
        print >> infile, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
        print >> infile, ">NODE1-1_2"
        print >> infile, "GATTACA"
        infile.close()

        processvelvet.processvelvet(self.inFileName, self.outFileName)
        outfile = open(self.outFileName)
        self.assertEquals(">chr1\n", outfile.readline())
        self.assertEquals("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n", outfile.readline())
        self.assertEquals(">chr0\n", outfile.readline())
        self.assertEquals("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n", outfile.readline())
        self.assertEquals(">chr2\n", outfile.readline())
        self.assertEquals("GATTACA\n", outfile.readline())
        self.assertEquals("", outfile.readline())
        outfile.close()
        os.remove(self.outFileName)
        processvelvet.processvelvet(self.inFileName, self.outFileName, filterFileName=self.filterFileName)
        outfile = open(self.outFileName)
        self.assertEquals(">chr1\n", outfile.readline())
        self.assertEquals("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n", outfile.readline())
        self.assertEquals(">chr2\n", outfile.readline())
        self.assertEquals("GATTACA\n", outfile.readline())
        self.assertEquals("", outfile.readline())
        outfile.close()
        os.remove(self.outFileName)
        processvelvet.processvelvet(self.inFileName, self.outFileName, filterFileName=self.filterFileName, minSize=10)
        outfile = open(self.outFileName)
        self.assertEquals(">chr1\n", outfile.readline())
        self.assertEquals("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n", outfile.readline())
        self.assertEquals("", outfile.readline())
        outfile.close()


    def testGetFilterList(self):
        self.assertEquals([], processvelvet.getFilterList())
        self.assertEquals(["NODE1-1_0"], processvelvet.getFilterList(self.filterFileName))
        self.assertEquals([], processvelvet.getFilterList("whatfile?"))

        filter = open(self.filterFileName, "a")
        filter.write("some fields without the key trigger string\n")
        filter.close()
        self.assertEquals(["NODE1-1_0"], processvelvet.getFilterList(self.filterFileName))

        filter = open(self.filterFileName, "a")
        filter.write("0\t1\t2\t3\t4\t5\t6\t7\t8\tNODEAnything\n")
        filter.close()
        self.assertEquals(["NODE1-1_0", "NODEAnything"], processvelvet.getFilterList(self.filterFileName))

        filter = open(self.filterFileName, "a")
        filter.write("0\tNODEWrongField\n")
        filter.close()
        self.assertEquals(["NODE1-1_0", "NODEAnything"], processvelvet.getFilterList(self.filterFileName))

        filter = open(self.filterFileName, "a")
        filter.write("0\t1\t2\t3\t4\t5\t6\t7\t8\tNODEAnything\n")
        filter.close()
        self.assertEquals(["NODE1-1_0", "NODEAnything"], processvelvet.getFilterList(self.filterFileName))


    def testWriteNode(self):
        node = {"contigPrefix": "chr",
                "completeID": "",
                "currentSeq": ""
        }

        counts = {"acceptedSize": 0,
                  "nSize": 0,
                  "contigsAccepted": 0,
                  "filteredSize": 0
        }

        filterList = []

        outfile = open(self.outFileName, "w")
        processvelvet.writeNode(outfile, node, filterList, counts, minSize=0, keepCoverage=False)
        outfile.close()
        results = open(self.outFileName)
        self.assertEquals("", results.readline())
        results.close()
        os.remove(self.outFileName)

        node["completeID"] = "<5"
        node["currentSeq"] = "GATTACA\n"
        outfile = open(self.outFileName, "w")
        processvelvet.writeNode(outfile, node, filterList, counts, minSize=0, keepCoverage=False)
        self.assertEquals(counts["filteredSize"], 7)
        counts["filteredSize"] = 0
        outfile.close()
        results = open(self.outFileName)
        self.assertEquals("", results.readline())
        results.close()
        os.remove(self.outFileName)

        node["completeID"] = "NODE1_1"
        node["currentSeq"] = "GATTACA\n"
        filterList = ["NODE1_1"]
        outfile = open(self.outFileName, "w")
        processvelvet.writeNode(outfile, node, filterList, counts, minSize=0, keepCoverage=False)
        self.assertEquals(counts["filteredSize"], 7)
        counts["filteredSize"] = 0
        outfile.close()
        results = open(self.outFileName)
        self.assertEquals("", results.readline())
        results.close()
        os.remove(self.outFileName)

        node["completeID"] = "NODE1_1"
        node["currentSeq"] = "GATTACA\n"
        filterList = []
        outfile = open(self.outFileName, "w")
        processvelvet.writeNode(outfile, node, filterList, counts, minSize=0, keepCoverage=False)
        self.assertEquals(counts["acceptedSize"], 7)
        outfile.close()
        results = open(self.outFileName)
        self.assertEquals(">chr1\n", results.readline())
        self.assertEquals("GATTACA\n", results.readline())
        self.assertEquals("", results.readline())
        results.close()
        os.remove(self.outFileName)


    def testMain(self):
        argv = ["processVelvet", self.inFileName, self.outFileName]
        processvelvet.main(argv)
        outfile = open(self.outFileName)
        for line in outfile:
            self.assertEquals("", line)

        os.remove(self.outFileName)


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

    return suite


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