"""Test that output from dotparsing and dot is the same""" import re, os,shutil, glob,sys,time import ImageChops,Image from os.path import join,basename,splitext,normpath from dot2tex import dotparsing # Directory with test files BASE_DIR = "d:/pycode/textools/dotconv/tests/testgraphs/" TESTFILES_DIR = "dotparsingtests" TESTFILES_PATH = join(BASE_DIR,TESTFILES_DIR) PNG_DIR = join(TESTFILES_PATH,'pngs') DOT_DIR = join(TESTFILES_PATH,'dpdots') import logging # intitalize logging module log = logging.getLogger("test_graphparser") console = logging.StreamHandler() console.setLevel(logging.WARNING) # set a format which is simpler for console use formatter = logging.Formatter('%(levelname)-8s %(message)s') # tell the handler to use this format console.setFormatter(formatter) log.addHandler(console) LOG_FILENAME = splitext(__file__)[0]+'.log' hdlr = logging.FileHandler(LOG_FILENAME) log.addHandler(hdlr) formatter = logging.Formatter('%(levelname)-8s %(message)s') hdlr.setFormatter(formatter) log.setLevel(logging.INFO) def equal(im1, im2): return ImageChops.difference(im1, im2).getbbox() is None def get_testfiles(): filelist = [] for f in glob.glob(join(TESTFILES_PATH,"*.dot")): filelist.append(os.path.normpath(f)) return filelist if __name__ == '__main__': graphparser = dotparsing.DotDataParser() log.info('%s Start of run',time.asctime()) dotfiles = get_testfiles() matchingfiles = [] nonmatchingfiles = [] failedfiles = [] for dotfile in dotfiles: try: log.info('Processing %s', dotfile) basefilename = basename(dotfile) basefilenamenoext = os.path.splitext(basefilename)[0] f = open(dotfile) try: data = f.read() except: log.warning('Could not open %s',dotfile) continue f.close() try: graph = graphparser.parse_dot_data(data) # create a dotparsing version of the dot file newfilename = normpath(join(DOT_DIR,basefilename+'.new')) f = open(newfilename,'w') f.write(str(graph)) f.close() except: log.exception('Failed to parse and save %s',basefilename) continue origpngfilename = join(PNG_DIR,basefilenamenoext+'.png') newpngfilename = join(PNG_DIR,basefilenamenoext+'.new.png') # create PNG from original dot file syscmd = 'dot -Tpng %s > %s' % (dotfile,origpngfilename) log.debug("Run %s",syscmd) err = os.system(syscmd) if err: log.warning("Failed to create original %s",origpngfilename) failedfiles.append(basefilename) continue # create PNG from dot file generated by dotparsing syscmd = 'dot -Tpng %s > %s' % (newfilename,newpngfilename) log.debug("Run %s",syscmd) err = os.system(syscmd) if err: log.warning("Failed to create new %s",origpngfilename) failedfiles.append(basefilename) continue # load and compare images try: imorig = Image.open(origpngfilename) imnew = Image.open(newpngfilename) except: log.exception('Could not load %s images',basefilename) continue if equal(imorig,imnew): log.info('%s matches.', basefilename) matchingfiles.append(basefilename) # remove files os.remove(origpngfilename) os.remove(newpngfilename) os.remove(newfilename) else: log.warning('%s did not match!', basefilename) nonmatchingfiles.append(basefilename) except: log.exception('Failed to process %s', basefilename) continue log.info('Nonmatching files:\n%s',nonmatchingfiles) log.info('Matching files:\n%s',matchingfiles) log.info('Failed files:\n%s',failedfiles) log.info('%s End of run',time.asctime())