check relaxng test suite.py :  » Development » PyObjC » trunk » pyobjc » pyobjc-core » libxml2-src » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Development » PyObjC 
PyObjC » trunk » pyobjc » pyobjc core » libxml2 src » check-relaxng-test-suite.py
#!/usr/bin/python
import sys
import time
import os
import string
import StringIO
sys.path.insert(0, "python")
import libxml2

# Memory debug specific
libxml2.debugMemory(1)
debug = 0
verbose = 0
quiet = 1

#
# the testsuite description
#
CONF=os.path.join(os.path.dirname(__file__), "test/relaxng/OASIS/spectest.xml")
LOG="check-relaxng-test-suite.log"
RES="relaxng-test-results.xml"

log = open(LOG, "w")
nb_schemas_tests = 0
nb_schemas_success = 0
nb_schemas_failed = 0
nb_instances_tests = 0
nb_instances_success = 0
nb_instances_failed = 0

libxml2.lineNumbersDefault(1)
#
# Error and warnng callbacks
#
def callback(ctx, str):
    global log
    log.write("%s%s" % (ctx, str))

libxml2.registerErrorHandler(callback, "")

#
# Resolver callback
#
resources = {}
def resolver(URL, ID, ctxt):
    global resources

    if string.find(URL, '#') != -1:
        URL = URL[0:string.find(URL, '#')]
    if resources.has_key(URL):
        return(StringIO.StringIO(resources[URL]))
    log.write("Resolver failure: asked %s\n" % (URL))
    log.write("resources: %s\n" % (resources))
    return None

#
# Load the previous results
#
#results = {}
#previous = {}
#
#try:
#    res = libxml2.parseFile(RES)
#except:
#    log.write("Could not parse %s" % (RES))
    
#
# handle a valid instance
#
def handle_valid(node, schema):
    global log
    global nb_instances_success
    global nb_instances_failed

    instance = ""
    child = node.children
    while child != None:
        if child.type != 'text':
      instance = instance + child.serialize()
  child = child.next

    try:
  doc = libxml2.parseDoc(instance)
    except:
        doc = None

    if doc == None:
        log.write("\nFailed to parse correct instance:\n-----\n")
  log.write(instance)
        log.write("\n-----\n")
  nb_instances_failed = nb_instances_failed + 1
  return

    try:
        ctxt = schema.relaxNGNewValidCtxt()
  ret = doc.relaxNGValidateDoc(ctxt)
    except:
        ret = -1
    if ret != 0:
        log.write("\nFailed to validate correct instance:\n-----\n")
  log.write(instance)
        log.write("\n-----\n")
  nb_instances_failed = nb_instances_failed + 1
    else:
  nb_instances_success = nb_instances_success + 1
    doc.freeDoc()

#
# handle an invalid instance
#
def handle_invalid(node, schema):
    global log
    global nb_instances_success
    global nb_instances_failed

    instance = ""
    child = node.children
    while child != None:
        if child.type != 'text':
      instance = instance + child.serialize()
  child = child.next

    try:
  doc = libxml2.parseDoc(instance)
    except:
        doc = None

    if doc == None:
        log.write("\nStrange: failed to parse incorrect instance:\n-----\n")
  log.write(instance)
        log.write("\n-----\n")
  return

    try:
        ctxt = schema.relaxNGNewValidCtxt()
  ret = doc.relaxNGValidateDoc(ctxt)
    except:
        ret = -1
    if ret == 0:
        log.write("\nFailed to detect validation problem in instance:\n-----\n")
  log.write(instance)
        log.write("\n-----\n")
  nb_instances_failed = nb_instances_failed + 1
    else:
  nb_instances_success = nb_instances_success + 1
    doc.freeDoc()

#
# handle an incorrect test
#
def handle_correct(node):
    global log
    global nb_schemas_success
    global nb_schemas_failed

    schema = ""
    child = node.children
    while child != None:
        if child.type != 'text':
      schema = schema + child.serialize()
  child = child.next

    try:
  rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
  rngs = rngp.relaxNGParse()
    except:
        rngs = None
    if rngs == None:
        log.write("\nFailed to compile correct schema:\n-----\n")
  log.write(schema)
        log.write("\n-----\n")
  nb_schemas_failed = nb_schemas_failed + 1
    else:
  nb_schemas_success = nb_schemas_success + 1
    return rngs
        
def handle_incorrect(node):
    global log
    global nb_schemas_success
    global nb_schemas_failed

    schema = ""
    child = node.children
    while child != None:
        if child.type != 'text':
      schema = schema + child.serialize()
  child = child.next

    try:
  rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
  rngs = rngp.relaxNGParse()
    except:
        rngs = None
    if rngs != None:
        log.write("\nFailed to detect schema error in:\n-----\n")
  log.write(schema)
        log.write("\n-----\n")
  nb_schemas_failed = nb_schemas_failed + 1
    else:
#  log.write("\nSuccess detecting schema error in:\n-----\n")
#  log.write(schema)
#  log.write("\n-----\n")
  nb_schemas_success = nb_schemas_success + 1
    return None

#
# resource handling: keep a dictionary of URL->string mappings
#
def handle_resource(node, dir):
    global resources

    try:
  name = node.prop('name')
    except:
        name = None

    if name == None or name == '':
        log.write("resource has no name")
  return;
        
    if dir != None:
