source: orange/testing/regressionTests/xtest_one.py @ 9505:4b798678cd3d

Revision 9505:4b798678cd3d, 4.7 KB checked in by matija <matija.polajnar@…>, 2 years ago (diff)

Merge in the (heavily modified) MLC code from GSOC 2011 (modules, documentation, evaluation code, regression test). Widgets will be merged in a little bit later, which will finally close ticket #992.

Line 
1import sys as t__sys
2import traceback as t__traceback
3import string as t__string
4import os as t__os
5
6#ignore warnings
7import warnings as t__warnings
8t__warnings.simplefilter("ignore")
9
10NO_RANDOMNESS = 1 # prevent random parts of scripts to run
11
12def t__isdigit(c):
13    return c in "0123456789"
14
15def t__samefiles(name1, name2):
16    equal = 1
17    fnew, fold = open(name1, "rt"), open(name2, "rt")
18    lines1 = [t__string.rstrip(x) for x in fnew.readlines()]
19    lines2 = [t__string.rstrip(x) for x in fold.readlines()]
20    fnew.close()
21    fold.close()
22    if lines1 == lines2:
23        return 1
24    if len(lines1) != len(lines2):
25        return 0
26    for l in range(len(lines1)):
27        line1, line2 = lines1[l], lines2[l]
28        if line1 != line2:
29            if len(line1) != len(line2):
30                return 0
31            i = 0
32            while i < len(line1):
33                if line1[i] != line2[i]:
34                    j = i
35                    while i<len(line1) and t__isdigit(line1[i]):
36                        i += 1
37                    if i==j:
38                        return 0
39                    while j>=0 and t__isdigit(line1[j]):
40                        j -= 1
41                    if j<0 or line1[j] != ".":
42                        return 0
43                    j -= 1
44                    while j>=0 and t__isdigit(line1[j]):
45                        j -= 1
46                    if (j >= 0) and (line1[j] in "+-"):
47                        j -= 1
48                    n1, n2 = line1[j+1:i], line2[j+1:i]
49                    if n1.count(".") != n2.count("."):
50                        return 0
51                    for c in n2:
52                        if not c in "0123456789.+- ":
53                            return 0
54                    maxdiff = 1.5 * (.1 ** (len(n1) - n1.find(".") - 1))
55                    if abs(float(n1) - float(n2)) > maxdiff:
56                        return 0
57                else:
58                    i += 1
59    return 1
60
61
62def t__copyfile(src, dst):
63    srcf = open(src, "rt")
64    dstf = open(dst, "wt")
65    dstf.write(srcf.read())
66    srcf.close()
67    dstf.close()
68
69t__sys.path.append(".")
70
71# Arguments: name, #iterations, runNo, isNewFile, outputsdir
72
73t__name = t__sys.argv[1]
74t__iterations = int(t__sys.argv[2])
75t__outputsdir = t__sys.argv[3]
76
77t__crashname, t__errorname, t__newname, t__changedname, t__random1name, t__random2name = ["%s/%s.%s.%s.%s.txt" % (t__outputsdir, t__name, t__sys.platform, t__sys.version[:3], t) for t in ["crash", "error", "new", "changed", "random1", "random2"]]
78t__officialname = "%s/%s.%s.txt" % (t__outputsdir, t__name, t__sys.platform)
79if not t__os.path.exists(t__officialname):
80    t__officialname = "%s/%s.txt" % (t__outputsdir, t__name)
81
82t__isNewFile = not t__os.path.exists(t__officialname)
83
84t__message = open("xtest1_report", "wt")
85
86t__isChanged = False
87
88for t__iteration in range(t__iterations):
89    if t__iterations>1:
90        print t__iteration+1,
91
92    t__fnew = open(t__crashname, "wt")
93    t__sout = t__sys.stdout
94    t__serr = t__sys.stderr
95    try:
96        t__sys.stdout = t__sys.stderr = t__fnew
97        execfile(t__name)
98
99    except Exception, e:
100        # execution ended with an error
101        apply(t__traceback.print_exception, t__sys.exc_info())
102        t__sys.stdout = t__sout
103        t__sys.stderr = t__serr
104        t__fnew.close()
105
106        t__message.write("error\n%i\n" % t__iteration)
107        print "error"
108        t__message.write(reduce(lambda x,y: x+y, apply(t__traceback.format_exception, t__sys.exc_info())))
109        t__message.close()
110        t__sys.exit(1)
111
112    t__sys.stdout = t__sout
113    t__sys.stderr = t__serr
114    t__fnew.close()
115
116    if not t__iteration:
117        if t__isNewFile:
118            # the file is a new files and this has been the first iteration
119            t__os.rename(t__crashname, t__newname)
120            t__copyfile(t__newname, t__officialname)
121            t__prevname = t__newname
122        elif not t__samefiles(t__crashname, t__officialname):
123            # it's an old file and it has changed
124            t__os.rename(t__crashname, t__changedname)
125            t__prevname = t__changedname
126            t__isChanged = True
127        else:
128            # file is OK
129            t__os.remove(t__crashname)
130            t__prevname = t__officialname
131    else:
132        if not t__samefiles(t__crashname, t__prevname):
133            # random file (either new or old)
134            t__copyfile(t__prevname, t__random1name)
135            t__os.rename(t__crashname, t__random2name)
136            t__message.write("random\n")
137            print "random"
138            t__message.close()
139            t__sys.exit(2)
140        else:
141            t__os.remove(t__crashname) # iterate on with same file
142
143if t__isChanged:
144    t__message.write("changed")
145    print "changed"
146    t__sys.exit(3)
147
148t__message.write("OK")
149t__message.close()
150print "OK"
Note: See TracBrowser for help on using the repository browser.