From 7e423a41d24b188f35315a1cde8594db747dcac9 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Mon, 1 Apr 2019 14:25:01 -0600 Subject: [PATCH] Extend Control Gallery to allow for Shell UI Tests (#5740) * enable UI tests for shell * - fix test for ios shell * - add scrollview so success is visible on ios * - add instructions * - add shell category --- .../Issue4684.xaml | 42 ++++++++++++++ .../Issue4684.xaml.cs | 50 +++++++++++++++++ .../TestPages/TestPages.cs | 65 ++++++++++++++++++++++ .../Xamarin.Forms.Controls.Issues.Shared.projitems | 16 +++++- Xamarin.Forms.Controls/App.cs | 1 - Xamarin.Forms.Controls/CoreGallery.cs | 1 + Xamarin.Forms.Controls/TestCases.cs | 7 ++- Xamarin.Forms.Controls/XamStore/StoreShell.xaml | 5 +- Xamarin.Forms.Controls/XamStore/StoreShell.xaml.cs | 12 +++- .../UITestCategories.cs | 2 +- Xamarin.Forms.Core/Shell/Shell.cs | 13 ++++- .../Xamarin.Forms.Material.Android.csproj | 1 - .../Renderers/ShellPageRendererTracker.cs | 4 +- .../Xamarin.Forms.Sandbox.Android.csproj | 1 - 14 files changed, 205 insertions(+), 15 deletions(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml new file mode 100644 index 0000000..f0d3198 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml.cs new file mode 100644 index 0000000..a252389 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4684.xaml.cs @@ -0,0 +1,50 @@ +using System; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +using Xamarin.Forms.Core.UITests; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Github, 4684, "[Android] don't clear shell content because native page isn't visible", + PlatformAffected.Android)] +#if UITEST + [NUnit.Framework.Category(UITestCategories.Shell)] +#endif + public sealed partial class Issue4684 : TestShell + { + public Issue4684() + { +#if APP + this.InitializeComponent(); +#endif + } + + protected override void Init() + { + } + +#if UITEST + [Test] + public void NavigatingBackAndForthDoesNotCrash() + { + TapInFlyout("Connect"); + RunningApp.Tap("Control"); + + TapInFlyout("Home"); + TapInFlyout("Connect"); + + RunningApp.Tap("Connect"); + RunningApp.Tap("Control"); + + RunningApp.WaitForElement("Success"); + } + +#endif + } +} diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/TestPages/TestPages.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/TestPages/TestPages.cs index 4b0b696..607e60f 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/TestPages/TestPages.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/TestPages/TestPages.cs @@ -562,6 +562,71 @@ namespace Xamarin.Forms.Controls protected abstract void Init(); } + + + + + public abstract class TestShell : Shell + { +#if UITEST + public IApp RunningApp => AppSetup.RunningApp; + + protected virtual bool Isolate => true; +#endif + + protected TestShell() : base(false) + { +#if APP + Init(); +#endif + } + +#if UITEST + [SetUp] + public void Setup() + { + if (Isolate) + { + AppSetup.BeginIsolate(); + } + else + { + AppSetup.EnsureMemory(); + AppSetup.EnsureConnection(); + } + + AppSetup.NavigateToIssue(GetType(), RunningApp); + } + + [TearDown] + public virtual void TearDown() + { + if (Isolate) + { + AppSetup.EndIsolate(); + } + } + + public void ShowFlyout() + { + RunningApp.WaitForElement("OK"); + RunningApp.Tap("OK"); + } + + + public void TapInFlyout(string text) + { + ShowFlyout(); + RunningApp.WaitForElement(text); + RunningApp.Tap(text); + } + + +#endif + + protected abstract void Init(); + + } } #if UITEST diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index a4755f1..582dcf2 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -10,6 +10,7 @@ + Bugzilla60787.xaml @@ -1131,7 +1132,7 @@ Designer - MSBuild:Compile + MSBuild:UpdateDesignTimeXaml @@ -1143,7 +1144,18 @@ Designer - MSBuild:Compile + MSBuild:UpdateDesignTimeXaml + + + + + Designer + MSBuild:UpdateDesignTimeXaml + + + Issue4684.xaml + + \ No newline at end of file diff --git a/Xamarin.Forms.Controls/App.cs b/Xamarin.Forms.Controls/App.cs index 0fe3ccc..aa1af7f 100644 --- a/Xamarin.Forms.Controls/App.cs +++ b/Xamarin.Forms.Controls/App.cs @@ -124,7 +124,6 @@ namespace Xamarin.Forms.Controls mdp.Master.Icon.SetAutomationPropertiesName("MDPICON"); return mdp; - //Device.SetFlags(new[] { "Shell_Experimental" }); //return new XamStore.StoreShell(); } diff --git a/Xamarin.Forms.Controls/CoreGallery.cs b/Xamarin.Forms.Controls/CoreGallery.cs index d1fcc05..b455399 100644 --- a/Xamarin.Forms.Controls/CoreGallery.cs +++ b/Xamarin.Forms.Controls/CoreGallery.cs @@ -217,6 +217,7 @@ namespace Xamarin.Forms.Controls new CoreViewContainer ("SwapRoot - NavigationPage", typeof(CoreNavigationPage)), new CoreViewContainer ("SwapRoot - TabbedPage", typeof(CoreTabbedPage)), new CoreViewContainer ("SwapRoot - BottomNavigation TabbedPage", typeof(CoreTabbedPageAsBottomNavigation)), + new CoreViewContainer ("SwapRoot - Store Shell", typeof(XamStore.StoreShell)), }; var template = new DataTemplate(typeof(TextCell)); diff --git a/Xamarin.Forms.Controls/TestCases.cs b/Xamarin.Forms.Controls/TestCases.cs index 05bc098..9910035 100644 --- a/Xamarin.Forms.Controls/TestCases.cs +++ b/Xamarin.Forms.Controls/TestCases.cs @@ -56,7 +56,12 @@ namespace Xamarin.Forms.Controls await Navigation.PushAsync (page); - } else { + } + else if (page is Shell) + { + Application.Current.MainPage = page; + } + else { await Navigation.PushModalAsync (page); } }; diff --git a/Xamarin.Forms.Controls/XamStore/StoreShell.xaml b/Xamarin.Forms.Controls/XamStore/StoreShell.xaml index a36ddd6..cf119bf 100644 --- a/Xamarin.Forms.Controls/XamStore/StoreShell.xaml +++ b/Xamarin.Forms.Controls/XamStore/StoreShell.xaml @@ -1,7 +1,8 @@ - - + diff --git a/Xamarin.Forms.Controls/XamStore/StoreShell.xaml.cs b/Xamarin.Forms.Controls/XamStore/StoreShell.xaml.cs index 42cbc0a..0fdc66e 100644 --- a/Xamarin.Forms.Controls/XamStore/StoreShell.xaml.cs +++ b/Xamarin.Forms.Controls/XamStore/StoreShell.xaml.cs @@ -5,16 +5,22 @@ using System.Text; using System.Threading.Tasks; using Xamarin.Forms; +using Xamarin.Forms.Internals; using Xamarin.Forms.Xaml; namespace Xamarin.Forms.Controls.XamStore { + [Preserve(AllMembers = true)] [XamlCompilation(XamlCompilationOptions.Compile)] - public partial class StoreShell : Shell + public partial class StoreShell : TestShell { - public StoreShell() + public StoreShell() { InitializeComponent(); + } + + protected override void Init() + { var fontFamily = ""; switch (Device.RuntimePlatform) { @@ -40,6 +46,8 @@ namespace Xamarin.Forms.Controls.XamStore Routing.RegisterRoute("demo/demo", typeof(DemoShellPage)); } + + //bool allow = false; //protected override void OnNavigating(ShellNavigatingEventArgs args) diff --git a/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs b/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs index 2829aa1..9eab177 100644 --- a/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs +++ b/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs @@ -42,10 +42,10 @@ public const string Navigation = "Navigation"; public const string Effects = "Effects"; public const string Focus = "Focus"; - public const string ManualReview = "ManualReview"; public const string Performance = "Performance"; public const string Visual = "Visual"; public const string AppLinks = "AppLinks"; + public const string Shell = "Shell"; } } \ No newline at end of file diff --git a/Xamarin.Forms.Core/Shell/Shell.cs b/Xamarin.Forms.Core/Shell/Shell.cs index 6816d0e..e2d64d9 100644 --- a/Xamarin.Forms.Core/Shell/Shell.cs +++ b/Xamarin.Forms.Core/Shell/Shell.cs @@ -572,9 +572,15 @@ namespace Xamarin.Forms ShellNavigatedEventArgs _accumulatedEvent; bool _accumulateNavigatedEvents; View _flyoutHeaderView; + bool _checkExperimentalFlag = true; - public Shell() + public Shell() : this(true) { + } + + internal Shell(bool checkFlag) + { + _checkExperimentalFlag = checkFlag; VerifyShellFlagEnabled(constructorHint: nameof(Shell)); ((INotifyCollectionChanged)Items).CollectionChanged += (s, e) => SendStructureChanged(); } @@ -582,9 +588,10 @@ namespace Xamarin.Forms internal const string ShellExperimental = ExperimentalFlags.ShellExperimental; [EditorBrowsable(EditorBrowsableState.Never)] - internal static void VerifyShellFlagEnabled(string constructorHint = null, [CallerMemberName] string memberName = "") + internal void VerifyShellFlagEnabled(string constructorHint = null, [CallerMemberName] string memberName = "") { - ExperimentalFlags.VerifyFlagEnabled("Shell", ShellExperimental, constructorHint, memberName); + if(_checkExperimentalFlag) + ExperimentalFlags.VerifyFlagEnabled("Shell", ShellExperimental, constructorHint, memberName); } public event EventHandler Navigated; diff --git a/Xamarin.Forms.Material.Android/Xamarin.Forms.Material.Android.csproj b/Xamarin.Forms.Material.Android/Xamarin.Forms.Material.Android.csproj index a788eeb..0bf34d6 100644 --- a/Xamarin.Forms.Material.Android/Xamarin.Forms.Material.Android.csproj +++ b/Xamarin.Forms.Material.Android/Xamarin.Forms.Material.Android.csproj @@ -15,7 +15,6 @@ 512 Resources\Resource.designer.cs Off - false v9.0 Xamarin.Forms.Material.Android diff --git a/Xamarin.Forms.Platform.iOS/Renderers/ShellPageRendererTracker.cs b/Xamarin.Forms.Platform.iOS/Renderers/ShellPageRendererTracker.cs index 46d6dcd..57f405a 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/ShellPageRendererTracker.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/ShellPageRendererTracker.cs @@ -250,7 +250,9 @@ namespace Xamarin.Forms.Platform.iOS if (image == null) image = "3bar.png"; var icon = await image.GetNativeImageAsync(); - NavigationItem.LeftBarButtonItem = new UIBarButtonItem(icon, UIBarButtonItemStyle.Plain, OnMenuButtonPressed); + var barButtonItem = new UIBarButtonItem(icon, UIBarButtonItemStyle.Plain, OnMenuButtonPressed); + barButtonItem.AccessibilityIdentifier = "OK"; + NavigationItem.LeftBarButtonItem = barButtonItem; } void OnMenuButtonPressed(object sender, EventArgs e) diff --git a/Xamarin.Forms.Sandbox.Android/Xamarin.Forms.Sandbox.Android.csproj b/Xamarin.Forms.Sandbox.Android/Xamarin.Forms.Sandbox.Android.csproj index 73262d1..545e4e8 100644 --- a/Xamarin.Forms.Sandbox.Android/Xamarin.Forms.Sandbox.Android.csproj +++ b/Xamarin.Forms.Sandbox.Android/Xamarin.Forms.Sandbox.Android.csproj @@ -15,7 +15,6 @@ Properties\AndroidManifest.xml Resources Assets - false v9.0 Xamarin.Android.Net.AndroidClientHandler -- 2.7.4