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