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(); + foreach (var windowOutput in scanResults.WindowScanOutputs) + { + foreach (var error in windowOutput.Errors) + { + errors.Add(new + { + RuleId = error.Rule.ID, + Description = error.Rule.Description, + HowToFix = error.Rule.HowToFix, + Element = error.Element?.Properties != null + ? string.Join(", ", error.Element.Properties.Select(p => $"{p.Key}: {p.Value}")) + : null + }); + } + } + + var result = new + { + TestName = testName, + Timestamp = DateTime.UtcNow.ToString("o"), + ErrorCount = errors.Count, + Errors = errors + }; + + _snapshotResults[testName] = result; + System.Threading.Interlocked.Add(ref _totalSnapshotErrors, errors.Count); + Console.WriteLine($"[Snapshot] Recorded {errors.Count} error(s) for '{testName}'"); + } + + /// + /// Writes the accumulated snapshot to a single JSON file. + /// Call from [ClassCleanup]. + /// + public static string WriteSnapshotFile(string outputFileName = "AccessibilitySnapshot.json") + { + string baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", ".."); + string snapshotDir = Path.GetFullPath(baseDir); + + string filePath = Path.Combine(snapshotDir, outputFileName); + + var snapshot = new + { + GeneratedAt = DateTime.UtcNow.ToString("o"), + TotalTests = _snapshotResults.Count, + TotalErrors = _totalSnapshotErrors, + Results = _snapshotResults.Values.ToList() + }; + + string json = JsonConvert.SerializeObject(snapshot, Formatting.Indented); + File.WriteAllText(filePath, json); + + Console.WriteLine($"[Snapshot] Written to {filePath}"); + return filePath; + } + public static bool IsErrorPresent(ScanOutput scanResults) + { + bool isError = false; + foreach (var scanResult in scanResults.WindowScanOutputs) + { + foreach (var error in scanResult.Errors) + { + Console.WriteLine($"- {error.Rule.Description}"); + isError = true; + } + } + return isError; + } + + /// + /// Initializes the gallery window and scanner. Call from [ClassInitialize]. + /// + public static (AutomationElement window, IScanner scanner) InitializeGallerySession() + { + int processId = GetProcessId(); + var scanner = CreateScanner(processId); + var window = InitializeGalleryWindow(); + return (window, scanner); + } + + /// + /// Initializes and returns the gallery window only (no scanner). + /// Use when creating per-test scanners via CreateScannerForTest. + /// + public static AutomationElement InitializeGalleryWindow() + { + AutomationElement desktop = AutomationElement.RootElement; + + Condition windowCondition = new PropertyCondition( + AutomationElement.ControlTypeProperty, + ControlType.Window); + + Condition nameCondition = new PropertyCondition( + AutomationElement.NameProperty, + WindowName); + + Condition condition = new AndCondition(windowCondition, nameCondition); + + var window = desktop.FindFirst(TreeScope.Children, condition); + Assert.IsNotNull(window, $"Window '{WindowName}' was not found"); + + return window; + } + + /// + /// Finds an element by name and returns it. Fails the test if not found. + /// + public static AutomationElement FindElement(AutomationElement parent, string elementName) + { + Condition condition = new PropertyCondition(AutomationElement.NameProperty, elementName); + var element = parent.FindFirst(TreeScope.Subtree, condition); + Assert.IsNotNull(element, $"Element with name '{elementName}' was not found"); + + Console.WriteLine($"Found element: {element.Current.Name}"); + Console.WriteLine($"Control Type: {element.Current.ControlType.LocalizedControlType}"); + + return element; + } + + /// + /// Gets the parent element of the given element using TreeWalker. + /// + public static AutomationElement GetParentElement(AutomationElement element) + { + var walker = TreeWalker.ControlViewWalker; + var parent = walker.GetParent(element); + Assert.IsNotNull(parent, "Parent element was not found"); + + Console.WriteLine($"Parent element: {parent.Current.Name}"); + Console.WriteLine($"Parent Control Type: {parent.Current.ControlType.LocalizedControlType}"); + + return parent; + } + + /// + /// Finds an element by name and invokes it. Fails the test if element is not found or not invokable. + /// + public static void FindAndInvokeElement(AutomationElement parent, string elementName, int waitMs = 1000) + { + Condition condition = new PropertyCondition(AutomationElement.NameProperty, elementName); + var element = parent.FindFirst(TreeScope.Subtree, condition); + Assert.IsNotNull(element, $"Element with name '{elementName}' was not found"); + + Console.WriteLine($"Found element: {element.Current.Name}"); + Console.WriteLine($"Control Type: {element.Current.ControlType.LocalizedControlType}"); + + if (element.TryGetCurrentPattern(InvokePattern.Pattern, out object pattern)) + { + ((InvokePattern)pattern).Invoke(); + System.Threading.Thread.Sleep(waitMs); + } + else + { + Assert.Fail($"Invoke pattern not supported on '{elementName}' element"); + } + } + + /// + /// Finds an element by name and expands it. Fails the test if element is not found or doesn't support ExpandCollapse. + /// + public static void FindAndExpandElement(AutomationElement parent, string elementName, int waitMs = 1000) + { + Condition condition = new PropertyCondition(AutomationElement.NameProperty, elementName); + var element = parent.FindFirst(TreeScope.Subtree, condition); + Assert.IsNotNull(element, $"Element with name '{elementName}' was not found"); + + Console.WriteLine($"Found element: {element.Current.Name}"); + Console.WriteLine($"Control Type: {element.Current.ControlType.LocalizedControlType}"); + + if (element.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out object pattern)) + { + var expandCollapse = (ExpandCollapsePattern)pattern; + Console.WriteLine($"Current state: {expandCollapse.Current.ExpandCollapseState}"); + + if (expandCollapse.Current.ExpandCollapseState == ExpandCollapseState.Collapsed) + { + Console.WriteLine($"Expanding '{elementName}'..."); + expandCollapse.Expand(); + System.Threading.Thread.Sleep(waitMs); + Console.WriteLine($"New state: {expandCollapse.Current.ExpandCollapseState}"); + } + else + { + Console.WriteLine($"Element '{elementName}' is already expanded (state: {expandCollapse.Current.ExpandCollapseState})"); + } + } + else + { + Assert.Fail($"ExpandCollapse pattern not supported on '{elementName}' element"); + } + } + + /// + /// Finds an element by name and collapses it. Fails the test if element is not found or doesn't support ExpandCollapse. + /// + public static void FindAndCollapseElement(AutomationElement parent, string elementName, int waitMs = 1000) + { + Condition condition = new PropertyCondition(AutomationElement.NameProperty, elementName); + var element = parent.FindFirst(TreeScope.Subtree, condition); + Assert.IsNotNull(element, $"Element with name '{elementName}' was not found"); + + Console.WriteLine($"Found element: {element.Current.Name}"); + Console.WriteLine($"Control Type: {element.Current.ControlType.LocalizedControlType}"); + + if (element.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out object pattern)) + { + var expandCollapse = (ExpandCollapsePattern)pattern; + Console.WriteLine($"Current state: {expandCollapse.Current.ExpandCollapseState}"); + + if (expandCollapse.Current.ExpandCollapseState == ExpandCollapseState.Expanded) + { + Console.WriteLine($"Collapsing '{elementName}'..."); + expandCollapse.Collapse(); + System.Threading.Thread.Sleep(waitMs); + Console.WriteLine($"New state: {expandCollapse.Current.ExpandCollapseState}"); + } + else + { + Console.WriteLine($"Element '{elementName}' is already collapsed (state: {expandCollapse.Current.ExpandCollapseState})"); + } + } + else + { + Assert.Fail($"ExpandCollapse pattern not supported on '{elementName}' element"); + } + } + + /// + /// Common navigation: opens nav menu, clicks "All samples", then navigates to the specified component. + /// + public static void NavigateToComponent(AutomationElement galleryWindow, string componentName) + { + // Step 1: Open Navigation menu + FindAndInvokeElement(galleryWindow, "Navigation menu", waitMs: 2000); + + // Step 2: Click "All samples" + FindAndInvokeElement(galleryWindow, "All samples", waitMs: 2000); + + // Step 3: Navigate to the specific component + FindAndInvokeElement(galleryWindow, componentName); + } + } +} diff --git a/NewArch/windows/AccessibilityUnitTest/Properties/AssemblyInfo.cs b/NewArch/windows/AccessibilityUnitTest/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a2016f4a --- /dev/null +++ b/NewArch/windows/AccessibilityUnitTest/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("AccessibilityUnitTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AccessibilityUnitTest")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("4494014e-461b-45a6-bac5-91fcd1936fdc")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NewArch/windows/AccessibilityUnitTest/app.config b/NewArch/windows/AccessibilityUnitTest/app.config new file mode 100644 index 00000000..4f68486d --- /dev/null +++ b/NewArch/windows/AccessibilityUnitTest/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/NewArch/windows/AccessibilityUnitTest/packages.config b/NewArch/windows/AccessibilityUnitTest/packages.config new file mode 100644 index 00000000..4c697523 --- /dev/null +++ b/NewArch/windows/AccessibilityUnitTest/packages.config @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/NewArch/windows/NewArch.sln b/NewArch/windows/NewArch.sln index 6c94b9b7..293aeefc 100644 --- a/NewArch/windows/NewArch.sln +++ b/NewArch/windows/NewArch.sln @@ -5,68 +5,106 @@ VisualStudioVersion = 17.3.32929.385 MinimumVisualStudioVersion = 10.0.40219.1 Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "NewArch.Package", "NewArch.Package\NewArch.Package.wapproj", "{18851D30-3C62-41B9-8E0B-3EED85625239}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NewArch", "NewArch\NewArch.vcxproj", "{8481B8D7-6300-4DDF-9104-C7A4F1CAA241}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rngallery", "NewArch\NewArch.vcxproj", "{8481B8D7-6300-4DDF-9104-C7A4F1CAA241}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Clipboard", "..\node_modules\@react-native-clipboard\clipboard\windows\Clipboard\Clipboard.vcxproj", "{90BFF18B-474B-445D-9847-B065853288D8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AccessibilityUnitTest", "AccessibilityUnitTest\AccessibilityUnitTest.csproj", "{4494014E-461B-45A6-BAC5-91FCD1936FDC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Debug|ARM64 = Debug|ARM64 + Release|Any CPU = Release|Any CPU + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 - Release|ARM64 = Release|ARM64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|Any CPU.ActiveCfg = Debug|x64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|Any CPU.Build.0 = Debug|x64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|Any CPU.Deploy.0 = Debug|x64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|ARM64.Build.0 = Debug|ARM64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|ARM64.Deploy.0 = Debug|ARM64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|x64.ActiveCfg = Debug|x64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|x64.Build.0 = Debug|x64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|x64.Deploy.0 = Debug|x64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|x86.ActiveCfg = Debug|x86 {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|x86.Build.0 = Debug|x86 {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|x86.Deploy.0 = Debug|x86 - {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|ARM64.Build.0 = Debug|ARM64 - {18851D30-3C62-41B9-8E0B-3EED85625239}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|Any CPU.ActiveCfg = Release|x64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|Any CPU.Build.0 = Release|x64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|Any CPU.Deploy.0 = Release|x64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|ARM64.ActiveCfg = Release|ARM64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|ARM64.Build.0 = Release|ARM64 + {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|ARM64.Deploy.0 = Release|ARM64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|x64.ActiveCfg = Release|x64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|x64.Build.0 = Release|x64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|x64.Deploy.0 = Release|x64 {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|x86.ActiveCfg = Release|x86 {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|x86.Build.0 = Release|x86 {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|x86.Deploy.0 = Release|x86 - {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|ARM64.ActiveCfg = Release|ARM64 - {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|ARM64.Build.0 = Release|ARM64 - {18851D30-3C62-41B9-8E0B-3EED85625239}.Release|ARM64.Deploy.0 = Release|ARM64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|Any CPU.ActiveCfg = Debug|x64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|Any CPU.Build.0 = Debug|x64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|Any CPU.Deploy.0 = Debug|x64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|ARM64.Build.0 = Debug|ARM64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|ARM64.Deploy.0 = Debug|ARM64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|x64.ActiveCfg = Debug|x64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|x64.Build.0 = Debug|x64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|x64.Deploy.0 = Debug|x64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|x86.ActiveCfg = Debug|Win32 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|x86.Build.0 = Debug|Win32 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|x86.Deploy.0 = Debug|Win32 - {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|ARM64.Build.0 = Debug|ARM64 - {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|Any CPU.ActiveCfg = Release|x64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|Any CPU.Build.0 = Release|x64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|Any CPU.Deploy.0 = Release|x64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|ARM64.ActiveCfg = Release|ARM64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|ARM64.Build.0 = Release|ARM64 + {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|ARM64.Deploy.0 = Release|ARM64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|x64.ActiveCfg = Release|x64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|x64.Build.0 = Release|x64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|x64.Deploy.0 = Release|x64 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|x86.ActiveCfg = Release|Win32 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|x86.Build.0 = Release|Win32 {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|x86.Deploy.0 = Release|Win32 - {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|ARM64.ActiveCfg = Release|ARM64 - {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|ARM64.Build.0 = Release|ARM64 - {8481B8D7-6300-4DDF-9104-C7A4F1CAA241}.Release|ARM64.Deploy.0 = Release|ARM64 + {90BFF18B-474B-445D-9847-B065853288D8}.Debug|Any CPU.ActiveCfg = Debug|x64 + {90BFF18B-474B-445D-9847-B065853288D8}.Debug|Any CPU.Build.0 = Debug|x64 + {90BFF18B-474B-445D-9847-B065853288D8}.Debug|Any CPU.Deploy.0 = Debug|x64 + {90BFF18B-474B-445D-9847-B065853288D8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {90BFF18B-474B-445D-9847-B065853288D8}.Debug|ARM64.Build.0 = Debug|ARM64 {90BFF18B-474B-445D-9847-B065853288D8}.Debug|x64.ActiveCfg = Debug|x64 {90BFF18B-474B-445D-9847-B065853288D8}.Debug|x64.Build.0 = Debug|x64 {90BFF18B-474B-445D-9847-B065853288D8}.Debug|x86.ActiveCfg = Debug|Win32 {90BFF18B-474B-445D-9847-B065853288D8}.Debug|x86.Build.0 = Debug|Win32 - {90BFF18B-474B-445D-9847-B065853288D8}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {90BFF18B-474B-445D-9847-B065853288D8}.Debug|ARM64.Build.0 = Debug|ARM64 + {90BFF18B-474B-445D-9847-B065853288D8}.Release|Any CPU.ActiveCfg = Release|x64 + {90BFF18B-474B-445D-9847-B065853288D8}.Release|Any CPU.Build.0 = Release|x64 + {90BFF18B-474B-445D-9847-B065853288D8}.Release|Any CPU.Deploy.0 = Release|x64 + {90BFF18B-474B-445D-9847-B065853288D8}.Release|ARM64.ActiveCfg = Release|ARM64 + {90BFF18B-474B-445D-9847-B065853288D8}.Release|ARM64.Build.0 = Release|ARM64 {90BFF18B-474B-445D-9847-B065853288D8}.Release|x64.ActiveCfg = Release|x64 {90BFF18B-474B-445D-9847-B065853288D8}.Release|x64.Build.0 = Release|x64 {90BFF18B-474B-445D-9847-B065853288D8}.Release|x86.ActiveCfg = Release|Win32 {90BFF18B-474B-445D-9847-B065853288D8}.Release|x86.Build.0 = Release|Win32 - {90BFF18B-474B-445D-9847-B065853288D8}.Release|ARM64.ActiveCfg = Release|ARM64 - {90BFF18B-474B-445D-9847-B065853288D8}.Release|ARM64.Build.0 = Release|ARM64 + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|ARM64.Build.0 = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|x64.ActiveCfg = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|x64.Build.0 = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Debug|x86.Build.0 = Debug|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|Any CPU.Build.0 = Release|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|ARM64.ActiveCfg = Release|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|ARM64.Build.0 = Release|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|x64.ActiveCfg = Release|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|x64.Build.0 = Release|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|x86.ActiveCfg = Release|Any CPU + {4494014E-461B-45A6-BAC5-91FCD1936FDC}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE