Align libgc vcxproj with makefile.
[mono.git] / mono / tests / unhandled-exception-test-runner.2.cs
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.IO;
5 using System.Diagnostics;
6 using System.Text.RegularExpressions;
7
8 namespace UnhandledExceptionTest {
9         class RunningMode {
10                 private string monoRuntime;
11                 public string RUNTIME {
12                         get {
13                                 return monoRuntime;
14                         }
15                 }
16                 public bool UseMonoRuntime {
17                         get {
18                                 return (monoRuntime != null) && (monoRuntime != "");
19                         }
20                 }
21                 private bool generateTestConfigurations;
22                 public bool GTC {
23                         get {
24                                 return generateTestConfigurations;
25                         }
26                 }
27                 
28                 private static bool ParseArgumentValue (string value) {
29                         if ((value.Length == 1)) {
30                                 switch (value [0]) {
31                                 case 'T':
32                                         return true;
33                                 case 'F':
34                                         return false;
35                                 default:
36                                         Console.WriteLine ("Invalid argument value {0}", value);
37                                         throw new ApplicationException ("Invalid argument value " + value);
38                                 }
39                         } else {
40                                 Console.WriteLine ("Invalid argument value {0}", value);
41                                 throw new ApplicationException ("Invalid argument value " + value);
42                         }
43                 }
44                 public RunningMode (string runningMode) {
45                         string [] arguments = runningMode.Split (',');
46                         foreach (string argument in arguments) {
47                                 string [] components = argument.Split (':');
48                                 if (components.Length == 2) {
49                                         switch (components [0]) {
50                                         case "RUNTIME":
51                                                 monoRuntime = components [1];
52                                                 break;
53                                         case "GTC":
54                                                 generateTestConfigurations = ParseArgumentValue (components [1]);
55                                                 break;
56                                         default:
57                                                 Console.WriteLine ("Invalid argument {0}", argument);
58                                                 throw new ApplicationException ("Invalid argument " + argument);
59                                         }
60                                 } else {
61                                         Console.WriteLine ("Invalid argument {0}", argument);
62                                         throw new ApplicationException ("Invalid argument " + argument);
63                                 }
64                         }
65                 }
66         }
67         
68         class TestResult {
69                 private int exitCode;
70                 public int ExitCode {
71                         get {
72                                 return exitCode;
73                         }
74                 }
75                 public bool EXITZERO {
76                         get {
77                                 return (exitCode == 0);
78                         }
79                 }
80                 private bool continueMarker;
81                 public bool CONT {
82                         get {
83                                 return continueMarker;
84                         }
85                 }
86                 private bool rootDomainUnhandledExceptionMarker;
87                 public bool RDUE {
88                         get {
89                                 return rootDomainUnhandledExceptionMarker;
90                         }
91                 }
92                 private bool differentDomainUnhandledExceptionMarker;
93                 public bool DDUE {
94                         get {
95                                 return differentDomainUnhandledExceptionMarker;
96                         }
97                 }
98                 private bool invalidArgument;
99                 public bool InvalidArgument {
100                         get {
101                                 return invalidArgument;
102                         }
103                 }
104                 private string [] output;
105                 
106                 private static Regex continuePattern = new Regex ("MARKER-CONT");
107                 private static Regex rootDomainUnhandledExceptionPattern = new Regex ("MARKER-RDUE");
108                 private static Regex differentDomainUnhandledExceptionPattern = new Regex ("MARKER-DDUE");
109                 private static Regex invalidArgumentPattern = new Regex ("Invalid argument");
110                 
111                 private void UpdateFlags () {
112                         foreach (string outputLine in output) {
113                                 if (continuePattern.Match (outputLine).Success) {
114                                         continueMarker = true;
115                                 }
116                                 if (rootDomainUnhandledExceptionPattern.Match (outputLine).Success) {
117                                         rootDomainUnhandledExceptionMarker = true;
118                                 }
119                                 if (differentDomainUnhandledExceptionPattern.Match (outputLine).Success) {
120                                         differentDomainUnhandledExceptionMarker = true;
121                                 }
122                                 if (invalidArgumentPattern.Match (outputLine).Success) {
123                                         invalidArgument = true;
124                                 }
125                         }
126                 }
127                 public void PrintOutput () {
128                         Console.WriteLine ("--- Output start: ---");
129                         foreach (string outputLine in output) {
130                                 Console.WriteLine (outputLine);
131                         }
132                         Console.WriteLine ("--- Output end. ---");
133                 }
134                 
135                 public TestResult (int exitCode, string [] output) {
136                         this.exitCode = exitCode;
137                         this.output = output;
138                         UpdateFlags ();
139                 }
140         }
141         
142         class TestDescription {
143                 private bool use20Runtime;
144                 public bool USE20 {
145                         get {
146                                 return use20Runtime;
147                         }
148                 }
149                 private bool rootConfigurationIsLegacy;
150                 public bool RCIL {
151                         get {
152                                 return rootConfigurationIsLegacy;
153                         }
154                 }
155                 
156                 private bool exitCodeShouldBeZero;
157                 public bool EXITZERO {
158                         get {
159                                 return exitCodeShouldBeZero;
160                         }
161                 }
162                 private bool continueMarkerExpected;
163                 public bool CONT {
164                         get {
165                                 return continueMarkerExpected;
166                         }
167                 }
168                 private bool rootDomainUnhandledExceptionMarkerExpected;
169                 public bool RDUE {
170                         get {
171                                 return rootDomainUnhandledExceptionMarkerExpected;
172                         }
173                 }
174                 private bool differentDomainUnhandledExceptionMarkerExpected;
175                 public bool DDUE {
176                         get {
177                                 return differentDomainUnhandledExceptionMarkerExpected;
178                         }
179                 }
180                 
181                 private static string BoolToString (bool value) {
182                         return value ? "T" : "F";
183                 }
184                 public static readonly int MIN_CONFIG_CODE = 0;
185                 public static readonly int MAX_CONFIG_CODE = 255;
186                 public static TestDescription FromCode (int code) {
187                         if ((code >= MIN_CONFIG_CODE) && (code <= MAX_CONFIG_CODE)) {
188                                 bool testUSE20 = (code & 0x01) != 0;
189                                 bool testRCIL =  (code & 0x02) != 0;
190                                 bool testDT =    (code & 0x04) != 0;
191                                 bool testDA =    (code & 0x08) != 0;
192                                 bool testDCIL =  (code & 0x10) != 0;
193                                 bool testDTDA =  (code & 0x20) != 0;
194                                 bool testHRA =   (code & 0x40) != 0;
195                                 bool testHDA =   (code & 0x80) != 0;
196                                 
197                                 if (testDCIL && ! testDA) {
198                                         return null;
199                                 } else if (testDTDA && ! testDA) {
200                                         return null;
201                                 } else if (testHDA && ! testDA) {
202                                         return null;
203                                 } else {
204                                         string testConfiguration = String.Format ("USE20:{0},RCIL:{1}",
205                                                         BoolToString (testUSE20), BoolToString (testRCIL));
206                                         string testArguments = String.Format ("DT:{0},DA:{1},DCIL:{2},DTDA:{3},HRA:{4},HDA:{5}",
207                                                         BoolToString (testDT), BoolToString (testDA),
208                                                         BoolToString (testDCIL), BoolToString (testDTDA),
209                                                         BoolToString (testHRA), BoolToString (testHDA));
210                                         string testExpectedResult = "EXITZERO:F,CONT:F,RDUE:F,DDUE:F";
211                                         return new TestDescription (testConfiguration, testArguments, testExpectedResult);
212                                 }
213                         } else {
214                                 return null;
215                         }
216                 }
217                 
218                 
219                 private string configuration;
220                 public string Configuration {
221                         get {
222                                 return configuration;
223                         }
224                 }
225                 private string arguments;
226                 public string Arguments {
227                         get {
228                                 return arguments;
229                         }
230                 }
231                 private string expectedResult;
232                 public string ExpectedResult {
233                         get {
234                                 return expectedResult;
235                         }
236                 }
237                 
238                 private static bool ParseArgumentValue (string value) {
239                         if ((value.Length == 1)) {
240                                 switch (value [0]) {
241                                 case 'T':
242                                         return true;
243                                 case 'F':
244                                         return false;
245                                 default:
246                                         Console.WriteLine ("Invalid argument value {0}", value);
247                                         throw new ApplicationException ("Invalid argument value " + value);
248                                 }
249                         } else {
250                                 Console.WriteLine ("Invalid argument value {0}", value);
251                                 throw new ApplicationException ("Invalid argument value " + value);
252                         }
253                 }
254                 
255                 public TestDescription (string configuration, string arguments, string expectedResult) {
256                         this.configuration = configuration;
257                         this.arguments = arguments;
258                         this.expectedResult = expectedResult;
259                         
260                         string [] configurationFlags = configuration.Split (',');
261                         foreach (string configurationFlag in configurationFlags) {
262                                 string [] components = configurationFlag.Split (':');
263                                 if (components.Length == 2) {
264                                         switch (components [0]) {
265                                         case "USE20":
266                                                 use20Runtime = ParseArgumentValue (components [1]);
267                                                 break;
268                                         case "RCIL":
269                                                 rootConfigurationIsLegacy = ParseArgumentValue (components [1]);
270                                                 break;
271                                         default:
272                                                 Console.WriteLine ("Invalid argument {0}", components [0]);
273                                                 throw new ApplicationException ("Invalid argument " + components [0]);
274                                         }
275                                 } else {
276                                         Console.WriteLine ("Invalid argument {0}", configurationFlag);
277                                         throw new ApplicationException ("Invalid argument " + configurationFlag);
278                                 }
279                         }
280                         string [] expectedResultFlags = expectedResult.Split (',');
281                         foreach (string expectedResultFlag in expectedResultFlags) {
282                                 string [] components = expectedResultFlag.Split (':');
283                                 if (components.Length == 2) {
284                                         switch (components [0]) {
285                                         case "EXITZERO":
286                                                 exitCodeShouldBeZero = ParseArgumentValue (components [1]);
287                                                 break;
288                                         case "CONT":
289                                                 continueMarkerExpected = ParseArgumentValue (components [1]);
290                                                 break;
291                                         case "RDUE":
292                                                 rootDomainUnhandledExceptionMarkerExpected = ParseArgumentValue (components [1]);
293                                                 break;
294                                         case "DDUE":
295                                                 differentDomainUnhandledExceptionMarkerExpected = ParseArgumentValue (components [1]);
296                                                 break;
297                                         default:
298                                                 Console.WriteLine ("Invalid argument {0}", components [0]);
299                                                 throw new ApplicationException ("Invalid argument " + components [0]);
300                                         }
301                                 } else {
302                                         Console.WriteLine ("Invalid argument {0}", expectedResultFlag);
303                                         throw new ApplicationException ("Invalid argument " + expectedResultFlag);
304                                 }
305                         }
306                         
307                 }
308                 
309                 public bool Check (TestResult testResult) {
310                         if (EXITZERO && (testResult.ExitCode != 0)) {
311                                 Console.WriteLine ("Test FAILED: exit code is {0}, expected zero", testResult.ExitCode);
312                                 return false;
313                         }
314                         if (!CONT && testResult.CONT) {
315                                 Console.WriteLine ("Test FAILED: unexpected CONT marker found");
316                                 return false;
317                         }
318                         if (CONT && !testResult.CONT) {
319                                 Console.WriteLine ("Test FAILED: expected CONT marker not found");
320                                 return false;
321                         }
322                         if (!RDUE && testResult.RDUE) {
323                                 Console.WriteLine ("Test FAILED: unexpected RDUE marker found");
324                                 return false;
325                         }
326                         if (RDUE && !testResult.RDUE) {
327                                 Console.WriteLine ("Test FAILED: expected RDUE marker not found");
328                                 return false;
329                         }
330                         if (!DDUE && testResult.DDUE) {
331                                 Console.WriteLine ("Test FAILED: unexpected  marker found");
332                                 return false;
333                         }
334                         if (DDUE && !testResult.DDUE) {
335                                 Console.WriteLine ("Test FAILED: expected DDUE marker not found");
336                                 return false;
337                         }
338                         return true;
339                 }
340         }
341         
342         class TestRun {
343                 private TestDescription description;
344                 private TestResult result;
345                 
346                 public TestRun (TestDescription description, RunningMode runningMode) {
347                         this.description = description;
348                         
349                         Process p = new Process ();
350                         p.StartInfo.UseShellExecute = false;
351                         p.StartInfo.CreateNoWindow = true;
352                         p.StartInfo.RedirectStandardOutput = true;
353                         p.EnableRaisingEvents = true;
354                         
355                         string program = "unhandled-exception-test-case";
356                         if (description.RCIL) {
357                                 program = program + "-legacy";
358                         }
359                         program = program + (description.USE20 ? ".2.exe" : ".1.exe");
360                         if (runningMode.UseMonoRuntime) {
361                                 p.StartInfo.FileName = runningMode.RUNTIME;
362                                 p.StartInfo.Arguments = "--debug " + program + " " + description.Arguments;
363                         } else {
364                                 p.StartInfo.FileName = program;
365                                 p.StartInfo.Arguments = description.Arguments;
366                         }
367                         
368                         Console.WriteLine ("Starting process \"{0}\" \"{1}\"", p.StartInfo.FileName, p.StartInfo.Arguments);
369                         
370                         p.Start();
371                         // Do not wait for the child process to exit before
372                         // reading to the end of its redirected stream.
373                         // p.WaitForExit ();
374                         // Read the output stream first and then wait.
375                         string output = p.StandardOutput.ReadToEnd ();
376                         p.WaitForExit ();
377                         string[] outputLines = output.Split ('\n');
378                         
379                         result = new TestResult (p.ExitCode, outputLines);
380                 }
381                 
382                 public bool Check () {
383                         return description.Check (result);
384                 }
385                 
386                 private static string BoolToString (bool value) {
387                         return value ? "T" : "F";
388                 }
389                 public void Print () {
390                         Console.WriteLine ("Results of test {0} {1} {2}",
391                                         description.Configuration, description.Arguments, description.ExpectedResult);
392                         Console.WriteLine ("Exit code is {0}, output is:", result.ExitCode);
393                         result.PrintOutput ();
394                         Console.WriteLine ("The following configuration would make the test pass:");
395                         Console.WriteLine ("new TestDescription (\"{0}\", \"{1}\", \"EXITZERO:{2},CONT:{3},RDUE:{4},DDUE:{5}\"),",
396                                         description.Configuration, description.Arguments,
397                                         BoolToString (result.EXITZERO), BoolToString (result.CONT),
398                                         BoolToString (result.RDUE), BoolToString (result.DDUE));
399                 }
400                 
401                 public bool Process (RunningMode runningMode) {
402                         if (runningMode.GTC) {
403                                 Console.WriteLine ("Generating test configuration...");
404                                 Print ();
405                                 return true;
406                         } else {
407                                 Console.WriteLine ("Checking test result...");
408                                 bool checkResult = Check ();
409                                 if (! checkResult) {
410                                         Print ();
411                                 } else {
412                                         Console.WriteLine ("Test PASSED");
413                                 }
414                                 return checkResult;
415                         }
416                 }
417         }
418         
419         class UnhandledExceptionTester {
420                 private static TestDescription [] tests = new TestDescription [] {
421 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
422 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
423 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
424 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
425 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
426 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
427 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
428 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
429 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
430 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
431 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
432 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
433 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
434 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
435 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
436 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
437 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
438 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
439 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
440 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
441 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
442 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
443 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
444 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
445 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
446 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
447 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
448 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
449 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
450 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
451 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
452 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
453 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
454 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
455 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
456 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
457 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
458 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
459 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
460 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:F", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
461 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
462 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
463 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
464 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
465 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
466 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
467 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
468 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:F,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
469 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
470 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
471 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
472 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
473 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
474 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
475 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
476 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
477 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
478 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
479 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
480 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
481 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
482 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
483 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
484 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
485 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
486 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
487 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
488 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
489 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
490 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
491 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
492 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
493 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
494 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
495 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
496 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
497 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
498 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
499 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
500 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:F", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
501 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
502 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
503 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
504 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
505 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
506 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
507 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
508 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
509 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
510 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
511 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
512 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
513 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
514 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:F"),
515 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
516 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
517 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
518 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:T"),
519 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
520 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:T"),
521 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
522 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:T"),
523 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
524 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:T"),
525 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
526 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:T"),
527 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
528 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:T"),
529 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
530 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:F,CONT:F,RDUE:F,DDUE:T"),
531 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:F"),
532 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:F,HDA:T", "EXITZERO:T,CONT:T,RDUE:F,DDUE:T"),
533 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
534 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
535 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
536 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
537 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
538 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
539 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
540 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:F,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
541 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
542 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
543 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
544 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
545 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
546 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:F"),
547 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
548 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:F,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
549 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
550 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:T"),
551 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
552 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:T"),
553 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
554 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:T"),
555 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
556 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:F,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:T"),
557 new TestDescription ("USE20:F,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
558 new TestDescription ("USE20:T,RCIL:F", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:T"),
559 new TestDescription ("USE20:F,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
560 new TestDescription ("USE20:T,RCIL:T", "DT:F,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:T"),
561 new TestDescription ("USE20:F,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
562 new TestDescription ("USE20:T,RCIL:F", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:F,CONT:F,RDUE:T,DDUE:T"),
563 new TestDescription ("USE20:F,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:F"),
564 new TestDescription ("USE20:T,RCIL:T", "DT:T,DA:T,DCIL:T,DTDA:T,HRA:T,HDA:T", "EXITZERO:T,CONT:T,RDUE:T,DDUE:T"),
565                 };
566                 
567                 public static int Main (string [] args) {
568                         RunningMode runningMode = (args.Length > 0) ? new RunningMode (args [0]) : new RunningMode ("RUNTIME:mono,GTC:F");
569                         if (args.Length > 1) {
570                                 Console.WriteLine ("Extra arguments unrecognized");
571                                 return 1;
572                         }
573                         
574                         Console.WriteLine ("Starting test run, UseMonoRuntime is {0}, GTC is {1}", runningMode.UseMonoRuntime, runningMode.GTC);
575                         
576                         int result = 0;
577                         
578                         if (! runningMode.GTC) {
579                                 foreach (TestDescription test in tests) {
580                                         TestRun testRun = new TestRun (test, runningMode);
581                                         if (! testRun.Process (runningMode)) {
582                                                 result ++;
583                                         }
584                                 }
585                         } else {
586                                 for (int i = TestDescription.MIN_CONFIG_CODE; i <= TestDescription.MAX_CONFIG_CODE; i++) {
587                                         TestDescription test = TestDescription.FromCode (i);
588                                         if (test != null) {
589                                                 TestRun testRun = new TestRun (test, runningMode);
590                                                 testRun.Process (runningMode);
591                                         }
592                                 }
593                         }
594                         
595                         return result;
596                 }
597         }
598 }
599
600