public ITestResult[] Test()
{
if (Ruleset != null)
{
List<ITestResult> results = new List<ITestResult>();
int testsToRun = 0;
foreach (IValidationRule rule in Ruleset.Rules)
{
if (rule.Tests != null)
testsToRun += rule.Tests.Length;
}
OnTestStart(testsToRun);
bool validatorsVerified = false;
foreach (IValidationRule rule in Ruleset.Rules)
{
if (rule.Tests != null)
{
foreach (ITest test in rule.Tests)
{
Debug.WriteLineWithTimestamp("Loading validators for test...");
// Load the ruleset validator using the test data.
RulesetValidator validator = new RulesetValidator(ResourceManager, Ruleset, test.iCalendarText, !validatorsVerified);
validatorsVerified = true;
Debug.WriteLineWithTimestamp("Done.");
// Validate the calendar!
IValidationResultCollection validationResults = validator.Validate();
TestResult result = new TestResult(ResourceManager, rule.Name, test, false);
Debug.WriteLineWithTimestamp("Interpreting test results...");
// Interpret the results...
if (test.Type == TestType.Fail)
{
if (BoolUtil.IsTrue(validationResults.Passed))
{
// The validation passed, but the test expected it to fail.
TestError error = new TestError(ResourceManager, "failExpectedError", rule.Name, validationResults);
error.Message = string.Format(error.Message, test.ExpectedError);
result.Error = error;
}
else
{
IValidationResultInfo[] details = validationResults.Details;
if (details.Length == 1 && !string.Equals(details[0].Name, test.ExpectedError))
{
// Validation failed (as expected), however, it failed with the incorrect error.
TestError error = new TestError(ResourceManager, "failWithIncorrectError", rule.Name, validationResults);
error.Message = string.Format(error.Message, details[0].Name, test.ExpectedError);
result.Error = error;
}
else if (details.Length > 1)
{
// Validation failed (as expected), however, it failed with more than one error.
TestError error = new TestError(ResourceManager, "failWithMoreThanOneError", rule.Name, validationResults);
error.Message = string.Format(error.Message, test.ExpectedError);
result.Error = error;
}
else
{
// The test passed, meaning the result was exactly as expected.
result.Passed = true;
}
}
}
else
{
if (BoolUtil.IsTrue(validationResults.Passed))
{
// The test passed, meaning the result was exactly as expected.
result.Passed = true;
}
else
{
// The validation was expected to succeed, but one or more errors occurred.
result.Passed = false;
result.Error = new TestError(ResourceManager, "passExpectedError", rule.Name, validationResults);
}
}
Debug.WriteLineWithTimestamp("Done.");
// Notify via event the result of the test.
if (result.Passed == null)
OnTestNotRun(result);
else if (BoolUtil.IsTrue(result.Passed))
OnTestPassed(result);
else
OnTestFailed(result);
results.Add(result);
// If we encounter a fatal error, then we cannot continue processing
// other errors. In other words, even though a single error was caused,
// the fact that it was fatal may have side effects and cause errors
// in almost every validator (i.e. a calendar with parsing errors).
if (validationResults.IsFatal)
break;
}
}
}
return results.ToArray();
}
// FIXME: else throw exception?
else return new ITestResult[0];
}