From a5712ff8be6fdf197fd8751e4a8d54fc328ff97b Mon Sep 17 00:00:00 2001 From: NafeelaNazhir Date: Thu, 18 Sep 2025 15:45:58 +0530 Subject: [PATCH 01/10] modified files to enhance mac ui test flow --- .../CoreViews/CorePageView.cs | 19 ++++++++ .../Issues/Bugzilla/Bugzilla53179.cs | 2 +- .../Issues/Bugzilla/Bugzilla53834.cs | 1 + .../Issues/CollectionViewVisibility.cs | 31 ------------- .../tests/TestCases.HostApp/MauiProgram.cs | 25 +++++++++++ .../tests/TestCases.HostApp/TestCases.cs | 25 ++++++++++- .../snapshots/mac/Bugzilla53834Test.png | Bin 59362 -> 27764 bytes .../mac/ToolbarItemsShouldBeVisible.png | Bin 6286 -> 6593 bytes .../Tests/BorderUITests.cs | 2 + .../Tests/ButtonUITests.cs | 2 + .../Tests/CarouselViewUITests.cs | 10 ++--- .../Tests/CheckBoxUITests.cs | 2 + .../CollectionViewUITests.EmptyView.cs | 2 + .../CollectionViewUITests.Grouping.cs | 2 + .../CollectionView/CollectionViewUITests.cs | 4 +- .../Tests/Concepts/AlertsGalleryTests.cs | 4 ++ .../Tests/Concepts/FontsGalleryTests.cs | 6 ++- .../Concepts/ImageLoadingGalleryTests.cs | 6 ++- .../Concepts/InputTransparencyGalleryTests.cs | 2 + .../Tests/CoreGalleryBasePageTest.cs | 4 +- .../Tests/DragAndDropUITests.cs | 1 + .../Tests/EditorUITests.cs | 2 + .../FeatureMatrix/BoxViewFeatureTests.cs | 10 ++--- .../Tests/FeatureMatrix/ButtonFeatureTests.cs | 11 ++--- .../FeatureMatrix/CarouselViewFeatureTests.cs | 10 ++--- .../FeatureMatrix/CheckBoxFeatureTests.cs | 10 ++--- ...llectionView_DynamicChangesFeatureTests.cs | 11 ++--- .../CollectionView_EmptyViewFeatureTests.cs | 11 ++--- .../CollectionView_GroupingFeatureTests.cs | 9 +--- ...CollectionView_HeaderFooterFeatureTests.cs | 9 +--- .../CollectionView_ItemsSourceFeatureTests.cs | 10 ++--- .../CollectionView_ScrollingFeatureTests.cs | 10 +---- .../CollectionView_SelectionFeatureTests.cs | 11 ++--- .../FeatureMatrix/DatePickerFeatureTests.cs | 10 ++--- .../Tests/FeatureMatrix/EditorFeatureTests.cs | 10 ++--- .../Tests/FeatureMatrix/EntryFeatureTests.cs | 10 ++--- .../FeatureMatrix/GraphicsViewFeatureTests.cs | 10 ++--- .../HybridWebViewFeatureTests.cs | 10 ++--- .../FeatureMatrix/ImageButtonFeatureTests.cs | 9 +--- .../Tests/FeatureMatrix/ImageFeatureTests.cs | 9 +--- .../Tests/FeatureMatrix/LabelFeatureTests.cs | 9 +--- .../FeatureMatrix/ProgressBarFeatureTests.cs | 12 +++-- .../FeatureMatrix/RadioButtonFeatureTests.cs | 10 ++--- .../FeatureMatrix/ScrollViewFeatureTests.cs | 9 +--- .../FeatureMatrix/SearchBarFeatureTests.cs | 10 ++--- .../Tests/FeatureMatrix/ShadowFeatureTests.cs | 10 ++--- .../Tests/FeatureMatrix/SliderFeatureTests.cs | 10 ++--- .../FeatureMatrix/StepperFeatureTests.cs | 10 ++--- .../Tests/FeatureMatrix/SwitchFeatureTests.cs | 10 ++--- .../FeatureMatrix/TimePickerFeatureTests.cs | 9 ++-- .../Tests/GestureRecognizerUITests.cs | 3 ++ .../Tests/ImageButtonUITests.cs | 2 + .../Tests/ImageUITests.cs | 2 + .../Tests/Issues/Bugzilla/Bugzilla40092.cs | 2 +- .../Tests/Issues/Bugzilla/Bugzilla53179.cs | 12 ++--- .../Tests/Issues/Bugzilla/Bugzilla59172.cs | 4 +- ...llectionViewUI.CollectionViewVisibility.cs | 29 ------------- .../Tests/Issues/XFIssue/Issue2951.cs | 9 ++-- .../Tests/Issues/_GalleryUITest.cs | 41 ++++++++++++++++++ .../Tests/Issues/_IssuesUITest.cs | 21 +++++++++ .../Tests/KeyboardScrollingGridTests.cs | 2 + ...rollingNonScrollingPageLargeTitlesTests.cs | 3 ++ ...rollingNonScrollingPageSmallTitlesTests.cs | 3 ++ ...dScrollingScrollingPageLargeTitlesTests.cs | 3 ++ ...dScrollingScrollingPageSmallTitlesTests.cs | 3 ++ .../Tests/LabelUITests.cs | 2 + .../Tests/RadioButtonUITests.cs | 2 + .../Tests/ScrollViewUITests.cs | 2 + .../Tests/SliderUITests.cs | 2 + .../Tests/StepperUITests.cs | 2 + .../Tests/SwipeViewUITests.cs | 6 +-- .../tests/TestCases.Shared.Tests/UITest.cs | 10 +++++ .../TestCases.Shared.Tests/UtilExtensions.cs | 8 +++- .../Actions/AppiumLifecycleActions.cs | 12 ++++- .../src/UITest.Appium/AppiumCatalystApp.cs | 6 +++ .../src/UITest.Appium/HelperExtensions.cs | 15 +++++++ src/TestUtils/src/UITest.NUnit/UITestBase.cs | 11 ++++- .../src/UITest.NUnit/UITestContextBase.cs | 10 +++++ 78 files changed, 365 insertions(+), 293 deletions(-) delete mode 100644 src/Controls/tests/TestCases.HostApp/Issues/CollectionViewVisibility.cs delete mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/CollectionViewUI.CollectionViewVisibility.cs create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs diff --git a/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs b/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs index fd179a9a7f10..aee1b1dbd1c5 100644 --- a/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs +++ b/src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs @@ -193,6 +193,25 @@ public Task NavigateToGalleryPage(string pageTitle) return Task.FromResult(false); } + /// + /// Attempts to retrieve a gallery page by title. + /// + /// The title of the gallery page to find. + /// The Page instance if found; otherwise, null. + /// + /// This method searches for a matching gallery page by title (case-insensitive). + /// If a match is found, it invokes the associated Realize factory to create the page. + /// + public Page TryToGetGalleryPage(string pageTitle) + { + if (_titleToPage.TryGetValue(pageTitle.ToLowerInvariant(), out GalleryPageFactory pageFactory)) + { + return pageFactory.Realize(); + } + + return null; + } + public async Task NavigateToTest(string pageTitle) { var testCaseScreen = new TestCases.TestCaseScreen(); diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53179.cs b/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53179.cs index 72cf90036024..7492c94d8de3 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53179.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53179.cs @@ -22,7 +22,7 @@ class TestPage : ContentPage public TestPage(int index) { - nextBtn = new Button { AutomationId = "Next Page", Text = "Next Page" }; + nextBtn = new Button { AutomationId = $"Next Page {index}", Text = $"Next Page {index}" }; rmBtn = new Button { AutomationId = "Remove previous pages", Text = "Remove previous pages" }; popBtn = new Button { AutomationId = "Back", Text = "Back" }; diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53834.cs b/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53834.cs index bd1bc6b42b4c..5519e0828f68 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53834.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Bugzilla/Bugzilla53834.cs @@ -44,6 +44,7 @@ protected override void Init() lstView = new ListView() { IsGroupingEnabled = true, + VerticalScrollBarVisibility = ScrollBarVisibility.Never, HasUnevenRows = true, ItemTemplate = new DataTemplate(typeof(MyViewCell)), GroupHeaderTemplate = new DataTemplate(typeof(MyHeaderViewCell)), diff --git a/src/Controls/tests/TestCases.HostApp/Issues/CollectionViewVisibility.cs b/src/Controls/tests/TestCases.HostApp/Issues/CollectionViewVisibility.cs deleted file mode 100644 index 9a064a8fd411..000000000000 --- a/src/Controls/tests/TestCases.HostApp/Issues/CollectionViewVisibility.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace Maui.Controls.Sample.Issues -{ - // InitiallyInvisbleCollectionViewSurvivesiOSLayoutNonsense(src\Compatibility\ControlGallery\src\Issues.Shared\Issue12714.cs) - [Issue(IssueTracker.None, 12714, "iOS application suspended at UICollectionViewFlowLayout.PrepareLayout() when using IsVisible = false", PlatformAffected.iOS)] - public class CollectionViewVisibility : ContentPage - { - const string Success = "Success"; - const string Show = "Show"; - - public CollectionViewVisibility() - { - var items = new List() { "uno", "dos", "tres", Success }; - var cv = new CollectionView - { - ItemsSource = items, - IsVisible = false, - ItemsLayout = new GridItemsLayout(2, ItemsLayoutOrientation.Vertical) - }; - - var layout = new StackLayout() { Margin = 40 }; - - var button = new Button { AutomationId = Show, Text = Show }; - button.Clicked += (sender, args) => { cv.IsVisible = !cv.IsVisible; }; - - layout.Children.Add(button); - layout.Children.Add(cv); - - Content = layout; - } - } -} \ No newline at end of file diff --git a/src/Controls/tests/TestCases.HostApp/MauiProgram.cs b/src/Controls/tests/TestCases.HostApp/MauiProgram.cs index d4b18ba64776..04249485b47d 100644 --- a/src/Controls/tests/TestCases.HostApp/MauiProgram.cs +++ b/src/Controls/tests/TestCases.HostApp/MauiProgram.cs @@ -68,6 +68,31 @@ public static Page CreateDefaultMainPage() { Page mainPage = null; OverrideMainPage(ref mainPage); +#if MACCATALYST + // Check for startup test argument from environment variables (passed by test runner) + var testName = System.Environment.GetEnvironmentVariable("test"); + + if (!string.IsNullOrEmpty(testName)) + { + // Try to get the test page directly from issues/test cases + var testCaseScreen = new TestCases.TestCaseScreen(); + var testPage = testCaseScreen.TryToGetTestPage(testName); + if (testPage is not null) + { + // Return the actual test page + return testPage; + } + + // If not found in test cases, try to get gallery page + var corePageView = new CorePageView(null); + var galleryPage = corePageView.TryToGetGalleryPage(testName); + if (galleryPage is not null) + { + // Return the gallery page + return galleryPage; + } + } +#endif return mainPage ?? new CoreNavigationPage(); } } diff --git a/src/Controls/tests/TestCases.HostApp/TestCases.cs b/src/Controls/tests/TestCases.HostApp/TestCases.cs index 0683f37a2463..281658a6c2d3 100644 --- a/src/Controls/tests/TestCases.HostApp/TestCases.cs +++ b/src/Controls/tests/TestCases.HostApp/TestCases.cs @@ -1,5 +1,6 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Linq; namespace Maui.Controls.Sample { @@ -123,6 +124,7 @@ class IssueModel public string Description { get; set; } public bool IsInternetRequired { get; set; } public Action Action { get; set; } + public Func PageFactory { get; set; } public bool Matches(string filter) { @@ -195,7 +197,9 @@ public TestCaseScreen() Name = attribute.DisplayName, Description = attribute.Description, IsInternetRequired = attribute.IsInternetRequired, - Action = ActivatePageAndNavigate(attribute, type) + Action = ActivatePageAndNavigate(attribute, type), + // PageFactory is used to retrieve the instance of the page. + PageFactory = () => ActivatePage(type) }).ToList(); #endif @@ -238,6 +242,23 @@ public bool TryToNavigateTo(string name) return true; } + + /// + /// Attempts to retrieve a test page by name or description. + /// + /// The name or description of the test page to find. + /// The Page instance if found; otherwise, null. + /// + /// This method first searches for a matching issue by name (case-insensitive), + /// then by description if no match is found by name. If a match is found, + /// it invokes the associated PageFactory to create the page. + /// + public Page TryToGetTestPage(string name) + { + var issue = _issues.SingleOrDefault(x => string.Equals(x.Description, name, StringComparison.OrdinalIgnoreCase)); + return issue?.PageFactory?.Invoke(); + } + public void FilterIssues(string filter = null) { filter = filter?.Trim(); diff --git a/src/Controls/tests/TestCases.Mac.Tests/snapshots/mac/Bugzilla53834Test.png b/src/Controls/tests/TestCases.Mac.Tests/snapshots/mac/Bugzilla53834Test.png index a2c27a6c5180556fd06697267157e2bf25b71d1f..56d15f76842b71c8e0e837279026460de0da891c 100644 GIT binary patch literal 27764 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 literal 59362 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 C)x^*M literal 6286 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 F>0fM9t@i)` diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/BorderUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/BorderUITests.cs index e44a555e5b31..d9ee6cb45285 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/BorderUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/BorderUITests.cs @@ -8,6 +8,8 @@ public class BorderUITests : CoreGalleryBasePageTest { const string BorderGallery = "Border Gallery"; + public override string GalleryPageName => BorderGallery; + public BorderUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/ButtonUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/ButtonUITests.cs index 705d07621ec2..678d189ab48f 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/ButtonUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/ButtonUITests.cs @@ -9,6 +9,8 @@ public class ButtonUITests : _ViewUITests { const string ButtonGallery = "Button Gallery"; + public override string GalleryPageName => ButtonGallery; + public ButtonUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/CarouselViewUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/CarouselViewUITests.cs index 9c07bbe26102..8ca249677d22 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/CarouselViewUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/CarouselViewUITests.cs @@ -6,22 +6,18 @@ namespace Microsoft.Maui.TestCases.Tests { - public class CarouselViewUITests : UITest + public class CarouselViewUITests : _GalleryUITest { const string CarouselViewGallery = "CarouselView Gallery"; + public override string GalleryPageName => CarouselViewGallery; + public CarouselViewUITests(TestDevice device) : base(device) { } protected override bool ResetAfterEachTest => true; - public override void TestSetup() - { - base.TestSetup(); - App.NavigateToGallery(CarouselViewGallery); - } - [Test] [Category(UITestCategories.CarouselView)] public void CarouselViewSetPosition() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/CheckBoxUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/CheckBoxUITests.cs index 958e4c670282..19fe7da9dedc 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/CheckBoxUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/CheckBoxUITests.cs @@ -7,6 +7,8 @@ public class CheckBoxUITests : _ViewUITests { const string CheckBoxGallery = "CheckBox Gallery"; + public override string GalleryPageName => CheckBoxGallery; + public CheckBoxUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.EmptyView.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.EmptyView.cs index 743466273939..67c0100133f7 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.EmptyView.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.EmptyView.cs @@ -10,6 +10,8 @@ public class CollectionViewEmptyViewTests : CollectionViewUITests { protected override bool ResetAfterEachTest => true; + public override string GalleryPageName => CollectionViewGallery; + public CollectionViewEmptyViewTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.Grouping.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.Grouping.cs index 685b8181a9fb..7ded7d8ff61e 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.Grouping.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.Grouping.cs @@ -9,6 +9,8 @@ public class CollectionViewGroupingTests : CollectionViewUITests { protected override bool ResetAfterEachTest => true; + public override string GalleryPageName => CollectionViewGallery; + public CollectionViewGroupingTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.cs index d026749a8062..9dd88357a683 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/CollectionView/CollectionViewUITests.cs @@ -6,7 +6,9 @@ namespace Microsoft.Maui.TestCases.Tests { public abstract class CollectionViewUITests : CoreGalleryBasePageTest { - const string CollectionViewGallery = "CollectionView Gallery"; + public const string CollectionViewGallery = "CollectionView Gallery"; + + public override string GalleryPageName => CollectionViewGallery; public CollectionViewUITests(TestDevice device) : base(device) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/AlertsGalleryTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/AlertsGalleryTests.cs index 90ce9153c75c..867648503848 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/AlertsGalleryTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/AlertsGalleryTests.cs @@ -7,6 +7,10 @@ namespace Microsoft.Maui.TestCases.Tests { public class AlertsGalleryTests : CoreGalleryBasePageTest { + const string AlertsGallery = "Alerts Gallery"; + + public override string GalleryPageName => AlertsGallery; + public AlertsGalleryTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/FontsGalleryTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/FontsGalleryTests.cs index 3926c289b7aa..bd310f66f2bb 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/FontsGalleryTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/FontsGalleryTests.cs @@ -7,6 +7,10 @@ namespace Microsoft.Maui.TestCases.Tests [Category(UITestCategories.Fonts)] public class FontsGalleryTests : CoreGalleryBasePageTest { + const string FontsGallery = "Fonts Gallery"; + + public override string GalleryPageName => FontsGallery; + public FontsGalleryTests(TestDevice device) : base(device) { @@ -14,7 +18,7 @@ public FontsGalleryTests(TestDevice device) protected override void NavigateToGallery() { - App.NavigateToGallery("Fonts Gallery"); + App.NavigateToGallery(FontsGallery); } [Test] diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/ImageLoadingGalleryTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/ImageLoadingGalleryTests.cs index 350cd18313f5..2e9d2140258b 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/ImageLoadingGalleryTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/ImageLoadingGalleryTests.cs @@ -7,6 +7,10 @@ namespace Microsoft.Maui.TestCases.Tests [Category(UITestCategories.Image)] public class ImageLoadingGalleryTests : CoreGalleryBasePageTest { + const string ImageLoadingGallery = "Image Loading Gallery"; + + public override string GalleryPageName => ImageLoadingGallery; + public ImageLoadingGalleryTests(TestDevice device) : base(device) { @@ -14,7 +18,7 @@ public ImageLoadingGalleryTests(TestDevice device) protected override void NavigateToGallery() { - App.NavigateToGallery("Image Loading Gallery"); + App.NavigateToGallery(ImageLoadingGallery); } [Test] diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/InputTransparencyGalleryTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/InputTransparencyGalleryTests.cs index 9e9b2cbc77a7..773a21475314 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/InputTransparencyGalleryTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Concepts/InputTransparencyGalleryTests.cs @@ -10,6 +10,8 @@ public class InputTransparencyGalleryTests : CoreGalleryBasePageTest { const string ButtonGallery = "Input Transparency Gallery"; + public override string GalleryPageName => ButtonGallery; + public InputTransparencyGalleryTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/CoreGalleryBasePageTest.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/CoreGalleryBasePageTest.cs index d4d6e11b735b..28303bcbde99 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/CoreGalleryBasePageTest.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/CoreGalleryBasePageTest.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.TestCases.Tests { - public abstract class CoreGalleryBasePageTest : UITest + public abstract class CoreGalleryBasePageTest : _GalleryUITest { public CoreGalleryBasePageTest(TestDevice device) : base(device) { } @@ -16,7 +16,9 @@ protected override void FixtureSetup() try { base.FixtureSetup(); +#if MACCATALYST NavigateToGallery(); +#endif break; } catch (Exception e) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/DragAndDropUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/DragAndDropUITests.cs index e5de51793575..e69c346e47b1 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/DragAndDropUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/DragAndDropUITests.cs @@ -9,6 +9,7 @@ namespace Microsoft.Maui.TestCases.Tests public class DragAndDropUITests : CoreGalleryBasePageTest { const string DragAndDropGallery = "Drag and Drop Gallery"; + public override string GalleryPageName => DragAndDropGallery; public DragAndDropUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/EditorUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/EditorUITests.cs index 0dd7b6ad8b7d..44dc346eba63 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/EditorUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/EditorUITests.cs @@ -7,6 +7,8 @@ public class EditorUITests : _ViewUITests { public const string EditorGallery = "Editor Gallery"; + public override string GalleryPageName => EditorGallery; + public EditorUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BoxViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BoxViewFeatureTests.cs index 2d13e41e15ea..fbe8beb2cb47 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BoxViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BoxViewFeatureTests.cs @@ -5,21 +5,17 @@ namespace Microsoft.Maui.TestCases.Tests { - public class BoxViewFeatureTests : UITest + public class BoxViewFeatureTests : _GalleryUITest { public const string BoxViewFeatureMatrix = "BoxView Feature Matrix"; + public override string GalleryPageName => BoxViewFeatureMatrix; + public BoxViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(BoxViewFeatureMatrix); - } - [Test] [Category(UITestCategories.BoxView)] diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ButtonFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ButtonFeatureTests.cs index 251ae9b7279b..708200d6d21c 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ButtonFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ButtonFeatureTests.cs @@ -6,17 +6,14 @@ namespace Microsoft.Maui.TestCases.Tests; -public class ButtonFeatureTests : UITest +public class ButtonFeatureTests : _GalleryUITest { public const string ButtonFeatureMatrix = "Button Feature Matrix"; - public ButtonFeatureTests(TestDevice testDevice) : base(testDevice) - { - } - protected override void FixtureSetup() + public override string GalleryPageName => ButtonFeatureMatrix; + + public ButtonFeatureTests(TestDevice testDevice) : base(testDevice) { - base.FixtureSetup(); - App.NavigateToGallery(ButtonFeatureMatrix); } [Test] diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CarouselViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CarouselViewFeatureTests.cs index f531321cb21a..a302605bc8cb 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CarouselViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CarouselViewFeatureTests.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.TestCases.Tests; -public class CarouselViewFeatureTests : UITest +public class CarouselViewFeatureTests : _GalleryUITest { public const string CarouselViewFeatureMatrix = "CarouselView Feature Matrix"; private const string CarouselViewControl = "CarouselViewControl"; @@ -31,14 +31,10 @@ public class CarouselViewFeatureTests : UITest private const string ScrollToIndexEntry = "ScrollToIndexEntry"; private const string ScrollToButton = "ScrollToButton"; - public CarouselViewFeatureTests(TestDevice device) : base(device) - { - } + public override string GalleryPageName => CarouselViewFeatureMatrix; - protected override void FixtureSetup() + public CarouselViewFeatureTests(TestDevice device) : base(device) { - base.FixtureSetup(); - App.NavigateToGallery(CarouselViewFeatureMatrix); } [Test, Order(1)] diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CheckBoxFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CheckBoxFeatureTests.cs index c7478d3d0fd3..f6b455b8190f 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CheckBoxFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CheckBoxFeatureTests.cs @@ -4,7 +4,7 @@ namespace Microsoft.Maui.TestCases.Tests; -public class CheckBoxFeatureTests : UITest +public class CheckBoxFeatureTests : _GalleryUITest { const string IsCheckedLabel = "IsCheckedLabel"; const string CheckBoxControl = "CheckBoxControl"; @@ -18,17 +18,13 @@ public class CheckBoxFeatureTests : UITest public const string CheckBoxFeatureMatrix = "CheckBox Feature Matrix"; + public override string GalleryPageName => CheckBoxFeatureMatrix; + public CheckBoxFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(CheckBoxFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.CheckBox)] public void CheckBox_ValidateDefaultValues_VerifyLabels() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_DynamicChangesFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_DynamicChangesFeatureTests.cs index df3d9b4e1666..cc862bf758e9 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_DynamicChangesFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_DynamicChangesFeatureTests.cs @@ -3,24 +3,19 @@ using UITest.Core; namespace Microsoft.Maui.TestCases.Tests; - -public class CollectionView_DynamicChangesFeatureTests : UITest +public class CollectionView_DynamicChangesFeatureTests : _GalleryUITest { public const string DynamicChangesFeatureMatrix = "CollectionView Feature Matrix"; public const string Options = "Options"; public const string Apply = "Apply"; + public override string GalleryPageName => DynamicChangesFeatureMatrix; + public CollectionView_DynamicChangesFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(DynamicChangesFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.CollectionView)] public void ValidateDynamicItemTemplateDisplayed() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_EmptyViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_EmptyViewFeatureTests.cs index bb67ddf55b56..afbb28ff09e9 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_EmptyViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_EmptyViewFeatureTests.cs @@ -7,22 +7,17 @@ namespace Microsoft.Maui.TestCases.Tests { - public class CollectionView_EmptyViewFeatureTests : UITest + public class CollectionView_EmptyViewFeatureTests : _GalleryUITest { public const string CollectionViewFeatureMatrix = "CollectionView Feature Matrix"; + public override string GalleryPageName => CollectionViewFeatureMatrix; + public CollectionView_EmptyViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(CollectionViewFeatureMatrix); - } - - [Test, Order(1)] [Category(UITestCategories.CollectionView)] public void ValidateEmptyViewStringDisplayed() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_GroupingFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_GroupingFeatureTests.cs index d22b5bcb5b1c..e7b3f4241e5f 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_GroupingFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_GroupingFeatureTests.cs @@ -3,8 +3,7 @@ using UITest.Core; namespace Microsoft.Maui.TestCases.Tests; - -public class CollectionView_GroupingFeatureTests : UITest +public class CollectionView_GroupingFeatureTests : _GalleryUITest { public const string GroupingFeatureMatrix = "CollectionView Feature Matrix"; public const string Options = "Options"; @@ -20,16 +19,12 @@ public class CollectionView_GroupingFeatureTests : UITest public const string ItemsLayoutHorizontalGrid = "ItemsLayoutHorizontalGrid"; public const string ItemsLayoutVerticalGrid = "ItemsLayoutVerticalGrid"; + public override string GalleryPageName => GroupingFeatureMatrix; public CollectionView_GroupingFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(GroupingFeatureMatrix); - } [Test, Order(1)] [Category(UITestCategories.CollectionView)] diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_HeaderFooterFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_HeaderFooterFeatureTests.cs index c2e91b6a9ccc..18d794e5b936 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_HeaderFooterFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_HeaderFooterFeatureTests.cs @@ -3,8 +3,7 @@ using UITest.Core; namespace Microsoft.Maui.TestCases.Tests; - -public class CollectionView_HeaderFooterFeatureTests : UITest +public class CollectionView_HeaderFooterFeatureTests : _GalleryUITest { public const string HeaderFooterFeatureMatrix = "CollectionView Feature Matrix"; public const string Options = "Options"; @@ -29,17 +28,13 @@ public class CollectionView_HeaderFooterFeatureTests : UITest public const string GroupHeaderTemplateGrid = "GroupHeaderTemplateGrid"; public const string GroupFooterTemplateGrid = "GroupFooterTemplateGrid"; + public override string GalleryPageName => HeaderFooterFeatureMatrix; public CollectionView_HeaderFooterFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(HeaderFooterFeatureMatrix); - } #if TEST_FAILS_ON_IOS && TEST_FAILS_ON_CATALYST //In CV2, unintended synchronization between the HeaderTemplate/FooterTemplate and Header/Footer views, related issue: https://github.com/dotnet/maui/issues/28504 [Test, Order(1)] diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ItemsSourceFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ItemsSourceFeatureTests.cs index d531787c09bd..f8f3f2f36dab 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ItemsSourceFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ItemsSourceFeatureTests.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.TestCases.Tests; -public class CollectionView_ItemsSourceFeatureTests : UITest +public class CollectionView_ItemsSourceFeatureTests : _GalleryUITest { public const string ItemsSourceFeatureMatrix = "CollectionView Feature Matrix"; public const string Options = "Options"; @@ -24,17 +24,13 @@ public class CollectionView_ItemsSourceFeatureTests : UITest public const string MultipleModePreselection = "MultipleModePreselection"; public const string SingleModePreselection = "SingleModePreselection"; + public override string GalleryPageName => ItemsSourceFeatureMatrix; + public CollectionView_ItemsSourceFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ItemsSourceFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.CollectionView)] public void VerifyStringItemsObservableCollectionWhenAddItems() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs index 342dbda62ff3..82fc2db912c9 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs @@ -4,8 +4,7 @@ namespace Microsoft.Maui.TestCases.Tests; - -public class CollectionView_ScrollingFeatureTests : UITest +public class CollectionView_ScrollingFeatureTests : _GalleryUITest { public const string ScrollingFeatureMatrix = "CollectionView Feature Matrix"; public const string Options = "Options"; @@ -26,18 +25,13 @@ public class CollectionView_ScrollingFeatureTests : UITest public const string ItemsLayoutHorizontalList = "ItemsLayoutHorizontalList"; public const string AddButton = "AddButton"; + public override string GalleryPageName => ScrollingFeatureMatrix; public CollectionView_ScrollingFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ScrollingFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.CollectionView)] public void VerifyMeasureAllItemsWithObservableCollection() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_SelectionFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_SelectionFeatureTests.cs index b10c396cc015..478d5b436408 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_SelectionFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_SelectionFeatureTests.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.TestCases.Tests; -public class CollectionView_SelectionFeatureTests : UITest +public class CollectionView_SelectionFeatureTests : _GalleryUITest { public const string SelectionFeatureMatrix = "CollectionView Feature Matrix"; public const string ItemsSourceGroupedList = "ItemsSourceGroupedList"; @@ -27,17 +27,14 @@ public class CollectionView_SelectionFeatureTests : UITest public const string CurrentSelectionTextLabel = "CurrentSelectionTextLabel"; public const string PreviousSelectionTextLabel = "PreviousSelectionTextLabel"; public const string SelectionChangedEventCountLabel = "SelectionChangedEventCountLabel"; + + public override string GalleryPageName => SelectionFeatureMatrix; + public CollectionView_SelectionFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(SelectionFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.CollectionView)] public void VerifySelectionModeNoneWhenItemsSourceNone() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/DatePickerFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/DatePickerFeatureTests.cs index 4837cbba4e88..e9ec5214a976 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/DatePickerFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/DatePickerFeatureTests.cs @@ -5,18 +5,14 @@ namespace Microsoft.Maui.TestCases.Tests; -public class DatePickerFeatureTests : UITest +public class DatePickerFeatureTests : _GalleryUITest { public const string DatePickerFeatureMatrix = "Date Picker Feature Matrix"; - public DatePickerFeatureTests(TestDevice testDevice) : base(testDevice) - { - } + public override string GalleryPageName => DatePickerFeatureMatrix; - protected override void FixtureSetup() + public DatePickerFeatureTests(TestDevice testDevice) : base(testDevice) { - base.FixtureSetup(); - App.NavigateToGallery(DatePickerFeatureMatrix); } #if TEST_FAILS_ON_WINDOWS && TEST_FAILS_ON_IOS //Issue Link: https://github.com/dotnet/maui/issues/30736, https://github.com/dotnet/maui/issues/31167 diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EditorFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EditorFeatureTests.cs index 357cbf6dead6..f2ba5a1eebfc 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EditorFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EditorFeatureTests.cs @@ -5,10 +5,12 @@ namespace Microsoft.Maui.TestCases.Tests; [Category(UITestCategories.Editor)] -public class EditorFeatureTests : UITest +public class EditorFeatureTests : _GalleryUITest { public const string EditorFeatureMatrix = "Editor Feature Matrix"; + public override string GalleryPageName => EditorFeatureMatrix; + #if IOS private const int CropBottomValue = 1550; #elif ANDROID @@ -24,12 +26,6 @@ public EditorFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(EditorFeatureMatrix); - } - [Test, Order(0)] public void VerifyEditorInitialEventStates() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EntryFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EntryFeatureTests.cs index 2039a8561f67..f1dfc5b91219 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EntryFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EntryFeatureTests.cs @@ -5,10 +5,12 @@ namespace Microsoft.Maui.TestCases.Tests; [Category(UITestCategories.Entry)] -public class EntryFeatureTests : UITest +public class EntryFeatureTests : _GalleryUITest { public const string EntryFeatureMatrix = "Entry Feature Matrix"; + public override string GalleryPageName => EntryFeatureMatrix; + #if IOS private const int CropBottomValue = 1550; #elif ANDROID @@ -24,12 +26,6 @@ public EntryFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(EntryFeatureMatrix); - } - [Test, Order(0)] public void VerifyInitialEventStates() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GraphicsViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GraphicsViewFeatureTests.cs index 7bff08acdb06..1f513b5a70a4 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GraphicsViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GraphicsViewFeatureTests.cs @@ -4,21 +4,17 @@ namespace Microsoft.Maui.TestCases.Tests; -public class GraphicsViewFeatureTests : UITest +public class GraphicsViewFeatureTests : _GalleryUITest { public const string GraphicsViewFeatureMatrix = "GraphicsView Feature Matrix"; + public override string GalleryPageName => GraphicsViewFeatureMatrix; + public GraphicsViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(GraphicsViewFeatureMatrix); - } - public void VerifyShapeScreenshot() { #if WINDOWS diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/HybridWebViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/HybridWebViewFeatureTests.cs index 04836f6c5622..269b70c5ea06 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/HybridWebViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/HybridWebViewFeatureTests.cs @@ -5,22 +5,18 @@ namespace Microsoft.Maui.TestCases.Tests; -public class HybridWebViewFeatureTests : UITest +public class HybridWebViewFeatureTests : _GalleryUITest { public const string HybridWebViewFeatureMatrix = "HybridWebView Feature Matrix"; + public override string GalleryPageName => HybridWebViewFeatureMatrix; + public HybridWebViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(HybridWebViewFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.WebView)] public void VerifyHybridWebView_DefaultValues() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageButtonFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageButtonFeatureTests.cs index 5de5bc278927..5a183907e0c6 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageButtonFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageButtonFeatureTests.cs @@ -6,7 +6,7 @@ namespace Microsoft.Maui.TestCases.Tests; -public class ImageButtonFeatureTests : UITest +public class ImageButtonFeatureTests : _GalleryUITest { public const string ImageButtonFeatureMatrix = "ImageButton Feature Matrix"; public const string Options = "Options"; @@ -28,18 +28,13 @@ public class ImageButtonFeatureTests : UITest public const string IsEnabledFalse = "IsEnabledFalse"; public const string PaddingEntry = "PaddingEntry"; + public override string GalleryPageName => ImageButtonFeatureMatrix; public ImageButtonFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ImageButtonFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.ImageButton)] public void VerifyImageButtonAspect_AspectFitWithImageSourceFromFile() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageFeatureTests.cs index 2cb90c8d4307..27998423a4d8 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ImageFeatureTests.cs @@ -5,7 +5,7 @@ namespace Microsoft.Maui.TestCases.Tests; -public class ImageFeatureTests : UITest +public class ImageFeatureTests : _GalleryUITest { public const string ImageFeatureMatrix = "Image Feature Matrix"; public const string Options = "Options"; @@ -24,18 +24,13 @@ public class ImageFeatureTests : UITest public const string IsAnimationTrue = "IsAnimationTrue"; public const string IsAnimationFalse = "IsAnimationFalse"; + public override string GalleryPageName => ImageFeatureMatrix; public ImageFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ImageFeatureMatrix); - } - [Test] [Category(UITestCategories.Image)] public void VerifyImageAspect_AspectFitWithImageSourceFromFile() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/LabelFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/LabelFeatureTests.cs index 516c51c20c8c..483bc97328c3 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/LabelFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/LabelFeatureTests.cs @@ -6,7 +6,7 @@ namespace Microsoft.Maui.TestCases.Tests; -public class LabelFeatureTests : UITest +public class LabelFeatureTests : _GalleryUITest { public const string LabelFeatureMatrix = "Label Feature Matrix"; public const string Options = "Options"; @@ -46,18 +46,13 @@ public class LabelFeatureTests : UITest public const string LineBreakModeNoWrap = "LineBreakModeNoWrap"; public const string MainLabel = "MainLabel"; + public override string GalleryPageName => LabelFeatureMatrix; public LabelFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(LabelFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.Label)] public void VerifyLabelWithFormattedText() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ProgressBarFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ProgressBarFeatureTests.cs index 678e8bf3b79c..508f8c7e9153 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ProgressBarFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ProgressBarFeatureTests.cs @@ -4,19 +4,17 @@ namespace Microsoft.Maui.TestCases.Tests { - public class ProgressBarFeatureTests : UITest + public class ProgressBarFeatureTests : _GalleryUITest { + public const string ProgressBarFeatureMatrix = "ProgressBar Feature Matrix"; + + public override string GalleryPageName => ProgressBarFeatureMatrix; + public ProgressBarFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery("ProgressBar Feature Matrix"); - } - [Test, Order(1)] [Category(UITestCategories.ProgressBar)] public void ProgressBar_ValidateDefaultProgress() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RadioButtonFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RadioButtonFeatureTests.cs index 40a84b912c8c..9bd4c72f047c 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RadioButtonFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RadioButtonFeatureTests.cs @@ -4,21 +4,17 @@ namespace Microsoft.Maui.TestCases.Tests; -public class RadioButtonFeatureTests : UITest +public class RadioButtonFeatureTests : _GalleryUITest { public const string RadioButtonFeatureMatrix = "RadioButton Feature Matrix"; + public override string GalleryPageName => RadioButtonFeatureMatrix; + public RadioButtonFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(RadioButtonFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.RadioButton)] public void RadioButton_Checking_Default_Configuration_VerifyVisualState() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs index 2f7d0b5e45a3..b903c9dd43c7 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs @@ -5,9 +5,10 @@ namespace Microsoft.Maui.TestCases.Tests; -public class ScrollViewFeatureTests : UITest +public class ScrollViewFeatureTests : _GalleryUITest { public const string ScrollViewFeatureMatrix = "ScrollView Feature Matrix"; + override public string GalleryPageName => ScrollViewFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string ContentLabel = "ContentLabel"; @@ -39,12 +40,6 @@ public ScrollViewFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ScrollViewFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.ScrollView)] public void VerifyScrollViewWithScrollToPositionEnd() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs index 2cb2ff4f8f7f..77977314c1f3 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs @@ -4,18 +4,14 @@ namespace Microsoft.Maui.TestCases.Tests; -public class SearchBarFeatureTests : UITest +public class SearchBarFeatureTests : _GalleryUITest { public const string SearchBarFeatureMatrix = "Search Bar Feature Matrix"; - public SearchBarFeatureTests(TestDevice testDevice) : base(testDevice) - { - } + override public string GalleryPageName => SearchBarFeatureMatrix; - protected override void FixtureSetup() + public SearchBarFeatureTests(TestDevice testDevice) : base(testDevice) { - base.FixtureSetup(); - App.NavigateToGallery(SearchBarFeatureMatrix); } public void VerifyScreenshotWithPlatformCropping() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShadowFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShadowFeatureTests.cs index 057804cf87f9..fa764bee2ccd 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShadowFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShadowFeatureTests.cs @@ -4,21 +4,17 @@ namespace Microsoft.Maui.TestCases.Tests { - public class ShadowFeatureTests : UITest + public class ShadowFeatureTests : _GalleryUITest { public const string ShadowFeatureMatrix = "Shadow Feature Matrix"; + public override string GalleryPageName => ShadowFeatureMatrix; + public ShadowFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ShadowFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.Shadow)] public void Shadow_SetColor() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SliderFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SliderFeatureTests.cs index ea9b802619e8..edaae9a1d4da 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SliderFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SliderFeatureTests.cs @@ -5,21 +5,17 @@ namespace Microsoft.Maui.TestCases.Tests { - public class SliderFeatureTests : UITest + public class SliderFeatureTests : _GalleryUITest { public const string SliderFeatureMatrix = "Slider Feature Matrix"; + public override string GalleryPageName => SliderFeatureMatrix; + public SliderFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(SliderFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.Slider)] public void Slider_ValidateDefaultValues_VerifyLabels() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StepperFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StepperFeatureTests.cs index e8e7fbf56feb..6d4db6cb8942 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StepperFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StepperFeatureTests.cs @@ -5,21 +5,17 @@ namespace Microsoft.Maui.TestCases.Tests; [Category(UITestCategories.Stepper)] -public class StepperFeatureTests : UITest +public class StepperFeatureTests : _GalleryUITest { public const string StepperFeatureMatrix = "Stepper Feature Matrix"; + public override string GalleryPageName => StepperFeatureMatrix; + public StepperFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(StepperFeatureMatrix); - } - [Test, Order(1)] public void Stepper_ValidateDefaultValues_VerifyLabels() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwitchFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwitchFeatureTests.cs index 8e5a3e055b08..57d1171f4080 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwitchFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwitchFeatureTests.cs @@ -5,21 +5,17 @@ namespace Microsoft.Maui.TestCases.Tests; -public class SwitchFeatureTests : UITest +public class SwitchFeatureTests : _GalleryUITest { public const string SwitchFeatureMatrix = "Switch Feature Matrix"; + public override string GalleryPageName => SwitchFeatureMatrix; + public SwitchFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(SwitchFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.Switch)] public void Switch_InitialState_VerifyVisualState() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TimePickerFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TimePickerFeatureTests.cs index 2a690b472359..012c52c083d1 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TimePickerFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TimePickerFeatureTests.cs @@ -6,17 +6,14 @@ namespace Microsoft.Maui.TestCases.Tests; -public class TimePickerFeatureTests : UITest +public class TimePickerFeatureTests : _GalleryUITest { public const string TimePickerFeatureMatrix = "Time Picker Feature Matrix"; + public override string GalleryPageName => TimePickerFeatureMatrix; + public TimePickerFeatureTests(TestDevice testDevice) : base(testDevice) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(TimePickerFeatureMatrix); - } #if TEST_FAILS_ON_IOS // Issue Link - https://github.com/dotnet/maui/issues/30837 diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/GestureRecognizerUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/GestureRecognizerUITests.cs index 3e6cdfdac23f..08a553d8c750 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/GestureRecognizerUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/GestureRecognizerUITests.cs @@ -8,6 +8,9 @@ namespace Microsoft.Maui.TestCases.Tests public class GestureRecognizerUITests : CoreGalleryBasePageTest { const string GestureRecognizerGallery = "Gesture Recognizer Gallery"; + + public override string GalleryPageName => GestureRecognizerGallery; + public GestureRecognizerUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageButtonUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageButtonUITests.cs index d74aeacc0b85..9a3f2f7c27b1 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageButtonUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageButtonUITests.cs @@ -9,6 +9,8 @@ internal class ImageButtonUITests : _ViewUITests { const string ImageButtonGallery = "Image Button Gallery"; + public override string GalleryPageName => ImageButtonGallery; + public ImageButtonUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageUITests.cs index 72766aeb41ae..258323bf72b2 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/ImageUITests.cs @@ -9,6 +9,8 @@ internal class ImageUITests : _ViewUITests { const string ImageGallery = "Image Gallery"; + public override string GalleryPageName => ImageGallery; + public ImageUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40092.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40092.cs index 6dd6b47b29cf..e0db03b86eb4 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40092.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla40092.cs @@ -20,7 +20,7 @@ public Bugzilla40092(TestDevice testDevice) : base(testDevice) [Category(UITestCategories.BoxView)] public void AllScreenIsBlack() { -#if !ANDROID // Display alert not shown in android also this is not a needed one for ensuring this case, so ignored the below steps on Android. +#if !ANDROID && !MACCATALYST // Display alert is not shown on Android, and it is not required to validate this case, so the following steps are skipped for Android. For Catalyst, the test page loading flow has been modified, making the popup validation unnecessary here as well. App.TapDisplayAlertButton(Ok); #else App.WaitForElement("black"); diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla53179.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla53179.cs index f244aed86b17..80567ecd5578 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla53179.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla53179.cs @@ -16,14 +16,14 @@ public Bugzilla53179(TestDevice testDevice) : base(testDevice) [Category(UITestCategories.Navigation)] public void Bugzilla53179Test() { - App.WaitForElement("Next Page"); - App.Tap("Next Page"); + App.WaitForElement("Next Page 1"); + App.Tap("Next Page 1"); - App.WaitForElementTillPageNavigationSettled("Next Page"); - App.Tap("Next Page"); + App.WaitForElementTillPageNavigationSettled("Next Page 2"); + App.Tap("Next Page 2"); - App.WaitForElementTillPageNavigationSettled("Next Page"); - App.Tap("Next Page"); + App.WaitForElementTillPageNavigationSettled("Next Page 3"); + App.Tap("Next Page 3"); App.WaitForElementTillPageNavigationSettled("Remove previous pages"); App.Tap("Remove previous pages"); diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla59172.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla59172.cs index dde773d9fb24..b1274e39bfab 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla59172.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla59172.cs @@ -15,7 +15,7 @@ public Bugzilla59172(TestDevice testDevice) : base(testDevice) // Test scenario: Tapping the GoBack link triggers a PopAsync 2500ms after the tap event. // Right before PopAsync is triggered, manually navigate back pressing the back arrow in the navigation bar - [Test] + [Test, Order(1)] [Category(UITestCategories.Navigation)] public void Issue59172Test() { @@ -29,7 +29,7 @@ public void Issue59172Test() App.WaitForElementTillPageNavigationSettled("GoForward"); } - [Test] + [Test, Order(2)] [Category(UITestCategories.Navigation)] public void Issue59172RecoveryTest() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/CollectionViewUI.CollectionViewVisibility.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/CollectionViewUI.CollectionViewVisibility.cs deleted file mode 100644 index 5e027f9eb8f7..000000000000 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/CollectionViewUI.CollectionViewVisibility.cs +++ /dev/null @@ -1,29 +0,0 @@ -using NUnit.Framework; -using UITest.Appium; -using UITest.Core; - -namespace Microsoft.Maui.TestCases.Tests.Issues -{ - public class CollectionViewVisibilityUITests : _IssuesUITest - { - const string Success = "Success"; - const string Show = "Show"; - - public CollectionViewVisibilityUITests(TestDevice device) - : base(device) - { - } - - public override string Issue => "iOS application suspended at UICollectionViewFlowLayout.PrepareLayout() when using IsVisible = false"; - - // InitiallyInvisbleCollectionViewSurvivesiOSLayoutNonsense(src\Compatibility\ControlGallery\src\Issues.Shared\Issue12714.cs) - [Test] - [Category(UITestCategories.CollectionView)] - public void InitiallyInvisbleCollectionViewSurvivesiOSLayoutNonsense() - { - App.WaitForElement(Show); - App.Click(Show); - App.WaitForElement(Success); - } - } -} \ No newline at end of file diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/Issue2951.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/Issue2951.cs index 03c6c94562c9..d38c4faa81e1 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/Issue2951.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/Issue2951.cs @@ -24,14 +24,15 @@ public void Issue2951Test() var buttonToClick = App.FindElements("btnChangeStatus").ElementAt(1); buttonToClick.Click(); - Assert.That(buttonToClick.GetText(), Is.EqualTo("B")); + var updatedButton = App.FindElements("btnChangeStatus").ElementAt(1); + Assert.That(updatedButton.GetText(), Is.EqualTo("B")); - buttonToClick.Click(); + updatedButton.Click(); var updatedButtonCount = App.FindElements("btnChangeStatus").Count(); Assert.That(updatedButtonCount, Is.EqualTo(2)); - buttonToClick = App.FindElements("btnChangeStatus").ElementAt(1); - buttonToClick.Click(); + var newSecondButton = App.FindElements("btnChangeStatus").ElementAt(1); + newSecondButton.Click(); // Use VerifyScreenshot to ensure the button background color has been updated properly // This screenshot is captured to visually confirm that the background color has changed as expected diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs new file mode 100644 index 000000000000..43d09c198819 --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs @@ -0,0 +1,41 @@ +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests +{ + public abstract class _GalleryUITest : UITest + { + public _GalleryUITest(TestDevice device) : base(device) { } + + public override IConfig GetTestConfig() + { + var config = base.GetTestConfig(); + +#if MACCATALYST + // For Catalyst, pass the test name as a startup argument + // If the UITestContext is not null we can directly pass the Issue via LaunchAppWithTest + if (UITestContext is null) + { + config.SetTestConfigurationArg("test", GalleryPageName); + } +#endif + + return config; + } + + public override void LaunchAppWithTest() + { + App.LaunchApp(GalleryPageName, ResetAfterEachTest); + } + + protected override void FixtureSetup() + { + base.FixtureSetup(); + if (Device is not TestDevice.Mac) + App.NavigateToGallery(GalleryPageName); + } + + public abstract string GalleryPageName { get; } + } +} \ No newline at end of file diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs index 55b4fcd2d0f6..41a0c443ebf3 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs @@ -24,6 +24,27 @@ protected override void TryToResetTestState() NavigateToIssue(Issue); } + public override IConfig GetTestConfig() + { + var config = base.GetTestConfig(); + +#if MACCATALYST + // For Catalyst, pass the test name as a startup argument + // If the UITestContext is not null we can directly pass the Issue via LaunchAppWithTest + if (UITestContext is null) + { + config.SetTestConfigurationArg("test", Issue); + } +#endif + + return config; + } + + public override void LaunchAppWithTest() + { + App.LaunchApp(Issue, ResetAfterEachTest); + } + public abstract string Issue { get; } private void NavigateToIssue(string issue) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingGridTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingGridTests.cs index a00f1bd5382b..23cd1fa1f773 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingGridTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingGridTests.cs @@ -7,6 +7,8 @@ namespace Microsoft.Maui.TestCases.Tests public class KeyboardScrollingGridTests : CoreGalleryBasePageTest { const string KeyboardScrollingGallery = "Keyboard Scrolling Gallery - Grid with Star Row"; + + public override string GalleryPageName => KeyboardScrollingGallery; public KeyboardScrollingGridTests(TestDevice device) : base(device) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageLargeTitlesTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageLargeTitlesTests.cs index 5c2b7e030734..824e41c60663 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageLargeTitlesTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageLargeTitlesTests.cs @@ -8,6 +8,9 @@ namespace Microsoft.Maui.TestCases.Tests public class KeyboardScrollingNonScrollingPageLargeTitlesTests : CoreGalleryBasePageTest { const string KeyboardScrollingGallery = "Keyboard Scrolling Gallery - NonScrolling Page / Large Titles"; + + public override string GalleryPageName => KeyboardScrollingGallery; + public KeyboardScrollingNonScrollingPageLargeTitlesTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageSmallTitlesTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageSmallTitlesTests.cs index e1798c870f5b..cbe20051b51f 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageSmallTitlesTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingNonScrollingPageSmallTitlesTests.cs @@ -7,6 +7,9 @@ namespace Microsoft.Maui.TestCases.Tests public class KeyboardScrollingNonScrollingPageSmallTitlesTests : CoreGalleryBasePageTest { const string KeyboardScrollingGallery = "Keyboard Scrolling Gallery - NonScrolling Page / Small Titles"; + + public override string GalleryPageName => KeyboardScrollingGallery; + public KeyboardScrollingNonScrollingPageSmallTitlesTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageLargeTitlesTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageLargeTitlesTests.cs index 86759d6bd6b0..55a762fb089a 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageLargeTitlesTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageLargeTitlesTests.cs @@ -7,6 +7,9 @@ namespace Microsoft.Maui.TestCases.Tests public class KeyboardScrollingScrollingPageLargeTitlesTests : CoreGalleryBasePageTest { const string KeyboardScrollingGallery = "Keyboard Scrolling Gallery - Scrolling Page / Large Titles"; + + public override string GalleryPageName => KeyboardScrollingGallery; + public KeyboardScrollingScrollingPageLargeTitlesTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageSmallTitlesTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageSmallTitlesTests.cs index 750cbfa3f06d..6aee2bd34cc0 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageSmallTitlesTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/KeyboardScrollingScrollingPageSmallTitlesTests.cs @@ -7,6 +7,9 @@ namespace Microsoft.Maui.TestCases.Tests public class KeyboardScrollingScrollingPageSmallTitlesTests : CoreGalleryBasePageTest { const string KeyboardScrollingGallery = "Keyboard Scrolling Gallery - Scrolling Page / Small Titles"; + + public override string GalleryPageName => KeyboardScrollingGallery; + public KeyboardScrollingScrollingPageSmallTitlesTests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/LabelUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/LabelUITests.cs index 0b78392c7b6e..5a9a8b5d689d 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/LabelUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/LabelUITests.cs @@ -10,6 +10,8 @@ public class LabelUITests : _ViewUITests { const string LabelGallery = "Label Gallery"; + public override string GalleryPageName => LabelGallery; + public LabelUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/RadioButtonUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/RadioButtonUITests.cs index 679301348732..637fc1d5f5ad 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/RadioButtonUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/RadioButtonUITests.cs @@ -7,6 +7,8 @@ public class RadioButtonUITests : _ViewUITests { public const string RadioButtonGallery = "RadioButton Gallery"; + public override string GalleryPageName => RadioButtonGallery; + public RadioButtonUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/ScrollViewUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/ScrollViewUITests.cs index d1bb5fd059a0..a4d5fb65fda3 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/ScrollViewUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/ScrollViewUITests.cs @@ -8,6 +8,8 @@ namespace Microsoft.Maui.TestCases.Tests public class ScrollToUITests : CoreGalleryBasePageTest { const string LayoutGallery = "ScrollView Gallery"; + public override string GalleryPageName => LayoutGallery; + protected override bool ResetAfterEachTest => true; public ScrollToUITests(TestDevice device) : base(device) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/SliderUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/SliderUITests.cs index f6246d091f36..b45e5cccfb1e 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/SliderUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/SliderUITests.cs @@ -9,6 +9,8 @@ public class SliderUITests : CoreGalleryBasePageTest { public const string SliderGallery = "Slider Gallery"; + public override string GalleryPageName => SliderGallery; + public SliderUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/StepperUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/StepperUITests.cs index 23db7e3c1914..3f17e119777e 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/StepperUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/StepperUITests.cs @@ -10,6 +10,8 @@ public class StepperUITests : CoreGalleryBasePageTest { public const string StepperGallery = "Stepper Gallery"; + public override string GalleryPageName => StepperGallery; + public StepperUITests(TestDevice device) : base(device) { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/SwipeViewUITests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/SwipeViewUITests.cs index 74f539190e9d..b931e2c50327 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/SwipeViewUITests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/SwipeViewUITests.cs @@ -8,13 +8,13 @@ namespace Microsoft.Maui.TestCases.Tests { public class SwipeViewUITests : CoreGalleryBasePageTest { - const string ScrollViewGallery = "SwipeView Gallery"; + const string SwipeViewGallery = "SwipeView Gallery"; const string SwipeViewToRightId = "SwipeViewToRightId"; const string ResultToRightId = "ResultToRightId"; const string SwipeViewToLeftId = "SwipeViewToLeftId"; const string ResultToLeftId = "ResultToLeftId"; - + public override string GalleryPageName => SwipeViewGallery; public SwipeViewUITests(TestDevice device) : base(device) { @@ -22,7 +22,7 @@ public SwipeViewUITests(TestDevice device) protected override void NavigateToGallery() { - App.NavigateToGallery(ScrollViewGallery); + App.NavigateToGallery(SwipeViewGallery); } [Test] diff --git a/src/Controls/tests/TestCases.Shared.Tests/UITest.cs b/src/Controls/tests/TestCases.Shared.Tests/UITest.cs index ef0cc5e5c711..b2821aac5d90 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/UITest.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/UITest.cs @@ -110,6 +110,16 @@ public override void Reset() App.ResetApp(); } + public override void Close() + { + App.CloseApp(); + } + + public override void LaunchAppWithTest() + { + App.LaunchApp(); + } + /// /// Verifies the screenshots and returns an exception in case of failure. /// diff --git a/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs b/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs index 01fa9571fbb9..50c6c3562169 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs @@ -31,8 +31,12 @@ public static void Back(this UITestContextBase testBase) public static void NavigateToGallery(this IApp app, string page) { - app.WaitForElement(goToTestButtonId, "Timed out waiting for Go To Test button to appear", TimeSpan.FromMinutes(2)); - NavigateTo(app, page); + // For Catalyst app directly go the test page while opening. + if (app is not AppiumCatalystApp) + { + app.WaitForElement(goToTestButtonId, "Timed out waiting for Go To Test button to appear", TimeSpan.FromMinutes(2)); + NavigateTo(app, page); + } } public static void NavigateTo(this IApp app, string text) diff --git a/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs b/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs index 038e423d7c77..c754901a0f20 100644 --- a/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs +++ b/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs @@ -58,10 +58,18 @@ CommandResponse LaunchApp(IDictionary parameters) return CommandResponse.FailedEmptyResponse; if (_app.GetTestDevice() == TestDevice.Mac) - { - _app.Driver.ExecuteScript("macos: activateApp", new Dictionary + { + var args = _app.Config.GetProperty>("TestConfigurationArgs") ?? new Dictionary(); + + if (args.ContainsKey("test") && parameters.ContainsKey("testName") && parameters["testName"] is string testName && !string.IsNullOrEmpty(testName)) + { + args["test"] = testName; + } + + _app.Driver.ExecuteScript("macos: launchApp", new Dictionary { { "bundleId", _app.GetAppId() }, + { "environment", args}, }); } else if (_app.Driver is WindowsDriver windowsDriver) diff --git a/src/TestUtils/src/UITest.Appium/AppiumCatalystApp.cs b/src/TestUtils/src/UITest.Appium/AppiumCatalystApp.cs index c6552ab90975..8e198e70448e 100644 --- a/src/TestUtils/src/UITest.Appium/AppiumCatalystApp.cs +++ b/src/TestUtils/src/UITest.Appium/AppiumCatalystApp.cs @@ -65,6 +65,12 @@ private static AppiumOptions GetOptions(IConfig config) options.AddAdditionalAppiumOption(IOSMobileCapabilityType.BundleId, appId); } + var args = config.GetProperty>("TestConfigurationArgs"); + if(args is not null && args.Count > 0) + { + options.AddAdditionalAppiumOption("environment", args); + } + options.AddAdditionalAppiumOption("showServerLogs", true); return options; } diff --git a/src/TestUtils/src/UITest.Appium/HelperExtensions.cs b/src/TestUtils/src/UITest.Appium/HelperExtensions.cs index f11f2ef8fd35..2f5c62d15e59 100644 --- a/src/TestUtils/src/UITest.Appium/HelperExtensions.cs +++ b/src/TestUtils/src/UITest.Appium/HelperExtensions.cs @@ -1554,6 +1554,21 @@ public static void LaunchApp(this IApp app) app.CommandExecutor.Execute("launchApp", ImmutableDictionary.Empty); } + /// + /// Executes an existing application on the device with additional parameters. + /// If the application is already running then it will be brought to the foreground. + /// + /// Represents the main gateway to interact with an app. + /// Additional parameters to send with the launch command. + public static void LaunchApp(this IApp app, string parameters, bool isResetAfterEachTest = false) + { + app.CommandExecutor.Execute("launchApp", new Dictionary + { + { "testName", parameters }, + { "isResetAfterEachTest", isResetAfterEachTest } + }); + } + /// /// Send the currently running app for this session to the background. /// diff --git a/src/TestUtils/src/UITest.NUnit/UITestBase.cs b/src/TestUtils/src/UITest.NUnit/UITestBase.cs index 494a5243c9b1..5206e2c7878d 100644 --- a/src/TestUtils/src/UITest.NUnit/UITestBase.cs +++ b/src/TestUtils/src/UITest.NUnit/UITestBase.cs @@ -58,8 +58,17 @@ protected virtual void FixtureOneTimeTearDown() { try { - if (!ResetAfterEachTest) + + if (Device is TestDevice.Mac) + { + // For Mac, here needed to close the app itself, re-open happens on InitialSetup + Close(); + } + else if (!ResetAfterEachTest) + { Reset(); + } + } catch (Exception e) { diff --git a/src/TestUtils/src/UITest.NUnit/UITestContextBase.cs b/src/TestUtils/src/UITest.NUnit/UITestContextBase.cs index 58894a0da342..bc9b159a0a1a 100644 --- a/src/TestUtils/src/UITest.NUnit/UITestContextBase.cs +++ b/src/TestUtils/src/UITest.NUnit/UITestContextBase.cs @@ -38,10 +38,20 @@ public IApp App public IApp RunningApp => App; public abstract IConfig GetTestConfig(); + + public abstract void Close(); + + public abstract void LaunchAppWithTest(); public void InitialSetup(IServerContext context) { _context = context ?? throw new ArgumentNullException(nameof(context)); + + if (UITestContext != null && Device is TestDevice.Mac) + { + LaunchAppWithTest(); + } + InitialSetup(context, false); } From aec485b24eb993e8f03cf75e282eb835861e7291 Mon Sep 17 00:00:00 2001 From: NafeelaNazhir Date: Fri, 26 Sep 2025 12:17:42 +0530 Subject: [PATCH 02/10] Modified newly added feature matrix test classes --- .../Tests/FeatureMatrix/AbsoluteLayoutFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/BorderFeatureTests.cs | 10 +++------- .../Tests/FeatureMatrix/ContentPageFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/ContentViewFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/FlyoutPageFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/IndicatorViewFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/NavigationPageFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/PickerFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/RefreshViewFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/ShapesFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/StackLayoutFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/SwipeViewFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/TitleBarFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/TwoPaneViewFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/WebViewFeatureTests.cs | 8 ++------ 15 files changed, 31 insertions(+), 104 deletions(-) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AbsoluteLayoutFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AbsoluteLayoutFeatureTests.cs index befe3a5853ba..130066c6cbd1 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AbsoluteLayoutFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AbsoluteLayoutFeatureTests.cs @@ -4,9 +4,10 @@ namespace Microsoft.Maui.TestCases.Tests; -public class AbsoluteLayoutFeatureTests : UITest +public class AbsoluteLayoutFeatureTests : _GalleryUITest { public const string AbsoluteLayoutFeatureMatrix = "AbsoluteLayout Feature Matrix"; + public override string GalleryPageName => AbsoluteLayoutFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string XEntry = "XEntry"; @@ -27,12 +28,6 @@ public AbsoluteLayoutFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(AbsoluteLayoutFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.Layout)] public void VerifyAbsoluteLayout_LayoutBounds() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BorderFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BorderFeatureTests.cs index 88841ab229f8..3735f6398838 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BorderFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BorderFeatureTests.cs @@ -4,21 +4,17 @@ namespace Microsoft.Maui.TestCases.Tests; -public class BorderFeatureTests : UITest +public class BorderFeatureTests : _GalleryUITest { public const string BorderFeatureMatrix = "Border Feature Matrix"; + public override string GalleryPageName => BorderFeatureMatrix; + public BorderFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(BorderFeatureMatrix); - } - [Test] [Category(UITestCategories.Border)] public void Border_PaddingWithContent_Label() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentPageFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentPageFeatureTests.cs index 9b991de09f6f..f576763cf052 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentPageFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentPageFeatureTests.cs @@ -5,21 +5,16 @@ namespace Microsoft.Maui.TestCases.Tests { [Category(UITestCategories.Page)] - public class ContentPageFeatureTests : UITest + public class ContentPageFeatureTests : _GalleryUITest { public const string ContentPageFeatureMatrix = "ContentPage Feature Matrix"; + public override string GalleryPageName => ContentPageFeatureMatrix; public ContentPageFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ContentPageFeatureMatrix); - } - [Test] public void ContentPage_zContent() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentViewFeatureTests.cs index f001048fa6d5..f55e55aa3c0a 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ContentViewFeatureTests.cs @@ -5,21 +5,16 @@ namespace Microsoft.Maui.TestCases.Tests; [Category(UITestCategories.ViewBaseTests)] -public class ContentViewFeatureTests : UITest +public class ContentViewFeatureTests : _GalleryUITest { public const string ContentViewFeatureMatrix = "ContentView Feature Matrix"; + public override string GalleryPageName => ContentViewFeatureMatrix; public ContentViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ContentViewFeatureMatrix); - } - [Test] public void ContentViewWithDefaultLayoutContent() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs index 6a59d939a035..19fd79fe8fd2 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlyoutPageFeatureTests.cs @@ -4,9 +4,10 @@ namespace Microsoft.Maui.TestCases.Tests; -public class FlyoutPageFeatureTests : UITest +public class FlyoutPageFeatureTests : _GalleryUITest { public const string FlyoutPageFeatureMatrix = "Flyout Feature Matrix"; + public override string GalleryPageName => FlyoutPageFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string FlowDirectionRTL = "FlowDirectionRTL"; @@ -27,12 +28,6 @@ public FlyoutPageFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(FlyoutPageFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.FlyoutPage)] public void VerifyFlyoutPage_NavigationEvents() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/IndicatorViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/IndicatorViewFeatureTests.cs index 3befa9415c46..70602fa5d566 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/IndicatorViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/IndicatorViewFeatureTests.cs @@ -6,9 +6,10 @@ namespace Microsoft.Maui.TestCases.Tests; -public class IndicatorViewFeatureTests : UITest +public class IndicatorViewFeatureTests : _GalleryUITest { private const string IndicatorViewFeatureMatrix = "IndicatorView Feature Matrix"; + public override string GalleryPageName => IndicatorViewFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string IndicatorColorBrownButton = "IndicatorColorBrownButton"; @@ -38,12 +39,6 @@ public IndicatorViewFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(IndicatorViewFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.IndicatorView)] public void VerifyIndicatorColor() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/NavigationPageFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/NavigationPageFeatureTests.cs index 82746acd2668..98e419010c79 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/NavigationPageFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/NavigationPageFeatureTests.cs @@ -6,18 +6,13 @@ namespace Microsoft.Maui.TestCases.Tests { [Category(UITestCategories.Navigation)] - public class NavigationPageFeatureTests : UITest + public class NavigationPageFeatureTests : _GalleryUITest { public const string NavigationPageFeatureMatrix = "NavigationPage Feature Matrix"; + public override string GalleryPageName => NavigationPageFeatureMatrix; public NavigationPageFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(NavigationPageFeatureMatrix); - } - [Test, Order(1)] public void EntryPoints_AreVisible() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/PickerFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/PickerFeatureTests.cs index 510dd025bd9a..4992e8641ea4 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/PickerFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/PickerFeatureTests.cs @@ -4,21 +4,16 @@ namespace Microsoft.Maui.TestCases.Tests { - public class PickerFeatureTests : UITest + public class PickerFeatureTests : _GalleryUITest { public const string PickerFeatureMatrix = "Picker Feature Matrix"; + public override string GalleryPageName => PickerFeatureMatrix; public PickerFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(PickerFeatureMatrix); - } - public void VerifyPickerScreenshot() { #if WINDOWS diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RefreshViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RefreshViewFeatureTests.cs index 2923368e055b..c79986ccd5bd 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RefreshViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/RefreshViewFeatureTests.cs @@ -4,21 +4,16 @@ namespace Microsoft.Maui.TestCases.Tests; -public class RefreshViewFeatureTests : UITest +public class RefreshViewFeatureTests : _GalleryUITest { public const string RefreshViewFeatureMatrix = "RefreshView Feature Matrix"; + public override string GalleryPageName => RefreshViewFeatureMatrix; public RefreshViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(RefreshViewFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.RefreshView)] public void RefreshView_ValidateDefaultValues_VerifyLabels() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShapesFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShapesFeatureTests.cs index 83b306176adb..6b386fa22735 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShapesFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShapesFeatureTests.cs @@ -5,21 +5,16 @@ namespace Microsoft.Maui.TestCases.Tests; -public class ShapesFeatureTests : UITest +public class ShapesFeatureTests : _GalleryUITest { public const string ShapesFeatureMatrix = "Shapes Feature Matrix"; + public override string GalleryPageName => ShapesFeatureMatrix; public ShapesFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ShapesFeatureMatrix); - } - public void VerifyShapeScreenshot() { #if WINDOWS diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StackLayoutFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StackLayoutFeatureTests.cs index 7699d6fd661e..a59f3663fcaf 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StackLayoutFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/StackLayoutFeatureTests.cs @@ -5,21 +5,16 @@ namespace Microsoft.Maui.TestCases.Tests; [Category(UITestCategories.Layout)] -public class StackLayoutFeatureTests : UITest +public class StackLayoutFeatureTests : _GalleryUITest { public const string StackLayoutFeatureMatrix = "StackLayout Feature Matrix"; + public override string GalleryPageName => StackLayoutFeatureMatrix; public StackLayoutFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(StackLayoutFeatureMatrix); - } - [Test] public void HorizontalStackLayout_IsVisible() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwipeViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwipeViewFeatureTests.cs index 048fb253db2a..d1cee4241cde 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwipeViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SwipeViewFeatureTests.cs @@ -4,21 +4,16 @@ namespace Microsoft.Maui.TestCases.Tests; [Category(UITestCategories.SwipeView)] -public class SwipeViewFeatureTests : UITest +public class SwipeViewFeatureTests : _GalleryUITest { public const string SwipeViewFeatureMatrix = "SwipeView Feature Matrix"; + public override string GalleryPageName => SwipeViewFeatureMatrix; public SwipeViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(SwipeViewFeatureMatrix); - } - #if TEST_FAILS_ON_WINDOWS //related issue link: https://github.com/dotnet/maui/issues/30949 && https://github.com/dotnet/maui/issues/30947 [Test, Order(1)] public void VerifySwipeViewWhenLabelSwipeItemAndEvents() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TitleBarFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TitleBarFeatureTests.cs index 06ffe26bef07..b11cee08122a 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TitleBarFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TitleBarFeatureTests.cs @@ -6,21 +6,16 @@ namespace Microsoft.Maui.TestCases.Tests; -public class TitleBarFeatureTests : UITest +public class TitleBarFeatureTests : _GalleryUITest { public const string TitleBarFeatureMatrix = "TitleBar Feature Matrix"; + public override string GalleryPageName => TitleBarFeatureMatrix; public TitleBarFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(TitleBarFeatureMatrix); - } - [Test] [Category(UITestCategories.TitleView)] public void TitleBar_Window() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TwoPaneViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TwoPaneViewFeatureTests.cs index 50edb4b14304..ba83da357be4 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TwoPaneViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TwoPaneViewFeatureTests.cs @@ -5,21 +5,16 @@ namespace Microsoft.Maui.TestCases.Tests { - public class TwoPaneViewFeatureTests : UITest + public class TwoPaneViewFeatureTests : _GalleryUITest { public const string TwoPaneViewFeatureMatrix = "TwoPaneView Feature Matrix"; + public override string GalleryPageName => TwoPaneViewFeatureMatrix; public TwoPaneViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(TwoPaneViewFeatureMatrix); - } - // The test cases below are divided based on platform-specific UI behaviors and layout logic. // // For MACCATALYST and WINDOWS: diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/WebViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/WebViewFeatureTests.cs index 0ddd2bb7d7e6..2e829ffdc917 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/WebViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/WebViewFeatureTests.cs @@ -4,9 +4,10 @@ using UITest.Core; namespace Microsoft.Maui.TestCases.Tests; -public class WebViewFeatureTests : UITest +public class WebViewFeatureTests : _GalleryUITest { public const string WebViewFeatureMatrix = "WebView Feature Matrix"; + public override string GalleryPageName => WebViewFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string WebViewControl = "WebViewControl"; @@ -26,11 +27,6 @@ public WebViewFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(WebViewFeatureMatrix); - } [Test, Order(1)] [Category(UITestCategories.WebView)] From 3e81f9259b3cab9edbe0daf14f4ea59518ff6e25 Mon Sep 17 00:00:00 2001 From: NafeelaNazhir Date: Mon, 6 Oct 2025 10:29:43 +0530 Subject: [PATCH 03/10] Changes updated --- .../tests/TestCases.HostApp/TestCases.cs | 18 +++++++++++---- .../Tests/Issues/_GalleryUITest.cs | 23 ++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/Controls/tests/TestCases.HostApp/TestCases.cs b/src/Controls/tests/TestCases.HostApp/TestCases.cs index 281658a6c2d3..c9358bee596f 100644 --- a/src/Controls/tests/TestCases.HostApp/TestCases.cs +++ b/src/Controls/tests/TestCases.HostApp/TestCases.cs @@ -249,14 +249,24 @@ public bool TryToNavigateTo(string name) /// The name or description of the test page to find. /// The Page instance if found; otherwise, null. /// - /// This method first searches for a matching issue by name (case-insensitive), - /// then by description if no match is found by name. If a match is found, + /// This method first searches for an exact match by description (case-insensitive), + /// then falls back to partial matching if no exact match is found. If a match is found, /// it invokes the associated PageFactory to create the page. /// public Page TryToGetTestPage(string name) { - var issue = _issues.SingleOrDefault(x => string.Equals(x.Description, name, StringComparison.OrdinalIgnoreCase)); - return issue?.PageFactory?.Invoke(); + // Try exact match first + var exactMatch = _issues.FirstOrDefault(x => + string.Equals(x.Description, name, StringComparison.OrdinalIgnoreCase)); + + if (exactMatch != null) + return exactMatch.PageFactory?.Invoke(); + + // Fallback to partial match + var partialMatch = _issues.FirstOrDefault(x => + x.Description.Contains(name, StringComparison.OrdinalIgnoreCase)); + + return partialMatch?.PageFactory?.Invoke(); } public void FilterIssues(string filter = null) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs index 43d09c198819..b840c3a830b7 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_GalleryUITest.cs @@ -26,7 +26,28 @@ public override IConfig GetTestConfig() public override void LaunchAppWithTest() { - App.LaunchApp(GalleryPageName, ResetAfterEachTest); + const int maxRetries = 3; + const int delayBetweenRetries = 2000; // 2 seconds + + for (int attempt = 1; attempt <= maxRetries; attempt++) + { + try + { + App.LaunchApp(GalleryPageName, ResetAfterEachTest); + return; // Success, exit retry loop + } + catch (Exception) + { + if (attempt == maxRetries) + { + TestContext.WriteLine($"Failed to launch app after {maxRetries} attempts."); + throw; // Final attempt failed, rethrow the original exception + } + + // Wait before retrying + System.Threading.Thread.Sleep(delayBetweenRetries); + } + } } protected override void FixtureSetup() From b4024f0f443aaf521d61a113b80f21ed92319855 Mon Sep 17 00:00:00 2001 From: NafeelaNazhir Date: Mon, 10 Nov 2025 15:16:13 +0530 Subject: [PATCH 04/10] Modified newly added feature matrix --- .../ScrollViewWithLayoutOptionsFeatureTests.cs | 9 ++------- .../Tests/FeatureMatrix/ToolbarFeatureTests.cs | 10 ++-------- .../Tests/Issues/_IssuesUITest.cs | 2 ++ 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewWithLayoutOptionsFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewWithLayoutOptionsFeatureTests.cs index 669f528f2a11..f119a98b9503 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewWithLayoutOptionsFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewWithLayoutOptionsFeatureTests.cs @@ -5,9 +5,10 @@ namespace Microsoft.Maui.TestCases.Tests; -public class ScrollViewWithLayoutOptionsFeatureTests : UITest +public class ScrollViewWithLayoutOptionsFeatureTests : _GalleryUITest { public const string ScrollViewWithLayoutOptionsFeatureMatrix = "ScrollView With LayoutOptions Feature Matrix"; + public override string GalleryPageName => ScrollViewWithLayoutOptionsFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string HorizontalStart = "HorizontalStart"; @@ -31,12 +32,6 @@ public ScrollViewWithLayoutOptionsFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ScrollViewWithLayoutOptionsFeatureMatrix); - } - [Test, Order(1)] [Category(UITestCategories.ScrollView)] public void VerifyLayoutWithOrientationVertical_HorizontalOptionsStart() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ToolbarFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ToolbarFeatureTests.cs index a132f02ce185..c19867663df5 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ToolbarFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ToolbarFeatureTests.cs @@ -4,22 +4,16 @@ namespace Microsoft.Maui.TestCases.Tests; -public class ToolbarFeatureTests : UITest +public class ToolbarFeatureTests : _GalleryUITest { public const string ToolbarFeatureMatrix = "Toolbar Feature Matrix"; + public override string GalleryPageName => ToolbarFeatureMatrix; public ToolbarFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(ToolbarFeatureMatrix); - } - - [Test, Order(1)] [Category(UITestCategories.ToolbarItem)] public void VerifyPrimaryToolBar_DisabledState() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs index 41a0c443ebf3..91d5c0f7cd15 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs @@ -21,7 +21,9 @@ public _IssuesUITest(TestDevice device) : base(device) { } protected override void TryToResetTestState() { +#if !MACCATALYST NavigateToIssue(Issue); +#endif } public override IConfig GetTestConfig() From 6ad150126e37c62b408114c706abf680ac71b58d Mon Sep 17 00:00:00 2001 From: NafeelaNazhir Date: Wed, 19 Nov 2025 13:47:22 +0530 Subject: [PATCH 05/10] modified newly added feature matrix --- .../Tests/FeatureMatrix/GridFeatureTests.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GridFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GridFeatureTests.cs index 33fbf077fd25..3016c1815a86 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GridFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/GridFeatureTests.cs @@ -5,9 +5,10 @@ namespace Microsoft.Maui.TestCases.Tests; -public class GridFeatureTests : UITest +public class GridFeatureTests : _GalleryUITest { public const string GridFeatureMatrix = "Grid Feature Matrix"; + public override string GalleryPageName => GridFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string RowEntry = "RowEntry"; @@ -26,12 +27,6 @@ public GridFeatureTests(TestDevice device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(GridFeatureMatrix); - } - [Test] [Category(UITestCategories.Layout)] public void VerifyGrid_SetRow() From 35dceab48090c43a59c370689ffb0eaee3c3aa16 Mon Sep 17 00:00:00 2001 From: NafeelaNazhir Date: Thu, 4 Dec 2025 17:10:55 +0530 Subject: [PATCH 06/10] changes updated --- .../tests/TestCases.HostApp/TestCases.cs | 20 +++++-------------- .../FeatureMatrix/AppThemeFeatureTests.cs | 10 +++------- .../FeatureMatrix/FlexLayoutFeatureTests.cs | 9 ++------- .../FeatureMatrix/ScrollViewFeatureTests.cs | 2 +- .../FeatureMatrix/SearchBarFeatureTests.cs | 2 +- 5 files changed, 12 insertions(+), 31 deletions(-) diff --git a/src/Controls/tests/TestCases.HostApp/TestCases.cs b/src/Controls/tests/TestCases.HostApp/TestCases.cs index c9358bee596f..6e4aec66f541 100644 --- a/src/Controls/tests/TestCases.HostApp/TestCases.cs +++ b/src/Controls/tests/TestCases.HostApp/TestCases.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Linq; @@ -249,24 +249,14 @@ public bool TryToNavigateTo(string name) /// The name or description of the test page to find. /// The Page instance if found; otherwise, null. /// - /// This method first searches for an exact match by description (case-insensitive), - /// then falls back to partial matching if no exact match is found. If a match is found, + /// This method first searches for a matching issue by name (case-insensitive), + /// then by description if no match is found by name. If a match is found, /// it invokes the associated PageFactory to create the page. /// public Page TryToGetTestPage(string name) { - // Try exact match first - var exactMatch = _issues.FirstOrDefault(x => - string.Equals(x.Description, name, StringComparison.OrdinalIgnoreCase)); - - if (exactMatch != null) - return exactMatch.PageFactory?.Invoke(); - - // Fallback to partial match - var partialMatch = _issues.FirstOrDefault(x => - x.Description.Contains(name, StringComparison.OrdinalIgnoreCase)); - - return partialMatch?.PageFactory?.Invoke(); + var issue = _issues.SingleOrDefault(x => string.Equals(x.Description, name, StringComparison.OrdinalIgnoreCase)); + return issue?.PageFactory?.Invoke(); } public void FilterIssues(string filter = null) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AppThemeFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AppThemeFeatureTests.cs index 56f0bb3220c8..9588350e6ac5 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AppThemeFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/AppThemeFeatureTests.cs @@ -4,17 +4,13 @@ namespace Microsoft.Maui.TestCases.Tests; -public class AppThemeFeatureTests : UITest +public class AppThemeFeatureTests : _GalleryUITest { public const string AppThemeFeatureMatrix = "App Theme"; - public AppThemeFeatureTests(TestDevice testDevice) : base(testDevice) - { - } + public override string GalleryPageName => AppThemeFeatureMatrix; - protected override void FixtureSetup() + public AppThemeFeatureTests(TestDevice testDevice) : base(testDevice) { - base.FixtureSetup(); - App.NavigateToGallery(AppThemeFeatureMatrix); } public void VerifyScreenshotWithPlatformCropping() diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlexLayoutFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlexLayoutFeatureTests.cs index 8a4e1454f819..1036cf33d62c 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlexLayoutFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/FlexLayoutFeatureTests.cs @@ -5,18 +5,13 @@ namespace Microsoft.Maui.TestCases.Tests; [Category(UITestCategories.Layout)] -public class FlexLayoutFeatureTests : UITest +public class FlexLayoutFeatureTests : _GalleryUITest { public const string FlexLayoutFeatureMatrix = "FlexLayout Feature Matrix"; + public override string GalleryPageName => FlexLayoutFeatureMatrix; public FlexLayoutFeatureTests(TestDevice device) : base(device) { } - protected override void FixtureSetup() - { - base.FixtureSetup(); - App.NavigateToGallery(FlexLayoutFeatureMatrix); - } - [Test, Order(1)] public void FlexLayout_ValidateDefaultValues() { diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs index b903c9dd43c7..3c9aa9818832 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ScrollViewFeatureTests.cs @@ -8,7 +8,7 @@ namespace Microsoft.Maui.TestCases.Tests; public class ScrollViewFeatureTests : _GalleryUITest { public const string ScrollViewFeatureMatrix = "ScrollView Feature Matrix"; - override public string GalleryPageName => ScrollViewFeatureMatrix; + public override string GalleryPageName => ScrollViewFeatureMatrix; public const string Options = "Options"; public const string Apply = "Apply"; public const string ContentLabel = "ContentLabel"; diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs index 77977314c1f3..7e5a36fd8577 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SearchBarFeatureTests.cs @@ -8,7 +8,7 @@ public class SearchBarFeatureTests : _GalleryUITest { public const string SearchBarFeatureMatrix = "Search Bar Feature Matrix"; - override public string GalleryPageName => SearchBarFeatureMatrix; + public override string GalleryPageName => SearchBarFeatureMatrix; public SearchBarFeatureTests(TestDevice testDevice) : base(testDevice) { From de077eea02929fb679d874ac72cd2becbb90fe2e Mon Sep 17 00:00:00 2001 From: NafeelaNazhir Date: Tue, 9 Dec 2025 12:25:51 +0530 Subject: [PATCH 07/10] changes updated --- .../Issues/Issue18161.xaml.cs | 3 +++ .../TestCases.HostApp/Issues/Issue19657.xaml | 3 ++- .../TestCases.HostApp/Issues/Issue7144.cs | 2 +- .../mac/DarkTheme_VerifyVisualState.png | Bin 66702 -> 66036 bytes .../mac/LightTheme_VerifyVisualState.png | Bin 64573 -> 63839 bytes .../SliderThumbImageShouldRespectColor.png | Bin 10431 -> 10282 bytes .../FeatureMatrix/GraphicsViewFeatureTests.cs | 3 ++- .../snapshots/windows/Bugzilla53834Test.png | Bin 10811 -> 20479 bytes 8 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue18161.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue18161.xaml.cs index bfe8c771cb5b..b4b49cb67164 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue18161.xaml.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue18161.xaml.cs @@ -13,6 +13,9 @@ async void Issue18161_Loaded(object sender, EventArgs e) { // https://github.com/dotnet/maui/issues/13496 await Task.Yield(); +#if MACCATALYST + await Task.Delay(500); // Add delay for MacCatalyst when page is loaded directly as window root +#endif this.IsPresented = true; } diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue19657.xaml b/src/Controls/tests/TestCases.HostApp/Issues/Issue19657.xaml index 470b8552a130..4d679ac53424 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue19657.xaml +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue19657.xaml @@ -2,6 +2,7 @@ @@ -20,7 +21,7 @@