示例#1
0
        virtual public void Serialize(Stream stream, Encoding encoding)
        {
            XmlWriter xw = null;

            try
            {
                if (XmlDocProvider != null)
                {
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.CloseOutput         = false;
                    settings.ConformanceLevel    = ConformanceLevel.Document;
                    settings.Encoding            = encoding;
                    settings.Indent              = true;
                    settings.IndentChars         = "    ";
                    settings.NewLineChars        = "\r\n";
                    settings.NewLineOnAttributes = true;

                    xw = XmlWriter.Create(stream, settings);

                    XmlDocument         doc   = new XmlDocument();
                    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                    nsmgr.AddNamespace("i", "http://icalvalid.wikidot.com/validation");

                    // FIXME: add a schema!
                    // doc.Schemas.Add("http://icalvalid.wikidot.com/validation", "schema.xsd");

                    DateTime now = DateTime.Now;

                    XmlElement results = doc.CreateElement("results", "http://icalvalid.wikidot.com/validation");
                    results.SetAttribute("language", ResourceManager.CurrentLanguageIdentifier);
                    results.SetAttribute("datetime", now.ToString("yyyy-MM-dd") + "T" + now.ToString("hh:mm:ss"));

                    if (TestResults != null &&
                        TestResults.Length > 0)
                    {
                        XmlElement testResults = doc.CreateElement("testResults", "http://icalvalid.wikidot.com/validation");
                        testResults.SetAttribute("ruleset", Ruleset.Name);

                        foreach (ITestResult result in TestResults)
                        {
                            XmlElement testResult = doc.CreateElement("testResult", "http://icalvalid.wikidot.com/validation");
                            testResult.SetAttribute("rule", result.Rule);
                            testResult.SetAttribute("expected", result.Test.Type == TestType.Pass ? "pass" : "fail");
                            if (result.Passed != null && result.Passed.HasValue)
                            {
                                string pass = (result.Test.Type == TestType.Pass ? "pass" : "fail");
                                string fail = (result.Test.Type == TestType.Pass ? "fail" : "pass");
                                testResult.SetAttribute("actual", BoolUtil.IsTrue(result.Passed) ? pass : fail);
                            }
                            else
                            {
                                testResult.SetAttribute("actual", "none");
                            }

                            if (!string.IsNullOrEmpty(result.Test.ExpectedError))
                            {
                                testResult.SetAttribute("errorName", result.Test.ExpectedError);
                            }
                            if (result.Error != null)
                            {
                                testResult.SetAttribute("error", result.Error.ToString());
                            }

                            testResults.AppendChild(testResult);
                        }

                        results.AppendChild(testResults);
                    }

                    if (ValidationResults != null &&
                        ValidationResults.Length > 0)
                    {
                        XmlElement validationResults = doc.CreateElement("validationResults", "http://icalvalid.wikidot.com/validation");
                        validationResults.SetAttribute("ruleset", Ruleset.Name);

                        foreach (IValidationResult result in ValidationResults)
                        {
                            XmlElement validationResult = doc.CreateElement("validationResult", "http://icalvalid.wikidot.com/validation");
                            validationResult.SetAttribute("rule", result.Rule);
                            if (result.Passed != null && result.Passed.HasValue)
                            {
                                validationResult.SetAttribute("result", result.Passed.Value ? "pass" : "fail");
                            }
                            else
                            {
                                validationResult.SetAttribute("result", "none");
                            }

                            if (result.Errors != null &&
                                result.Errors.Length > 0)
                            {
                                XmlElement validationErrors = doc.CreateElement("errors", "http://icalvalid.wikidot.com/validation");
                                foreach (IValidationError error in result.Errors)
                                {
                                    XmlElement validationError = doc.CreateElement("error", "http://icalvalid.wikidot.com/validation");
                                    validationError.SetAttribute("name", error.Name);
                                    validationError.SetAttribute("type", error.Type.ToString().ToLower());
                                    validationError.SetAttribute("message", error.Message);
                                    validationError.SetAttribute("isFatal", error.IsFatal.ToString().ToLower());
                                    if (error.Line != default(int))
                                    {
                                        validationError.SetAttribute("line", error.Line.ToString());
                                    }
                                    if (error.Col != default(int))
                                    {
                                        validationError.SetAttribute("col", error.Col.ToString());
                                    }

                                    validationErrors.AppendChild(validationError);
                                }

                                validationResult.AppendChild(validationErrors);
                            }

                            validationResults.AppendChild(validationResult);
                        }

                        results.AppendChild(validationResults);
                    }

                    doc.AppendChild(results);

                    doc.Save(xw);
                }
            }
            finally
            {
                if (xw != null)
                {
                    xw.Close();
                    xw = null;
                }
            }
        }
        virtual public void Serialize(Stream stream, Encoding encoding)
        {
            using (StreamWriter sw = new StreamWriter(stream, encoding))
            {
                if (Ruleset != null)
                {
                    if (TestResults != null &&
                        TestResults.Length > 0)
                    {
                        int numTests    = TestResults.Length;
                        int numTestsRun = 0;
                        foreach (ITestResult result in TestResults)
                        {
                            if (result.Passed != null && result.Passed.HasValue)
                            {
                                numTestsRun++;
                            }
                        }

                        if (!object.Equals(numTests, numTestsRun))
                        {
                            sw.WriteLine(string.Format(
                                             ResourceManager.GetString("notAllTestsPerformed"),
                                             numTests,
                                             numTestsRun,
                                             numTests - numTestsRun
                                             ));
                        }

                        int passed = 0;
                        foreach (ITestResult result in TestResults)
                        {
                            if (BoolUtil.IsTrue(result.Passed))
                            {
                                passed++;
                            }

                            sw.WriteLine(result.ToString());
                        }

                        sw.WriteLine(string.Format(
                                         ResourceManager.GetString("passVsFail"),
                                         passed,
                                         numTestsRun,
                                         string.Format("{0:0.0}", ((double)passed / (double)numTestsRun) * 100)
                                         ));
                    }
                    else if (TestResults != null)
                    {
                        sw.WriteLine(ResourceManager.GetString("noTestsPerformed"));
                    }

                    if (ValidationResults != null &&
                        ValidationResults.Length > 0)
                    {
                        foreach (IValidationResult result in ValidationResults)
                        {
                            if (!BoolUtil.IsTrue(result.Passed))
                            {
                                foreach (IValidationError error in result.Errors)
                                {
                                    sw.WriteLine(error.ToString());
                                }
                            }
                        }
                    }
                    else if (ValidationResults != null)
                    {
                        sw.WriteLine(ResourceManager.GetString("calendarValid"));
                    }
                }
                else
                {
                    sw.WriteLine(ResourceManager.GetString("noValidationRuleset"));
                }
            }
        }