#        name = libxml2.buildURI(name, dir)
        name = dir + '/' + name

    res = ""
    child = node.children
    while child != None:
        if child.type != 'text':
      res = res + child.serialize()
  child = child.next
    resources[name] = res

#
# dir handling: pseudo directory resources
#
def handle_dir(node, dir):
    try:
  name = node.prop('name')
    except:
        name = None

    if name == None or name == '':
        log.write("resource has no name")
  return;
        
    if dir != None:
#        name = libxml2.buildURI(name, dir)
        name = dir + '/' + name

    dirs = node.xpathEval('dir')
    for dir in dirs:
        handle_dir(dir, name)
    res = node.xpathEval('resource')
    for r in res:
        handle_resource(r, name)

#
# handle a testCase element
#
def handle_testCase(node):
    global nb_schemas_tests
    global nb_instances_tests
    global resources

    sections = node.xpathEval('string(section)')
    log.write("\n    ======== test %d line %d section %s ==========\n" % (

              nb_schemas_tests, node.lineNo(), sections))
    resources = {}
    if debug:
        print "test %d line %d" % (nb_schemas_tests, node.lineNo())

    dirs = node.xpathEval('dir')
    for dir in dirs:
        handle_dir(dir, None)
    res = node.xpathEval('resource')
    for r in res:
        handle_resource(r, None)

    tsts = node.xpathEval('incorrect')
    if tsts != []:
        if len(tsts) != 1:
      print "warning test line %d has more than one <incorrect> example" %(node.lineNo())
  schema = handle_incorrect(tsts[0])
    else:
        tsts = node.xpathEval('correct')
  if tsts != []:
      if len(tsts) != 1:
    print "warning test line %d has more than one <correct> example"% (node.lineNo())
      schema = handle_correct(tsts[0])
  else:
      print "warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo())

    nb_schemas_tests = nb_schemas_tests + 1;
    
    valids = node.xpathEval('valid')
    invalids = node.xpathEval('invalid')
    nb_instances_tests = nb_instances_tests + len(valids) + len(invalids)
    if schema != None:
        for valid in valids:
      handle_valid(valid, schema)
        for invalid in invalids:
      handle_invalid(invalid, schema)


#
# handle a testSuite element
#
def handle_testSuite(node, level = 0):
    global nb_schemas_tests, nb_schemas_success, nb_schemas_failed
    global nb_instances_tests, nb_instances_success, nb_instances_failed
    global quiet
    if level >= 1:
  old_schemas_tests = nb_schemas_tests
  old_schemas_success = nb_schemas_success
  old_schemas_failed = nb_schemas_failed
  old_instances_tests = nb_instances_tests
  old_instances_success = nb_instances_success
  old_instances_failed = nb_instances_failed

    docs = node.xpathEval('documentation')
    authors = node.xpathEval('author')
    if docs != []:
        msg = ""
        for doc in docs:
      msg = msg + doc.content + " "
  if authors != []:
      msg = msg + "written by "
      for author in authors:
          msg = msg + author.content + " "
  if quiet == 0:
      print msg
    sections = node.xpathEval('section')
    if sections != [] and level <= 0:
        msg = ""
        for section in sections:
      msg = msg + section.content + " "
  if quiet == 0:
      print "Tests for section %s" % (msg)
    for test in node.xpathEval('testCase'):
        handle_testCase(test)
    for test in node.xpathEval('testSuite'):
        handle_testSuite(test, level + 1)
          

    if verbose and level >= 1 and sections != []:
        msg = ""
        for section in sections:
      msg = msg + section.content + " "
        print "Result of tests for section %s" % (msg)
        if nb_schemas_tests != old_schemas_tests:
      print "found %d test schemas: %d success %d failures" % (
      nb_schemas_tests - old_schemas_tests,
      nb_schemas_success - old_schemas_success,
      nb_schemas_failed - old_schemas_failed)
  if nb_instances_tests != old_instances_tests:
      print "found %d test instances: %d success %d failures" % (
      nb_instances_tests - old_instances_tests,
      nb_instances_success - old_instances_success,
      nb_instances_failed - old_instances_failed)
#
# Parse the conf file
#
libxml2.substituteEntitiesDefault(1);
testsuite = libxml2.parseFile(CONF)
libxml2.setEntityLoader(resolver)
root = testsuite.getRootElement()
if root.name != 'testSuite':
    print "%s doesn't start with a testSuite element, aborting" % (CONF)
    sys.exit(1)
if quiet == 0:
    print "Running Relax NG testsuite"
handle_testSuite(root)

if quiet == 0:
    print "\nTOTAL:\n"
if quiet == 0 or nb_schemas_failed != 0:
    print "found %d test schemas: %d success %d failures" % (
      nb_schemas_tests, nb_schemas_success, nb_schemas_failed)
if quiet == 0 or nb_instances_failed != 0:
    print "found %d test instances: %d success %d failures" % (
      nb_instances_tests, nb_instances_success, nb_instances_failed)

testsuite.freeDoc()

# Memory debug specific
libxml2.relaxNGCleanupTypes()
libxml2.cleanupParser()
if libxml2.debugMemory(1) == 0:
    if quiet == 0:
  print "OK"
else:
    print "Memory leak %d bytes" % (libxml2.debugMemory(1))
    libxml2.dumpMemory()
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.