packages feed

liquidhaskell-0.8.0.2: tests/regrtest.py

#!/usr/bin/python
# Copyright (c) 2009 The Regents of the University of California. All rights reserved.
#
# Permission is hereby granted, without written agreement and without
# license or royalty fees, to use, copy, modify, and distribute this
# software and its documentation for any purpose, provided that the
# above copyright notice and the following two paragraphs appear in
# all copies of this software.
#
# IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
# IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.
#
# THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
# ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION
# TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

import time, subprocess, optparse, sys, socket, os
sys.path.append("../")
import rtest as rtest

solve         = "liquid ".split()
null          = open("/dev/null", "w")
now	          = (time.asctime(time.localtime(time.time()))).replace(" ","_")
logfile       = "../tests/logs/regrtest_results_%s_%s" % (socket.gethostname (), now)
argcomment    = "--! run with "
liquidcomment = "{--! run liquid with "
endcomment    = "-}"

def logged_sys_call(args, out=None, err=None, dir=None):
  print "exec: " + " ".join(args)
  return subprocess.call(args, stdout=out, stderr=err, cwd=dir)
 
def solve_quals(dir,file,bare,time,quiet,flags,lflags):
  if quiet: out = null
  else: out = None
  if time: time = ["time"]
  else: time = []
  if lflags: lflags = ["--" + f for f in lflags]
  hygiene_flags = []
  (dn, bn) = os.path.split(file)
  try:
    os.makedirs(os.path.join(dir,dn,".liquid"))
  except OSError:
    pass
  out = open(os.path.join(dir,dn,".liquid",bn) + ".log", "w")
  rv  = logged_sys_call(time + solve + flags + lflags + hygiene_flags + [file],
                        out=None, err=subprocess.STDOUT, dir=dir)
  out.close()
  return rv

def run_script(file,quiet):
  if quiet: out = null
  else: out = None
  return logged_sys_call(file, out)

def getfileargs(file):
  f = open(file)
  l = f.readline()
  f.close()
  if l.startswith(argcomment):
    return l[len(argcomment):].strip().split(" ")
  else:
    return []

def getliquidargs(file):
  f = open(file)
  l = f.readline()
  f.close()
  if l.startswith(liquidcomment):
    return [arg for arg in l[len(liquidcomment):].strip().split(" ")
                     if arg!=endcomment]
  else:
    return []


class Config (rtest.TestConfig):
  def __init__ (self, dargs, testdirs, logfile, threadcount):
    rtest.TestConfig.__init__ (self, testdirs, logfile, threadcount)
    self.dargs = dargs

  def run_test (self, dir, file):
    path = os.path.join(dir,file)
    if self.is_test(file):
      lflags = getliquidargs(path)
      fargs  = getfileargs(path)
      fargs  = self.dargs + fargs  
      return solve_quals(dir, file, True, False, True, fargs, lflags)
    elif file.endswith(".sh"):
      return run_script(path, True)

  def is_test (self, file):
    return file.endswith(".hs") # or file.endswith(".lhs")

#####################################################################################

#DEFAULT

textIgnored = { "Data/Text/Axioms.hs"
              , "Data/Text/Encoding/Error.hs"
              , "Data/Text/Encoding/Fusion.hs"
              , "Data/Text/Encoding/Fusion/Common.hs"
              , "Data/Text/Encoding/Utf16.hs"
              , "Data/Text/Encoding/Utf32.hs"
              , "Data/Text/Encoding/Utf8.hs"
              , "Data/Text/Fusion/CaseMapping.hs"
              , "Data/Text/Fusion/Common.hs"
              , "Data/Text/Fusion/Internal.hs"
              , "Data/Text/IO.hs"
              , "Data/Text/IO/Internal.hs"
              , "Data/Text/Lazy/Builder/Functions.hs"
              , "Data/Text/Lazy/Builder/Int.hs"
              , "Data/Text/Lazy/Builder/Int/Digits.hs"
              , "Data/Text/Lazy/Builder/Internal.hs"
              , "Data/Text/Lazy/Builder/RealFloat.hs"
              , "Data/Text/Lazy/Builder/RealFloat/Functions.hs"
              , "Data/Text/Lazy/Encoding/Fusion.hs"
              , "Data/Text/Lazy/IO.hs"
              , "Data/Text/Lazy/Read.hs"
              , "Data/Text/Read.hs"
              , "Data/Text/Unsafe/Base.hs"
              , "Data/Text/UnsafeShift.hs"
              , "Data/Text/Util.hs"
              }

demosIgnored = { "Composition.hs"
               , "Eval.hs"
               , "Inductive.hs"
               , "Loop.hs"
               , "TalkingAboutSets.hs"
               , "refinements101reax.hs"
               }

regtestdirs  = [ ("pos", {}, 0)
               , ("neg", {}, 1)
               , ("crash", {}, 2)
               , ("parser/pos", {}, 0)
               , ("error_messages/pos", {}, 0)
               , ("error_messages/crash", {}, 2)
               ]

benchtestdirs = [ ("../web/demos", demosIgnored, 0)
                , ("../benchmarks/esop2013-submission", {"Base0.hs"}, 0)
                , ("../benchmarks/bytestring-0.9.2.1", {}, 0)
                , ("../benchmarks/text-0.11.2.3", textIgnored, 0)
                , ("../benchmarks/vector-algorithms-0.5.4.2", {}, 0)
                , ("../benchmarks/hscolour-1.20.0.0", {}, 0)
                ]

parser = optparse.OptionParser()
parser.add_option("-a", "--all", action="store_true", dest="alltests", help="run all tests")
parser.add_option("-t", "--threads", dest="threadcount", default=1, type=int, help="spawn n threads")
parser.add_option("-o", "--opts", dest="opts", default=[], action='append', type=str, help="additional arguments to liquid")
parser.disable_interspersed_args()
options, args = parser.parse_args()

print "options =", options
print "args =", args

def testdirs():
  global testdirs
  if options.alltests:
    return regtestdirs + benchtestdirs
  else:
    return regtestdirs

testdirs = testdirs()

clean = os.path.abspath("../cleanup")
[os.system(("cd %s; %s; cd ../" % (d,clean))) for (d,_,_) in testdirs]
runner = rtest.TestRunner (Config (options.opts, testdirs, logfile, options.threadcount))
sys.exit(runner.run())