annotate test.d @ 135:af1bebfd96a4 dmd2037

dmd 2.038
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Mon, 13 Sep 2010 22:19:42 +0100
parents 731ab26f07bf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
124
731ab26f07bf testing tool added
korDen
parents:
diff changeset
1 import std.stdio;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
2 import std.utf;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
3 import std.file;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
4 import std.path;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
5 import std.algorithm;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
6 import std.string;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
7 import std.process;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
8 import core.stdc.ctype;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
9 import std.c.windows.windows;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
10
731ab26f07bf testing tool added
korDen
parents:
diff changeset
11 string compiler = "dmd";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
12
731ab26f07bf testing tool added
korDen
parents:
diff changeset
13 class Test
731ab26f07bf testing tool added
korDen
parents:
diff changeset
14 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
15 enum EXTRA_SOURCES = "EXTRA_SOURCES";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
16 enum COMPILE_SEPARATELY = "COMPILE_SEPARATELY";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
17 enum PERMUTE_ARGS = "PERMUTE_ARGS";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
18 enum REQUIRED_ARGS = "REQUIRED_ARGS";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
19 enum POST_SCRIPT = "POST_SCRIPT";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
20 enum EXECUTE_ARGS = "EXECUTE_ARGS";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
21
731ab26f07bf testing tool added
korDen
parents:
diff changeset
22 this(string path, string outputDir)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
23 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
24 this.outputDir = outputDir;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
25 this.baseDir = dirname(path);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
26
731ab26f07bf testing tool added
korDen
parents:
diff changeset
27 this.baseName = getBaseName(path);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
28 this.name = getName(baseName);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
29
731ab26f07bf testing tool added
korDen
parents:
diff changeset
30 this.fileNames ~= baseName;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
31
731ab26f07bf testing tool added
korDen
parents:
diff changeset
32 auto file = File(path);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
33 while (true) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
34 auto line = file.readln();
731ab26f07bf testing tool added
korDen
parents:
diff changeset
35 if (!line.startsWith("// ")) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
36 break;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
37 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
38
731ab26f07bf testing tool added
korDen
parents:
diff changeset
39 line = trim(line[3..$]);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
40 if (line.startsWith(EXTRA_SOURCES)) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
41 fileNames ~= split(line[EXTRA_SOURCES.length + 2..$], " ");
731ab26f07bf testing tool added
korDen
parents:
diff changeset
42 } else if (line.startsWith(COMPILE_SEPARATELY)) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
43 compileSeparately = true;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
44 } else if (line.startsWith(EXECUTE_ARGS)) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
45 executeArgs = line[EXECUTE_ARGS.length + 2..$];
731ab26f07bf testing tool added
korDen
parents:
diff changeset
46 } else if (line.startsWith(PERMUTE_ARGS)) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
47 // ignore for now
731ab26f07bf testing tool added
korDen
parents:
diff changeset
48 } else if (line.startsWith(REQUIRED_ARGS)) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
49 requiredArgs = line[REQUIRED_ARGS.length + 2..$];
731ab26f07bf testing tool added
korDen
parents:
diff changeset
50 } else if (line.startsWith(POST_SCRIPT)) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
51 // ignore for now
731ab26f07bf testing tool added
korDen
parents:
diff changeset
52 } else {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
53 continue;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
54 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
55 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
56 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
57
731ab26f07bf testing tool added
korDen
parents:
diff changeset
58 private string prefix()
731ab26f07bf testing tool added
korDen
parents:
diff changeset
59 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
60 return std.string.format(compiler ~ " -od%s -I%s %s", outputDir, baseDir, requiredArgs);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
61 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
62
731ab26f07bf testing tool added
korDen
parents:
diff changeset
63 private string csuffix(string fileName)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
64 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
65 // output to console
731ab26f07bf testing tool added
korDen
parents:
diff changeset
66 return ""; //std.string.format(" > %s\\%s.clog", outputDir, getBaseName(fileName));
731ab26f07bf testing tool added
korDen
parents:
diff changeset
67 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
68
731ab26f07bf testing tool added
korDen
parents:
diff changeset
69 private string lsuffix(string fileName)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
70 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
71 return std.string.format(" > %s\\%s.llog", outputDir, getBaseName(fileName));
731ab26f07bf testing tool added
korDen
parents:
diff changeset
72 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
73
731ab26f07bf testing tool added
korDen
parents:
diff changeset
74 private string output()
731ab26f07bf testing tool added
korDen
parents:
diff changeset
75 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
76 return std.string.format(" -of%s\\%s.exe", outputDir, name);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
77 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
78
731ab26f07bf testing tool added
korDen
parents:
diff changeset
79 private void execute(string command)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
80 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
81 system(command);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
82 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
83
731ab26f07bf testing tool added
korDen
parents:
diff changeset
84 void compile()
731ab26f07bf testing tool added
korDen
parents:
diff changeset
85 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
86 if (compileSeparately) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
87 string link_command = compiler ~ output();
731ab26f07bf testing tool added
korDen
parents:
diff changeset
88 foreach (fileName; fileNames) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
89 string compile_command = prefix();
731ab26f07bf testing tool added
korDen
parents:
diff changeset
90
731ab26f07bf testing tool added
korDen
parents:
diff changeset
91 compile_command ~= std.string.format(" %s\\%s -c", baseDir, fileName);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
92 compile_command ~= csuffix(fileName);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
93
731ab26f07bf testing tool added
korDen
parents:
diff changeset
94 execute(compile_command);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
95 link_command ~= std.string.format(" %s\\%s.obj", outputDir, getName(getBaseName(fileName)));
731ab26f07bf testing tool added
korDen
parents:
diff changeset
96 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
97
731ab26f07bf testing tool added
korDen
parents:
diff changeset
98 link_command ~= lsuffix(baseName);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
99
731ab26f07bf testing tool added
korDen
parents:
diff changeset
100 execute(link_command);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
101 } else {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
102 string compile_command = prefix();
731ab26f07bf testing tool added
korDen
parents:
diff changeset
103 foreach (fileName; fileNames) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
104 compile_command ~= std.string.format(" %s\\%s", baseDir, fileName);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
105 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
106
731ab26f07bf testing tool added
korDen
parents:
diff changeset
107 compile_command ~= output();
731ab26f07bf testing tool added
korDen
parents:
diff changeset
108 compile_command ~= csuffix(baseName);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
109
731ab26f07bf testing tool added
korDen
parents:
diff changeset
110 execute(compile_command);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
111 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
112 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
113
731ab26f07bf testing tool added
korDen
parents:
diff changeset
114 private string[] fileNames;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
115
731ab26f07bf testing tool added
korDen
parents:
diff changeset
116 private string name;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
117 private string baseName;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
118 private string outputDir;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
119 private string baseDir;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
120 private string requiredArgs;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
121 private string executeArgs;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
122
731ab26f07bf testing tool added
korDen
parents:
diff changeset
123 private bool compileSeparately = false;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
124 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
125
731ab26f07bf testing tool added
korDen
parents:
diff changeset
126 class RunnableTest : Test
731ab26f07bf testing tool added
korDen
parents:
diff changeset
127 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
128 this(string path, string outputDir)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
129 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
130 super(path, outputDir);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
131 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
132
731ab26f07bf testing tool added
korDen
parents:
diff changeset
133 void run()
731ab26f07bf testing tool added
korDen
parents:
diff changeset
134 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
135 string run_command = std.string.format("%s\\%s.exe %s > %s\\%s.exe.rlog", outputDir, name, executeArgs, outputDir, name);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
136 execute(run_command);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
137 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
138 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
139
731ab26f07bf testing tool added
korDen
parents:
diff changeset
140 int main(string[] args)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
141 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
142 auto runnable_tests = wildcard("runnable/*.d"/*, "runnable/*.html", "runnable/*.sh"*/);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
143 auto runnable_test_results = map!q{"result/" ~ a ~ ".out"}(runnable_tests);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
144
731ab26f07bf testing tool added
korDen
parents:
diff changeset
145 auto outputDir = "result";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
146
731ab26f07bf testing tool added
korDen
parents:
diff changeset
147 if (args.length >= 2) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
148 compiler = args[1];
731ab26f07bf testing tool added
korDen
parents:
diff changeset
149 } else {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
150 // compiler = "dmd"; // value by default
731ab26f07bf testing tool added
korDen
parents:
diff changeset
151 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
152
731ab26f07bf testing tool added
korDen
parents:
diff changeset
153 foreach (fileName; runnable_tests) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
154 //fileName = "runnable\\a18.d";
731ab26f07bf testing tool added
korDen
parents:
diff changeset
155 writeln("testing ", fileName);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
156 auto test = new RunnableTest(fileName, outputDir);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
157 test.compile();
731ab26f07bf testing tool added
korDen
parents:
diff changeset
158 // test.run();
731ab26f07bf testing tool added
korDen
parents:
diff changeset
159 // break;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
160 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
161
731ab26f07bf testing tool added
korDen
parents:
diff changeset
162 return 0;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
163 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
164
731ab26f07bf testing tool added
korDen
parents:
diff changeset
165 string[] wildcard(string[] paths...)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
166 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
167 string[] fileNames;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
168
731ab26f07bf testing tool added
korDen
parents:
diff changeset
169 foreach (path; paths) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
170 filter(path, (string fileName) { fileNames ~= fileName; return true; });
731ab26f07bf testing tool added
korDen
parents:
diff changeset
171 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
172
731ab26f07bf testing tool added
korDen
parents:
diff changeset
173 return fileNames;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
174 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
175
731ab26f07bf testing tool added
korDen
parents:
diff changeset
176 string trimLeft(string s)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
177 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
178 for (int i = 0; i < s.length; ++i) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
179 if (!isspace(s[i])) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
180 return s[i..$];
731ab26f07bf testing tool added
korDen
parents:
diff changeset
181 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
182 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
183
731ab26f07bf testing tool added
korDen
parents:
diff changeset
184 return null;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
185 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
186
731ab26f07bf testing tool added
korDen
parents:
diff changeset
187 string trimRight(string s)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
188 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
189 for (int i = s.length - 1; i >= 0; --i) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
190 if (!isspace(s[i])) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
191 return s[0..i + 1];
731ab26f07bf testing tool added
korDen
parents:
diff changeset
192 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
193 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
194
731ab26f07bf testing tool added
korDen
parents:
diff changeset
195 return null;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
196 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
197
731ab26f07bf testing tool added
korDen
parents:
diff changeset
198 string trim(string s)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
199 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
200 return trimLeft(trimRight(s));
731ab26f07bf testing tool added
korDen
parents:
diff changeset
201 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
202
731ab26f07bf testing tool added
korDen
parents:
diff changeset
203 version(Windows) void filter(string pattern, bool delegate(string fileName) callback)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
204 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
205 WIN32_FIND_DATAW fileinfo;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
206
731ab26f07bf testing tool added
korDen
parents:
diff changeset
207 auto h = FindFirstFileW(std.utf.toUTF16z(pattern), &fileinfo);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
208 if (h == INVALID_HANDLE_VALUE)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
209 return;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
210
731ab26f07bf testing tool added
korDen
parents:
diff changeset
211 auto path = dirname(pattern);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
212
731ab26f07bf testing tool added
korDen
parents:
diff changeset
213 do
731ab26f07bf testing tool added
korDen
parents:
diff changeset
214 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
215 // Skip "." and ".."
731ab26f07bf testing tool added
korDen
parents:
diff changeset
216 auto name = fileinfo.cFileName.ptr;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
217 if (name[0] == '.' && (name[1] == 0 || name[1] == '.'))
731ab26f07bf testing tool added
korDen
parents:
diff changeset
218 continue;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
219
731ab26f07bf testing tool added
korDen
parents:
diff changeset
220 size_t clength = std.string.wcslen(fileinfo.cFileName.ptr);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
221 auto fileName = std.path.join(path, std.utf.toUTF8(fileinfo.cFileName[0 .. clength]));
731ab26f07bf testing tool added
korDen
parents:
diff changeset
222
731ab26f07bf testing tool added
korDen
parents:
diff changeset
223 if (!callback(fileName)) {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
224 break;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
225 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
226 } while (FindNextFileW(h, &fileinfo) != FALSE);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
227
731ab26f07bf testing tool added
korDen
parents:
diff changeset
228 FindClose(h);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
229 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
230
731ab26f07bf testing tool added
korDen
parents:
diff changeset
231 string getBaseName(string fullname, string extension = null)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
232 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
233 auto i = fullname.length;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
234 for (; i > 0; i--)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
235 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
236 version(Windows)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
237 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
238 if (fullname[i - 1] == ':' || fullname[i - 1] == '\\' || fullname[i - 1] == '/')
731ab26f07bf testing tool added
korDen
parents:
diff changeset
239 break;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
240 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
241 else version(Posix)
731ab26f07bf testing tool added
korDen
parents:
diff changeset
242 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
243 if (fullname[i - 1] == '/')
731ab26f07bf testing tool added
korDen
parents:
diff changeset
244 break;
731ab26f07bf testing tool added
korDen
parents:
diff changeset
245 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
246 else
731ab26f07bf testing tool added
korDen
parents:
diff changeset
247 {
731ab26f07bf testing tool added
korDen
parents:
diff changeset
248 static assert(0);
731ab26f07bf testing tool added
korDen
parents:
diff changeset
249 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
250 }
731ab26f07bf testing tool added
korDen
parents:
diff changeset
251 return chomp(fullname[i .. fullname.length],
731ab26f07bf testing tool added
korDen
parents:
diff changeset
252 extension.length ? extension : "");
731ab26f07bf testing tool added
korDen
parents:
diff changeset
253 }