示例#3
0
        public ITestResult[] Test()
        {
            if (Ruleset != null)
            {
                List <ITestResult> results = new List <ITestResult>();
                foreach (IValidationRule rule in Ruleset.Rules)
                {
                    foreach (ITest test in rule.Tests)
                    {
                        RulesetValidator validator = new RulesetValidator(Ruleset, test.iCalendarText);

                        List <IValidationResult> validationResults = new List <IValidationResult>();
                        validationResults.AddRange(validator.Validate());

                        TestResult result = new TestResult(rule.Name, test, false);
                        if (test.Type == TestType.Fail)
                        {
                            List <IValidationResult> badResults = validationResults.FindAll(
                                delegate(IValidationResult r)
                            {
                                return(!BoolUtil.IsTrue(r.Passed));
                            });

                            // On a failing test, there should always be bad results.
                            if (badResults.Count > 0)
                            {
                                // Get a list of errors from our results
                                List <IValidationError> errors = new List <IValidationError>();
                                foreach (IValidationResult r in badResults)
                                {
                                    // 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).
                                    bool fatal = false;
                                    foreach (IValidationError error in r.Errors)
                                    {
                                        errors.Add(error);
                                        if (error.IsFatal)
                                        {
                                            fatal = true;
                                            break;
                                        }
                                    }

                                    if (fatal)
                                    {
                                        break;
                                    }
                                }

                                if (errors.Count == 1 && !string.Equals(errors[0].Name, test.ExpectedError))
                                {
                                    result.Error = new TestError("failWithIncorrectError", rule.Name, validationResults.ToArray());
                                }
                                else if (errors.Count == 0)
                                {
                                    result.Error = new TestError("failExpectedError", rule.Name, validationResults.ToArray());
                                }
                                else if (errors.Count > 1)
                                {
                                    result.Error = new TestError("failWithMoreThanOneError", rule.Name, validationResults.ToArray());
                                }
                                else
                                {
                                    result.Passed = true;
                                }
                            }
                        }
                        else
                        {
                            result.Passed = true;
                            if (validationResults.FindIndex(
                                    delegate(IValidationResult r)
                            {
                                return(!BoolUtil.IsTrue(r.Passed));
                            }) >= 0)
                            {
                                result.Passed = false;
                                result.Error  = new TestError("passExpectedError", rule.Name, validationResults.ToArray());
                            }
                        }

                        results.Add(result);
                    }
                }

                return(results.ToArray());
            }
            // FIXME: else throw exception?
            else
            {
                return(new ITestResult[0]);
            }
        }