def testDel(string, i, c):
    fm = fmindex.createFM(string)
    before = fm.bwt
    fm.delBase(i)
    afterString = string[:i] + c + string[i:]
    afterfm = fmindex.FMindex(afterString)

    if afterfm.bwt == fm.bwt:
        output.extend(["PASS: "******" " + n.format(str(i))])
    else:
        output.extend(["FAIL: " + c + " " + n.format(str(i))])
    return fm
def main():
    string = sys.argv[1]
    if '$' in string:
        print "Don't include $ in genome"
        sys.exit(0)
    fm = fmindex.createFM(string)
    if fm.getInverse() != string:
        print "LF function does not correctly inverse BWT. Not equal", string, fm.getInverse()
        sys.exit(0)
    if len(sys.argv) == 4:
        fm = testIns(string, int(sys.argv[3]), sys.argv[2])
    else:
        stressTest(string)
def stressTest(string):
    numCorrect = 0
    numTotal = 0
    for i in range(0, len(string) - 1):
        for c in "ACGT":
            fm = fmindex.createFM(string)
            afterString = string[:i] + string[: i + 1]
            afterfm = fmindex.FMindex(afterString)
            fm = testDel(string, i, c)
            if afterfm.bwt == fm.bwt:
                numCorrect += 1
            numTotal += 1
    print "\n".join(output)
    print string
    print numCorrect, "PASS;", numTotal - numCorrect, "FAIL;", "SCORE:", float(numCorrect) / float(numTotal) * 100
def stressTest(string): 
    numCorrect = 0
    numTotal = 0
    for i in range(0, len(string)):
        for c in "ACGT":
            fm = fmindex.createFM(string)
#            print "Testing i =", i, ", c =,", c
#            print "Before: T =", string +'$ ', "BWT =", fm.bwt
            afterString = string[:i] + c + string[i:]
            afterfm = fmindex.FMindex(afterString)
            fm = testIns(string, i, c)
            if afterfm.bwt == fm.bwt:
                numCorrect+=1
            numTotal+=1
    print '\n'.join(output)
    print string
    print  numCorrect,"PASS;",numTotal-numCorrect,"FAIL;","SCORE:",float(numCorrect)/float(numTotal)*100
def testIns(string, i, c):
    fm = fmindex.createFM(string)
    before = fm.bwt
    fm.insBase(i, c)
    afterString = string[:i] + c + string[i:]
    afterfm = fmindex.FMindex(afterString)
    
    if afterfm.bwt == fm.bwt:
        output.extend(["PASS: "******" " + n.format(str(i))])
    else:
        output.extend(["FAIL: " + c + " " + n.format(str(i))])
    '''print "Correct result:", afterfm.bwt
    print "Actual results:", fm.bwt
    print " Actual | Correct"
    for j in range(len(afterfm.bwt)):
        correctResults=' '.join([str(afterfm.sa[j]),str(afterfm.isa[j]), sorted(afterfm.bwt)[j], afterfm.bwt[j]])
        if j >= len(fm.bwt):
            actualResults = "         |"
        else:
            actualResults=' '.join([str(fm.sa[j]),str(fm.isa[j]),sorted(fm.bwt)[j],fm.bwt[j], "|"])
        print actualResults, correctResults
    '''
    return fm
	def setTemplate(self, genome):
		self.fm = fmindex.createFM(genome) #also fm.count, fm.occ, fm.sa
	def __init__(self, genome):
		self.fm = fmindex.createFM(genome)