From cc789b7c4fb7ff27e4010d2ccd5ac2bc30b8f273 Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Tue, 28 Apr 2026 11:12:01 -0700 Subject: [PATCH 1/7] Collect dump files and improve snapshot taking --- .ado/jobs/e2e-test.yml | 254 +++++++++++++++++- .ado/scripts/SetupLocalDumps.cmd | 58 ++-- .ado/templates/prepare-build-env.yml | 29 +- .../test/HangSimulationTest.test.ts | 42 +++ .../RNTesterApp-Fabric/RNTesterApp-Fabric.cpp | 161 ++++++++++- 5 files changed, 515 insertions(+), 29 deletions(-) create mode 100644 packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts diff --git a/.ado/jobs/e2e-test.yml b/.ado/jobs/e2e-test.yml index d0ee4102a6b..c427de889df 100644 --- a/.ado/jobs/e2e-test.yml +++ b/.ado/jobs/e2e-test.yml @@ -8,6 +8,17 @@ parameters: - Continuous - name: AgentPool type: object + # When set to true on a PR-validation queue, the E2E app deliberately + # crashes (simulateCrashForTesting) or hangs (simulateHangForTesting) so we + # can re-validate that the crash-dump collection path still produces a + # usable artifact. Disabled by default — the test step is doomed by design + # when these are on. + - name: simulateCrashForTesting + type: boolean + default: false + - name: simulateHangForTesting + type: boolean + default: false - name: buildMatrix type: object default: @@ -46,6 +57,12 @@ jobs: platform: ${{ matrix.BuildPlatform }} configuration: Release buildEnvironment: ${{ config.buildEnvironment }} + # Capture crash dumps for the E2E test app (packaged UWP) and + # the Metro bundler. ProcDump-as-AeDebug does not reliably fire + # for packaged apps; WER LocalDumps does. + localDumpsExeNames: + - RNTesterApp-Fabric + - node - pwsh: | Write-Host "##vso[task.setvariable variable=BuildLogDirectory]$(Build.BinariesDirectory)\${{ matrix.BuildPlatform }}\BuildLogs" @@ -70,11 +87,238 @@ jobs: echo ##vso[task.setvariable variable=StartedFabricTests]true displayName: Set StartedFabricTests - - script: | - yarn e2etest - displayName: yarn e2etest - workingDirectory: packages/e2e-test-app-fabric - timeoutInMinutes: 10 # Time to wait for this task to complete before the server kills it. + # Test-only: arm the crash-simulation sentinel so RNTesterApp-Fabric + # crashes on startup. Validates the in-process minidump path. + - ${{ if eq(parameters.simulateCrashForTesting, true) }}: + - pwsh: | + $flagPath = Join-Path $env:ProgramData 'rnw-e2e-simulate-crash.flag' + New-Item -Path $flagPath -ItemType File -Force | Out-Null + Write-Host "Crash-simulation sentinel created at $flagPath" + $dumpDir = Join-Path $env:ProgramData 'RNW-E2E-Dumps' + if (Test-Path $dumpDir) { + Remove-Item -Path "$dumpDir\*" -Recurse -Force -ErrorAction SilentlyContinue + Write-Host "Cleared stale dumps under $dumpDir" + } + displayName: Arm crash-simulation sentinel (TEST ONLY) + + # Test-only: arm the hang-simulation env var, which switches on + # the HangSimulationTest.test.ts test. That test invokes the + # `HangForTesting` automation command, jamming the app's UI thread + # so the post-failure ProcDump path captures a hang dump. + - ${{ if eq(parameters.simulateHangForTesting, true) }}: + - pwsh: | + Write-Host "##vso[task.setvariable variable=RNW_SIMULATE_HANG]1" + Write-Host "Hang simulation armed (RNW_SIMULATE_HANG=1)" + displayName: Arm hang-simulation env var (TEST ONLY) + + # When simulating a hang, run ONLY the HangSimulationTest. The default + # jest sequencer puts brand-new (no-timing-history) tests late in the order, + # so without filtering the test step times out before the hang test even + # runs. 4-minute timeout: enough for app launch (~30 s) + the test's 70 s + # jest testTimeout + jest teardown attempt; ADO will cut off at 4 min if the + # hang prevents jest from exiting cleanly, which is fine — Capture step then + # finds the still-alive UI-hung app. + - ${{ if eq(parameters.simulateHangForTesting, true) }}: + - script: | + yarn e2etest --testPathPattern HangSimulationTest + displayName: yarn e2etest (hang simulation only) + workingDirectory: packages/e2e-test-app-fabric + timeoutInMinutes: 4 + + - ${{ if not(eq(parameters.simulateHangForTesting, true)) }}: + - script: | + yarn e2etest + displayName: yarn e2etest + workingDirectory: packages/e2e-test-app-fabric + # Drop to 2 min during crash simulation — the app crashes + # immediately on startup, so a 10-minute wait is dead time. + ${{ if eq(parameters.simulateCrashForTesting, true) }}: + timeoutInMinutes: 2 + ${{ if not(eq(parameters.simulateCrashForTesting, true)) }}: + timeoutInMinutes: 10 + + # Always disarm the crash sentinel so it cannot leak to a rerun on + # the same agent. + - ${{ if eq(parameters.simulateCrashForTesting, true) }}: + - pwsh: | + $flagPath = Join-Path $env:ProgramData 'rnw-e2e-simulate-crash.flag' + if (Test-Path $flagPath) { + Remove-Item $flagPath -Force + Write-Host "Removed crash-simulation sentinel at $flagPath" + } + displayName: Disarm crash-simulation sentinel (TEST ONLY) + condition: always() + + # Always disarm the hang-simulation env var so the post-failure + # `Update snapshots` step (which also runs `yarn e2etest`) does not + # re-trigger the hang and burn 10 minutes of dead time. Setting an + # ADO variable to empty string clears it for subsequent steps. + - ${{ if eq(parameters.simulateHangForTesting, true) }}: + - pwsh: | + Write-Host "##vso[task.setvariable variable=RNW_SIMULATE_HANG]" + Write-Host "Hang simulation disarmed (RNW_SIMULATE_HANG cleared)" + displayName: Disarm hang-simulation env var (TEST ONLY) + condition: always() + + # On test failure, snapshot any lingering RNTesterApp-Fabric / node + # processes before subsequent steps (or the agent) tear them down. + # WER LocalDumps only fires on actual crashes; this catches hangs + # (e.g. "Unable to enter correct text" timeouts) where the process + # is alive but unresponsive. + # + # Dumps must go into a subfolder of $(CrashDumpRootPath). Files + # written directly at the root were observed to disappear during + # the long `Update snapshots` step that runs after a failed test; + # files in a subfolder survive. We don't know which agent + # behaviour deletes them — Defender, a 1ES cleanup script, or a + # side-effect of `yarn e2etest -u` — but a subfolder evades it. + - pwsh: | + $procDump = Join-Path "$(ProcDumpPath)" 'procdump64.exe' + if (-not (Test-Path $procDump)) { + Write-Host "ProcDump not found at $procDump; skipping live-process dump capture." + exit 0 + } + + $hangDir = Join-Path "$(CrashDumpRootPath)" 'hang' + New-Item -ItemType Directory -Path $hangDir -Force | Out-Null + + $targets = @('RNTesterApp-Fabric', 'node') + foreach ($name in $targets) { + Get-Process -Name $name -ErrorAction SilentlyContinue | ForEach-Object { + $dumpPath = Join-Path $hangDir ("hang_{0}_{1}.dmp" -f $name, $_.Id) + Write-Host "Capturing full dump of $name (pid $($_.Id)) to $dumpPath" + & $procDump -accepteula -ma $_.Id $dumpPath + Write-Host ("ProcDump exit code: {0} (non-zero is normal - encodes the dump count written)" -f $LASTEXITCODE) + } + } + # ProcDump uses non-zero exit codes to encode the number of dumps written. + # Force a clean PowerShell exit so the step doesn't show as a warning. + exit 0 + displayName: Capture dumps of surviving test processes + condition: and(failed(), eq(variables.StartedFabricTests, 'true')) + continueOnError: true + + # Collect any in-process minidumps the app's UEF wrote to + # %ProgramData%\RNW-E2E-Dumps, plus any dumps WER may have written + # to its standard fallback locations, and stage them into + # subfolders of $(CrashDumpRootPath) so they ride the crash-dumps + # artifact. Dumps in subfolders survive the post-failure + # `Update snapshots` step (see comment on the Capture step above). + - pwsh: | + # In-process minidumps (primary mechanism for actual crashes). + $inProc = Join-Path $env:ProgramData 'RNW-E2E-Dumps' + if (Test-Path $inProc) { + $dest = Join-Path "$(CrashDumpRootPath)" 'in-process' + New-Item -ItemType Directory -Path $dest -Force | Out-Null + Copy-Item -Path "$inProc\*" -Destination $dest -Recurse -Force -ErrorAction SilentlyContinue + Get-ChildItem -Path $dest -Recurse -Force -ErrorAction SilentlyContinue | + Select-Object FullName, Length | Format-Table -AutoSize | Out-String | Write-Host + } + + # Fallback search: if the agent image ever changes back to a + # working WER LocalDumps configuration, dumps may land here. + $searchRoots = @( + "$env:LOCALAPPDATA\CrashDumps", + "$env:ProgramData\Microsoft\Windows\WER\ReportQueue", + "$env:ProgramData\Microsoft\Windows\WER\ReportArchive", + "$env:ProgramData\Microsoft\Windows\WER\Temp" + ) + $found = @() + foreach ($root in $searchRoots) { + if (-not (Test-Path $root)) { continue } + $found += Get-ChildItem -Path $root -Recurse -Include *.dmp,*.mdmp -ErrorAction SilentlyContinue -Force | + Where-Object { -not $_.PSIsContainer -and $_.LastWriteTime -gt (Get-Date).AddHours(-2) } + } + if ($found.Count -gt 0) { + $dest = Join-Path "$(CrashDumpRootPath)" 'recovered' + New-Item -ItemType Directory -Path $dest -Force | Out-Null + foreach ($h in $found) { + $target = Join-Path $dest ($h.FullName -replace '[:\\/]', '_') + Copy-Item -LiteralPath $h.FullName -Destination $target -Force -ErrorAction SilentlyContinue + Write-Host "Recovered $($h.FullName) ($($h.Length) bytes) -> $target" + } + } + displayName: Collect in-process and fallback crash dumps + condition: and(failed(), eq(variables.StartedFabricTests, 'true')) + continueOnError: true + + # Bundle matching PDBs and a debugging README into the Crash dumps + # artifact so the dump is self-contained for an offline developer. + # Skipped if no .dmp/.mdmp files exist — $(CrashDumpRootPath) also + # holds MSBuild failure logs (MSBUILDDEBUGPATH points here), and + # those don't need symbols or this README. + - pwsh: | + $dumps = Get-ChildItem -Path "$(CrashDumpRootPath)" -Recurse -Include *.dmp,*.mdmp -File -ErrorAction SilentlyContinue + if (-not $dumps -or $dumps.Count -eq 0) { + Write-Host "No .dmp/.mdmp files in $(CrashDumpRootPath); skipping symbols + README bundling." + exit 0 + } + Write-Host "Found $($dumps.Count) dump file(s); bundling matching PDBs and README." + + $symbolsDir = Join-Path "$(CrashDumpRootPath)" 'symbols' + $releaseRoot = "$(Build.SourcesDirectory)\packages\e2e-test-app-fabric\windows\${{ matrix.BuildPlatform }}\Release" + if (Test-Path $releaseRoot) { + $pdbs = Get-ChildItem -Path $releaseRoot -Recurse -Filter *.pdb -File -ErrorAction SilentlyContinue + foreach ($pdb in $pdbs) { + $rel = $pdb.FullName.Substring($releaseRoot.Length).TrimStart('\','/') + $target = Join-Path $symbolsDir $rel + New-Item -ItemType Directory -Path (Split-Path -Parent $target) -Force | Out-Null + Copy-Item -LiteralPath $pdb.FullName -Destination $target -Force -ErrorAction SilentlyContinue + } + Write-Host "Staged $($pdbs.Count) PDB(s) under $symbolsDir" + } else { + Write-Host "Release root not found at $releaseRoot; skipping PDB stage." + } + + $readme = @' + # Reading these crash dumps + + This artifact contains crash and/or hang dumps from a failed React + Native Windows E2E test run, plus matching debug symbols. + + ## What is in here + + - `hang/` -- full-memory dumps captured by procdump64 from + RNTesterApp-Fabric / node processes that were still alive when + the test step timed out. + - `in-process/` -- full-memory minidumps written by + RNTesterApp-Fabric's own unhandled-exception filter when the app + actually crashed. + - `recovered/` -- dumps recovered from common WER fallback + locations on the agent. Usually empty. + - `symbols/` -- PDBs that match the binaries deployed to the test + agent. Folder layout mirrors the test app's Release deploy tree. + + ## Opening in WinDbg + + 1. Download and extract this artifact. Note the absolute path of + the extracted `symbols/` folder. + 2. Open a dump: + + windbg -z hang\hang_RNTesterApp-Fabric_.dmp + + 3. Set the symbol path (this artifact's symbols + Microsoft public + symbol server) and reload: + + .sympath srv*C:\symbols*https://msdl.microsoft.com/download/symbols;\symbols + .reload /f + + 4. Useful first commands: + - `~* k` -- call stack of every thread (most useful for hangs) + - `!analyze -v` -- automatic crash analysis (most useful for crashes) + + ## If you need the binaries too + + The PDBs alone are enough for stack walks and type info. If you + need module bytes (e.g. to disassemble), download the matching + `RNTesterApp-Fabric--` artifact from the same + pipeline run; its layout matches `symbols/` here. + '@ + Set-Content -LiteralPath "$(CrashDumpRootPath)\README.md" -Value $readme -Encoding utf8 + Write-Host "Wrote $(CrashDumpRootPath)\README.md" + displayName: Bundle symbols and README with crash dumps + condition: and(failed(), eq(variables.StartedFabricTests, 'true')) + continueOnError: true - script: npx jest --clearCache displayName: clear jest cache diff --git a/.ado/scripts/SetupLocalDumps.cmd b/.ado/scripts/SetupLocalDumps.cmd index b52847d928c..d30962be887 100644 --- a/.ado/scripts/SetupLocalDumps.cmd +++ b/.ado/scripts/SetupLocalDumps.cmd @@ -1,37 +1,57 @@ @echo off -REM SetupLocalDumps.cmd [ExecutableName] [DumpFolder] -REM Ex: .\SetupLocalDumps.cmd RNTesterApp C:\WER\UserDumps +REM SetupLocalDumps.cmd [ExecutableName] [DumpFolder] [DumpType] [DumpCount] +REM Ex: .\SetupLocalDumps.cmd RNTesterApp-Fabric C:\WER\UserDumps +REM Ex: .\SetupLocalDumps.cmd RNTesterApp-Fabric C:\WER\UserDumps 2 5 REM -REM This script sets the registry so that, if an executable of the given name crashes, to -REM prevent any automatic debugger from attaching, and instead save a full crash dump to -REM the given folder. +REM Configures Windows Error Reporting (WER) to save crash dumps for the named +REM executable to the given folder. This is the supported mechanism for +REM packaged/UWP apps where AeDebug-based JIT debuggers (e.g. ProcDump) are +REM not reliably invoked. +REM +REM DumpType: +REM 1 = Custom dump (uses CustomDumpFlags) +REM 2 = Full dump (default) +REM 3 = Mini dump +REM +REM DumpCount: max number of dumps to keep per exe (default 10) -setlocal +setlocal enableextensions -if "%1"=="" ( +if "%~1"=="" ( @echo Must provide an executable name to set up local crash dumps exit /b 1 ) -if "%2"=="" ( +if "%~2"=="" ( @echo Must provide a writable folder to save local crash dumps exit /b 1 ) -set CRASHDUMPS_FOLDER=%2 -@echo Configuring registry to save "%1.exe" crash dumps to "%CRASHDUMPS_FOLDER%"... -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /v DumpFolder /t REG_EXPAND_SZ /d %CRASHDUMPS_FOLDER% -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /v DumpType /t REG_DWORD /d 2 -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /v DumpCount /t REG_DWORD /d 3 -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" /v %1.exe /t REG_DWORD /d 1 -if not exist %CRASHDUMPS_FOLDER% ( +set EXE_NAME=%~1 +set CRASHDUMPS_FOLDER=%~2 +set DUMP_TYPE=%~3 +set DUMP_COUNT=%~4 +if "%DUMP_TYPE%"=="" set DUMP_TYPE=2 +if "%DUMP_COUNT%"=="" set DUMP_COUNT=10 + +if not exist "%CRASHDUMPS_FOLDER%" ( @echo Creating %CRASHDUMPS_FOLDER% - md %CRASHDUMPS_FOLDER% + md "%CRASHDUMPS_FOLDER%" ) +set REG_KEY=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%EXE_NAME%.exe +@echo Configuring WER to save "%EXE_NAME%.exe" crash dumps (DumpType=%DUMP_TYPE%, DumpCount=%DUMP_COUNT%) to "%CRASHDUMPS_FOLDER%"... +reg add "%REG_KEY%" /v DumpFolder /t REG_EXPAND_SZ /d "%CRASHDUMPS_FOLDER%" /f +reg add "%REG_KEY%" /v DumpType /t REG_DWORD /d %DUMP_TYPE% /f +reg add "%REG_KEY%" /v DumpCount /t REG_DWORD /d %DUMP_COUNT% /f + +REM Prevent the AeDebug post-mortem debugger from being invoked for this +REM executable so that WER LocalDumps gets first crack and writes to our folder. +reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" /v %EXE_NAME%.exe /t REG_DWORD /d 1 /f + @echo Registry configuration: -reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /s -reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" +reg query "%REG_KEY%" /s +reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" /v %EXE_NAME%.exe endlocal -exit /b %ERRORLEVEL% \ No newline at end of file +exit /b %ERRORLEVEL% diff --git a/.ado/templates/prepare-build-env.yml b/.ado/templates/prepare-build-env.yml index 2e81a4bad40..8e6ea5449c4 100644 --- a/.ado/templates/prepare-build-env.yml +++ b/.ado/templates/prepare-build-env.yml @@ -22,6 +22,13 @@ parameters: # - PullRequest # - Continuous # - Publish + - name: localDumpsExeNames + type: object + default: [] + # List of executable base names (without .exe) to register with WER LocalDumps, + # so that crashes in those processes write a dump to $(CrashDumpRootPath). + # Required for packaged/UWP apps where ProcDump-as-AeDebug is not reliably + # invoked. Example: ['RNTesterApp-Fabric', 'Playground']. steps: # The commit tag in the nuspec requires that we use at least nuget 5.8 (because things break with nuget versions before and Vs 16.8 or later) @@ -44,8 +51,15 @@ steps: displayName: Check and enable Windows Error Reporting - pwsh: | - Write-Host "##vso[task.setvariable variable=CrashDumpRootPath]$(Build.StagingDirectory)\CrashDumps" - New-Item -Path '$(Build.StagingDirectory)\CrashDumps' -ItemType Directory + $path = '$(Build.StagingDirectory)\CrashDumps' + Write-Host "##vso[task.setvariable variable=CrashDumpRootPath]$path" + New-Item -Path $path -ItemType Directory -Force | Out-Null + # Grant full control to NT AUTHORITY\SYSTEM and Users so the WER service + # (running as LocalSystem) and any child process — including packaged + # apps — can write dumps here. Without this, per-exe LocalDumps can + # silently fail on agents that lock down the work directory. + & icacls $path /grant 'SYSTEM:(OI)(CI)F' 'Users:(OI)(CI)F' /T /C | Out-Null + & icacls $path displayName: Set CrashDumpRootPath - pwsh: | @@ -59,4 +73,13 @@ steps: - pwsh: | & $(Build.SourcesDirectory)\.ado\scripts\RunProcDump.ps1 -ProcDumpArgs @("-mm", "-i", "$(CrashDumpRootPath)") -ProcDumpInstallPath "$(ProcDumpPath)" -Verbose displayName: Setup ProcDump as AeDebug - \ No newline at end of file + + # Register WER LocalDumps for any executables the caller cares about. + # This catches crashes in packaged/UWP apps (e.g. RNTesterApp-Fabric) that + # the AeDebug-based ProcDump path does not reliably intercept. Dumps land + # in $(CrashDumpRootPath), which is already wired to the crash-dump artifact + # publisher in upload-build-logs.yml. + - ${{ each exeName in parameters.localDumpsExeNames }}: + - script: | + call "$(Build.SourcesDirectory)\.ado\scripts\SetupLocalDumps.cmd" "${{ exeName }}" "$(CrashDumpRootPath)" + displayName: Register WER LocalDumps for ${{ exeName }}.exe diff --git a/packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts b/packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts new file mode 100644 index 00000000000..163f1ae6c7b --- /dev/null +++ b/packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * @format + */ + +// Test-only: validates the hang-dump capture path of the E2E pipeline. +// +// Auto-skips unless RNW_SIMULATE_HANG=1, which the pipeline only sets when +// `simulateHangForTesting=true` is passed to .ado/jobs/e2e-test.yml. When +// active, asks the app to jam its UI thread via the `HangForTesting` +// automation command; the post-failure ProcDump step in the pipeline then +// captures a full memory dump of the still-alive packaged-app process. + +import {app} from '@react-native-windows/automation'; +import {AutomationClient} from '@react-native-windows/automation-channel'; + +declare const automationClient: AutomationClient | undefined; + +const shouldRun = process.env.RNW_SIMULATE_HANG === '1'; + +(shouldRun ? describe : describe.skip)('Hang Simulation (TEST ONLY)', () => { + test('jams the UI thread until the test times out', async () => { + if (!automationClient) { + throw new Error('RPC client is not enabled'); + } + + // Asks the app to Post a Sleep(INFINITE) onto its UI dispatcher. The + // command itself returns quickly; the UI thread is jammed on the next + // queued work item, so any subsequent UIA query will block. + await automationClient.invoke('HangForTesting', {}); + + // Touch the UI to surface the hang to jest. This call would normally + // return quickly; with the UI thread jammed it blocks until jest's + // testTimeout fires. + const anyElement = await app.findElementByTestID('components-tab'); + await anyElement.waitForDisplayed({timeout: 60000}); + }); +}); + +export {}; diff --git a/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp b/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp index 7431122e6ae..548b7a7869c 100644 --- a/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp +++ b/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp @@ -5,9 +5,12 @@ #include "RNTesterApp-Fabric.h" #include +#include #include #include "winrt/AutomationChannel.h" +#pragma comment(lib, "dbghelp.lib") + // Includes from sample-custom-component #include @@ -37,6 +40,7 @@ winrt::Microsoft::ReactNative::IReactContext global_reactContext{nullptr}; // Forward declarations of functions included in this code module: winrt::Windows::Data::Json::JsonObject ListErrors(winrt::Windows::Data::Json::JsonValue payload); winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json::JsonValue payload); +winrt::Windows::Data::Json::JsonObject HangForTesting(winrt::Windows::Data::Json::JsonValue payload); winrt::Windows::Foundation::IAsyncAction LoopServer(winrt::AutomationChannel::Server &server); // Create and configure the ReactNativeHost @@ -99,8 +103,133 @@ winrt::Microsoft::ReactNative::ReactNativeHost CreateReactNativeHost( return host; } +// In-process crash dump writer. Installed as the top-level +// `UnhandledExceptionFilter`, so any unhandled structured exception in the +// app (e.g. access violations) writes a full-memory minidump to a well-known +// folder before the OS tears the process down. This is independent of +// Windows Error Reporting — needed because hosted CI agents route WER through +// a corporate-server policy that silently ignores per-exe LocalDumps. +// +// The dump folder is %ProgramData%\RNW-E2E-Dumps. The pipeline scans that path +// after a failing test run and publishes anything found. +static LONG WINAPI WriteDumpOnUnhandledException(EXCEPTION_POINTERS *pExceptionInfo) { + wchar_t dumpDir[MAX_PATH]; + DWORD len = GetEnvironmentVariableW(L"ProgramData", dumpDir, MAX_PATH); + if (len == 0 || len >= MAX_PATH) { + return EXCEPTION_CONTINUE_SEARCH; + } + if (FAILED(PathCchAppend(dumpDir, MAX_PATH, L"RNW-E2E-Dumps"))) { + return EXCEPTION_CONTINUE_SEARCH; + } + CreateDirectoryW(dumpDir, nullptr); // ignore ERROR_ALREADY_EXISTS + + wchar_t dumpPath[MAX_PATH]; + SYSTEMTIME st; + GetLocalTime(&st); + swprintf_s( + dumpPath, + MAX_PATH, + L"%s\\RNTesterApp-Fabric-%04u%02u%02u-%02u%02u%02u-%u.dmp", + dumpDir, + st.wYear, + st.wMonth, + st.wDay, + st.wHour, + st.wMinute, + st.wSecond, + GetCurrentProcessId()); + + HANDLE hFile = CreateFileW(dumpPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + if (hFile == INVALID_HANDLE_VALUE) { + return EXCEPTION_CONTINUE_SEARCH; + } + + MINIDUMP_EXCEPTION_INFORMATION exInfo{}; + exInfo.ThreadId = GetCurrentThreadId(); + exInfo.ExceptionPointers = pExceptionInfo; + exInfo.ClientPointers = FALSE; + + const MINIDUMP_TYPE dumpType = static_cast( + MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules | + MiniDumpWithProcessThreadData); + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + hFile, + dumpType, + pExceptionInfo ? &exInfo : nullptr, + nullptr, + nullptr); + + FlushFileBuffers(hFile); + CloseHandle(hFile); + + // Let normal processing continue so the process still terminates and any + // downstream handlers (including WER, if it's active) also run. + return EXCEPTION_CONTINUE_SEARCH; +} + +static void InstallInProcessCrashDumpWriter() { + SetUnhandledExceptionFilter(WriteDumpOnUnhandledException); + // Suppress the fault dialog so the process exits promptly after our UEF runs + // — on a hosted agent there is nobody to click a dialog anyway. + SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); +} + +// Test-only: if the sentinel file exists, deliberately crash the app on +// startup. Used by the E2E pipeline (see .ado/jobs/e2e-test.yml +// `simulateCrashForTesting` parameter) to re-validate that the in-process +// minidump writer + artifact publish actually produces a usable .dmp. +// File-based trigger because environment variables do not reliably propagate +// through the packaged-app activation flow used by the automation test driver. +static void MaybeSimulateCrashForTesting() { + wchar_t flagPath[MAX_PATH]; + DWORD len = GetEnvironmentVariableW(L"ProgramData", flagPath, MAX_PATH); + if (len == 0 || len >= MAX_PATH) { + return; + } + if (FAILED(PathCchAppend(flagPath, MAX_PATH, L"rnw-e2e-simulate-crash.flag"))) { + return; + } + if (GetFileAttributesW(flagPath) == INVALID_FILE_ATTRIBUTES) { + return; + } + + // Deliberate null-pointer write to trigger an access violation. Volatile so + // the optimizer keeps it. + *reinterpret_cast(nullptr) = 0xC0FFEE; +} + +// Test-only: when invoked over the automation channel, jam the UI thread +// forever. Used by the E2E pipeline (see .ado/jobs/e2e-test.yml +// `simulateHangForTesting` parameter) to validate that the post-failure +// ProcDump capture step actually produces a usable dump of a hung app. +// +// We Post the sleep onto the UI dispatcher rather than blocking inline so the +// channel handler returns a normal response to the test client — that's the +// realistic scenario (the app appears to acknowledge a request, then locks up +// on the next UI-thread work item, exactly like a deadlock in production). +winrt::Windows::Data::Json::JsonObject HangForTesting(winrt::Windows::Data::Json::JsonValue /*payload*/) { + if (global_reactContext) { + global_reactContext.UIDispatcher().Post([]() { ::Sleep(INFINITE); }); + } else { + // Fallback: hang the channel-loop thread itself. Less realistic but still + // produces a hung process that the post-failure ProcDump path can capture. + ::Sleep(INFINITE); + } + return {}; +} + _Use_decl_annotations_ int CALLBACK WinMain(HINSTANCE /* instance */, HINSTANCE, PSTR /* commandLine */, int /* showCmd */) { + // Install our in-process crash handler before anything else can crash. This + // is the primary mechanism for capturing dumps on hosted CI agents, where + // Windows Error Reporting is policy-routed away from local disk. + InstallInProcessCrashDumpWriter(); + + MaybeSimulateCrashForTesting(); + // Initialize WinRT. winrt::init_apartment(winrt::apartment_type::single_threaded); @@ -151,6 +280,7 @@ WinMain(HINSTANCE /* instance */, HINSTANCE, PSTR /* commandLine */, int /* show winrt::AutomationChannel::CommandHandler handler; handler.BindOperation(L"DumpVisualTree", DumpVisualTree); handler.BindOperation(L"ListErrors", ListErrors); + handler.BindOperation(L"HangForTesting", HangForTesting); global_rootView = reactNativeWindow.ReactNativeIsland(); auto server = winrt::AutomationChannel::Server(handler); @@ -760,8 +890,7 @@ winrt::Windows::Data::Json::JsonObject DumpNativeComponentTreeHelper( return visualTree; } -winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json::JsonValue payload) { - winrt::Windows::Data::Json::JsonObject payloadObj = payload.GetObject(); +static winrt::Windows::Data::Json::JsonObject DumpVisualTreeOnce(winrt::Windows::Data::Json::JsonObject payloadObj) { winrt::Windows::Data::Json::JsonObject result; result.Insert(L"Automation Tree", DumpUIATreeHelper(payloadObj)); result.Insert(L"Visual Tree", DumpVisualTreeHelper(payloadObj)); @@ -769,6 +898,34 @@ winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json return result; } +// Dump the visual / automation / component trees up to 3 times and return +// the first dump that matches the next one. If no two consecutive dumps +// agree, return the final attempt as a best-effort. +// +// Why: composition `Visual::Size` is read after Composition's commit has +// already rounded a sub-pixel text-layout result to an integer. Adjacent +// commits can produce different roundings (24 vs 25 for a ~24.5 measurement), +// so a single dump captures whichever frame happens to be live. Two +// consecutive identical dumps indicate the system has reached a stable +// post-layout state for this query. +winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json::JsonValue payload) { + winrt::Windows::Data::Json::JsonObject payloadObj = payload.GetObject(); + + constexpr int kMaxAttempts = 3; + constexpr int kSettleDelayMs = 50; + + winrt::Windows::Data::Json::JsonObject prev = DumpVisualTreeOnce(payloadObj); + for (int i = 1; i < kMaxAttempts; ++i) { + ::Sleep(kSettleDelayMs); + auto curr = DumpVisualTreeOnce(payloadObj); + if (prev.Stringify() == curr.Stringify()) { + return curr; + } + prev = curr; + } + return prev; +} + winrt::Windows::Foundation::IAsyncAction LoopServer(winrt::AutomationChannel::Server &server) { while (true) { try { From 734b98b27bd3c379df2976b8f4509cac34d78c67 Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Tue, 28 Apr 2026 13:16:06 -0700 Subject: [PATCH 2/7] [0.84] Remove HomeUIA snapshots (#15921) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The HomeUIA snapshots do not provide much useful test coverage, and cause a lot of churn on the test snapshots. Removing them to make snapshot changes less ignorable. Resolves the ±1px height drift on Appearance / AppState tabs by removing the test that flaked on it. (cherry picked from commit 08ad79fe854a0b517fc53f4a6b0bf020817c7502) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../test/HomeUIADump.test.ts | 85 - .../__snapshots__/HomeUIADump.test.ts.snap | 6845 ----------------- 2 files changed, 6930 deletions(-) delete mode 100644 packages/e2e-test-app-fabric/test/HomeUIADump.test.ts delete mode 100644 packages/e2e-test-app-fabric/test/__snapshots__/HomeUIADump.test.ts.snap diff --git a/packages/e2e-test-app-fabric/test/HomeUIADump.test.ts b/packages/e2e-test-app-fabric/test/HomeUIADump.test.ts deleted file mode 100644 index b34262affd5..00000000000 --- a/packages/e2e-test-app-fabric/test/HomeUIADump.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * @format - */ - -import {app} from '@react-native-windows/automation'; -import {verifyNoErrorLogs} from './Helpers'; -import {dumpVisualTree} from '@react-native-windows/automation-commands'; - -type RNTesterExampleModule = { - title: string; - description: string; -}; - -type RNTesterModuleInfo = { - key: string; - module: RNTesterExampleModule; -}; - -type RNTesterList = { - APIs: RNTesterModuleInfo[]; - Components: RNTesterModuleInfo[]; -}; - -const testerList: RNTesterList = require('@react-native-windows/tester/js/utils/RNTesterList'); - -const apiExamples = testerList.APIs.map(e => e.module.title); -const componentExamples = testerList.Components.map(e => e.module.title); - -afterEach(async () => { - await verifyNoErrorLogs(); -}); - -beforeAll(async () => { - // If window is partially offscreen, tests will fail to click on certain elements - await app.setWindowPosition(0, 0); - await app.setWindowSize(1000, 1250); -}); - -describe('Home UIA Tree Dump', () => { - test('Components Tab', async () => { - const componentsTabButton = await app.findElementByTestID('components-tab'); - await componentsTabButton.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree('components-tab'); - expect(dump).toMatchSnapshot(); - }); - test('APIs Tab', async () => { - const apisTabButton = await app.findElementByTestID('apis-tab'); - await apisTabButton.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree('apis-tab'); - expect(dump).toMatchSnapshot(); - }); - test('Search Bar', async () => { - const component = await app.findElementByTestID('explorer_search'); - await component.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree('explorer_search'); - expect(dump).toMatchSnapshot(); - }); - for (const component of componentExamples) { - test(component, async () => { - const componentsTabButton = await app.findElementByTestID( - 'components-tab', - ); - await componentsTabButton.click(); - const componentTile = await app.findElementByTestID(component); - await componentTile.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree(component); - expect(dump).toMatchSnapshot(); - }); - } - for (const api of apiExamples) { - test(api, async () => { - const apisTabButton = await app.findElementByTestID('apis-tab'); - await apisTabButton.click(); - const apiTile = await app.findElementByTestID(api); - await apiTile.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree(api); - expect(dump).toMatchSnapshot(); - }); - } -}); - -export {}; diff --git a/packages/e2e-test-app-fabric/test/__snapshots__/HomeUIADump.test.ts.snap b/packages/e2e-test-app-fabric/test/__snapshots__/HomeUIADump.test.ts.snap deleted file mode 100644 index f9d83216e65..00000000000 --- a/packages/e2e-test-app-fabric/test/__snapshots__/HomeUIADump.test.ts.snap +++ /dev/null @@ -1,6845 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Home UIA Tree Dump APIs Tab 1`] = ` -{ - "Automation Tree": { - "AutomationId": "apis-tab", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "APIs", - "TextRangePattern.GetText": "APIs", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "TestId": "apis-tab", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": {}, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ImageComponentView", - "_Props": { - "Sources": [ - { - "Size": "111, 72", - "Type": "Local", - "Uri": "?unstable_path=_@react-native-windows/tester/js/assets/bottom-nav-apis-icon-light.png", - }, - ], - }, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(243, 248, 255, 255)", - }, - "Comment": "apis-tab", - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "151, 13, 0", - "Size": "30, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "30, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - { - "Offset": "153, 33, 0", - "Size": "27, 19", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "27, 19", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Accessibility 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Accessibility", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Accessibility Examples of using Accessibility APIs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Accessibility", - "TextRangePattern.GetText": "Accessibility", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of using Accessibility APIs.", - "TextRangePattern.GetText": "Examples of using Accessibility APIs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Accessibility Examples of using Accessibility APIs.", - "TestId": "Accessibility", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Accessibility", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "96, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "96, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Accessibility Windows 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Accessibility Windows", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Accessibility Windows Usage of accessibility properties.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Accessibility Windows", - "TextRangePattern.GetText": "Accessibility Windows", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of accessibility properties.", - "TextRangePattern.GetText": "Usage of accessibility properties.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Accessibility Windows Usage of accessibility properties.", - "TestId": "Accessibility Windows", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Accessibility Windows", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "174, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "174, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump AccessibilityInfo 1`] = ` -{ - "Automation Tree": { - "AutomationId": "AccessibilityInfo", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "AccessibilityInfo Examples of using AccessibilityInfo APIs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "AccessibilityInfo", - "TextRangePattern.GetText": "AccessibilityInfo", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of using AccessibilityInfo APIs.", - "TextRangePattern.GetText": "Examples of using AccessibilityInfo APIs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "AccessibilityInfo Examples of using AccessibilityInfo APIs.", - "TestId": "AccessibilityInfo", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "AccessibilityInfo", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "127, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "127, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ActivityIndicator 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ActivityIndicator", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ActivityIndicator Animated loading indicators.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ActivityIndicator", - "TextRangePattern.GetText": "ActivityIndicator", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Animated loading indicators.", - "TextRangePattern.GetText": "Animated loading indicators.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ActivityIndicator Animated loading indicators.", - "TestId": "ActivityIndicator", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ActivityIndicator", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "129, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "129, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Alerts 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Alerts", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Alerts Alerts display a concise and informative message and prompt the user to make a decision.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Alerts", - "TextRangePattern.GetText": "Alerts", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Alerts display a concise and informative message and prompt the user to make a decision.", - "TextRangePattern.GetText": "Alerts display a concise and informative message and prompt the user to make a decision.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Alerts Alerts display a concise and informative message and prompt the user to make a decision.", - "TestId": "Alerts", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Alerts", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "46, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "46, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Animated - Gratuitous App 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Animated - Gratuitous App", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Animated - Gratuitous App Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Animated - Gratuitous App", - "TextRangePattern.GetText": "Animated - Gratuitous App", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - "TextRangePattern.GetText": "Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Animated - Gratuitous App Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - "TestId": "Animated - Gratuitous App", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Animated - Gratuitous App", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "215, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "215, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Animated 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Animated", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Animated Library designed to make animations fluid, powerful, and painless to build and maintain.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Animated", - "TextRangePattern.GetText": "Animated", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Library designed to make animations fluid, powerful, and painless to build and maintain.", - "TextRangePattern.GetText": "Library designed to make animations fluid, powerful, and painless to build and maintain.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Animated Library designed to make animations fluid, powerful, and painless to build and maintain.", - "TestId": "Animated", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Animated", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "77, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "77, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump AppState 1`] = ` -{ - "Automation Tree": { - "AutomationId": "AppState", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "AppState app background status", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "AppState", - "TextRangePattern.GetText": "AppState", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "app background status", - "TextRangePattern.GetText": "app background status", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "AppState app background status", - "TestId": "AppState", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "AppState", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "73, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "73, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Appearance 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Appearance", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Appearance Light and dark user interface examples.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Appearance", - "TextRangePattern.GetText": "Appearance", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Light and dark user interface examples.", - "TextRangePattern.GetText": "Light and dark user interface examples.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Appearance Light and dark user interface examples.", - "TestId": "Appearance", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Appearance", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Border 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Border", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Border Demonstrates some of the border styles available to Views.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Border", - "TextRangePattern.GetText": "Border", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates some of the border styles available to Views.", - "TextRangePattern.GetText": "Demonstrates some of the border styles available to Views.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Border Demonstrates some of the border styles available to Views.", - "TestId": "Border", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Border", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Button 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Button", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Button Simple React Native button component.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Button", - "TextRangePattern.GetText": "Button", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Simple React Native button component.", - "TextRangePattern.GetText": "Simple React Native button component.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Button Simple React Native button component.", - "TestId": "Button", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Button", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Components Tab 1`] = ` -{ - "Automation Tree": { - "AutomationId": "components-tab", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Components", - "TextRangePattern.GetText": "Components", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "TestId": "components-tab", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": {}, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ImageComponentView", - "_Props": { - "Sources": [ - { - "Size": "66, 72", - "Type": "Local", - "Uri": "?unstable_path=_@react-native-windows/tester/js/assets/bottom-nav-components-icon-dark.png", - }, - ], - }, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(243, 248, 255, 255)", - }, - "Comment": "components-tab", - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "0, 2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, 0, 0", - "Size": "-0, 2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "-0, 0, 0", - "Size": "0, 2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "-0, 2, 0", - "Size": "0, -2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "-0, -0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, -0, 0", - "Size": "-0, 0", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, -0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, 2, 0", - "Size": "0, -2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "156, 14, 0", - "Size": "20, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "20, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - { - "Offset": "126, 34, 0", - "Size": "80, 19", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "80, 19", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Composition Bugs Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Composition Bugs Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Composition Bugs Example See bugs in UI.Composition driven native animations", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Composition Bugs Example", - "TextRangePattern.GetText": "Composition Bugs Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "See bugs in UI.Composition driven native animations", - "TextRangePattern.GetText": "See bugs in UI.Composition driven native animations", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Composition Bugs Example See bugs in UI.Composition driven native animations", - "TestId": "Composition Bugs Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Composition Bugs Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "217, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "217, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ContentURLAndroid 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ContentURLAndroid", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ContentURLAndroid Android specific fetch content:// scheme urls as blob.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ContentURLAndroid", - "TextRangePattern.GetText": "ContentURLAndroid", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Android specific fetch content:// scheme urls as blob.", - "TextRangePattern.GetText": "Android specific fetch content:// scheme urls as blob.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ContentURLAndroid Android specific fetch content:// scheme urls as blob.", - "TestId": "ContentURLAndroid", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ContentURLAndroid", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "160, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "160, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Crash 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Crash", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Crash Crash examples.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Crash", - "TextRangePattern.GetText": "Crash", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Crash examples.", - "TextRangePattern.GetText": "Crash examples.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Crash Crash examples.", - "TestId": "Crash", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Crash", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Custom Native Accessibility Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Custom Native Accessibility Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Custom Native Accessibility Example Sample of a Custom Native Component overriding default accessibility", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Custom Native Accessibility Example", - "TextRangePattern.GetText": "Custom Native Accessibility Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample of a Custom Native Component overriding default accessibility", - "TextRangePattern.GetText": "Sample of a Custom Native Component overriding default accessibility", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Custom Native Accessibility Example Sample of a Custom Native Component overriding default accessibility", - "TestId": "Custom Native Accessibility Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Custom Native Accessibility Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "290, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "290, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump DevSettings 1`] = ` -{ - "Automation Tree": { - "AutomationId": "DevSettings", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "DevSettings Customize the development settings", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "DevSettings", - "TextRangePattern.GetText": "DevSettings", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Customize the development settings", - "TextRangePattern.GetText": "Customize the development settings", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "DevSettings Customize the development settings", - "TestId": "DevSettings", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "DevSettings", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Dimensions 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Dimensions", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Dimensions Dimensions of the viewport", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Dimensions", - "TextRangePattern.GetText": "Dimensions", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Dimensions of the viewport", - "TextRangePattern.GetText": "Dimensions of the viewport", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Dimensions Dimensions of the viewport", - "TestId": "Dimensions", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Dimensions", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "93, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "93, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Display: contents 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Display: contents", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Display: contents Demonstrates various ways display: contents may be used in the tree", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Display: contents", - "TextRangePattern.GetText": "Display: contents", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates various ways display: contents may be used in the tree", - "TextRangePattern.GetText": "Demonstrates various ways display: contents may be used in the tree", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Display: contents Demonstrates various ways display: contents may be used in the tree", - "TestId": "Display: contents", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Display: contents", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Display:none Style 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Display:none Style", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Display:none Style Style prop which will collapse the element in XAML tree.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Display:none Style", - "TextRangePattern.GetText": "Display:none Style", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Style prop which will collapse the element in XAML tree.", - "TextRangePattern.GetText": "Style prop which will collapse the element in XAML tree.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Display:none Style Style prop which will collapse the element in XAML tree.", - "TestId": "Display:none Style", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Display:none Style", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "145, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "145, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Drawing Island Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Drawing Island Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Drawing Island Example Sample Fabric Native Component that contains a custom ContentIsland", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Drawing Island Example", - "TextRangePattern.GetText": "Drawing Island Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Fabric Native Component that contains a custom ContentIsland", - "TextRangePattern.GetText": "Sample Fabric Native Component that contains a custom ContentIsland", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Drawing Island Example Sample Fabric Native Component that contains a custom ContentIsland", - "TestId": "Drawing Island Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Drawing Island Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Fabric Native Component 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Fabric Native Component", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Fabric Native Component Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Fabric Native Component", - "TextRangePattern.GetText": "Fabric Native Component", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - "TextRangePattern.GetText": "Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Fabric Native Component Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - "TestId": "Fabric Native Component", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Fabric Native Component", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "203, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "203, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Fabric Native Component Yoga 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Fabric Native Component Yoga", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Fabric Native Component Yoga Sample Fabric Native Component that places native XAML inside a container sized by yoga", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Fabric Native Component Yoga", - "TextRangePattern.GetText": "Fabric Native Component Yoga", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Fabric Native Component that places native XAML inside a container sized by yoga", - "TextRangePattern.GetText": "Sample Fabric Native Component that places native XAML inside a container sized by yoga", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Fabric Native Component Yoga Sample Fabric Native Component that places native XAML inside a container sized by yoga", - "TestId": "Fabric Native Component Yoga", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Fabric Native Component Yoga", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "246, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "246, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Fast Path Texts 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Fast Path Texts", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Fast Path Texts Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Fast Path Texts", - "TextRangePattern.GetText": "Fast Path Texts", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - "TextRangePattern.GetText": "Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Fast Path Texts Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - "TestId": "Fast Path Texts", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Fast Path Texts", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Filter 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Filter", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Filter A set of graphical effects that can be applied to a view.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Filter", - "TextRangePattern.GetText": "Filter", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "A set of graphical effects that can be applied to a view.", - "TextRangePattern.GetText": "A set of graphical effects that can be applied to a view.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Filter A set of graphical effects that can be applied to a view.", - "TestId": "Filter", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Filter", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "40, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "40, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump FlatList 1`] = ` -{ - "Automation Tree": { - "AutomationId": "FlatList", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "FlatList Performant, scrollable list of data.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "FlatList", - "TextRangePattern.GetText": "FlatList", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Performant, scrollable list of data.", - "TextRangePattern.GetText": "Performant, scrollable list of data.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "FlatList Performant, scrollable list of data.", - "TestId": "FlatList", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "FlatList", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "55, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "55, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Flyout 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Flyout", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Flyout Displays content on top of existing content, within the bounds of the application window.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Flyout", - "TextRangePattern.GetText": "Flyout", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Displays content on top of existing content, within the bounds of the application window.", - "TextRangePattern.GetText": "Displays content on top of existing content, within the bounds of the application window.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Flyout Displays content on top of existing content, within the bounds of the application window.", - "TestId": "Flyout", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Flyout", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "49, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "49, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Glyph UWP 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Glyph UWP", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Glyph UWP Usage of Glyph control.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Glyph UWP", - "TextRangePattern.GetText": "Glyph UWP", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of Glyph control.", - "TextRangePattern.GetText": "Usage of Glyph control.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Glyph UWP Usage of Glyph control.", - "TestId": "Glyph UWP", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Glyph UWP", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "91, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "91, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Hit Testing 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Hit Testing", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Hit Testing Test that overflow hidden affect hit testing", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Hit Testing", - "TextRangePattern.GetText": "Hit Testing", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Test that overflow hidden affect hit testing", - "TextRangePattern.GetText": "Test that overflow hidden affect hit testing", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Hit Testing Test that overflow hidden affect hit testing", - "TestId": "Hit Testing", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Hit Testing", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "85, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "85, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Image 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Image", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Image Base component for displaying different types of images.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Image", - "TextRangePattern.GetText": "Image", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Base component for displaying different types of images.", - "TextRangePattern.GetText": "Base component for displaying different types of images.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Image Base component for displaying different types of images.", - "TestId": "Image", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Image", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "50, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "50, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard Demonstrates usage of the "Keyboard" static API", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard", - "TextRangePattern.GetText": "Keyboard", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates usage of the "Keyboard" static API", - "TextRangePattern.GetText": "Demonstrates usage of the "Keyboard" static API", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard Demonstrates usage of the "Keyboard" static API", - "TestId": "Keyboard", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard 2`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard Demonstrates usage of the "Keyboard" static API", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard", - "TextRangePattern.GetText": "Keyboard", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates usage of the "Keyboard" static API", - "TextRangePattern.GetText": "Demonstrates usage of the "Keyboard" static API", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard Demonstrates usage of the "Keyboard" static API", - "TestId": "Keyboard", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard Focus Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard Focus Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard Focus Example Demo of keyboard focus.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard Focus Example", - "TextRangePattern.GetText": "Keyboard Focus Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demo of keyboard focus.", - "TextRangePattern.GetText": "Demo of keyboard focus.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard Focus Example Demo of keyboard focus.", - "TestId": "Keyboard Focus Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard Focus Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard extension Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard extension Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard extension Example Demo of keyboard properties.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard extension Example", - "TextRangePattern.GetText": "Keyboard extension Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demo of keyboard properties.", - "TextRangePattern.GetText": "Demo of keyboard properties.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard extension Example Demo of keyboard properties.", - "TestId": "Keyboard extension Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard extension Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "228, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "228, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Layout - Flexbox 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Layout - Flexbox", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Layout - Flexbox Examples of using the flexbox API to layout views.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Layout - Flexbox", - "TextRangePattern.GetText": "Layout - Flexbox", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of using the flexbox API to layout views.", - "TextRangePattern.GetText": "Examples of using the flexbox API to layout views.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Layout - Flexbox Examples of using the flexbox API to layout views.", - "TestId": "Layout - Flexbox", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Layout - Flexbox", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "131, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "131, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Layout Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Layout Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Layout Events Examples that show how Layout events can be used to measure view size and position.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Layout Events", - "TextRangePattern.GetText": "Layout Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples that show how Layout events can be used to measure view size and position.", - "TextRangePattern.GetText": "Examples that show how Layout events can be used to measure view size and position.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Layout Events Examples that show how Layout events can be used to measure view size and position.", - "TestId": "Layout Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Layout Events", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Legacy Native Module 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Legacy Native Module", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Legacy Native Module Usage of legacy Native Module", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy Native Module", - "TextRangePattern.GetText": "Legacy Native Module", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of legacy Native Module", - "TextRangePattern.GetText": "Usage of legacy Native Module", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Legacy Native Module Usage of legacy Native Module", - "TestId": "Legacy Native Module", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Legacy Native Module", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyControlStyleTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyControlStyleTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyControlStyleTest Legacy e2e test for Control Styles", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyControlStyleTest", - "TextRangePattern.GetText": "LegacyControlStyleTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for Control Styles", - "TextRangePattern.GetText": "Legacy e2e test for Control Styles", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyControlStyleTest Legacy e2e test for Control Styles", - "TestId": "LegacyControlStyleTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyControlStyleTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "183, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "183, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyImageTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyImageTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyImageTest Legacy e2e test for Image", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyImageTest", - "TextRangePattern.GetText": "LegacyImageTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for Image", - "TextRangePattern.GetText": "Legacy e2e test for Image", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyImageTest Legacy e2e test for Image", - "TestId": "LegacyImageTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyImageTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyLoginTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyLoginTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyLoginTest Legacy e2e test for TextInput with password", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyLoginTest", - "TextRangePattern.GetText": "LegacyLoginTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for TextInput with password", - "TextRangePattern.GetText": "Legacy e2e test for TextInput with password", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyLoginTest Legacy e2e test for TextInput with password", - "TestId": "LegacyLoginTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyLoginTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "130, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "130, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacySelectableTextTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacySelectableTextTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacySelectableTextTest Legacy e2e test for selectable Text hit testing", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacySelectableTextTest", - "TextRangePattern.GetText": "LegacySelectableTextTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for selectable Text hit testing", - "TextRangePattern.GetText": "Legacy e2e test for selectable Text hit testing", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacySelectableTextTest Legacy e2e test for selectable Text hit testing", - "TestId": "LegacySelectableTextTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacySelectableTextTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyTextHitTestTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyTextHitTestTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyTextHitTestTest Legacy e2e test for Text hit testing", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyTextHitTestTest", - "TextRangePattern.GetText": "LegacyTextHitTestTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for Text hit testing", - "TextRangePattern.GetText": "Legacy e2e test for Text hit testing", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyTextHitTestTest Legacy e2e test for Text hit testing", - "TestId": "LegacyTextHitTestTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyTextHitTestTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "171, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "171, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyTextInputTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyTextInputTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyTextInputTest Legacy e2e test for TextInput", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyTextInputTest", - "TextRangePattern.GetText": "LegacyTextInputTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for TextInput", - "TextRangePattern.GetText": "Legacy e2e test for TextInput", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyTextInputTest Legacy e2e test for TextInput", - "TestId": "LegacyTextInputTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyTextInputTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Linking 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Linking", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Linking Shows how to use Linking to open URLs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Linking", - "TextRangePattern.GetText": "Linking", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Shows how to use Linking to open URLs.", - "TextRangePattern.GetText": "Shows how to use Linking to open URLs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Linking Shows how to use Linking to open URLs.", - "TestId": "Linking", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Linking", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "58, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "58, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Modal 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Modal", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Modal Component for presenting modal views.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Modal", - "TextRangePattern.GetText": "Modal", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component for presenting modal views.", - "TextRangePattern.GetText": "Component for presenting modal views.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Modal Component for presenting modal views.", - "TestId": "Modal", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Modal", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "51, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "51, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Mouse Click Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Mouse Click Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Mouse Click Events Tests that mouse click events work on intended components", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Mouse Click Events", - "TextRangePattern.GetText": "Mouse Click Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Tests that mouse click events work on intended components", - "TextRangePattern.GetText": "Tests that mouse click events work on intended components", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Mouse Click Events Tests that mouse click events work on intended components", - "TestId": "Mouse Click Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Mouse Click Events", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "152, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "152, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Mouse Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Mouse Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Mouse Events Tests that mouse events can be observed", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Mouse Events", - "TextRangePattern.GetText": "Mouse Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Tests that mouse events can be observed", - "TextRangePattern.GetText": "Tests that mouse events can be observed", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Mouse Events Tests that mouse events can be observed", - "TestId": "Mouse Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Mouse Events", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Moving Light Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Moving Light Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Moving Light Example Sample Custom Fabric Native Component", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Moving Light Example", - "TextRangePattern.GetText": "Moving Light Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Custom Fabric Native Component", - "TextRangePattern.GetText": "Sample Custom Fabric Native Component", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Moving Light Example Sample Custom Fabric Native Component", - "TestId": "Moving Light Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Moving Light Example", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Native Animated Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Native Animated Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Native Animated Example Test out Native Animations", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Native Animated Example", - "TextRangePattern.GetText": "Native Animated Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Test out Native Animations", - "TextRangePattern.GetText": "Test out Native Animations", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Native Animated Example Test out Native Animations", - "TestId": "Native Animated Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Native Animated Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "205, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "205, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Native Perf Benchmark 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Native Perf Benchmark", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Native Perf Benchmark Measures native rendering pipeline via performance.mark/measure.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Native Perf Benchmark", - "TextRangePattern.GetText": "Native Perf Benchmark", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Measures native rendering pipeline via performance.mark/measure.", - "TextRangePattern.GetText": "Measures native rendering pipeline via performance.mark/measure.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Native Perf Benchmark Measures native rendering pipeline via performance.mark/measure.", - "TestId": "Native Perf Benchmark", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Native Perf Benchmark", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "180, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "180, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump New App Screen 1`] = ` -{ - "Automation Tree": { - "AutomationId": "New App Screen", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "New App Screen Displays the content of the new app screen", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "New App Screen", - "TextRangePattern.GetText": "New App Screen", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Displays the content of the new app screen", - "TextRangePattern.GetText": "Displays the content of the new app screen", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "New App Screen Displays the content of the new app screen", - "TestId": "New App Screen", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "New App Screen", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "132, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "132, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump PanResponder Sample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "PanResponder Sample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "PanResponder Sample Shows the Use of PanResponder to provide basic gesture handling", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "PanResponder Sample", - "TextRangePattern.GetText": "PanResponder Sample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Shows the Use of PanResponder to provide basic gesture handling", - "TextRangePattern.GetText": "Shows the Use of PanResponder to provide basic gesture handling", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "PanResponder Sample Shows the Use of PanResponder to provide basic gesture handling", - "TestId": "PanResponder Sample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "PanResponder Sample", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "178, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "178, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Performance Comparison Examples 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Performance Comparison Examples", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Performance Comparison Examples Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Performance Comparison Examples", - "TextRangePattern.GetText": "Performance Comparison Examples", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - "TextRangePattern.GetText": "Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Performance Comparison Examples Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - "TestId": "Performance Comparison Examples", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Performance Comparison Examples", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "280, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "280, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump PixelRatio 1`] = ` -{ - "Automation Tree": { - "AutomationId": "PixelRatio", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "PixelRatio Gives access to device's pixel density and font scale", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "PixelRatio", - "TextRangePattern.GetText": "PixelRatio", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Gives access to device's pixel density and font scale", - "TextRangePattern.GetText": "Gives access to device's pixel density and font scale", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "PixelRatio Gives access to device's pixel density and font scale", - "TestId": "PixelRatio", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "PixelRatio", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "78, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "78, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump PlatformColor 1`] = ` -{ - "Automation Tree": { - "AutomationId": "PlatformColor", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "PlatformColor Examples that show how PlatformColors may be used in an app.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "PlatformColor", - "TextRangePattern.GetText": "PlatformColor", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples that show how PlatformColors may be used in an app.", - "TextRangePattern.GetText": "Examples that show how PlatformColors may be used in an app.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "PlatformColor Examples that show how PlatformColors may be used in an app.", - "TestId": "PlatformColor", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "PlatformColor", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "111, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "111, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Pointer Button 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Pointer Button", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Pointer Button Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Pointer Button", - "TextRangePattern.GetText": "Pointer Button", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - "TextRangePattern.GetText": "Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Pointer Button Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - "TestId": "Pointer Button", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Pointer Button", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Pointer Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Pointer Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Pointer Events Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Pointer Events", - "TextRangePattern.GetText": "Pointer Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - "TextRangePattern.GetText": "Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Pointer Events Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - "TestId": "Pointer Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Pointer Events", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "113, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "113, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Popup 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Popup", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Popup Displays content on top of existing content, within the bounds of the application window.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Popup", - "TextRangePattern.GetText": "Popup", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Displays content on top of existing content, within the bounds of the application window.", - "TextRangePattern.GetText": "Displays content on top of existing content, within the bounds of the application window.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Popup Displays content on top of existing content, within the bounds of the application window.", - "TestId": "Popup", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Popup", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Pressable 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Pressable", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Pressable Component for making views pressable.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Pressable", - "TextRangePattern.GetText": "Pressable", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component for making views pressable.", - "TextRangePattern.GetText": "Component for making views pressable.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Pressable Component for making views pressable.", - "TestId": "Pressable", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Pressable", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "75, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "75, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump RTLExample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "RTLExample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "RTLExample Examples to show how to apply components to RTL layout.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "RTLExample", - "TextRangePattern.GetText": "RTLExample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples to show how to apply components to RTL layout.", - "TextRangePattern.GetText": "Examples to show how to apply components to RTL layout.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "RTLExample Examples to show how to apply components to RTL layout.", - "TestId": "RTLExample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "RTLExample", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ScrollView 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ScrollView", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ScrollView Component that enables scrolling through child components", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ScrollView", - "TextRangePattern.GetText": "ScrollView", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component that enables scrolling through child components", - "TextRangePattern.GetText": "Component that enables scrolling through child components", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ScrollView Component that enables scrolling through child components", - "TestId": "ScrollView", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ScrollView", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "82, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "82, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ScrollViewAnimated 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ScrollViewAnimated", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ScrollViewAnimated Component that is animated when ScrollView is offset.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ScrollViewAnimated", - "TextRangePattern.GetText": "ScrollViewAnimated", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component that is animated when ScrollView is offset.", - "TextRangePattern.GetText": "Component that is animated when ScrollView is offset.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ScrollViewAnimated Component that is animated when ScrollView is offset.", - "TestId": "ScrollViewAnimated", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ScrollViewAnimated", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ScrollViewSimpleExample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ScrollViewSimpleExample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ScrollViewSimpleExample Component that enables scrolling through child components.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ScrollViewSimpleExample", - "TextRangePattern.GetText": "ScrollViewSimpleExample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component that enables scrolling through child components.", - "TextRangePattern.GetText": "Component that enables scrolling through child components.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ScrollViewSimpleExample Component that enables scrolling through child components.", - "TestId": "ScrollViewSimpleExample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ScrollViewSimpleExample", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "202, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "202, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Search Bar 1`] = ` -{ - "Automation Tree": { - "AutomationId": "explorer_search", - "ControlType": 50004, - "HelpText": "Search...", - "IsKeyboardFocusable": true, - "LocalizedControlType": "edit", - "Name": "Search...", - "TextRangePattern.GetText": "Search...", - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.WindowsTextInputComponentView", - "_Props": { - "TestId": "explorer_search", - }, - }, - "Visual Tree": { - "Comment": "explorer_search", - "Offset": "0, 0, 0", - "Size": "938, 35", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "0, 0, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "7, 0, 0", - "Size": "924, 1", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "-7, 0, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "-1, 7, 0", - "Size": "1, 21", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "-7, -7, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "7, -1, 0", - "Size": "924, 1", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "0, -7, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "0, 7, 0", - "Size": "1, 21", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(0, 0, 0, 255)", - }, - "Offset": "0, 0, 0", - "Opacity": 0, - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump SectionList 1`] = ` -{ - "Automation Tree": { - "AutomationId": "SectionList", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "SectionList Performant, scrollable list of data.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "SectionList", - "TextRangePattern.GetText": "SectionList", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Performant, scrollable list of data.", - "TextRangePattern.GetText": "Performant, scrollable list of data.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "SectionList Performant, scrollable list of data.", - "TestId": "SectionList", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "SectionList", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "86, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "86, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Share 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Share", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Share Share data with other Apps.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Share", - "TextRangePattern.GetText": "Share", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Share data with other Apps.", - "TextRangePattern.GetText": "Share data with other Apps.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Share Share data with other Apps.", - "TestId": "Share", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Share", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump SwipeableCard 1`] = ` -{ - "Automation Tree": { - "AutomationId": "SwipeableCard", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "SwipeableCard Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "SwipeableCard", - "TextRangePattern.GetText": "SwipeableCard", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - "TextRangePattern.GetText": "Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "SwipeableCard Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - "TestId": "SwipeableCard", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "SwipeableCard", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "118, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "118, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Switch 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Switch", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Switch Native boolean input", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Switch", - "TextRangePattern.GetText": "Switch", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Native boolean input", - "TextRangePattern.GetText": "Native boolean input", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Switch Native boolean input", - "TestId": "Switch", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Switch", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Text 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Text", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Text Base component for rendering styled text.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Text", - "TextRangePattern.GetText": "Text", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Base component for rendering styled text.", - "TextRangePattern.GetText": "Base component for rendering styled text.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Text Base component for rendering styled text.", - "TestId": "Text", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Text", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "32, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "32, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TextInput 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TextInput", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TextInput Single and multi-line text inputs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TextInput", - "TextRangePattern.GetText": "TextInput", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Single and multi-line text inputs.", - "TextRangePattern.GetText": "Single and multi-line text inputs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TextInput Single and multi-line text inputs.", - "TestId": "TextInput", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TextInput", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "74, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "74, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TextInputs with key prop 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TextInputs with key prop", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TextInputs with key prop Periodically render large number of TextInputs with key prop without a Runtime Error", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TextInputs with key prop", - "TextRangePattern.GetText": "TextInputs with key prop", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Periodically render large number of TextInputs with key prop without a Runtime Error", - "TextRangePattern.GetText": "Periodically render large number of TextInputs with key prop without a Runtime Error", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TextInputs with key prop Periodically render large number of TextInputs with key prop without a Runtime Error", - "TestId": "TextInputs with key prop", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TextInputs with key prop", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "195, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "195, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Timers 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Timers", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Timers A demonstration of Timers in React Native.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Timers", - "TextRangePattern.GetText": "Timers", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "A demonstration of Timers in React Native.", - "TextRangePattern.GetText": "A demonstration of Timers in React Native.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Timers A demonstration of Timers in React Native.", - "TestId": "Timers", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Timers", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "53, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "53, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Touchable* and onPress 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Touchable* and onPress", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Touchable* and onPress Touchable and onPress examples.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Touchable* and onPress", - "TextRangePattern.GetText": "Touchable* and onPress", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Touchable and onPress examples.", - "TextRangePattern.GetText": "Touchable and onPress examples.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Touchable* and onPress Touchable and onPress examples.", - "TestId": "Touchable* and onPress", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Touchable* and onPress", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TransferProperties 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TransferProperties", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TransferProperties Some tests that change the backing XAML element to see if transfer properties is working.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TransferProperties", - "TextRangePattern.GetText": "TransferProperties", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Some tests that change the backing XAML element to see if transfer properties is working.", - "TextRangePattern.GetText": "Some tests that change the backing XAML element to see if transfer properties is working.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TransferProperties Some tests that change the backing XAML element to see if transfer properties is working.", - "TestId": "TransferProperties", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TransferProperties", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "144, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "144, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Transforms 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Transforms", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Transforms View transforms", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Transforms", - "TextRangePattern.GetText": "Transforms", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "View transforms", - "TextRangePattern.GetText": "View transforms", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Transforms View transforms", - "TestId": "Transforms", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Transforms", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "87, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "87, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TransparentHitTestExample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TransparentHitTestExample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TransparentHitTestExample Transparent view receiving touch events", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TransparentHitTestExample", - "TextRangePattern.GetText": "TransparentHitTestExample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Transparent view receiving touch events", - "TextRangePattern.GetText": "Transparent view receiving touch events", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TransparentHitTestExample Transparent view receiving touch events", - "TestId": "TransparentHitTestExample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TransparentHitTestExample", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "214, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "214, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TurboModule 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TurboModule", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TurboModule Usage of TurboModule", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TurboModule", - "TextRangePattern.GetText": "TurboModule", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of TurboModule", - "TextRangePattern.GetText": "Usage of TurboModule", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TurboModule Usage of TurboModule", - "TestId": "TurboModule", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TurboModule", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "109, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "109, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump URL 1`] = ` -{ - "Automation Tree": { - "AutomationId": "URL", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "URL URL Parameters test", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "URL", - "TextRangePattern.GetText": "URL", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "URL Parameters test", - "TextRangePattern.GetText": "URL Parameters test", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "URL URL Parameters test", - "TestId": "URL", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "URL", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "32, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "32, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump View 1`] = ` -{ - "Automation Tree": { - "AutomationId": "View", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "View Basic building block of all UI, examples that demonstrate some of the many styles available.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "View", - "TextRangePattern.GetText": "View", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Basic building block of all UI, examples that demonstrate some of the many styles available.", - "TextRangePattern.GetText": "Basic building block of all UI, examples that demonstrate some of the many styles available.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "View Basic building block of all UI, examples that demonstrate some of the many styles available.", - "TestId": "View", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "View", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "38, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "38, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump WebSocket 1`] = ` -{ - "Automation Tree": { - "AutomationId": "WebSocket", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "WebSocket WebSocket API", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "WebSocket", - "TextRangePattern.GetText": "WebSocket", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "WebSocket API", - "TextRangePattern.GetText": "WebSocket API", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "WebSocket WebSocket API", - "TestId": "WebSocket", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "WebSocket", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "89, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "89, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump XMLHttpRequest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "XMLHttpRequest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "XMLHttpRequest Example that demonstrates upload and download requests using XMLHttpRequest.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "XMLHttpRequest", - "TextRangePattern.GetText": "XMLHttpRequest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Example that demonstrates upload and download requests using XMLHttpRequest.", - "TextRangePattern.GetText": "Example that demonstrates upload and download requests using XMLHttpRequest.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "XMLHttpRequest Example that demonstrates upload and download requests using XMLHttpRequest.", - "TestId": "XMLHttpRequest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "XMLHttpRequest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Xaml WinUI3 (Experimental, for Fabric) 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Xaml WinUI3 (Experimental, for Fabric)", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Xaml WinUI3 (Experimental, for Fabric) Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Xaml WinUI3 (Experimental, for Fabric)", - "TextRangePattern.GetText": "Xaml WinUI3 (Experimental, for Fabric)", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - "TextRangePattern.GetText": "Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Xaml WinUI3 (Experimental, for Fabric) Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - "TestId": "Xaml WinUI3 (Experimental, for Fabric)", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Xaml WinUI3 (Experimental, for Fabric)", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "305, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "305, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; From 2f4d578f94d674331db6a52e5c2157a04d12b62d Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Tue, 28 Apr 2026 13:23:34 -0700 Subject: [PATCH 3/7] Fixed the searchBox helper --- .../test/AccessibilityTest.test.ts | 9 +++++++-- .../test/ButtonComponentTest.test.ts | 9 +++++++-- .../test/FlatListComponentTest.test.ts | 15 +++++++++++---- .../test/PointerButtonComponentTest.test.ts | 9 +++++++-- .../test/RNTesterNavigation.ts | 9 +++++++-- .../test/SwitchComponentTest.test.ts | 9 +++++++-- .../test/TextInputComponentTest.test.ts | 9 +++++++-- .../test/TouchableComponentTest.test.ts | 9 +++++++-- .../test/ViewComponentTest.test.ts | 9 +++++++-- 9 files changed, 67 insertions(+), 20 deletions(-) diff --git a/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts b/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts index d27af11844f..96f736e9a56 100644 --- a/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts +++ b/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts @@ -25,12 +25,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts b/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts index f7b85df5c53..fd9abdc12b7 100644 --- a/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts @@ -26,6 +26,11 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); if (input === '') { return (await searchBox.getText()) === 'Search...'; @@ -34,8 +39,8 @@ const searchBox = async (input: string) => { } }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts b/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts index 727e622c0fd..abd73223c29 100644 --- a/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts @@ -28,12 +28,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); @@ -43,12 +48,14 @@ const searchBoxBasic = async (input: string) => { const searchBox = await app.findElementByTestID('search_bar_flat_list'); await app.waitUntil( async () => { + // See comment in searchBox above for the clearValue rationale. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts b/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts index 4271a2ab1f5..8dd39a6d4ae 100644 --- a/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts @@ -25,6 +25,11 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); if (input === '') { return (await searchBox.getText()) === 'Search...'; @@ -33,8 +38,8 @@ const searchBox = async (input: string) => { } }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts b/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts index 55675930e59..ad47a345ab2 100644 --- a/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts +++ b/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts @@ -37,12 +37,17 @@ async function goToExample(example: string) { await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(searchString); return (await searchBox.getText()) === searchString; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts b/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts index 3f40bae68db..52ed66566a7 100644 --- a/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts @@ -14,12 +14,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts b/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts index 1894a4bca81..aaafde483fe 100644 --- a/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts @@ -25,12 +25,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces "onPressInonPressIn" + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts b/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts index ba1f75fbcc4..d85e49832e2 100644 --- a/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts @@ -25,6 +25,11 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); if (input === '') { return (await searchBox.getText()) === 'Search...'; @@ -32,8 +37,8 @@ const searchBox = async (input: string) => { return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts b/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts index 4b6e7574fe6..feb22ef646f 100644 --- a/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts @@ -25,12 +25,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesised keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); From 1bf02486399445b34173cb8beef724b204e47c18 Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Tue, 28 Apr 2026 13:52:58 -0700 Subject: [PATCH 4/7] Use American English --- .ado/jobs/e2e-test.yml | 2 +- packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts | 2 +- packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts | 2 +- packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts | 2 +- .../e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts | 2 +- packages/e2e-test-app-fabric/test/RNTesterNavigation.ts | 2 +- packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts | 2 +- .../e2e-test-app-fabric/test/TextInputComponentTest.test.ts | 2 +- .../e2e-test-app-fabric/test/TouchableComponentTest.test.ts | 2 +- packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.ado/jobs/e2e-test.yml b/.ado/jobs/e2e-test.yml index c427de889df..d6c9d3b3e18 100644 --- a/.ado/jobs/e2e-test.yml +++ b/.ado/jobs/e2e-test.yml @@ -170,7 +170,7 @@ jobs: # written directly at the root were observed to disappear during # the long `Update snapshots` step that runs after a failed test; # files in a subfolder survive. We don't know which agent - # behaviour deletes them — Defender, a 1ES cleanup script, or a + # behavior deletes them — Defender, a 1ES cleanup script, or a # side-effect of `yarn e2etest -u` — but a subfolder evades it. - pwsh: | $procDump = Join-Path "$(ProcDumpPath)" 'procdump64.exe' diff --git a/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts b/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts index 96f736e9a56..a8d0a55285b 100644 --- a/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts +++ b/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts @@ -26,7 +26,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts b/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts index fd9abdc12b7..854db2a5e9c 100644 --- a/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts @@ -27,7 +27,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts b/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts index abd73223c29..b52afe565a3 100644 --- a/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts @@ -29,7 +29,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts b/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts index 8dd39a6d4ae..53ac332fb4b 100644 --- a/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts @@ -26,7 +26,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts b/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts index ad47a345ab2..268cfcc964a 100644 --- a/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts +++ b/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts @@ -38,7 +38,7 @@ async function goToExample(example: string) { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts b/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts index 52ed66566a7..21bfd242c55 100644 --- a/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts @@ -15,7 +15,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts b/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts index aaafde483fe..b065057aab0 100644 --- a/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts @@ -26,7 +26,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces "onPressInonPressIn" // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts b/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts index d85e49832e2..e17447c4d0e 100644 --- a/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts @@ -26,7 +26,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); diff --git a/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts b/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts index feb22ef646f..6c2bd33c6df 100644 --- a/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts @@ -26,7 +26,7 @@ const searchBox = async (input: string) => { await app.waitUntil( async () => { // Clear before each attempt: WinAppDriver's setValue can fall back to - // synthesised keystrokes for custom RN TextInputs, which append rather + // synthesized keystrokes for custom RN TextInputs, which append rather // than replace. Without the clear, a retry produces concatenated text // and the comparison never converges. await searchBox.clearValue(); From c79bc33672c541be4271e83950bbf8e590359e00 Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Tue, 28 Apr 2026 14:01:19 -0700 Subject: [PATCH 5/7] Use en-US for spelling --- .cspell.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index d2973503eb1..9402ff8bb0a 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,7 +1,10 @@ // cSpell Settings { "version": "0.2", - "language": "en", + // American English. The broader "en" accepts both British and American + // spellings; "en-US" flags British forms (synthesised, behaviour, etc.) + // so contributors and AI assistants don't drift away from US conventions. + "language": "en-US", "dictionaryDefinitions": [ { "name": "project-words", From 085a3e61290447ebe96a70396fe24141a22abd71 Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Tue, 28 Apr 2026 14:54:27 -0700 Subject: [PATCH 6/7] Remove old PR description file --- .../e2e-test-app-fabric/PR_DESCRIPTION.md | 359 ------------------ 1 file changed, 359 deletions(-) delete mode 100644 packages/e2e-test-app-fabric/PR_DESCRIPTION.md diff --git a/packages/e2e-test-app-fabric/PR_DESCRIPTION.md b/packages/e2e-test-app-fabric/PR_DESCRIPTION.md deleted file mode 100644 index 8ac05d6fbf5..00000000000 --- a/packages/e2e-test-app-fabric/PR_DESCRIPTION.md +++ /dev/null @@ -1,359 +0,0 @@ -# Component Performance Tests for React Native Windows (Fabric) - -## Summary - -Adds a comprehensive performance testing framework and 14 component-level perf test suites (147 tests total) for RNW Fabric components. Each test measures mount, unmount, and re-render times and records baselines via snapshot matching. - -## Why - -RNW Fabric had no automated way to catch render performance regressions in core components. This adds baseline-tracked perf tests so regressions are caught before merge. - -## What's Included - -### Perf Testing Framework (`@react-native-windows/perf-testing`) - -| Module | Purpose | -|---|---| -| `ComponentPerfTestBase` | Abstract base class — components provide props/scenarios, framework handles measurement | -| `measurePerf()` | Core timing engine using `React.Profiler` | -| `toMatchPerfSnapshot()` | Custom Jest matcher — compares results against `.perf-baseline.json` snapshots | -| `PerfProfiler` | React wrapper that captures `actualDuration` from Profiler callbacks | -| `snapshotManager` | Reads/writes/updates baseline JSON files | -| Threshold presets | `strict`, `standard`, `relaxed`, `ci` — configurable tolerance bands | -| Scenarios | `MountScenario`, `UnmountScenario`, `RerenderScenario` | -| Reporters | `ConsoleReporter`, `MarkdownReporter`, `PerfJsonReporter` | -| CI utilities | `BaselineComparator` for CI regression detection | - -### Component Test Suites (14 suites, 147 tests) - -| Category | Component | Tests | Key Scenarios | -|---|---|---|---| -| **Core** | View | 8 | default, nested, styled, accessible, nativeID, testID, pointerEvents, **stress-views-500** | -| | Text | 7 | default, long text, nested, styled, selectable, accessible, **multiple-text-100** | -| | TextInput | 7 | default, placeholder, multiline, secure, styled, accessible, **multiple-text-inputs-100** | -| | Button | 9 | default, colored, disabled, accessible, long title, custom a11y, styled container, all props, **multiple-buttons-100** | -| | Image | 11 | default, remote URI, sized, resizeMode, accessible, tinted, background, blurred, multiple sources, all props, **multiple-images-100** | -| | ScrollView | 11 | default, horizontal, many children, pagingEnabled, styled, accessible, stickyHeaders, nestedScroll, invertedStickyHeaders, contentInset, **with-children-500** | -| | Switch | 11 | default, enabled-on, disabled, custom colors, accessible, styled, ios_backgroundColor, all props, toggled-on, toggled-off, **multiple-switches-100** | -| | Modal | 9 | default, visible, transparent, slide, fade, fullscreen, accessible, onShow, all props | -| | ActivityIndicator | 11 | default, animating, large, custom color, small, styled, accessible, non-animating, custom size, all props, **multiple-indicators-100** | -| **Interactive** | Pressable | 11 | default, disabled, styled, accessible, pressed-style, ripple, hitSlop, delayLongPress, unstable_pressDelay, all props, **multiple-pressables-100** | -| | TouchableOpacity | 12 | default, active-opacity, disabled, styled, accessible, long-press, press-in/out, hitSlop, custom-a11y, all-props, focus, **multiple-touchables-100** | -| | TouchableHighlight | 12 | default, custom-underlay, opacity, disabled, styled, accessible, long-press, show/hide-underlay, hitSlop, all-props, focus, **multiple-touchables-100** | -| **Lists** | FlatList | 14 | 10/100/500/***1000*** items, horizontal, separator, header+footer, empty, getItemLayout, inverted, numColumns(3), sections | -| | SectionList | 14 | 3×5, 5×10, 10×20, 20×10, **50×20** sections, separators, header+footer, section-footer, sticky-headers, empty, inverted, renderSectionHeader, all-features | - -### CLI Generator - -`yarn perf:create -- --name=ComponentName` scaffolds a new `.perf-test.tsx` file with the correct structure, required props detection, and category selection. - -### Scripts - -- `yarn perf` — run all perf tests -- `yarn perf:update` — update baselines -- `yarn perf:create` — scaffold a new test - -## Folder Structure - -``` -packages/e2e-test-app-fabric/ -├── jest.perf.config.js # Jest config (maxWorkers:1, .perf-test pattern) -├── jest.perf.setup.ts # Test setup (registers toMatchPerfSnapshot matcher) -└── test/__perf__/ - ├── core/ # 9 core component tests - │ ├── View.perf-test.tsx - │ ├── Text.perf-test.tsx - │ ├── TextInput.perf-test.tsx - │ ├── Button.perf-test.tsx - │ ├── Image.perf-test.tsx - │ ├── ScrollView.perf-test.tsx - │ ├── Switch.perf-test.tsx - │ ├── Modal.perf-test.tsx - │ ├── ActivityIndicator.perf-test.tsx - │ └── __perf_snapshots__/ # Baseline JSONs (one per test) - ├── interactive/ # 3 interactive component tests - │ ├── Pressable.perf-test.tsx - │ ├── TouchableOpacity.perf-test.tsx - │ ├── TouchableHighlight.perf-test.tsx - │ └── __perf_snapshots__/ - └── list/ # 2 list component tests - ├── FlatList.perf-test.tsx - ├── SectionList.perf-test.tsx - └── __perf_snapshots__/ - -packages/@react-native-windows/perf-testing/src/ -├── index.ts # Public API exports -├── base/ -│ └── ComponentPerfTestBase.ts # Abstract base class for tests -├── core/ -│ ├── measurePerf.ts # Timing engine (React.Profiler + performance.now) -│ ├── PerfProfiler.tsx # React.Profiler wrapper -│ └── statistics.ts # mean, median, stdDev -├── interfaces/ -│ ├── IComponentPerfTest.ts # Test interface contract -│ ├── PerfMetrics.ts # Result shape -│ └── PerfThreshold.ts # Threshold config shape -├── matchers/ -│ ├── toMatchPerfSnapshot.ts # Custom Jest matcher -│ └── snapshotManager.ts # Baseline file read/write -├── scenarios/ -│ ├── MountScenario.ts -│ ├── UnmountScenario.ts -│ └── RerenderScenario.ts -├── config/ -│ ├── defaultConfig.ts # Default runs, warmup, thresholds -│ └── thresholdPresets.ts # strict / standard / relaxed / ci -├── reporters/ -│ ├── ConsoleReporter.ts # Terminal output -│ └── MarkdownReporter.ts # .md report generation -└── ci/ - ├── PerfJsonReporter.ts # JSON results for CI artifacts - └── BaselineComparator.ts # Regression detection - -vnext/Scripts/perf/ -├── create-perf-test.js # CLI scaffold generator (yarn perf:create) -├── compare-results.js # CI baseline comparison -└── post-pr-comment.js # GitHub PR comment poster -``` - -## Test Architecture - -``` -ComponentPerfTest extends ComponentPerfTestBase - ├── componentName() → 'FlatList' - ├── baseProps() → minimal valid props - ├── scenarios() → [{ name, props, description }] - └── (optional) renderChildren(), wrapComponent() - -measurePerf(test, scenario) - ├── renders via PerfProfiler - ├── captures actualDuration from React.Profiler - ├── runs mount / unmount / rerender cycles - └── returns PerfMetrics - -expect(metrics).toMatchPerfSnapshot() - ├── loads/creates .perf-baseline.json - ├── compares against thresholds - └── updates baseline when --updateSnapshot -``` - -## How to Run - -```bash -cd packages/e2e-test-app-fabric -yarn perf # all tests -yarn perf -- --testPathPattern=FlatList # single component -yarn perf:update # update all baselines -yarn perf:update --testPathPattern=TouchableHighlight # update one baseline -``` - -## Release Notes - -Added `@react-native-windows/perf-testing`, a component performance testing framework for RNW Fabric. Includes 147 perf tests across 14 components (View, Text, TextInput, Button, Image, ScrollView, Switch, Modal, ActivityIndicator, Pressable, TouchableOpacity, TouchableHighlight, FlatList, SectionList) measuring mount, unmount, and re-render times with snapshot-based baseline tracking. Run `yarn perf` to execute and `yarn perf:create` to scaffold tests for new components. - ---- - -## Statistical Stability Model - -Simple median-vs-median comparison is unreliable at millisecond scale — system noise causes random failures. We use three gates, each proven in production at scale: - -1. **CV Gate** — If coefficient of variation (`stdDev/mean`) exceeds threshold, the measurement is too noisy to compare; warn instead of fail. -2. **Mann-Whitney U Test** — Non-parametric rank-based hypothesis test on raw `durations[]`. Only flags a regression when the difference is statistically significant (p < 0.05), not just numerically larger. Chosen over t-test because perf data is rarely normally distributed. -3. **Gate / Track Mode** — Stable tests use `gate` (block CI). Inherently variable bulk scenarios use `track` (warn only, never block). - -### Industry References - -| Who | What | Link | -|---|---|---| -| **Google** | Chrome Catapult uses Mann-Whitney U in `getDifferenceSignificance()` to detect perf regressions across histogram samples | [chromium.googlesource.com/catapult — How to Write Metrics](https://chromium.googlesource.com/catapult/+/HEAD/docs/how-to-write-metrics.md) | -| **Microsoft** | BenchmarkDotNet uses CV-based noise detection and statistical significance gates to suppress unstable benchmark results | [benchmarkdotnet.org — How It Works](https://benchmarkdotnet.org/articles/guides/how-it-works.html) | -| **Meta** | React Profiler `actualDuration` provides component-level render timing — the same API this framework builds on | [react.dev — Profiler API](https://react.dev/reference/react/Profiler) | - ---- - -## Benchmark Gates & Regression Thresholds - -### How a regression is detected - -Every test result passes through this decision pipeline (in `toMatchPerfSnapshot` and `BaselineComparator`): - -``` -measured durations[] - │ - ▼ - CV > maxCV? ──yes──▶ SKIP (too noisy to judge) → warn only - │ no - ▼ - Mann-Whitney U - p ≥ 0.05? ──yes──▶ PASS (not statistically significant) - │ no - ▼ - % change > maxDurationIncrease% - AND absolute Δ > minAbsoluteDelta ms?i - │ - yes │ no - ▼ ▼ - mode? PASS - │ - gate ──▶ FAIL CI - track ─▶ WARN only -``` - -Both the **percentage** and **absolute delta** gates must trip simultaneously. This prevents a 1 ms → 2 ms jump (100 % but only 1 ms) from blocking CI. - -### Threshold Presets - -| Preset | Max Regression | Min Δ (ms) | Max Renders | Min Runs | Max CV | Mode | -|--------|---------------|------------|-------------|----------|--------|------| -| **core** | 10 % | 3 | 2 | 10 | 0.40 | gate | -| **list** | 15 % | 5 | 5 | 5 | 0.50 | gate | -| **interactive** | 20 % | 5 | 10 | 10 | 0.50 | gate | -| **community** | 25 % | 5 | 15 | 5 | 0.60 | track | -| **default** | 10 % | 3 | 5 | 10 | 0.50 | gate | - -### Per-Component Benchmark Map - -Tests use the **default** threshold (10 % / 3 ms / gate) unless stated otherwise. The table below lists every scenario with its baseline median, the effective gate, and the absolute delta floor. - -#### Core Components (9 suites) - -| Component | Scenario | Baseline (ms) | Max Regression | Min Δ (ms) | Notes | -|---|---|---:|---|---:|---| -| **View** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0 | 10 % | 3 | | -| | nested-views-50 | 4 | **15 %** | **5** | heavier DOM | -| | nested-views-100 | 7 | **15 %** | **5** | heavier DOM | -| | **stress-views-500** | **10** | **10 %** | **10** | **stress gate** | -| | with-shadow | 0 | 10 % | 3 | | -| | with-border-radius | 0 | 10 % | 3 | | -| **Text** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0 | 10 % | 3 | | -| | long-text-1000 | 0 | 10 % | 3 | | -| | nested-text | 0 | 10 % | 3 | | -| | styled-text | 0 | 10 % | 3 | | -| | **multiple-text-100** | **7** | **10 %** | **10** | **stress gate** | -| **Image** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0 | 10 % | 3 | | -| | with-resize-mode | 0 | 10 % | 3 | | -| | with-border-radius | 0 | 10 % | 3 | | -| | with-tint-color | 0 | 10 % | 3 | | -| | with-blur-radius | 0 | 10 % | 3 | | -| | with-accessibility | 0 | 10 % | 3 | | -| | multiple-images-10 | 1 | 10 % | **5** | bulk noise | -| | multiple-images-50 | 4 | **15 %** | **5** | bulk noise | -| | **multiple-images-100** | **8** | **10 %** | **10** | **stress gate** | -| **TextInput** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0 | 10 % | 3 | | -| | multiline | 0 | 10 % | 3 | | -| | with-value | 0 | 10 % | 3 | | -| | styled-input | 0 | 10 % | 3 | | -| | **multiple-text-inputs-100** | **7** | **10 %** | **10** | **stress gate** | -| **Switch** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0 | 10 % | 3 | | -| | disabled | 0.5 | 10 % | 3 | | -| | custom-colors | 0 | 10 % | 3 | | -| | multiple-switches-10 | 1 | 10 % | **5** | bulk noise | -| | multiple-switches-50 | 8 | **15 %** | **5** | bulk noise | -| | **multiple-switches-100** | **16** | **10 %** | **10** | **stress gate** | -| **Button** | mount | 1 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 1 | 10 % | 3 | | -| | disabled | 1 | 10 % | 3 | | -| | with-color | 1 | 10 % | 3 | | -| | with-accessibility | 1 | 10 % | 3 | | -| | multiple-buttons-10 | 5 | 10 % | **5** | bulk noise | -| | multiple-buttons-50 | 26 | **15 %** | **5** | bulk noise | -| | **multiple-buttons-100** | **19** | **10 %** | **10** | **stress gate** | -| **ActivityIndicator** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0 | 10 % | 3 | | -| | multiple-indicators-10 | 1 | 10 % | **5** | bulk noise | -| | multiple-indicators-50 | 4 | **15 %** | **5** | bulk noise | -| | **multiple-indicators-100** | **7** | **10 %** | **10** | **stress gate** | -| **ScrollView** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0.5 | 10 % | 3 | | -| | with-children-20 | 3 | 10 % | 3 | | -| | with-children-100 | 15 | **15 %** | **5** | heavy | -| | horizontal | 3 | 10 % | 3 | | -| | sticky-headers | 3 | 10 % | 3 | | -| | nested-scroll-views | 1 | 10 % | **5** | | -| | **with-children-500** | **19** | **10 %** | **10** | **stress gate** | -| **Modal** | mount | 0 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 0.5 | 10 % | 3 | | -| | with-rich-content | 2 | 10 % | 3 | | - -#### Interactive Components (3 suites) - -| Component | Scenario | Baseline (ms) | Max Regression | Min Δ (ms) | Notes | -|---|---|---:|---|---:|---| -| **Pressable** | mount | 0.5 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 1 | 10 % | 3 | | -| | nested-pressables | 1 | 10 % | 3 | | -| | multiple-pressables-10 | 3 | 10 % | **5** | bulk noise | -| | multiple-pressables-50 | 15 | **15 %** | **5** | bulk noise | -| | **multiple-pressables-100** | **12** | **10 %** | **10** | **stress gate** | -| **TouchableOpacity** | mount | 1 | 10 % | 3 | | -| | rerender | 1.5 | 10 % | 3 | | -| | nested-touchables | 1.5 | 10 % | 3 | | -| | multiple-touchables-10 | 6 | 10 % | **5** | bulk noise | -| | multiple-touchables-50 | 29 | **15 %** | **5** | bulk noise | -| | **multiple-touchables-100** | **30** | **10 %** | **10** | **stress gate** | -| **TouchableHighlight** | mount | 1 | 10 % | 3 | | -| | rerender | 0.5 | 10 % | 3 | | -| | nested-touchables | 1 | 10 % | 3 | | -| | multiple-touchables-10 | 2 | 10 % | **5** | bulk noise | -| | multiple-touchables-50 | 12.5 | **15 %** | **5** | bulk noise | -| | **multiple-touchables-100** | **22.5** | **10 %** | **10** | **stress gate** | - -#### List Components (2 suites) - -| Component | Scenario | Baseline (ms) | Max Regression | Min Δ (ms) | Notes | -|---|---|---:|---|---:|---| -| **FlatList** | mount | 4 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 9 | 10 % | 3 | | -| | with-10-items | 4 | 10 % | 3 | | -| | with-100-items | 5 | 10 % | **5** | | -| | with-500-items | 5 | **15 %** | **10** | large list | -| | horizontal | 4.5 | 10 % | **5** | | -| | with-separator | 6 | 10 % | **5** | | -| | with-header-footer | 2 | 10 % | **5** | | -| | with-empty-list | 1 | 10 % | 3 | | -| | with-get-item-layout | 2 | 10 % | **5** | | -| | inverted | 2 | 10 % | **5** | | -| | **with-1000-items** | **4** | **15 %** | **10** | **stress gate (virtualized)** | -| | with-num-columns | 3 | 10 % | **5** | | -| **SectionList** | mount | 5 | 10 % | 3 | | -| | unmount | 0 | 10 % | 3 | | -| | rerender | 11 | 10 % | 3 | | -| | 3-sections × 5-items | 5 | 10 % | **5** | | -| | 5-sections × 10-items | 6 | 10 % | **5** | | -| | 10-sections × 20-items | 5.5 | **15 %** | **10** | 200 items | -| | 20-sections × 10-items | 5.5 | **15 %** | **10** | 200 items | -| | with-section-separator | — | 10 % | **5** | | -| | with-item-separator | — | 10 % | **5** | | -| | with-header-footer | — | 10 % | **5** | | -| | with-section-footer | — | 10 % | **5** | | -| | sticky-section-headers | — | 10 % | **5** | | -| | **with-50-sections-20-items** | **2** | **15 %** | **10** | **stress gate (virtualized)** | -| | with-empty-list | 0 | 10 % | 3 | | - -### Why these numbers? - -| Design choice | Rationale | -|---|---| -| **10 % default gate** | Sub-millisecond components need tight gates — a 0 ms→1 ms jump is ∞ % but only 1 ms. The 3 ms absolute floor prevents that from failing. The 10 % gate catches meaningful shifts in the 5-30 ms range. | -| **15 % for bulk/heavy scenarios** | Rendering 50-100+ elements has inherently higher variance from GC pauses, thread scheduling. A tighter gate would flake. | -| **3 ms vs 5 ms vs 10 ms absolute floors** | Simple atoms (View, Text) fluctuate < 1 ms — a 3 ms floor is plenty. Bulk scenarios with σ > 1 ms need a 5 ms floor. 500-item lists need 10 ms to avoid noise trips. | -| **Max CV 0.40-0.50** | If stdDev/mean > 0.50 the measurement is too noisy to compare. The Mann-Whitney U test still runs but the CV gate warns first. Core preset is stricter (0.40) because simple components should be stable. | -| **gate vs track** | All first-party components use `gate` (fail CI). The `community` preset exists for third-party components where the team can monitor trends without blocking PRs. | -| **Mann-Whitney over t-test** | Render times are right-skewed (occasional GC spikes), not normally distributed. Mann-Whitney is distribution-free and rank-based — proven in Google Catapult for exactly this use case. | -| **Min 10 runs** | At n=10, Mann-Whitney achieves α=0.05 with power ≈ 0.80 for medium effect sizes. Fewer runs increase false-negative risk. List tests allow 5 runs because each run is expensive. | From 7f06f056c7a0e741192d7e33fa7b88dfd56b6d4b Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Tue, 28 Apr 2026 17:15:40 -0700 Subject: [PATCH 7/7] Retry 2 times in case of yarn or lage flakiness --- .ado/build-template.yml | 2 ++ .ado/prepare-release-bot.yml | 2 ++ .ado/templates/react-native-init-windows.yml | 2 ++ .ado/templates/strict-yarn-install.yml | 1 + .ado/templates/yarn-install.yml | 2 ++ 5 files changed, 9 insertions(+) diff --git a/.ado/build-template.yml b/.ado/build-template.yml index 43a3cb1dccd..0caad2c6ece 100644 --- a/.ado/build-template.yml +++ b/.ado/build-template.yml @@ -176,10 +176,12 @@ extends: - script: npx --yes midgard-yarn-strict@1.2.4 @rnw-scripts/beachball-config displayName: Strict yarn install @rnw-scripts/beachball-config condition: and(succeeded(), eq(variables['detectScenario.isReleaseBuild'], 'False')) + retryCountOnTaskFailure: 2 - script: npx lage build --scope @rnw-scripts/prepare-release --scope @rnw-scripts/beachball-config displayName: Build prepare-release and beachball-config condition: and(succeeded(), eq(variables['detectScenario.isReleaseBuild'], 'False')) + retryCountOnTaskFailure: 2 # 5. Beachball check (Developer PR only) - pwsh: npx beachball check --branch "origin/$env:BEACHBALL_BRANCH" --verbose --changehint "##vso[task.logissue type=error]Run 'yarn change' from root of repo to generate a change file." diff --git a/.ado/prepare-release-bot.yml b/.ado/prepare-release-bot.yml index 8ec0586c128..b556080e064 100644 --- a/.ado/prepare-release-bot.yml +++ b/.ado/prepare-release-bot.yml @@ -62,9 +62,11 @@ jobs: - script: npx --yes midgard-yarn@1.23.34 --ignore-scripts --frozen-lockfile displayName: yarn install + retryCountOnTaskFailure: 2 - script: npx lage build --scope @rnw-scripts/prepare-release --scope @rnw-scripts/beachball-config displayName: Build prepare-release and dependencies + retryCountOnTaskFailure: 2 - ${{ if ne(parameters.targetBranch, '(source branch)') }}: - pwsh: Write-Host "##vso[task.setvariable variable=TargetBranch]${{ parameters.targetBranch }}" diff --git a/.ado/templates/react-native-init-windows.yml b/.ado/templates/react-native-init-windows.yml index 14419878b0f..df8113acc30 100644 --- a/.ado/templates/react-native-init-windows.yml +++ b/.ado/templates/react-native-init-windows.yml @@ -49,6 +49,7 @@ steps: $(Build.SourcesDirectory)\vnext\Scripts\creaternwapp.cmd /rn $(reactNativeDevDependency) /rnw $(npmVersion) /t ${{ parameters.template }} /verdaccio testcli displayName: Init new app project with creaternwapp.cmd workingDirectory: $(Agent.BuildDirectory) + retryCountOnTaskFailure: 2 env: YARN_ENABLE_IMMUTABLE_INSTALLS: false @@ -57,6 +58,7 @@ steps: $(Build.SourcesDirectory)\vnext\Scripts\creaternwlib.cmd /rn $(reactNativeDevDependency) /rnw $(npmVersion) /t ${{ parameters.template }} /verdaccio testcli displayName: Init new lib project with creaternwlib.cmd workingDirectory: $(Agent.BuildDirectory) + retryCountOnTaskFailure: 2 env: YARN_ENABLE_IMMUTABLE_INSTALLS: false diff --git a/.ado/templates/strict-yarn-install.yml b/.ado/templates/strict-yarn-install.yml index 0faa7454083..98985b46871 100644 --- a/.ado/templates/strict-yarn-install.yml +++ b/.ado/templates/strict-yarn-install.yml @@ -13,3 +13,4 @@ steps: - script: npx --yes midgard-yarn-strict@1.2.4 ${{ parameters.workspace }} displayName: Strict yarn install ${{ parameters.workspace }} + retryCountOnTaskFailure: 2 diff --git a/.ado/templates/yarn-install.yml b/.ado/templates/yarn-install.yml index 74d3d6757dc..b2f3270cea9 100644 --- a/.ado/templates/yarn-install.yml +++ b/.ado/templates/yarn-install.yml @@ -15,9 +15,11 @@ steps: - ${{ if eq(parameters.agentImage, 'ManagedImage') }}: - script: midgard-yarn --ignore-scripts --frozen-lockfile --cwd ${{ parameters.workingDirectory }} displayName: midgard-yarn (faster yarn install) + retryCountOnTaskFailure: 2 # If using an image we don't control, acquire a fixed version of midgard-yarn # before install - ${{ else }}: - script: npx --yes midgard-yarn@1.23.34 --ignore-scripts --frozen-lockfile --cwd ${{ parameters.workingDirectory }} displayName: midgard-yarn (faster yarn install) + retryCountOnTaskFailure: 2