diff --git a/NewArch/windows/.gitignore b/NewArch/windows/.gitignore
index 0fd0acfc..a585dd22 100644
--- a/NewArch/windows/.gitignore
+++ b/NewArch/windows/.gitignore
@@ -44,3 +44,6 @@ Ankh.NoLoad
*.binlog
*.err
*.wrn
+
+# Accessibility scan results
+AccessibilityUnitTest/ScanResults/
diff --git a/NewArch/windows/AccessibilityUnitTest/AccessibilitySnapshot.json b/NewArch/windows/AccessibilityUnitTest/AccessibilitySnapshot.json
new file mode 100644
index 00000000..b0b7646b
--- /dev/null
+++ b/NewArch/windows/AccessibilityUnitTest/AccessibilitySnapshot.json
@@ -0,0 +1,231 @@
+{
+ "GeneratedAt": "2026-03-03T08:25:57.0265524Z",
+ "TotalTests": 17,
+ "TotalErrors": 19,
+ "Results": [
+ {
+ "TestName": "TestNavigateToClipboardAndValidate",
+ "Timestamp": "2026-03-03T08:24:27.9416080Z",
+ "ErrorCount": 1,
+ "Errors": [
+ {
+ "RuleId": 2,
+ "Description": "An on-screen element must not have a null BoundingRectangle property.",
+ "HowToFix": "If the element is off-screen, set its IsOffscreen property to true.\r\nIf the element is on-screen, provide a BoundingRectangle property.",
+ "Element": "RuntimeId: [2A,4307F8,4,8F2], ProcessId: 18536, ControlType: Text(50020), LocalizedControlType: text, HasKeyboardFocus: False, IsKeyboardFocusable: False, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=0,h=0]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToTouchableWithoutFeedbackAndValidate",
+ "Timestamp": "2026-03-03T08:25:36.1025473Z",
+ "ErrorCount": 2,
+ "Errors": [
+ {
+ "RuleId": 11,
+ "Description": "A button must support one of these patterns: Invoke, Toggle, or ExpandCollapse.",
+ "HowToFix": "Modify the button to support exactly one of the following patterns:\r\n · Support the Invoke pattern if the button performs a command at the request of the user.\r\n · Support the Toggle pattern if the button can cycle through a series of up to three states.\r\n · Support the ExpandCollapse pattern if the button shows or hides additional content.",
+ "Element": "RuntimeId: [2A,4307F8,4,514C], BoundingRectangle: [l=475,t=1996,r=535,b=2070], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Decrease counter. Current value is 0, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, HelpText: Decreases the counter by 1, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=40,h=49]"
+ },
+ {
+ "RuleId": 11,
+ "Description": "A button must support one of these patterns: Invoke, Toggle, or ExpandCollapse.",
+ "HowToFix": "Modify the button to support exactly one of the following patterns:\r\n · Support the Invoke pattern if the button performs a command at the request of the user.\r\n · Support the Toggle pattern if the button can cycle through a series of up to three states.\r\n · Support the ExpandCollapse pattern if the button shows or hides additional content.",
+ "Element": "RuntimeId: [2A,4307F8,4,5154], BoundingRectangle: [l=640,t=1996,r=700,b=2070], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Increase counter. Current value is 0, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, HelpText: Increases the counter by 1, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=40,h=49]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToTextAndValidate",
+ "Timestamp": "2026-03-03T08:25:14.0342097Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestNavigateToButtonAndValidate",
+ "Timestamp": "2026-03-03T08:24:22.3840024Z",
+ "ErrorCount": 6,
+ "Errors": [
+ {
+ "RuleId": 123,
+ "Description": "The Name property must not include the element's control type.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the control type.",
+ "Element": "RuntimeId: [2A,4307F8,4,4AE], BoundingRectangle: [l=509,t=416,r=667,b=471], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Simple Button, HasKeyboardFocus: True, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=105,h=36]"
+ },
+ {
+ "RuleId": 124,
+ "Description": "The Name must not include the same text as the LocalizedControlType.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the same text as the element's LocalizedControlType property.",
+ "Element": "RuntimeId: [2A,4307F8,4,4AE], BoundingRectangle: [l=509,t=416,r=667,b=471], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Simple Button, HasKeyboardFocus: True, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=105,h=36]"
+ },
+ {
+ "RuleId": 123,
+ "Description": "The Name property must not include the element's control type.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the control type.",
+ "Element": "RuntimeId: [2A,4307F8,4,4E8], BoundingRectangle: [l=504,t=697,r=672,b=753], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: colored button, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=112,h=37]"
+ },
+ {
+ "RuleId": 124,
+ "Description": "The Name must not include the same text as the LocalizedControlType.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the same text as the element's LocalizedControlType property.",
+ "Element": "RuntimeId: [2A,4307F8,4,4E8], BoundingRectangle: [l=504,t=697,r=672,b=753], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: colored button, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=112,h=37]"
+ },
+ {
+ "RuleId": 123,
+ "Description": "The Name property must not include the element's control type.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the control type.",
+ "Element": "RuntimeId: [2A,4307F8,4,522], BoundingRectangle: [l=500,t=1002,r=674,b=1057], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Disabled Button, HasKeyboardFocus: False, IsKeyboardFocusable: False, IsEnabled: False, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=116,h=36]"
+ },
+ {
+ "RuleId": 124,
+ "Description": "The Name must not include the same text as the LocalizedControlType.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the same text as the element's LocalizedControlType property.",
+ "Element": "RuntimeId: [2A,4307F8,4,522], BoundingRectangle: [l=500,t=1002,r=674,b=1057], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Disabled Button, HasKeyboardFocus: False, IsKeyboardFocusable: False, IsEnabled: False, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=116,h=36]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToScrollViewAndValidate",
+ "Timestamp": "2026-03-03T08:24:59.6416377Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestNavigateToImageAndValidate",
+ "Timestamp": "2026-03-03T08:24:42.8550624Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestNavigateToFlatListAndValidate",
+ "Timestamp": "2026-03-03T08:24:33.7802623Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestNavigateToTouchableOpacityAndValidate",
+ "Timestamp": "2026-03-03T08:25:30.5504677Z",
+ "ErrorCount": 2,
+ "Errors": [
+ {
+ "RuleId": 11,
+ "Description": "A button must support one of these patterns: Invoke, Toggle, or ExpandCollapse.",
+ "HowToFix": "Modify the button to support exactly one of the following patterns:\r\n · Support the Invoke pattern if the button performs a command at the request of the user.\r\n · Support the Toggle pattern if the button can cycle through a series of up to three states.\r\n · Support the ExpandCollapse pattern if the button shows or hides additional content.",
+ "Element": "RuntimeId: [2A,4307F8,4,4A00], BoundingRectangle: [l=445,t=2255,r=520,b=2315], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Decrease counter. Current value is 0, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, HelpText: Decreases the counter by 1, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=50,h=40]"
+ },
+ {
+ "RuleId": 11,
+ "Description": "A button must support one of these patterns: Invoke, Toggle, or ExpandCollapse.",
+ "HowToFix": "Modify the button to support exactly one of the following patterns:\r\n · Support the Invoke pattern if the button performs a command at the request of the user.\r\n · Support the Toggle pattern if the button can cycle through a series of up to three states.\r\n · Support the ExpandCollapse pattern if the button shows or hides additional content.",
+ "Element": "RuntimeId: [2A,4307F8,4,4A0A], BoundingRectangle: [l=655,t=2255,r=730,b=2315], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Increase counter. Current value is 0, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, HelpText: Increases the counter by 1, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=50,h=40]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToSettingsAndValidate",
+ "Timestamp": "2026-03-03T08:25:02.9307945Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestZNavigation",
+ "Timestamp": "2026-03-03T08:25:57.0205562Z",
+ "ErrorCount": 2,
+ "Errors": [
+ {
+ "RuleId": 123,
+ "Description": "The Name property must not include the element's control type.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the control type.",
+ "Element": "RuntimeId: [2A,4307F8,4,613C], BoundingRectangle: [l=73,t=-310,r=580,b=-259], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Button, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=338,h=34]"
+ },
+ {
+ "RuleId": 124,
+ "Description": "The Name must not include the same text as the LocalizedControlType.",
+ "HowToFix": "Provide a UI Automation Name property for the element that:\r\n · Concisely identifies the element, AND\r\n · Does not include the same text as the element's LocalizedControlType property.",
+ "Element": "RuntimeId: [2A,4307F8,4,613C], BoundingRectangle: [l=73,t=-310,r=580,b=-259], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Button, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=338,h=34]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToViewAndValidate",
+ "Timestamp": "2026-03-03T08:25:41.7454320Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestNavigateToPressableAndValidate",
+ "Timestamp": "2026-03-03T08:24:54.0434814Z",
+ "ErrorCount": 1,
+ "Errors": [
+ {
+ "RuleId": 11,
+ "Description": "A button must support one of these patterns: Invoke, Toggle, or ExpandCollapse.",
+ "HowToFix": "Modify the button to support exactly one of the following patterns:\r\n · Support the Invoke pattern if the button performs a command at the request of the user.\r\n · Support the Toggle pattern if the button can cycle through a series of up to three states.\r\n · Support the ExpandCollapse pattern if the button shows or hides additional content.",
+ "Element": "RuntimeId: [2A,4307F8,4,248C], BoundingRectangle: [l=483,t=717,r=693,b=792], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: Disabled Pressable, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: False, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=140,h=50]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToTouchableHighlightAndValidate",
+ "Timestamp": "2026-03-03T08:25:24.9314949Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestNavigateToTextInputAndValidate",
+ "Timestamp": "2026-03-03T08:25:19.5189124Z",
+ "ErrorCount": 0,
+ "Errors": []
+ },
+ {
+ "TestName": "TestNavigateToSwitchAndValidate",
+ "Timestamp": "2026-03-03T08:25:08.4692285Z",
+ "ErrorCount": 3,
+ "Errors": [
+ {
+ "RuleId": 2,
+ "Description": "An on-screen element must not have a null BoundingRectangle property.",
+ "HowToFix": "If the element is off-screen, set its IsOffscreen property to true.\r\nIf the element is on-screen, provide a BoundingRectangle property.",
+ "Element": "RuntimeId: [2A,4307F8,4,3396], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: simple switch example, HasKeyboardFocus: True, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, TogglePattern.ToggleState: 0, LogicalSize: [w=0,h=0]"
+ },
+ {
+ "RuleId": 2,
+ "Description": "An on-screen element must not have a null BoundingRectangle property.",
+ "HowToFix": "If the element is off-screen, set its IsOffscreen property to true.\r\nIf the element is on-screen, provide a BoundingRectangle property.",
+ "Element": "RuntimeId: [2A,4307F8,4,33B4], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: disabled switch example, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, TogglePattern.ToggleState: 0, LogicalSize: [w=0,h=0]"
+ },
+ {
+ "RuleId": 2,
+ "Description": "An on-screen element must not have a null BoundingRectangle property.",
+ "HowToFix": "If the element is off-screen, set its IsOffscreen property to true.\r\nIf the element is on-screen, provide a BoundingRectangle property.",
+ "Element": "RuntimeId: [2A,4307F8,4,33D2], ProcessId: 18536, ControlType: Button(50000), LocalizedControlType: button, Name: colorful switch example, HasKeyboardFocus: False, IsKeyboardFocusable: True, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, TogglePattern.ToggleState: 0, LogicalSize: [w=0,h=0]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToModalAndValidate",
+ "Timestamp": "2026-03-03T08:24:48.4552345Z",
+ "ErrorCount": 2,
+ "Errors": [
+ {
+ "RuleId": 2,
+ "Description": "An on-screen element must not have a null BoundingRectangle property.",
+ "HowToFix": "If the element is off-screen, set its IsOffscreen property to true.\r\nIf the element is on-screen, provide a BoundingRectangle property.",
+ "Element": "RuntimeId: [2A,4307F8,4,1E9A], ProcessId: 18536, ControlType: Text(50020), LocalizedControlType: text, Name: , HasKeyboardFocus: False, IsKeyboardFocusable: False, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=0,h=0]"
+ },
+ {
+ "RuleId": 133,
+ "Description": "The Name property must not contain only whitespace.",
+ "HowToFix": "Provide a UI Automation Name property that concisely identifies the element.",
+ "Element": "RuntimeId: [2A,4307F8,4,1E9A], ProcessId: 18536, ControlType: Text(50020), LocalizedControlType: text, Name: , HasKeyboardFocus: False, IsKeyboardFocusable: False, IsEnabled: True, Culture: 0, IsControlElement: True, IsContentElement: True, IsPassword: False, NativeWindowHandle: 0, IsOffscreen: False, Orientation: None(0), IsRequiredForForm: False, IsDataValidForForm: False, ProviderDescription: [pid:18536,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:Microsoft.ReactNative.dll)], OptimizeForVisualContent: False, LiveSetting: 0, IsPeripheral: False, FillType: 0, VisualEffects: 0, HeadingLevel: HeadingLevel_None (80050), IsDialog: False, LogicalSize: [w=0,h=0]"
+ }
+ ]
+ },
+ {
+ "TestName": "TestNavigateToHomeAndValidate",
+ "Timestamp": "2026-03-03T08:24:37.3853733Z",
+ "ErrorCount": 0,
+ "Errors": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/NewArch/windows/AccessibilityUnitTest/AccessibilityTests.cs b/NewArch/windows/AccessibilityUnitTest/AccessibilityTests.cs
new file mode 100644
index 00000000..59e6fc4c
--- /dev/null
+++ b/NewArch/windows/AccessibilityUnitTest/AccessibilityTests.cs
@@ -0,0 +1,189 @@
+using AccessibilityUnitTest;
+using Axe.Windows.Automation;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using System.Windows.Automation;
+
+namespace AccessibilityUnitTest
+{
+ [TestClass]
+ public class AccessibilityTests : GallerySession
+ {
+ private static AutomationElement GalleryWindow;
+ private static int processId;
+
+ public TestContext TestContext { get; set; }
+
+ ///
+ /// Creates a scanner whose output file is named after the current test.
+ ///
+ private IScanner GetTestScanner()
+ {
+ return CreateScannerForTest(processId, TestContext.TestName);
+ }
+
+ [TestMethod]
+ public void TestZNavigation()
+ {
+ // Navigate home first to reset UI state when running after other tests
+ FindAndInvokeElement(GalleryWindow, "Navigation menu", waitMs: 2000);
+ FindAndInvokeElement(GalleryWindow, "Home", waitMs: 1000);
+ FindAndInvokeElement(GalleryWindow, "Navigation menu", waitMs: 2000);
+ var navMenu = FindElement(GalleryWindow, "Navigation menu");
+ var parent = GetParentElement(navMenu);
+ FindAndExpandElement(GalleryWindow, "Basic Input");
+ FindAndExpandElement(GalleryWindow, "Collections");
+ FindAndExpandElement(GalleryWindow, "Dialogs & flyouts");
+ FindAndExpandElement(GalleryWindow, "Layout");
+ FindAndExpandElement(GalleryWindow, "Media");
+ FindAndExpandElement(GalleryWindow, "Scrolling");
+ FindAndExpandElement(GalleryWindow, "Text");
+ FindAndExpandElement(GalleryWindow, "System");
+ FindAndExpandElement(GalleryWindow, "Legacy");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner(), parent));
+ }
+
+ [TestMethod]
+ public void TestNavigateToHomeAndValidate()
+ {
+ FindAndInvokeElement(GalleryWindow, "Navigation menu", waitMs: 2000);
+ FindAndInvokeElement(GalleryWindow, "Home");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToSettingsAndValidate()
+ {
+ FindAndInvokeElement(GalleryWindow, "Navigation menu", waitMs: 2000);
+ FindAndInvokeElement(GalleryWindow, "Settings");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToButtonAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "Button1 control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToPressableAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "Pressable control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToSwitchAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "Switch control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToFlatListAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "FlatList control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ // [TestMethod]
+ // public void TestNavigateToVirtualizedListAndValidate()
+ // {
+ // NavigateToComponent(GalleryWindow, "VirtualizedList control");
+ // AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ // }
+
+ [TestMethod]
+ public void TestNavigateToModalAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "Modal control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToViewAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "View control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToImageAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "Image control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToScrollViewAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "ScrollView control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToTextAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "Text control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToTextInputAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "TextInput control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToClipboardAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "Clipboard control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToTouchableHighlightAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "TouchableHighlight control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToTouchableOpacityAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "TouchableOpacity control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [TestMethod]
+ public void TestNavigateToTouchableWithoutFeedbackAndValidate()
+ {
+ NavigateToComponent(GalleryWindow, "TouchableWithoutFeedback control");
+ AddTestSnapshot(TestContext.TestName, GetScanResults(GetTestScanner()));
+ }
+
+ [ClassInitialize]
+ public static void ClassInitialize(TestContext context)
+ {
+ try
+ {
+ processId = GetProcessId();
+ GalleryWindow = InitializeGalleryWindow();
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"Error during initialization: {ex.Message}");
+ throw;
+ }
+ }
+
+ [ClassCleanup]
+ public static void ClassCleanup()
+ {
+ string snapshotPath = WriteSnapshotFile();
+ Console.WriteLine($"Snapshot saved to: {snapshotPath}");
+ }
+ }
+}
diff --git a/NewArch/windows/AccessibilityUnitTest/AccessibilityUnitTest.csproj b/NewArch/windows/AccessibilityUnitTest/AccessibilityUnitTest.csproj
new file mode 100644
index 00000000..9f2af866
--- /dev/null
+++ b/NewArch/windows/AccessibilityUnitTest/AccessibilityUnitTest.csproj
@@ -0,0 +1,124 @@
+
+
+
+
+
+ Debug
+ AnyCPU
+ {4494014E-461B-45A6-BAC5-91FCD1936FDC}
+ Library
+ Properties
+ AccessibilityUnitTest
+ AccessibilityUnitTest
+ v4.8.1
+ 512
+ {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 15.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+ $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
+ False
+ UnitTest
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.Actions.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.Automation.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.Core.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.Desktop.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.Rules.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.RuleSelection.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.SystemAbstractions.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.Telemetry.dll
+
+
+ ..\packages\Axe.Windows.2.4.2\lib\netstandard20\Axe.Windows.Win32.dll
+
+
+ ..\packages\Interop.UIAutomationClient.10.19041.0\lib\net45\Interop.UIAutomationClient.dll
+ False
+
+
+ ..\packages\MSTest.TestFramework.2.2.10\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll
+
+
+ ..\packages\MSTest.TestFramework.2.2.10\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll
+
+
+ ..\packages\Microsoft.Win32.Registry.5.0.0\lib\net461\Microsoft.Win32.Registry.dll
+
+
+ ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll
+
+
+
+
+ ..\packages\System.Drawing.Common.8.0.10\lib\net462\System.Drawing.Common.dll
+
+
+ ..\packages\System.IO.Packaging.8.0.1\lib\net462\System.IO.Packaging.dll
+
+
+ ..\packages\System.Security.AccessControl.5.0.0\lib\net461\System.Security.AccessControl.dll
+
+
+ ..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/NewArch/windows/AccessibilityUnitTest/GallerySession.cs b/NewArch/windows/AccessibilityUnitTest/GallerySession.cs
new file mode 100644
index 00000000..55142137
--- /dev/null
+++ b/NewArch/windows/AccessibilityUnitTest/GallerySession.cs
@@ -0,0 +1,334 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows.Automation;
+using Axe.Windows.Automation;
+using Axe.Windows.Automation.Data;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Newtonsoft.Json;
+
+namespace AccessibilityUnitTest
+{
+ public class GallerySession
+ {
+ private const string ApplicationProcessName = "rngallery";
+ private const string WindowName = "React Native Gallery";
+
+ // Snapshot: accumulates per-test scan results
+ private static readonly ConcurrentDictionary _snapshotResults =
+ new ConcurrentDictionary();
+ private static int _totalSnapshotErrors = 0;
+
+ public static int GetProcessId()
+ {
+ //Code to get the Process ID from the process name
+ var processes = System.Diagnostics.Process.GetProcessesByName(ApplicationProcessName);
+ return processes[0].Id;
+ }
+
+ public static IScanner CreateScanner(int processId, string outputDirectory = null)
+ {
+ Console.WriteLine("Creating scanner...");
+ var configBuilder = Config.Builder.ForProcessId(processId)
+ .WithOutputFileFormat(OutputFileFormat.A11yTest);
+
+ if (!string.IsNullOrEmpty(outputDirectory))
+ {
+ Directory.CreateDirectory(outputDirectory);
+ configBuilder.WithOutputDirectory(outputDirectory);
+ }
+
+ var config = configBuilder.Build();
+ var scanner = ScannerFactory.CreateScanner(config);
+ return scanner;
+ }
+
+ ///
+ /// Creates a scanner whose output file goes into a folder named after the test.
+ ///
+ public static IScanner CreateScannerForTest(int processId, string testName)
+ {
+ string baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "ScanResults");
+ string testOutputDir = Path.GetFullPath(Path.Combine(baseDir, testName));
+ Console.WriteLine($"Scan output directory: {testOutputDir}");
+ return CreateScanner(processId, testOutputDir);
+ }
+
+ public static ScanOutput GetScanResults(IScanner scanner)
+ {
+ Console.WriteLine("Scanning...");
+ var scanResults = scanner.Scan(null);
+ return scanResults;
+ }
+
+ ///
+ /// Scans a specific element's subtree using its AutomationId.
+ /// Falls back to a full scan if the element has no AutomationId.
+ ///
+ public static ScanOutput GetScanResults(IScanner scanner, AutomationElement element)
+ {
+ Console.WriteLine($"Scanning element: {element.Current.Name} (Control Type: {element.Current.ControlType.LocalizedControlType})...");
+
+ string automationId = element.Current.AutomationId;
+ if (string.IsNullOrEmpty(automationId))
+ {
+ Console.WriteLine("Element has no AutomationId — performing full scan instead.");
+ return scanner.Scan(null);
+ }
+
+ var scanOptions = new ScanOptions(automationId);
+ var scanResults = scanner.Scan(scanOptions);
+ return scanResults;
+ }
+
+ ///
+ /// Adds the scan results for a test to the in-memory snapshot.
+ /// Call this from each test instead of PrintScanResults.
+ ///
+ public static void AddTestSnapshot(string testName, ScanOutput scanResults)
+ {
+ var errors = new List