Example #1
0
 public void Cancelled(CancelledCallback cancelled)
 {
     if (cancelled == null)
     {
         return;
     }
     lock (_guard)
     {
         if (IsCompleted)
         {
             if (State == PromiseState.Cancelled)
             {
                 cancelled(_exception as CancelledException);
             }
         }
         else
         {
             _rejected += (ex, s) => {
                 var cancel = ex as CancelledException;
                 if (cancel != null)
                 {
                     cancelled(cancel);
                 }
             };
         }
     }
 }
Example #2
0
 private void HandleCompletedPromise(Promise previous)
 {
     try {
         HandleResult(previous.State, previous.Value);
     } catch (Exception ex) {
         RejectCallback.Call(EcmaValue.Undefined, EcmaValueUtility.GetValueFromException(ex));
     }
 }
Example #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Change&lt;T&gt;"/> class.
        /// </summary>
        /// <param name="owner">The owner.</param>
        /// <param name="valueToCache">The value to cache.</param>
        /// <param name="rejectCallback">The reject callback.</param>
        /// <param name="commitCallback">The commit callback.</param>
        /// <param name="description">The description.</param>
        protected Change(Object owner, T valueToCache, RejectCallback <T> rejectCallback, CommitCallback <T> commitCallback, string description)
        {
            Ensure.That(owner).Named("owner").IsNotNull();
            Ensure.That(rejectCallback).Named("rejectCallback").IsNotNull();

            this.Owner           = owner;
            this.CachedValue     = valueToCache;
            this._rejectCallback = rejectCallback;
            this._commitCallback = commitCallback;
            this.Description     = description;
        }
Example #4
0
        public void generic_iChange_commit_invoked_with_outOfRange_rejectReason()
        {
            var owner = new Object();
            var value = "Foo";
            RejectCallback <string> rc = e => { };
            CommitCallback <string> cc = e => { };
            var description            = string.Empty;
            var reason = (CommitReason)1000;

            var target = new ChangeMock <string>(owner, value, rc, cc, description);

            target.Commit(reason);
        }
Example #5
0
        public void generic_iChange_reject_invoked_with_invalid_rejectReason()
        {
            var owner = new Object();
            var value = "Foo";
            RejectCallback <string> rc = e => { };
            CommitCallback <string> cc = null;
            var description            = string.Empty;
            var reason = RejectReason.None;

            var target = new ChangeMock <string>(owner, value, rc, cc, description);

            target.Reject(reason);
        }
Example #6
0
        /// <summary>
        /// Caches the supplied item in the active change tracking service.
        /// </summary>
        /// <typeparam name="T">The system type of the item to cache.</typeparam>
        /// <param name="propertyName">Name of the property.</param>
        /// <param name="value">The value to cache.</param>
        /// <param name="restore">A delegate to call when the change tracking
        /// service needs to restore the cached change.</param>
        /// <param name="commit">A delegate to call when the change tracking
        /// service needs to commit the cached change. Passing a null item for
        /// this parameter means that this instance does not need to be notified when
        /// the change is committed.</param>
        /// <param name="direction">The direction.</param>
        /// <returns>
        /// A reference to the cached change as an instance of <see cref="IChange"/> interface.
        /// </returns>
        protected IChange CacheChange <T>(string propertyName, T value, RejectCallback <T> restore, CommitCallback <T> commit, AddChangeBehavior direction)
        {
            this.EnsureNotDisposed();
            if (this.IsTracking)
            {
                IChange iChange = new PropertyValueChange <T>(this, propertyName, value, restore, commit, string.Empty);

                ((IMemento)this).Memento.Add(iChange, direction);

                return(iChange);
            }

            return(null);
        }
