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>()))); }
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; })); }
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)); }
public void IncrementalUpdate_returns_None_on_identical_lists() { var lists = OrderedCombinations(4); foreach (var list in lists) { Assert.IsFalse(ListChange.IncrementalChanges(list, list).HasValue); } }
public override void OnNext(IChange <ListOperation <T> > value) { if (value == null) { return; } var adapter = new ListChange <T, TAdaptee>(value, _selector); this.Adaptee.OnNext(adapter); }
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); }
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); }
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; })); }
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); } } }
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); }
public void NotifyListeners() { ListChange.Invoke(); }