added class type
[swftools.git] / lib / as3 / runtests.py
1 #!/usr/bin/python
2 #
3 # runtests.py
4 #
5 # Run compiler unit tests
6 #
7 # Copyright (c) 2008 Matthias Kramm <kramm@quiss.org>
8 #
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 2 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
22
23 import sys
24 import os
25 import time
26 import subprocess
27
28 def check(s):
29     row = None
30     ok = 0
31     for line in s.split("\n"):
32         if line.startswith("[") and line.endswith("]"):
33             continue
34         if not line.strip():
35             continue
36         if not line.startswith("ok"):
37             return 0
38         if line.startswith("ok "):
39             if "/" not in line:
40                 return 0
41             i = line.index('/')
42             nr,len = int(line[3:i]),int(line[i+1:])
43             if nr<1 or nr>len:
44                 return 0
45             if not row:
46                 row = [0]*len
47             if row[nr-1]:
48                 return 0
49             row[nr-1] = 1
50         elif line == "ok":
51             ok = 1
52     if ok:
53         return not row
54     if row:
55         return 0 not in row
56     return 0
57
58 def runcmd(cmd,args,wait):
59     #fo = open(tempfile, "wb")
60     fo= os.tmpfile()
61     p = subprocess.Popen([cmd] + args, executable=cmd, stdout=fo, stderr=fo)
62     ret = -1
63     for i in range(wait*10):
64         ret = p.poll()
65         if ret is not None:
66             break
67         time.sleep(0.1)
68     else:
69         os.kill(p.pid, 9)
70         os.system("killall -9 "+cmd)
71   
72     fo.seek(0)
73     output = fo.read()
74     fo.close()
75     return ret,output
76
77 class Test:
78     def __init__(self, nr, file):
79         self.nr = nr
80         self.file = file
81         self.flash_output = None
82         self.flash_error = None
83         self.compile_output = None
84         self.compile_error = None
85         self.compile()
86         if not self.compile_error:
87             self.run()
88
89     def compile(self):
90         try: os.unlink("abc.swf");
91         except: pass
92         ret,output = runcmd("./parser",[self.file],wait=60)
93         self.compile_error = 0
94         self.compile_output = output
95         if ret:
96             self.compile_error = 1
97         if not os.path.isfile("abc.swf"):
98             self.compile_error = 1
99
100     def run(self):
101         ret,output = runcmd("flashplayer",["abc.swf"],wait=1)
102         os.system("killall flashplayer")
103         self.flash_output = output
104         
105         if not check(self.flash_output):
106             self.flash_error = 1
107
108     def doprint(self):
109         def r(s,l):
110             if(len(s)>=l):
111                 return s
112             return (" "*(l-len(s))) + s
113         def l(s,l):
114             if(len(s)>=l):
115                 return s
116             return s + (" "*(l-len(s)))
117
118         print r(str(self.nr),3)," ",
119         if self.compile_error:
120             print "err"," - ",
121         else:
122             print "ok ",
123             if not self.flash_error:
124                 print "ok ",
125             else:
126                 print "err",
127         print " ",
128         print file
129
130     def doprintlong(self):
131         print self.nr, self.file
132         print "================================"
133         print "compile:", (test.compile_error and "error" or "ok")
134         print test.compile_output
135         print "================================"
136         print "run:", (test.flash_error and "error" or "ok")
137         print test.flash_output
138         print "================================"
139
140 checknum=-1
141 if len(sys.argv)>1:
142     checknum = int(sys.argv[1])
143
144 for nr,file in sorted(enumerate(os.listdir("ok"))):
145     if not file.endswith(".as"):
146         continue
147     file = os.path.join("ok", file)
148     if checknum>=0 and nr!=checknum:
149         continue
150     test = Test(nr,file)
151
152     if checknum!=nr:
153         test.doprint()
154     else:
155         test.doprintlong()
156
157