Example #7
0
        public void generic_iChange_getChangedEntities()
        {
            var owner = new Object();
            var value = "Foo";
            RejectCallback <string> rc = e => { };
            CommitCallback <string> cc = e => { };
            var description            = string.Empty;

            var target = new ChangeMock <string>(owner, value, rc, cc, description);
            IEnumerable <Object> ce = target.GetChangedEntities();

            ce.Should().Not.Be.Null();
            ce.Count().Should().Be.EqualTo(1);
            ce.First().Should().Be.EqualTo(owner);
        }
Example #8
0
        public void generic_iChange_rejectCallback_is_invoked_on_reject()
        {
            var invoked = false;

            var owner = new Object();
            var value = "Foo";
            RejectCallback <string> rc = e => { invoked = true; };
            CommitCallback <string> cc = null;
            var description            = string.Empty;

            var target = new ChangeMock <string>(owner, value, rc, cc, description);

            target.Reject(RejectReason.Undo);

            invoked.Should().Be.True();
        }
Example #9
0
        public void generic_iChange_properties_tests()
        {
            var owner = new Object();
            var value = "Foo";
            RejectCallback <string> rc = e => { };
            CommitCallback <string> cc = e => { };
            var description            = string.Empty;

            var target = new ChangeMock <string>(owner, value, rc, cc, description);

            target.Should().Not.Be.Null();
            target.Owner.Should().Be.EqualTo(owner);
            target.CachedValue.Should().Be.EqualTo(value);
            target.Description.Should().Be.EqualTo(description);
            target.IsCommitSupported.Should().Be.True();
        }
Example #10
0
        public void generic_iChange_committed_fired()
        {
            int expected = 1;
            int actual   = 0;

            var owner = new Object();
            var value = "Foo";
            RejectCallback <string> rc = e => { };
            CommitCallback <string> cc = null;
            var description            = string.Empty;
            var reason = CommitReason.AcceptChanges;

            var target = new ChangeMock <string>(owner, value, rc, cc, description);

            target.Committed += (s, e) => { actual++; };
            target.Commit(reason);

            actual.Should().Be.EqualTo(expected);
        }
Example #11
0
        public void generic_iChange_rejectCallback_is_invoked_with_expected_values()
        {
            ChangeRejectedEventArgs <string> expected = null;

            var owner = new Object();
            var value = "Foo";
            RejectCallback <string> rc = e => { expected = e; };
            CommitCallback <string> cc = null;
            var description            = string.Empty;
            var reason = RejectReason.Undo;

            var target = new ChangeMock <string>(owner, value, rc, cc, description);

            target.Reject(reason);

            expected.Should().Not.Be.Null();
            expected.Source.Should().Be.EqualTo(target);
            expected.Reason.Should().Be.EqualTo(reason);
            expected.Entity.Should().Be.EqualTo(owner);
            expected.CachedValue.Should().Be.EqualTo(value);
        }
