3
from os.path import join,basename,splitext,normpath,abspath
5
from string import Template
9
# intitalize logging module
10
log = logging.getLogger("test_graphparser")
11
console = logging.StreamHandler()
12
console.setLevel(logging.WARNING)
13
# set a format which is simpler for console use
14
formatter = logging.Formatter('%(levelname)-8s %(message)s')
15
# tell the handler to use this format
16
console.setFormatter(formatter)
17
log.addHandler(console)
19
#LOG_FILENAME = splitext(__file__)[0]+'.log'
20
#hdlr = logging.FileHandler(LOG_FILENAME)
22
#formatter = logging.Formatter('%(levelname)-8s %(message)s')
23
#hdlr.setFormatter(formatter)
24
#log.setLevel(logging.INFO)
26
# Directory with test files
27
BASE_DIR = join(abspath(os.path.dirname(__file__)),"")
28
TESTFILES_DIR = "testgraphs/"
29
TESTFILES_PATH = join(BASE_DIR,TESTFILES_DIR)
30
DEST_DIR = join(BASE_DIR,'tmp/')
34
#err = os.system(syscmd)
35
sres = os.popen(syscmd)
39
log.warning('Failed to run command:\n%s',syscmd)
40
log.debug('Output:\n%s',resdata)
44
fn = splitext(filename)[0]
45
s = "latex -halt-on-error -interaction nonstopmode %s.tex" % fn
48
if sys.platform=='win32':
49
s = "dvips -Ppdf -G0 -D600 -E* -o%s.eps %s.dvi" % (fn,fn)
52
s = "epstool --bbox --copy --output %s_tmp.eps %s.eps" % (fn,fn)
56
os.remove("%s.eps" % fn)
57
os.remove("%s.dvi" % fn)
58
os.remove("%s.aux" % fn)
59
os.remove("%s.log" % fn)
60
#os.remove("%s.pgf" % fn)
64
os.rename("%s_tmp.eps" % fn,"%s.eps" % fn)
65
s = "epstopdf %s.eps" % fn
68
s = "dvips %s.dvi" % fn
70
s = "ps2eps -B -f %s.ps" % fn
73
s = "epstopdf %s.eps" % fn
82
testdotfile = normpath(join(BASE_DIR,'testgraphs/','concentrate.dot'))
86
\documentclass{article}
90
\usepackage[active,tightpage]{preview}
91
\setlength\PreviewBorder{0pt}%
92
\PreviewEnvironment{tikzpicture}
96
\matrix[every node/.style={draw=black!20}] (mtrx) {
97
\node[label=below:original] {\includegraphics{$testfile}}; & \node[label=below:tikz] {\includegraphics{${testfile}_tikz}};\\
98
\node[label=below:pgf] {\includegraphics{${testfile}_pgf}}; & \node[label=below:pst] {\includegraphics{${testfile}_pst}};\\
100
\node[above] at (mtrx.north) {$testfile};
105
s = Template(textemplate)
107
def create_pdf(texfile,use_pdftex=True):
108
if not splitext(texfile)[1]:
109
fn = basename(texfile)+'.tex'
111
fn = basename(texfile)
112
if sys.platform=='win32':
113
syscmd = 'texify --pdf --clean %s' % (fn)
115
syscmd = 'pdflatex -halt-on-error -interaction nonstopmode %s' % (fn)
122
def create_original(dotfilename):
123
# Process the file with dot and create a pdf
124
# dot -Tps2 file.dot > file.ps
126
basefn = basename(dotfilename)
127
destfile = normpath(join(DEST_DIR,splitext(basefn)[0]))
129
os.chdir(os.path.dirname(destfile))
130
syscmd = 'dot -Tps2 %s > %s.ps' % (dotfilename,destfile)
132
syscmd = 'ps2pdf %s.ps' % (destfile)
133
#os.remove("%s.ps" % destfile)
138
def create_tikz(dotfilename):
139
basefn = basename(dotfilename)
140
destfile = normpath(join(DEST_DIR,splitext(basefn)[0]))+'_tikz'
141
syscmd = 'dot2tex -ftikz --crop %s > %s.tex' % (dotfilename,destfile)
144
os.chdir(os.path.dirname(destfile))
145
err = create_pdf(destfile)
150
def create_pgf(dotfilename):
151
basefn = basename(dotfilename)
152
destfile = normpath(join(DEST_DIR,splitext(basefn)[0]))+'_pgf'
153
syscmd = 'dot2tex --crop %s > %s.tex' % (dotfilename,destfile)
156
os.chdir(os.path.dirname(destfile))
157
err = create_pdf(destfile)
162
def create_pst(dotfilename):
163
basefn = basename(dotfilename)
164
destfile = normpath(join(DEST_DIR,splitext(basefn)[0]))+'_pst'
165
syscmd = 'dot2tex -fpst %s > %s.tex' % (dotfilename,destfile)
168
os.chdir(os.path.dirname(destfile))
169
#syscmd = 'meps %s' % (basename(destfile))
170
#err = runcmd(syscmd)
171
err = meps(basename(destfile))
175
def create_comparefile(dotfilename):
176
basefn = basename(dotfilename)
177
destfile = normpath(join(DEST_DIR,splitext(basefn)[0]))+'_cmp.tex'
178
f = open(destfile,'w')
179
f.write(s.substitute(testfile=splitext(basefn)[0]))
182
os.chdir(os.path.dirname(destfile))
183
err = create_pdf(destfile)
184
#if sys.platform=='win32':
185
# syscmd = "start %s" % splitext(basename(destfile))[0]+'.pdf'
186
# err = runcmd(syscmd)
191
# Get a dot file to test
193
# Create a tikz version
194
# create a pgf version
195
# create a pstricks version
196
# Combine the images in a latex file
198
def compare_output(testdotfile):
199
err = create_original(testdotfile)
201
err = create_tikz(testdotfile)
203
err = create_pgf(testdotfile)
205
err = create_pst(testdotfile)
207
err = create_comparefile(testdotfile)
212
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/541096
213
def confirm(prompt=None, resp=False):
214
"""prompts for yes or no response from the user. Returns True for yes and
217
'resp' should be set to the default value assumed by the caller when
218
user simply types ENTER.
220
>>> confirm(prompt='Create Directory?', resp=True)
221
Create Directory? [y]|n:
223
>>> confirm(prompt='Create Directory?', resp=False)
224
Create Directory? [n]|y:
226
>>> confirm(prompt='Create Directory?', resp=False)
227
Create Directory? [n]|y: y
236
prompt = '%s [%s]|%s: ' % (prompt, 'y', 'n')
238
prompt = '%s [%s]|%s: ' % (prompt, 'n', 'y')
241
ans = raw_input(prompt)
244
if ans not in ['y', 'Y', 'n', 'N']:
245
print 'please enter y or n.'
247
if ans == 'y' or ans == 'Y':
249
if ans == 'n' or ans == 'N':
253
def run_rendertest(dotfile):
254
print "Processing %s" % dotfile
255
err = compare_output(normpath(join(TESTFILES_PATH,dotfile)))
260
s = "Is %s correct?" % (dotfile)
261
return confirm(s,resp=True)
264
class RenderTest(unittest.TestCase):
267
if not os.path.exists(DEST_DIR):
270
def test_autosize(self):
272
self.failUnless(run_rendertest(fn))
273
self.cmplist.append(fn)
275
def test_compassports(self):
276
fn = 'compassports.dot'
277
self.failUnless(run_rendertest(fn))
278
self.cmplist.append(fn)
280
def test_concentrate(self):
281
fn = 'concentrate.dot'
282
self.failUnless(run_rendertest(fn))
283
self.cmplist.append(fn)
285
def test_escstr(self):
287
self.failUnless(run_rendertest(fn))
288
self.cmplist.append(fn)
290
def test_invis(self):
292
self.failUnless(run_rendertest(fn))
293
self.cmplist.append(fn)
295
def test_nodenames(self):
297
self.failUnless(run_rendertest(fn))
298
self.cmplist.append(fn)
300
def test_colors(self):
302
self.failUnless(run_rendertest(fn))
303
self.cmplist.append(fn)
305
def test_zzzzzzzzzzzfinal(self):
308
for dotfile in self.cmplist:
309
basefn = basename(dotfile)
310
flist.append(normpath(join(splitext(basefn)[0]))+'_cmp.pdf')
311
s = "pdftk %s cat output testrenders.pdf dont_ask" % " ".join(flist)
314
if sys.platform=='win32':
315
syscmd = "start %s" % 'testrenders.pdf'
317
print "Check testrenders.pdf manually"
319
testdotfile2 = normpath(join(TESTFILES_PATH,'compassports.dot'))
321
if __name__ == '__main__':
322
#compare_output(testdotfile2)