Exemple #1
0
        public void IncrementalUpdate_makes_correct_number_of_changes()
        {
            Assert.AreEqual(
                2,
                CountChanges(
                    ListChange.IncrementalChanges(
                        new[] { 1, 2, 3 },
                        new[] { 1, 2, 3, 4, 5 }).Or(ListChange.None <int>())));

            Assert.AreEqual(
                2,
                CountChanges(
                    ListChange.IncrementalChanges(
                        new[] { 1, 2, 5 },
                        new[] { 1, 2, 3, 4, 5 }).Or(ListChange.None <int>())));

            Assert.AreEqual(
                2,
                CountChanges(
                    ListChange.IncrementalChanges(
                        new[] { 1, 2, 3, 4, 5 },
                        new[] { 1, 2, 3 }).Or(ListChange.None <int>())));

            Assert.AreEqual(
                2,
                CountChanges(
                    ListChange.IncrementalChanges(
                        new[] { 1, 2, 3, 4, 5 },
                        new[] { 1, 2, 5 }).Or(ListChange.None <int>())));
        }
Exemple #2
0
        public virtual ListChange <T>[] ReadNonIndexListChanges <T>(Func <T> ReadChange)
        {
            return(ReadListChanges(() =>
            {
                var changeType = ReadByte();
                var change = new ListChange <T>();
                switch (changeType)
                {
                case 0x00:
                    change.Operation = ListChangeOperation.Add;
                    change.Value = ReadChange();
                    break;

                case 0x01:
                    change.Operation = ListChangeOperation.Remove;
                    change.Value = ReadChange();
                    break;

                case 0x03:
                    change.Operation = ListChangeOperation.ClearAll;
                    break;
                }

                return change;
            }));
        }
Exemple #3
0
            public override void OnNext(ChangedListData <T> value)
            {
                var change = new ListChange <T, TAdaptee>(value.Change, _selector);
                var state  = new ListAdapter <T, TAdaptee>(value.ReachedState, _selector);

                this.Adaptee.OnNext(new ChangedListData <TAdaptee>(change, state));
            }
Exemple #4
0
        public void IncrementalUpdate_returns_None_on_identical_lists()
        {
            var lists = OrderedCombinations(4);

            foreach (var list in lists)
            {
                Assert.IsFalse(ListChange.IncrementalChanges(list, list).HasValue);
            }
        }
Exemple #5
0
            public override void OnNext(IChange <ListOperation <T> > value)
            {
                if (value == null)
                {
                    return;
                }

                var adapter = new ListChange <T, TAdaptee>(value, _selector);

                this.Adaptee.OnNext(adapter);
            }
Exemple #6
0
        int CountChanges <T>(ListChange <T> changes)
        {
            var count = 0;

            changes(
                insert: (index, item) => ++ count,
                replace: (index, item) => ++ count,
                remove: index => ++ count,
                clear: () => ++ count);
            return(count);
        }
Exemple #7
0
        public virtual ListChange <T>[] ReadListChanges <T>(Func <ListChange <T> > CreateChange)
        {
            //size, nut sure if we need to use this here.
            var size    = ReadInt32();
            var udpates = ReadInt32();

            var arr = new ListChange <T> [size];

            for (int i = 0; i < size; i++)
            {
                arr[i] = CreateChange();
            }

            return(arr);
        }
Exemple #8
0
        public virtual ListChange <T>[] ReadIndexedListChanges <T>(Func <T> ReadChange, Func <T> ReadReset = null)
        {
            if (ReadReset == null)
            {
                ReadReset = ReadChange;
            }

            return(ReadListChanges(() =>
            {
                var changeType = ReadByte();
                var change = new ListChange <T>();
                switch (changeType)
                {
                case 0x00:
                    change.Operation = ListChangeOperation.Remove;
                    change.Index = ReadInt16();
                    break;

                case 0x01:
                    change.Operation = ListChangeOperation.Add;
                    change.Index = ReadInt16();
                    change.Value = ReadChange();
                    break;

                case 0x02:
                    change.Operation = ListChangeOperation.Change;
                    change.Value = ReadChange();
                    break;

                case 0x03:
                    change.Operation = ListChangeOperation.ResetAll;
                    var size = ReadInt16();
                    change.Values = new T[size];
                    for (int j = 0; j < size; j++)
                    {
                        change.Values[j] = ReadReset();
                    }
                    break;

                case 0x04:
                    change.Operation = ListChangeOperation.ClearAll;
                    break;
                }

                return change;
            }));
        }
Exemple #9
0
        public void Applying_IncrementalUpdate_on_List_returns_correct_result()
        {
            var lists = OrderedCombinations(5);

            foreach (var oldList in lists)
            {
                foreach (var newList in lists)
                {
                    var maybeChanges = ListChange.IncrementalChanges(oldList, newList);

                    var result = oldList.ToList();

                    foreach (var changes in maybeChanges)
                    {
                        changes.Apply(result);
                    }
                    CollectionAssert.AreEqual(newList, result);
                }
            }
        }
Exemple #10
0
        private static IChange <ListOperation <TAdaptee> > Apply <T, TAdaptee>(
            [NotNull] this SelectState <T, TAdaptee> state,
            [NotNull] IChange <ListOperation <T> > value,
            [NotNull] Func <T, TAdaptee> func)
        {
            Dictionary <T, TAdaptee> removedOnChange = null;

            foreach (var update in value.Operations())
            {
                switch (update.Type)
                {
                case ListOperationType.Add:
                    state.OnAdd(update.Item, func, removedOnChange);
                    break;

                case ListOperationType.Remove:
                    state.OnRemove(update.Item, ref removedOnChange);
                    break;

                case ListOperationType.Move:
                    break;

                case ListOperationType.Replace:
                    state.OnRemove(update.Item, ref removedOnChange);
                    state.OnAdd(update.Item, func, removedOnChange);
                    break;

                case ListOperationType.Clear:
                    state.Clear();
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            var adapter = new ListChange <T, TAdaptee>(value, state, removedOnChange);

            return(adapter);
        }
Exemple #11
0
 public void NotifyListeners()
 {
     ListChange.Invoke();
 }