asherkin@263: # vim: set ts=2 sw=4 tw=99 ft=python et: asherkin@263: import os asherkin@263: import os.path asherkin@263: asherkin@263: class Result: asherkin@263: def __init__(self, ok, out, err, code, timeout, message): asherkin@263: self.ok = ok asherkin@263: self.out = out asherkin@263: self.err = err asherkin@263: self.code = code asherkin@263: self.timeout = timeout asherkin@263: self.message = message asherkin@263: asherkin@263: class Test: asherkin@263: def __init__(self, path, name, type): asherkin@263: self.path = path asherkin@263: self.name = name asherkin@263: self.type = type asherkin@263: asherkin@263: def cmd(self): asherkin@263: return os.path.join(self.path, self.name + '.sp') asherkin@263: asherkin@263: def compare(self, text): asherkin@263: ok = True asherkin@263: message = None asherkin@263: with open(os.path.join(self.path, self.name + '.' + self.type), 'rt') as f: asherkin@263: text = str.replace(text, '\r', '') asherkin@263: lines = text.split('\n') asherkin@263: i = 0 asherkin@263: for line in f: asherkin@263: line = line.rstrip('\r\n') asherkin@263: if "Displaying compilation errors for" in lines[i]: asherkin@263: i += 1 asherkin@263: continue asherkin@263: if line != lines[i]: asherkin@263: message = 'Got "' + lines[i] + '", expected "' + line + '"' asherkin@263: ok = False asherkin@263: break asherkin@263: i += 1 asherkin@263: return (ok, message) asherkin@263: asherkin@263: def check(self, out, err, code, timeout): asherkin@263: if not out: asherkin@263: out = '' asherkin@263: if not err: asherkin@263: err = '' asherkin@263: if self.type == 'err': asherkin@263: if code == 0: asherkin@263: message = 'Expected failure, got success' asherkin@263: ok = False asherkin@263: else: asherkin@263: (ok, message) = self.compare(err) asherkin@263: elif self.type == 'out': asherkin@263: if code != 0: asherkin@263: message = 'Expected success, got failure (code: ' + str(code) + ')' asherkin@263: ok = False asherkin@263: else: asherkin@263: (ok, message) = self.compare(out) asherkin@263: asherkin@263: if timeout: asherkin@263: ok = False asherkin@263: message = 'timeout' asherkin@263: asherkin@263: return Result(ok, out, err, code, timeout, message)