opbtest/opbtest/opbtestmockable.py

120 lines
4.2 KiB
Python

class OpbTestMockable():
def __init__(self, case, filename):
self.case = case
self.filename = filename
self.prepender = []
self.replacers = {}
self.inputs = {}
self.proctotest = ""
self.appender = ["\nopbtestquitfn: output sD, FF\n"]
def testproc(self, procname):
self.proctotest = procname
return self
def testfunc(self, funcname):
return self.testproc(funcname)
def setregs(self, regmap):
for key, val in regmap.items():
self.prepender.append("load " + key + ", " + str(val) + "\n")
return self
def replace(self, statement1, statement2):
self.replacers[statement1] = statement2
return self
def mockproc(self, procname):
return self.replace("call " + procname, "load s0, s0")
def mockinput(self, port, value):
self.inputs[port] = value
return self
def execute(self):
with open(self.filename, 'r') as original:
data = original.readlines()
def find_line_between(data, statement1, statement2):
linenr = 0
startcounting = False
for line in data:
if statement1 in line:
startcounting = True
if startcounting and statement2 in line:
break
linenr += 1
if linenr + 1 == len(data):
self.case.fail("No statements between " + statement1 + " and " + statement2 + " found")
return linenr
def find_last_closing_bracket(data, procname):
procname += "(" # add (, could also have been a call
linenr = 0
startcounting = False
amount_of_brackets_open = 0
for line in data:
if procname in line:
startcounting = True
if startcounting:
if '}' in line:
amount_of_brackets_open -= 1
elif '{' in line:
amount_of_brackets_open += 1
if amount_of_brackets_open == 0:
break
linenr += 1
if linenr + 1 == len(data):
self.case.fail("Proc " + procname + ": no ending bracket } found")
return linenr
def setupproc(data):
self.prepender.append("jump " + self.proctotest + "\n")
linenr = find_last_closing_bracket(data, self.proctotest)
data = data[0:linenr] + ["jump opbtestquitfn\n"] + data[linenr:]
return data
def setupinputs(data):
newdata = []
for line in data:
if line.startswith("input "):
found = False
for key, value in self.inputs.items():
if ", " + str(key) in line or "," + str(key) in line:
newdata.append(line.split(",")[0].replace("input", "load") + ", " + str(value) + "\n")
found = True
if found is False:
newdata.append(line)
else:
newdata.append(line)
return newdata
def setupreplaces(data):
newdata = []
for line in data:
found = False
for key, value in self.replacers.items():
if line.upper().replace(" ", "").replace("\t", "").startswith(key.upper().replace(" ", "")):
newdata.append(value + "\n")
found = True
if found is False:
newdata.append(line)
return newdata
if len(self.proctotest) > 0:
data = setupproc(data)
if len(self.inputs) > 0:
data = setupinputs(data)
if len(self.replacers) > 0:
data = setupreplaces(data)
firstjump = find_line_between(data, "jump", "jump")
data = data[0:firstjump] + self.prepender + data[firstjump:] + self.appender
with open(self.filename, 'w') as modified:
modified.writelines(data)
return self.case.execute_file(self.filename)