using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using NUnit.Framework; namespace Xamarin.Forms.Core.UnitTests { public abstract class MultiPageTests : BaseTestFixture where T : Page { protected abstract MultiPage CreateMultiPage(); protected abstract T CreateContainedPage(); protected abstract int GetIndex (T page); [SetUp] public override void Setup() { base.Setup (); Device.PlatformServices = new MockPlatformServices (); } [TearDown] public override void TearDown() { base.TearDown (); Device.PlatformServices = null; } [Test] public void TestSetChildren () { var container = CreateMultiPage(); var page = (Page) container; int childCount = 0; page.ChildAdded += (sender, args) => childCount++; int pagesAdded = 0; container.PagesChanged += (sender, args) => { if (args.Action == NotifyCollectionChangedAction.Add) pagesAdded++; }; container.Children.Add (CreateContainedPage()); container.Children.Add (CreateContainedPage()); Assert.AreEqual (2, childCount); Assert.AreEqual (2, ((IElementController)page).LogicalChildren.Count); Assert.AreEqual (2, pagesAdded); } [Test] public void TestOverwriteChildren() { var page = CreateMultiPage(); page.Children.Add (CreateContainedPage()); page.Children.Add (CreateContainedPage()); int childCount = 0; int removeCount = 0; page.ChildAdded += (sender, args) => childCount++; page.ChildRemoved += (sender, args) => removeCount++; foreach (var child in page.Children.ToArray()) page.Children.Remove ((T)child); page.Children.Add (CreateContainedPage()); page.Children.Add (CreateContainedPage()); Assert.AreEqual (2, removeCount); Assert.AreEqual (2, childCount); Assert.AreEqual (2, ((IElementController)page).LogicalChildren.Count); } [Test] public void CurrentPageSetAfterAdd() { var page = CreateMultiPage(); Assert.That (page.CurrentPage, Is.Null); var child = CreateContainedPage(); bool property = false; page.PropertyChanged += (o, e) => { if (e.PropertyName == "CurrentPage") property = true; }; page.Children.Add (child); Assert.That (page.CurrentPage, Is.SameAs (child)); Assert.That (property, Is.True, "CurrentPage property change did not fire"); } [Test] public void CurrentPageChangedAfterRemove() { var page = CreateMultiPage(); var child = CreateContainedPage(); var child2 = CreateContainedPage(); page.Children.Add (child); page.Children.Add (child2); bool property = false; page.PropertyChanged += (o, e) => { if (e.PropertyName == "CurrentPage") property = true; }; page.Children.Remove (child); Assert.That (page.CurrentPage, Is.SameAs (child2), "MultiPage.CurrentPage is not set to a new page after current was removed"); Assert.That (property, Is.True, "CurrentPage property change did not fire"); } [Test] public void CurrentPageNullAfterRemove() { var page = CreateMultiPage(); var child = CreateContainedPage(); page.Children.Add (child); bool property = false; page.PropertyChanged += (o, e) => { if (e.PropertyName == "CurrentPage") property = true; }; page.Children.Remove (child); Assert.That (page.CurrentPage, Is.Null, "MultiPage.CurrentPage is still set after that page was removed"); Assert.That (property, Is.True, "CurrentPage property change did not fire"); } [Test] public void TemplatedPage() { var page = CreateMultiPage(); page.ItemTemplate = new DataTemplate (() => { var p = new ContentPage(); p.Content = new Label(); p.Content.SetBinding (Label.TextProperty, new Binding (".")); return p; }); page.ItemsSource = new[] { "Foo", "Bar" }; Action assertPage = (p, s) => { Assert.That (p, Is.InstanceOf()); var cp = (ContentPage) p; Assert.That (cp.Content, Is.InstanceOf