public AssertionResult Assert(TP actualPropertyValue)
        {
            var notEqualMessage = FailingMessageFactory.CreateNotEqualMessage(_expectedValues, actualPropertyValue);

            var actualIsNull   = actualPropertyValue == null;
            var expectedIsNull = _expectedValues == null;

            // Both Null = fine
            if (actualIsNull && expectedIsNull)
            {
                return(AssertionResult.CreateSuccess());
            }

            // One Null = Not fine
            if (!actualIsNull ^ !expectedIsNull)
            {
                return(AssertionResult.CreateFail(notEqualMessage));
            }

            // Compare enumerables
            if (!(actualPropertyValue is IEnumerable <object> actualCollection))
            {
                var notEnumerableMessage = $"Actual '{ObjectInterpreter.GetStringRepresentation(actualPropertyValue)}' is not an IEnumerable.";
                return(AssertionResult.CreateFail(notEnumerableMessage));
            }

            if (actualCollection.HasSameElementsAs(_expectedValues))
            {
                return(AssertionResult.CreateSuccess());
            }

            return(AssertionResult.CreateFail(notEqualMessage));
        }
        internal static string CreateNotEqualMessage(object expected, object actual)
        {
            var expectedValueString = ObjectInterpreter.GetStringRepresentation(expected);
            var actualValueString   = ObjectInterpreter.GetStringRepresentation(actual);

            var message = $"Expected '{expectedValueString}' to equal actual '{actualValueString}'.";

            return(message);
        }
        public AssertionResult Assert()
        {
            var canCreateobject = ObjectFactory.TryCreatingObject(out T _, _constructorInfo, _argumentValues);

            if (canCreateobject && _constructingShouldFail)
            {
                var shouldFailMessage = $"    Arguments '{ObjectInterpreter.GetStringRepresentation(_argumentValues)}' should fail.";
                return(AssertionResult.CreateFail(shouldFailMessage));
            }

            if (!canCreateobject && !_constructingShouldFail)
            {
                var shouldNotFailMessage = $"    Arguments '{ObjectInterpreter.GetStringRepresentation(_argumentValues)}' should not fail.";
                return(AssertionResult.CreateFail(shouldNotFailMessage));
            }

            return(AssertionResult.CreateSuccess());
        }