Example #12
0
        RejectCallback <T> GetRejectCallback <T>(string propertyName)
        {
            Delegate d;

            if (!this.rejectCallbacks.TryGetValue(propertyName, out d))
            {
                RejectCallback <T> callback = (pcr) =>
                {
                    var owner       = (MementoEntity)pcr.Source.Owner;
                    var actualValue = owner.GetPropertyValue <T>(propertyName);
                    var cb          = this.GetRejectCallback <T>(propertyName);

                    owner.CacheChangeOnRejectCallback(propertyName, actualValue, cb, null, pcr);
                    owner.SetPropertyValueCore(propertyName, pcr.CachedValue, null);
                };

                this.rejectCallbacks.Add(propertyName, callback);

                d = callback;
            }

            return((RejectCallback <T>)d);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="CollectionClearedChange&lt;T&gt;"/> class.
 /// </summary>
 /// <param name="owner">The owner.</param>
 /// <param name="descriptor">The descriptor.</param>
 /// <param name="rejectCallback">The reject callback.</param>
 /// <param name="commitCallback">The commit callback.</param>
 /// <param name="description">The description.</param>
 public CollectionClearedChange(Object owner, CollectionRangeDescriptor <T> descriptor, RejectCallback <CollectionRangeDescriptor <T> > rejectCallback, CommitCallback <CollectionRangeDescriptor <T> > commitCallback, string description)
     : base(owner, descriptor, rejectCallback, commitCallback, description)
 {
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="PropertyValueChange&lt;T&gt;"/> class.
 /// </summary>
 /// <param name="owner">The owner.</param>
 /// <param name="propertyName">Name of the property.</param>
 /// <param name="value">The value.</param>
 /// <param name="restoreCallback">The restore callback.</param>
 /// <param name="description">The description.</param>
 public PropertyValueChange(Object owner, string propertyName, T value, RejectCallback <T> restoreCallback, string description)
     : this(owner, propertyName, value, restoreCallback, null, description)
 {
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="PropertyValueChange&lt;T&gt;"/> class.
 /// </summary>
 /// <param name="owner">The owner.</param>
 /// <param name="propertyName">Name of the property.</param>
 /// <param name="value">The value.</param>
 /// <param name="restoreCallback">The restore callback.</param>
 /// <param name="commitCallback">The commit callback.</param>
 /// <param name="description">The description.</param>
 public PropertyValueChange(Object owner, string propertyName, T value, RejectCallback <T> restoreCallback, CommitCallback <T> commitCallback, string description)
     : base(owner, value, restoreCallback, commitCallback, description)
 {
     this.PropertyName = propertyName;
 }
Example #16
0
 internal IChange InvokeCacheChangeOnRejectCallback <T>(T value, RejectCallback <T> rejectCallback, CommitCallback <T> commitCallback, ChangeRejectedEventArgs <T> args)
 {
     return(base.CacheChangeOnRejectCallback("property-name", value, rejectCallback, commitCallback, args));
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="PropertyValueChange&lt;T&gt;"/> class.
 /// </summary>
 /// <param name="owner">The owner.</param>
 /// <param name="propertyName">Name of the property.</param>
 /// <param name="value">The value.</param>
 /// <param name="restoreCallback">The restore callback.</param>
 public PropertyValueChange(Object owner, string propertyName, T value, RejectCallback <T> restoreCallback)
     : this(owner, propertyName, value, restoreCallback, null, string.Empty)
 {
 }
Example #18
0
 public ChangeMock(object owner, T valueToCache, RejectCallback <T> rejectCallback, CommitCallback <T> commitCallback, string description)
     : base(owner, valueToCache, rejectCallback, commitCallback, description)
 {
 }
Example #19
0
 internal IChange InvokeCacheChange <T>(T value, RejectCallback <T> rc, CommitCallback <T> cc, AddChangeBehavior behavior)
 {
     return(base.CacheChange("property-name", value, rc, cc, behavior));
 }
Example #20
0
 public abstract Promise    Then(ResolveCallback then, RejectCallback fail);
        /// <summary>
        /// Called when during the inizialization process,
        /// override this method to be notified when the default
        /// ctor has been called.
        /// </summary>
        protected override void OnInitialize()
        {
            base.OnInitialize();

            #region itemAddedRejectCallback

            itemAddedRejectCallback = args =>
            {
                this.SuspendCaching();

                switch (args.Reason)
                {
                case RejectReason.Undo:
                    /*
                     * Stiamo facendo l'Undo di un elemento
                     * che è stato aggiunto:
                     *    - lo rimuoviamo;
                     *    - lo aggiungiamo alla coda delle Redo
                     */
                    this.Remove(args.CachedValue.Item);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.UndoRequest);
                    break;

                case RejectReason.Redo:
                    /*
                     * Stiamo facendo la Redo di un elemento che è
                     * stato aggiunto:
                     *    - dobbiamo riaggiungerlo;
                     *    - lo aggiungiamo alla coda delle Undo
                     */
                    this.Add(args.CachedValue.Item);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.RedoRequest);
                    break;

                case RejectReason.RejectChanges:
                case RejectReason.Revert:
                    /*
                     * Stiamo resettando lo stato di un elemento
                     * che è stato aggiunto:
                     *    - ci limitiamo a rimuoverlo
                     */
                    this.Remove(args.CachedValue.Item);
                    break;
                }

                this.ResumeCaching();
            };

            #endregion

            #region itemMovedRejectCallback

            this.itemMovedRejectCallback = args =>
            {
                this.SuspendCaching();

                switch (args.Reason)
                {
                case RejectReason.Undo:
                    /*
                     * Stiamo facendo l'Undo di un elemento
                     * che è stato spostato:
                     *    - lo rimettiamo al suo posto;
                     *    - lo aggiungiamo alla coda delle Redo;
                     */
                    this.Move(args.CachedValue.NewIndex, args.CachedValue.OldIndex);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.UndoRequest);
                    break;

                case RejectReason.Redo:
                    /*
                     * Stiamo facendo la Redo di un elemento che è
                     * stato spostato:
                     *    - dobbiamo rispostarlo;
                     *    - lo aggiungiamo alla coda delle Undo
                     */
                    this.Move(args.CachedValue.OldIndex, args.CachedValue.NewIndex);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.RedoRequest);
                    break;

                case RejectReason.RejectChanges:
                case RejectReason.Revert:
                    /*
                     * Stiamo resettando lo stato di un elemento
                     * che è stato spostato:
                     *    - ci limitiamo a rimetterlo al posto originario
                     */
                    this.Move(args.CachedValue.NewIndex, args.CachedValue.OldIndex);
                    break;
                }

                this.ResumeCaching();
            };

            #endregion

            #region itemRemovedRejectCallback

            this.itemRemovedRejectCallback = args =>
            {
                this.SuspendCaching();

                switch (args.Reason)
                {
                case RejectReason.Undo:
                    /*
                     * Stiamo facendo l'Undo di un elemento
                     * che è stato rimosso:
                     *    - lo rimettiamo al suo posto;
                     *    - lo aggiungiamo alla coda delle Redo;
                     */
                    this.Insert(args.CachedValue.Index, args.CachedValue.Item);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.UndoRequest);
                    break;

                case RejectReason.Redo:
                    /*
                     * Stiamo facendo la Redo di un elemento che è
                     * stato rimosso:
                     *    - dobbiamo rimuoverlo nuovamente;
                     *    - lo aggiungiamo alla coda delle Undo
                     */
                    this.Remove(args.CachedValue.Item);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.RedoRequest);
                    break;

                case RejectReason.RejectChanges:
                case RejectReason.Revert:
                    /*
                     * Stiamo resettando lo stato di un elemento
                     * che è stato rimosso:
                     *    - ci limitiamo a rimetterlo definitivamente al posto originario
                     */
                    this.Insert(args.CachedValue.Index, args.CachedValue.Item);
                    break;
                }

                this.ResumeCaching();
            };

            #endregion

            #region itemInsertedRejectCallback

            this.itemInsertedRejectCallback = args =>
            {
                this.SuspendCaching();

                switch (args.Reason)
                {
                case RejectReason.Undo:
                    /*
                     * Stiamo facendo l'Undo di un elemento
                     * che è stato inserito:
                     *    - lo togliamo;
                     *    - lo aggiungiamo alla coda delle Redo;
                     */
                    this.RemoveAt(args.CachedValue.Index);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.UndoRequest);
                    break;

                case RejectReason.Redo:
                    /*
                     * Stiamo facendo la Redo di un elemento che è
                     * stato inserito:
                     *    - dobbiamo reinserirlo;
                     *    - lo aggiungiamo alla coda delle Undo
                     */
                    this.Insert(args.CachedValue.Index, args.CachedValue.Item);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.RedoRequest);
                    break;

                case RejectReason.RejectChanges:
                case RejectReason.Revert:
                    /*
                     * Stiamo resettando lo stato di un elemento
                     * che è stato inserito:
                     *    - ci limitiamo a rimoverlo definitivamente
                     */
                    this.RemoveAt(args.CachedValue.Index);
                    break;
                }

                this.ResumeCaching();
            };

            #endregion

            #region itemReplacedRejectCallback

            this.itemReplacedRejectCallback = args =>
            {
                this.SuspendCaching();

                switch (args.Reason)
                {
                case RejectReason.Undo:
                    /*
                     * Stiamo facendo l'Undo di un elemento
                     * che è stato sostituito:
                     *    - lo togliamo e rimettiamo al suo posto quello vecchio;
                     *    - lo aggiungiamo alla coda delle Redo;
                     */
                    this[args.CachedValue.Index] = args.CachedValue.ReplacedItem;
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.UndoRequest);
                    break;

                case RejectReason.Redo:
                    /*
                     * Stiamo facendo la Redo di un elemento che è
                     * stato sostituito:
                     *    - dobbiamo rimmetere quello nuovo;
                     *    - lo aggiungiamo alla coda delle Undo
                     */
                    this[args.CachedValue.Index] = args.CachedValue.NewItem;
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.RedoRequest);
                    break;

                case RejectReason.RejectChanges:
                case RejectReason.Revert:
                    /*
                     * Stiamo resettando lo stato di un elemento
                     * che è stato sostituito:
                     *    - ci limitiamo a rimettere posto quello vecchio;
                     */
                    this[args.CachedValue.Index] = args.CachedValue.ReplacedItem;
                    break;
                }

                this.ResumeCaching();
            };

            #endregion

            #region collectionClearedRejectCallback

            this.collectionClearedRejectCallback = args =>
            {
                this.SuspendCaching();

                switch (args.Reason)
                {
                case RejectReason.Undo:
                    /*
                     * Stiamo facendo l'Undo della clear:
                     *    - rimettiamo a posto tutti gli elementi;
                     *    - aggiungiamo alla coda delle Redo;
                     */
                    this.AddRange(args.CachedValue.Items);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.UndoRequest);
                    break;

                case RejectReason.Redo:
                    /*
                     * Stiamo facendo la Redo della Clear:
                     *    - rifacciamo la Clear;
                     *    - lo aggiungiamo alla coda delle Undo
                     */
                    this.Clear();
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.RedoRequest);
                    break;

                case RejectReason.RejectChanges:
                case RejectReason.Revert:
                    /*
                     * Stiamo resettando lo stato da una clear:
                     *    - ci limitiamo a rimettere a posto tutti gli elementi;
                     */
                    this.AddRange(args.CachedValue.Items);
                    break;
                }

                this.ResumeCaching();
            };

            #endregion

            #region collectionAddRangeRejectCallback

            this.collectionAddRangeRejectCallback = args =>
            {
                this.SuspendCaching();

                switch (args.Reason)
                {
                case RejectReason.Undo:
                    /*
                     * Stiamo facendo l'Undo della AddRange:
                     *    - dobbiamo rimuovere tutti gli elementi "added";
                     *    - aggiungiamo alla coda delle Redo;
                     */
                    foreach (var addedItem in args.CachedValue.Items)
                    {
                        this.Remove(addedItem);
                    }

                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.UndoRequest);
                    break;

                case RejectReason.Redo:
                    /*
                     * Stiamo facendo la Redo della AddRange:
                     *    - rifacciamo la AddRange;
                     *    - lo aggiungiamo alla coda delle Undo
                     */
                    this.AddRange(args.CachedValue.Items);
                    this.Memento.Add(args.Source.Clone(), AddChangeBehavior.RedoRequest);
                    break;

                case RejectReason.RejectChanges:
                case RejectReason.Revert:
                    /*
                     * Stiamo resettando lo stato di una AddRange:
                     *    - Rimuoviamo tutti gli elementi added;
                     */
                    foreach (var addedItem in args.CachedValue.Items)
                    {
                        this.Remove(addedItem);
                    }
                    break;
                }

                this.ResumeCaching();
            };

            #endregion
        }
