public void CanCreateFromIObservableVector() { RunOnUIThread.Execute(() => { var data = new WinRTObservableVector(Enumerable.Range(0, 100).Select(i => string.Format("Item #{0}", i))); var dataSource = new InspectingDataSource(data); var recorder = new CollectionChangeRecorder(dataSource); Verify.AreEqual(100, dataSource.Count); Verify.AreEqual("Item #4", (string)dataSource.GetAt(4)); Verify.IsFalse(dataSource.HasKeyIndexMapping); data.Insert(4, "Inserted Item"); data.RemoveAt(7); data[15] = "Replaced Item"; data.Clear(); VerifyRecordedCollectionChanges( expected: new NotifyCollectionChangedEventArgs[] { CollectionChangeEventArgsConverters.CreateNotifyArgs(NotifyCollectionChangedAction.Add, -1, 0, 4, 1), CollectionChangeEventArgsConverters.CreateNotifyArgs(NotifyCollectionChangedAction.Remove, 7, 1, -1, 0), CollectionChangeEventArgsConverters.CreateNotifyArgs(NotifyCollectionChangedAction.Replace, 15, 1, 15, 1), CollectionChangeEventArgsConverters.CreateNotifyArgs(NotifyCollectionChangedAction.Reset, -1, 0, -1, 0), }, actual: recorder.RecordedArgs); }); }
public void CanCreateFromIBindableIterable() { RunOnUIThread.Execute(() => { var dataSource = new InspectingDataSource(Enumerable.Range(0, 100)); Verify.AreEqual(100, dataSource.Count); Verify.AreEqual(4, dataSource.GetAt(4)); }); }
public void ValidateGetSetItemsSource() { RunOnUIThread.Execute(() => { ItemsRepeater repeater = new ItemsRepeater(); var dataSource = new InspectingDataSource(Enumerable.Range(0, 10).Select(i => string.Format("Item #{0}", i))); repeater.SetValue(ItemsRepeater.ItemsSourceProperty, dataSource); Verify.AreSame(dataSource, repeater.GetValue(ItemsRepeater.ItemsSourceProperty) as ItemsSourceView); Verify.AreSame(dataSource, repeater.ItemsSourceView); }); }
public void VerifyUniqueIdMappingInterface() { RunOnUIThread.Execute(() => { var data = new ObservableVectorWithUniqueIds(Enumerable.Range(0, 10)); var dataSource = new InspectingDataSource(data); Verify.AreEqual(10, dataSource.Count); Verify.AreEqual(true, dataSource.HasKeyIndexMapping); Verify.AreEqual(5, dataSource.IndexFromKey("5")); Verify.AreEqual("5", dataSource.KeyFromIndex(5)); }); }
public void ValidateGetElementAtCachingForLayout() { List <int> data = Enumerable.Range(0, 15).ToList(); ItemsSourceView dataSource = null; RunOnUIThread.Execute(() => dataSource = new InspectingDataSource(data)); ScrollViewer scrollViewer = null; var repeater = SetupRepeater(dataSource, null /*layout*/, out scrollViewer); bool layoutRan = false; RunOnUIThread.Execute(() => { var layout = new MockVirtualizingLayout(); layout.MeasureLayoutFunc = (availableSize, context) => { Verify.AreEqual(15, context.ItemCount); var element0 = context.GetOrCreateElementAt(0); Verify.IsNotNull(element0); var element1 = context.GetOrCreateElementAt(1); Verify.IsNotNull(element1); Verify.AreNotSame(element0, element1); var element1again = context.GetOrCreateElementAt(1); Verify.AreSame(element1, element1again); var element10 = context.GetOrCreateElementAt(10); Verify.IsNotNull(element10); Verify.AreNotSame(element0, element10); Verify.AreNotSame(element1, element10); context.RecycleElement(element1); var element0New = context.GetOrCreateElementAt(0); Verify.AreSame(element0, element0New); context.RecycleElement(element10); context.RecycleElement(element0); layoutRan = true; return(new Size(10, 10)); }; repeater.Layout = layout; repeater.UpdateLayout(); Verify.IsTrue(layoutRan); }); IdleSynchronizer.Wait(); }
public void VerifyIndexOfBehavior() { RunOnUIThread.Execute(() => { var collections = new List <IEnumerable>(); collections.Add(new ObservableVectorWithUniqueIds(Enumerable.Range(0, 10))); collections.Add(new ObservableCollection <int>(Enumerable.Range(0, 10))); foreach (var collection in collections) { var dataSource = new InspectingDataSource(collection); foreach (int i in collection) { Verify.AreEqual(i, dataSource.IndexOf(i)); } Verify.AreEqual(-1, dataSource.IndexOf(11)); } #if false // On Uno the underlying field is an IList which does support IndexOf // Enumerabl.Range returns IEnumerable which does not provide IndexOf var testingItemsSourceView = new InspectingDataSource(Enumerable.Range(0, 10)); var index = -1; try { index = testingItemsSourceView.IndexOf(0); }catch (Exception) { } Verify.AreEqual(-1, index); #endif var nullContainingEnumerable = new CustomEnumerable(); var testingItemsSourceView2 = new InspectingDataSource(nullContainingEnumerable); Verify.AreEqual(1, testingItemsSourceView2.IndexOf(null)); }); }
public void ValidateElementClearingOrderFromFlowLayout() { ItemsSourceView dataSource = null; RunOnUIThread.Execute(() => dataSource = new InspectingDataSource(Enumerable.Range(0, 15).ToList())); ScrollViewer scrollViewer = null; var repeater = SetupRepeater(dataSource, null /*layout*/, out scrollViewer); List <int> clearedIndices = new List <int>(); var viewChangedEvent = new ManualResetEvent(false); RunOnUIThread.Execute(() => { scrollViewer.ViewChanged += (sender, args) => { if (!args.IsIntermediate) { viewChangedEvent.Set(); } }; repeater.Layout = new StackLayout(); repeater.ElementPrepared += (sender, args) => { ((FrameworkElement)args.Element).Height = 20; }; repeater.UpdateLayout(); repeater.ElementClearing += (sender, args) => { int index = repeater.GetElementIndex(args.Element); Log.Comment("Clearing.." + index); clearedIndices.Add(index); }; scrollViewer.ChangeView(null, 100.0, null, disableAnimation: true); }); Verify.IsTrue(viewChangedEvent.WaitOne(DefaultWaitTime), "Waiting for ViewChanged."); IdleSynchronizer.Wait(); RunOnUIThread.Execute(() => { // Validate order is 0, 1, 2, 3 for (int i = 0; i < 4; i++) { Verify.AreEqual(i, clearedIndices[i]); } clearedIndices.Clear(); viewChangedEvent.Reset(); scrollViewer.ChangeView(null, 0.0, null, disableAnimation: true); }); Verify.IsTrue(viewChangedEvent.WaitOne(DefaultWaitTime), "Waiting for ViewChanged."); IdleSynchronizer.Wait(); RunOnUIThread.Execute(() => { // Validate order is backwards 14, 13, 12, 11 for (int i = 0; i < 4; i++) { Verify.AreEqual(14 - i, clearedIndices[i]); } }); }