~ubuntu-branches/ubuntu/raring/dot2tex/raring

« back to all changes in this revision

Viewing changes to tests/test_multirender.py

  • Committer: Bazaar Package Importer
  • Author(s): Peter Collingbourne
  • Date: 2008-05-26 15:32:30 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20080526153230-8wlo39v4lp9kha4j
Tags: 2.8.1-1
* New upstream release
* debian/control:
  - replaced dependency on pydot with pyparsing and graphviz
  - replaced python-all-dev Build-Dep with python
  - moved Build-Depends on pyparsing to Build-Depends-Indep
* debian/copyright: added 2008 to upstream copyright
* debian/watch: escaped the dots
* debian/pyversions, debian/control: package now works with only
  Python 2.4+

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os,sys
 
2
 
 
3
from os.path import join,basename,splitext,normpath,abspath
 
4
 
 
5
from string import Template
 
6
import logging
 
7
import unittest
 
8
 
 
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)
 
18
 
 
19
#LOG_FILENAME = splitext(__file__)[0]+'.log'
 
20
#hdlr = logging.FileHandler(LOG_FILENAME)
 
21
#log.addHandler(hdlr)
 
22
#formatter = logging.Formatter('%(levelname)-8s %(message)s')
 
23
#hdlr.setFormatter(formatter)
 
24
#log.setLevel(logging.INFO)
 
25
 
 
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/')
 
31
 
 
32
 
 
33
def runcmd(syscmd):
 
34
    #err = os.system(syscmd)
 
35
    sres = os.popen(syscmd)
 
36
    resdata =  sres.read()
 
37
    err = sres.close()
 
38
    if err:
 
39
        log.warning('Failed to run command:\n%s',syscmd)
 
40
        log.debug('Output:\n%s',resdata)
 
41
    return err
 
42
 
 
43
def meps(filename):
 
44
    fn = splitext(filename)[0]
 
45
    s = "latex -halt-on-error -interaction nonstopmode %s.tex" % fn
 
46
    err = runcmd(s)
 
47
    if err: return err
 
48
    if sys.platform=='win32':
 
49
            s = "dvips -Ppdf -G0 -D600 -E* -o%s.eps %s.dvi" % (fn,fn)
 
50
            err = runcmd(s)
 
51
            if err: return err
 
52
            s = "epstool --bbox --copy --output %s_tmp.eps %s.eps" % (fn,fn)
 
53
            err = runcmd(s)
 
54
            if err: return err
 
55
            try:
 
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)
 
61
 
 
62
            except:
 
63
                    raise
 
64
            os.rename("%s_tmp.eps" % fn,"%s.eps" % fn)
 
65
            s = "epstopdf %s.eps" % fn
 
66
            err = runcmd(s)
 
67
    else:
 
68
        s = "dvips %s.dvi" % fn
 
69
        err = runcmd(s)
 
70
        s = "ps2eps -B -f %s.ps" % fn
 
71
        err = runcmd(s)
 
72
        if err: return err
 
73
        s = "epstopdf %s.eps" % fn
 
74
        err = runcmd(s)
 
75
 
 
76
    return err
 
77
 
 
78
 
 
79
 
 
80
 
 
81
 
 
82
testdotfile = normpath(join(BASE_DIR,'testgraphs/','concentrate.dot'))
 
83
 
 
84
 
 
85
textemplate = r"""
 
86
\documentclass{article}
 
87
\usepackage{tikz}
 
88
 
 
89
\usepackage{verbatim}
 
90
\usepackage[active,tightpage]{preview}
 
91
\setlength\PreviewBorder{0pt}%
 
92
\PreviewEnvironment{tikzpicture}
 
93
 
 
94
\begin{document}
 
95
\begin{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}};\\
 
99
};
 
100
\node[above] at (mtrx.north) {$testfile};
 
101
\end{tikzpicture}
 
102
\end{document}
 
103
"""
 
104
 
 
105
s = Template(textemplate)
 
106
 
 
107
def create_pdf(texfile,use_pdftex=True):
 
108
    if not splitext(texfile)[1]:
 
109
        fn = basename(texfile)+'.tex'
 
110
    else:
 
111
        fn = basename(texfile)
 
112
    if sys.platform=='win32':
 
113
        syscmd = 'texify --pdf --clean %s' % (fn)
 
114
    else:
 
115
        syscmd = 'pdflatex -halt-on-error -interaction nonstopmode %s' % (fn)
 
116
    err = runcmd(syscmd)
 
117
    return err
 
118
 
 
119
 
 
120
 
 
121
 
 
122
def create_original(dotfilename):
 
123
    # Process the file with dot and create a pdf
 
124
    #   dot -Tps2 file.dot > file.ps
 
125
    #   ps2pdf file.ps
 
126
    basefn = basename(dotfilename)
 
127
    destfile = normpath(join(DEST_DIR,splitext(basefn)[0]))
 
128
    cwd = os.getcwd()
 
129
    os.chdir(os.path.dirname(destfile))
 
130
    syscmd = 'dot -Tps2 %s > %s.ps' % (dotfilename,destfile)
 
131
    err = runcmd(syscmd)
 
132
    syscmd = 'ps2pdf %s.ps' % (destfile)
 
133
    #os.remove("%s.ps" % destfile)
 
134
    err = runcmd(syscmd)
 
135
    os.chdir(cwd)
 
136
    return err
 
137
 
 
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)
 
142
    err = runcmd(syscmd)
 
143
    cwd = os.getcwd()
 
144
    os.chdir(os.path.dirname(destfile))
 
145
    err = create_pdf(destfile)
 
146
    #os.remove(destfile)
 
147
    os.chdir(cwd)
 
148
    return err
 