Example #22
0
 public abstract Promise <R> Then <R>(ResolveCallback <R> then, RejectCallback <R> fail);
Example #23
0
        protected virtual IChange CacheChangeOnRejectCallback <T>(string propertyName, T value, RejectCallback <T> rejectCallback, CommitCallback <T> commitCallback, ChangeRejectedEventArgs <T> args)
        {
            this.EnsureNotDisposed();
            switch (args.Reason)
            {
            case RejectReason.Undo:
                return(this.CacheChange(propertyName, value, rejectCallback, commitCallback, AddChangeBehavior.UndoRequest));

            case RejectReason.Redo:
                return(this.CacheChange(propertyName, value, rejectCallback, commitCallback, AddChangeBehavior.RedoRequest));

            case RejectReason.RejectChanges:
            case RejectReason.Revert:
                return(null);

            case RejectReason.None:
                throw new ArgumentOutOfRangeException();

            default:
                throw new EnumValueOutOfRangeException();
            }
        }
Example #24
0
 /// <summary>
 /// Caches the supplied item in the active change tracking service.
 /// </summary>
 /// <typeparam name="T">The system type of the item to cache.</typeparam>
 /// <param name="value">The value to cache.</param>
 /// <param name="restore">A delegate to call when the change tracking
 /// service needs to restore the cached change.</param>
 /// <param name="commit">A delegate to call when the change tracking
 /// service needs to commit the cached change. Passing a null item for
 /// this parameter means that this instance does not need to be notified when
 /// the change is committed.</param>
 /// <returns>
 /// A reference to the cached change as an instance of <see cref="IChange"/> interface.
 /// </returns>
 protected IChange CacheChange <T>(string propertyName, T value, RejectCallback <T> restore, CommitCallback <T> commit)
 {
     this.EnsureNotDisposed();
     return(this.CacheChange <T>(propertyName, value, restore, commit, AddChangeBehavior.Default));
 }
