Index: Core/Common/src/Core.Common.Utils/Properties/Resources.Designer.cs =================================================================== diff -u -r654d3a712eedbdeea718dc0448c5544f09e053cd -rc781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6 --- Core/Common/src/Core.Common.Utils/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 654d3a712eedbdeea718dc0448c5544f09e053cd) +++ Core/Common/src/Core.Common.Utils/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// Runtime Version:4.0.30319.18444 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -243,6 +243,15 @@ } /// + /// Looks up a localized string similar to Category/Concept moet gespecificeerd worden om een validatie rapport te maken.. + /// + public static string ValidationReport_Category_or_concept_cannot_be_null { + get { + return ResourceManager.GetString("ValidationReport_Category_or_concept_cannot_be_null", resourceCulture); + } + } + + /// /// Looks up a localized string similar to {0}, ernst: {1} ({2} fout(en), {3} waarschuwing(en), {4} info).. /// public static string ValidationReport_ToString_0_severity_1_2_error_s_3_warnings_4_info { Index: Core/Common/src/Core.Common.Utils/Properties/Resources.resx =================================================================== diff -u -r654d3a712eedbdeea718dc0448c5544f09e053cd -rc781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6 --- Core/Common/src/Core.Common.Utils/Properties/Resources.resx (.../Resources.resx) (revision 654d3a712eedbdeea718dc0448c5544f09e053cd) +++ Core/Common/src/Core.Common.Utils/Properties/Resources.resx (.../Resources.resx) (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -180,4 +180,7 @@ {0}, ernst: {1} ({2} fout(en), {3} waarschuwing(en), {4} info). + + Category/Concept moet gespecificeerd worden om een validatie rapport te maken. + \ No newline at end of file Index: Core/Common/src/Core.Common.Utils/Validation/ValidationIssue.cs =================================================================== diff -u -r125002b7df54bc7ec7190146cd9b23458999c60e -rc781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6 --- Core/Common/src/Core.Common.Utils/Validation/ValidationIssue.cs (.../ValidationIssue.cs) (revision 125002b7df54bc7ec7190146cd9b23458999c60e) +++ Core/Common/src/Core.Common.Utils/Validation/ValidationIssue.cs (.../ValidationIssue.cs) (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -1,36 +1,60 @@ -namespace Core.Common.Utils.Validation +using System; + +namespace Core.Common.Utils.Validation { - public class ValidationIssue + /// + /// Class representing a validation info-row. + /// + public class ValidationIssue : IEquatable { - private object viewData; + private readonly object viewData; + /// + /// Initializes a new instance of the class. + /// + /// The subject where this validation message is about. + /// Name of the subject. + /// The severity of the validation message. + /// The message text. + /// Optional: The viewdata, in case that this is different from . public ValidationIssue(object subject, string subjectName, ValidationSeverity severity, string message, object viewdata = null) { Severity = severity; Message = message; Subject = subject; - ViewData = viewdata; + viewData = viewdata; SubjectName = subjectName; } - public string SubjectName { get; set; } + /// + /// Gets subject where this validation message is about. + /// + public object Subject { get; private set; } + /// + /// Gets the name of the subject. + /// + public string SubjectName { get; private set; } + + /// + /// Gets the severity of the validation message. + /// public ValidationSeverity Severity { get; private set; } + + /// + /// Gets the validation message text. + /// public string Message { get; private set; } - public object Subject { get; set; } - - + /// + /// Gets the object used as view-model for a view. + /// public object ViewData { get { return viewData ?? Subject; } - private set - { - viewData = value; - } } public override string ToString() @@ -43,8 +67,19 @@ return Equals(obj as ValidationIssue); } - private bool Equals(ValidationIssue other) + public override int GetHashCode() { + unchecked + { + var hashCode = (Subject != null ? Subject.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (int)Severity; + hashCode = (hashCode * 397) ^ (Message != null ? Message.GetHashCode() : 0); + return hashCode; + } + } + + public bool Equals(ValidationIssue other) + { if (other == null) { return false; Index: Core/Common/src/Core.Common.Utils/Validation/ValidationReport.cs =================================================================== diff -u -r654d3a712eedbdeea718dc0448c5544f09e053cd -rc781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6 --- Core/Common/src/Core.Common.Utils/Validation/ValidationReport.cs (.../ValidationReport.cs) (revision 654d3a712eedbdeea718dc0448c5544f09e053cd) +++ Core/Common/src/Core.Common.Utils/Validation/ValidationReport.cs (.../ValidationReport.cs) (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -1,53 +1,63 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; + using Core.Common.Utils.Properties; namespace Core.Common.Utils.Validation { - public class ValidationReport + /// + /// A complete hierarchical overview of validation messages related to a particular + /// category or concept. + /// + public class ValidationReport : IEquatable { + /// + /// Initializes a new instance of the class. + /// + /// The category/concept to which this report applies. + /// The validation issues related to . + /// Optional: The child reports with more specialized + /// information on . + /// When . public ValidationReport(string category, IEnumerable issues, IEnumerable subReports = null) { + if (category == null) + { + throw new ArgumentNullException("category", Resources.ValidationReport_Category_or_concept_cannot_be_null); + } + Category = category; - Issues = AsList(issues ?? new ValidationIssue[0]); - SubReports = AsList(subReports ?? new ValidationReport[0]); - Severity = DetermineSeverity(); + ValidationIssue[] validationIssues = issues != null ? issues.ToArray() : new ValidationIssue[0]; + Issues = validationIssues; + ValidationReport[] validationReports = subReports != null ? subReports.ToArray() : new ValidationReport[0]; + SubReports = validationReports; + Severity = DetermineSeverity(validationIssues, validationReports); } - public ValidationReport(string category, IEnumerable subReports) - : this(category, null, subReports) {} - /// - /// Gets the severity of the report, eg the maximum severity of any of its issues. + /// Gets the severity of the report, determined by the maximum severity of any of its issues. /// public ValidationSeverity Severity { get; private set; } + /// + /// Gets the category/concept to which this report applies. + /// public string Category { get; private set; } + + /// + /// Gets the validation issues related to . + /// public IEnumerable Issues { get; private set; } - public IEnumerable SubReports { get; private set; } /// - /// IsEmpty is true when the report contains no issues and no subreports + /// Gets the child reports with more specialized information on . /// - public bool IsEmpty - { - get - { - return !Issues.Any() && !SubReports.Any(); - } - } + public IEnumerable SubReports { get; private set; } - public IEnumerable AllErrors - { - get - { - return GetAllIssuesRecursive().Where(i => i.Severity == ValidationSeverity.Error); - } - } - /// - /// The total number of issues (recursive) with severity level 'Error' + /// The total number of issues (recursive) with severity level . /// public int ErrorCount { @@ -58,7 +68,7 @@ } /// - /// The total number of issues (recursive) with severity level 'Warning' + /// The total number of issues (recursive) with severity level . /// public int WarningCount { @@ -69,7 +79,7 @@ } /// - /// The total number of issues (recursive) with severity level 'Info' + /// The total number of issues (recursive) with severity level . /// public int InfoCount { @@ -79,14 +89,6 @@ } } - /// - /// Creates an empty validation report. Validation reports are read-only so they cannot be added to. - /// - public static ValidationReport Empty(string name) - { - return new ValidationReport(name, null); - } - public IList GetAllIssuesRecursive() { var allIssues = new List(); @@ -118,69 +120,69 @@ var issues = Issues.ToList(); var otherIssues = other.Issues.ToList(); - if (issues.Count != otherIssues.Count) { return false; } - - for (int i = 0; i < issues.Count; i++) + if (issues.Where((t, i) => !t.Equals(otherIssues[i])).Any()) { - if (!issues[i].Equals(otherIssues[i])) - { - return false; - } + return false; } var subreports = SubReports.ToList(); var otherSubreports = other.SubReports.ToList(); - if (subreports.Count != otherSubreports.Count) { return false; } + return !subreports.Where((t, i) => !t.Equals(otherSubreports[i])).Any(); + } - for (int i = 0; i < subreports.Count; i++) + public override bool Equals(object obj) + { + return Equals(obj as ValidationReport); + } + + public override int GetHashCode() + { + unchecked { - if (!subreports[i].Equals(otherSubreports[i])) - { - return false; - } + var hashCode = Category.GetHashCode(); + hashCode = (hashCode * 397) ^ GetHashCodeBasedOnElements(Issues); + hashCode = (hashCode * 397) ^ GetHashCodeBasedOnElements(SubReports); + return hashCode; } - return true; } - public override bool Equals(object obj) + private int GetHashCodeBasedOnElements(IEnumerable enummerable) { - if (obj is ValidationReport) + unchecked { - return Equals(obj as ValidationReport); + int hash = 19; + foreach (var foo in enummerable) + { + hash = hash * 31 + foo.GetHashCode(); + } + return hash; } - return false; } public override string ToString() { return string.Format(Resources.ValidationReport_ToString_0_severity_1_2_error_s_3_warnings_4_info, - Category, Severity, - ErrorCount, WarningCount, InfoCount); + Category, Severity, ErrorCount, WarningCount, InfoCount); } - private ValidationSeverity DetermineSeverity() + private ValidationSeverity DetermineSeverity(ValidationIssue[] validationIssues, ValidationReport[] validationReports) { - var issueMax = Issues.Any() ? Issues.Max(i => i.Severity) : ValidationSeverity.None; - var reportMax = SubReports.Any() ? SubReports.Max(i => i.Severity) : ValidationSeverity.None; - return (ValidationSeverity) Math.Max((int) issueMax, (int) reportMax); + var issueMax = validationIssues.Any() ? validationIssues.Max(i => i.Severity) : ValidationSeverity.None; + var reportMax = validationReports.Any() ? validationReports.Max(i => i.Severity) : ValidationSeverity.None; + return (ValidationSeverity)Math.Max((int)issueMax, (int)reportMax); } private int GetIssueCount(ValidationSeverity severity) { return SubReports.Sum(r => r.GetIssueCount(severity)) + Issues.Count(i => i.Severity == severity); } - - private static IList AsList(IEnumerable enumerable) - { - return enumerable as IList ?? enumerable.ToList(); - } } } \ No newline at end of file Index: Core/Common/src/Core.Common.Utils/Validation/ValidationSeverity.cs =================================================================== diff -u -ra950714ad9510756331d862aa35695fa0b2ed03b -rc781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6 --- Core/Common/src/Core.Common.Utils/Validation/ValidationSeverity.cs (.../ValidationSeverity.cs) (revision a950714ad9510756331d862aa35695fa0b2ed03b) +++ Core/Common/src/Core.Common.Utils/Validation/ValidationSeverity.cs (.../ValidationSeverity.cs) (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -1,10 +1,25 @@ namespace Core.Common.Utils.Validation { + /// + /// Denotes the severity of a validation message. + /// public enum ValidationSeverity { + /// + /// The message has no particular severity. + /// None, + /// + /// The message is intended to provide information. + /// Info, + /// + /// The message is intended to provide a warning. + /// Warning, + /// + /// The message is intended to notify about an error-condition. + /// Error } } \ No newline at end of file Index: Core/Common/test/Core.Common.Utils.Test/Core.Common.Utils.Test.csproj =================================================================== diff -u -rb81978adc73edcf368115b58fd37f34dc7fb6ab5 -rc781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6 --- Core/Common/test/Core.Common.Utils.Test/Core.Common.Utils.Test.csproj (.../Core.Common.Utils.Test.csproj) (revision b81978adc73edcf368115b58fd37f34dc7fb6ab5) +++ Core/Common/test/Core.Common.Utils.Test/Core.Common.Utils.Test.csproj (.../Core.Common.Utils.Test.csproj) (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -109,6 +109,7 @@ Component + Index: Core/Common/test/Core.Common.Utils.Test/Validation/ValidationIssueTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Utils.Test/Validation/ValidationIssueTest.cs (revision 0) +++ Core/Common/test/Core.Common.Utils.Test/Validation/ValidationIssueTest.cs (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -0,0 +1,206 @@ +using System; + +using Core.Common.Utils.Validation; + +using NUnit.Framework; + +namespace Core.Common.Utils.Test.Validation +{ + [TestFixture] + public class ValidationIssueTest + { + [Test] + public void ParameteredConstructor_WithViewData_InitializeProperties() + { + // Setup + var subject = new object(); + var subjectName = ""; + var severity = ValidationSeverity.Error; + var validationMessage = ""; + var viewData = new object(); + + // Call + var issue = new ValidationIssue(subject, subjectName, severity, validationMessage, viewData); + + // Assert + Assert.IsInstanceOf>(issue); + Assert.AreEqual(subject, issue.Subject); + Assert.AreEqual(subjectName, issue.SubjectName); + Assert.AreEqual(severity, issue.Severity); + Assert.AreEqual(validationMessage, issue.Message); + Assert.AreEqual(viewData, issue.ViewData); + } + + [Test] + public void ParameteredConstructor_WithoutViewData_InitializePropertiesExceptViewData() + { + // Setup + var subject = new object(); + var subjectName = ""; + var severity = ValidationSeverity.Error; + var validationMessage = ""; + + // Call + var issue = new ValidationIssue(subject, subjectName, severity, validationMessage); + + // Assert + Assert.IsInstanceOf>(issue); + Assert.AreEqual(subject, issue.Subject); + Assert.AreEqual(subjectName, issue.SubjectName); + Assert.AreEqual(severity, issue.Severity); + Assert.AreEqual(validationMessage, issue.Message); + Assert.AreEqual(subject, issue.ViewData); + } + + [Test] + public void ToString_ReturnInformativeText() + { + // Setup + var issue = new ValidationIssue("", "subjectName", ValidationSeverity.Info, + ""); + + // Call + var text = issue.ToString(); + + // Assert + Assert.AreEqual("[Info] : ", text); + } + + [Test] + public void Equals_ToItselfWithoutViewData_ReturnTrue() + { + // Setup + var issue = new ValidationIssue("", "", ValidationSeverity.Info, ""); + + // Call + var isEqual = issue.Equals(issue); + + // Assert + Assert.True(isEqual); + } + + [Test] + public void Equals_ToItselfWithViewData_ReturnTrue() + { + // Setup + var issue = new ValidationIssue("", "", ValidationSeverity.Info, "", ""); + + // Call + var isEqual = issue.Equals(issue); + + // Assert + Assert.True(isEqual); + } + + [Test] + public void Equals_ToNullWithoutViewData_ReturnFalse() + { + // Setup + var issue = new ValidationIssue("", "", ValidationSeverity.Info, ""); + + // Call + var isEqual = issue.Equals(null); + + // Assert + Assert.IsFalse(isEqual); + } + + [Test] + public void Equals_ToNullWithViewData_ReturnFalse() + { + // Setup + var issue = new ValidationIssue("", "", ValidationSeverity.Info, "", ""); + + // Call + var isEqual = issue.Equals(null); + + // Assert + Assert.IsFalse(isEqual); + } + + [Test] + public void Equals_ToOtherObjectTypeWithoutViewData_ReturnFalse() + { + // Setup + var issue = new ValidationIssue("", "", ValidationSeverity.Info, ""); + + // Call + var isEqual = issue.Equals(new object()); + + // Assert + Assert.IsFalse(isEqual); + } + + [Test] + public void Equals_ToOtherObjectTypeWithViewData_ReturnFalse() + { + // Setup + var issue = new ValidationIssue("", "", ValidationSeverity.Info, "", ""); + + // Call + var isEqual = issue.Equals(new object()); + + // Assert + Assert.IsFalse(isEqual); + } + + [Test] + [TestCase("", "", ValidationSeverity.Info, "", "")] + [TestCase("", "", ValidationSeverity.Warning, "", "")] + [TestCase("", "", ValidationSeverity.Info, "", "")] + public void Equals_ToOtherIssueNotSimilar_ReturnFalse(object subject, string subjectName, ValidationSeverity severity, + string message, object viewData) + { + // Setup + var issue = new ValidationIssue("", "", ValidationSeverity.Info, "", ""); + var otherIssue = new ValidationIssue(subject, subjectName, severity, message, viewData); + + // Call + var isEqual1 = issue.Equals(otherIssue); + var isEqual2 = otherIssue.Equals(issue); + + // Assert + Assert.IsFalse(isEqual1); + Assert.IsFalse(isEqual2); + } + + [Test] + public void Equals_SameSubjectSeverityAndMessage_ReturnTrue() + { + // Setup + var subject = ""; + var severity = ValidationSeverity.None; + var message = ""; + + var issue1 = new ValidationIssue(subject, "", severity, message, ""); + var issue2 = new ValidationIssue(subject, "different", severity, message, "also different"); + + // Call + var isEqual1 = issue1.Equals(issue2); + var isEqual2 = issue2.Equals(issue1); + + // Assert + Assert.IsTrue(isEqual1); + Assert.IsTrue(isEqual2); + } + + [Test] + public void GetHashCode_TwoEqualIssues_ShouldReturnSameHashCodes() + { + // Setup + var subject = ""; + var severity = ValidationSeverity.Warning; + var message = ""; + + var issue1 = new ValidationIssue(subject, "", severity, message, ""); + var issue2 = new ValidationIssue(subject, "different", severity, message, "also different"); + + // Call + var hashCode1 = issue1.GetHashCode(); + var hashCode2 = issue2.GetHashCode(); + + // Assert + Assert.AreEqual(hashCode1, hashCode2); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Utils.Test/Validation/ValidationReportTest.cs =================================================================== diff -u -r41c77f9f36ae74a406fd382187426cc06d2b0200 -rc781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6 --- Core/Common/test/Core.Common.Utils.Test/Validation/ValidationReportTest.cs (.../ValidationReportTest.cs) (revision 41c77f9f36ae74a406fd382187426cc06d2b0200) +++ Core/Common/test/Core.Common.Utils.Test/Validation/ValidationReportTest.cs (.../ValidationReportTest.cs) (revision c781ee450100c0e4ea2d3ebf28ab2ccc16c10bd6) @@ -1,4 +1,7 @@ +using System; using System.Linq; + +using Core.Common.TestUtil; using Core.Common.Utils.Validation; using NUnit.Framework; @@ -8,39 +11,296 @@ public class ValidationReportTest { [Test] - public void Empty() + public void ParameteredConstructor_AllArgumentsProvided_ExpectedValues() { - var staticEmpty = ValidationReport.Empty(""); - Assert.IsTrue(staticEmpty.IsEmpty); + // Setup + var category = ""; + var validationIssues = new[] + { + new ValidationIssue("subject", "subjectName", ValidationSeverity.Error, "message") + }; + var subReports = new[] + { + new ValidationReport("", null) + }; - var newObject = new ValidationReport("", null); - Assert.IsTrue(newObject.IsEmpty); + // Call + var report = new ValidationReport(category, validationIssues, subReports); + + // Assert + Assert.IsInstanceOf>(report); + Assert.AreEqual(category, report.Category); + CollectionAssert.AreEqual(validationIssues, report.Issues); + CollectionAssert.AreEqual(subReports, report.SubReports); + Assert.AreEqual(ValidationSeverity.Error, report.Severity); } [Test] - public void SeverityIssues() + public void ParameteredConstructor_OnlyCategoryProvided_ExpectedValues() { + // Setup + var category = ""; + + // Call + var report = new ValidationReport(category, null); + + // Assert + Assert.AreEqual(category, report.Category); + CollectionAssert.IsEmpty(report.Issues); + CollectionAssert.IsEmpty(report.SubReports); + Assert.AreEqual(ValidationSeverity.None, report.Severity); + } + + [Test] + public void ParameteredConstructor_CategoryIsNull_ThrowArgumentNullException() + { + // Call + TestDelegate call = () => new ValidationReport(null, null); + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, + "Category/Concept moet gespecificeerd worden om een validatie rapport te maken."); + } + + [Test] + public void Severity_ReportHighestIssueSeverityIsWarning_ReturnWarning() + { + // Setup var report = CreateValidationReport(); + var subReport = report.SubReports.First(); - Assert.AreEqual(ValidationSeverity.Warning, subReport.Severity); + + // Call + var validationSeverity = subReport.Severity; + + // Assert + + Assert.AreEqual(ValidationSeverity.Warning, validationSeverity); } [Test] - public void SeverityRecursive() + public void Severity_ReportHasSubReportWithErrorSeverity_ReturnError() { + // Setup var report = CreateValidationReport(); - Assert.AreEqual(ValidationSeverity.Error, report.Severity); + + // Call + var validationSeverity = report.Severity; + + // Assert + Assert.AreEqual(ValidationSeverity.Error, validationSeverity); } [Test] - public void SeverityCount() + public void SeverityCount_ReportWithVariousChildReports_RecursivelyCountAllSeverities() { + // Setup var report = CreateValidationReport(); - Assert.AreEqual(1, report.ErrorCount); - Assert.AreEqual(4, report.WarningCount); - Assert.AreEqual(2, report.InfoCount); + + // Call + var errorCount = report.ErrorCount; + var warningCount = report.WarningCount; + var infoCount = report.InfoCount; + + // Assert + Assert.AreEqual(1, errorCount); + Assert.AreEqual(4, warningCount); + Assert.AreEqual(2, infoCount); } + [Test] + public void GetAllIssuesRecursive_ReportWithVariousChildReports_ReturnAllValidationIssues() + { + // Setup + var report = CreateValidationReport(); + + // Call + var allIssues = report.GetAllIssuesRecursive(); + + // Assert + var expectedCount = report.Issues.Count() + report.SubReports.Sum(sr => sr.Issues.Count() + sr.SubReports.Sum(sr2=>sr2.Issues.Count())); + Assert.AreEqual(expectedCount, allIssues.Count); + Assert.AreEqual(report.ErrorCount, allIssues.Count(i => i.Severity == ValidationSeverity.Error)); + Assert.AreEqual(report.WarningCount, allIssues.Count(i => i.Severity == ValidationSeverity.Warning)); + Assert.AreEqual(report.InfoCount, allIssues.Count(i => i.Severity == ValidationSeverity.Info)); + Assert.AreEqual(3, allIssues.Count(i => i.Severity == ValidationSeverity.None)); + foreach (ValidationIssue validationIssue in report.SubReports.SelectMany(sr => sr.Issues)) + { + CollectionAssert.Contains(allIssues, validationIssue); + } + foreach (ValidationIssue validationIssue in report.Issues) + { + CollectionAssert.Contains(allIssues, validationIssue); + } + } + + [Test] + public void Equals_ToItself_ReturnTrue() + { + // Setup + var report = CreateValidationReport(); + + // Call + var isEqual = report.Equals(report); + + // Assert + Assert.True(isEqual); + } + + [Test] + public void Equals_ToOtherObjectType_ReturnFalse() + { + // Setup + var report = CreateValidationReport(); + + // Call + var isEqual = report.Equals(new object()); + + // Assert + Assert.IsFalse(isEqual); + } + + [Test] + public void Equals_ToNull_ReturnFalse() + { + // Setup + var report = CreateValidationReport(); + + // Call + var isEqual = report.Equals(null); + + // Assert + Assert.IsFalse(isEqual); + } + + [Test] + public void Equals_ToSimilarObject_ReturnTrue() + { + // Setup + var report1 = CreateValidationReport(); + var report2 = CreateValidationReport(); + + // Call + var isEqual1 = report1.Equals(report2); + var isEqual2 = report2.Equals(report1); + + // Assert + Assert.True(isEqual1); + Assert.True(isEqual2); + } + + [Test] + public void Equals_DifferentCategory_ReturnFalse() + { + // Setup + var report1 = new ValidationReport("A", null); + var report2 = new ValidationReport("B", null); + + // Call + var isEqual1 = report1.Equals(report2); + var isEqual2 = report2.Equals(report1); + + // Assert + Assert.False(isEqual1); + Assert.False(isEqual2); + } + + [Test] + public void Equals_DifferentNumberOfIssues_ReturnFalse() + { + // Setup + var category = "A"; + + var report1 = new ValidationReport(category, null); + var report2 = new ValidationReport(category, new[]{new ValidationIssue("", "", ValidationSeverity.None, "") }); + + // Call + var isEqual1 = report1.Equals(report2); + var isEqual2 = report2.Equals(report1); + + // Assert + Assert.False(isEqual1); + Assert.False(isEqual2); + } + + [Test] + public void Equals_NotEqualIssues_ReturnFalse() + { + // Setup + var category = "A"; + + var report1 = new ValidationReport(category, new[] { new ValidationIssue("A", "", ValidationSeverity.None, "") }); + var report2 = new ValidationReport(category, new[] { new ValidationIssue("B", "", ValidationSeverity.None, "") }); + + // Call + var isEqual1 = report1.Equals(report2); + var isEqual2 = report2.Equals(report1); + + // Assert + Assert.False(isEqual1); + Assert.False(isEqual2); + } + + [Test] + public void Equals_DifferentSubReportCount_ReturnFalse() + { + // Setup + var report1 = new ValidationReport("A", null); + var report2 = new ValidationReport("A", null, new []{ new ValidationReport("A", null) }); + + // Call + var isEqual1 = report1.Equals(report2); + var isEqual2 = report2.Equals(report1); + + // Assert + Assert.False(isEqual1); + Assert.False(isEqual2); + } + + [Test] + public void Equals_DifferentSubReports_ReturnFalse() + { + // Setup + var report1 = new ValidationReport("A", null, new[] { new ValidationReport("B", null) }); + var report2 = new ValidationReport("A", null, new[] { new ValidationReport("A", null) }); + + // Call + var isEqual1 = report1.Equals(report2); + var isEqual2 = report2.Equals(report1); + + // Assert + Assert.False(isEqual1); + Assert.False(isEqual2); + } + + [Test] + public void GetHashCode_TwoEqualReports_ReturnEqualHashCodes() + { + // Setup + var report1 = CreateValidationReport(); + var report2 = CreateValidationReport(); + + // Call + var hashCode1 = report1.GetHashCode(); + var hashCode2 = report2.GetHashCode(); + + // Assert + Assert.AreEqual(hashCode1, hashCode2); + } + + [Test] + public void ToString_ForValidationReport_ReturnText() + { + // Setup + var report = CreateValidationReport(); + + // Call + var text = report.ToString(); + + // Assert + Assert.AreEqual("q, ernst: Error (1 fout(en), 4 waarschuwing(en), 2 info).", text); + } + private static ValidationReport CreateValidationReport() { var issue1 = new ValidationIssue("", "somename", ValidationSeverity.Warning, "");