summaryrefslogblamecommitdiffstatshomepage
path: root/regtests/jedutil/jedtest.py
blob: ba4c441a24a73cade603040bfe5c2fd60b026b86 (plain) (tree)










































                                                                                               
                                   
                                      

                                                                                       












                                                                            

                                                            




                                                                                           
                                                                                                                              













                                                                  
                                                                                                
                        
                                                                                            
 
               




                                                 






                                               
                                                                                  





                                                            
                                



                            
               

                                              
















                                                         
                                                                                                      

                                                               
                                                                    



               
                                            








                                         
import os
import sys
import shutil
import filecmp
import subprocess

VERBOSE = False


class JedTest:
    """
    A class containing the information necessary to run a test.
    """
    def __init__(self):
        self.name = ""
        self.jedFile = ""
        self.baselineFile = ""
        self.outputFile = ""
    
    def __repr__(self):
        return "Name: %s\nJedFile: %s\nBaselineFile: %s\nOutputFile: %s" % (self.name, 
                                                                            self.jedFile, 
                                                                            self.baselineFile, 
                                                                            self.outputFile)


def findJedTests(jedPath, baselinePath, outputPath):
    """
    Given a path to some jed files, returns a list of JedTest objects.
    """
    jedTestList = list()
    for (path, dirs, files) in os.walk(jedPath):
        if '.svn' in path:
            continue

        for filename in files:
            jedPathFull = os.path.join(path, filename)
            if os.path.splitext(jedPathFull)[1] != '.jed':
                continue
            palName = os.path.splitext(os.path.basename(filename))[0]
            subpathName = path[len(jedPath):].strip(os.sep)

            test = JedTest()
            test.name = subpathName
            test.jedFile = jedPathFull
            test.baselineFile = os.path.join(baselinePath, subpathName, palName+".txt")
            test.outputFile = os.path.join(outputPath, subpathName, palName+".txt")
            jedTestList.append(test)

    return jedTestList


def runViewJedTests(tests, jedUtilApp):
    """
    Given a list of JedTests and a command line program, run them & save the
    results to the files specified in the JedTest objects.
    """
    for test in tests:
        command = [jedUtilApp, "-view", test.jedFile, test.name]
        if VERBOSE:
            print("Viewing the JED file: %s" % test.jedFile)
            print("Command: %s" % " ".join(command))

        process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        (stdout,stderr) = process.communicate()
        
        if stderr:
            print("Error: JED test named " + test.name + " failed during viewing (" + stderr.decode('latin-1').strip() + ").")

        fp = open(test.outputFile, "wb")
        fp.write(stdout)
        fp.close()
    

# MAIN
def main():
    # Some path initializations
    currentDirectory = os.path.dirname(os.path.realpath(__file__))
    jedsPath = os.path.join(currentDirectory, 'jeds')
    baselinePath = os.path.join(currentDirectory, "baseline")
    outputPath = os.path.join(currentDirectory, "output")
    if os.name == 'nt':
        jedUtilApp = os.path.normpath(os.path.join(currentDirectory, "..", "..", "jedutil.exe"))
    else:		
        jedUtilApp = os.path.normpath(os.path.join(currentDirectory, "..", "..", "jedutil"))

    if VERBOSE:
        print("JED Path:      %s" % jedsPath)
        print("Baseline Path: %s" % baselinePath)
        print("Output Path:   %s" % outputPath)
        print("jedutil App:   %s" % jedUtilApp)
        print('')


    # Insure everything exists
    if (not os.path.exists(currentDirectory) or
        not os.path.exists(jedsPath) or
        not os.path.exists(baselinePath) or
        not os.path.exists(jedUtilApp)):
        print("One of the above paths does not exist.  Aborting. %s" % jedUtilApp)
        return 3


    # Gather the tests
    tests = findJedTests(jedsPath, baselinePath, outputPath)
    if not len(tests):
        print("No tests found!")
        return 2


    # Setup the output paths
    if VERBOSE:
        print("Cleaning the output directory")
        print('')
    if os.path.exists(outputPath):
        shutil.rmtree(outputPath)
    os.makedirs(outputPath)
    for test in tests:
        testOutputPath = os.path.dirname(test.outputFile)
        if not os.path.exists(testOutputPath):
            os.makedirs(testOutputPath)


    # Run the commands to create the sample output
    runViewJedTests(tests, jedUtilApp)


    # Insure there are no errors
    success = True
    for test in tests:
        if VERBOSE:
            print("Diffing the output from viewing the JED file: %s" % os.path.basename(test.jedFile))
        if not filecmp.cmp(test.outputFile, test.baselineFile):
            success = False
            print("Test %s failed" % os.path.basename(test.jedFile))


    # Report
    if success:
        print("All tests ran successfully.")
        return 0


    return 1


# Main stub - returns error code properly
if __name__ == "__main__":
    sys.exit(main())