Example #25
0
 public Promise Catch(RejectCallback fail)
 {
     return(Then(null, fail));
 }
Example #26
0
 public HackedPropertyValueChange(Object owner, string value, RejectCallback <string> rc, CommitCallback <string> cc)
     : base(owner, "property-name", value, rc, cc, string.Empty)
 {
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="CollectionChange&lt;TDescriptor, TItem&gt;"/> class.
 /// </summary>
 /// <param name="owner">The owner.</param>
 /// <param name="descriptor">The descriptor.</param>
 /// <param name="rejectCallback">The reject callback.</param>
 /// <param name="commitCallback">The commit callback.</param>
 /// <param name="description">The description.</param>
 protected CollectionChange(Object owner, TDescriptor descriptor, RejectCallback <TDescriptor> rejectCallback, CommitCallback <TDescriptor> commitCallback, string description)
     : base(owner, descriptor, rejectCallback, commitCallback, description)
 {
 }
Example #28
0
 internal IChange InvokeCacheChange <T>(T value, RejectCallback <T> rc)
 {
     return(base.CacheChange("property-name", value, rc));
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="ItemRemovedCollectionChange&lt;T&gt;"/> class.
 /// </summary>
 /// <param name="owner">The owner.</param>
 /// <param name="descriptor">The descriptor.</param>
 /// <param name="rejectCallback">The reject callback.</param>
 /// <param name="commitCallback">The commit callback.</param>
 /// <param name="description">The description.</param>
 public ItemRemovedCollectionChange(Object owner, ItemChangedDescriptor <T> descriptor, RejectCallback <ItemChangedDescriptor <T> > rejectCallback, CommitCallback <ItemChangedDescriptor <T> > commitCallback, string description)
     : base(owner, descriptor, rejectCallback, commitCallback, description)
 {
 }
Example #30
0
 protected virtual IChange <T> Mock <T>(Object owner, T value, RejectCallback <T> rejectCallback, CommitCallback <T> commitCallback, string description)
 {
     return(new ChangeMock <T>(owner, value, rejectCallback, commitCallback, description));
 }