public override ConstraintResult ApplyTo <TActual>(TActual actual) { var eq = new EqualConstraint(Expected); Description = Prefix + eq.Description; var success = eq.ApplyTo(actual).IsSuccess; if (AppliedOp == Op.Not) { success = !success; } return(new ErrConstraintResult(this, actual, success)); }
public override ConstraintResult ApplyTo <TActual>(TActual actual) { // null checks mimic how nunit equals work if (expected == null && actual == null) { return(new ConstraintResult(this, actual, true)); } if (expected == null) { return(new MessageConstraintResult(this, actual, "Expected is null")); } if (actual == null) { return(new MessageConstraintResult(this, actual, "Actual is null")); } // actual should contain all of the properties which expected has // though actual may have extra properties which expected does not var expectedProperties = new List <PropertyInfo>(expected.GetType().GetProperties().Where(p => propertiesToIgnore.Contains(p.Name) == false)); var actualProperties = new List <PropertyInfo>(actual.GetType().GetProperties()); var missingProperties = expectedProperties.Select(p => p.Name).Except(actualProperties.Select(p => p.Name)).ToList(); if (missingProperties.Any()) { return(new MessageConstraintResult(this, actual, $"Expected contains the following properties which actual is missing: {string.Join(", ", missingProperties)}")); } // loop though expected objects properties, and use nunit equal constraint to see if properties are equal var result = new MultiEqualsConstraintResult(this, actual); foreach (var expectedProperty in expectedProperties) { var expectedPropertyValue = expectedProperty.GetValue(expected, null); var actualPropertyValue = actualProperties.Single(p => p.Name == expectedProperty.Name).GetValue(actual, null); var equalConstraint = new EqualConstraint(expectedPropertyValue); result.AddResult(expectedProperty.Name, equalConstraint.ApplyTo(actualPropertyValue)); } return(result); }