11ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik#!/usr/bin/env python
21ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
31ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik#
41ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik# This is the MS subset of the W3C test suite for XML Schemas.
51ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik# This file is generated from the MS W3c test suite description file.
61ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik#
71ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
81ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikimport sys, os
91ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikimport exceptions, optparse
101ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikimport libxml2
111ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
121ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa = optparse.OptionParser()
131ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
141ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("-b", "--base", action="store", type="string", dest="baseDir",
151ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default="",
161ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="""The base directory; i.e. the parent folder of the
171ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   "nisttest", "suntest" and "msxsdtest" directories.""")
181ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
191ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("-o", "--out", action="store", type="string", dest="logFile",
201ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default="test.log",
211ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="The filepath of the log file to be created")
221ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
231ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--log", action="store_true", dest="enableLog",
241ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default=False,
251ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Create the log file")
261ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
271ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--no-test-out", action="store_true", dest="disableTestStdOut",
281ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default=False,
291ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Don't output test results")
301ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
311ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("-s", "--silent", action="store_true", dest="silent", default=False,
321ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Disables display of all tests")
331ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
341ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("-v", "--verbose", action="store_true", dest="verbose",
351ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default=False,
361ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Displays all tests (only if --silent is not set)")
371ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
381ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("-x", "--max", type="int", dest="maxTestCount",
391ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default="-1",
401ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="The maximum number of tests to be run")
411ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
421ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("-t", "--test", type="string", dest="singleTest",
431ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default=None,
441ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Runs the specified test only")
451ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
461ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--tsw", "--test-starts-with", type="string", dest="testStartsWith",
471ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default=None,
481ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Runs the specified test(s), starting with the given string")
491ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
501ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--rieo", "--report-internal-errors-only", action="store_true",
511ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   dest="reportInternalErrOnly", default=False,
521ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Display erroneous tests of type 'internal' only")
531ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
541ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--rueo", "--report-unimplemented-errors-only", action="store_true",
551ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   dest="reportUnimplErrOnly", default=False,
561ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Display erroneous tests of type 'unimplemented' only")
571ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
581ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--rmleo", "--report-mem-leak-errors-only", action="store_true",
591ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   dest="reportMemLeakErrOnly", default=False,
601ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Display erroneous tests of type 'memory leak' only")
611ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
621ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("-c", "--combines", type="string", dest="combines",
631ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default=None,
641ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Combines to be run (all if omitted)")
651ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
661ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--csw", "--csw", type="string", dest="combineStartsWith",
671ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   default=None,
681ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Combines to be run (all if omitted)")
691ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
701ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--rc", "--report-combines", action="store_true",
711ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   dest="reportCombines", default=False,
721ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Display combine reports")
731ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
741ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--rec", "--report-err-combines", action="store_true",
751ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   dest="reportErrCombines", default=False,
761ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Display erroneous combine reports only")
771ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
781ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--debug", action="store_true",
791ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   dest="debugEnabled", default=False,
801ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Displays debug messages")
811ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
821ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikopa.add_option("--info", action="store_true",
831ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   dest="info", default=False,
841ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			   help="Displays info on the suite only. Does not run any test.")
8584a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcikopa.add_option("--sax", action="store_true",
8684a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			   dest="validationSAX", default=False,
8784a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			   help="Use SAX2-driven validation.")
8884a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcikopa.add_option("--tn", action="store_true",
8984a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			   dest="displayTestName", default=False,
9084a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			   help="Display the test name in every case.")
911ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
921ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik(options, args) = opa.parse_args()
931ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
941ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikif options.combines is not None:
951ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	options.combines = options.combines.split()
961ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
971ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik################################################
981ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik# The vars below are not intended to be changed.
991ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik#
1001ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1011ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikmsgSchemaNotValidButShould =  "The schema should be valid."
1021ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikmsgSchemaValidButShouldNot = "The schema should be invalid."
1031ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikmsgInstanceNotValidButShould = "The instance should be valid."
1041ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikmsgInstanceValidButShouldNot = "The instance should be invalid."
1051ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikvendorNIST = "NIST"
1061ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikvendorNIST_2 = "NIST-2"
1071ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikvendorSUN  = "SUN"
1081ace20342ac2992b021d3db1bf64b394320a706cKasimier T. BuchcikvendorMS   = "MS"
1091ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1101ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik###################
1111ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik# Helper functions.
1121ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik#
1131ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikvendor = None
1141ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1151ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikdef handleError(test, msg):
1161ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	global options
1171ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	if not options.silent:
1181ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		test.addLibLog("'%s'   LIB: %s" % (test.name, msg))
1191ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	if msg.find("Unimplemented") > -1:
1201ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		test.failUnimplemented()
1211ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	elif msg.find("Internal") > -1:
1221ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		test.failInternal()
1231ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1241ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1251ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikdef fixFileNames(fileName):
1261ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	if (fileName is None) or (fileName == ""):
1271ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		return ""
1281ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	dirs = fileName.split("/")
1291ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	if dirs[1] != "Tests":
1301ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		fileName = os.path.join(".", "Tests")
1311ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		for dir in dirs[1:]:
1321ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			fileName = os.path.join(fileName, dir)
1331ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	return fileName
1341ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1351ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikclass XSTCTestGroup:
1361ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def __init__(self, name, schemaFileName, descr):
1371ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global vendor, vendorNIST_2
1381ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.name = name
1391ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.descr = descr
1401ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.mainSchema = True
1411ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.schemaFileName = fixFileNames(schemaFileName)
1421ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.schemaParsed = False
1431ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.schemaTried = False
1441ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1451ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def setSchema(self, schemaFileName, parsed):
1461ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not self.mainSchema:
1471ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			return
1481ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.mainSchema = False
1491ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.schemaParsed = parsed
1501ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.schemaTried = True
1511ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1521ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikclass XSTCTestCase:
1531ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1541ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		   # <!-- groupName, Name, Accepted, File, Val, Descr
1551ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def __init__(self, isSchema, groupName, name, accepted, file, val, descr):
1561ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
1571ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
1581ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# Constructor.
1591ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
1601ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.testRunner = None
1611ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.isSchema = isSchema
1621ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.groupName = groupName
1631ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.name = name
1641ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.accepted = accepted
1651ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.fileName = fixFileNames(file)
1661ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.val = val
1671ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.descr = descr
1681ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = False
1691ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.combineName = None
1701ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1711ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.log = []
1721ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.libLog = []
1731ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.initialMemUsed = 0
1741ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.memLeak = 0
1751ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.excepted = False
1761ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.bad = False
1771ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.unimplemented = False
1781ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.internalErr = False
1791ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.noSchemaErr = False
1801ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = False
1811ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
1821ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# Init the log.
1831ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
1841ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
1851ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if self.descr is not None:
1861ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.log.append("'%s'   descr: %s\n" % (self.name, self.descr))
1871ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s'   exp validity: %d\n" % (self.name, self.val))
1881ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
1891ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def initTest(self, runner):
1901ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global vendorNIST, vendorSUN, vendorMS, vendorNIST_2, options, vendor
1911ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
1921ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# Get the test-group.
1931ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
1941ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.runner = runner
1951ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.group = runner.getGroup(self.groupName)
1961ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if vendor == vendorMS or vendor == vendorSUN:
1971ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
1981ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# Use the last given directory for the combine name.
1991ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
2001ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			dirs = self.fileName.split("/")
2011ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.combineName = dirs[len(dirs) -2]
2021ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		elif vendor == vendorNIST:
2031ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
2041ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# NIST files are named in the following form:
2051ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# "NISTSchema-short-pattern-1.xsd"
2061ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
2071ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			tokens = self.name.split("-")
2081ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.combineName = tokens[1]
2091ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		elif vendor == vendorNIST_2:
2101ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
2111ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# Group-names have the form: "atomic-normalizedString-length-1"
2121ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
2131ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			tokens = self.groupName.split("-")
2141ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.combineName = "%s-%s" % (tokens[0], tokens[1])
2151ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		else:
2161ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.combineName = "unkown"
2171ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			raise Exception("Could not compute the combine name of a test.")
2181ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if (not options.silent) and (self.group.descr is not None):
2191ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s'   group-descr: %s\n" % (self.name, self.group.descr))
2201ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2211ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2221ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def addLibLog(self, msg):
2231ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		"""This one is intended to be used by the error handler
2241ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		function"""
2251ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2261ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
2271ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.libLog.append(msg)
2281ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2291ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def fail(self, msg):
2301ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2311ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = True
2321ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
2331ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s' ( FAILED: %s\n" % (self.name, msg))
2341ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2351ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def failNoSchema(self):
2361ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2371ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = True
2381ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.noSchemaErr = True
2391ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
2401ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s' X NO-SCHEMA\n" % (self.name))
2411ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2421ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def failInternal(self):
2431ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2441ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = True
2451ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.internalErr = True
2461ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
2471ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s' * INTERNAL\n" % self.name)
2481ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2491ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def failUnimplemented(self):
2501ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2511ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = True
2521ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.unimplemented = True
2531ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
2541ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s' ? UNIMPLEMENTED\n" % self.name)
2551ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2561ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def failCritical(self, msg):
2571ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2581ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = True
2591ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.bad = True
2601ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
2611ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s' ! BAD: %s\n" % (self.name, msg))
2621ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2631ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def failExcept(self, e):
2641ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2651ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.failed = True
2661ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.excepted = True
2671ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
2681ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.append("'%s' # EXCEPTION: %s\n" % (self.name, e.__str__()))
2691ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2701ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def setUp(self):
2711ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
2721ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# Set up Libxml2.
2731ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
2741ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.initialMemUsed = libxml2.debugMemory(1)
2751ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		libxml2.initParser()
2761ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		libxml2.lineNumbersDefault(1)
2771ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		libxml2.registerErrorHandler(handleError, self)
2781ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2791ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def tearDown(self):
2801ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		libxml2.schemaCleanupTypes()
2811ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		libxml2.cleanupParser()
2821ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.memLeak = libxml2.debugMemory(1) - self.initialMemUsed
2831ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2841ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def isIOError(self, file, docType):
2851ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		err = None
2861ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		try:
2871ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			err = libxml2.lastError()
2881ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		except:
2891ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# Suppress exceptions.
2901ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			pass
2911ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if (err is None):
2921ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			return False
2931ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if err.domain() == libxml2.XML_FROM_IO:
2941ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.failCritical("failed to access the %s resource '%s'\n" % (docType, file))
2951ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
2961ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def debugMsg(self, msg):
2971ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
2981ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if options.debugEnabled:
2991ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			sys.stdout.write("'%s'   DEBUG: %s\n" % (self.name, msg))
3001ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3011ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def finalize(self):
3021ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
3031ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		"""Adds additional info to the log."""
3041ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
3051ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# Add libxml2 messages.
3061ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
3071ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
3081ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.log.extend(self.libLog)
3091ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
3101ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# Add memory leaks.
3111ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
3121ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if self.memLeak != 0:
3131ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.log.append("%s + memory leak: %d bytes\n" % (self.name, self.memLeak))
3141ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3151ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def run(self):
3161ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		"""Runs a test."""
3171ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
3181ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3191ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		##filePath = os.path.join(options.baseDir, self.fileName)
3201ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# filePath = "%s/%s/%s/%s" % (options.baseDir, self.test_Folder, self.schema_Folder, self.schema_File)
32184a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik		if options.displayTestName:
32284a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			sys.stdout.write("'%s'\n" % self.name)
3231ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		try:
3241ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.validate()
3251ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		except (Exception, libxml2.parserError, libxml2.treeError), e:
3261ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.failExcept(e)
3271ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3281ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikdef parseSchema(fileName):
3291ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	schema = None
3301ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	ctxt = libxml2.schemaNewParserCtxt(fileName)
3311ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	try:
3321ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		try:
3331ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			schema = ctxt.schemaParse()
3341ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		except:
3351ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			pass
3361ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	finally:
3371ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		del ctxt
3381ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		return schema
3391ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3401ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3411ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikclass XSTCSchemaTest(XSTCTestCase):
3421ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3431ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def __init__(self, groupName, name, accepted, file, val, descr):
3441ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		XSTCTestCase.__init__(self, 1, groupName, name, accepted, file, val, descr)
3451ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3461ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def validate(self):
3471ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global msgSchemaNotValidButShould, msgSchemaValidButShouldNot
3481ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		schema = None
3491ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		filePath = self.fileName
3501ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# os.path.join(options.baseDir, self.fileName)
3511ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		valid = 0
3521ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		try:
3531ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
3541ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# Parse the schema.
3551ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
3561ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.debugMsg("loading schema: %s" % filePath)
3571ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			schema = parseSchema(filePath)
3581ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.debugMsg("after loading schema")
3591ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if schema is None:
3601ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.debugMsg("schema is None")
3611ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.debugMsg("checking for IO errors...")
3621ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if self.isIOError(file, "schema"):
3631ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					return
3641ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.debugMsg("checking schema result")
3651ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if (schema is None and self.val) or (schema is not None and self.val == 0):
3661ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.debugMsg("schema result is BAD")
3671ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if (schema == None):
3681ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					self.fail(msgSchemaNotValidButShould)
3691ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				else:
3701ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					self.fail(msgSchemaValidButShouldNot)
3711ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			else:
3721ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.debugMsg("schema result is OK")
3731ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		finally:
3741ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.group.setSchema(self.fileName, schema is not None)
3751ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			del schema
3761ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3771ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikclass XSTCInstanceTest(XSTCTestCase):
3781ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3791ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def __init__(self, groupName, name, accepted, file, val, descr):
3801ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		XSTCTestCase.__init__(self, 0, groupName, name, accepted, file, val, descr)
3811ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3821ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def validate(self):
3831ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		instance = None
3841ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		schema = None
3851ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		filePath = self.fileName
3861ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# os.path.join(options.baseDir, self.fileName)
3871ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3881ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not self.group.schemaParsed and self.group.schemaTried:
3891ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.failNoSchema()
3901ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			return
3911ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
3921ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.debugMsg("loading instance: %s" % filePath)
3931ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		parserCtxt = libxml2.newParserCtxt()
3941ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if (parserCtxt is None):
3951ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# TODO: Is this one necessary, or will an exception
3961ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# be already raised?
3971ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			raise Exception("Could not create the instance parser context.")
39884a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik		if not options.validationSAX:
3991ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			try:
40084a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				try:
40184a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					instance = parserCtxt.ctxtReadFile(filePath, None, libxml2.XML_PARSE_NOWARNING)
40284a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				except:
40384a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					# Suppress exceptions.
40484a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					pass
40584a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			finally:
40684a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				del parserCtxt
40784a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			self.debugMsg("after loading instance")
40884a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			if instance is None:
40984a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				self.debugMsg("instance is None")
41084a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				self.failCritical("Failed to parse the instance for unknown reasons.")
41184a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				return
41284a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik		try:
41384a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			#
41484a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			# Validate the instance.
41584a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			#
41684a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			self.debugMsg("loading schema: %s" % self.group.schemaFileName)
41784a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			schema = parseSchema(self.group.schemaFileName)
4181ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			try:
41984a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				validationCtxt = schema.schemaNewValidCtxt()
42084a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				#validationCtxt = libxml2.schemaNewValidCtxt(None)
42184a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				if (validationCtxt is None):
42284a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					self.failCritical("Could not create the validation context.")
42384a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					return
4241ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				try:
42584a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					self.debugMsg("validating instance")
42684a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					if options.validationSAX:
42784a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik						instance_Err = validationCtxt.schemaValidateFile(filePath, 0)
42884a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					else:
4291ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						instance_Err = validationCtxt.schemaValidateDoc(instance)
43084a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					self.debugMsg("after instance validation")
43184a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					self.debugMsg("instance-err: %d" % instance_Err)
43284a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					if (instance_Err != 0 and self.val == 1) or (instance_Err == 0 and self.val == 0):
43384a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik						self.debugMsg("instance result is BAD")
43484a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik						if (instance_Err != 0):
43584a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik							self.fail(msgInstanceNotValidButShould)
4361ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						else:
43784a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik							self.fail(msgInstanceValidButShouldNot)
43884a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik
43984a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					else:
44084a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik								self.debugMsg("instance result is OK")
4411ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				finally:
44284a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik					del validationCtxt
4431ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			finally:
44484a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik				del schema
44584a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik		finally:
44684a56e313dfd2179d1205b565a8927c46a80dd34Kasimier T. Buchcik			if instance is not None:
4471ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				instance.freeDoc()
4481ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4491ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4501ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik####################
4511ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik# Test runner class.
4521ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik#
4531ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4541ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcikclass XSTCTestRunner:
4551ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4561ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_TOTAL = 0
4571ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_RAN = 1
4581ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_SUCCEEDED = 2
4591ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_FAILED = 3
4601ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_UNIMPLEMENTED = 4
4611ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_INTERNAL = 5
4621ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_BAD = 6
4631ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_EXCEPTED = 7
4641ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_MEMLEAK = 8
4651ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_NOSCHEMA = 9
4661ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_NOTACCEPTED = 10
4671ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	CNT_SCHEMA_TEST = 11
4681ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4691ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def __init__(self):
4701ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.logFile = None
4711ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.counters = self.createCounters()
4721ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.testList = []
4731ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.combinesRan = {}
4741ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.groups = {}
4751ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.curGroup = None
4761ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4771ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def createCounters(self):
4781ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		counters = {self.CNT_TOTAL:0, self.CNT_RAN:0, self.CNT_SUCCEEDED:0,
4791ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.CNT_FAILED:0, self.CNT_UNIMPLEMENTED:0, self.CNT_INTERNAL:0, self.CNT_BAD:0,
4801ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.CNT_EXCEPTED:0, self.CNT_MEMLEAK:0, self.CNT_NOSCHEMA:0, self.CNT_NOTACCEPTED:0,
4811ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.CNT_SCHEMA_TEST:0}
4821ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4831ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		return counters
4841ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4851ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def addTest(self, test):
4861ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.testList.append(test)
4871ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		test.initTest(self)
4881ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4891ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def getGroup(self, groupName):
4901ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		return self.groups[groupName]
4911ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4921ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def addGroup(self, group):
4931ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		self.groups[group.name] = group
4941ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
4951ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def updateCounters(self, test, counters):
4961ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.memLeak != 0:
4971ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_MEMLEAK] += 1
4981ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not test.failed:
4991ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_SUCCEEDED] +=1
5001ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.failed:
5011ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_FAILED] += 1
5021ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.bad:
5031ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_BAD] += 1
5041ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.unimplemented:
5051ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_UNIMPLEMENTED] += 1
5061ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.internalErr:
5071ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_INTERNAL] += 1
5081ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.noSchemaErr:
5091ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_NOSCHEMA] += 1
5101ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.excepted:
5111ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_EXCEPTED] += 1
5121ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not test.accepted:
5131ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_NOTACCEPTED] += 1
5141ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if test.isSchema:
5151ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_SCHEMA_TEST] += 1
5161ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		return counters
5171ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
5181ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def displayResults(self, out, all, combName, counters):
5191ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		out.write("\n")
5201ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if all:
5211ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if options.combines is not None:
5221ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				out.write("combine(s): %s\n" % str(options.combines))
5231ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		elif combName is not None:
5241ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("combine : %s\n" % combName)
5251ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		out.write("  total           : %d\n" % counters[self.CNT_TOTAL])
5261ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if all or options.combines is not None:
5271ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("  ran             : %d\n" % counters[self.CNT_RAN])
5281ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("    (schemata)    : %d\n" % counters[self.CNT_SCHEMA_TEST])
5291ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# out.write("    succeeded       : %d\n" % counters[self.CNT_SUCCEEDED])
5301ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		out.write("  not accepted    : %d\n" % counters[self.CNT_NOTACCEPTED])
5311ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if counters[self.CNT_FAILED] > 0:
5321ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("    failed                  : %d\n" % counters[self.CNT_FAILED])
5331ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("     -> internal            : %d\n" % counters[self.CNT_INTERNAL])
5341ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("     -> unimpl.             : %d\n" % counters[self.CNT_UNIMPLEMENTED])
5351ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("     -> skip-invalid-schema : %d\n" % counters[self.CNT_NOSCHEMA])
5361ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("     -> bad                 : %d\n" % counters[self.CNT_BAD])
5371ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("     -> exceptions          : %d\n" % counters[self.CNT_EXCEPTED])
5381ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("    memory leaks            : %d\n" % counters[self.CNT_MEMLEAK])
5391ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
5401ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def displayShortResults(self, out, all, combName, counters):
5411ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		out.write("Ran %d of %d tests (%d schemata):" % (counters[self.CNT_RAN],
5421ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				  counters[self.CNT_TOTAL], counters[self.CNT_SCHEMA_TEST]))
5431ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# out.write("    succeeded       : %d\n" % counters[self.CNT_SUCCEEDED])
5441ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if counters[self.CNT_NOTACCEPTED] > 0:
5451ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write(" %d not accepted" % (counters[self.CNT_NOTACCEPTED]))
5461ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if counters[self.CNT_FAILED] > 0 or counters[self.CNT_MEMLEAK] > 0:
5471ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if counters[self.CNT_FAILED] > 0:
5481ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				out.write(" %d failed" % (counters[self.CNT_FAILED]))
5491ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				out.write(" (")
5501ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if counters[self.CNT_INTERNAL] > 0:
5511ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					out.write(" %d internal" % (counters[self.CNT_INTERNAL]))
5521ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if counters[self.CNT_UNIMPLEMENTED] > 0:
5531ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					out.write(" %d unimplemented" % (counters[self.CNT_UNIMPLEMENTED]))
5541ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if counters[self.CNT_NOSCHEMA] > 0:
5551ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					out.write(" %d skip-invalid-schema" % (counters[self.CNT_NOSCHEMA]))
5561ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if counters[self.CNT_BAD] > 0:
5571ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					out.write(" %d bad" % (counters[self.CNT_BAD]))
5581ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if counters[self.CNT_EXCEPTED] > 0:
5591ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					out.write(" %d exception" % (counters[self.CNT_EXCEPTED]))
5601ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				out.write(" )")
5611ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if counters[self.CNT_MEMLEAK] > 0:
5621ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				out.write(" %d leaks" % (counters[self.CNT_MEMLEAK]))
5631ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write("\n")
5641ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		else:
5651ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			out.write(" all passed\n")
5661ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
5671ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def reportCombine(self, combName):
5681ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
5691ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
5701ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		counters = self.createCounters()
5711ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
5721ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# Compute evaluation counters.
5731ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
5741ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		for test in self.combinesRan[combName]:
5751ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_TOTAL] += 1
5761ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters[self.CNT_RAN] += 1
5771ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			counters = self.updateCounters(test, counters)
5781ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if options.reportErrCombines and (counters[self.CNT_FAILED] == 0) and (counters[self.CNT_MEMLEAK] == 0):
5791ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			pass
5801ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		else:
5811ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if options.enableLog:
5821ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.displayResults(self.logFile, False, combName, counters)
5831ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.displayResults(sys.stdout, False, combName, counters)
5841ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
5851ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def displayTestLog(self, test):
5861ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		sys.stdout.writelines(test.log)
5871ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		sys.stdout.write("~~~~~~~~~~\n")
5881ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
5891ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def reportTest(self, test):
5901ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
5911ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
5921ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		error = test.failed or test.memLeak != 0
5931ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
5941ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# Only erroneous tests will be written to the log,
5951ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# except @verbose is switched on.
5961ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
5971ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if options.enableLog and (options.verbose or error):
5981ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.logFile.writelines(test.log)
5991ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.logFile.write("~~~~~~~~~~\n")
6001ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
6011ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# if not @silent, only erroneous tests will be
6021ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		# written to stdout, except @verbose is switched on.
6031ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		#
6041ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if not options.silent:
6051ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if options.reportInternalErrOnly and test.internalErr:
6061ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.displayTestLog(test)
6071ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if options.reportMemLeakErrOnly and test.memLeak != 0:
6081ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.displayTestLog(test)
6091ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if options.reportUnimplErrOnly and test.unimplemented:
6101ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.displayTestLog(test)
6111ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if (options.verbose or error) and (not options.reportInternalErrOnly) and (not options.reportMemLeakErrOnly) and (not options.reportUnimplErrOnly):
6121ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.displayTestLog(test)
6131ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6141ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6151ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def addToCombines(self, test):
6161ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		found = False
6171ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if self.combinesRan.has_key(test.combineName):
6181ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.combinesRan[test.combineName].append(test)
6191ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		else:
6201ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.combinesRan[test.combineName] = [test]
6211ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6221ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik	def run(self):
6231ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6241ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		global options
6251ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6261ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if options.info:
6271ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			for test in self.testList:
6281ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.addToCombines(test)
6291ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			sys.stdout.write("Combines: %d\n" % len(self.combinesRan))
6301ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			sys.stdout.write("%s\n" % self.combinesRan.keys())
6311ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			return
6321ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6331ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		if options.enableLog:
6341ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			self.logFile = open(options.logFile, "w")
6351ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		try:
6361ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			for test in self.testList:
6371ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.counters[self.CNT_TOTAL] += 1
6381ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				#
6391ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				# Filter tests.
6401ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				#
6411ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if options.singleTest is not None and options.singleTest != "":
6421ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					if (test.name != options.singleTest):
6431ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						continue
6441ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				elif options.combines is not None:
6451ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					if not options.combines.__contains__(test.combineName):
6461ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						continue
6471ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				elif options.testStartsWith is not None:
6481ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					if not test.name.startswith(options.testStartsWith):
6491ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						continue
6501ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				elif options.combineStartsWith is not None:
6511ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					if not test.combineName.startswith(options.combineStartsWith):
6521ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						continue
6531ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6541ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				if options.maxTestCount != -1 and self.counters[self.CNT_RAN] >= options.maxTestCount:
6551ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					break
6561ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.counters[self.CNT_RAN] += 1
6571ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				#
6581ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				# Run the thing, dammit.
6591ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				#
6601ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				try:
6611ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					test.setUp()
6621ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					try:
6631ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						test.run()
6641ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					finally:
6651ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						test.tearDown()
6661ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				finally:
6671ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					#
6681ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					# Evaluate.
6691ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					#
6701ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					test.finalize()
6711ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					self.reportTest(test)
6721ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					if options.reportCombines or options.reportErrCombines:
6731ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik						self.addToCombines(test)
6741ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					self.counters = self.updateCounters(test, self.counters)
6751ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik		finally:
6761ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if options.reportCombines or options.reportErrCombines:
6771ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				#
6781ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				# Build a report for every single combine.
6791ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				#
6801ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				# TODO: How to sort a dict?
6811ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				#
6821ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.combinesRan.keys().sort(None)
6831ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				for key in self.combinesRan.keys():
6841ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik					self.reportCombine(key)
6851ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik
6861ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
6871ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			# Display the final report.
6881ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			#
6891ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			if options.silent:
6901ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.displayShortResults(sys.stdout, True, None, self.counters)
6911ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik			else:
6921ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				sys.stdout.write("===========================\n")
6931ace20342ac2992b021d3db1bf64b394320a706cKasimier T. Buchcik				self.displayResults(sys.stdout, True, None, self.counters)
694