149
 
 
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)
 
154
    err = runcmd(syscmd)
 
155
    cwd = os.getcwd()
 
156
    os.chdir(os.path.dirname(destfile))
 
157
    err = create_pdf(destfile)
 
158
    #os.remove(destfile)
 
159
    os.chdir(cwd)
 
160
    return err
 
161
 
 
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)
 
166
    err = runcmd(syscmd)
 
167
    cwd = os.getcwd()
 
168
    os.chdir(os.path.dirname(destfile))
 
169
    #syscmd = 'meps %s' % (basename(destfile))
 
170
    #err = runcmd(syscmd)
 
171
    err = meps(basename(destfile))
 
172
    os.chdir(cwd)
 
173
    return err
 
174
 
 
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]))
 
180
    f.close()
 
181
    cwd = os.getcwd()
 
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)
 
187
 
 
188
    os.chdir(cwd)
 
189
 
 
190
 
 
191
# Get a dot file to test
 
192
 
 
193
# Create a tikz version
 
194
# create a pgf version
 
195
# create a pstricks version
 
196
# Combine the images in a latex file
 
197
 
 
198
def compare_output(testdotfile):
 
199
    err = create_original(testdotfile)
 
200
    if err: return err
 
201
    err = create_tikz(testdotfile)
 
202
    if err: return err
 
203
    err = create_pgf(testdotfile)
 
204
    if err: return err
 
205
    err = create_pst(testdotfile)
 
206
    if err: return err
 
207
    err = create_comparefile(testdotfile)
 
208
    return err
 
209
 
 
210
 
 
211
# From
 
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
 
215
    False for no.
 
216
 
 
217
    'resp' should be set to the default value assumed by the caller when
 
218
    user simply types ENTER.
 
219
 
 
220
    >>> confirm(prompt='Create Directory?', resp=True)
 
221
    Create Directory? [y]|n:
 
222
    True
 
223
    >>> confirm(prompt='Create Directory?', resp=False)
 
224
    Create Directory? [n]|y:
 
225
    False
 
226
    >>> confirm(prompt='Create Directory?', resp=False)
 
227
    Create Directory? [n]|y: y
 
228
    True
 
229
 
 
230
    """
 
231
 
 
232
    if prompt is None:
 
233
        prompt = 'Confirm'
 
234
 
 
235
    if resp:
 
236
        prompt = '%s [%s]|%s: ' % (prompt, 'y', 'n')
 
237
    else:
 
238
        prompt = '%s [%s]|%s: ' % (prompt, 'n', 'y')
 
239
 
 
240
    while True:
 
241
        ans = raw_input(prompt)
 
242
        if not ans:
 
243
            return resp
 
244
        if ans not in ['y', 'Y', 'n', 'N']:
 
245
            print 'please enter y or n.'
 
246
            continue
 
247
        if ans == 'y' or ans == 'Y':
 
248
            return True
 
249
        if ans == 'n' or ans == 'N':
 
250
            return False
 
251
 
 
252
 
 
253
def run_rendertest(dotfile):
 
254
    print "Processing %s" % dotfile
 
255
    err = compare_output(normpath(join(TESTFILES_PATH,dotfile)))
 
256
    if err:
 
257
        return False
 
258
    else:
 
259
        return True
 
260
    s = "Is %s correct?" % (dotfile)
 
261
    return confirm(s,resp=True)
 
262
 
 
263
 
 
264
class RenderTest(unittest.TestCase):
 
265
    cmplist = []
 
266
    def setUp(self):
 
267
        if not os.path.exists(DEST_DIR):
 
268
            os.mkdir(DEST_DIR)
 
269
 
 
270
    def test_autosize(self):
 
271
        fn = 'autosize.dot'
 
272
        self.failUnless(run_rendertest(fn))
 
273
        self.cmplist.append(fn)
 
274
 
 
275
    def test_compassports(self):
 
276
        fn = 'compassports.dot'
 
277
        self.failUnless(run_rendertest(fn))
 
278
        self.cmplist.append(fn)
 
279
 
 
280
    def test_concentrate(self):
 
281
        fn = 'concentrate.dot'
 
282
        self.failUnless(run_rendertest(fn))
 
283
        self.cmplist.append(fn)
 
284
 
 
285
    def test_escstr(self):
 
286
        fn = 'escstr.dot'
 
287
        self.failUnless(run_rendertest(fn))
 
288
        self.cmplist.append(fn)
 
289
 
 
290
    def test_invis(self):
 
291
        fn = 'invis.dot'
 
292
        self.failUnless(run_rendertest(fn))
 
293
        self.cmplist.append(fn)
 
294
 
 
295
    def test_nodenames(self):
 
296
        fn = 'nodenames.dot'
 
297
        self.failUnless(run_rendertest(fn))
 
298
        self.cmplist.append(fn)
 
299
 
 
300
    def test_colors(self):
 
301
        fn = 'colors.dot'
 
302
        self.failUnless(run_rendertest(fn))
 
303
        self.cmplist.append(fn)
 
304
 
 
305
    def test_zzzzzzzzzzzfinal(self):
 
306
        os.chdir(DEST_DIR)
 
307
        flist =[]
 
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)
 
312
        err = runcmd(s)
 
313
        self.failIf(err)
 
314
        if sys.platform=='win32':
 
315
            syscmd = "start %s" % 'testrenders.pdf'
 
316
            err = runcmd(syscmd)
 
317
        print "Check testrenders.pdf manually"
 
318
 
 
319
testdotfile2 = normpath(join(TESTFILES_PATH,'compassports.dot'))
 
320
 
 
321
if __name__ == '__main__':
 
322
    #compare_output(testdotfile2)
 
323
    unittest.main()