public void TestConstructor_SetsSafeTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            Assert.IsNotNull(objectUnderTest.SafeTask);
            Assert.AreNotEqual(_tcs.Task, objectUnderTest.SafeTask);
        }
        public async Task TestIsPending_CompletedTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(Task.CompletedTask);

            await objectUnderTest.SafeTask;

            Assert.IsFalse(objectUnderTest.IsPending);
        }
        public async Task TestErrorMessage_IsAggregateMessageWithOnlyNullEmptyMessages()
        {
            var objectUnderTest = new TestAsyncPropertyBase(Task.FromException(new ExceptionWithNullMessage()));

            await objectUnderTest.SafeTask;

            Assert.AreEqual(new AggregateException(new ExceptionWithNullMessage()).Message, objectUnderTest.ErrorMessage);
        }
        public void TestGetTaskResultSafe_Result()
        {
            const string expectedResult = "Expected Result";

            string actualResult = TestAsyncPropertyBase.GetTaskResultSafe2(Task.FromResult(expectedResult));

            Assert.AreEqual(expectedResult, actualResult);
        }
        public async Task TestIsError_FaultedTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(Task.FromException(new Exception()));

            await objectUnderTest.SafeTask;

            Assert.IsTrue(objectUnderTest.IsError);
        }
        public void TestGetTaskResultSafe_ErrorDefaultValue()
        {
            const string expectedDefaultValue = "Expected Default Value";

            string actualResult = TestAsyncPropertyBase.GetTaskResultSafe2(Task.FromException <string>(new Exception()), expectedDefaultValue);

            Assert.AreEqual(expectedDefaultValue, actualResult);
        }
        public async Task TestIsCanceled_CanceledTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(Task.FromCanceled(new CancellationToken(true)));

            await objectUnderTest.SafeTask;

            Assert.IsTrue(objectUnderTest.IsCanceled);
        }
        public async Task TestIsSuccess_CompletedTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(Task.CompletedTask);

            await objectUnderTest.SafeTask;

            Assert.IsTrue(objectUnderTest.IsSuccess);
        }
        public async Task TestOnTaskComplete_NotCalledForNullask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(null);

            await objectUnderTest.SafeTask;

            Assert.AreEqual(0, objectUnderTest.OnTaskCompleteCallCount);
        }
        public async Task TestOnTaskComplete_CalledForSuccessTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            _tcs.SetResult(null);
            await objectUnderTest.SafeTask;

            Assert.AreEqual(1, objectUnderTest.OnTaskCompleteCallCount);
        }
        public async Task TestErrorMessage_SingleException()
        {
            const string testExceptionMessage = "Test Exception Message";
            var          objectUnderTest      = new TestAsyncPropertyBase(Task.FromException(new Exception(testExceptionMessage)));

            await objectUnderTest.SafeTask;

            Assert.AreEqual(testExceptionMessage, objectUnderTest.ErrorMessage);
        }
        public async Task TestOnTaskComplete_CalledForCanceledTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            _tcs.SetCanceled();
            await objectUnderTest.SafeTask;

            Assert.AreEqual(1, objectUnderTest.OnTaskCompleteCallCount);
        }
        public async Task TestSafeTask_DoesNotThrowOnPropertyChangedHandlerError()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            objectUnderTest.PropertyChanged += (sender, args) => throw new Exception();
            _tcs.SetResult(null);

            await objectUnderTest.SafeTask;
        }
        public async Task TestOnTaskComplete_CalledForFaultedTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            _tcs.SetException(new Exception());
            await objectUnderTest.SafeTask;

            Assert.AreEqual(1, objectUnderTest.OnTaskCompleteCallCount);
        }
        public void TestPropertyChangedRaised_PendingTask()
        {
            var objectUnderTest   = new TestAsyncPropertyBase(_tcs.Task);
            var changedProperties = new List <string>();

            objectUnderTest.PropertyChanged += (sender, args) => changedProperties.Add(args.PropertyName);

            CollectionAssert.AreEquivalent(new string[] { }, changedProperties);
        }
        public async Task TestErrorMessage_IsFirstNonNullEmptyMessageOfAggregateInnerExceptions()
        {
            const string testExceptionMessage = "Test Multi Exception Message";
            var          objectUnderTest      = new TestAsyncPropertyBase(_tcs.Task);

            _tcs.SetException(new[] { new ExceptionWithNullMessage(), new Exception(testExceptionMessage) });

            await objectUnderTest.SafeTask;

            Assert.AreEqual(testExceptionMessage, objectUnderTest.ErrorMessage);
        }
        public async Task TestPropertyChangedRaised_NullTask()
        {
            var objectUnderTest   = new TestAsyncPropertyBase(null);
            var changedProperties = new List <string>();

            objectUnderTest.PropertyChanged += (sender, args) => changedProperties.Add(args.PropertyName);

            await objectUnderTest.SafeTask;

            CollectionAssert.AreEquivalent(new string[] { }, changedProperties);
        }
        public void TestAllProperties_PendingTaskDefaults()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            Assert.IsTrue(objectUnderTest.IsPending);
            Assert.IsFalse(objectUnderTest.IsCompleted);
            Assert.IsFalse(objectUnderTest.IsSuccess);
            Assert.IsFalse(objectUnderTest.IsCanceled);
            Assert.IsFalse(objectUnderTest.IsError);
            Assert.IsNull(objectUnderTest.ErrorMessage);
        }
        public async Task TestPropertyChangedRaised_CanceledTask()
        {
            var objectUnderTest   = new TestAsyncPropertyBase(_tcs.Task);
            var changedProperties = new List <string>();

            objectUnderTest.PropertyChanged += (sender, args) => changedProperties.Add(args.PropertyName);

            _tcs.SetCanceled();
            await objectUnderTest.SafeTask;

            CollectionAssert.AreEquivalent(
                new[]
            {
                nameof(objectUnderTest.IsPending),
                nameof(objectUnderTest.IsCompleted),
                nameof(objectUnderTest.IsCanceled)
            }, changedProperties);
        }
        public async Task TestSafeTask_DoesNotThrowWithNullTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(null);

            await objectUnderTest.SafeTask;
        }
        public void TestOnTaskComplete_NotCalledForPendingTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            Assert.AreEqual(0, objectUnderTest.OnTaskCompleteCallCount);
        }
        public void TestConstructor_SetsActualTask()
        {
            var objectUnderTest = new TestAsyncPropertyBase(_tcs.Task);

            Assert.AreEqual(_tcs.Task, objectUnderTest.ActualTask);
        }
        public void TestGetTaskResultSafe_Error()
        {
            string actualResult = TestAsyncPropertyBase.GetTaskResultSafe2(Task.FromException <string>(new Exception()));

            Assert.AreEqual(default(string), actualResult);
        }