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 
ParseArgumentValue(string value)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 		}
RunningMode(string runningMode)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 
UpdateFlags()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 		}
PrintOutput()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 
TestResult(int exitCode, string [] output)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 
BoolToString(bool value)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;
FromCode(int code)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 
ParseArgumentValue(string value)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 
TestDescription(string configuration, string arguments, string expectedResult)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 
Check(TestResult testResult)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 
TestRun(TestDescription description, RunningMode runningMode)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 
Check()382 		public bool Check () {
383 			return description.Check (result);
384 		}
385 
BoolToString(bool value)386 		private static string BoolToString (bool value) {
387 			return value ? "T" : "F";
388 		}
Print()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 
Process(RunningMode runningMode)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 
Main(string [] args)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 
601