public void RemovesTargetInvocationExceptionFromHeadOfList()
        {
            var nestedExceptions = GenerateTargetInvocationException();

            Assert.IsType <TargetInvocationException>(nestedExceptions);

            var message    = ExceptionUtility.GetMessage(nestedExceptions);
            var stackTrace = ExceptionUtility.GetStackTrace(nestedExceptions);

            string simplifiedMessage;
            var    taskExceptions = ExceptionConverter.ConvertExceptions(nestedExceptions.GetType().FullName, message, stackTrace, out simplifiedMessage);

            Assert.NotNull(taskExceptions);
            Assert.Equal(3, taskExceptions.Length);

            Assert.NotEqual(typeof(TargetInvocationException).FullName, taskExceptions[0].Type);

            nestedExceptions = nestedExceptions.InnerException;

            Assert.Equal(nestedExceptions.GetType().FullName, taskExceptions[0].Type);
            Assert.Equal(nestedExceptions.Message, taskExceptions[0].Message);
            Assert.Equal(nestedExceptions.StackTrace, taskExceptions[0].StackTrace);

            Assert.Equal(nestedExceptions.InnerException.GetType().FullName, taskExceptions[1].Type);
            Assert.Equal(nestedExceptions.InnerException.Message, taskExceptions[1].Message);
            Assert.Equal(nestedExceptions.InnerException.StackTrace, taskExceptions[1].StackTrace);

            Assert.Equal(nestedExceptions.InnerException.InnerException.GetType().FullName, taskExceptions[2].Type);
            Assert.Equal(nestedExceptions.InnerException.InnerException.Message, taskExceptions[2].Message);
            Assert.Equal(nestedExceptions.InnerException.InnerException.StackTrace, taskExceptions[2].StackTrace);
        }
        public void MultipleAfterTestExceptionsConvertedInReverseThrownOrder()
        {
            var afterExceptions = new Exception[3];

            afterExceptions[0] = GenerateSingleException();
            afterExceptions[1] = GenerateSingleException2();
            afterExceptions[2] = GenerateSingleException3();
            var exception = new AfterTestException(afterExceptions);

            var message    = ExceptionUtility.GetMessage(exception);
            var stackTrace = ExceptionUtility.GetStackTrace(exception);

            string simplifiedMessage;
            var    taskExceptions = ExceptionConverter.ConvertExceptions(exception.GetType().FullName, message,
                                                                         stackTrace, out simplifiedMessage);

            Assert.NotNull(taskExceptions);
            Assert.Equal(3, taskExceptions.Length);

            Assert.Equal(afterExceptions[0].GetType().FullName, taskExceptions[2].Type);
            Assert.Equal(afterExceptions[0].Message, taskExceptions[2].Message);
            Assert.Equal(afterExceptions[0].StackTrace, taskExceptions[2].StackTrace);

            Assert.Equal(afterExceptions[1].GetType().FullName, taskExceptions[1].Type);
            Assert.Equal(afterExceptions[1].Message, taskExceptions[1].Message);
            Assert.Equal(afterExceptions[1].StackTrace, taskExceptions[1].StackTrace);

            Assert.Equal(afterExceptions[2].GetType().FullName, taskExceptions[0].Type);
            Assert.Equal(afterExceptions[2].Message, taskExceptions[0].Message);
            Assert.Equal(afterExceptions[2].StackTrace, taskExceptions[0].StackTrace);

            // TODO: RS6 uses full exception name. Does previous versions?
            Assert.Equal("Xunit.Sdk.AfterTestException: One or more exceptions were thrown from After methods during test cleanup", simplifiedMessage);
        }
        public void ConvertsNestedExceptions()
        {
            // This will generate 3 nested exceptions
            var nestedExceptions = GenerateNestedExceptions();

            var message    = ExceptionUtility.GetMessage(nestedExceptions);
            var stackTrace = ExceptionUtility.GetStackTrace(nestedExceptions);

            string simplifiedMessage;
            var    taskExceptions = ExceptionConverter.ConvertExceptions(nestedExceptions.GetType().FullName, message, stackTrace, out simplifiedMessage);

            Assert.NotNull(taskExceptions);
            Assert.Equal(3, taskExceptions.Length);

            Assert.Equal(nestedExceptions.GetType().FullName, taskExceptions[0].Type);
            Assert.Equal(nestedExceptions.Message, taskExceptions[0].Message);
            Assert.Equal(nestedExceptions.StackTrace, taskExceptions[0].StackTrace);

            Assert.Equal(nestedExceptions.InnerException.GetType().FullName, taskExceptions[1].Type);
            Assert.Equal(nestedExceptions.InnerException.Message, taskExceptions[1].Message);
            Assert.Equal(nestedExceptions.InnerException.StackTrace, taskExceptions[1].StackTrace);

            Assert.Equal(nestedExceptions.InnerException.InnerException.GetType().FullName, taskExceptions[2].Type);
            Assert.Equal(nestedExceptions.InnerException.InnerException.Message, taskExceptions[2].Message);
            Assert.Equal(nestedExceptions.InnerException.InnerException.StackTrace, taskExceptions[2].StackTrace);
        }
        public void DoesNotRemoveTargetInvocationExceptionIfOnlyException()
        {
            var exception = GenerateSingleTargetInvocationException();

            var message    = ExceptionUtility.GetMessage(exception);
            var stackTrace = ExceptionUtility.GetStackTrace(exception);

            string simplifiedMessage;
            var    taskExceptions = ExceptionConverter.ConvertExceptions(exception.GetType().FullName, message, stackTrace, out simplifiedMessage);

            Assert.NotNull(taskExceptions);
            Assert.Equal(1, taskExceptions.Length);
        }
        public void SimplifiedMessageIsOutermostExceptionTypeShortNameAndMessage()
        {
            var nestedExceptions = GenerateNestedExceptions();

            var message    = ExceptionUtility.GetMessage(nestedExceptions);
            var stackTrace = ExceptionUtility.GetStackTrace(nestedExceptions);

            string simplifiedMessage;

            ExceptionConverter.ConvertExceptions(nestedExceptions.GetType().FullName, message, stackTrace, out simplifiedMessage);

            // TODO: RS6 uses full exception name. Does previous versions?
            Assert.Equal(nestedExceptions.GetType().FullName + ": " + nestedExceptions.Message, simplifiedMessage);
        }
        public void HandlesExceptionNotFormattedUsingExceptionUtility()
        {
            var singleException = GenerateSingleException();

            var message    = singleException.Message;
            var stackTrace = singleException.StackTrace;

            string simplifiedMessage;
            var    taskExceptions = ExceptionConverter.ConvertExceptions(singleException.GetType().FullName, message, stackTrace, out simplifiedMessage);

            Assert.NotNull(taskExceptions);
            Assert.Equal(1, taskExceptions.Length);
            Assert.Equal(singleException.GetType().FullName, taskExceptions[0].Type);
            Assert.Equal(singleException.Message, taskExceptions[0].Message);
            Assert.Equal(singleException.StackTrace, taskExceptions[0].StackTrace);
        }
        public void ConvertsToSingleException()
        {
            var singleException = GenerateSingleException();

            var message    = ExceptionUtility.GetMessage(singleException);
            var stackTrace = ExceptionUtility.GetStackTrace(singleException);

            string simplifiedMessage;
            var    taskExceptions = ExceptionConverter.ConvertExceptions(singleException.GetType().FullName, message, stackTrace, out simplifiedMessage);

            Assert.NotNull(taskExceptions);
            Assert.Equal(1, taskExceptions.Length);
            Assert.Equal(singleException.GetType().FullName, taskExceptions[0].Type);
            Assert.Equal(singleException.Message, taskExceptions[0].Message);
            Assert.Equal(singleException.StackTrace, taskExceptions[0].StackTrace);
        }
        public void ExceptionMessageContainingNewLineIsCaptured()
        {
            var expectedMessage = "This is my " + Environment.NewLine + "message";
            var singleException = GenerateSingleException(expectedMessage);

            var message    = ExceptionUtility.GetMessage(singleException);
            var stackTrace = ExceptionUtility.GetStackTrace(singleException);

            string simplifiedMessage;
            var    taskExceptions = ExceptionConverter.ConvertExceptions(singleException.GetType().FullName, message, stackTrace, out simplifiedMessage);

            Assert.NotNull(taskExceptions);
            Assert.Equal(1, taskExceptions.Length);
            Assert.Equal(singleException.GetType().FullName, taskExceptions[0].Type);
            Assert.Equal(expectedMessage, taskExceptions[0].Message);
            Assert.Equal(singleException.StackTrace, taskExceptions[0].StackTrace);
        }