]> git.lyx.org Git - lyx.git/blob - src/tex2lyx/test/runtests.py
Split roundtrip tests (at least on cmake build)
[lyx.git] / src / tex2lyx / test / runtests.py
1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # file src/tex2lyx/test/runtests.py
5 # This file is part of LyX, the document processor.
6 # Licence details can be found in the file COPYING.
7
8 # author Georg Baum
9
10 # Full author contact details are available in file CREDITS
11
12 # This script is a very basic test suite runner for tex2lyx
13 # The defaults for optional command line arguments are tailored to the
14 # standard use case of testing without special build settings like a version
15 # suffix, since I don't know how to transport command line arguments through
16 # the autotools "make check" mechanism.
17
18 import os, string, sys, time, difflib, filecmp, subprocess, re
19
20 def usage(prog_name):
21   return "Usage: %s [<tex2lyx binary> [[<script dir>] [[<output dir>] [testfile]]]]" % prog_name
22
23
24 def main(argv):
25     # Parse and manipulate the command line arguments.
26     if len(argv) >= 3:
27         sys.path.append(os.path.join(sys.argv[2]))
28     else:
29         sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), '../../../lib/scripts'))
30
31     from lyxpreview_tools import error
32
33     if len(argv) < 2:
34         tex2lyx = './tex2lyx'
35     elif len(argv) <= 5:
36         tex2lyx = argv[1]
37     else:
38         error(usage(argv[0]))
39
40     lyx = os.path.join(os.path.dirname(tex2lyx), "lyx")
41     inputdir = os.path.dirname(argv[0])
42     if len(argv) >= 4:
43         outputdir = sys.argv[3]
44     else:
45 #        outputdir = inputdir
46         outputdir = os.path.join(os.path.dirname(tex2lyx), "test")
47
48     if len(argv) >= 5:
49         files = [sys.argv[4]]
50     else:
51         files = ['test.ltx', 'test-structure.tex', 'test-insets.tex', \
52              'test-modules.tex', 'box-color-size-space-align.tex', \
53              'CJK.tex', 'XeTeX-polyglossia.tex']
54
55     errors = []
56     overwrite = (outputdir == inputdir)
57     for f in files:
58         (base, ext) = os.path.splitext(f)
59         texfile = os.path.join(inputdir, f)
60         if overwrite:
61             cmd = '%s -roundtrip -f %s' % (tex2lyx, texfile)
62         else:
63             lyxfile = os.path.join(outputdir, base + ".lyx")
64             cmd = '%s -roundtrip -copyfiles -f %s %s' % (tex2lyx, texfile, lyxfile)
65         proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
66         proc.wait()
67         err = proc.returncode
68         errorstring = proc.stderr.read()
69         if not errorstring is None:
70             print errorstring
71             if err == 0:
72                 matchObj = re.match(r'.*: +Error +in +.*', errorstring, re.M|re.S)
73                 if matchObj:
74                     err = 9999
75         if err != 0:
76             errors.append(f)
77         elif not overwrite:
78             lyxfile1 = os.path.join(inputdir, base + ".lyx.lyx")
79             lyxfile2 = os.path.join(outputdir, base + ".lyx")
80             if not filecmp.cmp(lyxfile1, lyxfile2, False):
81                 t1 = time.ctime(os.path.getmtime(lyxfile1))
82                 t2 = time.ctime(os.path.getmtime(lyxfile2))
83                 f1 = open(lyxfile1, 'r')
84                 f2 = open(lyxfile2, 'r')
85                 lines1 = f1.readlines()
86                 lines2 = f2.readlines()
87                 diff = difflib.unified_diff(lines1, lines2, lyxfile1, lyxfile2, t1, t2)
88                 f1.close()
89                 f2.close()
90                 sys.stdout.writelines(diff)
91                 errors.append(f)
92
93     if len(errors) > 0:
94         error('Converting the following files failed: %s' % ', '.join(errors))
95
96 if __name__ == "__main__":
97     main(sys.argv)
98