diff --git a/Winforms.sln b/Winforms.sln
index 8f39430544..5c8f72858c 100644
--- a/Winforms.sln
+++ b/Winforms.sln
@@ -1,4 +1,3 @@
-
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28627.84
@@ -124,6 +123,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Windows.Forms.Design.Editors.Facade3x", "src\System.Windows.Forms.Design.Editors\src\System.Windows.Forms.Design.Editors.Facade3x.csproj", "{E0681991-228A-420E-85D5-A9E796F0AAE0}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiPropertyGridViewTests", "src\System.Windows.Forms\tests\IntegrationTests\MauiTests\MauiPropertyGridViewTests\MauiPropertyGridViewTests.csproj", "{F4E4EB7A-1A93-4D85-9E8E-8171809BEA4D}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiMonthCalendarTests", "src\System.Windows.Forms\tests\IntegrationTests\MauiTests\MauimonthCalendarTests\MauiMonthCalendarTests.csproj", "{9DDC6936-9197-4C09-8640-AF0BE4918700}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiTestsHelper", "src\System.Windows.Forms\tests\IntegrationTests\MauiTests\MauiTestsHelper\MauiTestsHelper.csproj", "{44BB1092-1844-4EAF-8DF5-338DE4C3149A}"
@@ -132,6 +133,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Windows.Forms.Primit
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Windows.Forms.TestUtilities", "src\System.Windows.Forms\tests\TestUtilities\System.Windows.Forms.TestUtilities.csproj", "{86418F0B-39DC-4B5A-8145-6D607E6150AC}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiToolStripTests", "src\System.Windows.Forms\tests\IntegrationTests\MauiTests\MauiToolStripTests\MauiToolStripTests.csproj", "{83634671-CF3A-43B0-B729-42CCBA62DF2C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -250,6 +253,10 @@ Global
{E0681991-228A-420E-85D5-A9E796F0AAE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E0681991-228A-420E-85D5-A9E796F0AAE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E0681991-228A-420E-85D5-A9E796F0AAE0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F4E4EB7A-1A93-4D85-9E8E-8171809BEA4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F4E4EB7A-1A93-4D85-9E8E-8171809BEA4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F4E4EB7A-1A93-4D85-9E8E-8171809BEA4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F4E4EB7A-1A93-4D85-9E8E-8171809BEA4D}.Release|Any CPU.Build.0 = Release|Any CPU
{9DDC6936-9197-4C09-8640-AF0BE4918700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9DDC6936-9197-4C09-8640-AF0BE4918700}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9DDC6936-9197-4C09-8640-AF0BE4918700}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -266,6 +273,10 @@ Global
{86418F0B-39DC-4B5A-8145-6D607E6150AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{86418F0B-39DC-4B5A-8145-6D607E6150AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86418F0B-39DC-4B5A-8145-6D607E6150AC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {83634671-CF3A-43B0-B729-42CCBA62DF2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {83634671-CF3A-43B0-B729-42CCBA62DF2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {83634671-CF3A-43B0-B729-42CCBA62DF2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {83634671-CF3A-43B0-B729-42CCBA62DF2C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -304,10 +315,12 @@ Global
{90B27178-F535-43F7-886E-0AB75203F246} = {77FEDB47-F7F6-490D-AF7C-ABB4A9E0B9D7}
{9BFDE7F2-C8F3-40D6-9A16-8DCD1A37E900} = {583F1292-AE8D-4511-B8D8-A81FE4642DDC}
{E0681991-228A-420E-85D5-A9E796F0AAE0} = {434C00C3-E498-4BA7-9764-9F0FC8CFE457}
+ {F4E4EB7A-1A93-4D85-9E8E-8171809BEA4D} = {8F20A905-BD37-4D80-B8DF-FA45276FC23F}
{9DDC6936-9197-4C09-8640-AF0BE4918700} = {8F20A905-BD37-4D80-B8DF-FA45276FC23F}
{44BB1092-1844-4EAF-8DF5-338DE4C3149A} = {8F20A905-BD37-4D80-B8DF-FA45276FC23F}
{73B0857A-966B-4E7D-8A83-FECFE0281AB9} = {DF68A171-D27B-4E6A-8A7E-63A651622355}
{86418F0B-39DC-4B5A-8145-6D607E6150AC} = {DF68A171-D27B-4E6A-8A7E-63A651622355}
+ {83634671-CF3A-43B0-B729-42CCBA62DF2C} = {8F20A905-BD37-4D80-B8DF-FA45276FC23F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7B1B0433-F612-4E5A-BE7E-FCF5B9F6E136}
diff --git a/src/System.Windows.Forms/src/Properties/AssemblyInfo.cs b/src/System.Windows.Forms/src/Properties/AssemblyInfo.cs
index be6a8a6a34..89037d4bb8 100644
--- a/src/System.Windows.Forms/src/Properties/AssemblyInfo.cs
+++ b/src/System.Windows.Forms/src/Properties/AssemblyInfo.cs
@@ -7,6 +7,7 @@ using System.Runtime.CompilerServices;
[assembly: System.Runtime.InteropServices.ComVisible(false)]
[assembly: InternalsVisibleTo("System.Windows.Forms.Tests, PublicKey=00000000000000000400000000000000")]
+[assembly: InternalsVisibleTo("MauiPropertyGridViewTests, PublicKey=00000000000000000400000000000000")]
[assembly: InternalsVisibleTo("MauiMonthCalendarTests, PublicKey=00000000000000000400000000000000")]
// This is needed in order to Moq internal interfaces for testing
diff --git a/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiPropertyGridViewTests/MauiPropertyGridViewTests.csproj b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiPropertyGridViewTests/MauiPropertyGridViewTests.csproj
new file mode 100644
index 0000000000..e508642558
--- /dev/null
+++ b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiPropertyGridViewTests/MauiPropertyGridViewTests.csproj
@@ -0,0 +1,13 @@
+
+
+
+
+
+ true
+
+
+
+ Exe
+
+
+
\ No newline at end of file
diff --git a/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiPropertyGridViewTests/PropertyGridViewRowsAccessibleObjectTests.cs b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiPropertyGridViewTests/PropertyGridViewRowsAccessibleObjectTests.cs
new file mode 100644
index 0000000000..326e15aa28
--- /dev/null
+++ b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiPropertyGridViewTests/PropertyGridViewRowsAccessibleObjectTests.cs
@@ -0,0 +1,78 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Drawing;
+using System.Threading;
+using System.Windows.Forms.IntegrationTests.Common;
+using System.Windows.Forms.PropertyGridInternal;
+using ReflectTools;
+using WFCTestLib.Log;
+
+namespace System.Windows.Forms.IntegrationTests.MauiTests
+{
+ public class PropertyGridViewRowsAccessibleObjectTests : ReflectBase
+ {
+ private readonly DomainUpDown _domainUpDown;
+ private readonly PropertyGrid _propertyGrid;
+
+ private const int bottomBorder = 1;
+ private const int topBorder = 1;
+
+ public PropertyGridViewRowsAccessibleObjectTests(string[] args) : base(args)
+ {
+ this.BringToForeground();
+
+ _domainUpDown = new DomainUpDown();
+ _propertyGrid = new PropertyGrid();
+ _propertyGrid.Size = new Size(223, 244);
+ ClientSize = new Size(508, 367);
+ Controls.Add(_propertyGrid);
+ Controls.Add(_domainUpDown);
+ }
+
+ public static void Main(string[] args)
+ {
+ Thread.CurrentThread.SetCulture("en-US");
+ Application.Run(new PropertyGridViewRowsAccessibleObjectTests(args));
+ }
+
+ [Scenario(true)]
+ public ScenarioResult PropertyGridViewRowsAccessibleObject_Ctor_Default(TParams p)
+ {
+ _propertyGrid.SelectedObject = _domainUpDown;
+ int heightSum = 0;
+ int entriesBorders = 0;
+
+ GridEntryCollection entries = _propertyGrid.GetPropEntries();
+ PropertyGridView propertyGridView = (PropertyGridView)_propertyGrid.ActiveControl;
+
+ foreach (GridEntry entry in entries)
+ {
+ int entryHeight = propertyGridView.AccessibilityGetGridEntryBounds(entry).Height;
+ heightSum += entryHeight;
+ if (entryHeight > 0)
+ {
+ entriesBorders++;
+ }
+
+ foreach (GridEntry item in entry.GridItems)
+ {
+ int itemHeight = propertyGridView.AccessibilityGetGridEntryBounds(item).Height;
+ heightSum += itemHeight;
+ if (itemHeight > 0)
+ {
+ entriesBorders++;
+ }
+ }
+ }
+
+ if (heightSum != propertyGridView.AccessibilityObject.Bounds.Height - topBorder - bottomBorder - entriesBorders)
+ {
+ return new ScenarioResult(false, "Incorrect dimensions");
+ }
+
+ return new ScenarioResult(true);
+ }
+ }
+}
diff --git a/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiToolStripTests/MauiToolStripDropDownTests.cs b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiToolStripTests/MauiToolStripDropDownTests.cs
new file mode 100644
index 0000000000..4bd6afa2c9
--- /dev/null
+++ b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiToolStripTests/MauiToolStripDropDownTests.cs
@@ -0,0 +1,57 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Threading;
+using WFCTestLib.Log;
+using ReflectTools;
+using System.Windows.Forms.IntegrationTests.Common;
+
+namespace System.Windows.Forms.IntegrationTests.MauiTests
+{
+ public class MauiToolStripDropDownTests : ReflectBase
+ {
+ private readonly SubToolStripDropDown _toolStrip;
+
+ public MauiToolStripDropDownTests(string[] args) : base(args)
+ {
+ this.BringToForeground();
+ _toolStrip = new SubToolStripDropDown();
+ }
+
+ public static void Main(string[] args)
+ {
+ Thread.CurrentThread.SetCulture("en-US");
+ Application.Run(new MauiToolStripDropDownTests(args));
+ }
+
+ [Scenario(true)]
+ public ScenarioResult KeyboardAccelerators_Test(TParams p)
+ {
+ bool _result = true;
+
+ _toolStrip.Enabled = true; // it needs for correct work of Control.CanProcessMnemonic method
+ _toolStrip.Visible = true; //
+
+ _result &= !_toolStrip.ProcessDialogChar('F');
+
+ _toolStrip.DisplayedItems.Add("&First item");
+ _toolStrip.DisplayedItems.Add("&Second item");
+ _toolStrip.DisplayedItems.Add("Third item");
+ _toolStrip.Visible = true; // it needs for correct work of Control.CanProcessMnemonic method
+
+ _result &= _toolStrip.ProcessDialogChar('F');
+ _result &= _toolStrip.ProcessDialogChar('S');
+ _result &= !_toolStrip.ProcessDialogChar('T');
+
+ return new ScenarioResult(_result);
+ }
+
+ private class SubToolStripDropDown : ToolStripDropDown
+ {
+ public new ToolStripItemCollection DisplayedItems => base.DisplayedItems;
+
+ public new bool ProcessDialogChar(char charCode) => base.ProcessDialogChar(charCode);
+ }
+ }
+}
diff --git a/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiToolStripTests/MauiToolStripTests.csproj b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiToolStripTests/MauiToolStripTests.csproj
new file mode 100644
index 0000000000..3f955e2b10
--- /dev/null
+++ b/src/System.Windows.Forms/tests/IntegrationTests/MauiTests/MauiToolStripTests/MauiToolStripTests.csproj
@@ -0,0 +1,9 @@
+
+
+
+
+
+ Exe
+
+
+
\ No newline at end of file
diff --git a/src/System.Windows.Forms/tests/IntegrationTests/System.Windows.Forms.Maui.IntegrationTests/WinformsMauiPropertyGridViewTests.cs b/src/System.Windows.Forms/tests/IntegrationTests/System.Windows.Forms.Maui.IntegrationTests/WinformsMauiPropertyGridViewTests.cs
new file mode 100644
index 0000000000..99a60dc06d
--- /dev/null
+++ b/src/System.Windows.Forms/tests/IntegrationTests/System.Windows.Forms.Maui.IntegrationTests/WinformsMauiPropertyGridViewTests.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Windows.Forms.Maui.IntegrationTests
+{
+ ///
+ /// This class runs a maui executable, which contains one or more scenarios.
+ ///
+ /// We want to be able to represent each scenario as a seperate xUnit test, but it's not
+ /// possible to run them independently. The workaround is to have a MauiTestRunner execute all
+ /// the scenarios once and store the results, then feed the scenario names in as member data.
+ ///
+ /// However, MemberData is resolved before any constructors (even static) are called.
+ /// This means the scenario names will not be available yet.
+ ///
+ /// The solution to this is to inherit from MemberDataAttribute and execute custom code
+ /// (running the maui test) before returning the expected data. See MauiMemberDataAttribute.cs for more info.
+ ///
+ /// Also [Collection("Maui")] is used put all maui tests in the same collection, which makes them run sequentially
+ /// instead of in parallel. This is to migitate race conditions of multiple forms open at once.
+ ///
+ [Collection("Maui")]
+ public class WinformsMauiPropertyGridViewTests
+ {
+ private const string ProjectName = "MauiPropertyGridViewTests";
+
+ [Theory]
+ [MauiData(ProjectName)]
+ public void MauiPropertyGridViewTests(string scenarioName)
+ {
+ MauiTestHelper.ValidateScenarioPassed(ProjectName, scenarioName);
+ }
+ }
+}
diff --git a/src/System.Windows.Forms/tests/IntegrationTests/System.Windows.Forms.Maui.IntegrationTests/WinformsMauiToolStripTests.cs b/src/System.Windows.Forms/tests/IntegrationTests/System.Windows.Forms.Maui.IntegrationTests/WinformsMauiToolStripTests.cs
new file mode 100644
index 0000000000..a5b24650cd
--- /dev/null
+++ b/src/System.Windows.Forms/tests/IntegrationTests/System.Windows.Forms.Maui.IntegrationTests/WinformsMauiToolStripTests.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Windows.Forms.Maui.IntegrationTests
+{
+ ///
+ /// This class runs a maui executable, which contains one or more scenarios.
+ ///
+ /// We want to be able to represent each scenario as a seperate xUnit test, but it's not
+ /// possible to run them independently. The workaround is to have a MauiTestRunner execute all
+ /// the scenarios once and store the results, then feed the scenario names in as member data.
+ ///
+ /// However, MemberData is resolved before any constructors (even static) are called.
+ /// This means the scenario names will not be available yet.
+ ///
+ /// The solution to this is to inherit from MemberDataAttribute and execute custom code
+ /// (running the maui test) before returning the expected data. See MauiMemberDataAttribute.cs for more info.
+ ///
+ /// Also [Collection("Maui")] is used put all maui tests in the same collection, which makes them run sequentially
+ /// instead of in parallel. This is to migitate race conditions of multiple forms open at once.
+ ///
+ [Collection("Maui")]
+ public class WinformsMauiToolStripTests
+ {
+ private const string ProjectName = "MauiToolStripTests";
+
+ [Theory]
+ [MauiData(ProjectName)]
+ public void MauiToolStripTest(string scenarioName)
+ {
+ MauiTestHelper.ValidateScenarioPassed(ProjectName, scenarioName);
+ }
+ }
+}
diff --git a/src/System.Windows.Forms/tests/UnitTests/AccessibleObjects/PropertyGridViewRowsAccessibleObjectTests.cs b/src/System.Windows.Forms/tests/UnitTests/AccessibleObjects/PropertyGridViewRowsAccessibleObjectTests.cs
deleted file mode 100644
index f8549fac2f..0000000000
--- a/src/System.Windows.Forms/tests/UnitTests/AccessibleObjects/PropertyGridViewRowsAccessibleObjectTests.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Drawing;
-using System.Windows.Forms.PropertyGridInternal;
-using Xunit;
-
-namespace System.Windows.Forms.Tests.AccessibleObjects
-{
- public class PropertyGridViewRowsAccessibleObjectTests : IClassFixture
- {
- [WinFormsFact(Skip = "Suspect causing deadlocks, see: https://github.com/dotnet/winforms/issues/3095")]
- public void PropertyGridViewRowsAccessibleObject_Ctor_Default()
- {
- TestForm form = new TestForm();
- Application.Run(form);
-
- const int topBorder = 1;
- const int bottomBorder = 1;
- int entriesBorders = form.entriesBorders;
-
- Assert.True(form.AccRowHeightSum == form.AccPropertyGridViewHeight - topBorder - bottomBorder - entriesBorders);
- }
- }
-
- public class TestForm : Form
- {
- public int AccPropertyGridViewHeight { get; set; }
- public int AccRowHeightSum { get; set; }
-
- DomainUpDown domainUpDown;
- PropertyGrid propertyGrid;
-
- public int entriesBorders = 0;
-
- private void TestForm_Load(object sender, EventArgs e)
- {
- propertyGrid.SelectedObject = domainUpDown;
-
- GridEntryCollection entries = propertyGrid.GetPropEntries();
- PropertyGridView propertyGridView = (PropertyGridView)propertyGrid.ActiveControl;
-
- foreach (GridEntry entry in entries)
- {
- int entryHeight = propertyGridView.AccessibilityGetGridEntryBounds(entry).Height;
- AccRowHeightSum += entryHeight;
- if (entryHeight > 0)
- {
- entriesBorders++;
- }
-
- foreach (GridEntry item in entry.GridItems)
- {
- int itemHeight = propertyGridView.AccessibilityGetGridEntryBounds(item).Height;
- AccRowHeightSum += itemHeight;
- if (itemHeight > 0)
- {
- entriesBorders++;
- }
- }
- }
- AccPropertyGridViewHeight = propertyGridView.AccessibilityObject.Bounds.Height;
-
- Application.Exit();
- }
-
- public TestForm()
- {
- InitializeComponent();
- }
-
- private void InitializeComponent()
- {
- domainUpDown = new DomainUpDown();
- propertyGrid = new PropertyGrid();
- //
- // propertyGrid
- //
- propertyGrid.Size = new Size(223, 244);
- //
- // TestForm
- //
- ClientSize = new Size(508, 367);
- Controls.Add(propertyGrid);
- Controls.Add(domainUpDown);
- Load += TestForm_Load;
- }
- }
-}
diff --git a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/ToolStripDropDownTests.cs b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/ToolStripDropDownTests.cs
index d5fca3a881..931313f1dd 100644
--- a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/ToolStripDropDownTests.cs
+++ b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/ToolStripDropDownTests.cs
@@ -4912,51 +4912,6 @@ namespace System.Windows.Forms.Tests
Assert.Equal(expected, actual);
}
- [WinFormsFact(Skip = "Suspect causing deadlocks, see: https://github.com/dotnet/winforms/issues/3095")]
- public void ToolStripDropDown_KeyboardAccelerators_Test()
- {
- TestForm testForm = new TestForm();
- Application.Run(testForm); //it needs for correct work of ToolStripDropDown.CanProcessMnemonic method
-
- //TestResult property is made as separate for the reason that
- //when the Assert is inside FormLoaded method and it fails,
- //the Application doesn't exit and the process freezes.
- Assert.True(testForm.TestResult);
- }
-
- class TestForm : Form
- {
- private SubToolStripDropDown toolStrip;
- private bool _result = true;
-
- public TestForm()
- {
- toolStrip = new SubToolStripDropDown();
- Load += FormLoaded;
- }
-
- public bool TestResult => _result;
-
- private void FormLoaded(object sender, EventArgs e)
- {
- toolStrip.Enabled = true; // it needs for correct work of Control.CanProcessMnemonic method
- toolStrip.Visible = true; //
-
- _result &= !(toolStrip.ProcessDialogChar('F'));
-
- toolStrip.DisplayedItems.Add("&First item");
- toolStrip.DisplayedItems.Add("&Second item");
- toolStrip.DisplayedItems.Add("Third item");
- toolStrip.Visible = true; // it needs for correct work of Control.CanProcessMnemonic method
-
- _result &= toolStrip.ProcessDialogChar('F');
- _result &= toolStrip.ProcessDialogChar('S');
- _result &= !(toolStrip.ProcessDialogChar('T'));
-
- Application.Exit();
- }
- }
-
private class SubAxHost : AxHost
{
public SubAxHost(string clsid) : base(clsid)