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