예제 #1
0
        public void DoNotResolveOrRejectAfterCancel()
        {
            // arrange
            var scheduler = new Mock <IScheduler>();

            scheduler.Setup(s => s.Schedule(It.IsAny <Action>())).Callback <Action>(action => action());
            var cancelInvoked  = false;
            var cancel         = new Action(() => { cancelInvoked = true; });
            var resolveInvoked = false;
            var resolve        = new ResolvedCallback <object>(val => { resolveInvoked = true; });
            var rejectInvoked  = false;
            var reject         = new RejectedCallback(reason => { rejectInvoked = true; });

            // act
            var deferred = scheduler.Object.Defer <object>(cancel);

            deferred.Promise.Then(resolve, reject);
            var cancelled = deferred.Promise.Cancel();
            var resolved  = deferred.Resolve(new object());
            var rejected  = deferred.Reject(new Exception());

            // assert
            Assert.That(cancelled, Is.True, "Expected cancel to be successful");
            Assert.That(cancelInvoked, Is.True, "Expected cancel action to be invoked");
            Assert.That(resolved, Is.False, "Did not expect the resolve call to be successful");
            Assert.That(resolveInvoked, Is.False, "Did not expect the resolve callback to be invoked");
            Assert.That(rejected, Is.False, "Did not expect the reject call to be successful");
            Assert.That(rejectInvoked, Is.False, "Did not expect the reject callback to be invoked");
        }
예제 #2
0
 /// <summary>
 /// Enqueues the given <paramref name="callback"/>.
 /// </summary>
 /// <param name="callback">The callback which to enqueue.</param>
 private void Enqueue(RejectedCallback callback)
 {
     // make sure we are the only thread updating the state of this promise
     lock (stateSyncRoot)
     {
         // if the promise is unfulfilled, register the callback
         if (state == PromiseStates.Unfulfilled)
         {
             rejectedCallbacks.Enqueue(callback);
         }
         // if the promise was already rejected, schedule the callback on the event loop
         else if (state == PromiseStates.Rejected)
         {
             scheduler.Schedule(() => callback(rejectionReason));
         }
     }
 }
예제 #3
0
        /// <summary>
        /// Registers
        /// </summary>
        /// <param name="resolvedCallback">The <see cref="ResolvedCallback{TResult}"/> invoked if the promise is resolved.</param>
        /// <param name="rejectedCallback">The <see cref="RejectedCallback"/> invoked if the promise is rejected.</param>
        public void Then(ResolvedCallback <TValue> resolvedCallback, RejectedCallback rejectedCallback = null)
        {
            // validate arguments
            if (resolvedCallback == null)
            {
                throw new ArgumentNullException("resolvedCallback");
            }

            // enqueue the resolved callback
            Enqueue(resolvedCallback);

            // if there is a rejection handler, enqueue it
            if (rejectedCallback != null)
            {
                Enqueue(rejectedCallback);
            }
        }
예제 #4
0
        public void RejectBeforeAttachingHandler()
        {
            // arrange
            var result          = new Exception();
            var callbackInvoked = false;
            var callback        = new RejectedCallback(res => { callbackInvoked = true; });
            var scheduler       = new Mock <IScheduler>();

            scheduler.Setup(s => s.Schedule(It.IsAny <Action>())).Callback <Action>(action => action());

            // act
            var deferred = scheduler.Object.Defer <object>();

            deferred.Reject(result);
            deferred.Promise.Then(value => { }, callback);

            // assert
            scheduler.VerifyAll();
            Assert.That(callbackInvoked, Is.True);
        }
예제 #5
0
        public void DoNoRejectAfterResolve()
        {
            // arrange
            var scheduler = new Mock<IScheduler>();
            scheduler.Setup(s => s.Schedule(It.IsAny<Action>())).Callback<Action>(action => action());
            var resolveInvoked = false;
            var resolve = new ResolvedCallback<object>(val => { resolveInvoked = true; });
            var rejectInvoked = false;
            var reject = new RejectedCallback(reason => { rejectInvoked = true; });

            // act
            var deferred = scheduler.Object.Defer<object>();
            deferred.Promise.Then(resolve, reject);
            var resolved = deferred.Resolve(new object());
            var rejected = deferred.Reject(new Exception());

            // assert
            Assert.That(resolved, Is.True, "Expect the resolve call to be successful");
            Assert.That(resolveInvoked, Is.True, "Expect the resolve callback to be invoked");
            Assert.That(rejected, Is.False, "Did not expect the reject call to be successful");
            Assert.That(rejectInvoked, Is.False, "Did not expect the reject callback to be invoked");
        }
예제 #6
0
        public void RejectBeforeAttachingHandler()
        {
            // arrange
            var result = new Exception();
            var callbackInvoked = false;
            var callback = new RejectedCallback(res => { callbackInvoked = true; });
            var scheduler = new Mock<IScheduler>();
            scheduler.Setup(s => s.Schedule(It.IsAny<Action>())).Callback<Action>(action => action());

            // act
            var deferred = scheduler.Object.Defer<object>();
            deferred.Reject(result);
            deferred.Promise.Then(value => { }, callback);

            // assert
            scheduler.VerifyAll();
            Assert.That(callbackInvoked, Is.True);
        }