summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs')
-rw-r--r--Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs415
1 files changed, 415 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs b/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs
new file mode 100644
index 00000000..3c1e27ad
--- /dev/null
+++ b/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs
@@ -0,0 +1,415 @@
+using System;
+
+using NUnit.Framework;
+
+namespace Xamarin.Forms.Core.UnitTests
+{
+ internal class TestDeviceInfo : DeviceInfo
+ {
+ public TestDeviceInfo ()
+ {
+ CurrentOrientation = DeviceOrientation.Portrait;
+ }
+ public override Size PixelScreenSize
+ {
+ get { return new Size (100, 200); }
+ }
+
+ public override Size ScaledScreenSize
+ {
+ get { return new Size (50, 100); }
+ }
+
+ public override double ScalingFactor
+ {
+ get { return 2; }
+ }
+ }
+
+ [TestFixture]
+ public class MasterDetailPageUnitTests : BaseTestFixture
+ {
+ [SetUp]
+ public override void Setup()
+ {
+ base.Setup ();
+ var mockDeviceInfo = new TestDeviceInfo ();
+ Device.Info = mockDeviceInfo;
+ }
+
+ [Test]
+ public void TestConstructor ()
+ {
+
+ MasterDetailPage page = new MasterDetailPage ();
+
+ Assert.Null (page.Master);
+ Assert.Null (page.Detail);
+ }
+
+ [Test]
+ public void TestMasterSetter ()
+ {
+ MasterDetailPage page = new MasterDetailPage ();
+ var child = new ContentPage {Content = new Label (), Title = "Foo"};
+ page.Master = child;
+
+ Assert.AreEqual (child, page.Master);
+ }
+
+ [Test]
+ public void TestMasterSetNull ()
+ {
+ MasterDetailPage page = new MasterDetailPage ();
+ var child = new ContentPage {Content = new Label (), Title = "Foo"};
+ page.Master = child;
+
+ Assert.Throws<ArgumentNullException> (() => { page.Master = null; });
+ }
+
+ [Test]
+ public void TestMasterChanged ()
+ {
+ MasterDetailPage page = new MasterDetailPage ();
+ var child = new ContentPage {Content = new Label (), Title = "Foo"};
+
+ bool changed = false;
+ page.PropertyChanged += (sender, e) => {
+ if (e.PropertyName == "Master")
+ changed = true;
+ };
+
+ page.Master = child;
+
+ Assert.True (changed);
+ }
+
+ [Test]
+ public void TestDetailSetter ()
+ {
+ MasterDetailPage page = new MasterDetailPage ();
+ var child = new ContentPage {Content = new Label ()};
+ page.Detail = child;
+
+ Assert.AreEqual (child, page.Detail);
+ }
+
+ [Test]
+ public void TestDetailSetNull ()
+ {
+ MasterDetailPage page = new MasterDetailPage ();
+ var child = new ContentPage {Content = new Label ()};
+ page.Detail = child;
+
+ Assert.Throws<ArgumentNullException> ( () => { page.Detail = null; });
+ }
+
+ [Test]
+ public void TestDetailChanged ()
+ {
+ MasterDetailPage page = new MasterDetailPage ();
+ var child = new ContentPage {Content = new Label ()};
+
+ bool changed = false;
+ page.PropertyChanged += (sender, e) => {
+ if (e.PropertyName == "Detail")
+ changed = true;
+ };
+
+ page.Detail = child;
+
+ Assert.True (changed);
+ }
+
+ [Test]
+ public void ThrowsWhenMasterSetWithoutValidTitle ([Values (null, "")] string title)
+ {
+ var page = new MasterDetailPage ();
+ Assert.Throws<InvalidOperationException> (() => page.Master = new ContentPage {Title = title});
+ }
+
+ [Test]
+ public void TestThrowsWhenPackedWithoutSetting ()
+ {
+ MasterDetailPage page = new MasterDetailPage ();
+ Assert.Throws<InvalidOperationException> (() => new TabbedPage {Children = {page}});
+ }
+
+ [Test]
+ public void TestDoesNotThrowWhenPackedWithSetting ()
+ {
+ MasterDetailPage page = new MasterDetailPage {
+ Master = new ContentPage {Content = new View (), Title = "Foo"},
+ Detail = new ContentPage {Content = new View ()}
+ };
+ Assert.DoesNotThrow (() => new TabbedPage {Children = {page}});
+ }
+
+ [Test]
+ public void TestMasterVisible ()
+ {
+ var page = new MasterDetailPage ();
+
+ Assert.AreEqual (false, page.IsPresented);
+
+ bool signaled = false;
+ page.PropertyChanged += (sender, args) => {
+ if (args.PropertyName == MasterDetailPage.IsPresentedProperty.PropertyName)
+ signaled = true;
+ };
+
+ page.IsPresented = true;
+
+ Assert.AreEqual (true, page.IsPresented);
+ Assert.True (signaled);
+ }
+
+ [Test]
+ public void TestMasterVisibleDoubleSet ()
+ {
+ var page = new MasterDetailPage ();
+
+ bool signaled = false;
+ page.PropertyChanged += (sender, args) => {
+ if (args.PropertyName == MasterDetailPage.IsPresentedProperty.PropertyName)
+ signaled = true;
+ };
+
+ page.IsPresented = page.IsPresented;
+
+ Assert.False (signaled);
+ }
+
+ [Test]
+ public void TestSetMasterBounds ()
+ {
+ var page = new MasterDetailPage {
+ Master = new ContentPage {Content = new View (), Title = "Foo"},
+ Detail = new ContentPage {Content = new View ()}
+ };
+
+ page.MasterBounds = new Rectangle (0, 0, 100, 100);
+ Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.Master.Bounds);
+ Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.MasterBounds);
+ }
+
+ [Test]
+ public void TestSetDetailBounds ()
+ {
+ var page = new MasterDetailPage {
+ Master = new ContentPage {Content = new View (), Title = "Foo"},
+ Detail = new ContentPage {Content = new View ()}
+ };
+
+ page.DetailBounds = new Rectangle (0, 0, 100, 100);
+ Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.Detail.Bounds);
+ Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.DetailBounds);
+ }
+
+ [Test]
+ public void TestLayoutChildren ()
+ {
+ var page = new MasterDetailPage {
+ Master = new ContentPage { Content = new View (), IsPlatformEnabled = true, Title = "Foo" },
+ Detail = new ContentPage { Content = new View (), IsPlatformEnabled = true },
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform ()
+ };
+
+ page.MasterBounds = new Rectangle (0, 0, 100, 200);
+ page.DetailBounds = new Rectangle (0, 0, 100, 100);
+
+ page.Master.Layout (new Rectangle(0, 0, 1, 1));
+ page.Detail.Layout (new Rectangle(0, 0, 1, 1));
+
+ page.Layout (new Rectangle (0, 0, 200, 200));
+
+ Assert.AreEqual (new Rectangle (0, 0, 100, 200), page.Master.Bounds);
+ Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.Detail.Bounds);
+ }
+
+ [Test]
+ public void ThorwsInLayoutChildrenWithNullDetail ()
+ {
+ var page = new MasterDetailPage {
+ Master = new ContentPage { Content = new View (), IsPlatformEnabled = true, Title = "Foo" },
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform ()
+ };
+
+ Assert.Throws<InvalidOperationException> (() => page.Layout (new Rectangle (0, 0, 200, 200)));
+ }
+
+ [Test]
+ public void ThorwsInLayoutChildrenWithNullMaster ()
+ {
+ var page = new MasterDetailPage {
+ Detail = new ContentPage { Content = new View (), IsPlatformEnabled = true },
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform ()
+ };
+
+ Assert.Throws<InvalidOperationException> (() => page.Layout (new Rectangle(0, 0, 200, 200)));
+ }
+
+ [Test]
+ public void ThorwsInSetDetailBoundsWithNullDetail ()
+ {
+ var page = new MasterDetailPage {
+ Master = new ContentPage {Content = new View (), Title = "Foo"},
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform ()
+ };
+
+ Assert.Throws<InvalidOperationException> (() => page.DetailBounds = new Rectangle(0, 0, 200, 200));
+ }
+
+ [Test]
+ public void ThrowsInSetMasterBoundsWithNullMaster ()
+ {
+ var page = new MasterDetailPage {
+ Detail = new ContentPage {Content = new View ()},
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform ()
+ };
+
+ Assert.Throws<InvalidOperationException> (() => page.MasterBounds = new Rectangle(0, 0, 200, 200));
+ }
+
+ [Test]
+ public void ThrowsInSetIsPresentOnSplitModeOnTablet ()
+ {
+ Device.Idiom = TargetIdiom.Tablet;
+ var page = new MasterDetailPage {
+ Master = new ContentPage { Content = new View (), IsPlatformEnabled = true, Title = "Foo" },
+ Detail = new ContentPage { Content = new View (), IsPlatformEnabled = true },
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform (),
+ MasterBehavior = MasterBehavior.Split
+ };
+
+ Assert.Throws<InvalidOperationException> (() => page.IsPresented = false);
+ }
+
+ [Test]
+ public void ThorwsInSetIsPresentOnSplitPortraitModeOnTablet ()
+ {
+ Device.Idiom = TargetIdiom.Tablet;
+ Device.Info.CurrentOrientation = DeviceOrientation.Portrait;
+
+ var page = new MasterDetailPage {
+ Master = new ContentPage { Content = new View (), IsPlatformEnabled = true, Title = "Foo" },
+ Detail = new ContentPage { Content = new View (), IsPlatformEnabled = true },
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform (),
+ MasterBehavior = MasterBehavior.SplitOnPortrait
+ };
+
+ Assert.Throws<InvalidOperationException> (() => page.IsPresented = false);
+ }
+
+ [Test]
+ public void TestSetIsPresentedOnPopoverMode ()
+ {
+ Device.Info.CurrentOrientation = DeviceOrientation.Landscape;
+
+ var page = new MasterDetailPage {
+ Master = new ContentPage { Content = new View (), IsPlatformEnabled = true, Title = "Foo" },
+ Detail = new ContentPage { Content = new View (), IsPlatformEnabled = true },
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform (),
+ MasterBehavior = MasterBehavior.Popover
+ };
+ page.IsPresented = true;
+
+ Assert.AreEqual (true, page.IsPresented);
+ }
+
+ [Test]
+ public void SendsBackEventToPresentedMasterFirst ()
+ {
+ var detail = new BackButtonPage () {Handle = true};
+ var master = new BackButtonPage () {Title = "Master"};
+ var mdp = new MasterDetailPage () {
+ Detail = detail,
+ Master = master,
+ IsPresented = true,
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform ()
+ };
+
+ mdp.BackButtonPressed += (sender, args) => {
+ args.Handled = mdp.IsPresented;
+ mdp.IsPresented = false;
+ };
+
+ var detailEmitted = false;
+ var masterEmitted = false;
+
+ detail.BackPressed += (sender, args) => detailEmitted = true;
+ master.BackPressed += (sender, args) => masterEmitted = true;
+
+ var result = mdp.SendBackButtonPressed ();
+
+ Assert.True (masterEmitted);
+ Assert.False (detailEmitted);
+ Assert.True (result);
+ }
+
+ [Test]
+ public void EmitsCorrectlyWhenPresentedOnBackPressed ()
+ {
+ var detail = new BackButtonPage ();
+ var master = new BackButtonPage { Title = "Master" };
+ var mdp = new MasterDetailPage {
+ Detail = detail,
+ Master = master,
+ IsPresented = true,
+ IsPlatformEnabled = true,
+ Platform = new UnitPlatform ()
+ };
+
+ mdp.BackButtonPressed += (sender, args) => {
+ args.Handled = mdp.IsPresented;
+ mdp.IsPresented = false;
+ };
+
+ var detailEmitted = false;
+ var masterEmitted = false;
+
+ detail.BackPressed += (sender, args) => detailEmitted = true;
+ master.BackPressed += (sender, args) => masterEmitted = true;
+
+ var result = mdp.SendBackButtonPressed ();
+
+ Assert.True (masterEmitted);
+ Assert.False (detailEmitted);
+ Assert.True (result);
+ }
+
+ [Test]
+ public void ThrowsExceptionWhenAddingAlreadyParentedDetail ()
+ {
+ var detail = new ContentPage {};
+
+ // give detail a parent
+ var nav = new NavigationPage (detail);
+
+ var mdp = new MasterDetailPage ();
+ Assert.Throws<InvalidOperationException> (() => mdp.Detail = detail);
+ }
+
+ [Test]
+ public void ThrowsExceptionWhenAddingAlreadyParentedMaster ()
+ {
+ var master = new ContentPage { Title = "Foo" };
+
+ // give master a parent
+ var nav = new NavigationPage (master);
+
+ var mdp = new MasterDetailPage ();
+ Assert.Throws<InvalidOperationException> (() => mdp.Master = master);
+ }
+ }
+
+}