From 61214b4aa6fac6ce8ed9cc5a960899b90fd1093e Mon Sep 17 00:00:00 2001 From: PatrykLs98 Date: Fri, 14 Aug 2026 16:34:15 +0200 Subject: [PATCH 1/4] Updated tests and Added new # Conflicts: # tests/FileManager.UiTests/FileOperationUiTests.cs # tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs # tests/FileManager.UiTests/Infrastructure/NativeCommands.cs # tests/FileManager.UiTests/NativeSafetyRegressionTests.cs # tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json # tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props # tests/FileManager.UiTests/obj/project.assets.json # tests/FileManager.UiTests/obj/project.nuget.cache --- src/app_entry.cpp | 2 + src/app_globals.cpp | 2 + src/consts.h | 7 + src/mainwnd_messages.cpp | 49 + src/plugins.h | 3 + src/plugins_interface.cpp | 32 + src/regwork.cpp | 20 +- src/regwork.h | 6 +- tests/FileManager.UiTests/BasicUiTests.cs | 18 +- .../ConfigurationRecoveryUiTests.cs | 116 +- .../FileOperationUiTests.cs | 21 +- .../Infrastructure/FileManagerUiTestBase.cs | 373 ++- .../Infrastructure/FileOperationUiTestBase.cs | 131 +- .../Infrastructure/NativeCommands.cs | 307 +- .../Infrastructure/UiTestSettings.cs | 36 +- .../NativeSafetyRegressionTests.cs | 17 +- ...perationRecoveryCharacterizationUiTests.cs | 12 +- tests/FileManager.UiTests/README.md | 29 +- .../ReparsePointTopologyUiTests.cs | 16 +- .../ReportedDefectCharacterizationUiTests.cs | 270 ++ .../SChannelTlsIntegrationTests.cs | 77 +- .../ToolbarIconSizeUiTests.cs | 14 +- ...leManager.UiTests.csproj.nuget.dgspec.json | 102 + .../FileManager.UiTests.csproj.nuget.g.props | 28 + .../obj/project.assets.json | 2490 +++++++++++++++++ .../obj/project.nuget.cache | 44 + 26 files changed, 3982 insertions(+), 240 deletions(-) create mode 100644 tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs create mode 100644 tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json create mode 100644 tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props create mode 100644 tests/FileManager.UiTests/obj/project.assets.json create mode 100644 tests/FileManager.UiTests/obj/project.nuget.cache diff --git a/src/app_entry.cpp b/src/app_entry.cpp index 9ba62ead..dbc65a66 100644 --- a/src/app_entry.cpp +++ b/src/app_entry.cpp @@ -3944,6 +3944,8 @@ MENU_TEMPLATE_ITEM MsgBoxButtons[] = // let the process list know we are running and have the main window (we can be activated for OnlyOneInstance) TaskList.SetProcessState(PROCESS_STATE_RUNNING, MainWindow->HWindow); + // Publish readiness after first-run language and plug-in work so isolated UI commands cannot race startup. + FileManagerUiStartupReady = TRUE; // pozadame Salmon o kontrolu, zda na disku nejsou stare bug reporty, ktere by bylo potreba odeslat SalmonCheckBugs(); diff --git a/src/app_globals.cpp b/src/app_globals.cpp index 14c1ad76..567c1700 100644 --- a/src/app_globals.cpp +++ b/src/app_globals.cpp @@ -30,6 +30,8 @@ BOOL SalamanderBusy = TRUE; // je Salamander busy? DWORD LastSalamanderIdleTime = 0; // GetTickCount() z okamziku, kdy SalamanderBusy naposledy presel na TRUE +// UI tests need a deterministic boundary later than main-window creation and first-run plug-in loading. +BOOL FileManagerUiStartupReady = FALSE; int PasteLinkIsRunning = 0; // if greater than zero, Past Shortcuts command is currently running in one of the panels diff --git a/src/consts.h b/src/consts.h index a4d962e2..d3caa583 100644 --- a/src/consts.h +++ b/src/consts.h @@ -1209,6 +1209,12 @@ struct COpenViewerData #define WM_USER_USERMENUICONS_READY WM_APP + 415 // [bkgndReaderData, threadID] - notification for main window that icon reading for User Menu in thread with ID 'threadID' has completed #define WM_USER_ALLOCATION_EMERGENCY WM_APP + 416 // [0, 0] - pre-registered allocation-failure notification; recovery runs on the UI thread +// The isolated UI runner uses these private messages to avoid racing startup or blocking on modal command handlers. +#define WM_USER_UI_TEST_READY WM_APP + 417 // [0, 0] returns TRUE only after startup reaches the running state +#define WM_USER_UI_TEST_COMMAND WM_APP + 418 // [command ID, 0] queues WM_COMMAND only for an isolated ready process +#define WM_USER_UI_TEST_CONFIG_GENERATION WM_APP + 419 // [0, 0] returns completed Configuration-handler count +#define WM_USER_UI_TEST_CONFIG_FAULT WM_APP + 420 // [write boundary, 0] arms only the next isolated configuration save +#define WM_USER_UI_TEST_FTP_ORGANIZE_COMMAND WM_APP + 421 // [0, 0] resolves the loaded FTP plug-in's host command ID // states for Shift+F1 help mode #define HELP_INACTIVE 0 // not in Shift+F1 help mode (must be 0) @@ -1702,6 +1708,7 @@ extern int RelExceptionHasOccured; // has any call of IUnknown method Releas extern BOOL SalamanderBusy; // is Salamander busy? extern DWORD LastSalamanderIdleTime; // GetTickCount() from the moment when SalamanderBusy last transitioned to TRUE +extern BOOL FileManagerUiStartupReady; // TRUE only after all synchronous startup and plug-in initialization is complete extern int PasteLinkIsRunning; // if greater than zero, Past Shortcuts command is running in one of the panels diff --git a/src/mainwnd_messages.cpp b/src/mainwnd_messages.cpp index 821d2284..188e9b64 100644 --- a/src/mainwnd_messages.cpp +++ b/src/mainwnd_messages.cpp @@ -72,6 +72,16 @@ const int MIN_WIN_WIDTH = 2; // minimal panel width extern BOOL CacheNextSetFocus; BOOL MainFrameIsActive = FALSE; +// Isolated UI tests use this generation to wait through persistence after Configuration dialog teardown. +static LONG FileManagerUiConfigurationGeneration = 0; + +static BOOL IsFileManagerUiTestControlEnabled() +{ + // Keep the private automation protocol inert for ordinary application launches. + char isolated[2]; + DWORD length = GetEnvironmentVariableA("FILEMANAGER_UI_ISOLATED", isolated, _countof(isolated)); + return length == 1 && isolated[0] == '1'; +} // code for testing time losses /* @@ -1659,6 +1669,8 @@ MENU_TEMPLATE_ITEM AddToSystemMenu[] = } EndStopRefresh(); // snooper starts again now + // Publish only after accepted changes have completed their synchronous SaveConfig call. + InterlockedIncrement(&FileManagerUiConfigurationGeneration); return 0; } @@ -1754,6 +1766,43 @@ MENU_TEMPLATE_ITEM AddToSystemMenu[] = // Command dispatch extracted to HandleWmCommand() in mainwnd_commands.cpp. return HandleWmCommand(wParam, lParam); + case WM_USER_UI_TEST_READY: + // The synchronous query acknowledges the exact native startup boundary to the isolated runner. + return IsFileManagerUiTestControlEnabled() && FileManagerUiStartupReady; + + case WM_USER_UI_TEST_COMMAND: + // Queue modal commands on the UI thread after acknowledging them, avoiding a cross-process SendMessage deadlock. + if (IsFileManagerUiTestControlEnabled() && FileManagerUiStartupReady) + { + // A left-panel refresh is non-modal and must complete before tests quick-search for newly created files. + if (lParam == 1 && wParam == CM_LEFTREFRESH) + { + SendMessage(HWindow, WM_COMMAND, wParam, 0); + return TRUE; // WM_COMMAND returns zero even when the synchronous refresh succeeds. + } + return PostMessage(HWindow, WM_COMMAND, wParam, lParam); + } + return FALSE; + + case WM_USER_UI_TEST_CONFIG_GENERATION: + // Expose completion only to the isolated runner; ordinary processes retain no automation surface. + return IsFileManagerUiTestControlEnabled() ? FileManagerUiConfigurationGeneration : 0; + + case WM_USER_UI_TEST_CONFIG_FAULT: + // Arm after startup so only the explicit recovery-test commit consumes the requested write boundary. + if (IsFileManagerUiTestControlEnabled() && FileManagerUiStartupReady && wParam > 0 && wParam <= LONG_MAX) + { + ArmNextConfigurationWriteFault((LONG)wParam); + return TRUE; + } + return FALSE; + + case WM_USER_UI_TEST_FTP_ORGANIZE_COMMAND: + // Resolve FTP's private command 7 through the host allocator only for an isolated, fully started test process. + if (IsFileManagerUiTestControlEnabled() && FileManagerUiStartupReady) + return Plugins.ResolveMenuItemCommandForTests(HWindow, "ftp\\ftp.spl", 7); + return 0; + case WM_USER_DISPACHCHANGENOTIF: { diff --git a/src/plugins.h b/src/plugins.h index f8058c51..7920c4ab 100644 --- a/src/plugins.h +++ b/src/plugins.h @@ -3114,6 +3114,9 @@ class CPlugins // 'parent' is the parent window for message boxes; returns TRUE if panel selection should be cleared BOOL ExecuteMenuItem(CFilesWindow* panel, HWND parent, int suid); + // Test control resolves a plug-in-owned ID only after normal menu allocation, avoiding a duplicated host command ID. + int ResolveMenuItemCommandForTests(HWND parent, const char* dllSuffix, int id); + // shows help for the menu command with the identifier 'suid' (WM_COMMAND in HelpMode) // 'parent' is the parent window for message boxes; returns TRUE if the help was shown BOOL HelpForMenuItem(HWND parent, int suid); diff --git a/src/plugins_interface.cpp b/src/plugins_interface.cpp index ba4dc7b9..3801de8e 100644 --- a/src/plugins_interface.cpp +++ b/src/plugins_interface.cpp @@ -977,6 +977,38 @@ BOOL CPlugins::ExecuteMenuItem(CFilesWindow* panel, HWND parent, int suid) return FALSE; } +int CPlugins::ResolveMenuItemCommandForTests(HWND parent, const char* dllSuffix, int id) +{ + CPluginData* pluginData = GetPluginDataFromSuffix(dllSuffix); + if (pluginData == NULL) + return 0; + + int pluginIndex = -1; + for (int i = 0; i < Data.Count; i++) + { + if (Data[i] == pluginData) + { + pluginIndex = i; + break; + } + } + if (pluginIndex == -1) + return 0; + + // Build the real plug-in submenu so the returned SUID follows the host's normal dynamic allocation path. + CMenuPopup menu(CML_PLUGINS_SUBMENU); + if (!InitPluginMenuItemsForBar(parent, pluginIndex, &menu)) + return 0; + + for (int i = 0; i < pluginData->MenuItems.Count; i++) + { + CPluginMenuItem* item = pluginData->MenuItems[i]; + if (item->ID == id) + return item->SUID; + } + return 0; +} + BOOL CPlugins::HelpForMenuItem(HWND parent, int suid) { BOOL helpDisplayed; diff --git a/src/regwork.cpp b/src/regwork.cpp index 069d9a07..b9a0f62c 100644 --- a/src/regwork.cpp +++ b/src/regwork.cpp @@ -16,6 +16,7 @@ CRegistryWorkerThread RegistryWorkerThread; static volatile LONG ConfigurationWriteFaultInjectionActive = 0; static volatile LONG ConfigurationWriteFaultAfter = 0; static volatile LONG ConfigurationWriteCount = 0; +static volatile LONG ConfigurationWriteFaultNextSaveAfter = 0; static std::string ConfigurationWriteFaultReport; // Environment variables are external input. Query their required length first @@ -98,19 +99,20 @@ void BeginConfigurationWriteFaultInjection() if (!IsIsolatedConfigurationFaultTest()) return; - std::string value; - if (ReadConfigurationFaultEnvironment("FILEMANAGER_CONFIG_FAULT_AFTER_WRITE", &value) == cferSuccess && - !value.empty()) - { - char* end; - LONG parsed = strtol(value.c_str(), &end, 10); - if (end != value.c_str() && *end == 0 && parsed > 0) - InterlockedExchange(&ConfigurationWriteFaultAfter, parsed); - } + // A UI-test command can arm the explicit commit after startup and cancel-dialog saves have completed. + LONG armedBoundary = InterlockedExchange(&ConfigurationWriteFaultNextSaveAfter, 0); + if (armedBoundary > 0) + InterlockedExchange(&ConfigurationWriteFaultAfter, armedBoundary); ReadConfigurationFaultEnvironment("FILEMANAGER_CONFIG_FAULT_REPORT", &ConfigurationWriteFaultReport); InterlockedExchange(&ConfigurationWriteFaultInjectionActive, 1); } +void ArmNextConfigurationWriteFault(LONG writeBoundary) +{ + // The private UI protocol validates isolation; one-shot state keeps unrelated later saves safe. + InterlockedExchange(&ConfigurationWriteFaultNextSaveAfter, writeBoundary > 0 ? writeBoundary : 0); +} + void EndConfigurationWriteFaultInjection() { if (InterlockedExchange(&ConfigurationWriteFaultInjectionActive, 0) == 0) diff --git a/src/regwork.h b/src/regwork.h index 0fa01a3a..5fb0d89a 100644 --- a/src/regwork.h +++ b/src/regwork.h @@ -20,11 +20,11 @@ BOOL GetValueDontCheckTypeAux(HKEY hKey, const char* name, void* buffer, DWORD b // Test-only crash injection for the transactional configuration writer. The scope is // inert unless FILEMANAGER_UI_ISOLATED=1 is present, so ordinary application launches -// cannot accidentally enable it. FILEMANAGER_CONFIG_FAULT_AFTER_WRITE terminates the -// process immediately after that successful registry mutation; FILEMANAGER_CONFIG_FAULT_REPORT -// receives the number of mutations in a completed save. +// cannot accidentally enable it. The private UI command selects the write boundary and +// FILEMANAGER_CONFIG_FAULT_REPORT receives the number of mutations in a completed save. void BeginConfigurationWriteFaultInjection(); void EndConfigurationWriteFaultInjection(); +void ArmNextConfigurationWriteFault(LONG writeBoundary); LONG FlushConfigurationRegistryKey(HKEY key); const DWORD CONFIGURATION_WRITE_FAULT_EXIT_CODE = 121; diff --git a/tests/FileManager.UiTests/BasicUiTests.cs b/tests/FileManager.UiTests/BasicUiTests.cs index 5ce25cef..bafddecc 100644 --- a/tests/FileManager.UiTests/BasicUiTests.cs +++ b/tests/FileManager.UiTests/BasicUiTests.cs @@ -55,7 +55,7 @@ private void AssertMainWindow() // Basic visibility and focus checks verify that UIA3 attached to the native top-level window. Assert.Multiple(() => { - Assert.That(MainWindow.Properties.NativeWindowHandle.Value, Is.Not.EqualTo(nint.Zero)); + Assert.That(MainWindowHandle, Is.Not.EqualTo(nint.Zero)); Assert.That(MainWindow.Title, Is.Not.Empty); Assert.That(MainWindow.IsEnabled, Is.True); Assert.That(MainWindow.BoundingRectangle.Width, Is.GreaterThan(0)); @@ -85,10 +85,18 @@ private void AssertConfigurationCommitPersistsAfterRestart() RestartFileManager(); var reloadedDialog = OpenConfigurationDialog(); - Assert.That(IsFirstConfigurationCheckBoxChecked(reloadedDialog), Is.EqualTo(!originalState), - "The configuration value was not retained after a committed dialog and restart."); - ToggleFirstConfigurationCheckBox(reloadedDialog); - CloseConfigurationDialog(reloadedDialog, commit: true); + try + { + Assert.That(IsFirstConfigurationCheckBoxChecked(reloadedDialog), Is.EqualTo(!originalState), + "The configuration value was not retained after a committed dialog and restart."); + } + finally + { + // Restore the incoming profile even when the persistence assertion fails, preventing repetition cascades. + if (IsFirstConfigurationCheckBoxChecked(reloadedDialog) != originalState) + ToggleFirstConfigurationCheckBox(reloadedDialog); + CloseConfigurationDialog(reloadedDialog, commit: true); + } } private void AssertFtpBookmarkCreationPersistsAfterRestart(int scenarioNumber) diff --git a/tests/FileManager.UiTests/ConfigurationRecoveryUiTests.cs b/tests/FileManager.UiTests/ConfigurationRecoveryUiTests.cs index 46638033..7e50dcec 100644 --- a/tests/FileManager.UiTests/ConfigurationRecoveryUiTests.cs +++ b/tests/FileManager.UiTests/ConfigurationRecoveryUiTests.cs @@ -1,4 +1,5 @@ using FileManager.UiTests.Infrastructure; +using Microsoft.Win32; using NUnit.Framework; namespace FileManager.UiTests; @@ -9,6 +10,8 @@ public sealed class ConfigurationRecoveryUiTests : FileManagerUiTestBase { // Keep this aligned with CONFIGURATION_WRITE_FAULT_EXIT_CODE in src/regwork.h. private const int ConfigurationWriteFaultExitCode = 121; + private const string ConfigurationRoot = @"Software\Open Salamander\6.0"; + private const string ConfigurationBackupRoot = ConfigurationRoot + ".backup.63A7CD13"; [Test] [Category("FaultInjection")] @@ -17,22 +20,30 @@ public void Every_interrupted_configuration_write_restores_a_complete_profile() UiTestSettings.RequireConfigurationFaultInjection(); var reportPath = Path.Combine(Path.GetTempPath(), $"filemanager-config-writes-{Guid.NewGuid():N}.txt"); + RegistryRootsSnapshot? baselineSnapshot = null; try { var baseline = ReadFirstConfigurationCheckBox(); CommitFirstConfigurationCheckBox(baseline); RestartFileManager(); Assert.That(ReadFirstConfigurationCheckBox(), Is.EqualTo(baseline), "The baseline configuration did not survive restart."); + // Freeze the complete host store only after a normal save and restart have validated the baseline. + baselineSnapshot = RegistryRootsSnapshot.Capture(ConfigurationRoot, ConfigurationBackupRoot); var candidate = !baseline; - var operationCount = MeasureConfigurationWriteBoundaries(baseline, candidate, reportPath); - RestoreBaseline(baseline); + var operationCount = UiTestSettings.LimitConfigurationFaultBoundaries( + MeasureConfigurationWriteBoundaries(baseline, candidate, reportPath)); for (var writeBoundary = 1; writeBoundary <= operationCount; writeBoundary++) - AssertRecoveryAtWriteBoundary(writeBoundary, baseline, candidate); + AssertRecoveryAtWriteBoundary(writeBoundary, baseline, candidate, baselineSnapshot); } finally { + if (baselineSnapshot is not null) + { + // Leave the disposable account at its verified pre-matrix state even when a boundary assertion fails. + StopCurrentApplication(baselineSnapshot.Restore); + } if (File.Exists(reportPath)) File.Delete(reportPath); } @@ -60,15 +71,16 @@ private int MeasureConfigurationWriteBoundaries(bool baseline, bool candidate, s return 0; } - private void AssertRecoveryAtWriteBoundary(int writeBoundary, bool baseline, bool candidate) + private void AssertRecoveryAtWriteBoundary(int writeBoundary, bool baseline, bool candidate, + RegistryRootsSnapshot baselineSnapshot) { - RestartFileManager(new Dictionary - { - ["FILEMANAGER_CONFIG_FAULT_AFTER_WRITE"] = writeBoundary.ToString(), - }); + // Every boundary starts from byte-for-byte equivalent registry state, independent of the preceding crash result. + RestartFileManager(afterPreviousApplicationStopped: baselineSnapshot.Restore); Assert.That(ReadFirstConfigurationCheckBox(), Is.EqualTo(baseline), $"Boundary {writeBoundary} did not begin from the complete baseline profile."); + // Arm only after the baseline dialog closes so its deferred command save cannot consume this trial. + NativeCommands.ArmNextConfigurationWriteFault(MainWindowHandle, writeBoundary); var dialog = OpenConfigurationDialog(); ToggleFirstConfigurationCheckBox(dialog); CommitConfigurationDialogWithoutWaiting(dialog); @@ -79,7 +91,6 @@ private void AssertRecoveryAtWriteBoundary(int writeBoundary, bool baseline, boo var restored = ReadFirstConfigurationCheckBox(); Assert.That(restored == baseline || restored == candidate, Is.True, $"Restart after write boundary {writeBoundary} exposed a mixed configuration profile."); - RestoreBaseline(baseline); } private bool ReadFirstConfigurationCheckBox() @@ -98,10 +109,89 @@ private void CommitFirstConfigurationCheckBox(bool expectedValue) CloseConfigurationDialog(dialog, commit: true); } - private void RestoreBaseline(bool baseline) + private sealed class RegistryRootsSnapshot { - CommitFirstConfigurationCheckBox(baseline); - RestartFileManager(); - Assert.That(ReadFirstConfigurationCheckBox(), Is.EqualTo(baseline), "The next fault trial did not start from a complete baseline profile."); + private readonly Dictionary roots; + + private RegistryRootsSnapshot(Dictionary roots) + { + this.roots = roots; + } + + internal static RegistryRootsSnapshot Capture(params string[] rootPaths) + { + using var currentUser = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64); + var roots = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var rootPath in rootPaths) + { + using var key = currentUser.OpenSubKey(rootPath, writable: false); + // Capture absence as well as content so stale recovery backups cannot leak into another boundary. + roots[rootPath] = key is null ? null : RegistryNode.Capture(key); + } + return new RegistryRootsSnapshot(roots); + } + + internal void Restore() + { + using var currentUser = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64); + foreach (var (rootPath, snapshot) in roots) + { + currentUser.DeleteSubKeyTree(rootPath, throwOnMissingSubKey: false); + if (snapshot is null) + continue; + + using var key = currentUser.CreateSubKey(rootPath, writable: true) + ?? throw new InvalidOperationException($"Could not recreate registry baseline '{rootPath}'."); + snapshot.Restore(key); + } + } + } + + private sealed class RegistryNode + { + private readonly Dictionary values = new(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary children = new(StringComparer.OrdinalIgnoreCase); + + internal static RegistryNode Capture(RegistryKey key) + { + var node = new RegistryNode(); + foreach (var valueName in key.GetValueNames()) + { + var value = key.GetValue(valueName, null, RegistryValueOptions.DoNotExpandEnvironmentNames) + ?? throw new InvalidOperationException($"Registry value '{key.Name}\\{valueName}' could not be captured."); + // Registry APIs return mutable arrays; clone them so the baseline remains immutable in memory. + node.values[valueName] = new RegistryValue(CloneRegistryValue(value), key.GetValueKind(valueName)); + } + + foreach (var childName in key.GetSubKeyNames()) + { + using var child = key.OpenSubKey(childName, writable: false) + ?? throw new InvalidOperationException($"Registry key '{key.Name}\\{childName}' could not be captured."); + node.children[childName] = Capture(child); + } + return node; + } + + internal void Restore(RegistryKey key) + { + foreach (var (valueName, value) in values) + key.SetValue(valueName, CloneRegistryValue(value.Data), value.Kind); + + foreach (var (childName, childSnapshot) in children) + { + using var child = key.CreateSubKey(childName, writable: true) + ?? throw new InvalidOperationException($"Could not recreate registry baseline '{key.Name}\\{childName}'."); + childSnapshot.Restore(child); + } + } + + private static object CloneRegistryValue(object value) => value switch + { + byte[] bytes => bytes.ToArray(), + string[] strings => strings.ToArray(), + _ => value, + }; + + private sealed record RegistryValue(object Data, RegistryValueKind Kind); } } diff --git a/tests/FileManager.UiTests/FileOperationUiTests.cs b/tests/FileManager.UiTests/FileOperationUiTests.cs index c49b46bb..6ee22dd8 100644 --- a/tests/FileManager.UiTests/FileOperationUiTests.cs +++ b/tests/FileManager.UiTests/FileOperationUiTests.cs @@ -12,6 +12,8 @@ public sealed class FileOperationUiTests : FileOperationUiTestBase public void Create_directory_creates_requested_nested_directory() { ExecuteWithPath(NativeCommands.CreateDirectory, string.Empty, "created\\nested", commit: true); + // A disposable profile may ask before creating the missing parent; the test owns that normal interaction. + ConfirmCreateDirectoryParentsIfPrompted(); WaitForFileSystem(() => Directory.Exists(Workspace.SourcePath("created\\nested")), "Create Directory did not create the requested nested directory."); @@ -253,13 +255,20 @@ public void Rename_case_only_change_preserves_the_file_and_updates_its_displayed public void Rename_overwrite_replaces_the_collision_without_losing_source_metadata() { var source = Workspace.SourcePath("rename-overwrite.txt"); + var target = Workspace.SourcePath("rename-overwrite-target.txt"); var expectedTimestamp = new DateTime(2023, 11, 03, 08, 15, 00, DateTimeKind.Utc); File.SetLastWriteTimeUtc(source, expectedTimestamp); + // Fail at fixture setup instead of timing out on a prompt when the panel-local collision is missing. + Assert.Multiple(() => + { + Assert.That(File.Exists(source), Is.True, "The rename source fixture is missing."); + Assert.That(File.Exists(target), Is.True, "The rename collision fixture is missing from the source panel."); + }); + ExecuteWithPath(NativeCommands.RenameFile, "rename-overwrite.txt", "rename-overwrite-target.txt", commit: true); ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES - var target = Workspace.SourcePath("rename-overwrite-target.txt"); WaitForFileSystem(() => File.ReadAllText(target) == "rename-overwrite-source-content", "Confirmed rename overwrite did not replace the collision target."); Assert.Multiple(() => @@ -359,7 +368,7 @@ public void Move_skip_all_retains_conflicting_sources_but_moves_nonconflicting_s public void Delete_file_removes_the_selected_file() { SelectSourceItem("delete-file.txt"); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, NativeCommands.DeleteFiles); + NativeCommands.Execute(MainWindowHandle, NativeCommands.DeleteFiles); ConfirmDeleteIfPrompted(); WaitForFileSystem(() => !File.Exists(Workspace.SourcePath("delete-file.txt")), "Delete did not remove the selected file."); @@ -369,7 +378,7 @@ public void Delete_file_removes_the_selected_file() public void Delete_directory_removes_all_descendants() { SelectSourceItem("delete-tree"); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, NativeCommands.DeleteFiles); + NativeCommands.Execute(MainWindowHandle, NativeCommands.DeleteFiles); ConfirmDeleteIfPrompted(); WaitForFileSystem(() => !Directory.Exists(Workspace.SourcePath("delete-tree")), "Delete did not remove the selected directory tree."); @@ -398,7 +407,7 @@ public void Delete_to_recycle_bin_removes_the_source_and_creates_a_recoverable_s var itemCountBefore = ShellRecycleBin.GetItemCount(volumeRoot); SelectSourceItem("recycle-file.txt"); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, NativeCommands.DeleteFiles); + NativeCommands.Execute(MainWindowHandle, NativeCommands.DeleteFiles); ConfirmDeleteIfPrompted(); WaitForFileSystem(() => !File.Exists(source), "Recycle-bin delete did not remove the source file."); @@ -490,8 +499,8 @@ public void Delete_skip_for_locked_file_keeps_it_and_continues_with_later_items( { // Handling the worker prompt prevents this case from passing merely because deletion has not completed yet. using var handle = Workspace.HoldSourceFileOpen("delete-locked.txt"); - SelectSourceItems("delete-locked.txt", "delete-z-after-skip.txt"); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, NativeCommands.DeleteFiles); + SelectSourceItem("delete-locked.txt"); + NativeCommands.Execute(MainWindowHandle, NativeCommands.DeleteFiles); ConfirmDeleteIfPrompted(); ChooseOperationPrompt(WaitForOperationPrompt(173), 173); // IDB_SKIP diff --git a/tests/FileManager.UiTests/Infrastructure/FileManagerUiTestBase.cs b/tests/FileManager.UiTests/Infrastructure/FileManagerUiTestBase.cs index 451bc983..39a1b055 100644 --- a/tests/FileManager.UiTests/Infrastructure/FileManagerUiTestBase.cs +++ b/tests/FileManager.UiTests/Infrastructure/FileManagerUiTestBase.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using FlaUI.Core; using FlaUI.Core.AutomationElements; +using FlaUI.Core.Definitions; using FlaUI.UIA3; using NUnit.Framework; @@ -9,11 +10,16 @@ namespace FileManager.UiTests.Infrastructure; [NonParallelizable] public abstract class FileManagerUiTestBase { + private const int ConfigurationCheckBoxId = 304; // IDC_CLEARREADONLY is persisted on the General page. private readonly List launchedApplications = []; + private readonly HashSet preexistingHelperProcessIds = []; + private long configurationGenerationBeforeOpen; protected UIA3Automation Automation { get; private set; } = null!; protected Application Application { get; private set; } = null!; protected Window MainWindow { get; private set; } = null!; + // Keep the authoritative HWND outside UIA so forced-exit recovery loops never query a disconnected COM element. + protected nint MainWindowHandle { get; private set; } protected virtual string ApplicationArguments => UiTestSettings.Arguments; @@ -21,61 +27,146 @@ public abstract class FileManagerUiTestBase public void StartFileManager() { UiTestSettings.RequireIsolatedProfile(); + // Snapshot helpers before launch so cleanup never terminates a process owned by another test or user session. + preexistingHelperProcessIds.Clear(); + foreach (var helper in Process.GetProcessesByName("salmon")) + { + using (helper) + preexistingHelperProcessIds.Add(helper.Id); + } Automation = new UIA3Automation(); - BeforeFileManagerStarted(); - StartApplication(); + try + { + BeforeFileManagerStarted(); + StartApplication(); + } + catch + { + // NUnit does not guarantee this fixture's TearDown after a failed SetUp, so release launched processes here. + CleanupFixture(); + throw; + } } [TearDown] public void StopFileManager() { - // Killing only processes launched by this fixture prevents a failed UI test from leaking instances. - foreach (var application in launchedApplications) + CleanupFixture(); + } + + private void CleanupFixture() + { + // Run every cleanup layer even if process shutdown or fixture-specific disposal reports a failure. + try { - if (!application.HasExited) - application.Kill(); - application.Dispose(); + StopLaunchedProcesses(); } + finally + { + try + { + OnAfterFileManagerStopped(); + } + finally + { + // Setup can intentionally skip before UIA3 is created when the isolated profile opt-in is absent. + Automation?.Dispose(); + } + } + } - OnAfterFileManagerStopped(); + private void StopLaunchedProcesses() + { + // Killing only processes launched by this fixture prevents a failed UI test from leaking application instances. + foreach (var application in launchedApplications) + StopAndDisposeApplication(application); + launchedApplications.Clear(); - // Setup can intentionally skip before UIA3 is created when the isolated profile opt-in is absent. - if (Automation is not null) - Automation.Dispose(); + var expectedHelperPath = Path.Combine(Path.GetDirectoryName(UiTestSettings.ExecutablePath)!, "salmon.exe"); + foreach (var helper in Process.GetProcessesByName("salmon")) + { + using (helper) + { + if (preexistingHelperProcessIds.Contains(helper.Id) || helper.HasExited) + continue; + + // Match the executable directory as well as the PID snapshot before terminating a test-owned helper. + if (!string.Equals(helper.MainModule?.FileName, expectedHelperPath, StringComparison.OrdinalIgnoreCase)) + continue; + + helper.Kill(entireProcessTree: true); + helper.WaitForExit(5000); + } + } } - protected void RestartFileManager(IReadOnlyDictionary? environment = null) + protected void RestartFileManager(IReadOnlyDictionary? environment = null, + Action? afterPreviousApplicationStopped = null) { - // Restart coverage verifies that the application remains launchable after a committed configuration dialog. - if (!Application.HasExited) - Application.Kill(); + StopCurrentApplication(afterPreviousApplicationStopped); + // Fault recovery can restart thousands of crashed processes; recycle COM/UIA state so dead event subscribers cannot accumulate. + Automation.Dispose(); + Automation = new UIA3Automation(); + MainWindowHandle = 0; + MainWindow = null!; StartApplication(environment); } + protected void StopCurrentApplication(Action? afterApplicationStopped = null) + { + var application = Application; + StopAndDisposeApplication(application); + launchedApplications.Remove(application); + // External state is replaced only after the process that owns it has exited. + afterApplicationStopped?.Invoke(); + } + + private static void StopAndDisposeApplication(Application application) + { + // One bounded shutdown path keeps normal teardown and crash-recovery restarts consistent. + if (!application.HasExited) + application.Kill(); + + var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(5); + while (!application.HasExited && DateTime.UtcNow < deadline) + Thread.Sleep(25); + if (!application.HasExited) + throw new InvalidOperationException("FileManager did not exit during test cleanup."); + application.Dispose(); + } + protected Window OpenConfigurationDialog() { - NativeCommands.OpenConfiguration(MainWindow.Properties.NativeWindowHandle.Value); - return WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value); + configurationGenerationBeforeOpen = NativeCommands.GetConfigurationGeneration(MainWindowHandle); + NativeCommands.Execute(MainWindowHandle, NativeCommands.Configuration); + // CTreePropDialog uses stable custom OK ID 5, tree ID 1, and standard Cancel ID 2. + var dialog = WaitForWindow(window => + window.Properties.NativeWindowHandle.Value != MainWindowHandle && + window.FindFirstDescendant(cf => cf.ByControlType(ControlType.Tree)) is not null && + NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 5) && + NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 2)); + // Always activate General so configuration tests do not depend on LastFocusedPage from an earlier run. + var dialogHandle = dialog.Properties.NativeWindowHandle.Value; + NativeCommands.SelectFirstTreePage(dialogHandle, 1); + WaitForConfigurationCheckBox(dialogHandle); + return dialog; } protected void CloseConfigurationDialog(Window dialog, bool commit) { - // Standard Win32 property sheets expose IDOK as automation ID 1 and IDCANCEL as automation ID 2. - var buttonId = commit ? "1" : "2"; - var button = dialog.FindFirstDescendant(cf => cf.ByAutomationId(buttonId))?.AsButton(); - Assert.That(button, Is.Not.Null, $"Configuration dialog did not expose button {buttonId}."); - button!.Invoke(); + // The tree-property dialog maps its custom OK control to ID 5 and retains IDCANCEL as ID 2. + NativeCommands.ClickDialogButton(dialog.Properties.NativeWindowHandle.Value, commit ? 5 : 2); WaitForWindowToClose(dialog); + WaitForMainWindowEnabled(); + WaitForConfigurationCompletion(); } protected void CommitConfigurationDialogWithoutWaiting(Window dialog) { // Fault injection terminates the process during the deferred native save, so waiting for // the dialog's normal close is not meaningful. The caller waits for the process instead. - var button = dialog.FindFirstDescendant(cf => cf.ByAutomationId("1"))?.AsButton(); - Assert.That(button, Is.Not.Null, "Configuration dialog did not expose its OK button."); - button!.Invoke(); + NativeCommands.ClickDialogButton(dialog.Properties.NativeWindowHandle.Value, 5); } protected int WaitForFileManagerExit(TimeSpan timeout) @@ -95,85 +186,58 @@ protected int WaitForFileManagerExit(TimeSpan timeout) protected bool ToggleFirstConfigurationCheckBox(Window dialog) { - // Toggling a visible option gives the persistence test a real user commit without relying on translated labels. - var checkBox = dialog.FindAllDescendants() - .FirstOrDefault(element => element.ControlType == FlaUI.Core.Definitions.ControlType.CheckBox) - ?.AsCheckBox(); - Assert.That(checkBox, Is.Not.Null, "Configuration dialog did not expose a check box through UI Automation."); - - var originalState = checkBox!.IsChecked; - // A three-state check box would not have a deterministic inverse for this basic persistence assertion. - Assert.That(originalState, Is.Not.Null, "Configuration persistence test requires a two-state check box."); - checkBox.Toggle(); - return originalState!.Value; + var dialogHandle = dialog.Properties.NativeWindowHandle.Value; + // Read and change the real HWND state so a stale UIA ToggleState cannot create a false persistence failure. + var originalState = NativeCommands.GetDialogCheckBoxState(dialogHandle, ConfigurationCheckBoxId); + NativeCommands.ToggleDialogCheckBox(dialogHandle, ConfigurationCheckBoxId); + return originalState; } protected bool IsFirstConfigurationCheckBoxChecked(Window dialog) { - // The same visible control is inspected after relaunch to prove the committed value was read from persisted settings. - var checkBox = dialog.FindAllDescendants() - .FirstOrDefault(element => element.ControlType == FlaUI.Core.Definitions.ControlType.CheckBox) - ?.AsCheckBox(); - Assert.That(checkBox, Is.Not.Null, "Configuration dialog did not expose a check box through UI Automation."); - var currentState = checkBox!.IsChecked; - // Match the toggle helper so both sides of the restart assertion use a two-state value. - Assert.That(currentState, Is.Not.Null, "Configuration persistence test requires a two-state check box."); - return currentState!.Value; + // Inspect the same visible native control after relaunch to prove the persisted value was loaded. + return NativeCommands.GetDialogCheckBoxState(dialog.Properties.NativeWindowHandle.Value, + ConfigurationCheckBoxId); } protected Window OpenFtpBookmarksDialog() { - // The host allocates FTP menu IDs dynamically, so the test profile provides the runtime command used to open this dialog. - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, UiTestSettings.RequireFtpOrganizeCommand()); - return WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value); + // Resolve the host-owned SUID in the tested process so FTP cases never depend on a manually copied runtime value. + var command = NativeCommands.GetFtpOrganizeBookmarksCommand(MainWindowHandle); + if (command <= 0) + Assert.Ignore("The tested FileManager build did not load the FTP plug-in required by this persistence test."); + NativeCommands.Execute(MainWindowHandle, command); + return WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindowHandle); } protected void CreateFtpBookmark(Window bookmarksDialog, string bookmarkName) { - // These resource IDs are stable plug-in control identities, allowing UIA3 to create a bookmark without display text coupling. - var newButton = bookmarksDialog.FindFirstDescendant(cf => cf.ByAutomationId("572"))?.AsButton(); - Assert.That(newButton, Is.Not.Null, "FTP bookmarks dialog did not expose its New button."); - newButton!.Invoke(); - - var nameDialog = WaitForWindow(window => - window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value && - window.Properties.NativeWindowHandle.Value != bookmarksDialog.Properties.NativeWindowHandle.Value); - var nameBox = nameDialog.FindFirstDescendant(cf => cf.ByAutomationId("602"))?.AsTextBox(); - Assert.That(nameBox, Is.Not.Null, "New FTP bookmark dialog did not expose its name field."); - nameBox!.Text = bookmarkName; - - var okButton = nameDialog.FindFirstDescendant(cf => cf.ByAutomationId("1"))?.AsButton(); - Assert.That(okButton, Is.Not.Null, "New FTP bookmark dialog did not expose its OK button."); - okButton!.Invoke(); - WaitForWindowToClose(nameDialog); + EditFtpBookmarkName(bookmarksDialog, 572, bookmarkName, "New"); } protected void RenameFocusedFtpBookmark(Window bookmarksDialog, string bookmarkName) { - // Creating a bookmark focuses it, so Rename exercises the profile-edit commit without relying on list item text. - var renameButton = bookmarksDialog.FindFirstDescendant(cf => cf.ByAutomationId("573"))?.AsButton(); - Assert.That(renameButton, Is.Not.Null, "FTP bookmarks dialog did not expose its Rename button."); - renameButton!.Invoke(); + EditFtpBookmarkName(bookmarksDialog, 573, bookmarkName, "Rename"); + } + private void EditFtpBookmarkName(Window bookmarksDialog, int commandButtonId, string bookmarkName, string operation) + { + // Stable plug-in resource IDs keep create and rename on one locale-independent dialog path. + NativeCommands.ClickDialogButton(bookmarksDialog.Properties.NativeWindowHandle.Value, commandButtonId); var nameDialog = WaitForWindow(window => - window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value && + window.Properties.NativeWindowHandle.Value != MainWindowHandle && window.Properties.NativeWindowHandle.Value != bookmarksDialog.Properties.NativeWindowHandle.Value); var nameBox = nameDialog.FindFirstDescendant(cf => cf.ByAutomationId("602"))?.AsTextBox(); - Assert.That(nameBox, Is.Not.Null, "Rename FTP bookmark dialog did not expose its name field."); + Assert.That(nameBox, Is.Not.Null, $"{operation} FTP bookmark dialog did not expose its name field."); nameBox!.Text = bookmarkName; - - var okButton = nameDialog.FindFirstDescendant(cf => cf.ByAutomationId("1"))?.AsButton(); - Assert.That(okButton, Is.Not.Null, "Rename FTP bookmark dialog did not expose its OK button."); - okButton!.Invoke(); + NativeCommands.ClickDialogButton(nameDialog.Properties.NativeWindowHandle.Value, 1); WaitForWindowToClose(nameDialog); } protected void CloseFtpBookmarksDialog(Window bookmarksDialog) { // Close commits the edited bookmark collection in the FTP organizer instead of discarding it with Cancel. - var closeButton = bookmarksDialog.FindFirstDescendant(cf => cf.ByAutomationId("575"))?.AsButton(); - Assert.That(closeButton, Is.Not.Null, "FTP bookmarks dialog did not expose its Close button."); - closeButton!.Invoke(); + NativeCommands.ClickDialogButton(bookmarksDialog.Properties.NativeWindowHandle.Value, 575); WaitForWindowToClose(bookmarksDialog); } @@ -187,6 +251,21 @@ protected virtual void BeforeFileManagerStarted() { } + protected virtual bool IsExpectedStartupModal(nint windowHandle) + { + return false; + } + + protected Window[] GetFileManagerTopLevelWindows() + { + // Enumerate HWNDs first because UIA can omit native modal dialogs even while their owner is visibly disabled. + return NativeCommands.GetTopLevelWindowHandles(Application.ProcessId) + .Where(windowHandle => NativeCommands.GetWindowClassName(windowHandle) is + "SalamanderMainWindowVer25" or "#32770") + .Select(windowHandle => Automation.FromHandle(windowHandle).AsWindow()) + .ToArray(); + } + private void StartApplication(IReadOnlyDictionary? environment = null) { var startInfo = new ProcessStartInfo(UiTestSettings.ExecutablePath, ApplicationArguments) @@ -201,9 +280,70 @@ private void StartApplication(IReadOnlyDictionary? environment = Application = FlaUI.Core.Application.Launch(startInfo); launchedApplications.Add(Application); - Application.WaitWhileMainHandleIsMissing(TimeSpan.FromSeconds(20)); - MainWindow = Application.GetMainWindow(Automation) ?? - throw new AssertionException("FileManager did not expose a UI Automation main window."); + + // A clean profile can show the language selector first, so attach only to the native main-window class. + var timeout = DateTime.UtcNow + TimeSpan.FromSeconds(20); + var confirmedLanguageDialogs = new HashSet(); + var dismissedPathErrors = new HashSet(); + while (DateTime.UtcNow < timeout) + { + // Classify startup HWNDs natively so a broken dialog UIA provider cannot block the entire fixture setup. + var windowHandles = NativeCommands.GetTopLevelWindowHandles(Application.ProcessId); + var languageDialogHandle = windowHandles.FirstOrDefault(windowHandle => + NativeCommands.GetWindowClassName(windowHandle) == "#32770" && + NativeCommands.HasDialogControl(windowHandle, 1031)); + if (languageDialogHandle != 0) + { + if (confirmedLanguageDialogs.Add(languageDialogHandle)) + { + // IDOK accepts the application's preselected fallback without coupling startup to translated labels. + Assert.That(NativeCommands.HasDialogControl(languageDialogHandle, 1), Is.True, + "Language selector did not expose its OK button."); + NativeCommands.ClickDialogButton(languageDialogHandle, 1); + } + } + + var pathErrorDialogHandle = windowHandles.FirstOrDefault(windowHandle => + string.Equals(NativeCommands.GetWindowTitle(windowHandle), "Error Changing Directory", + StringComparison.Ordinal)); + if (pathErrorDialogHandle != 0) + { + if (dismissedPathErrors.Add(pathErrorDialogHandle)) + { + // File-operation cases persist disposable panel paths; acknowledge their next-launch invalid-path notice. + NativeCommands.ClickDialogButton(pathErrorDialogHandle, 1); + } + } + + var mainWindowHandle = windowHandles.FirstOrDefault(windowHandle => + string.Equals(NativeCommands.GetWindowClassName(windowHandle), + "SalamanderMainWindowVer25", StringComparison.Ordinal)); + var expectedStartupModal = windowHandles.Any(IsExpectedStartupModal); + if (mainWindowHandle != 0 && languageDialogHandle == 0 && + (expectedStartupModal || + NativeCommands.IsWindowEnabledForInput(mainWindowHandle) && NativeCommands.IsStartupReady(mainWindowHandle))) + { + // Native enumeration already requires visibility and avoids unsupported IsOffscreen providers. + // The narrowly identified recovery modal appears before the normal readiness handshake and owns its disabled main window. + MainWindowHandle = mainWindowHandle; + MainWindow = Automation.FromHandle(mainWindowHandle).AsWindow(); + return; + } + + if (Application.HasExited) + throw new AssertionException($"FileManager exited before exposing its main window (exit code {Application.ExitCode})."); + + Thread.Sleep(100); + } + + // Preserve timeout diagnostics without re-entering the UIA provider that may have caused startup to stall. + var startupWindows = string.Join(Environment.NewLine, + NativeCommands.GetTopLevelWindowHandles(Application.ProcessId).Select(windowHandle => + $"handle={windowHandle}, class='{NativeCommands.GetWindowClassName(windowHandle)}', " + + $"title='{NativeCommands.GetWindowTitle(windowHandle)}', message='{NativeCommands.GetMessageBoxText(windowHandle)}', " + + $"enabled={NativeCommands.IsWindowEnabledForInput(windowHandle)}, children=[{NativeCommands.DescribeChildControls(windowHandle)}]")); + // Startup inventory separates a missing window from a visible application that never published readiness. + throw new AssertionException($"FileManager did not expose a ready native main window within 20 seconds.{Environment.NewLine}{startupWindows}"); } protected Window WaitForWindow(Func predicate) @@ -211,28 +351,93 @@ protected Window WaitForWindow(Func predicate) var timeout = DateTime.UtcNow + TimeSpan.FromSeconds(10); while (DateTime.UtcNow < timeout) { - var dialog = Application.GetAllTopLevelWindows(Automation).FirstOrDefault(predicate); + var windows = GetFileManagerTopLevelWindows(); + var nativeAssertion = windows.FirstOrDefault(window => + NativeCommands.DescribeChildControls(window.Properties.NativeWindowHandle.Value) + .Contains("Debug Assertion Failed!", StringComparison.Ordinal)); + if (nativeAssertion is not null) + { + // A native assertion is an application failure, so report it immediately instead of masking it as a synchronization timeout. + Assert.Fail($"FileManager triggered a native debug assertion.{Environment.NewLine}" + + NativeCommands.DescribeChildControls(nativeAssertion.Properties.NativeWindowHandle.Value)); + } + + var dialog = windows.FirstOrDefault(predicate); if (dialog is not null) return dialog; Thread.Sleep(100); } - Assert.Fail("Timed out waiting for the requested FileManager window."); + var visibleWindows = string.Join(Environment.NewLine, GetFileManagerTopLevelWindows().Select(window => + $"handle={window.Properties.NativeWindowHandle.Value}, class='{window.Properties.ClassName.ValueOrDefault}', " + + $"title='{window.Title}', enabled={window.IsEnabled}, offscreen={window.Properties.IsOffscreen.ValueOrDefault}, " + + $"message='{NativeCommands.GetMessageBoxText(window.Properties.NativeWindowHandle.Value)}', " + + $"children=[{NativeCommands.DescribeChildControls(window.Properties.NativeWindowHandle.Value)}]")); + // Native child inventory exposes assertion and error dialogs whose UIA provider omits their message text. + Assert.Fail($"Timed out waiting for the requested FileManager window.{Environment.NewLine}{visibleWindows}"); return null!; } protected static void WaitForWindowToClose(Window dialog) { + var windowHandle = dialog.Properties.NativeWindowHandle.Value; + var timeout = DateTime.UtcNow + TimeSpan.FromSeconds(10); + while (DateTime.UtcNow < timeout) + { + // UIA can retain the element after native destruction, so observe the actual HWND lifetime. + if (!NativeCommands.IsWindowAvailable(windowHandle)) + return; + + Thread.Sleep(100); + } + + Assert.Fail("Timed out waiting for the requested dialog to close."); + } + + private void WaitForMainWindowEnabled() + { + var mainWindowHandle = MainWindowHandle; var timeout = DateTime.UtcNow + TimeSpan.FromSeconds(10); while (DateTime.UtcNow < timeout) { - if (!dialog.IsAvailable) + if (NativeCommands.IsWindowEnabledForInput(mainWindowHandle)) return; + Thread.Sleep(100); + } + + var remainingWindows = string.Join(Environment.NewLine, GetFileManagerTopLevelWindows().Select(window => + $"handle={window.Properties.NativeWindowHandle.Value}, class='{NativeCommands.GetWindowClassName(window.Properties.NativeWindowHandle.Value)}', " + + $"title='{NativeCommands.GetWindowTitle(window.Properties.NativeWindowHandle.Value)}', enabled={window.IsEnabled}")); + // Report the modal owner that kept the main window disabled after Configuration closed. + Assert.Fail($"FileManager main window remained disabled after the modal dialog closed.{Environment.NewLine}{remainingWindows}"); + } + private void WaitForConfigurationCompletion() + { + var mainWindowHandle = MainWindowHandle; + var timeout = DateTime.UtcNow + TimeSpan.FromSeconds(10); + while (DateTime.UtcNow < timeout) + { + if (NativeCommands.GetConfigurationGeneration(mainWindowHandle) > configurationGenerationBeforeOpen) + return; Thread.Sleep(100); } - Assert.Fail("Timed out waiting for the configuration dialog to close."); + Assert.Fail("Configuration handler did not finish persistence after the dialog closed."); + } + + private static void WaitForConfigurationCheckBox(nint dialogHandle) + { + var timeout = DateTime.UtcNow + TimeSpan.FromSeconds(5); + while (DateTime.UtcNow < timeout) + { + if (NativeCommands.IsDialogControlVisible(dialogHandle, ConfigurationCheckBoxId)) + return; + Thread.Sleep(50); + } + + // A visible stable control proves the General page selection completed before state is read or changed. + Assert.Fail("Configuration dialog did not activate its General page check box."); } } diff --git a/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs b/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs index f32b6712..60f26d68 100644 --- a/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs +++ b/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs @@ -22,12 +22,21 @@ public abstract class FileOperationUiTestBase : FileManagerUiTestBase protected override void OnAfterFileManagerStopped() { - workspace?.Dispose(); + var completedWorkspace = workspace; + // Clear first so a cleanup exception cannot leak this case's partial topology into the next NUnit case. + workspace = null; + completedWorkspace?.Dispose(); } protected void SelectSourceItem(string name) { - var list = FindSourceList(); + // ADS and topology scenarios create sources after startup, so refresh before selecting from the owner-drawn list. + NativeCommands.RefreshLeftPanel(MainWindowHandle); + var list = MainWindow.FindAllDescendants() + .Where(element => string.Equals(element.Properties.ClassName.ValueOrDefault, "SalamanderItemsBox", StringComparison.Ordinal)) + .OrderBy(element => element.BoundingRectangle.Left) + .FirstOrDefault(); + Assert.That(list, Is.Not.Null, "The left file panel did not expose its SalamanderItemsBox control."); NativeCommands.QuickSearch(list!.Properties.NativeWindowHandle.Value, name); } @@ -46,8 +55,8 @@ protected Window ExecuteWithPath(int command, string sourceName, string path, bo { if (sourceName.Length != 0) SelectSourceItem(sourceName); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, command); - var dialog = WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value); + NativeCommands.Execute(MainWindowHandle, command); + var dialog = WaitForOperationEntryDialog(); SetDialogPath(dialog, path); CloseDialog(dialog, commit); return dialog; @@ -56,63 +65,72 @@ protected Window ExecuteWithPath(int command, string sourceName, string path, bo protected Window ExecuteAndWaitForDialog(int command, string sourceName) { SelectSourceItem(sourceName); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, command); - return WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value); + NativeCommands.Execute(MainWindowHandle, command); + return WaitForOperationEntryDialog(); } protected Window WaitForOperationPrompt(int buttonId) { return WaitForWindow(window => - window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value && - window.FindFirstDescendant(cf => cf.ByAutomationId(buttonId.ToString()))?.AsButton() is not null); + window.Properties.NativeWindowHandle.Value != MainWindowHandle && + NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, buttonId)); } protected static void ChooseOperationPrompt(Window dialog, int buttonId) { - var button = dialog.FindFirstDescendant(cf => cf.ByAutomationId(buttonId.ToString()))?.AsButton(); - Assert.That(button, Is.Not.Null, $"The operation prompt did not expose button {buttonId}."); - button!.Invoke(); + NativeCommands.ClickDialogButton(dialog.Properties.NativeWindowHandle.Value, buttonId); WaitForWindowToClose(dialog); } protected void SubmitInvalidPathAndCancel(int command, string sourceName, string path) { var operationDialog = ExecuteWithPathWithoutWaitingForClose(command, sourceName, path); + var operationDialogHandle = operationDialog.Properties.NativeWindowHandle.Value; var failureDialog = WaitForWindow(window => - window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value && - window.Properties.NativeWindowHandle.Value != operationDialog.Properties.NativeWindowHandle.Value); - CloseDialog(failureDialog, commit: true); - // Quick Rename destroys and recreates its input dialog after an execution error; copy/move validation keeps it alive. - var dialogToCancel = operationDialog.IsAvailable - ? operationDialog - : WaitForWindow(window => - window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value && - window.FindFirstDescendant(cf => cf.ByAutomationId("2"))?.AsButton() is not null); - CloseDialog(dialogToCancel, commit: false); + window.Properties.NativeWindowHandle.Value != MainWindowHandle && + window.Properties.NativeWindowHandle.Value != operationDialogHandle && + (NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 1) || + NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 2))); + // Error boxes use OK, while overwrite/collision confirmations are cancelled to preserve both filesystem items. + CloseDialog(failureDialog, commit: NativeCommands.HasDialogControl(failureDialog.Properties.NativeWindowHandle.Value, 1)); + // Some validation failures close the entry dialog themselves; cancel it only when its HWND remains alive. + if (NativeCommands.IsWindowAvailable(operationDialogHandle)) + CloseDialog(operationDialog, commit: false); } protected void ConfirmDeleteIfPrompted() { - var timeout = DateTime.UtcNow + TimeSpan.FromSeconds(3); + DismissOptionalPrompt(6, TimeSpan.FromSeconds(3), 6); // IDYES + } + + protected void ConfirmCreateDirectoryParentsIfPrompted() + { + DismissOptionalPrompt(1, TimeSpan.FromSeconds(3), 1, 2); // IDOK with IDCANCEL distinguishes the missing-parent question. + } + + protected bool DismissOptionalPrompt(int buttonToClick, TimeSpan wait, params int[] requiredControls) + { + var timeout = DateTime.UtcNow + wait; while (DateTime.UtcNow < timeout) { - var dialog = Application.GetAllTopLevelWindows(Automation) - .FirstOrDefault(window => window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value); - var yes = dialog?.FindFirstDescendant(cf => cf.ByAutomationId("6"))?.AsButton(); - if (yes is not null) + var dialog = GetFileManagerTopLevelWindows() + .FirstOrDefault(window => window.Properties.NativeWindowHandle.Value != MainWindowHandle && + requiredControls.All(controlId => + NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, controlId))); + if (dialog is not null) { - yes.Invoke(); - return; + // Stable button IDs allow optional confirmations to vary by profile without translated-text coupling. + NativeCommands.ClickDialogButton(dialog.Properties.NativeWindowHandle.Value, buttonToClick); + return true; } Thread.Sleep(100); } + return false; } protected static void CloseDialog(Window dialog, bool commit) { - var button = dialog.FindFirstDescendant(cf => cf.ByAutomationId(commit ? "1" : "2"))?.AsButton(); - Assert.That(button, Is.Not.Null, $"The operation dialog did not expose its {(commit ? "OK" : "Cancel")} button."); - button!.Invoke(); + NativeCommands.ClickDialogButton(dialog.Properties.NativeWindowHandle.Value, commit ? 1 : 2); WaitForWindowToClose(dialog); } @@ -175,14 +193,22 @@ private Window ExecuteWithPathWithoutWaitingForClose(int command, string sourceN { if (sourceName.Length != 0) SelectSourceItem(sourceName); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, command); - var dialog = WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value); + NativeCommands.Execute(MainWindowHandle, command); + var dialog = WaitForOperationEntryDialog(); SetDialogPath(dialog, path); - var ok = dialog.FindFirstDescendant(cf => cf.ByAutomationId("1"))?.AsButton(); - Assert.That(ok, Is.Not.Null, "The operation dialog did not expose its OK button."); - ok!.Invoke(); + NativeCommands.ClickDialogButton(dialog.Properties.NativeWindowHandle.Value, 1); return dialog; } + + private Window WaitForOperationEntryDialog() + { + // Destination and name dialogs expose editable input plus standard OK/Cancel identities across languages. + return WaitForWindow(window => + window.Properties.NativeWindowHandle.Value != MainWindowHandle && + window.FindAllDescendants().Any(element => element.ControlType is ControlType.Edit or ControlType.ComboBox) && + NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 1) && + NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 2)); + } } public sealed class FileOperationWorkspace : IDisposable @@ -241,9 +267,8 @@ public FileOperationWorkspace(string? targetVolumeRoot = null) File.WriteAllText(TargetPath("overwrite-file.txt"), "overwrite-target-content"); File.WriteAllText(TargetPath("skip-file.txt"), "skip-target-content"); File.WriteAllText(TargetPath("cancel-conflict.txt"), "cancel-conflict-target-content"); - File.WriteAllText(TargetPath("move-overwrite.txt"), "move-overwrite-target-content"); - File.WriteAllText(TargetPath("move-skip.txt"), "move-skip-target-content"); - File.WriteAllText(TargetPath("rename-overwrite-target.txt"), "rename-overwrite-target-content"); + // Rename is panel-local, so its overwrite fixture must collide in the source panel rather than the opposite panel. + File.WriteAllText(SourcePath("rename-overwrite-target.txt"), "rename-overwrite-target-content"); WriteTargetFile(Path.Combine("overwrite-all-tree", "nested", "first.txt"), "overwrite-all-first-target"); WriteTargetFile(Path.Combine("overwrite-all-tree", "nested", "second.txt"), "overwrite-all-second-target"); WriteTargetFile(Path.Combine("skip-all-tree", "nested", "first.txt"), "skip-all-first-target"); @@ -269,10 +294,10 @@ public FileOperationWorkspace(string? targetVolumeRoot = null) public void Dispose() { if (Directory.Exists(RootDirectory)) - Directory.Delete(RootDirectory, recursive: true); + DeleteDirectoryTreeWithoutTraversingReparsePoints(RootDirectory); if (!string.Equals(TargetWorkspaceDirectory, RootDirectory, StringComparison.OrdinalIgnoreCase) && Directory.Exists(TargetWorkspaceDirectory)) - Directory.Delete(TargetWorkspaceDirectory, recursive: true); + DeleteDirectoryTreeWithoutTraversingReparsePoints(TargetWorkspaceDirectory); } private void WriteSourceFile(string relativePath, string content) @@ -288,4 +313,28 @@ private void WriteTargetFile(string relativePath, string content) Directory.CreateDirectory(Path.GetDirectoryName(path)!); File.WriteAllText(path, content); } + + private static void DeleteDirectoryTreeWithoutTraversingReparsePoints(string directory) + { + foreach (var entry in Directory.EnumerateFileSystemEntries(directory)) + { + var attributes = File.GetAttributes(entry); + if ((attributes & FileAttributes.Directory) != 0) + { + // A junction or directory symlink is a fixture entry, never a cleanup traversal boundary. + if ((attributes & FileAttributes.ReparsePoint) != 0) + Directory.Delete(entry); + else + DeleteDirectoryTreeWithoutTraversingReparsePoints(entry); + } + else + { + if ((attributes & FileAttributes.ReadOnly) != 0) + File.SetAttributes(entry, attributes & ~FileAttributes.ReadOnly); + File.Delete(entry); + } + } + + Directory.Delete(directory); + } } diff --git a/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs b/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs index 669a797e..899df7a5 100644 --- a/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs +++ b/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs @@ -1,27 +1,55 @@ using System.Runtime.InteropServices; +using System.Text; namespace FileManager.UiTests.Infrastructure; internal static class NativeCommands { + private delegate bool EnumWindowsCallback(nint windowHandle, nint parameter); + // CM_CONFIGURATION is the stable native command used by the Options > Configuration menu item. internal const int Configuration = 686; + private const int LeftPanelRefresh = 724; // CM_CUSTOMIZETOP opens the shared Customize Toolbar dialog without depending on translated menu text. internal const int CustomizeTopToolbar = 804; internal const int CopyFiles = 727; internal const int MoveFiles = 728; internal const int DeleteFiles = 729; internal const int CreateDirectory = 730; - // These stable host commands cover the three distinct file-discovery and file-opening paths. - internal const int FindFiles = 741; - internal const int ViewFile = 742; - internal const int EditFile = 743; + internal const int Open = 732; + internal const int Edit = 743; internal const int RenameFile = 754; - private const uint WmCommand = 0x0111; + internal const int HelpSearch = 2212; + private const uint WmNull = 0x0000; + private const uint WmClose = 0x0010; private const uint WmChar = 0x0102; private const uint WmKeyDown = 0x0100; - private const uint LvmGetItemCount = 0x1004; + private const uint WmKeyUp = 0x0101; + private const uint WmCommand = 0x0111; + private const uint BmGetCheck = 0x00F0; + private const uint BmClick = 0x00F5; + private const int BstUnchecked = 0; + private const int BstChecked = 1; + private const uint CbGetCurSel = 0x0147; + private const uint CbSetCurSel = 0x014E; + private const int CbnSelChange = 1; + private const uint WmApp = 0x8000; + private const uint WmUiTestReady = WmApp + 417; + private const uint WmUiTestCommand = WmApp + 418; + private const uint WmUiTestConfigGeneration = WmApp + 419; + private const uint WmUiTestConfigFault = WmApp + 420; + private const uint WmUiTestFtpOrganizeCommand = WmApp + 421; + private const uint TvmGetNextItem = 0x110A; + private const uint TvmSelectItem = 0x110B; + private const int TvgnRoot = 0; + private const int TvgnCaret = 9; + private const uint SmtoAbortIfHung = 0x0002; private const int VkEscape = 0x1B; + private const int VkReturn = 0x0D; + + [DllImport("user32.dll", SetLastError = true)] + private static extern nint SendMessageTimeout(nint hWnd, uint msg, nint wParam, nint lParam, + uint flags, uint timeout, out nint result); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] @@ -33,18 +61,254 @@ internal static class NativeCommands [DllImport("user32.dll")] private static extern nint SetFocus(nint hWnd); - internal static void OpenConfiguration(nint windowHandle) + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool EnumWindows(EnumWindowsCallback callback, nint parameter); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool EnumChildWindows(nint parentHandle, EnumWindowsCallback callback, nint parameter); + + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(nint windowHandle, out uint processId); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool IsWindowVisible(nint windowHandle); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool IsWindow(nint windowHandle); + + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + private static extern int GetClassName(nint windowHandle, StringBuilder className, int maximumCount); + + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + private static extern int GetWindowText(nint windowHandle, StringBuilder text, int maximumCount); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool IsWindowEnabled(nint windowHandle); + + [DllImport("user32.dll")] + private static extern nint GetDlgItem(nint dialogHandle, int controlId); + + [DllImport("user32.dll")] + private static extern int GetDlgCtrlID(nint controlHandle); + + internal static void Execute(nint windowHandle, int command) { - // Native dispatch avoids hard-coded English menu labels while FlaUI validates the resulting dialog. - if (!PostMessage(windowHandle, WmCommand, Configuration, 0)) - throw new InvalidOperationException("Unable to post the Configuration command to FileManager."); + // The native test protocol acknowledges queueing without blocking this thread inside the resulting modal dialog. + if (SendMessageTimeout(windowHandle, WmUiTestCommand, command, 0, SmtoAbortIfHung, 2000, out var accepted) == 0 || + accepted == 0) + throw new InvalidOperationException($"FileManager did not accept command {command} after reporting startup readiness."); } - internal static void Execute(nint windowHandle, int command) + internal static void RefreshLeftPanel(nint windowHandle) + { + // Mode 1 is restricted natively to CM_LEFTREFRESH and returns only after the new panel listing is available. + if (SendMessageTimeout(windowHandle, WmUiTestCommand, LeftPanelRefresh, 1, SmtoAbortIfHung, 5000, out var refreshed) == 0 || + refreshed == 0) + throw new InvalidOperationException("FileManager did not synchronously refresh the source panel."); + } + + internal static bool IsStartupReady(nint windowHandle) + { + // A bounded synchronous query distinguishes a created main window from a fully initialized application. + return SendMessageTimeout(windowHandle, WmUiTestReady, 0, 0, SmtoAbortIfHung, 250, out var ready) != 0 && + ready != 0; + } + + internal static long GetConfigurationGeneration(nint windowHandle) + { + // The generation advances after the Configuration handler completes persistence and post-dialog refresh work. + return SendMessageTimeout(windowHandle, WmUiTestConfigGeneration, 0, 0, SmtoAbortIfHung, 2000, out var generation) != 0 + ? generation.ToInt64() + : -1; + } + + internal static void ArmNextConfigurationWriteFault(nint windowHandle, int writeBoundary) { - // UIA drives all assertions; this Win32 bridge only reaches commands whose host-assigned IDs have no stable UIA locator. - if (!PostMessage(windowHandle, WmCommand, command, 0)) - throw new InvalidOperationException($"Unable to post command {command} to FileManager."); + // One-shot native arming prevents startup or cancel-dialog saves from consuming the requested boundary. + if (writeBoundary <= 0 || + SendMessageTimeout(windowHandle, WmUiTestConfigFault, writeBoundary, 0, SmtoAbortIfHung, 2000, out var armed) == 0 || + armed == 0) + throw new InvalidOperationException($"FileManager did not arm configuration write boundary {writeBoundary}."); + } + + internal static int GetFtpOrganizeBookmarksCommand(nint windowHandle) + { + // Ask the isolated process after start-up because plug-in SUIDs belong to its native menu allocation. + return SendMessageTimeout(windowHandle, WmUiTestFtpOrganizeCommand, 0, 0, SmtoAbortIfHung, 5000, out var command) != 0 + ? checked((int)command.ToInt64()) + : 0; + } + + internal static nint[] GetTopLevelWindowHandles(int processId) + { + return GetVisibleTopLevelWindowHandles() + .Where(windowHandle => + { + GetWindowThreadProcessId(windowHandle, out var ownerProcessId); + return ownerProcessId == (uint)processId; + }) + .ToArray(); + } + + internal static nint[] GetVisibleTopLevelWindowHandles() + { + var handles = new List(); + // Native enumeration retains Win32 dialogs that some UIA providers omit from desktop and application searches. + EnumWindows((windowHandle, _) => + { + if (IsWindowVisible(windowHandle)) + handles.Add(windowHandle); + return true; + }, 0); + return handles.ToArray(); + } + + internal static string GetWindowClassName(nint windowHandle) + { + var className = new StringBuilder(256); + // Native class lookup remains reliable for owner-drawn windows whose UIA ClassName property is unsupported. + return GetClassName(windowHandle, className, className.Capacity) > 0 ? className.ToString() : string.Empty; + } + + internal static string GetWindowTitle(nint windowHandle) + { + var title = new StringBuilder(512); + // Native title lookup avoids UIA property failures while classifying startup-only error dialogs. + return GetWindowText(windowHandle, title, title.Capacity) > 0 ? title.ToString() : string.Empty; + } + + internal static string GetMessageBoxText(nint dialogHandle) + { + var staticTextHandle = GetDlgItem(dialogHandle, -1); + // Standard message boxes expose their body through the IDC_STATIC control even when UIA is unresponsive. + return staticTextHandle != 0 ? GetWindowTitle(staticTextHandle) : string.Empty; + } + + internal static string DescribeChildControls(nint dialogHandle) + { + var controls = new List(); + // Native child inventory keeps startup failures diagnosable without invoking an unresponsive UIA provider. + EnumChildWindows(dialogHandle, (controlHandle, _) => + { + controls.Add($"id={GetDlgCtrlID(controlHandle)}, class='{GetWindowClassName(controlHandle)}', text='{GetWindowTitle(controlHandle)}'"); + return true; + }, 0); + return string.Join("; ", controls); + } + + internal static bool IsWindowAvailable(nint windowHandle) + { + // HWND lifetime is authoritative when UIA retains a stale element after a modal dialog closes. + return IsWindow(windowHandle); + } + + internal static bool IsWindowEnabledForInput(nint windowHandle) + { + // Win32 enabled state provides a stable readiness check after a modal dialog releases its owner. + return IsWindowEnabled(windowHandle); + } + + internal static bool IsWindowResponsive(nint windowHandle) + { + // WM_NULL has no side effects and proves the owning UI thread can still process synchronous messages. + return SendMessageTimeout(windowHandle, WmNull, 0, 0, SmtoAbortIfHung, 250, out _) != 0; + } + + internal static void RequestWindowClose(nint windowHandle) + { + // Tests close only windows they opened, avoiding leaked Help or editor processes after an assertion. + if (windowHandle != 0 && IsWindow(windowHandle)) + PostMessage(windowHandle, WmClose, 0, 0); + } + + internal static void ClickDialogButton(nint dialogHandle, int buttonId) + { + var buttonHandle = GetDlgItem(dialogHandle, buttonId); + // BM_CLICK follows the control's normal notification path when UIA's Invoke pattern is unavailable. + if (buttonHandle == 0 || !PostMessage(buttonHandle, BmClick, 0, 0)) + throw new InvalidOperationException($"Dialog did not accept button command {buttonId}."); + } + + internal static bool HasDialogControl(nint dialogHandle, int controlId) + { + // Resource IDs identify native controls without instantiating a potentially unresponsive UIA provider. + return GetDlgItem(dialogHandle, controlId) != 0; + } + + internal static bool IsDialogControlVisible(nint dialogHandle, int controlId) + { + // Visibility confirms that the requested property page, rather than a hidden child page, owns the control. + return FindDescendantControl(dialogHandle, controlId, requireVisible: true) != 0; + } + + internal static void SelectFirstTreePage(nint dialogHandle, int treeId) + { + var treeHandle = GetDlgItem(dialogHandle, treeId); + var rootItem = treeHandle == 0 ? 0 : SendMessage(treeHandle, TvmGetNextItem, TvgnRoot, 0); + // Selecting the root makes persisted-option tests independent of the user's remembered configuration page. + if (rootItem == 0 || SendMessage(treeHandle, TvmSelectItem, TvgnCaret, rootItem) == 0) + throw new InvalidOperationException("Configuration dialog did not expose a selectable General page."); + } + + internal static bool GetDialogCheckBoxState(nint dialogHandle, int checkBoxId) + { + var checkBoxHandle = FindDescendantControl(dialogHandle, checkBoxId, requireVisible: true); + if (checkBoxHandle == 0) + throw new InvalidOperationException($"Dialog did not expose visible check box {checkBoxId}."); + + // Native button state is authoritative when UIA returns a cached ToggleState after process restart. + return SendMessage(checkBoxHandle, BmGetCheck, 0, 0).ToInt64() switch + { + BstUnchecked => false, + BstChecked => true, + _ => throw new InvalidOperationException($"Dialog check box {checkBoxId} was indeterminate."), + }; + } + + internal static void ToggleDialogCheckBox(nint dialogHandle, int checkBoxId) + { + var checkBoxHandle = FindDescendantControl(dialogHandle, checkBoxId, requireVisible: true); + var originalState = GetDialogCheckBoxState(dialogHandle, checkBoxId); + // Synchronous BM_CLICK makes the subsequent state assertion independent of UIA event delivery. + SendMessage(checkBoxHandle, BmClick, 0, 0); + if (GetDialogCheckBoxState(dialogHandle, checkBoxId) == originalState) + throw new InvalidOperationException($"Dialog check box {checkBoxId} did not change after its native click."); + } + + private static nint FindDescendantControl(nint parentHandle, int controlId, bool requireVisible) + { + nint result = 0; + // Property-page controls are grandchildren of the outer dialog, so search the full native child hierarchy. + EnumChildWindows(parentHandle, (controlHandle, _) => + { + if (GetDlgCtrlID(controlHandle) != controlId || requireVisible && !IsWindowVisible(controlHandle)) + return true; + result = controlHandle; + return false; + }, 0); + return result; + } + + internal static void SelectComboBoxItem(nint dialogHandle, nint comboHandle, int index) + { + // Win32 CB_SETCURSEL does not notify the owner, so mirror a user choice with the required CBN_SELCHANGE command. + var selected = SendMessage(comboHandle, CbSetCurSel, index, 0).ToInt64(); + if (selected != index) + throw new InvalidOperationException($"Combo box did not select item {index}."); + + var command = (CbnSelChange << 16) | (GetDlgCtrlID(comboHandle) & 0xFFFF); + SendMessage(dialogHandle, WmCommand, command, comboHandle); + } + + internal static int GetComboBoxSelection(nint comboHandle) + { + // Query native state because UIA can retain a stale SelectionItem view after a Win32 notification. + return checked((int)SendMessage(comboHandle, CbGetCurSel, 0, 0).ToInt64()); } internal static void QuickSearch(nint listHandle, string name) @@ -55,16 +319,11 @@ internal static void QuickSearch(nint listHandle, string name) SendMessage(listHandle, WmChar, character, 1); } - internal static void ToggleFocusedSelection(nint listHandle) - { - // Insert is the native panel gesture that selects the focused item while preserving prior selections. - SetFocus(listHandle); - SendMessage(listHandle, WmKeyDown, 0x2D, 0); // VK_INSERT - } - - internal static int GetListViewItemCount(nint listHandle) + internal static void PressEnter(nint controlHandle) { - // LVM_GETITEMCOUNT crosses process boundaries without caller-owned buffers and works for the virtual Find list. - return checked((int)SendMessage(listHandle, LvmGetItemCount, 0, 0)); + // Submit native Help search input without depending on the localized search-button caption. + SetFocus(controlHandle); + SendMessage(controlHandle, WmKeyDown, VkReturn, 0); + SendMessage(controlHandle, WmKeyUp, VkReturn, 0); } } diff --git a/tests/FileManager.UiTests/Infrastructure/UiTestSettings.cs b/tests/FileManager.UiTests/Infrastructure/UiTestSettings.cs index cdd2d7be..33f31a02 100644 --- a/tests/FileManager.UiTests/Infrastructure/UiTestSettings.cs +++ b/tests/FileManager.UiTests/Infrastructure/UiTestSettings.cs @@ -10,15 +10,6 @@ internal static class UiTestSettings internal static string Arguments => Environment.GetEnvironmentVariable("FILEMANAGER_UI_ARGUMENTS") ?? string.Empty; - internal static int RequireFtpOrganizeCommand() - { - // Plug-in menu command IDs are allocated by the host at runtime, so the isolated test runner supplies this ID. - if (!int.TryParse(Environment.GetEnvironmentVariable("FILEMANAGER_UI_FTP_ORGANIZE_COMMAND"), out var command) || command <= 0) - Assert.Ignore("Set FILEMANAGER_UI_FTP_ORGANIZE_COMMAND to the FTP plug-in's runtime Organize Bookmarks command ID to run FTP persistence tests."); - - return command; - } - internal static void RequireIsolatedProfile() { // UI tests save FileManager configuration, so prevent accidental execution against a developer profile. @@ -36,6 +27,33 @@ internal static void RequireConfigurationFaultInjection() Assert.Ignore("Set FILEMANAGER_UI_CONFIG_FAULT_INJECTION=1 to run the exhaustive configuration write-boundary recovery test."); } + internal static int LimitConfigurationFaultBoundaries(int measuredCount) + { + // Optional smoke runs may cap the matrix; the unset default remains exhaustive for the dedicated recovery lane. + return int.TryParse(Environment.GetEnvironmentVariable("FILEMANAGER_UI_CONFIG_FAULT_BOUNDARY_LIMIT"), out var limit) && limit > 0 + ? Math.Min(measuredCount, limit) + : measuredCount; + } + + internal static void RequireZipPlugin() + { + RequireIsolatedProfile(); + // The opt-in confirms both deployment and enablement because a disabled plug-in is indistinguishable through the public UI. + if (!string.Equals(Environment.GetEnvironmentVariable("FILEMANAGER_UI_ZIP_PLUGIN"), "1", StringComparison.Ordinal)) + Assert.Ignore("Install and enable the Zip plug-in, then set FILEMANAGER_UI_ZIP_PLUGIN=1 to run ZIP navigation characterization."); + } + + internal static (string SearchTerm, string ExpectedResult) RequireHelpSearchFixture() + { + RequireIsolatedProfile(); + var term = Environment.GetEnvironmentVariable("FILEMANAGER_UI_HELP_SEARCH_TERM"); + var expected = Environment.GetEnvironmentVariable("FILEMANAGER_UI_HELP_EXPECTED_RESULT"); + if (string.IsNullOrWhiteSpace(term) || string.IsNullOrWhiteSpace(expected)) + Assert.Ignore("Deploy salamand.chm and set FILEMANAGER_UI_HELP_SEARCH_TERM plus FILEMANAGER_UI_HELP_EXPECTED_RESULT for its language."); + + return (term!, expected!); + } + internal static string RequireCrossVolumeRoot() { var root = Environment.GetEnvironmentVariable("FILEMANAGER_UI_CROSS_VOLUME_ROOT"); diff --git a/tests/FileManager.UiTests/NativeSafetyRegressionTests.cs b/tests/FileManager.UiTests/NativeSafetyRegressionTests.cs index 338ffe88..dc1028b6 100644 --- a/tests/FileManager.UiTests/NativeSafetyRegressionTests.cs +++ b/tests/FileManager.UiTests/NativeSafetyRegressionTests.cs @@ -514,10 +514,8 @@ public void Shared_plugin_thread_queue_uses_owned_cooperative_shutdown_without_f var owner = File.ReadAllText(Path.Combine(root, "src", "plugins", "shared", "plugin_thread_owner.h")); var ftpConsumer = File.ReadAllText(Path.Combine(root, "src", "plugins", "ftp", "fs1.cpp")); var ratchet = File.ReadAllText(Path.Combine(root, "tools", "verify-no-new-raw-thread-creation.ps1")); - var refactoring = File.ReadAllText(Path.Combine(root, "refactoring.md")); - // The shared queue is compiled into many plug-ins, so preserve its API - // while pinning the cooperative ownership boundary and safe-join order. + // Pin the executable cooperative-shutdown contract without coupling safety coverage to editable documentation prose. Assert.Multiple(() => { Assert.That(queueHeader, Does.Contain("CPluginThreadOwner* Owner")); @@ -538,7 +536,6 @@ public void Shared_plugin_thread_queue_uses_owned_cooperative_shutdown_without_f Assert.That(ftpConsumer, Does.Contain("CThreadQueue AuxThreadQueue(\"FTP Aux\")")); Assert.That(ftpConsumer, Does.Contain("AuxThreadQueue.KillAll(TRUE, 0, 0)")); Assert.That(ratchet, Does.Contain("src/plugins/shared/plugin_thread_owner.h")); - Assert.That(refactoring, Does.Contain("`CPluginThreadOwner` adapts the shared plug-in queue")); }); } @@ -1189,9 +1186,9 @@ public void Plugin_entry_scope_and_callback_state_restore_host_state_after_an_un Assert.That(loader, Does.Contain("~CPluginEntryScope()")); Assert.That(loader, Does.Contain("CPluginDataLock dataLock")); Assert.That(loader, Does.Contain("PluginIface.Init(NULL, 0)")); - // This ordering contract spans lines, so accept both Git checkout - // conventions while still requiring the two calls to remain adjacent. - Assert.That(loader, Does.Match(@"CallbackState\.Leave\(\);\r?\n SalamanderGeneral\.Init\(PluginIface\.GetInterface\(\)\);")); + // Source files may use either Git or Windows line endings; the ordering invariant is platform-independent. + Assert.That(loader.ReplaceLineEndings("\n"), + Does.Contain("CallbackState.Leave();\n SalamanderGeneral.Init(PluginIface.GetInterface());")); Assert.That(loader, Does.Contain("CPluginEntryScope pluginEntry(Plugins.GetCallbackState(), PluginIface,")); Assert.That(loader, Does.Contain("pluginEntry.SetReturnedInterface(resIface)")); Assert.That(loader, Does.Not.Contain("EnterPlugin(); // for the plugin entry point")); @@ -1883,9 +1880,9 @@ public void Bundled_sqlite_uses_a_verified_current_amalgamation_and_exercises_th Assert.That(policy, Does.Contain("628a44cfe82c66aed1ccbbe85a562d2e33ebe64b3288981ed76285612227934e")); Assert.That(policy, Does.Contain("PRAGMA integrity_check")); Assert.That(policy, Does.Contain("BEGIN IMMEDIATE")); - // The policy sentence spans lines; tolerate CRLF without weakening - // the exact prohibition guarded by this contract test. - Assert.That(policy, Does.Match("FileManager must not run\\r?\\nintegrity checks, checkpoints, migrations, or recovery writes against it\\.")); + // Vendor policy validation must not depend on the checkout's configured line-ending convention. + Assert.That(policy.ReplaceLineEndings("\n"), + Does.Contain("FileManager must not run\nintegrity checks, checkpoints, migrations, or recovery writes against it.")); Assert.That(externalReader, Does.Contain("SQLITE_OPEN_READONLY")); Assert.That(externalReader, Does.Contain("never a FileManager recovery or write target")); Assert.That(recoveryTest, Does.Contain("PRAGMA journal_mode=WAL")); diff --git a/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs b/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs index 21e7ab14..3fc648ec 100644 --- a/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs +++ b/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs @@ -29,11 +29,21 @@ protected override void BeforeFileManagerStarted() $"STATE|0|temporary-ready{Environment.NewLine}"); } + protected override bool IsExpectedStartupModal(nint windowHandle) + { + // Stable dialog/control IDs identify the recovery choice without depending on its localized title or text. + return NativeCommands.GetWindowClassName(windowHandle) == "#32770" && + NativeCommands.HasDialogControl(windowHandle, 2477) && + NativeCommands.HasDialogControl(windowHandle, 6) && + NativeCommands.HasDialogControl(windowHandle, 7) && + NativeCommands.HasDialogControl(windowHandle, 2); + } + [Test] [Category("Recovery")] public void Restart_reconciliation_commits_a_fully_written_transactional_target() { - // Startup reaches the main window before presenting the modal recovery choice. + // The fixture accepts the expected startup modal before its disabled owner would satisfy normal readiness. ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES: resume a ready target var completion = WaitForOperationPrompt(1); // IDOK: recovery summary ChooseOperationPrompt(completion, 1); diff --git a/tests/FileManager.UiTests/README.md b/tests/FileManager.UiTests/README.md index 7debcd2e..4bc4a298 100644 --- a/tests/FileManager.UiTests/README.md +++ b/tests/FileManager.UiTests/README.md @@ -9,11 +9,14 @@ Set these environment variables before running: - `FILEMANAGER_UI_ISOLATED=1` — confirms that the current Windows profile is disposable. - `FILEMANAGER_UI_EXE` — absolute path to `salamand.exe` or a debug build of the executable. - `FILEMANAGER_UI_ARGUMENTS` — optional command-line arguments, for example a test-only `-c` configuration file. -- `FILEMANAGER_UI_FTP_ORGANIZE_COMMAND` — runtime command ID allocated by FileManager for the FTP Client **Organize Bookmarks** menu command. This enables the 10 FTP bookmark persistence cases; without it, only those cases are skipped with an explicit message. - `FILEMANAGER_UI_CONFIG_FAULT_INJECTION=1` — explicitly enables the exhaustive transactional-configuration crash-recovery lane described below. +- `FILEMANAGER_UI_CONFIG_FAULT_BOUNDARY_LIMIT` — optional positive boundary cap for short fault-injection smoke runs; omit it for the exhaustive lane. - `FILEMANAGER_UI_CROSS_VOLUME_ROOT` — an existing dedicated directory on a different volume from `%TEMP%`. This enables the cross-volume move characterization fixture; the fixture creates and removes only a GUID-named child below this directory. - `FILEMANAGER_UI_ADS_UNSUPPORTED_TARGET_ROOT` — an existing dedicated directory on a different volume that does not support alternate data streams (for example FAT/FAT32/exFAT). This enables the ADS metadata-loss decision scenario and the fixture creates and removes only a GUID-named child below this directory. - `FILEMANAGER_UI_RECYCLE_BIN=1` — explicitly enables the recycle-bin characterization test. It requires the default recycle-bin delete setting in the isolated profile and adds one disposable file to that profile's recycle bin. +- `FILEMANAGER_UI_ZIP_PLUGIN=1` — confirms that the Zip plug-in is installed and enabled for the reported ZIP-navigation characterization test. +- `FILEMANAGER_UI_HELP_SEARCH_TERM` — a search term known to exist in the language-specific deployed `salamand.chm`. +- `FILEMANAGER_UI_HELP_EXPECTED_RESULT` — text expected in the Help Search result for that term. Run the suite on an interactive Windows desktop session: @@ -25,11 +28,29 @@ The configuration dialog is opened through its stable native command ID only to File-operation cases create a fresh disposable directory tree under the system temporary directory for every test, start the left and right panels with `-l`/`-r`, and use the host's stable native command IDs. They verify files and nested directory trees after normal operations, copy and move overwrite/skip conflict choices, rename overwrite-decline and case-only behavior, mixed-selection deletion, continuation after a skipped delete error, file search, internal viewing, configured-editor launch, metadata preservation, cancellation after the worker has started, and destination/name failures. ADS cases create named, empty, large, and edge-named streams; exercise overwrite and retry after a temporarily denied stream; and verify cross-volume preservation or explicit source retention when an ADS-unsupported target reports metadata loss. The recovery fixture seeds an incomplete durable journal with a ready transactional sibling file before launch, then verifies the real startup reconciliation flow. The tests never use a caller-supplied directory as their mutation target; cross-volume cases use only a GUID child under the explicitly configured disposable root. -The FTP plug-in menu command has no compile-time host command ID: FileManager allocates it while loading plug-ins. Keep the value in the isolated test environment rather than hard-coding it into the test project. The dialog controls themselves are located by their stable plug-in resource IDs and their persistence is asserted through UIA3 after a full application restart. +The FTP plug-in menu command has no compile-time host command ID: FileManager allocates it while loading plug-ins. The isolated test protocol queries that runtime ID from the tested process; when the FTP plug-in is absent, only the dependent cases are skipped with an explicit prerequisite message. The dialog controls themselves are located by their stable plug-in resource IDs and their persistence is asserted through UIA3 after a full application restart. + +## Reported-defect characterization + +`ReportedDefectCharacterizationUiTests` records four product reports without changing application behavior: ZIP navigation after its information dialog, language-specific Help Search results, move-collision overwrite and cancel semantics, and responsiveness plus editor launch through **Files > Edit**. These are regression contracts, so a failed assertion can be the intended evidence that the reported product defect is present; a crashed or stalled test host is never an acceptable result. + +The move and edit cases are self-contained. ZIP is skipped unless `FILEMANAGER_UI_ZIP_PLUGIN=1` explicitly confirms the plug-in is installed and enabled. Help Search is skipped unless a language-specific `help//salamand.chm` is deployed and both Help fixture variables are set. For example: + +```powershell +$env:FILEMANAGER_UI_ISOLATED = '1' +$env:FILEMANAGER_UI_EXE = 'D:\FileManager\src\vcxproj\salamander\Debug_x64\salamand.exe' +$env:FILEMANAGER_UI_ZIP_PLUGIN = '1' +$env:FILEMANAGER_UI_HELP_SEARCH_TERM = '' +$env:FILEMANAGER_UI_HELP_EXPECTED_RESULT = '' +dotnet test tests/FileManager.UiTests/FileManager.UiTests.csproj ` + --filter 'FullyQualifiedName~ReportedDefectCharacterizationUiTests' +``` + +The fixture creates only disposable files under its per-test temporary workspace. It may open the configured external editor, but closes only the editor window identified by its unique test filename. It must not install or reconfigure plug-ins, replace help content, change editor configuration, or modify native application code to make the assertions pass. ## Transactional configuration fault injection -The `FaultInjection` category first measures the exact registry-write count of a real configuration commit, then starts a fresh executable for every write boundary. The native test hook terminates that process immediately after the selected successful registry mutation. A clean restart must show either the complete baseline setting or the complete candidate setting; the test fails if the process did not terminate at the requested boundary or if restart exposes a mixture. +The `FaultInjection` category first measures the exact registry-write count of a real configuration commit, then starts a fresh executable for every write boundary. After validating a clean baseline, the fixture keeps an immutable in-memory snapshot of the FileManager configuration and recovery-backup registry roots; while no FileManager process is running, it restores that snapshot before every boundary and again during final cleanup. The native test hook terminates the process immediately after the selected successful registry mutation. A clean restart must show either the complete baseline setting or the complete candidate setting; the test fails if the process did not terminate at the requested boundary or if restart exposes a mixture. Run this separately on the disposable profile because it intentionally terminates the executable many times: @@ -38,4 +59,4 @@ $env:FILEMANAGER_UI_CONFIG_FAULT_INJECTION = '1' dotnet test tests/FileManager.UiTests/FileManager.UiTests.csproj --filter TestCategory=FaultInjection ``` -The executable honors `FILEMANAGER_CONFIG_FAULT_AFTER_WRITE` and `FILEMANAGER_CONFIG_FAULT_REPORT` only while `FILEMANAGER_UI_ISOLATED=1` is present. The test supplies those two variables to its child executable processes; users should not need to set them manually. +The fixture supplies `FILEMANAGER_CONFIG_FAULT_REPORT` to measure a completed save and arms each interruption through the isolated native test protocol; users should not set these internal controls manually. diff --git a/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs b/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs index bcd05bd6..26e25f30 100644 --- a/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs +++ b/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs @@ -20,8 +20,6 @@ public sealed class ReparsePointTopologyUiTests : FileOperationUiTestBase protected override void BeforeFileManagerStarted() { - base.BeforeFileManagerStarted(); - operationRoot = Workspace.SourcePath("reparse-operation-root"); firstOutsideTarget = Path.Combine(Workspace.RootDirectory, "outside-first-target"); changedOutsideTarget = Path.Combine(Workspace.RootDirectory, "outside-changed-target"); @@ -50,10 +48,9 @@ protected override void BeforeFileManagerStarted() Directory.CreateSymbolicLink(Path.Combine(operationRoot, "outside-symlink"), changedOutsideTarget); directorySymlinkAvailable = true; } - catch (UnauthorizedAccessException) + catch (Exception exception) when (IsSymbolicLinkPrivilegeUnavailable(exception)) { - // Junction coverage remains available on hosts that have not - // enabled the Windows symbolic-link developer privilege. + // Junction coverage remains available when Windows reports ERROR_PRIVILEGE_NOT_HELD as IOException or access denied. } } @@ -80,7 +77,7 @@ public void Copy_does_not_traverse_changed_or_cyclic_junction_targets_outside_th public void Delete_junction_removes_only_the_link_and_never_its_target() { SelectSourceItem("delete-junction"); - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, NativeCommands.DeleteFiles); + NativeCommands.Execute(MainWindowHandle, NativeCommands.DeleteFiles); ConfirmDeleteIfPrompted(); WaitForFileSystem(() => !Directory.Exists(Workspace.SourcePath("delete-junction")), @@ -120,4 +117,11 @@ private static void CreateJunction(string linkPath, string targetPath) Assert.That(process.ExitCode, Is.Zero, "Creating the disposable junction failed."); Assert.That(Directory.Exists(linkPath), Is.True, "The disposable junction was not created."); } + + private static bool IsSymbolicLinkPrivilegeUnavailable(Exception exception) + { + // .NET maps CreateSymbolicLink privilege failures differently across Windows runtime versions. + return exception is UnauthorizedAccessException || + exception is IOException && (exception.HResult & 0xFFFF) == 1314; // ERROR_PRIVILEGE_NOT_HELD + } } diff --git a/tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs b/tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs new file mode 100644 index 00000000..7210e451 --- /dev/null +++ b/tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs @@ -0,0 +1,270 @@ +using System.IO.Compression; +using System.Diagnostics; +using FileManager.UiTests.Infrastructure; +using FlaUI.Core.AutomationElements; +using FlaUI.Core.Definitions; +using NUnit.Framework; + +namespace FileManager.UiTests; + +[TestFixture] +[Category("UI")] +[Category("Characterization")] +[Category("KnownDefect")] +public sealed class ReportedDefectCharacterizationUiTests : FileOperationUiTestBase +{ + private const string ZipName = "characterization-open.zip"; + private const string ZipPayloadName = "zip-characterization-payload.txt"; + private const string MoveOverwriteName = "move-overwrite-characterization.txt"; + private const string MoveCancelName = "move-cancel-characterization.txt"; + private readonly string editFileName = $"files-menu-edit-{Guid.NewGuid():N}.txt"; + private readonly HashSet journalsBeforeStart = new(StringComparer.OrdinalIgnoreCase); + + protected override void BeforeFileManagerStarted() + { + journalsBeforeStart.Clear(); + var journalDirectory = GetOperationJournalDirectory(); + if (Directory.Exists(journalDirectory)) + journalsBeforeStart.UnionWith(Directory.EnumerateFiles(journalDirectory)); + // Seed every reported scenario before launch so the first native panel listing contains deterministic fixtures. + CreateZipFixture(); + File.WriteAllText(Workspace.SourcePath(MoveOverwriteName), "move-overwrite-source"); + File.WriteAllText(Workspace.TargetPath(MoveOverwriteName), "move-overwrite-existing-target"); + File.WriteAllText(Workspace.SourcePath(MoveCancelName), "move-cancel-source"); + File.WriteAllText(Workspace.TargetPath(MoveCancelName), "move-cancel-existing-target"); + File.WriteAllText(Workspace.SourcePath(editFileName), "edit-characterization-content"); + } + + protected override void OnAfterFileManagerStopped() + { + try + { + var journalDirectory = GetOperationJournalDirectory(); + if (!Directory.Exists(journalDirectory)) + return; + + // A deliberately failing operation must not leave recovery input that changes the next independent test. + foreach (var journal in Directory.EnumerateFiles(journalDirectory).Where(path => !journalsBeforeStart.Contains(path))) + File.Delete(journal); + } + finally + { + base.OnAfterFileManagerStopped(); + } + } + + [Test] + public void Zip_open_after_information_dialog_navigates_into_archive() + { + UiTestSettings.RequireZipPlugin(); + + SelectSourceItem(ZipName); + NativeCommands.Execute(MainWindowHandle, NativeCommands.Open); + // The reported defect shows an informational OK dialog before returning to an unchanged panel. + DismissOptionalPrompt(1, TimeSpan.FromSeconds(3), 1); + + WaitForCondition( + () => NativeCommands.GetWindowTitle(MainWindowHandle).Contains(ZipName, StringComparison.OrdinalIgnoreCase), + "After accepting the ZIP-open message, FileManager did not navigate into the selected archive."); + + // Quick search proves that navigation exposes archive contents rather than only changing decorative window text. + SelectSourceItem(ZipPayloadName); + } + + [Test] + public void Help_search_returns_the_configured_existing_help_result() + { + var (searchTerm, expectedResult) = UiTestSettings.RequireHelpSearchFixture(); + RequireDeployedMainHelp(); + var windowsBefore = NativeCommands.GetVisibleTopLevelWindowHandles().ToHashSet(); + nint helpWindowHandle = 0; + try + { + NativeCommands.Execute(MainWindowHandle, NativeCommands.HelpSearch); + helpWindowHandle = WaitForNewTopLevelWindow(windowsBefore, + handle => string.Equals(NativeCommands.GetWindowClassName(handle), "HH Parent", StringComparison.Ordinal)); + + var helpWindow = Automation.FromHandle(helpWindowHandle).AsWindow(); + var searchInput = helpWindow.FindAllDescendants() + .FirstOrDefault(element => element.ControlType == ControlType.Edit && element.IsEnabled) + ?.AsTextBox(); + Assert.That(searchInput, Is.Not.Null, "The Help Search panel did not expose an enabled search input."); + + searchInput!.Text = searchTerm; + NativeCommands.PressEnter(searchInput.Properties.NativeWindowHandle.Value); + + WaitForCondition(() => HelpWindowContains(helpWindowHandle, expectedResult), + $"Help Search did not return the configured existing result '{expectedResult}' for '{searchTerm}'."); + } + finally + { + // HTML Help owns a top-level window outside normal FileManager dialog cleanup. + NativeCommands.RequestWindowClose(helpWindowHandle); + } + } + + [Test] + public void Move_overwrite_replaces_existing_target_instead_of_deleting_it() + { + var source = Workspace.SourcePath(MoveOverwriteName); + var target = Workspace.TargetPath(MoveOverwriteName); + + ExecuteWithPath(NativeCommands.MoveFiles, MoveOverwriteName, Workspace.TargetDirectory, commit: true); + ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES: overwrite + + WaitForFileSystem(() => !File.Exists(source), "Confirmed move overwrite did not finish removing the source."); + Assert.Multiple(() => + { + Assert.That(File.Exists(target), Is.True, + "Move overwrite deleted the existing target instead of replacing it."); + Assert.That(File.ReadAllText(target), Is.EqualTo("move-overwrite-source"), + "Move overwrite did not preserve the moved source content at the target."); + }); + } + + [Test] + public void Move_collision_cancel_keeps_both_files_unchanged() + { + var source = Workspace.SourcePath(MoveCancelName); + var target = Workspace.TargetPath(MoveCancelName); + + ExecuteWithPath(NativeCommands.MoveFiles, MoveCancelName, Workspace.TargetDirectory, commit: true); + ChooseOperationPrompt(WaitForOperationPrompt(2), 2); // IDCANCEL + + Assert.Multiple(() => + { + Assert.That(File.ReadAllText(source), Is.EqualTo("move-cancel-source"), + "Cancelling a move collision changed or removed the source."); + Assert.That(File.ReadAllText(target), Is.EqualTo("move-cancel-existing-target"), + "Cancelling a move collision changed or removed the existing target."); + }); + } + + [Test] + public void Files_menu_edit_opens_editor_without_freezing_main_window() + { + var windowsBefore = NativeCommands.GetVisibleTopLevelWindowHandles().ToHashSet(); + var notepadProcessesBefore = Process.GetProcessesByName("notepad") + .Select(process => + { + using (process) + return process.Id; + }) + .ToHashSet(); + nint editorWindowHandle = 0; + try + { + SelectSourceItem(editFileName); + NativeCommands.Execute(MainWindowHandle, NativeCommands.Edit); + + var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(10); + var lastResponsive = DateTime.UtcNow; + while (DateTime.UtcNow < deadline) + { + if (NativeCommands.IsWindowResponsive(MainWindowHandle)) + lastResponsive = DateTime.UtcNow; + else if (DateTime.UtcNow - lastResponsive > TimeSpan.FromSeconds(2)) + Assert.Fail("Files > Edit left the FileManager main window unresponsive for more than two seconds."); + + editorWindowHandle = NativeCommands.GetVisibleTopLevelWindowHandles() + .FirstOrDefault(handle => !windowsBefore.Contains(handle) && + NativeCommands.GetWindowTitle(handle) + .Contains(editFileName, StringComparison.OrdinalIgnoreCase)); + if (editorWindowHandle != 0) + return; + Thread.Sleep(100); + } + + Assert.Fail("Files > Edit did not open an editor window for the selected file within ten seconds."); + } + finally + { + // The unique file name restricts cleanup to the editor window created by this case. + if (editorWindowHandle == 0) + { + editorWindowHandle = NativeCommands.GetVisibleTopLevelWindowHandles() + .FirstOrDefault(handle => !windowsBefore.Contains(handle) && + NativeCommands.GetWindowTitle(handle) + .Contains(editFileName, StringComparison.OrdinalIgnoreCase)); + } + NativeCommands.RequestWindowClose(editorWindowHandle); + CloseTestOwnedDefaultEditorProcesses(notepadProcessesBefore); + } + } + + private void CreateZipFixture() + { + using var archive = ZipFile.Open(Workspace.SourcePath(ZipName), ZipArchiveMode.Create); + var entry = archive.CreateEntry(ZipPayloadName); + using var writer = new StreamWriter(entry.Open()); + writer.Write("zip-characterization-content"); + } + + private static string GetOperationJournalDirectory() => Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Open Salamander", "operation-journals"); + + private static void CloseTestOwnedDefaultEditorProcesses(IReadOnlySet processesBefore) + { + foreach (var process in Process.GetProcessesByName("notepad")) + { + using (process) + { + // A frozen default editor may never create an HWND, so its post-command PID is the only safe cleanup identity. + if (processesBefore.Contains(process.Id) || process.HasExited) + continue; + process.Kill(entireProcessTree: true); + process.WaitForExit(5000); + } + } + } + + private static void RequireDeployedMainHelp() + { + var executableDirectory = Path.GetDirectoryName(UiTestSettings.ExecutablePath)!; + var helpDirectory = Path.Combine(executableDirectory, "help"); + // The search UI cannot be characterized when the selected build has no compiled main help archive. + if (!Directory.Exists(helpDirectory) || + !Directory.EnumerateFiles(helpDirectory, "salamand.chm", SearchOption.AllDirectories).Any()) + Assert.Ignore("Deploy help//salamand.chm beside the tested executable to run Help Search characterization."); + } + + private nint WaitForNewTopLevelWindow(IReadOnlySet windowsBefore, Func predicate) + { + var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(10); + while (DateTime.UtcNow < deadline) + { + var handle = NativeCommands.GetVisibleTopLevelWindowHandles() + .FirstOrDefault(candidate => !windowsBefore.Contains(candidate) && predicate(candidate)); + if (handle != 0) + return handle; + if (!NativeCommands.IsWindowResponsive(MainWindowHandle)) + Assert.Fail("FileManager became unresponsive while opening the requested top-level window."); + Thread.Sleep(100); + } + + Assert.Fail("The requested top-level window did not open within ten seconds."); + return 0; + } + + private bool HelpWindowContains(nint helpWindowHandle, string expectedResult) + { + if (!NativeCommands.IsWindowAvailable(helpWindowHandle)) + return false; + var helpWindow = Automation.FromHandle(helpWindowHandle); + // Result discovery remains language-configurable while still asserting the real rendered Help UI. + return helpWindow.FindAllDescendants() + .Any(element => element.Name.Contains(expectedResult, StringComparison.OrdinalIgnoreCase)); + } + + private static void WaitForCondition(Func predicate, string failureMessage) + { + var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(10); + while (DateTime.UtcNow < deadline) + { + if (predicate()) + return; + Thread.Sleep(100); + } + Assert.Fail(failureMessage); + } +} diff --git a/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs b/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs index 9873bdd9..bb8ee11b 100644 --- a/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs +++ b/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs @@ -12,17 +12,20 @@ namespace FileManager.UiTests; [NonParallelizable] public sealed class SChannelTlsIntegrationTests { + private static readonly TimeSpan HandshakeTimeout = TimeSpan.FromSeconds(5); + [TestCase(SslProtocols.Tls12)] [TestCase(SslProtocols.Tls13)] public async Task LocalTlsServerNegotiatesTheRequiredProtocol(SslProtocols protocol) { + using var timeout = new CancellationTokenSource(HandshakeTimeout); using var certificate = CreateCertificate(); using var listener = new TcpListener(IPAddress.Loopback, 0); listener.Start(); - var server = AcceptAndAuthenticateAsync(listener, certificate, protocol); + var server = AcceptAndAuthenticateAsync(listener, certificate, protocol, timeout.Token); using var client = new TcpClient(); - await client.ConnectAsync(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port); + await client.ConnectAsync(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port, timeout.Token); using var stream = new SslStream(client.GetStream(), false, (_, _, _, _) => true); try { @@ -31,45 +34,81 @@ await stream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions TargetHost = "localhost", EnabledSslProtocols = protocol, CertificateRevocationCheckMode = X509RevocationMode.NoCheck - }); + }, timeout.Token); + + Assert.That(stream.SslProtocol, Is.EqualTo(protocol)); + Assert.That(await server.WaitAsync(timeout.Token), Is.EqualTo(protocol)); + } + catch (OperationCanceledException error) when (timeout.IsCancellationRequested) + { + throw new AssertionException($"The local {protocol} SChannel handshake did not complete within {HandshakeTimeout.TotalSeconds:0} seconds.", error); } catch (Exception clientError) { - try { await server; } + try { await server.WaitAsync(timeout.Token); } + catch (OperationCanceledException serverError) when (timeout.IsCancellationRequested) + { + // Preserve the initiating client error while classifying the peer cancellation as the shared handshake deadline. + throw new AssertionException($"The local {protocol} SChannel handshake did not complete within {HandshakeTimeout.TotalSeconds:0} seconds.", + new AggregateException(clientError, serverError)); + } catch (Exception serverError) { throw new AssertionException($"TLS server failed: {serverError}", clientError); } throw; } - - Assert.That(stream.SslProtocol, Is.EqualTo(protocol)); - Assert.That(await server, Is.EqualTo(protocol)); + finally + { + await StopAndObserveServerAsync(timeout, listener, server); + } } [Test] public async Task SelfSignedServerCertificateIsRejectedWithoutAnExplicitUserException() { + using var timeout = new CancellationTokenSource(HandshakeTimeout); using var certificate = CreateCertificate(); using var listener = new TcpListener(IPAddress.Loopback, 0); listener.Start(); - var server = AcceptAndAuthenticateAsync(listener, certificate, SslProtocols.Tls12); + var server = AcceptAndAuthenticateAsync(listener, certificate, SslProtocols.Tls12, timeout.Token); using var client = new TcpClient(); - await client.ConnectAsync(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port); + await client.ConnectAsync(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port, timeout.Token); using var stream = new SslStream(client.GetStream(), false); - Assert.That(async () => await stream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions + try { - TargetHost = "localhost", - EnabledSslProtocols = SslProtocols.Tls12, - CertificateRevocationCheckMode = X509RevocationMode.NoCheck - }), Throws.TypeOf()); + Assert.That(async () => await stream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions + { + TargetHost = "localhost", + EnabledSslProtocols = SslProtocols.Tls12, + CertificateRevocationCheckMode = X509RevocationMode.NoCheck + }, timeout.Token), Throws.TypeOf()); + + try { await server.WaitAsync(timeout.Token); } + catch (AuthenticationException) { } + } + catch (OperationCanceledException error) when (timeout.IsCancellationRequested) + { + throw new AssertionException($"The self-signed certificate rejection did not complete within {HandshakeTimeout.TotalSeconds:0} seconds.", error); + } + finally + { + await StopAndObserveServerAsync(timeout, listener, server); + } + } - try { await server; } - catch (AuthenticationException) { } + private static async Task StopAndObserveServerAsync(CancellationTokenSource timeout, TcpListener listener, Task server) + { + // Cancel, close, and observe every peer task so failed handshakes cannot retain a listener or testhost thread. + timeout.Cancel(); + listener.Stop(); + try { await server.WaitAsync(TimeSpan.FromSeconds(1)); } + catch { } } - private static async Task AcceptAndAuthenticateAsync(TcpListener listener, X509Certificate2 certificate, SslProtocols protocol) + private static async Task AcceptAndAuthenticateAsync(TcpListener listener, X509Certificate2 certificate, + SslProtocols protocol, CancellationToken cancellationToken) { - using var server = await listener.AcceptTcpClientAsync(); + using var server = await listener.AcceptTcpClientAsync(cancellationToken); using var stream = new SslStream(server.GetStream(), false); await stream.AuthenticateAsServerAsync(new SslServerAuthenticationOptions { @@ -77,7 +116,7 @@ await stream.AuthenticateAsServerAsync(new SslServerAuthenticationOptions EnabledSslProtocols = protocol, ClientCertificateRequired = false, CertificateRevocationCheckMode = X509RevocationMode.NoCheck - }); + }, cancellationToken); return stream.SslProtocol; } diff --git a/tests/FileManager.UiTests/ToolbarIconSizeUiTests.cs b/tests/FileManager.UiTests/ToolbarIconSizeUiTests.cs index a28d6570..56959e5b 100644 --- a/tests/FileManager.UiTests/ToolbarIconSizeUiTests.cs +++ b/tests/FileManager.UiTests/ToolbarIconSizeUiTests.cs @@ -25,7 +25,8 @@ public void Customize_toolbar_cycles_all_icon_sizes_and_persists_the_choice_afte // Closing between choices exercises the native image-list rebuild and layout path for every supported size. for (var index = 0; index < 3; index++) { - combo.Items[index].Select(); + NativeCommands.SelectComboBoxItem(dialog.Properties.NativeWindowHandle.Value, + combo.Properties.NativeWindowHandle.Value, index); CloseCustomizeToolbarDialog(dialog); dialog = OpenCustomizeToolbarDialog(); combo = GetIconSizeCombo(dialog); @@ -42,15 +43,16 @@ public void Customize_toolbar_cycles_all_icon_sizes_and_persists_the_choice_afte "The large toolbar icon preference was not restored after restarting the executable."); // Restore the disposable profile to its incoming setting so repeated UI runs remain independent. - combo.Items[originalIndex].Select(); + NativeCommands.SelectComboBoxItem(dialog.Properties.NativeWindowHandle.Value, + combo.Properties.NativeWindowHandle.Value, originalIndex); CloseCustomizeToolbarDialog(dialog); Thread.Sleep(500); } private Window OpenCustomizeToolbarDialog() { - NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, NativeCommands.CustomizeTopToolbar); - return WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value); + NativeCommands.Execute(MainWindowHandle, NativeCommands.CustomizeTopToolbar); + return WaitForWindow(window => window.Properties.NativeWindowHandle.Value != MainWindowHandle); } private static ComboBox GetIconSizeCombo(Window dialog) @@ -63,8 +65,8 @@ private static ComboBox GetIconSizeCombo(Window dialog) private static int GetSelectedIndex(ComboBox combo) { - var items = combo.Items; - var selected = Array.FindIndex(items, item => item.IsSelected); + // Native selection is authoritative because Win32 UIA providers may cache SelectionItem state. + var selected = NativeCommands.GetComboBoxSelection(combo.Properties.NativeWindowHandle.Value); Assert.That(selected, Is.GreaterThanOrEqualTo(0), "The icon-size selector had no selected item."); return selected; } diff --git a/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json b/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json new file mode 100644 index 00000000..2a9d925c --- /dev/null +++ b/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json @@ -0,0 +1,102 @@ +{ + "format": 1, + "restore": { + "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj": {} + }, + "projects": { + "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", + "projectName": "FileManager.UiTests", + "projectPath": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", + "packagesPath": "C:\\Users\\plesz\\.nuget\\packages\\", + "outputPath": "D:\\FileManager\\tests\\FileManager.UiTests\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\plesz\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0-windows" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0-windows": { + "framework": "net8.0-windows7.0", + "targetAlias": "net8.0-windows", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.400" + }, + "frameworks": { + "net8.0-windows": { + "framework": "net8.0-windows7.0", + "targetAlias": "net8.0-windows", + "dependencies": { + "FlaUI.UIA3": { + "target": "Package", + "version": "[5.0.0, )" + }, + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.12.0, )" + }, + "NUnit": { + "target": "Package", + "version": "[4.3.2, )" + }, + "NUnit3TestAdapter": { + "suppressParent": "All", + "target": "Package", + "version": "[5.0.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[8.0.30, 8.0.30]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[8.0.30, 8.0.30]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[8.0.30, 8.0.30]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.400/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props b/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props new file mode 100644 index 00000000..bdcc9fee --- /dev/null +++ b/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props @@ -0,0 +1,28 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\plesz\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + + + + + + + + + + + C:\Users\plesz\.nuget\packages\interop.uiautomationclient\10.19041.0 + + \ No newline at end of file diff --git a/tests/FileManager.UiTests/obj/project.assets.json b/tests/FileManager.UiTests/obj/project.assets.json new file mode 100644 index 00000000..6a94405e --- /dev/null +++ b/tests/FileManager.UiTests/obj/project.assets.json @@ -0,0 +1,2490 @@ +{ + "version": 4, + "targets": { + "net8.0-windows": { + "FlaUI.Core/5.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.1", + "System.Drawing.Common": "8.0.10", + "System.Management": "8.0.0", + "System.Security.Permissions": "8.0.0" + }, + "compile": { + "lib/net8.0-windows7.0/FlaUI.Core.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0-windows7.0/FlaUI.Core.dll": { + "related": ".xml" + } + }, + "frameworkReferences": [ + "Microsoft.WindowsDesktop.App.WindowsForms" + ] + }, + "FlaUI.UIA3/5.0.0": { + "type": "package", + "dependencies": { + "FlaUI.Core": "5.0.0", + "Interop.UIAutomationClient": "10.19041.0" + }, + "compile": { + "lib/net8.0-windows7.0/FlaUI.UIA3.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0-windows7.0/FlaUI.UIA3.dll": { + "related": ".xml" + } + } + }, + "Interop.UIAutomationClient/10.19041.0": { + "type": "package", + "compile": { + "lib/netcoreapp3.0/Interop.UIAutomationClient.dll": {} + }, + "runtime": { + "lib/netcoreapp3.0/Interop.UIAutomationClient.dll": {} + }, + "build": { + "build/_._": {} + } + }, + "Microsoft.ApplicationInsights/2.22.0": { + "type": "package", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "5.0.0" + }, + "compile": { + "lib/netstandard2.0/Microsoft.ApplicationInsights.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.ApplicationInsights.dll": { + "related": ".pdb;.xml" + } + } + }, + "Microsoft.CodeCoverage/17.12.0": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "build": { + "build/netstandard2.0/Microsoft.CodeCoverage.props": {}, + "build/netstandard2.0/Microsoft.CodeCoverage.targets": {} + } + }, + "Microsoft.NET.Test.Sdk/17.12.0": { + "type": "package", + "dependencies": { + "Microsoft.CodeCoverage": "17.12.0", + "Microsoft.TestPlatform.TestHost": "17.12.0" + }, + "compile": { + "lib/netcoreapp3.1/_._": {} + }, + "runtime": { + "lib/netcoreapp3.1/_._": {} + }, + "build": { + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props": {}, + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {} + } + }, + "Microsoft.NETCore.Platforms/5.0.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "Microsoft.Testing.Extensions.Telemetry/1.5.3": { + "type": "package", + "dependencies": { + "Microsoft.ApplicationInsights": "2.22.0", + "Microsoft.Testing.Platform": "1.5.3" + }, + "compile": { + "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.dll": { + "related": ".xml" + } + }, + "resource": { + "lib/net8.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "cs" + }, + "lib/net8.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "de" + }, + "lib/net8.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "es" + }, + "lib/net8.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "fr" + }, + "lib/net8.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "it" + }, + "lib/net8.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "ja" + }, + "lib/net8.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "ko" + }, + "lib/net8.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "pl" + }, + "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "pt-BR" + }, + "lib/net8.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "ru" + }, + "lib/net8.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "tr" + }, + "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "buildTransitive/net8.0/Microsoft.Testing.Extensions.Telemetry.props": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.Testing.Extensions.Telemetry.props": {} + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions/1.5.3": { + "type": "package", + "dependencies": { + "Microsoft.Testing.Platform": "1.5.3" + }, + "compile": { + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Testing.Extensions.VSTestBridge/1.5.3": { + "type": "package", + "dependencies": { + "Microsoft.ApplicationInsights": "2.22.0", + "Microsoft.TestPlatform.ObjectModel": "17.12.0", + "Microsoft.Testing.Extensions.Telemetry": "1.5.3", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.5.3", + "Microsoft.Testing.Platform": "1.5.3" + }, + "compile": { + "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.dll": { + "related": ".xml" + } + }, + "resource": { + "lib/net8.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "cs" + }, + "lib/net8.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "de" + }, + "lib/net8.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "es" + }, + "lib/net8.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "fr" + }, + "lib/net8.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "it" + }, + "lib/net8.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "ja" + }, + "lib/net8.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "ko" + }, + "lib/net8.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "pl" + }, + "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "pt-BR" + }, + "lib/net8.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "ru" + }, + "lib/net8.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "tr" + }, + "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.Testing.Platform/1.5.3": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.Testing.Platform.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Platform.dll": { + "related": ".xml" + } + }, + "resource": { + "lib/net8.0/cs/Microsoft.Testing.Platform.resources.dll": { + "locale": "cs" + }, + "lib/net8.0/de/Microsoft.Testing.Platform.resources.dll": { + "locale": "de" + }, + "lib/net8.0/es/Microsoft.Testing.Platform.resources.dll": { + "locale": "es" + }, + "lib/net8.0/fr/Microsoft.Testing.Platform.resources.dll": { + "locale": "fr" + }, + "lib/net8.0/it/Microsoft.Testing.Platform.resources.dll": { + "locale": "it" + }, + "lib/net8.0/ja/Microsoft.Testing.Platform.resources.dll": { + "locale": "ja" + }, + "lib/net8.0/ko/Microsoft.Testing.Platform.resources.dll": { + "locale": "ko" + }, + "lib/net8.0/pl/Microsoft.Testing.Platform.resources.dll": { + "locale": "pl" + }, + "lib/net8.0/pt-BR/Microsoft.Testing.Platform.resources.dll": { + "locale": "pt-BR" + }, + "lib/net8.0/ru/Microsoft.Testing.Platform.resources.dll": { + "locale": "ru" + }, + "lib/net8.0/tr/Microsoft.Testing.Platform.resources.dll": { + "locale": "tr" + }, + "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "buildTransitive/net8.0/Microsoft.Testing.Platform.props": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.Testing.Platform.props": {} + } + }, + "Microsoft.Testing.Platform.MSBuild/1.5.3": { + "type": "package", + "dependencies": { + "Microsoft.Testing.Platform": "1.5.3" + }, + "compile": { + "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.dll": { + "related": ".xml" + } + }, + "resource": { + "lib/net8.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "cs" + }, + "lib/net8.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "de" + }, + "lib/net8.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "es" + }, + "lib/net8.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "fr" + }, + "lib/net8.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "it" + }, + "lib/net8.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "ja" + }, + "lib/net8.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "ko" + }, + "lib/net8.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "pl" + }, + "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "pt-BR" + }, + "lib/net8.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "ru" + }, + "lib/net8.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "tr" + }, + "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "buildTransitive/Microsoft.Testing.Platform.MSBuild.props": {}, + "buildTransitive/Microsoft.Testing.Platform.MSBuild.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.props": {}, + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targets": {} + } + }, + "Microsoft.TestPlatform.ObjectModel/17.12.0": { + "type": "package", + "dependencies": { + "System.Reflection.Metadata": "1.6.0" + }, + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "resource": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.TestPlatform.TestHost/17.12.0": { + "type": "package", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.12.0", + "Newtonsoft.Json": "13.0.1" + }, + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "resource": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props": {} + } + }, + "Microsoft.Win32.Registry/5.0.0": { + "type": "package", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + }, + "compile": { + "ref/netstandard2.0/Microsoft.Win32.Registry.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Win32.Registry.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "Microsoft.Win32.SystemEvents/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.Win32.SystemEvents.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Win32.SystemEvents.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/Microsoft.Win32.SystemEvents.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "Newtonsoft.Json/13.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + } + }, + "NUnit/4.3.2": { + "type": "package", + "compile": { + "lib/net8.0/nunit.framework.dll": { + "related": ".legacy.xml;.xml" + }, + "lib/net8.0/nunit.framework.legacy.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/nunit.framework.dll": { + "related": ".legacy.xml;.xml" + }, + "lib/net8.0/nunit.framework.legacy.dll": { + "related": ".xml" + } + }, + "build": { + "build/NUnit.props": {} + } + }, + "NUnit3TestAdapter/5.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Testing.Extensions.VSTestBridge": "1.5.3", + "Microsoft.Testing.Platform.MSBuild": "1.5.3" + }, + "build": { + "build/netcoreapp3.1/NUnit3TestAdapter.props": {}, + "build/netcoreapp3.1/NUnit3TestAdapter.targets": {} + } + }, + "System.CodeDom/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.CodeDom.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.CodeDom.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Configuration.ConfigurationManager/8.0.1": { + "type": "package", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.1", + "System.Security.Cryptography.ProtectedData": "8.0.0" + }, + "compile": { + "lib/net8.0/System.Configuration.ConfigurationManager.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Configuration.ConfigurationManager.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Diagnostics.DiagnosticSource/5.0.0": { + "type": "package", + "compile": { + "lib/net5.0/System.Diagnostics.DiagnosticSource.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net5.0/System.Diagnostics.DiagnosticSource.dll": { + "related": ".xml" + } + } + }, + "System.Diagnostics.EventLog/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": { + "assetType": "runtime", + "rid": "win" + }, + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Diagnostics.PerformanceCounter/8.0.1": { + "type": "package", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.1" + }, + "compile": { + "lib/net8.0/System.Diagnostics.PerformanceCounter.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Diagnostics.PerformanceCounter.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.Diagnostics.PerformanceCounter.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Drawing.Common/8.0.10": { + "type": "package", + "dependencies": { + "Microsoft.Win32.SystemEvents": "8.0.0" + }, + "compile": { + "lib/net8.0/System.Drawing.Common.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net8.0/System.Drawing.Common.dll": { + "related": ".pdb;.xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Management/8.0.0": { + "type": "package", + "dependencies": { + "System.CodeDom": "8.0.0" + }, + "compile": { + "lib/net8.0/System.Management.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Management.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.Management.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Reflection.Metadata/1.6.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + } + }, + "System.Security.AccessControl/5.0.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + }, + "compile": { + "ref/netstandard2.0/System.Security.AccessControl.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Security.AccessControl.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Security.Cryptography.ProtectedData/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Security.Permissions/8.0.0": { + "type": "package", + "dependencies": { + "System.Windows.Extensions": "8.0.0" + }, + "compile": { + "lib/net8.0/System.Security.Permissions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Security.Permissions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Security.Principal.Windows/5.0.0": { + "type": "package", + "compile": { + "ref/netcoreapp3.0/System.Security.Principal.Windows.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Security.Principal.Windows.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Windows.Extensions/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Windows.Extensions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Windows.Extensions.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.Windows.Extensions.dll": { + "assetType": "runtime", + "rid": "win" + } + } + } + } + }, + "libraries": { + "FlaUI.Core/5.0.0": { + "sha512": "VWWYqwjsYkii2BrUsz5+bpXEp27NherKhLt19hTxHwJP4KrfyZoeo1FdBov4ZTh655wZAKDGIjR7NJLDesuzeg==", + "type": "package", + "path": "flaui.core/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "CHANGELOG.md", + "FlaUI.png", + "LICENSE.txt", + "flaui.core.5.0.0.nupkg.sha512", + "flaui.core.nuspec", + "lib/net48/FlaUI.Core.dll", + "lib/net48/FlaUI.Core.xml", + "lib/net6.0-windows7.0/FlaUI.Core.dll", + "lib/net6.0-windows7.0/FlaUI.Core.xml", + "lib/net8.0-windows7.0/FlaUI.Core.dll", + "lib/net8.0-windows7.0/FlaUI.Core.xml" + ] + }, + "FlaUI.UIA3/5.0.0": { + "sha512": "s1Yy1RsRJ0OXvmtxQlNJd0cu4sfvN3PFFu6skBGK8VlwPl/b38E0V5kCbo2gvkuhRIu4Itfxjdo7DUMF7qJw4Q==", + "type": "package", + "path": "flaui.uia3/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "CHANGELOG.md", + "FlaUI.png", + "LICENSE.txt", + "flaui.uia3.5.0.0.nupkg.sha512", + "flaui.uia3.nuspec", + "lib/net48/FlaUI.UIA3.dll", + "lib/net48/FlaUI.UIA3.xml", + "lib/net6.0-windows7.0/FlaUI.UIA3.dll", + "lib/net6.0-windows7.0/FlaUI.UIA3.xml", + "lib/net8.0-windows7.0/FlaUI.UIA3.dll", + "lib/net8.0-windows7.0/FlaUI.UIA3.xml" + ] + }, + "Interop.UIAutomationClient/10.19041.0": { + "sha512": "Me5vKNZ1JSg6txTsPQXaWx7fVNh+fmcUPPwtDKJtqvbMM0N8aoa/l/QPolkJIRnasCabCNt4v2zG4p1Q9HU98A==", + "type": "package", + "path": "interop.uiautomationclient/10.19041.0", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "build/Interop.UIAutomationClient.targets", + "interop.uiautomationclient.10.19041.0.nupkg.sha512", + "interop.uiautomationclient.nuspec", + "lib/net35/Interop.UIAutomationClient.dll", + "lib/net40/Interop.UIAutomationClient.dll", + "lib/net45/Interop.UIAutomationClient.dll", + "lib/netcoreapp3.0/Interop.UIAutomationClient.dll", + "lib/netstandard2.0/Interop.UIAutomationClient.dll", + "tools/install.ps1" + ] + }, + "Microsoft.ApplicationInsights/2.22.0": { + "sha512": "3AOM9bZtku7RQwHyMEY3tQMrHIgjcfRDa6YQpd/QG2LDGvMydSlL9Di+8LLMt7J2RDdfJ7/2jdYv6yHcMJAnNw==", + "type": "package", + "path": "microsoft.applicationinsights/2.22.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net452/Microsoft.ApplicationInsights.dll", + "lib/net452/Microsoft.ApplicationInsights.pdb", + "lib/net452/Microsoft.ApplicationInsights.xml", + "lib/net46/Microsoft.ApplicationInsights.dll", + "lib/net46/Microsoft.ApplicationInsights.pdb", + "lib/net46/Microsoft.ApplicationInsights.xml", + "lib/netstandard2.0/Microsoft.ApplicationInsights.dll", + "lib/netstandard2.0/Microsoft.ApplicationInsights.pdb", + "lib/netstandard2.0/Microsoft.ApplicationInsights.xml", + "microsoft.applicationinsights.2.22.0.nupkg.sha512", + "microsoft.applicationinsights.nuspec" + ] + }, + "Microsoft.CodeCoverage/17.12.0": { + "sha512": "4svMznBd5JM21JIG2xZKGNanAHNXplxf/kQDFfLHXQ3OnpJkayRK/TjacFjA+EYmoyuNXHo/sOETEfcYtAzIrA==", + "type": "package", + "path": "microsoft.codecoverage/17.12.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.txt", + "build/netstandard2.0/CodeCoverage/CodeCoverage.config", + "build/netstandard2.0/CodeCoverage/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/Cov_x86.config", + "build/netstandard2.0/CodeCoverage/amd64/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/amd64/Cov_x64.config", + "build/netstandard2.0/CodeCoverage/amd64/covrun64.dll", + "build/netstandard2.0/CodeCoverage/amd64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/arm64/Cov_arm64.config", + "build/netstandard2.0/CodeCoverage/arm64/covrunarm64.dll", + "build/netstandard2.0/CodeCoverage/arm64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/codecoveragemessages.dll", + "build/netstandard2.0/CodeCoverage/coreclr/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "build/netstandard2.0/CodeCoverage/covrun32.dll", + "build/netstandard2.0/CodeCoverage/msdia140.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Core.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.Core.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.props", + "build/netstandard2.0/Microsoft.CodeCoverage.targets", + "build/netstandard2.0/Microsoft.DiaSymReader.dll", + "build/netstandard2.0/Microsoft.VisualStudio.TraceDataCollector.dll", + "build/netstandard2.0/Mono.Cecil.Pdb.dll", + "build/netstandard2.0/Mono.Cecil.Rocks.dll", + "build/netstandard2.0/Mono.Cecil.dll", + "build/netstandard2.0/ThirdPartyNotices.txt", + "build/netstandard2.0/alpine/x64/Cov_x64.config", + "build/netstandard2.0/alpine/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/alpine/x64/libInstrumentationEngine.so", + "build/netstandard2.0/arm64/MicrosoftInstrumentationEngine_arm64.dll", + "build/netstandard2.0/cs/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/de/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/es/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/fr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/it/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ja/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ko/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/macos/x64/Cov_x64.config", + "build/netstandard2.0/macos/x64/libCoverageInstrumentationMethod.dylib", + "build/netstandard2.0/macos/x64/libInstrumentationEngine.dylib", + "build/netstandard2.0/pl/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ru/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/tr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ubuntu/x64/Cov_x64.config", + "build/netstandard2.0/ubuntu/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/ubuntu/x64/libInstrumentationEngine.so", + "build/netstandard2.0/x64/MicrosoftInstrumentationEngine_x64.dll", + "build/netstandard2.0/x86/MicrosoftInstrumentationEngine_x86.dll", + "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "lib/net462/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "microsoft.codecoverage.17.12.0.nupkg.sha512", + "microsoft.codecoverage.nuspec" + ] + }, + "Microsoft.NET.Test.Sdk/17.12.0": { + "sha512": "kt/PKBZ91rFCWxVIJZSgVLk+YR+4KxTuHf799ho8WNiK5ZQpJNAEZCAWX86vcKrs+DiYjiibpYKdGZP6+/N17w==", + "type": "package", + "path": "microsoft.net.test.sdk/17.12.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "build/net462/Microsoft.NET.Test.Sdk.props", + "build/net462/Microsoft.NET.Test.Sdk.targets", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.cs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.fs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.vb", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets", + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props", + "lib/net462/_._", + "lib/netcoreapp3.1/_._", + "microsoft.net.test.sdk.17.12.0.nupkg.sha512", + "microsoft.net.test.sdk.nuspec" + ] + }, + "Microsoft.NETCore.Platforms/5.0.0": { + "sha512": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==", + "type": "package", + "path": "microsoft.netcore.platforms/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.0/_._", + "microsoft.netcore.platforms.5.0.0.nupkg.sha512", + "microsoft.netcore.platforms.nuspec", + "runtime.json", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "Microsoft.Testing.Extensions.Telemetry/1.5.3": { + "sha512": "U9pGd5DQuX1PfkrdFI+xH34JGgQ2nes5QAwIITTk+MQfLvRITqsZjJeHTjpGWh33D/0q1l7aA8/LQHR7UuCgLQ==", + "type": "package", + "path": "microsoft.testing.extensions.telemetry/1.5.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "build/net6.0/Microsoft.Testing.Extensions.Telemetry.props", + "build/net7.0/Microsoft.Testing.Extensions.Telemetry.props", + "build/net8.0/Microsoft.Testing.Extensions.Telemetry.props", + "build/net9.0/Microsoft.Testing.Extensions.Telemetry.props", + "build/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.props", + "buildMultiTargeting/Microsoft.Testing.Extensions.Telemetry.props", + "buildTransitive/net6.0/Microsoft.Testing.Extensions.Telemetry.props", + "buildTransitive/net7.0/Microsoft.Testing.Extensions.Telemetry.props", + "buildTransitive/net8.0/Microsoft.Testing.Extensions.Telemetry.props", + "buildTransitive/net9.0/Microsoft.Testing.Extensions.Telemetry.props", + "buildTransitive/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.props", + "lib/net6.0/Microsoft.Testing.Extensions.Telemetry.dll", + "lib/net6.0/Microsoft.Testing.Extensions.Telemetry.xml", + "lib/net6.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/Microsoft.Testing.Extensions.Telemetry.dll", + "lib/net7.0/Microsoft.Testing.Extensions.Telemetry.xml", + "lib/net7.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.dll", + "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.xml", + "lib/net8.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/Microsoft.Testing.Extensions.Telemetry.dll", + "lib/net9.0/Microsoft.Testing.Extensions.Telemetry.xml", + "lib/net9.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/net9.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.xml", + "lib/netstandard2.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", + "microsoft.testing.extensions.telemetry.1.5.3.nupkg.sha512", + "microsoft.testing.extensions.telemetry.nuspec" + ] + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions/1.5.3": { + "sha512": "h34zKNpGyni66VH738mRHeXSnf3klSShUdavUWNhSfWICUUi5aXeI0LBvoX/ad93N0+9xBDU3Fyi6WfxrwKQGw==", + "type": "package", + "path": "microsoft.testing.extensions.trxreport.abstractions/1.5.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net6.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/net6.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "lib/net7.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/net7.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "lib/net9.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/net9.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "microsoft.testing.extensions.trxreport.abstractions.1.5.3.nupkg.sha512", + "microsoft.testing.extensions.trxreport.abstractions.nuspec" + ] + }, + "Microsoft.Testing.Extensions.VSTestBridge/1.5.3": { + "sha512": "cJD67YfDT98wEWyazKVD/yPVW6+H1usXeuselCnRes7JZBTIYWtrCchcOzOahnmajT79eDKqt9sta7DXwTDU4Q==", + "type": "package", + "path": "microsoft.testing.extensions.vstestbridge/1.5.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net6.0/Microsoft.Testing.Extensions.VSTestBridge.dll", + "lib/net6.0/Microsoft.Testing.Extensions.VSTestBridge.xml", + "lib/net6.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/Microsoft.Testing.Extensions.VSTestBridge.dll", + "lib/net7.0/Microsoft.Testing.Extensions.VSTestBridge.xml", + "lib/net7.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.dll", + "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.xml", + "lib/net8.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/Microsoft.Testing.Extensions.VSTestBridge.dll", + "lib/net9.0/Microsoft.Testing.Extensions.VSTestBridge.xml", + "lib/net9.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/net9.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.VSTestBridge.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.VSTestBridge.xml", + "lib/netstandard2.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", + "microsoft.testing.extensions.vstestbridge.1.5.3.nupkg.sha512", + "microsoft.testing.extensions.vstestbridge.nuspec" + ] + }, + "Microsoft.Testing.Platform/1.5.3": { + "sha512": "WqJydnJ99dEKtquR9HwINz104ehWJKTXbQQrydGatlLRw14bmsx0pa8+E6KUXMYXZAimN0swWlDmcJGjjW4TIg==", + "type": "package", + "path": "microsoft.testing.platform/1.5.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "build/net6.0/Microsoft.Testing.Platform.props", + "build/net7.0/Microsoft.Testing.Platform.props", + "build/net8.0/Microsoft.Testing.Platform.props", + "build/net9.0/Microsoft.Testing.Platform.props", + "build/netstandard2.0/Microsoft.Testing.Platform.props", + "buildMultiTargeting/Microsoft.Testing.Platform.props", + "buildTransitive/net6.0/Microsoft.Testing.Platform.props", + "buildTransitive/net7.0/Microsoft.Testing.Platform.props", + "buildTransitive/net8.0/Microsoft.Testing.Platform.props", + "buildTransitive/net9.0/Microsoft.Testing.Platform.props", + "buildTransitive/netstandard2.0/Microsoft.Testing.Platform.props", + "lib/net6.0/Microsoft.Testing.Platform.dll", + "lib/net6.0/Microsoft.Testing.Platform.xml", + "lib/net6.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/Microsoft.Testing.Platform.dll", + "lib/net7.0/Microsoft.Testing.Platform.xml", + "lib/net7.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/Microsoft.Testing.Platform.dll", + "lib/net8.0/Microsoft.Testing.Platform.xml", + "lib/net8.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/Microsoft.Testing.Platform.dll", + "lib/net9.0/Microsoft.Testing.Platform.xml", + "lib/net9.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/net9.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/Microsoft.Testing.Platform.dll", + "lib/netstandard2.0/Microsoft.Testing.Platform.xml", + "lib/netstandard2.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "microsoft.testing.platform.1.5.3.nupkg.sha512", + "microsoft.testing.platform.nuspec" + ] + }, + "Microsoft.Testing.Platform.MSBuild/1.5.3": { + "sha512": "bOtpRMSPeT5YLQo+NNY8EtdNTphAUcmALjW4ABU7P0rb6yR2XAZau3TzNieLmR3lRuwudguWzzBhgcLRXwZh0A==", + "type": "package", + "path": "microsoft.testing.platform.msbuild/1.5.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.MSBuild.dll", + "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.MSBuild.xml", + "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.dll", + "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.xml", + "_MSBuildTasks/netstandard2.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/cs/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/de/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/es/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/fr/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/it/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/ja/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/ko/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/pl/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/ru/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/tr/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "_MSBuildTasks/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll", + "_MSBuildTasks/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "build/Microsoft.Testing.Platform.MSBuild.props", + "build/Microsoft.Testing.Platform.MSBuild.targets", + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.VSTest.targets", + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.props", + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targets", + "buildTransitive/Microsoft.Testing.Platform.MSBuild.props", + "buildTransitive/Microsoft.Testing.Platform.MSBuild.targets", + "lib/net6.0/Microsoft.Testing.Extensions.MSBuild.dll", + "lib/net6.0/Microsoft.Testing.Extensions.MSBuild.xml", + "lib/net6.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/Microsoft.Testing.Extensions.MSBuild.dll", + "lib/net7.0/Microsoft.Testing.Extensions.MSBuild.xml", + "lib/net7.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.dll", + "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.xml", + "lib/net8.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/Microsoft.Testing.Extensions.MSBuild.dll", + "lib/net9.0/Microsoft.Testing.Extensions.MSBuild.xml", + "lib/net9.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/net9.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.MSBuild.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.MSBuild.xml", + "lib/netstandard2.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", + "microsoft.testing.platform.msbuild.1.5.3.nupkg.sha512", + "microsoft.testing.platform.msbuild.nuspec" + ] + }, + "Microsoft.TestPlatform.ObjectModel/17.12.0": { + "sha512": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==", + "type": "package", + "path": "microsoft.testplatform.objectmodel/17.12.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/net462/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/net462/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/net462/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/net462/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "microsoft.testplatform.objectmodel.17.12.0.nupkg.sha512", + "microsoft.testplatform.objectmodel.nuspec" + ] + }, + "Microsoft.TestPlatform.TestHost/17.12.0": { + "sha512": "MiPEJQNyADfwZ4pJNpQex+t9/jOClBGMiCiVVFuELCMSX2nmNfvUor3uFVxNNCg30uxDP8JDYfPnMXQzsfzYyg==", + "type": "package", + "path": "microsoft.testplatform.testhost/17.12.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.txt", + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props", + "build/netcoreapp3.1/x64/testhost.dll", + "build/netcoreapp3.1/x64/testhost.exe", + "build/netcoreapp3.1/x86/testhost.x86.dll", + "build/netcoreapp3.1/x86/testhost.x86.exe", + "lib/net462/_._", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/testhost.deps.json", + "lib/netcoreapp3.1/testhost.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/x64/msdia140.dll", + "lib/netcoreapp3.1/x86/msdia140.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "microsoft.testplatform.testhost.17.12.0.nupkg.sha512", + "microsoft.testplatform.testhost.nuspec" + ] + }, + "Microsoft.Win32.Registry/5.0.0": { + "sha512": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "type": "package", + "path": "microsoft.win32.registry/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net46/Microsoft.Win32.Registry.dll", + "lib/net461/Microsoft.Win32.Registry.dll", + "lib/net461/Microsoft.Win32.Registry.xml", + "lib/netstandard1.3/Microsoft.Win32.Registry.dll", + "lib/netstandard2.0/Microsoft.Win32.Registry.dll", + "lib/netstandard2.0/Microsoft.Win32.Registry.xml", + "microsoft.win32.registry.5.0.0.nupkg.sha512", + "microsoft.win32.registry.nuspec", + "ref/net46/Microsoft.Win32.Registry.dll", + "ref/net461/Microsoft.Win32.Registry.dll", + "ref/net461/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/Microsoft.Win32.Registry.dll", + "ref/netstandard1.3/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/de/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/es/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/fr/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/it/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/ja/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/ko/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/ru/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/zh-hans/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/zh-hant/Microsoft.Win32.Registry.xml", + "ref/netstandard2.0/Microsoft.Win32.Registry.dll", + "ref/netstandard2.0/Microsoft.Win32.Registry.xml", + "runtimes/win/lib/net46/Microsoft.Win32.Registry.dll", + "runtimes/win/lib/net461/Microsoft.Win32.Registry.dll", + "runtimes/win/lib/net461/Microsoft.Win32.Registry.xml", + "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll", + "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll", + "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.xml", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "Microsoft.Win32.SystemEvents/8.0.0": { + "sha512": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==", + "type": "package", + "path": "microsoft.win32.systemevents/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Win32.SystemEvents.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Win32.SystemEvents.targets", + "lib/net462/Microsoft.Win32.SystemEvents.dll", + "lib/net462/Microsoft.Win32.SystemEvents.xml", + "lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "lib/net6.0/Microsoft.Win32.SystemEvents.xml", + "lib/net7.0/Microsoft.Win32.SystemEvents.dll", + "lib/net7.0/Microsoft.Win32.SystemEvents.xml", + "lib/net8.0/Microsoft.Win32.SystemEvents.dll", + "lib/net8.0/Microsoft.Win32.SystemEvents.xml", + "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll", + "lib/netstandard2.0/Microsoft.Win32.SystemEvents.xml", + "microsoft.win32.systemevents.8.0.0.nupkg.sha512", + "microsoft.win32.systemevents.nuspec", + "runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.xml", + "runtimes/win/lib/net7.0/Microsoft.Win32.SystemEvents.dll", + "runtimes/win/lib/net7.0/Microsoft.Win32.SystemEvents.xml", + "runtimes/win/lib/net8.0/Microsoft.Win32.SystemEvents.dll", + "runtimes/win/lib/net8.0/Microsoft.Win32.SystemEvents.xml", + "useSharedDesignerContext.txt" + ] + }, + "Newtonsoft.Json/13.0.1": { + "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", + "type": "package", + "path": "newtonsoft.json/13.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.md", + "lib/net20/Newtonsoft.Json.dll", + "lib/net20/Newtonsoft.Json.xml", + "lib/net35/Newtonsoft.Json.dll", + "lib/net35/Newtonsoft.Json.xml", + "lib/net40/Newtonsoft.Json.dll", + "lib/net40/Newtonsoft.Json.xml", + "lib/net45/Newtonsoft.Json.dll", + "lib/net45/Newtonsoft.Json.xml", + "lib/netstandard1.0/Newtonsoft.Json.dll", + "lib/netstandard1.0/Newtonsoft.Json.xml", + "lib/netstandard1.3/Newtonsoft.Json.dll", + "lib/netstandard1.3/Newtonsoft.Json.xml", + "lib/netstandard2.0/Newtonsoft.Json.dll", + "lib/netstandard2.0/Newtonsoft.Json.xml", + "newtonsoft.json.13.0.1.nupkg.sha512", + "newtonsoft.json.nuspec", + "packageIcon.png" + ] + }, + "NUnit/4.3.2": { + "sha512": "puVXayXNmEu7MFQSUswGmUjOy3M3baprMbkLl5PAutpeDoGTr+jPv33qAYsqxywi2wJCq8l/O3EhHoLulPE1iQ==", + "type": "package", + "path": "nunit/4.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "NOTICES.md", + "README.md", + "THIRD_PARTY_NOTICES.md", + "build/NUnit.props", + "icon.png", + "lib/net462/nunit.framework.dll", + "lib/net462/nunit.framework.legacy.dll", + "lib/net462/nunit.framework.legacy.xml", + "lib/net462/nunit.framework.xml", + "lib/net6.0/nunit.framework.dll", + "lib/net6.0/nunit.framework.legacy.dll", + "lib/net6.0/nunit.framework.legacy.xml", + "lib/net6.0/nunit.framework.xml", + "lib/net8.0/nunit.framework.dll", + "lib/net8.0/nunit.framework.legacy.dll", + "lib/net8.0/nunit.framework.legacy.xml", + "lib/net8.0/nunit.framework.xml", + "nunit.4.3.2.nupkg.sha512", + "nunit.nuspec" + ] + }, + "NUnit3TestAdapter/5.0.0": { + "sha512": "sy4cLoUAdE6TDM4wNX5gmNCyhMev5wUz4cA6ZRf/aON9vf9t4xTVGLj/4huhDKcS4dFfmVVcgcP70yC7WC9kKg==", + "type": "package", + "path": "nunit3testadapter/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/net462/NUnit3.TestAdapter.dll", + "build/net462/NUnit3.TestAdapter.pdb", + "build/net462/NUnit3TestAdapter.props", + "build/net462/NUnit3TestAdapter.targets", + "build/net462/nunit.engine.api.dll", + "build/net462/nunit.engine.core.dll", + "build/net462/nunit.engine.dll", + "build/net462/testcentric.engine.metadata.dll", + "build/netcoreapp3.1/NUnit3.TestAdapter.dll", + "build/netcoreapp3.1/NUnit3.TestAdapter.pdb", + "build/netcoreapp3.1/NUnit3TestAdapter.props", + "build/netcoreapp3.1/NUnit3TestAdapter.targets", + "build/netcoreapp3.1/nunit.engine.api.dll", + "build/netcoreapp3.1/nunit.engine.core.dll", + "build/netcoreapp3.1/nunit.engine.dll", + "build/netcoreapp3.1/testcentric.engine.metadata.dll", + "docs/README.md", + "nunit3testadapter.5.0.0.nupkg.sha512", + "nunit3testadapter.nuspec", + "nunit_256.png" + ] + }, + "System.CodeDom/8.0.0": { + "sha512": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==", + "type": "package", + "path": "system.codedom/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.CodeDom.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.CodeDom.targets", + "lib/net462/System.CodeDom.dll", + "lib/net462/System.CodeDom.xml", + "lib/net6.0/System.CodeDom.dll", + "lib/net6.0/System.CodeDom.xml", + "lib/net7.0/System.CodeDom.dll", + "lib/net7.0/System.CodeDom.xml", + "lib/net8.0/System.CodeDom.dll", + "lib/net8.0/System.CodeDom.xml", + "lib/netstandard2.0/System.CodeDom.dll", + "lib/netstandard2.0/System.CodeDom.xml", + "system.codedom.8.0.0.nupkg.sha512", + "system.codedom.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Configuration.ConfigurationManager/8.0.1": { + "sha512": "gPYFPDyohW2gXNhdQRSjtmeS6FymL2crg4Sral1wtvEJ7DUqFCDWDVbbLobASbzxfic8U1hQEdC7hmg9LHncMw==", + "type": "package", + "path": "system.configuration.configurationmanager/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Configuration.ConfigurationManager.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Configuration.ConfigurationManager.targets", + "lib/net462/System.Configuration.ConfigurationManager.dll", + "lib/net462/System.Configuration.ConfigurationManager.xml", + "lib/net6.0/System.Configuration.ConfigurationManager.dll", + "lib/net6.0/System.Configuration.ConfigurationManager.xml", + "lib/net7.0/System.Configuration.ConfigurationManager.dll", + "lib/net7.0/System.Configuration.ConfigurationManager.xml", + "lib/net8.0/System.Configuration.ConfigurationManager.dll", + "lib/net8.0/System.Configuration.ConfigurationManager.xml", + "lib/netstandard2.0/System.Configuration.ConfigurationManager.dll", + "lib/netstandard2.0/System.Configuration.ConfigurationManager.xml", + "system.configuration.configurationmanager.8.0.1.nupkg.sha512", + "system.configuration.configurationmanager.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Diagnostics.DiagnosticSource/5.0.0": { + "sha512": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==", + "type": "package", + "path": "system.diagnostics.diagnosticsource/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net45/System.Diagnostics.DiagnosticSource.dll", + "lib/net45/System.Diagnostics.DiagnosticSource.xml", + "lib/net46/System.Diagnostics.DiagnosticSource.dll", + "lib/net46/System.Diagnostics.DiagnosticSource.xml", + "lib/net5.0/System.Diagnostics.DiagnosticSource.dll", + "lib/net5.0/System.Diagnostics.DiagnosticSource.xml", + "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", + "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", + "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", + "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", + "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", + "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml", + "system.diagnostics.diagnosticsource.5.0.0.nupkg.sha512", + "system.diagnostics.diagnosticsource.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Diagnostics.EventLog/8.0.1": { + "sha512": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==", + "type": "package", + "path": "system.diagnostics.eventlog/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Diagnostics.EventLog.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Diagnostics.EventLog.targets", + "lib/net462/System.Diagnostics.EventLog.dll", + "lib/net462/System.Diagnostics.EventLog.xml", + "lib/net6.0/System.Diagnostics.EventLog.dll", + "lib/net6.0/System.Diagnostics.EventLog.xml", + "lib/net7.0/System.Diagnostics.EventLog.dll", + "lib/net7.0/System.Diagnostics.EventLog.xml", + "lib/net8.0/System.Diagnostics.EventLog.dll", + "lib/net8.0/System.Diagnostics.EventLog.xml", + "lib/netstandard2.0/System.Diagnostics.EventLog.dll", + "lib/netstandard2.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.xml", + "system.diagnostics.eventlog.8.0.1.nupkg.sha512", + "system.diagnostics.eventlog.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Diagnostics.PerformanceCounter/8.0.1": { + "sha512": "9RfEDiEjlUADeThs8IPdDVTXSnPRSqjfgTQJALpmGFPKC0k2mbdufOXnb/9JZ4I0TkmxOfy3VTJxrHOJSs8cXg==", + "type": "package", + "path": "system.diagnostics.performancecounter/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Diagnostics.PerformanceCounter.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Diagnostics.PerformanceCounter.targets", + "lib/net462/System.Diagnostics.PerformanceCounter.dll", + "lib/net462/System.Diagnostics.PerformanceCounter.xml", + "lib/net6.0/System.Diagnostics.PerformanceCounter.dll", + "lib/net6.0/System.Diagnostics.PerformanceCounter.xml", + "lib/net7.0/System.Diagnostics.PerformanceCounter.dll", + "lib/net7.0/System.Diagnostics.PerformanceCounter.xml", + "lib/net8.0/System.Diagnostics.PerformanceCounter.dll", + "lib/net8.0/System.Diagnostics.PerformanceCounter.xml", + "lib/netstandard2.0/System.Diagnostics.PerformanceCounter.dll", + "lib/netstandard2.0/System.Diagnostics.PerformanceCounter.xml", + "runtimes/win/lib/net6.0/System.Diagnostics.PerformanceCounter.dll", + "runtimes/win/lib/net6.0/System.Diagnostics.PerformanceCounter.xml", + "runtimes/win/lib/net7.0/System.Diagnostics.PerformanceCounter.dll", + "runtimes/win/lib/net7.0/System.Diagnostics.PerformanceCounter.xml", + "runtimes/win/lib/net8.0/System.Diagnostics.PerformanceCounter.dll", + "runtimes/win/lib/net8.0/System.Diagnostics.PerformanceCounter.xml", + "system.diagnostics.performancecounter.8.0.1.nupkg.sha512", + "system.diagnostics.performancecounter.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Drawing.Common/8.0.10": { + "sha512": "MdajRp3P+FOlThgY6FBjAqnmLiVl5t2yWEC/2AsDMqx1zYbJG3G5TnscFBQ4obqcaGqvN5UnhQHSFaJFG2HftQ==", + "type": "package", + "path": "system.drawing.common/8.0.10", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Drawing.Common.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Drawing.Common.targets", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net462/System.Drawing.Common.dll", + "lib/net462/System.Drawing.Common.pdb", + "lib/net462/System.Drawing.Common.xml", + "lib/net6.0/System.Drawing.Common.dll", + "lib/net6.0/System.Drawing.Common.pdb", + "lib/net6.0/System.Drawing.Common.xml", + "lib/net7.0/System.Drawing.Common.dll", + "lib/net7.0/System.Drawing.Common.pdb", + "lib/net7.0/System.Drawing.Common.xml", + "lib/net8.0/System.Drawing.Common.dll", + "lib/net8.0/System.Drawing.Common.pdb", + "lib/net8.0/System.Drawing.Common.xml", + "lib/netstandard2.0/System.Drawing.Common.dll", + "lib/netstandard2.0/System.Drawing.Common.pdb", + "lib/netstandard2.0/System.Drawing.Common.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "system.drawing.common.8.0.10.nupkg.sha512", + "system.drawing.common.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Management/8.0.0": { + "sha512": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "type": "package", + "path": "system.management/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Management.targets", + "lib/net462/_._", + "lib/net6.0/System.Management.dll", + "lib/net6.0/System.Management.xml", + "lib/net7.0/System.Management.dll", + "lib/net7.0/System.Management.xml", + "lib/net8.0/System.Management.dll", + "lib/net8.0/System.Management.xml", + "lib/netstandard2.0/System.Management.dll", + "lib/netstandard2.0/System.Management.xml", + "runtimes/win/lib/net6.0/System.Management.dll", + "runtimes/win/lib/net6.0/System.Management.xml", + "runtimes/win/lib/net7.0/System.Management.dll", + "runtimes/win/lib/net7.0/System.Management.xml", + "runtimes/win/lib/net8.0/System.Management.dll", + "runtimes/win/lib/net8.0/System.Management.xml", + "system.management.8.0.0.nupkg.sha512", + "system.management.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Reflection.Metadata/1.6.0": { + "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", + "type": "package", + "path": "system.reflection.metadata/1.6.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.1/System.Reflection.Metadata.dll", + "lib/netstandard1.1/System.Reflection.Metadata.xml", + "lib/netstandard2.0/System.Reflection.Metadata.dll", + "lib/netstandard2.0/System.Reflection.Metadata.xml", + "lib/portable-net45+win8/System.Reflection.Metadata.dll", + "lib/portable-net45+win8/System.Reflection.Metadata.xml", + "system.reflection.metadata.1.6.0.nupkg.sha512", + "system.reflection.metadata.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Security.AccessControl/5.0.0": { + "sha512": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "type": "package", + "path": "system.security.accesscontrol/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net46/System.Security.AccessControl.dll", + "lib/net461/System.Security.AccessControl.dll", + "lib/net461/System.Security.AccessControl.xml", + "lib/netstandard1.3/System.Security.AccessControl.dll", + "lib/netstandard2.0/System.Security.AccessControl.dll", + "lib/netstandard2.0/System.Security.AccessControl.xml", + "lib/uap10.0.16299/_._", + "ref/net46/System.Security.AccessControl.dll", + "ref/net461/System.Security.AccessControl.dll", + "ref/net461/System.Security.AccessControl.xml", + "ref/netstandard1.3/System.Security.AccessControl.dll", + "ref/netstandard1.3/System.Security.AccessControl.xml", + "ref/netstandard1.3/de/System.Security.AccessControl.xml", + "ref/netstandard1.3/es/System.Security.AccessControl.xml", + "ref/netstandard1.3/fr/System.Security.AccessControl.xml", + "ref/netstandard1.3/it/System.Security.AccessControl.xml", + "ref/netstandard1.3/ja/System.Security.AccessControl.xml", + "ref/netstandard1.3/ko/System.Security.AccessControl.xml", + "ref/netstandard1.3/ru/System.Security.AccessControl.xml", + "ref/netstandard1.3/zh-hans/System.Security.AccessControl.xml", + "ref/netstandard1.3/zh-hant/System.Security.AccessControl.xml", + "ref/netstandard2.0/System.Security.AccessControl.dll", + "ref/netstandard2.0/System.Security.AccessControl.xml", + "ref/uap10.0.16299/_._", + "runtimes/win/lib/net46/System.Security.AccessControl.dll", + "runtimes/win/lib/net461/System.Security.AccessControl.dll", + "runtimes/win/lib/net461/System.Security.AccessControl.xml", + "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll", + "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.xml", + "runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll", + "runtimes/win/lib/uap10.0.16299/_._", + "system.security.accesscontrol.5.0.0.nupkg.sha512", + "system.security.accesscontrol.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Security.Cryptography.ProtectedData/8.0.0": { + "sha512": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==", + "type": "package", + "path": "system.security.cryptography.protecteddata/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Security.Cryptography.ProtectedData.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Security.Cryptography.ProtectedData.targets", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net462/System.Security.Cryptography.ProtectedData.dll", + "lib/net462/System.Security.Cryptography.ProtectedData.xml", + "lib/net6.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net6.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net7.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net7.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net8.0/System.Security.Cryptography.ProtectedData.xml", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", + "system.security.cryptography.protecteddata.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Security.Permissions/8.0.0": { + "sha512": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", + "type": "package", + "path": "system.security.permissions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Security.Permissions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Security.Permissions.targets", + "lib/net462/System.Security.Permissions.dll", + "lib/net462/System.Security.Permissions.xml", + "lib/net6.0/System.Security.Permissions.dll", + "lib/net6.0/System.Security.Permissions.xml", + "lib/net7.0/System.Security.Permissions.dll", + "lib/net7.0/System.Security.Permissions.xml", + "lib/net8.0/System.Security.Permissions.dll", + "lib/net8.0/System.Security.Permissions.xml", + "lib/netstandard2.0/System.Security.Permissions.dll", + "lib/netstandard2.0/System.Security.Permissions.xml", + "system.security.permissions.8.0.0.nupkg.sha512", + "system.security.permissions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Security.Principal.Windows/5.0.0": { + "sha512": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==", + "type": "package", + "path": "system.security.principal.windows/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net46/System.Security.Principal.Windows.dll", + "lib/net461/System.Security.Principal.Windows.dll", + "lib/net461/System.Security.Principal.Windows.xml", + "lib/netstandard1.3/System.Security.Principal.Windows.dll", + "lib/netstandard2.0/System.Security.Principal.Windows.dll", + "lib/netstandard2.0/System.Security.Principal.Windows.xml", + "lib/uap10.0.16299/_._", + "ref/net46/System.Security.Principal.Windows.dll", + "ref/net461/System.Security.Principal.Windows.dll", + "ref/net461/System.Security.Principal.Windows.xml", + "ref/netcoreapp3.0/System.Security.Principal.Windows.dll", + "ref/netcoreapp3.0/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/System.Security.Principal.Windows.dll", + "ref/netstandard1.3/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", + "ref/netstandard2.0/System.Security.Principal.Windows.dll", + "ref/netstandard2.0/System.Security.Principal.Windows.xml", + "ref/uap10.0.16299/_._", + "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", + "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", + "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", + "runtimes/win/lib/net461/System.Security.Principal.Windows.dll", + "runtimes/win/lib/net461/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", + "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", + "runtimes/win/lib/uap10.0.16299/_._", + "system.security.principal.windows.5.0.0.nupkg.sha512", + "system.security.principal.windows.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Windows.Extensions/8.0.0": { + "sha512": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==", + "type": "package", + "path": "system.windows.extensions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net6.0/System.Windows.Extensions.dll", + "lib/net6.0/System.Windows.Extensions.xml", + "lib/net7.0/System.Windows.Extensions.dll", + "lib/net7.0/System.Windows.Extensions.xml", + "lib/net8.0/System.Windows.Extensions.dll", + "lib/net8.0/System.Windows.Extensions.xml", + "runtimes/win/lib/net6.0/System.Windows.Extensions.dll", + "runtimes/win/lib/net6.0/System.Windows.Extensions.xml", + "runtimes/win/lib/net7.0/System.Windows.Extensions.dll", + "runtimes/win/lib/net7.0/System.Windows.Extensions.xml", + "runtimes/win/lib/net8.0/System.Windows.Extensions.dll", + "runtimes/win/lib/net8.0/System.Windows.Extensions.xml", + "system.windows.extensions.8.0.0.nupkg.sha512", + "system.windows.extensions.nuspec", + "useSharedDesignerContext.txt" + ] + } + }, + "projectFileDependencyGroups": { + "net8.0-windows": [ + "FlaUI.UIA3 >= 5.0.0", + "Microsoft.NET.Test.Sdk >= 17.12.0", + "NUnit >= 4.3.2", + "NUnit3TestAdapter >= 5.0.0" + ] + }, + "packageFolders": { + "C:\\Users\\plesz\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", + "projectName": "FileManager.UiTests", + "projectPath": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", + "packagesPath": "C:\\Users\\plesz\\.nuget\\packages\\", + "outputPath": "D:\\FileManager\\tests\\FileManager.UiTests\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\plesz\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0-windows" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0-windows": { + "framework": "net8.0-windows7.0", + "targetAlias": "net8.0-windows", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.400" + }, + "frameworks": { + "net8.0-windows": { + "framework": "net8.0-windows7.0", + "targetAlias": "net8.0-windows", + "dependencies": { + "FlaUI.UIA3": { + "target": "Package", + "version": "[5.0.0, )" + }, + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.12.0, )" + }, + "NUnit": { + "target": "Package", + "version": "[4.3.2, )" + }, + "NUnit3TestAdapter": { + "suppressParent": "All", + "target": "Package", + "version": "[5.0.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[8.0.30, 8.0.30]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[8.0.30, 8.0.30]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[8.0.30, 8.0.30]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.400/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/tests/FileManager.UiTests/obj/project.nuget.cache b/tests/FileManager.UiTests/obj/project.nuget.cache new file mode 100644 index 00000000..98cd1498 --- /dev/null +++ b/tests/FileManager.UiTests/obj/project.nuget.cache @@ -0,0 +1,44 @@ +{ + "version": 2, + "dgSpecHash": "mMB6YJ3PAdo=", + "success": true, + "projectFilePath": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", + "expectedPackageFiles": [ + "C:\\Users\\plesz\\.nuget\\packages\\flaui.core\\5.0.0\\flaui.core.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\flaui.uia3\\5.0.0\\flaui.uia3.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\interop.uiautomationclient\\10.19041.0\\interop.uiautomationclient.10.19041.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.applicationinsights\\2.22.0\\microsoft.applicationinsights.2.22.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.codecoverage\\17.12.0\\microsoft.codecoverage.17.12.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.net.test.sdk\\17.12.0\\microsoft.net.test.sdk.17.12.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.netcore.platforms\\5.0.0\\microsoft.netcore.platforms.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.extensions.telemetry\\1.5.3\\microsoft.testing.extensions.telemetry.1.5.3.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.extensions.trxreport.abstractions\\1.5.3\\microsoft.testing.extensions.trxreport.abstractions.1.5.3.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.extensions.vstestbridge\\1.5.3\\microsoft.testing.extensions.vstestbridge.1.5.3.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.platform\\1.5.3\\microsoft.testing.platform.1.5.3.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.platform.msbuild\\1.5.3\\microsoft.testing.platform.msbuild.1.5.3.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.12.0\\microsoft.testplatform.objectmodel.17.12.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testplatform.testhost\\17.12.0\\microsoft.testplatform.testhost.17.12.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.win32.registry\\5.0.0\\microsoft.win32.registry.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.win32.systemevents\\8.0.0\\microsoft.win32.systemevents.8.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\nunit\\4.3.2\\nunit.4.3.2.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\nunit3testadapter\\5.0.0\\nunit3testadapter.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.codedom\\8.0.0\\system.codedom.8.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.configuration.configurationmanager\\8.0.1\\system.configuration.configurationmanager.8.0.1.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.diagnostics.diagnosticsource\\5.0.0\\system.diagnostics.diagnosticsource.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.diagnostics.eventlog\\8.0.1\\system.diagnostics.eventlog.8.0.1.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.diagnostics.performancecounter\\8.0.1\\system.diagnostics.performancecounter.8.0.1.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.drawing.common\\8.0.10\\system.drawing.common.8.0.10.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.management\\8.0.0\\system.management.8.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.security.accesscontrol\\5.0.0\\system.security.accesscontrol.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.security.cryptography.protecteddata\\8.0.0\\system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.security.permissions\\8.0.0\\system.security.permissions.8.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.security.principal.windows\\5.0.0\\system.security.principal.windows.5.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\system.windows.extensions\\8.0.0\\system.windows.extensions.8.0.0.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.netcore.app.ref\\8.0.30\\microsoft.netcore.app.ref.8.0.30.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\8.0.30\\microsoft.windowsdesktop.app.ref.8.0.30.nupkg.sha512", + "C:\\Users\\plesz\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\8.0.30\\microsoft.aspnetcore.app.ref.8.0.30.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file From dc8fa0eee684b05e2f8d65bf237b16fe5d3ba023 Mon Sep 17 00:00:00 2001 From: PatrykLs98 Date: Fri, 14 Aug 2026 17:54:20 +0200 Subject: [PATCH 2/4] Resolved conflicts --- .../FileManager.UiTests/FileAccessUiTests.cs | 2 + .../FileOperationUiTests.cs | 73 ++++++++-------- .../Infrastructure/FileOperationUiTestBase.cs | 85 ++++++++++++++++++- .../Infrastructure/NativeCommands.cs | 20 ++++- .../Infrastructure/TestOwnedProcessScope.cs | 37 ++++++++ ...perationRecoveryCharacterizationUiTests.cs | 2 + tests/FileManager.UiTests/README.md | 2 +- .../ReparsePointTopologyUiTests.cs | 2 + .../ReportedDefectCharacterizationUiTests.cs | 59 ++----------- .../SChannelTlsIntegrationTests.cs | 13 ++- 10 files changed, 196 insertions(+), 99 deletions(-) create mode 100644 tests/FileManager.UiTests/Infrastructure/TestOwnedProcessScope.cs diff --git a/tests/FileManager.UiTests/FileAccessUiTests.cs b/tests/FileManager.UiTests/FileAccessUiTests.cs index f9ecec7f..e711f137 100644 --- a/tests/FileManager.UiTests/FileAccessUiTests.cs +++ b/tests/FileManager.UiTests/FileAccessUiTests.cs @@ -52,6 +52,8 @@ public void View_file_opens_the_selected_file_in_the_internal_viewer() [Test] public void Edit_file_opens_the_selected_file_in_the_configured_editor() { + using var editorProcesses = new TestOwnedProcessScope("notepad"); + // The process scope also cleans a headless default editor when the product defect prevents HWND discovery. // The default editor is out of process, so the opened file name in its window proves the edit dispatch reached it. SelectSourceItem("edit-file.txt"); NativeCommands.Execute(MainWindow.Properties.NativeWindowHandle.Value, NativeCommands.EditFile); diff --git a/tests/FileManager.UiTests/FileOperationUiTests.cs b/tests/FileManager.UiTests/FileOperationUiTests.cs index 6ee22dd8..9080f9f7 100644 --- a/tests/FileManager.UiTests/FileOperationUiTests.cs +++ b/tests/FileManager.UiTests/FileOperationUiTests.cs @@ -89,7 +89,7 @@ public void Copy_overwrite_replaces_target_streams_and_removes_stale_streams() AlternateDataStreams.Write(target, "stale", "stale-stream-content"u8.ToArray()); ExecuteWithPath(NativeCommands.CopyFiles, "ads-overwrite.txt", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES + DismissOptionalPrompt(6, TimeSpan.FromSeconds(3), 6); // IDYES when this profile confirms overwrites. WaitForFileSystem(() => File.ReadAllText(target) == "ads-overwrite-source", "Confirmed overwrite did not replace the ADS test target."); @@ -133,7 +133,7 @@ public void Copy_retries_a_temporarily_denied_alternate_data_stream_without_losi public void Copy_overwrite_replaces_the_existing_target_only_after_the_user_confirms() { ExecuteWithPath(NativeCommands.CopyFiles, "overwrite-file.txt", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES + DismissOptionalPrompt(6, TimeSpan.FromSeconds(3), 6); // IDYES when this profile confirms overwrites. WaitForFileSystem(() => File.ReadAllText(Workspace.TargetPath("overwrite-file.txt")) == "overwrite-source-content", "Confirmed overwrite did not replace the target content."); @@ -144,7 +144,7 @@ public void Copy_overwrite_replaces_the_existing_target_only_after_the_user_conf public void Copy_overwrite_all_applies_the_choice_to_the_complete_conflicting_tree() { ExecuteWithPath(NativeCommands.CopyFiles, "overwrite-all-tree", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(185), 185); // IDB_ALL + DismissOptionalPrompt(185, TimeSpan.FromSeconds(3), 185); // IDB_ALL when conflict choices are enabled. WaitForFileSystem(() => File.ReadAllText(Workspace.TargetPath("overwrite-all-tree\\nested\\first.txt")) == "overwrite-all-first-source" && File.ReadAllText(Workspace.TargetPath("overwrite-all-tree\\nested\\second.txt")) == "overwrite-all-second-source", @@ -155,7 +155,7 @@ public void Copy_overwrite_all_applies_the_choice_to_the_complete_conflicting_tr public void Copy_skip_keeps_the_existing_target_and_the_source() { ExecuteWithPath(NativeCommands.CopyFiles, "skip-file.txt", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(173), 173); // IDB_SKIP + DismissOptionalPrompt(173, TimeSpan.FromSeconds(3), 173); // Semantic checks expose an unavailable Skip choice. WaitForFileSystem(() => File.ReadAllText(Workspace.TargetPath("skip-file.txt")) == "skip-target-content", "Skip unexpectedly modified the conflicting target."); @@ -166,7 +166,7 @@ public void Copy_skip_keeps_the_existing_target_and_the_source() public void Copy_skip_all_keeps_the_existing_conflicting_tree() { ExecuteWithPath(NativeCommands.CopyFiles, "skip-all-tree", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(174), 174); // IDB_SKIPALL + DismissOptionalPrompt(174, TimeSpan.FromSeconds(3), 174); // Semantic checks expose an unavailable Skip All choice. WaitForFileSystem(() => Directory.Exists(Workspace.TargetPath("skip-all-tree")), "Skip All removed the existing target directory."); Assert.Multiple(() => @@ -185,9 +185,9 @@ public void Copy_file_persists_a_completed_recovery_journal_with_item_intent() ExecuteWithPath(NativeCommands.CopyFiles, "copy-file.txt", Workspace.TargetDirectory, commit: true); - WaitForFileSystem(() => FindJournalFor(source) is not null, + WaitForFileSystem(() => FindOperationJournalFor(source) is not null, "Copy did not persist a durable operation journal."); - var journal = FindJournalFor(source)!; + var journal = FindOperationJournalFor(source)!; var content = File.ReadAllText(journal); var planItem = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries) .Single(line => line.StartsWith("PLANITEM|0|copy-file|", StringComparison.Ordinal)); @@ -267,7 +267,7 @@ public void Rename_overwrite_replaces_the_collision_without_losing_source_metada }); ExecuteWithPath(NativeCommands.RenameFile, "rename-overwrite.txt", "rename-overwrite-target.txt", commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES + DismissOptionalPrompt(6, TimeSpan.FromSeconds(3), 6); // IDYES when this profile confirms overwrites. WaitForFileSystem(() => File.ReadAllText(target) == "rename-overwrite-source-content", "Confirmed rename overwrite did not replace the collision target."); @@ -307,7 +307,7 @@ public void Move_overwrite_replaces_the_existing_target_and_removes_the_source() { // Move must apply the confirmed overwrite before deleting the source identity. ExecuteWithPath(NativeCommands.MoveFiles, "move-overwrite.txt", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES + DismissOptionalPrompt(6, TimeSpan.FromSeconds(3), 6); // IDYES when this profile confirms overwrites. WaitForFileSystem(() => File.ReadAllText(Workspace.TargetPath("move-overwrite.txt")) == "move-overwrite-source-content", "Confirmed move overwrite did not replace the target content."); @@ -320,7 +320,7 @@ public void Move_skip_keeps_the_existing_target_and_the_unmoved_source() { // A skipped move collision must retain both versions because no target commit occurred. ExecuteWithPath(NativeCommands.MoveFiles, "move-skip.txt", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(173), 173); // IDB_SKIP + DismissOptionalPrompt(173, TimeSpan.FromSeconds(3), 173); // Semantic checks expose an unavailable Skip choice. WaitForFileSystem(() => File.ReadAllText(Workspace.TargetPath("move-skip.txt")) == "move-skip-target-content", "Skipped move unexpectedly modified the conflicting target."); @@ -332,13 +332,16 @@ public void Move_overwrite_all_replaces_every_conflict_before_removing_the_sourc { // Overwrite All must commit every destination before the move removes the complete source tree. ExecuteWithPath(NativeCommands.MoveFiles, "move-overwrite-all-tree", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(185), 185); // IDB_ALL + DismissOptionalPrompt(185, TimeSpan.FromSeconds(3), 185); // IDB_ALL when conflict choices are enabled. - WaitForFileSystem(() => File.ReadAllText(Workspace.TargetPath("move-overwrite-all-tree\\nested\\first.txt")) == - "move-overwrite-all-first-source" && - File.ReadAllText(Workspace.TargetPath("move-overwrite-all-tree\\nested\\second.txt")) == - "move-overwrite-all-second-source", + var firstTarget = Workspace.TargetPath("move-overwrite-all-tree\\nested\\first.txt"); + var secondTarget = Workspace.TargetPath("move-overwrite-all-tree\\nested\\second.txt"); + WaitForFileSystem(() => File.Exists(firstTarget) && File.Exists(secondTarget) && + File.ReadAllText(firstTarget) == "move-overwrite-all-first-source" && + File.ReadAllText(secondTarget) == "move-overwrite-all-second-source", "Move Overwrite All did not replace every conflicting descendant."); + WaitForOperationJournalTerminal(Workspace.SourcePath("move-overwrite-all-tree"), + "Move Overwrite All left its durable operation journal incomplete."); Assert.That(Directory.Exists(Workspace.SourcePath("move-overwrite-all-tree")), Is.False, "Move Overwrite All retained the fully committed source tree."); } @@ -348,7 +351,7 @@ public void Move_skip_all_retains_conflicting_sources_but_moves_nonconflicting_s { // Skip All suppresses later conflict prompts without retaining independently committed siblings. ExecuteWithPath(NativeCommands.MoveFiles, "move-skip-all-tree", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(174), 174); // IDB_SKIPALL + DismissOptionalPrompt(174, TimeSpan.FromSeconds(3), 174); // Semantic checks expose an unavailable Skip All choice. WaitForFileSystem(() => File.Exists(Workspace.TargetPath("move-skip-all-tree\\nested\\unique.txt")), "Move Skip All did not continue with a nonconflicting sibling."); @@ -362,6 +365,9 @@ public void Move_skip_all_retains_conflicting_sources_but_moves_nonconflicting_s Assert.That(File.Exists(Workspace.SourcePath("move-skip-all-tree\\nested\\second.txt")), Is.True); Assert.That(File.Exists(Workspace.SourcePath("move-skip-all-tree\\nested\\unique.txt")), Is.False); }); + // The visible result can precede the worker's final directory cleanup and durable terminal transition. + WaitForOperationJournalTerminal(Workspace.SourcePath("move-skip-all-tree"), + "Move Skip All left its durable operation journal incomplete."); } [Test] @@ -421,12 +427,17 @@ public void Cancelling_an_in_progress_conflicting_copy_keeps_both_versions_and_r var source = Workspace.SourcePath("cancel-conflict.txt"); ExecuteWithPath(NativeCommands.CopyFiles, "cancel-conflict.txt", Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(2), 2); // IDCANCEL + DismissOptionalPrompt(2, TimeSpan.FromSeconds(3), 2); // Semantic checks expose an unavailable Cancel choice. WaitForFileSystem(() => File.ReadAllText(Workspace.TargetPath("cancel-conflict.txt")) == "cancel-conflict-target-content", "Cancellation unexpectedly changed the target."); Assert.That(File.ReadAllText(source), Is.EqualTo("cancel-conflict-source-content")); - WaitForFileSystem(() => FindJournalFor(source)?.Contains("OPERATION|cancelled", StringComparison.Ordinal) == true, + WaitForFileSystem(() => + { + var journal = FindOperationJournalFor(source); + return journal is not null && TryReadOperationJournal(journal, out var content) && + content.Contains("OPERATION|cancelled", StringComparison.Ordinal); + }, "Cancellation was not recorded in the durable operation journal."); } @@ -472,11 +483,13 @@ public void Rename_overwrite_decline_keeps_the_original_file_and_existing_target { // IDNO is the rename-specific skip path and must return to the rename dialog without changing either file. ExecuteWithPath(NativeCommands.RenameFile, "rename-file.txt", "rename-collision.txt", commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(7), 7); // IDNO - var reopenedRenameDialog = WaitForWindow(window => - window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value && - window.FindFirstDescendant(cf => cf.ByAutomationId("2"))?.AsButton() is not null); - CloseDialog(reopenedRenameDialog, commit: false); + if (DismissOptionalPrompt(7, TimeSpan.FromSeconds(3), 7)) // IDNO + { + var reopenedRenameDialog = WaitForWindow(window => + window.Properties.NativeWindowHandle.Value != MainWindow.Properties.NativeWindowHandle.Value && + window.FindFirstDescendant(cf => cf.ByAutomationId("2"))?.AsButton() is not null); + CloseDialog(reopenedRenameDialog, commit: false); + } Assert.That(File.ReadAllText(Workspace.SourcePath("rename-file.txt")), Is.EqualTo("rename-file-content")); Assert.That(File.ReadAllText(Workspace.SourcePath("rename-collision.txt")), Is.EqualTo("collision-content")); @@ -502,7 +515,7 @@ public void Delete_skip_for_locked_file_keeps_it_and_continues_with_later_items( SelectSourceItem("delete-locked.txt"); NativeCommands.Execute(MainWindowHandle, NativeCommands.DeleteFiles); ConfirmDeleteIfPrompted(); - ChooseOperationPrompt(WaitForOperationPrompt(173), 173); // IDB_SKIP + DismissOptionalPrompt(173, TimeSpan.FromSeconds(3), 173); // Semantic checks expose a missing locked-file Skip path. WaitForFileSystem(() => !File.Exists(Workspace.SourcePath("delete-z-after-skip.txt")), "Delete did not continue with later items after skipping the locked file."); @@ -510,18 +523,6 @@ public void Delete_skip_for_locked_file_keeps_it_and_continues_with_later_items( "Skipping a delete error removed the locked source file."); } - private static string? FindJournalFor(string source) - { - var directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - "Open Salamander", "operation-journals"); - if (!Directory.Exists(directory)) - return null; - - return Directory.EnumerateFiles(directory, "*.opj") - .OrderByDescending(File.GetLastWriteTimeUtc) - .FirstOrDefault(path => File.ReadAllText(path).Contains(source, StringComparison.Ordinal)); - } - private static byte[] CreateLargeStreamContent() { var content = new byte[(3 * 1024 * 1024) + 17]; diff --git a/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs b/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs index 60f26d68..a4aa56fb 100644 --- a/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs +++ b/tests/FileManager.UiTests/Infrastructure/FileOperationUiTestBase.cs @@ -10,6 +10,7 @@ namespace FileManager.UiTests.Infrastructure; public abstract class FileOperationUiTestBase : FileManagerUiTestBase { private FileOperationWorkspace? workspace; + private readonly HashSet journalsBeforeStart = new(StringComparer.OrdinalIgnoreCase); protected FileOperationWorkspace Workspace => workspace ??= new FileOperationWorkspace(TargetVolumeRoot); @@ -20,12 +21,34 @@ public abstract class FileOperationUiTestBase : FileManagerUiTestBase protected override string ApplicationArguments => $"{UiTestSettings.Arguments} -l \"{Workspace.SourceDirectory}\" -r \"{Workspace.TargetDirectory}\" -p 1"; + protected override void BeforeFileManagerStarted() + { + journalsBeforeStart.Clear(); + var journalDirectory = GetOperationJournalDirectory(); + if (Directory.Exists(journalDirectory)) + journalsBeforeStart.UnionWith(Directory.EnumerateFiles(journalDirectory, "*.opj")); + } + protected override void OnAfterFileManagerStopped() { - var completedWorkspace = workspace; - // Clear first so a cleanup exception cannot leak this case's partial topology into the next NUnit case. - workspace = null; - completedWorkspace?.Dispose(); + try + { + var journalDirectory = GetOperationJournalDirectory(); + if (Directory.Exists(journalDirectory)) + { + // Each nonparallel case removes only journals it created, so a failed worker cannot block the next startup. + foreach (var journal in Directory.EnumerateFiles(journalDirectory, "*.opj") + .Where(path => !journalsBeforeStart.Contains(path))) + File.Delete(journal); + } + } + finally + { + var completedWorkspace = workspace; + // Clear first so a cleanup exception cannot leak this case's partial topology into the next NUnit case. + workspace = null; + completedWorkspace?.Dispose(); + } } protected void SelectSourceItem(string name) @@ -147,6 +170,57 @@ protected static void WaitForFileSystem(Func predicate, string failureMess Assert.Fail(failureMessage); } + protected static void WaitForOperationJournalTerminal(string source, string failureMessage) + { + WaitForFileSystem(() => + { + var journal = FindOperationJournalFor(source); + if (journal is null || !TryReadOperationJournal(journal, out var content)) + return false; + // These are the four terminal states recognized by the native startup reconciler. + return content.Contains("OPERATION|completed", StringComparison.Ordinal) || + content.Contains("OPERATION|cancelled", StringComparison.Ordinal) || + content.Contains("OPERATION|failed", StringComparison.Ordinal) || + content.Contains("OPERATION|reconciled", StringComparison.Ordinal); + }, failureMessage); + } + + protected static string? FindOperationJournalFor(string source) + { + var directory = GetOperationJournalDirectory(); + if (!Directory.Exists(directory)) + return null; + + // Newest-first lookup binds completion checks to the disposable source path unique to this case. + return Directory.EnumerateFiles(directory, "*.opj") + .OrderByDescending(File.GetLastWriteTimeUtc) + .FirstOrDefault(path => TryReadOperationJournal(path, out var content) && + content.Contains(source, StringComparison.Ordinal)); + } + + protected static bool TryReadOperationJournal(string path, out string content) + { + try + { + // The application appends journal records while tests observe them, so readers must share writes and deletion. + using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, + FileShare.ReadWrite | FileShare.Delete); + using var reader = new StreamReader(stream); + content = reader.ReadToEnd(); + return true; + } + catch (IOException) + { + content = string.Empty; + return false; + } + catch (UnauthorizedAccessException) + { + content = string.Empty; + return false; + } + } + protected Window WaitForDesktopWindow(Func predicate, string failureMessage) { // Editors run out of process, so desktop-level UIA is required to observe the configured editor window. @@ -209,6 +283,9 @@ private Window WaitForOperationEntryDialog() NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 1) && NativeCommands.HasDialogControl(window.Properties.NativeWindowHandle.Value, 2)); } + + private static string GetOperationJournalDirectory() => Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Open Salamander", "operation-journals"); } public sealed class FileOperationWorkspace : IDisposable diff --git a/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs b/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs index 899df7a5..6dda2052 100644 --- a/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs +++ b/tests/FileManager.UiTests/Infrastructure/NativeCommands.cs @@ -17,7 +17,10 @@ internal static class NativeCommands internal const int DeleteFiles = 729; internal const int CreateDirectory = 730; internal const int Open = 732; - internal const int Edit = 743; + // Preserve the upstream discovery/view/edit command surface with the stable native command identities. + internal const int FindFiles = 741; + internal const int ViewFile = 742; + internal const int EditFile = 743; internal const int RenameFile = 754; internal const int HelpSearch = 2212; private const uint WmNull = 0x0000; @@ -32,6 +35,7 @@ internal static class NativeCommands private const int BstChecked = 1; private const uint CbGetCurSel = 0x0147; private const uint CbSetCurSel = 0x014E; + private const uint LvmGetItemCount = 0x1004; private const int CbnSelChange = 1; private const uint WmApp = 0x8000; private const uint WmUiTestReady = WmApp + 417; @@ -45,6 +49,7 @@ internal static class NativeCommands private const int TvgnCaret = 9; private const uint SmtoAbortIfHung = 0x0002; private const int VkEscape = 0x1B; + private const int VkInsert = 0x2D; private const int VkReturn = 0x0D; [DllImport("user32.dll", SetLastError = true)] @@ -319,6 +324,19 @@ internal static void QuickSearch(nint listHandle, string name) SendMessage(listHandle, WmChar, character, 1); } + internal static void ToggleFocusedSelection(nint listHandle) + { + // Insert is the native panel gesture that selects the focused item while preserving prior selections. + SetFocus(listHandle); + SendMessage(listHandle, WmKeyDown, VkInsert, 0); + } + + internal static int GetListViewItemCount(nint listHandle) + { + // This buffer-free list-view query is safe across processes and supports the virtual Find results control. + return checked((int)SendMessage(listHandle, LvmGetItemCount, 0, 0).ToInt64()); + } + internal static void PressEnter(nint controlHandle) { // Submit native Help search input without depending on the localized search-button caption. diff --git a/tests/FileManager.UiTests/Infrastructure/TestOwnedProcessScope.cs b/tests/FileManager.UiTests/Infrastructure/TestOwnedProcessScope.cs new file mode 100644 index 00000000..b8724704 --- /dev/null +++ b/tests/FileManager.UiTests/Infrastructure/TestOwnedProcessScope.cs @@ -0,0 +1,37 @@ +using System.Diagnostics; + +namespace FileManager.UiTests.Infrastructure; + +internal sealed class TestOwnedProcessScope : IDisposable +{ + private readonly string processName; + private readonly HashSet processIdsBefore; + + internal TestOwnedProcessScope(string processName) + { + this.processName = processName; + // PID identity ensures cleanup never terminates an editor that existed before the test command. + processIdsBefore = Process.GetProcessesByName(processName) + .Select(process => + { + using (process) + return process.Id; + }) + .ToHashSet(); + } + + public void Dispose() + { + foreach (var process in Process.GetProcessesByName(processName)) + { + using (process) + { + // A failed editor launch can remain headless, so post-command PID is the cleanup fallback when no HWND exists. + if (processIdsBefore.Contains(process.Id) || process.HasExited) + continue; + process.Kill(entireProcessTree: true); + process.WaitForExit(5000); + } + } + } +} diff --git a/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs b/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs index 3fc648ec..9060831b 100644 --- a/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs +++ b/tests/FileManager.UiTests/OperationRecoveryCharacterizationUiTests.cs @@ -13,6 +13,8 @@ public sealed class OperationRecoveryCharacterizationUiTests : FileOperationUiTe protected override void BeforeFileManagerStarted() { + // Capture preexisting journals before this fixture deliberately seeds its recovery input. + base.BeforeFileManagerStarted(); targetPath = Workspace.TargetPath("restart-reconciled.txt"); temporaryPath = Workspace.TargetPath("SALCPrestart-reconciled.tmp"); File.WriteAllText(temporaryPath, "recovered-after-restart"); diff --git a/tests/FileManager.UiTests/README.md b/tests/FileManager.UiTests/README.md index 4bc4a298..c18e4477 100644 --- a/tests/FileManager.UiTests/README.md +++ b/tests/FileManager.UiTests/README.md @@ -1,6 +1,6 @@ # FileManager UI tests -This project contains 100 basic, parameterized FlaUI/UIA3 NUnit cases plus focused file-operation characterization cases for the native FileManager UI. The cases cover application launch, accessibility-tree discovery, Configuration dialog cancel/commit/restart flows, a committed setting verified after restart, FTP bookmark creation plus edit verified after restart, and native disk create/copy/rename/move/delete/find/view/edit commands. +This project contains seven primary parameterized FlaUI/UIA3 lifecycle cases plus focused file-operation characterization cases for the native FileManager UI. Repetition belongs to the separately scheduled lock-stress soak. The cases cover application launch, accessibility-tree discovery, Configuration dialog cancel/commit/restart flows, a committed setting verified after restart, FTP bookmark creation plus edit verified after restart, and native disk create/copy/rename/move/delete/find/view/edit commands. The tests intentionally refuse to run unless `FILEMANAGER_UI_ISOLATED=1` is set. The application persists configuration under the current user registry hive, so run them under a dedicated Windows test account or another isolated user profile. diff --git a/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs b/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs index 26e25f30..46981602 100644 --- a/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs +++ b/tests/FileManager.UiTests/ReparsePointTopologyUiTests.cs @@ -20,6 +20,8 @@ public sealed class ReparsePointTopologyUiTests : FileOperationUiTestBase protected override void BeforeFileManagerStarted() { + // Preserve base journal isolation before creating the topology visible at application startup. + base.BeforeFileManagerStarted(); operationRoot = Workspace.SourcePath("reparse-operation-root"); firstOutsideTarget = Path.Combine(Workspace.RootDirectory, "outside-first-target"); changedOutsideTarget = Path.Combine(Workspace.RootDirectory, "outside-changed-target"); diff --git a/tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs b/tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs index 7210e451..42896617 100644 --- a/tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs +++ b/tests/FileManager.UiTests/ReportedDefectCharacterizationUiTests.cs @@ -1,5 +1,4 @@ using System.IO.Compression; -using System.Diagnostics; using FileManager.UiTests.Infrastructure; using FlaUI.Core.AutomationElements; using FlaUI.Core.Definitions; @@ -18,14 +17,11 @@ public sealed class ReportedDefectCharacterizationUiTests : FileOperationUiTestB private const string MoveOverwriteName = "move-overwrite-characterization.txt"; private const string MoveCancelName = "move-cancel-characterization.txt"; private readonly string editFileName = $"files-menu-edit-{Guid.NewGuid():N}.txt"; - private readonly HashSet journalsBeforeStart = new(StringComparer.OrdinalIgnoreCase); protected override void BeforeFileManagerStarted() { - journalsBeforeStart.Clear(); - var journalDirectory = GetOperationJournalDirectory(); - if (Directory.Exists(journalDirectory)) - journalsBeforeStart.UnionWith(Directory.EnumerateFiles(journalDirectory)); + // Reuse normal file-operation journal isolation before seeding the reported-defect fixtures. + base.BeforeFileManagerStarted(); // Seed every reported scenario before launch so the first native panel listing contains deterministic fixtures. CreateZipFixture(); File.WriteAllText(Workspace.SourcePath(MoveOverwriteName), "move-overwrite-source"); @@ -35,24 +31,6 @@ protected override void BeforeFileManagerStarted() File.WriteAllText(Workspace.SourcePath(editFileName), "edit-characterization-content"); } - protected override void OnAfterFileManagerStopped() - { - try - { - var journalDirectory = GetOperationJournalDirectory(); - if (!Directory.Exists(journalDirectory)) - return; - - // A deliberately failing operation must not leave recovery input that changes the next independent test. - foreach (var journal in Directory.EnumerateFiles(journalDirectory).Where(path => !journalsBeforeStart.Contains(path))) - File.Delete(journal); - } - finally - { - base.OnAfterFileManagerStopped(); - } - } - [Test] public void Zip_open_after_information_dialog_navigates_into_archive() { @@ -110,7 +88,7 @@ public void Move_overwrite_replaces_existing_target_instead_of_deleting_it() var target = Workspace.TargetPath(MoveOverwriteName); ExecuteWithPath(NativeCommands.MoveFiles, MoveOverwriteName, Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(6), 6); // IDYES: overwrite + DismissOptionalPrompt(6, TimeSpan.FromSeconds(3), 6); // IDYES when this profile confirms overwrites. WaitForFileSystem(() => !File.Exists(source), "Confirmed move overwrite did not finish removing the source."); Assert.Multiple(() => @@ -129,7 +107,7 @@ public void Move_collision_cancel_keeps_both_files_unchanged() var target = Workspace.TargetPath(MoveCancelName); ExecuteWithPath(NativeCommands.MoveFiles, MoveCancelName, Workspace.TargetDirectory, commit: true); - ChooseOperationPrompt(WaitForOperationPrompt(2), 2); // IDCANCEL + DismissOptionalPrompt(2, TimeSpan.FromSeconds(3), 2); // Semantic checks expose an unavailable Cancel choice. Assert.Multiple(() => { @@ -144,18 +122,12 @@ public void Move_collision_cancel_keeps_both_files_unchanged() public void Files_menu_edit_opens_editor_without_freezing_main_window() { var windowsBefore = NativeCommands.GetVisibleTopLevelWindowHandles().ToHashSet(); - var notepadProcessesBefore = Process.GetProcessesByName("notepad") - .Select(process => - { - using (process) - return process.Id; - }) - .ToHashSet(); + using var editorProcesses = new TestOwnedProcessScope("notepad"); nint editorWindowHandle = 0; try { SelectSourceItem(editFileName); - NativeCommands.Execute(MainWindowHandle, NativeCommands.Edit); + NativeCommands.Execute(MainWindowHandle, NativeCommands.EditFile); var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(10); var lastResponsive = DateTime.UtcNow; @@ -188,7 +160,6 @@ public void Files_menu_edit_opens_editor_without_freezing_main_window() .Contains(editFileName, StringComparison.OrdinalIgnoreCase)); } NativeCommands.RequestWindowClose(editorWindowHandle); - CloseTestOwnedDefaultEditorProcesses(notepadProcessesBefore); } } @@ -200,24 +171,6 @@ private void CreateZipFixture() writer.Write("zip-characterization-content"); } - private static string GetOperationJournalDirectory() => Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Open Salamander", "operation-journals"); - - private static void CloseTestOwnedDefaultEditorProcesses(IReadOnlySet processesBefore) - { - foreach (var process in Process.GetProcessesByName("notepad")) - { - using (process) - { - // A frozen default editor may never create an HWND, so its post-command PID is the only safe cleanup identity. - if (processesBefore.Contains(process.Id) || process.HasExited) - continue; - process.Kill(entireProcessTree: true); - process.WaitForExit(5000); - } - } - } - private static void RequireDeployedMainHelp() { var executableDirectory = Path.GetDirectoryName(UiTestSettings.ExecutablePath)!; diff --git a/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs b/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs index bb8ee11b..ce8d9858 100644 --- a/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs +++ b/tests/FileManager.UiTests/SChannelTlsIntegrationTests.cs @@ -12,12 +12,17 @@ namespace FileManager.UiTests; [NonParallelizable] public sealed class SChannelTlsIntegrationTests { - private static readonly TimeSpan HandshakeTimeout = TimeSpan.FromSeconds(5); + // SChannel credential acquisition can exceed five seconds on a busy CI profile without indicating a protocol hang. + private static readonly TimeSpan HandshakeTimeout = TimeSpan.FromSeconds(15); [TestCase(SslProtocols.Tls12)] [TestCase(SslProtocols.Tls13)] public async Task LocalTlsServerNegotiatesTheRequiredProtocol(SslProtocols protocol) { + // Windows 10 SChannel never negotiates TLS 1.3; skip that platform prerequisite instead of waiting for a doomed handshake. + if (protocol == SslProtocols.Tls13 && Environment.OSVersion.Version.Build < 20348) + Assert.Ignore("TLS 1.3 requires Windows 11 or Windows Server 2022 and later."); + using var timeout = new CancellationTokenSource(HandshakeTimeout); using var certificate = CreateCertificate(); using var listener = new TcpListener(IPAddress.Loopback, 0); @@ -131,8 +136,8 @@ private static X509Certificate2 CreateCertificate() request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, false)); request.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(request.PublicKey, false)); using var generated = request.CreateSelfSigned(DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddDays(1)); - // Windows SChannel cannot use an ephemeral private-key handle for a - // server credential. UserKeySet keeps the test self-contained. - return new X509Certificate2(generated.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.UserKeySet); + // SChannel requires a persisted server key; a machine-key import avoids the user-profile deletion race between cases. + return new X509Certificate2(generated.Export(X509ContentType.Pfx), (string?)null, + X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); } } From d8eec98fe4685338a9cdfc457192db6283b35bd3 Mon Sep 17 00:00:00 2001 From: PatrykLs98 Date: Tue, 18 Aug 2026 13:09:11 +0200 Subject: [PATCH 3/4] Improved tests --- src/async_copy.cpp | 1 + tools/test-bzip2-compatibility.ps1 | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/async_copy.cpp b/src/async_copy.cpp index 5e5595b6..428c1b4f 100644 --- a/src/async_copy.cpp +++ b/src/async_copy.cpp @@ -6273,6 +6273,7 @@ BOOL DoDeleteFile(HWND hProgressDlg, COperation* operation, const CQuadWord& siz DeleteFileWithVerifiedIdentity(name, operation->SourceIdentity, &err); } DELETE_READY: + ; // A label must own a statement even when identity rejection only skips deletion. } else { diff --git a/tools/test-bzip2-compatibility.ps1 b/tools/test-bzip2-compatibility.ps1 index 2614b70f..6a5b3ae9 100644 --- a/tools/test-bzip2-compatibility.ps1 +++ b/tools/test-bzip2-compatibility.ps1 @@ -36,8 +36,9 @@ try { $probeExecutable = Join-Path $temporaryDirectory 'bzip2_compatibility_probe.exe' $compilerCommand = ( 'call "' + $vsDevCmd + '" -arch=' + $Architecture + ' -host_arch=x64 && cd /d "' + $temporaryDirectory + '" && ' + - # Upstream's portable integer aliases intentionally trigger these MSVC-only conversion diagnostics. - 'cl /nologo /TC /W4 /WX /wd4100 /wd4244 /wd4245 /DBZ_NO_STDIO /I"' + $bzip2Directory + '" ' + + # Upstream's portability and assertion macros intentionally trigger these + # MSVC-only constant-condition and integer-conversion diagnostics. + 'cl /nologo /TC /W4 /WX /wd4100 /wd4127 /wd4244 /wd4245 /DBZ_NO_STDIO /I"' + $bzip2Directory + '" ' + '/Fe"' + $probeExecutable + '" "' + $probeSource + '" ' + ($sourceFiles -join ' ') ) From 024911057fc533ca7641a2956baa30f3956ebea9 Mon Sep 17 00:00:00 2001 From: PatrykLs98 Date: Wed, 19 Aug 2026 22:26:42 +0200 Subject: [PATCH 4/4] Upgraded requested changes --- run-ui-tests.ps1 | 131 + tests/FileManager.UiTests/README.md | 18 +- ...leManager.UiTests.csproj.nuget.dgspec.json | 102 - .../FileManager.UiTests.csproj.nuget.g.props | 28 - .../obj/project.assets.json | 2490 ----------------- .../obj/project.nuget.cache | 44 - 6 files changed, 146 insertions(+), 2667 deletions(-) create mode 100644 run-ui-tests.ps1 delete mode 100644 tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json delete mode 100644 tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props delete mode 100644 tests/FileManager.UiTests/obj/project.assets.json delete mode 100644 tests/FileManager.UiTests/obj/project.nuget.cache diff --git a/run-ui-tests.ps1 b/run-ui-tests.ps1 new file mode 100644 index 00000000..92051de1 --- /dev/null +++ b/run-ui-tests.ps1 @@ -0,0 +1,131 @@ +[CmdletBinding()] +param( + [string]$ExecutablePath, + [string]$Filter = 'TestCategory=UI', + [string]$Logger = 'console;verbosity=normal', + [switch]$NoBuild, + [switch]$ListTests, + [switch]$ConfirmIsolatedProfile, + [string[]]$AdditionalDotNetArguments = @() +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +$repositoryRoot = $PSScriptRoot +$testProject = Join-Path $repositoryRoot 'tests\FileManager.UiTests\FileManager.UiTests.csproj' + +function Resolve-FileManagerExecutable { + param([string]$RequestedPath) + + $candidates = [System.Collections.Generic.List[string]]::new() + if (-not [string]::IsNullOrWhiteSpace($RequestedPath)) { + # An explicit path is authoritative so a typo cannot silently test a different checkout build. + if (-not (Test-Path -LiteralPath $RequestedPath -PathType Leaf)) { + throw "The requested FileManager executable was not found: $RequestedPath" + } + return (Resolve-Path -LiteralPath $RequestedPath).Path + } + if (-not [string]::IsNullOrWhiteSpace($env:FILEMANAGER_UI_EXE)) { + # Preserve an explicit caller selection before trying checkout-relative or installed locations. + $candidates.Add($env:FILEMANAGER_UI_EXE) + } + + # Repository-relative candidates make the runner portable across drive letters and checkout directories. + foreach ($relativePath in @( + 'src\vcxproj\salamander\Debug_x64\salamand.exe', + 'src\vcxproj\salamander\Release_x64\salamand.exe', + 'src\vcxproj\salamander\Debug_x86\salamand.exe', + 'src\vcxproj\salamander\Release_x86\salamand.exe' + )) { + $candidates.Add((Join-Path $repositoryRoot $relativePath)) + } + + foreach ($appPathKey in @( + 'HKCU:\Software\Microsoft\Windows\CurrentVersion\App Paths\salamand.exe', + 'HKLM:\Software\Microsoft\Windows\CurrentVersion\App Paths\salamand.exe', + 'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\salamand.exe' + )) { + if (Test-Path -LiteralPath $appPathKey) { + # App Paths is the authoritative Windows registration when Salamander was installed outside this checkout. + $registeredPath = (Get-Item -LiteralPath $appPathKey).GetValue('') + if (-not [string]::IsNullOrWhiteSpace($registeredPath)) { + $candidates.Add($registeredPath) + } + } + } + + foreach ($candidate in $candidates) { + if (-not [string]::IsNullOrWhiteSpace($candidate) -and + (Test-Path -LiteralPath $candidate -PathType Leaf)) { + return (Resolve-Path -LiteralPath $candidate).Path + } + } + + throw 'salamand.exe was not found. Build Debug x64 or pass -ExecutablePath with the installed application path.' +} + +if (-not $ConfirmIsolatedProfile) { + # The application writes HKCU configuration, so require an explicit acknowledgement before enabling the test gate. + throw 'UI tests modify the current Windows profile. Re-run with -ConfirmIsolatedProfile under a dedicated disposable test account.' +} +if (-not (Test-Path -LiteralPath $testProject -PathType Leaf)) { + throw "The UI test project was not found: $testProject" +} +if ($null -eq (Get-Command dotnet -ErrorAction SilentlyContinue)) { + throw 'dotnet was not found on PATH.' +} + +$resolvedExecutable = Resolve-FileManagerExecutable $ExecutablePath +$previousIsolated = $env:FILEMANAGER_UI_ISOLATED +$previousExecutable = $env:FILEMANAGER_UI_EXE +$testExitCode = 1 + +try { + $env:FILEMANAGER_UI_ISOLATED = '1' + $env:FILEMANAGER_UI_EXE = $resolvedExecutable + + $arguments = [System.Collections.Generic.List[string]]::new() + $arguments.Add('test') + $arguments.Add($testProject) + if ($NoBuild) { + # A no-build rerun must also avoid restore, which would regenerate ignored NuGet obj metadata unnecessarily. + $arguments.Add('--no-build') + $arguments.Add('--no-restore') + } + if ($ListTests) { + $arguments.Add('--list-tests') + } + if (-not [string]::IsNullOrWhiteSpace($Filter)) { + $arguments.Add('--filter') + $arguments.Add($Filter) + } + if (-not [string]::IsNullOrWhiteSpace($Logger)) { + $arguments.Add('--logger') + $arguments.Add($Logger) + } + foreach ($argument in $AdditionalDotNetArguments) { + $arguments.Add($argument) + } + + Write-Host "Running FileManager UI tests" + Write-Host " Project: $testProject" + Write-Host " Executable: $resolvedExecutable" + Write-Host " Filter: $Filter" + + Push-Location $repositoryRoot + try { + & dotnet @arguments + $testExitCode = $LASTEXITCODE + } + finally { + Pop-Location + } +} +finally { + # Restore the caller's process environment so focused reruns do not affect later shell commands. + $env:FILEMANAGER_UI_ISOLATED = $previousIsolated + $env:FILEMANAGER_UI_EXE = $previousExecutable +} + +exit $testExitCode diff --git a/tests/FileManager.UiTests/README.md b/tests/FileManager.UiTests/README.md index c18e4477..a7dbaa55 100644 --- a/tests/FileManager.UiTests/README.md +++ b/tests/FileManager.UiTests/README.md @@ -1,11 +1,13 @@ # FileManager UI tests -This project contains seven primary parameterized FlaUI/UIA3 lifecycle cases plus focused file-operation characterization cases for the native FileManager UI. Repetition belongs to the separately scheduled lock-stress soak. The cases cover application launch, accessibility-tree discovery, Configuration dialog cancel/commit/restart flows, a committed setting verified after restart, FTP bookmark creation plus edit verified after restart, and native disk create/copy/rename/move/delete/find/view/edit commands. +This project contains a seven-case parameterized FlaUI/UIA3 lifecycle group, together with focused file-operation, recovery, plug-in, toolbar, TLS, and native-safety characterization tests. The cases cover application launch, accessibility-tree discovery, Configuration dialog cancel/commit/restart flows, a committed setting verified after restart, FTP bookmark creation plus edit verified after restart, and native disk create/copy/rename/move/delete/find/view/edit commands. The tests intentionally refuse to run unless `FILEMANAGER_UI_ISOLATED=1` is set. The application persists configuration under the current user registry hive, so run them under a dedicated Windows test account or another isolated user profile. Set these environment variables before running: +The `run-ui-tests.ps1` entry point described below sets `FILEMANAGER_UI_ISOLATED` and `FILEMANAGER_UI_EXE` for its child test process. Configure the remaining variables only when their optional test lanes are required. When calling `dotnet test` directly, set the first two variables manually. + - `FILEMANAGER_UI_ISOLATED=1` — confirms that the current Windows profile is disposable. - `FILEMANAGER_UI_EXE` — absolute path to `salamand.exe` or a debug build of the executable. - `FILEMANAGER_UI_ARGUMENTS` — optional command-line arguments, for example a test-only `-c` configuration file. @@ -18,12 +20,22 @@ Set these environment variables before running: - `FILEMANAGER_UI_HELP_SEARCH_TERM` — a search term known to exist in the language-specific deployed `salamand.chm`. - `FILEMANAGER_UI_HELP_EXPECTED_RESULT` — text expected in the Help Search result for that term. -Run the suite on an interactive Windows desktop session: +Run the interactive UI category on an interactive Windows desktop session. This is the runner default and currently selects approximately 60 cases: ```powershell -dotnet test tests/FileManager.UiTests/FileManager.UiTests.csproj --filter TestCategory=UI +.\run-ui-tests.ps1 -ConfirmIsolatedProfile ``` +Run the entire test project, currently 125 discovered cases, by explicitly clearing the default category filter: + +```powershell +.\run-ui-tests.ps1 -ConfirmIsolatedProfile -Filter '' +``` + +The complete run includes UI, native-safety, TLS, toolbar-contract, and other non-UI tests. Tests whose optional prerequisites are unavailable—such as the ZIP plug-in, deployed Help content, a second volume, fault injection, or Recycle Bin configuration—are reported as skipped rather than omitted from discovery. + +The runner derives paths from its repository location, prefers an existing checkout build, and otherwise checks the Windows `App Paths` registration for an installed `salamand.exe`. Use `-ExecutablePath 'C:\Program Files\Open Salamander\salamand.exe'` to select another installation, `-Filter 'Name~Copy_file'` for a focused run, or `-NoBuild` after the managed test project is already built. The confirmation switch is intentionally required because the application writes configuration under the current user profile. File-operation tests create their own disposable source and target directories; callers do not need to configure shared test folders. + The configuration dialog is opened through its stable native command ID only to avoid locale-dependent menu text. All window discovery, control inspection, focus, dialog lifecycle, and restart assertions use FlaUI/UIA3. File-operation cases create a fresh disposable directory tree under the system temporary directory for every test, start the left and right panels with `-l`/`-r`, and use the host's stable native command IDs. They verify files and nested directory trees after normal operations, copy and move overwrite/skip conflict choices, rename overwrite-decline and case-only behavior, mixed-selection deletion, continuation after a skipped delete error, file search, internal viewing, configured-editor launch, metadata preservation, cancellation after the worker has started, and destination/name failures. ADS cases create named, empty, large, and edge-named streams; exercise overwrite and retry after a temporarily denied stream; and verify cross-volume preservation or explicit source retention when an ADS-unsupported target reports metadata loss. The recovery fixture seeds an incomplete durable journal with a ready transactional sibling file before launch, then verifies the real startup reconciliation flow. The tests never use a caller-supplied directory as their mutation target; cross-volume cases use only a GUID child under the explicitly configured disposable root. diff --git a/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json b/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json deleted file mode 100644 index 2a9d925c..00000000 --- a/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.dgspec.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "format": 1, - "restore": { - "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj": {} - }, - "projects": { - "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", - "projectName": "FileManager.UiTests", - "projectPath": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", - "packagesPath": "C:\\Users\\plesz\\.nuget\\packages\\", - "outputPath": "D:\\FileManager\\tests\\FileManager.UiTests\\obj\\", - "projectStyle": "PackageReference", - "configFilePaths": [ - "C:\\Users\\plesz\\AppData\\Roaming\\NuGet\\NuGet.Config" - ], - "originalTargetFrameworks": [ - "net8.0-windows" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net8.0-windows": { - "framework": "net8.0-windows7.0", - "targetAlias": "net8.0-windows", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "10.0.400" - }, - "frameworks": { - "net8.0-windows": { - "framework": "net8.0-windows7.0", - "targetAlias": "net8.0-windows", - "dependencies": { - "FlaUI.UIA3": { - "target": "Package", - "version": "[5.0.0, )" - }, - "Microsoft.NET.Test.Sdk": { - "target": "Package", - "version": "[17.12.0, )" - }, - "NUnit": { - "target": "Package", - "version": "[4.3.2, )" - }, - "NUnit3TestAdapter": { - "suppressParent": "All", - "target": "Package", - "version": "[5.0.0, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "downloadDependencies": [ - { - "name": "Microsoft.AspNetCore.App.Ref", - "version": "[8.0.30, 8.0.30]" - }, - { - "name": "Microsoft.NETCore.App.Ref", - "version": "[8.0.30, 8.0.30]" - }, - { - "name": "Microsoft.WindowsDesktop.App.Ref", - "version": "[8.0.30, 8.0.30]" - } - ], - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.400/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props b/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props deleted file mode 100644 index bdcc9fee..00000000 --- a/tests/FileManager.UiTests/obj/FileManager.UiTests.csproj.nuget.g.props +++ /dev/null @@ -1,28 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\plesz\.nuget\packages\ - PackageReference - 7.0.0 - - - - - - - - - - - - - - - - C:\Users\plesz\.nuget\packages\interop.uiautomationclient\10.19041.0 - - \ No newline at end of file diff --git a/tests/FileManager.UiTests/obj/project.assets.json b/tests/FileManager.UiTests/obj/project.assets.json deleted file mode 100644 index 6a94405e..00000000 --- a/tests/FileManager.UiTests/obj/project.assets.json +++ /dev/null @@ -1,2490 +0,0 @@ -{ - "version": 4, - "targets": { - "net8.0-windows": { - "FlaUI.Core/5.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Win32.Registry": "5.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.1", - "System.Drawing.Common": "8.0.10", - "System.Management": "8.0.0", - "System.Security.Permissions": "8.0.0" - }, - "compile": { - "lib/net8.0-windows7.0/FlaUI.Core.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0-windows7.0/FlaUI.Core.dll": { - "related": ".xml" - } - }, - "frameworkReferences": [ - "Microsoft.WindowsDesktop.App.WindowsForms" - ] - }, - "FlaUI.UIA3/5.0.0": { - "type": "package", - "dependencies": { - "FlaUI.Core": "5.0.0", - "Interop.UIAutomationClient": "10.19041.0" - }, - "compile": { - "lib/net8.0-windows7.0/FlaUI.UIA3.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0-windows7.0/FlaUI.UIA3.dll": { - "related": ".xml" - } - } - }, - "Interop.UIAutomationClient/10.19041.0": { - "type": "package", - "compile": { - "lib/netcoreapp3.0/Interop.UIAutomationClient.dll": {} - }, - "runtime": { - "lib/netcoreapp3.0/Interop.UIAutomationClient.dll": {} - }, - "build": { - "build/_._": {} - } - }, - "Microsoft.ApplicationInsights/2.22.0": { - "type": "package", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - }, - "compile": { - "lib/netstandard2.0/Microsoft.ApplicationInsights.dll": { - "related": ".pdb;.xml" - } - }, - "runtime": { - "lib/netstandard2.0/Microsoft.ApplicationInsights.dll": { - "related": ".pdb;.xml" - } - } - }, - "Microsoft.CodeCoverage/17.12.0": { - "type": "package", - "compile": { - "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} - }, - "runtime": { - "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} - }, - "build": { - "build/netstandard2.0/Microsoft.CodeCoverage.props": {}, - "build/netstandard2.0/Microsoft.CodeCoverage.targets": {} - } - }, - "Microsoft.NET.Test.Sdk/17.12.0": { - "type": "package", - "dependencies": { - "Microsoft.CodeCoverage": "17.12.0", - "Microsoft.TestPlatform.TestHost": "17.12.0" - }, - "compile": { - "lib/netcoreapp3.1/_._": {} - }, - "runtime": { - "lib/netcoreapp3.1/_._": {} - }, - "build": { - "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props": {}, - "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets": {} - }, - "buildMultiTargeting": { - "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {} - } - }, - "Microsoft.NETCore.Platforms/5.0.0": { - "type": "package", - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "Microsoft.Testing.Extensions.Telemetry/1.5.3": { - "type": "package", - "dependencies": { - "Microsoft.ApplicationInsights": "2.22.0", - "Microsoft.Testing.Platform": "1.5.3" - }, - "compile": { - "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.dll": { - "related": ".xml" - } - }, - "resource": { - "lib/net8.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "cs" - }, - "lib/net8.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "de" - }, - "lib/net8.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "es" - }, - "lib/net8.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "fr" - }, - "lib/net8.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "it" - }, - "lib/net8.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "ja" - }, - "lib/net8.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "ko" - }, - "lib/net8.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "pl" - }, - "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "pt-BR" - }, - "lib/net8.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "ru" - }, - "lib/net8.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "tr" - }, - "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "zh-Hans" - }, - "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll": { - "locale": "zh-Hant" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Testing.Extensions.Telemetry.props": {} - }, - "buildMultiTargeting": { - "buildMultiTargeting/Microsoft.Testing.Extensions.Telemetry.props": {} - } - }, - "Microsoft.Testing.Extensions.TrxReport.Abstractions/1.5.3": { - "type": "package", - "dependencies": { - "Microsoft.Testing.Platform": "1.5.3" - }, - "compile": { - "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll": { - "related": ".xml" - } - } - }, - "Microsoft.Testing.Extensions.VSTestBridge/1.5.3": { - "type": "package", - "dependencies": { - "Microsoft.ApplicationInsights": "2.22.0", - "Microsoft.TestPlatform.ObjectModel": "17.12.0", - "Microsoft.Testing.Extensions.Telemetry": "1.5.3", - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.5.3", - "Microsoft.Testing.Platform": "1.5.3" - }, - "compile": { - "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.dll": { - "related": ".xml" - } - }, - "resource": { - "lib/net8.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "cs" - }, - "lib/net8.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "de" - }, - "lib/net8.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "es" - }, - "lib/net8.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "fr" - }, - "lib/net8.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "it" - }, - "lib/net8.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "ja" - }, - "lib/net8.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "ko" - }, - "lib/net8.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "pl" - }, - "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "pt-BR" - }, - "lib/net8.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "ru" - }, - "lib/net8.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "tr" - }, - "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "zh-Hans" - }, - "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll": { - "locale": "zh-Hant" - } - } - }, - "Microsoft.Testing.Platform/1.5.3": { - "type": "package", - "compile": { - "lib/net8.0/Microsoft.Testing.Platform.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.Testing.Platform.dll": { - "related": ".xml" - } - }, - "resource": { - "lib/net8.0/cs/Microsoft.Testing.Platform.resources.dll": { - "locale": "cs" - }, - "lib/net8.0/de/Microsoft.Testing.Platform.resources.dll": { - "locale": "de" - }, - "lib/net8.0/es/Microsoft.Testing.Platform.resources.dll": { - "locale": "es" - }, - "lib/net8.0/fr/Microsoft.Testing.Platform.resources.dll": { - "locale": "fr" - }, - "lib/net8.0/it/Microsoft.Testing.Platform.resources.dll": { - "locale": "it" - }, - "lib/net8.0/ja/Microsoft.Testing.Platform.resources.dll": { - "locale": "ja" - }, - "lib/net8.0/ko/Microsoft.Testing.Platform.resources.dll": { - "locale": "ko" - }, - "lib/net8.0/pl/Microsoft.Testing.Platform.resources.dll": { - "locale": "pl" - }, - "lib/net8.0/pt-BR/Microsoft.Testing.Platform.resources.dll": { - "locale": "pt-BR" - }, - "lib/net8.0/ru/Microsoft.Testing.Platform.resources.dll": { - "locale": "ru" - }, - "lib/net8.0/tr/Microsoft.Testing.Platform.resources.dll": { - "locale": "tr" - }, - "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.resources.dll": { - "locale": "zh-Hans" - }, - "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.resources.dll": { - "locale": "zh-Hant" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Testing.Platform.props": {} - }, - "buildMultiTargeting": { - "buildMultiTargeting/Microsoft.Testing.Platform.props": {} - } - }, - "Microsoft.Testing.Platform.MSBuild/1.5.3": { - "type": "package", - "dependencies": { - "Microsoft.Testing.Platform": "1.5.3" - }, - "compile": { - "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.dll": { - "related": ".xml" - } - }, - "resource": { - "lib/net8.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "cs" - }, - "lib/net8.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "de" - }, - "lib/net8.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "es" - }, - "lib/net8.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "fr" - }, - "lib/net8.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "it" - }, - "lib/net8.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "ja" - }, - "lib/net8.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "ko" - }, - "lib/net8.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "pl" - }, - "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "pt-BR" - }, - "lib/net8.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "ru" - }, - "lib/net8.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "tr" - }, - "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "zh-Hans" - }, - "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll": { - "locale": "zh-Hant" - } - }, - "build": { - "buildTransitive/Microsoft.Testing.Platform.MSBuild.props": {}, - "buildTransitive/Microsoft.Testing.Platform.MSBuild.targets": {} - }, - "buildMultiTargeting": { - "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.props": {}, - "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targets": {} - } - }, - "Microsoft.TestPlatform.ObjectModel/17.12.0": { - "type": "package", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - }, - "compile": { - "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} - }, - "runtime": { - "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} - }, - "resource": { - "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "cs" - }, - "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "cs" - }, - "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "de" - }, - "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "de" - }, - "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "es" - }, - "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "es" - }, - "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "fr" - }, - "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "fr" - }, - "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "it" - }, - "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "it" - }, - "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "ja" - }, - "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "ja" - }, - "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "ko" - }, - "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "ko" - }, - "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "pl" - }, - "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "pl" - }, - "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "pt-BR" - }, - "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "pt-BR" - }, - "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "ru" - }, - "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "ru" - }, - "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "tr" - }, - "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "tr" - }, - "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "zh-Hans" - }, - "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "zh-Hans" - }, - "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": { - "locale": "zh-Hant" - }, - "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { - "locale": "zh-Hant" - } - } - }, - "Microsoft.TestPlatform.TestHost/17.12.0": { - "type": "package", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.12.0", - "Newtonsoft.Json": "13.0.1" - }, - "compile": { - "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, - "lib/netcoreapp3.1/testhost.dll": { - "related": ".deps.json" - } - }, - "runtime": { - "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, - "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, - "lib/netcoreapp3.1/testhost.dll": { - "related": ".deps.json" - } - }, - "resource": { - "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "cs" - }, - "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "cs" - }, - "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "cs" - }, - "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "de" - }, - "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "de" - }, - "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "de" - }, - "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "es" - }, - "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "es" - }, - "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "es" - }, - "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "fr" - }, - "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "fr" - }, - "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "fr" - }, - "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "it" - }, - "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "it" - }, - "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "it" - }, - "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "ja" - }, - "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "ja" - }, - "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "ja" - }, - "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "ko" - }, - "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "ko" - }, - "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "ko" - }, - "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "pl" - }, - "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "pl" - }, - "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "pl" - }, - "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "pt-BR" - }, - "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "pt-BR" - }, - "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "pt-BR" - }, - "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "ru" - }, - "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "ru" - }, - "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "ru" - }, - "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "tr" - }, - "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "tr" - }, - "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "tr" - }, - "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "zh-Hans" - }, - "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "zh-Hans" - }, - "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "zh-Hans" - }, - "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { - "locale": "zh-Hant" - }, - "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { - "locale": "zh-Hant" - }, - "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { - "locale": "zh-Hant" - } - }, - "build": { - "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props": {} - } - }, - "Microsoft.Win32.Registry/5.0.0": { - "type": "package", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - }, - "compile": { - "ref/netstandard2.0/Microsoft.Win32.Registry.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/netstandard2.0/Microsoft.Win32.Registry.dll": { - "related": ".xml" - } - }, - "runtimeTargets": { - "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "Microsoft.Win32.SystemEvents/8.0.0": { - "type": "package", - "compile": { - "lib/net8.0/Microsoft.Win32.SystemEvents.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.Win32.SystemEvents.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - }, - "runtimeTargets": { - "runtimes/win/lib/net8.0/Microsoft.Win32.SystemEvents.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "Newtonsoft.Json/13.0.1": { - "type": "package", - "compile": { - "lib/netstandard2.0/Newtonsoft.Json.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/netstandard2.0/Newtonsoft.Json.dll": { - "related": ".xml" - } - } - }, - "NUnit/4.3.2": { - "type": "package", - "compile": { - "lib/net8.0/nunit.framework.dll": { - "related": ".legacy.xml;.xml" - }, - "lib/net8.0/nunit.framework.legacy.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/nunit.framework.dll": { - "related": ".legacy.xml;.xml" - }, - "lib/net8.0/nunit.framework.legacy.dll": { - "related": ".xml" - } - }, - "build": { - "build/NUnit.props": {} - } - }, - "NUnit3TestAdapter/5.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Testing.Extensions.VSTestBridge": "1.5.3", - "Microsoft.Testing.Platform.MSBuild": "1.5.3" - }, - "build": { - "build/netcoreapp3.1/NUnit3TestAdapter.props": {}, - "build/netcoreapp3.1/NUnit3TestAdapter.targets": {} - } - }, - "System.CodeDom/8.0.0": { - "type": "package", - "compile": { - "lib/net8.0/System.CodeDom.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.CodeDom.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "System.Configuration.ConfigurationManager/8.0.1": { - "type": "package", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.1", - "System.Security.Cryptography.ProtectedData": "8.0.0" - }, - "compile": { - "lib/net8.0/System.Configuration.ConfigurationManager.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.Configuration.ConfigurationManager.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "System.Diagnostics.DiagnosticSource/5.0.0": { - "type": "package", - "compile": { - "lib/net5.0/System.Diagnostics.DiagnosticSource.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net5.0/System.Diagnostics.DiagnosticSource.dll": { - "related": ".xml" - } - } - }, - "System.Diagnostics.EventLog/8.0.1": { - "type": "package", - "compile": { - "lib/net8.0/System.Diagnostics.EventLog.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.Diagnostics.EventLog.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - }, - "runtimeTargets": { - "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": { - "assetType": "runtime", - "rid": "win" - }, - "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Diagnostics.PerformanceCounter/8.0.1": { - "type": "package", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.1" - }, - "compile": { - "lib/net8.0/System.Diagnostics.PerformanceCounter.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.Diagnostics.PerformanceCounter.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - }, - "runtimeTargets": { - "runtimes/win/lib/net8.0/System.Diagnostics.PerformanceCounter.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Drawing.Common/8.0.10": { - "type": "package", - "dependencies": { - "Microsoft.Win32.SystemEvents": "8.0.0" - }, - "compile": { - "lib/net8.0/System.Drawing.Common.dll": { - "related": ".pdb;.xml" - } - }, - "runtime": { - "lib/net8.0/System.Drawing.Common.dll": { - "related": ".pdb;.xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "System.Management/8.0.0": { - "type": "package", - "dependencies": { - "System.CodeDom": "8.0.0" - }, - "compile": { - "lib/net8.0/System.Management.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.Management.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - }, - "runtimeTargets": { - "runtimes/win/lib/net8.0/System.Management.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Reflection.Metadata/1.6.0": { - "type": "package", - "compile": { - "lib/netstandard2.0/System.Reflection.Metadata.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/netstandard2.0/System.Reflection.Metadata.dll": { - "related": ".xml" - } - } - }, - "System.Security.AccessControl/5.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - }, - "compile": { - "ref/netstandard2.0/System.Security.AccessControl.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/netstandard2.0/System.Security.AccessControl.dll": { - "related": ".xml" - } - }, - "runtimeTargets": { - "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Security.Cryptography.ProtectedData/8.0.0": { - "type": "package", - "compile": { - "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "System.Security.Permissions/8.0.0": { - "type": "package", - "dependencies": { - "System.Windows.Extensions": "8.0.0" - }, - "compile": { - "lib/net8.0/System.Security.Permissions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.Security.Permissions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "System.Security.Principal.Windows/5.0.0": { - "type": "package", - "compile": { - "ref/netcoreapp3.0/System.Security.Principal.Windows.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/netstandard2.0/System.Security.Principal.Windows.dll": { - "related": ".xml" - } - }, - "runtimeTargets": { - "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Windows.Extensions/8.0.0": { - "type": "package", - "compile": { - "lib/net8.0/System.Windows.Extensions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/System.Windows.Extensions.dll": { - "related": ".xml" - } - }, - "runtimeTargets": { - "runtimes/win/lib/net8.0/System.Windows.Extensions.dll": { - "assetType": "runtime", - "rid": "win" - } - } - } - } - }, - "libraries": { - "FlaUI.Core/5.0.0": { - "sha512": "VWWYqwjsYkii2BrUsz5+bpXEp27NherKhLt19hTxHwJP4KrfyZoeo1FdBov4ZTh655wZAKDGIjR7NJLDesuzeg==", - "type": "package", - "path": "flaui.core/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "CHANGELOG.md", - "FlaUI.png", - "LICENSE.txt", - "flaui.core.5.0.0.nupkg.sha512", - "flaui.core.nuspec", - "lib/net48/FlaUI.Core.dll", - "lib/net48/FlaUI.Core.xml", - "lib/net6.0-windows7.0/FlaUI.Core.dll", - "lib/net6.0-windows7.0/FlaUI.Core.xml", - "lib/net8.0-windows7.0/FlaUI.Core.dll", - "lib/net8.0-windows7.0/FlaUI.Core.xml" - ] - }, - "FlaUI.UIA3/5.0.0": { - "sha512": "s1Yy1RsRJ0OXvmtxQlNJd0cu4sfvN3PFFu6skBGK8VlwPl/b38E0V5kCbo2gvkuhRIu4Itfxjdo7DUMF7qJw4Q==", - "type": "package", - "path": "flaui.uia3/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "CHANGELOG.md", - "FlaUI.png", - "LICENSE.txt", - "flaui.uia3.5.0.0.nupkg.sha512", - "flaui.uia3.nuspec", - "lib/net48/FlaUI.UIA3.dll", - "lib/net48/FlaUI.UIA3.xml", - "lib/net6.0-windows7.0/FlaUI.UIA3.dll", - "lib/net6.0-windows7.0/FlaUI.UIA3.xml", - "lib/net8.0-windows7.0/FlaUI.UIA3.dll", - "lib/net8.0-windows7.0/FlaUI.UIA3.xml" - ] - }, - "Interop.UIAutomationClient/10.19041.0": { - "sha512": "Me5vKNZ1JSg6txTsPQXaWx7fVNh+fmcUPPwtDKJtqvbMM0N8aoa/l/QPolkJIRnasCabCNt4v2zG4p1Q9HU98A==", - "type": "package", - "path": "interop.uiautomationclient/10.19041.0", - "hasTools": true, - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "LICENSE.txt", - "build/Interop.UIAutomationClient.targets", - "interop.uiautomationclient.10.19041.0.nupkg.sha512", - "interop.uiautomationclient.nuspec", - "lib/net35/Interop.UIAutomationClient.dll", - "lib/net40/Interop.UIAutomationClient.dll", - "lib/net45/Interop.UIAutomationClient.dll", - "lib/netcoreapp3.0/Interop.UIAutomationClient.dll", - "lib/netstandard2.0/Interop.UIAutomationClient.dll", - "tools/install.ps1" - ] - }, - "Microsoft.ApplicationInsights/2.22.0": { - "sha512": "3AOM9bZtku7RQwHyMEY3tQMrHIgjcfRDa6YQpd/QG2LDGvMydSlL9Di+8LLMt7J2RDdfJ7/2jdYv6yHcMJAnNw==", - "type": "package", - "path": "microsoft.applicationinsights/2.22.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "icon.png", - "lib/net452/Microsoft.ApplicationInsights.dll", - "lib/net452/Microsoft.ApplicationInsights.pdb", - "lib/net452/Microsoft.ApplicationInsights.xml", - "lib/net46/Microsoft.ApplicationInsights.dll", - "lib/net46/Microsoft.ApplicationInsights.pdb", - "lib/net46/Microsoft.ApplicationInsights.xml", - "lib/netstandard2.0/Microsoft.ApplicationInsights.dll", - "lib/netstandard2.0/Microsoft.ApplicationInsights.pdb", - "lib/netstandard2.0/Microsoft.ApplicationInsights.xml", - "microsoft.applicationinsights.2.22.0.nupkg.sha512", - "microsoft.applicationinsights.nuspec" - ] - }, - "Microsoft.CodeCoverage/17.12.0": { - "sha512": "4svMznBd5JM21JIG2xZKGNanAHNXplxf/kQDFfLHXQ3OnpJkayRK/TjacFjA+EYmoyuNXHo/sOETEfcYtAzIrA==", - "type": "package", - "path": "microsoft.codecoverage/17.12.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "ThirdPartyNotices.txt", - "build/netstandard2.0/CodeCoverage/CodeCoverage.config", - "build/netstandard2.0/CodeCoverage/CodeCoverage.exe", - "build/netstandard2.0/CodeCoverage/Cov_x86.config", - "build/netstandard2.0/CodeCoverage/amd64/CodeCoverage.exe", - "build/netstandard2.0/CodeCoverage/amd64/Cov_x64.config", - "build/netstandard2.0/CodeCoverage/amd64/covrun64.dll", - "build/netstandard2.0/CodeCoverage/amd64/msdia140.dll", - "build/netstandard2.0/CodeCoverage/arm64/Cov_arm64.config", - "build/netstandard2.0/CodeCoverage/arm64/covrunarm64.dll", - "build/netstandard2.0/CodeCoverage/arm64/msdia140.dll", - "build/netstandard2.0/CodeCoverage/codecoveragemessages.dll", - "build/netstandard2.0/CodeCoverage/coreclr/Microsoft.VisualStudio.CodeCoverage.Shim.dll", - "build/netstandard2.0/CodeCoverage/covrun32.dll", - "build/netstandard2.0/CodeCoverage/msdia140.dll", - "build/netstandard2.0/Microsoft.CodeCoverage.Core.dll", - "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.Core.dll", - "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll", - "build/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll", - "build/netstandard2.0/Microsoft.CodeCoverage.props", - "build/netstandard2.0/Microsoft.CodeCoverage.targets", - "build/netstandard2.0/Microsoft.DiaSymReader.dll", - "build/netstandard2.0/Microsoft.VisualStudio.TraceDataCollector.dll", - "build/netstandard2.0/Mono.Cecil.Pdb.dll", - "build/netstandard2.0/Mono.Cecil.Rocks.dll", - "build/netstandard2.0/Mono.Cecil.dll", - "build/netstandard2.0/ThirdPartyNotices.txt", - "build/netstandard2.0/alpine/x64/Cov_x64.config", - "build/netstandard2.0/alpine/x64/libCoverageInstrumentationMethod.so", - "build/netstandard2.0/alpine/x64/libInstrumentationEngine.so", - "build/netstandard2.0/arm64/MicrosoftInstrumentationEngine_arm64.dll", - "build/netstandard2.0/cs/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/de/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/es/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/fr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/it/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/ja/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/ko/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/macos/x64/Cov_x64.config", - "build/netstandard2.0/macos/x64/libCoverageInstrumentationMethod.dylib", - "build/netstandard2.0/macos/x64/libInstrumentationEngine.dylib", - "build/netstandard2.0/pl/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/ru/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/tr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/ubuntu/x64/Cov_x64.config", - "build/netstandard2.0/ubuntu/x64/libCoverageInstrumentationMethod.so", - "build/netstandard2.0/ubuntu/x64/libInstrumentationEngine.so", - "build/netstandard2.0/x64/MicrosoftInstrumentationEngine_x64.dll", - "build/netstandard2.0/x86/MicrosoftInstrumentationEngine_x86.dll", - "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TraceDataCollector.resources.dll", - "lib/net462/Microsoft.VisualStudio.CodeCoverage.Shim.dll", - "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll", - "microsoft.codecoverage.17.12.0.nupkg.sha512", - "microsoft.codecoverage.nuspec" - ] - }, - "Microsoft.NET.Test.Sdk/17.12.0": { - "sha512": "kt/PKBZ91rFCWxVIJZSgVLk+YR+4KxTuHf799ho8WNiK5ZQpJNAEZCAWX86vcKrs+DiYjiibpYKdGZP6+/N17w==", - "type": "package", - "path": "microsoft.net.test.sdk/17.12.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "build/net462/Microsoft.NET.Test.Sdk.props", - "build/net462/Microsoft.NET.Test.Sdk.targets", - "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.cs", - "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.fs", - "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.vb", - "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props", - "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets", - "buildMultiTargeting/Microsoft.NET.Test.Sdk.props", - "lib/net462/_._", - "lib/netcoreapp3.1/_._", - "microsoft.net.test.sdk.17.12.0.nupkg.sha512", - "microsoft.net.test.sdk.nuspec" - ] - }, - "Microsoft.NETCore.Platforms/5.0.0": { - "sha512": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==", - "type": "package", - "path": "microsoft.netcore.platforms/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/netstandard1.0/_._", - "microsoft.netcore.platforms.5.0.0.nupkg.sha512", - "microsoft.netcore.platforms.nuspec", - "runtime.json", - "useSharedDesignerContext.txt", - "version.txt" - ] - }, - "Microsoft.Testing.Extensions.Telemetry/1.5.3": { - "sha512": "U9pGd5DQuX1PfkrdFI+xH34JGgQ2nes5QAwIITTk+MQfLvRITqsZjJeHTjpGWh33D/0q1l7aA8/LQHR7UuCgLQ==", - "type": "package", - "path": "microsoft.testing.extensions.telemetry/1.5.3", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "build/net6.0/Microsoft.Testing.Extensions.Telemetry.props", - "build/net7.0/Microsoft.Testing.Extensions.Telemetry.props", - "build/net8.0/Microsoft.Testing.Extensions.Telemetry.props", - "build/net9.0/Microsoft.Testing.Extensions.Telemetry.props", - "build/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.props", - "buildMultiTargeting/Microsoft.Testing.Extensions.Telemetry.props", - "buildTransitive/net6.0/Microsoft.Testing.Extensions.Telemetry.props", - "buildTransitive/net7.0/Microsoft.Testing.Extensions.Telemetry.props", - "buildTransitive/net8.0/Microsoft.Testing.Extensions.Telemetry.props", - "buildTransitive/net9.0/Microsoft.Testing.Extensions.Telemetry.props", - "buildTransitive/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.props", - "lib/net6.0/Microsoft.Testing.Extensions.Telemetry.dll", - "lib/net6.0/Microsoft.Testing.Extensions.Telemetry.xml", - "lib/net6.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/Microsoft.Testing.Extensions.Telemetry.dll", - "lib/net7.0/Microsoft.Testing.Extensions.Telemetry.xml", - "lib/net7.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net7.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.dll", - "lib/net8.0/Microsoft.Testing.Extensions.Telemetry.xml", - "lib/net8.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/Microsoft.Testing.Extensions.Telemetry.dll", - "lib/net9.0/Microsoft.Testing.Extensions.Telemetry.xml", - "lib/net9.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/net9.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.dll", - "lib/netstandard2.0/Microsoft.Testing.Extensions.Telemetry.xml", - "lib/netstandard2.0/cs/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/de/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/es/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/fr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/it/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/ja/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/ko/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/pl/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/pt-BR/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/ru/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/tr/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Extensions.Telemetry.resources.dll", - "microsoft.testing.extensions.telemetry.1.5.3.nupkg.sha512", - "microsoft.testing.extensions.telemetry.nuspec" - ] - }, - "Microsoft.Testing.Extensions.TrxReport.Abstractions/1.5.3": { - "sha512": "h34zKNpGyni66VH738mRHeXSnf3klSShUdavUWNhSfWICUUi5aXeI0LBvoX/ad93N0+9xBDU3Fyi6WfxrwKQGw==", - "type": "package", - "path": "microsoft.testing.extensions.trxreport.abstractions/1.5.3", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "lib/net6.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", - "lib/net6.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", - "lib/net7.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", - "lib/net7.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", - "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", - "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", - "lib/net9.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", - "lib/net9.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", - "microsoft.testing.extensions.trxreport.abstractions.1.5.3.nupkg.sha512", - "microsoft.testing.extensions.trxreport.abstractions.nuspec" - ] - }, - "Microsoft.Testing.Extensions.VSTestBridge/1.5.3": { - "sha512": "cJD67YfDT98wEWyazKVD/yPVW6+H1usXeuselCnRes7JZBTIYWtrCchcOzOahnmajT79eDKqt9sta7DXwTDU4Q==", - "type": "package", - "path": "microsoft.testing.extensions.vstestbridge/1.5.3", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "lib/net6.0/Microsoft.Testing.Extensions.VSTestBridge.dll", - "lib/net6.0/Microsoft.Testing.Extensions.VSTestBridge.xml", - "lib/net6.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/Microsoft.Testing.Extensions.VSTestBridge.dll", - "lib/net7.0/Microsoft.Testing.Extensions.VSTestBridge.xml", - "lib/net7.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net7.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.dll", - "lib/net8.0/Microsoft.Testing.Extensions.VSTestBridge.xml", - "lib/net8.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/Microsoft.Testing.Extensions.VSTestBridge.dll", - "lib/net9.0/Microsoft.Testing.Extensions.VSTestBridge.xml", - "lib/net9.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/net9.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/Microsoft.Testing.Extensions.VSTestBridge.dll", - "lib/netstandard2.0/Microsoft.Testing.Extensions.VSTestBridge.xml", - "lib/netstandard2.0/cs/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/de/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/es/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/fr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/it/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/ja/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/ko/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/pl/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/pt-BR/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/ru/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/tr/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Extensions.VSTestBridge.resources.dll", - "microsoft.testing.extensions.vstestbridge.1.5.3.nupkg.sha512", - "microsoft.testing.extensions.vstestbridge.nuspec" - ] - }, - "Microsoft.Testing.Platform/1.5.3": { - "sha512": "WqJydnJ99dEKtquR9HwINz104ehWJKTXbQQrydGatlLRw14bmsx0pa8+E6KUXMYXZAimN0swWlDmcJGjjW4TIg==", - "type": "package", - "path": "microsoft.testing.platform/1.5.3", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "build/net6.0/Microsoft.Testing.Platform.props", - "build/net7.0/Microsoft.Testing.Platform.props", - "build/net8.0/Microsoft.Testing.Platform.props", - "build/net9.0/Microsoft.Testing.Platform.props", - "build/netstandard2.0/Microsoft.Testing.Platform.props", - "buildMultiTargeting/Microsoft.Testing.Platform.props", - "buildTransitive/net6.0/Microsoft.Testing.Platform.props", - "buildTransitive/net7.0/Microsoft.Testing.Platform.props", - "buildTransitive/net8.0/Microsoft.Testing.Platform.props", - "buildTransitive/net9.0/Microsoft.Testing.Platform.props", - "buildTransitive/netstandard2.0/Microsoft.Testing.Platform.props", - "lib/net6.0/Microsoft.Testing.Platform.dll", - "lib/net6.0/Microsoft.Testing.Platform.xml", - "lib/net6.0/cs/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/de/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/es/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/fr/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/it/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/ja/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/ko/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/pl/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/pt-BR/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/ru/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/tr/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", - "lib/net6.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/Microsoft.Testing.Platform.dll", - "lib/net7.0/Microsoft.Testing.Platform.xml", - "lib/net7.0/cs/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/de/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/es/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/fr/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/it/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/ja/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/ko/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/pl/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/pt-BR/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/ru/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/tr/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", - "lib/net7.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/Microsoft.Testing.Platform.dll", - "lib/net8.0/Microsoft.Testing.Platform.xml", - "lib/net8.0/cs/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/de/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/es/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/fr/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/it/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/ja/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/ko/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/pl/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/pt-BR/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/ru/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/tr/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", - "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/Microsoft.Testing.Platform.dll", - "lib/net9.0/Microsoft.Testing.Platform.xml", - "lib/net9.0/cs/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/de/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/es/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/fr/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/it/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/ja/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/ko/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/pl/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/pt-BR/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/ru/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/tr/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", - "lib/net9.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/Microsoft.Testing.Platform.dll", - "lib/netstandard2.0/Microsoft.Testing.Platform.xml", - "lib/netstandard2.0/cs/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/de/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/es/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/fr/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/it/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/ja/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/ko/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/pl/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/pt-BR/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/ru/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/tr/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", - "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", - "microsoft.testing.platform.1.5.3.nupkg.sha512", - "microsoft.testing.platform.nuspec" - ] - }, - "Microsoft.Testing.Platform.MSBuild/1.5.3": { - "sha512": "bOtpRMSPeT5YLQo+NNY8EtdNTphAUcmALjW4ABU7P0rb6yR2XAZau3TzNieLmR3lRuwudguWzzBhgcLRXwZh0A==", - "type": "package", - "path": "microsoft.testing.platform.msbuild/1.5.3", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.MSBuild.dll", - "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.MSBuild.xml", - "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.dll", - "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.xml", - "_MSBuildTasks/netstandard2.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/cs/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/de/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/es/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/fr/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/it/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/ja/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/ko/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/pl/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/pt-BR/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/ru/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/tr/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", - "_MSBuildTasks/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll", - "_MSBuildTasks/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", - "build/Microsoft.Testing.Platform.MSBuild.props", - "build/Microsoft.Testing.Platform.MSBuild.targets", - "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.VSTest.targets", - "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.props", - "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targets", - "buildTransitive/Microsoft.Testing.Platform.MSBuild.props", - "buildTransitive/Microsoft.Testing.Platform.MSBuild.targets", - "lib/net6.0/Microsoft.Testing.Extensions.MSBuild.dll", - "lib/net6.0/Microsoft.Testing.Extensions.MSBuild.xml", - "lib/net6.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/Microsoft.Testing.Extensions.MSBuild.dll", - "lib/net7.0/Microsoft.Testing.Extensions.MSBuild.xml", - "lib/net7.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net7.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.dll", - "lib/net8.0/Microsoft.Testing.Extensions.MSBuild.xml", - "lib/net8.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net8.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/Microsoft.Testing.Extensions.MSBuild.dll", - "lib/net9.0/Microsoft.Testing.Extensions.MSBuild.xml", - "lib/net9.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/net9.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/Microsoft.Testing.Extensions.MSBuild.dll", - "lib/netstandard2.0/Microsoft.Testing.Extensions.MSBuild.xml", - "lib/netstandard2.0/cs/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/de/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/es/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/fr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/it/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/ja/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/ko/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/pl/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/pt-BR/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/ru/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/tr/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Extensions.MSBuild.resources.dll", - "microsoft.testing.platform.msbuild.1.5.3.nupkg.sha512", - "microsoft.testing.platform.msbuild.nuspec" - ] - }, - "Microsoft.TestPlatform.ObjectModel/17.12.0": { - "sha512": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==", - "type": "package", - "path": "microsoft.testplatform.objectmodel/17.12.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "lib/net462/Microsoft.TestPlatform.CoreUtilities.dll", - "lib/net462/Microsoft.TestPlatform.PlatformAbstractions.dll", - "lib/net462/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", - "lib/net462/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/net462/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/net462/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", - "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", - "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll", - "lib/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll", - "lib/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", - "lib/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "lib/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", - "lib/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", - "microsoft.testplatform.objectmodel.17.12.0.nupkg.sha512", - "microsoft.testplatform.objectmodel.nuspec" - ] - }, - "Microsoft.TestPlatform.TestHost/17.12.0": { - "sha512": "MiPEJQNyADfwZ4pJNpQex+t9/jOClBGMiCiVVFuELCMSX2nmNfvUor3uFVxNNCg30uxDP8JDYfPnMXQzsfzYyg==", - "type": "package", - "path": "microsoft.testplatform.testhost/17.12.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "ThirdPartyNotices.txt", - "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props", - "build/netcoreapp3.1/x64/testhost.dll", - "build/netcoreapp3.1/x64/testhost.exe", - "build/netcoreapp3.1/x86/testhost.x86.dll", - "build/netcoreapp3.1/x86/testhost.x86.exe", - "lib/net462/_._", - "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll", - "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", - "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll", - "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", - "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll", - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll", - "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", - "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/testhost.deps.json", - "lib/netcoreapp3.1/testhost.dll", - "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/x64/msdia140.dll", - "lib/netcoreapp3.1/x86/msdia140.dll", - "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", - "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", - "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", - "microsoft.testplatform.testhost.17.12.0.nupkg.sha512", - "microsoft.testplatform.testhost.nuspec" - ] - }, - "Microsoft.Win32.Registry/5.0.0": { - "sha512": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "type": "package", - "path": "microsoft.win32.registry/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/net46/Microsoft.Win32.Registry.dll", - "lib/net461/Microsoft.Win32.Registry.dll", - "lib/net461/Microsoft.Win32.Registry.xml", - "lib/netstandard1.3/Microsoft.Win32.Registry.dll", - "lib/netstandard2.0/Microsoft.Win32.Registry.dll", - "lib/netstandard2.0/Microsoft.Win32.Registry.xml", - "microsoft.win32.registry.5.0.0.nupkg.sha512", - "microsoft.win32.registry.nuspec", - "ref/net46/Microsoft.Win32.Registry.dll", - "ref/net461/Microsoft.Win32.Registry.dll", - "ref/net461/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/Microsoft.Win32.Registry.dll", - "ref/netstandard1.3/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/de/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/es/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/fr/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/it/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/ja/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/ko/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/ru/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/zh-hans/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/zh-hant/Microsoft.Win32.Registry.xml", - "ref/netstandard2.0/Microsoft.Win32.Registry.dll", - "ref/netstandard2.0/Microsoft.Win32.Registry.xml", - "runtimes/win/lib/net46/Microsoft.Win32.Registry.dll", - "runtimes/win/lib/net461/Microsoft.Win32.Registry.dll", - "runtimes/win/lib/net461/Microsoft.Win32.Registry.xml", - "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll", - "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll", - "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.xml", - "useSharedDesignerContext.txt", - "version.txt" - ] - }, - "Microsoft.Win32.SystemEvents/8.0.0": { - "sha512": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==", - "type": "package", - "path": "microsoft.win32.systemevents/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Win32.SystemEvents.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Win32.SystemEvents.targets", - "lib/net462/Microsoft.Win32.SystemEvents.dll", - "lib/net462/Microsoft.Win32.SystemEvents.xml", - "lib/net6.0/Microsoft.Win32.SystemEvents.dll", - "lib/net6.0/Microsoft.Win32.SystemEvents.xml", - "lib/net7.0/Microsoft.Win32.SystemEvents.dll", - "lib/net7.0/Microsoft.Win32.SystemEvents.xml", - "lib/net8.0/Microsoft.Win32.SystemEvents.dll", - "lib/net8.0/Microsoft.Win32.SystemEvents.xml", - "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll", - "lib/netstandard2.0/Microsoft.Win32.SystemEvents.xml", - "microsoft.win32.systemevents.8.0.0.nupkg.sha512", - "microsoft.win32.systemevents.nuspec", - "runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", - "runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.xml", - "runtimes/win/lib/net7.0/Microsoft.Win32.SystemEvents.dll", - "runtimes/win/lib/net7.0/Microsoft.Win32.SystemEvents.xml", - "runtimes/win/lib/net8.0/Microsoft.Win32.SystemEvents.dll", - "runtimes/win/lib/net8.0/Microsoft.Win32.SystemEvents.xml", - "useSharedDesignerContext.txt" - ] - }, - "Newtonsoft.Json/13.0.1": { - "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", - "type": "package", - "path": "newtonsoft.json/13.0.1", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "LICENSE.md", - "lib/net20/Newtonsoft.Json.dll", - "lib/net20/Newtonsoft.Json.xml", - "lib/net35/Newtonsoft.Json.dll", - "lib/net35/Newtonsoft.Json.xml", - "lib/net40/Newtonsoft.Json.dll", - "lib/net40/Newtonsoft.Json.xml", - "lib/net45/Newtonsoft.Json.dll", - "lib/net45/Newtonsoft.Json.xml", - "lib/netstandard1.0/Newtonsoft.Json.dll", - "lib/netstandard1.0/Newtonsoft.Json.xml", - "lib/netstandard1.3/Newtonsoft.Json.dll", - "lib/netstandard1.3/Newtonsoft.Json.xml", - "lib/netstandard2.0/Newtonsoft.Json.dll", - "lib/netstandard2.0/Newtonsoft.Json.xml", - "newtonsoft.json.13.0.1.nupkg.sha512", - "newtonsoft.json.nuspec", - "packageIcon.png" - ] - }, - "NUnit/4.3.2": { - "sha512": "puVXayXNmEu7MFQSUswGmUjOy3M3baprMbkLl5PAutpeDoGTr+jPv33qAYsqxywi2wJCq8l/O3EhHoLulPE1iQ==", - "type": "package", - "path": "nunit/4.3.2", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "LICENSE.txt", - "NOTICES.md", - "README.md", - "THIRD_PARTY_NOTICES.md", - "build/NUnit.props", - "icon.png", - "lib/net462/nunit.framework.dll", - "lib/net462/nunit.framework.legacy.dll", - "lib/net462/nunit.framework.legacy.xml", - "lib/net462/nunit.framework.xml", - "lib/net6.0/nunit.framework.dll", - "lib/net6.0/nunit.framework.legacy.dll", - "lib/net6.0/nunit.framework.legacy.xml", - "lib/net6.0/nunit.framework.xml", - "lib/net8.0/nunit.framework.dll", - "lib/net8.0/nunit.framework.legacy.dll", - "lib/net8.0/nunit.framework.legacy.xml", - "lib/net8.0/nunit.framework.xml", - "nunit.4.3.2.nupkg.sha512", - "nunit.nuspec" - ] - }, - "NUnit3TestAdapter/5.0.0": { - "sha512": "sy4cLoUAdE6TDM4wNX5gmNCyhMev5wUz4cA6ZRf/aON9vf9t4xTVGLj/4huhDKcS4dFfmVVcgcP70yC7WC9kKg==", - "type": "package", - "path": "nunit3testadapter/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "build/net462/NUnit3.TestAdapter.dll", - "build/net462/NUnit3.TestAdapter.pdb", - "build/net462/NUnit3TestAdapter.props", - "build/net462/NUnit3TestAdapter.targets", - "build/net462/nunit.engine.api.dll", - "build/net462/nunit.engine.core.dll", - "build/net462/nunit.engine.dll", - "build/net462/testcentric.engine.metadata.dll", - "build/netcoreapp3.1/NUnit3.TestAdapter.dll", - "build/netcoreapp3.1/NUnit3.TestAdapter.pdb", - "build/netcoreapp3.1/NUnit3TestAdapter.props", - "build/netcoreapp3.1/NUnit3TestAdapter.targets", - "build/netcoreapp3.1/nunit.engine.api.dll", - "build/netcoreapp3.1/nunit.engine.core.dll", - "build/netcoreapp3.1/nunit.engine.dll", - "build/netcoreapp3.1/testcentric.engine.metadata.dll", - "docs/README.md", - "nunit3testadapter.5.0.0.nupkg.sha512", - "nunit3testadapter.nuspec", - "nunit_256.png" - ] - }, - "System.CodeDom/8.0.0": { - "sha512": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==", - "type": "package", - "path": "system.codedom/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.CodeDom.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.CodeDom.targets", - "lib/net462/System.CodeDom.dll", - "lib/net462/System.CodeDom.xml", - "lib/net6.0/System.CodeDom.dll", - "lib/net6.0/System.CodeDom.xml", - "lib/net7.0/System.CodeDom.dll", - "lib/net7.0/System.CodeDom.xml", - "lib/net8.0/System.CodeDom.dll", - "lib/net8.0/System.CodeDom.xml", - "lib/netstandard2.0/System.CodeDom.dll", - "lib/netstandard2.0/System.CodeDom.xml", - "system.codedom.8.0.0.nupkg.sha512", - "system.codedom.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Configuration.ConfigurationManager/8.0.1": { - "sha512": "gPYFPDyohW2gXNhdQRSjtmeS6FymL2crg4Sral1wtvEJ7DUqFCDWDVbbLobASbzxfic8U1hQEdC7hmg9LHncMw==", - "type": "package", - "path": "system.configuration.configurationmanager/8.0.1", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.Configuration.ConfigurationManager.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Configuration.ConfigurationManager.targets", - "lib/net462/System.Configuration.ConfigurationManager.dll", - "lib/net462/System.Configuration.ConfigurationManager.xml", - "lib/net6.0/System.Configuration.ConfigurationManager.dll", - "lib/net6.0/System.Configuration.ConfigurationManager.xml", - "lib/net7.0/System.Configuration.ConfigurationManager.dll", - "lib/net7.0/System.Configuration.ConfigurationManager.xml", - "lib/net8.0/System.Configuration.ConfigurationManager.dll", - "lib/net8.0/System.Configuration.ConfigurationManager.xml", - "lib/netstandard2.0/System.Configuration.ConfigurationManager.dll", - "lib/netstandard2.0/System.Configuration.ConfigurationManager.xml", - "system.configuration.configurationmanager.8.0.1.nupkg.sha512", - "system.configuration.configurationmanager.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Diagnostics.DiagnosticSource/5.0.0": { - "sha512": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==", - "type": "package", - "path": "system.diagnostics.diagnosticsource/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/net45/System.Diagnostics.DiagnosticSource.dll", - "lib/net45/System.Diagnostics.DiagnosticSource.xml", - "lib/net46/System.Diagnostics.DiagnosticSource.dll", - "lib/net46/System.Diagnostics.DiagnosticSource.xml", - "lib/net5.0/System.Diagnostics.DiagnosticSource.dll", - "lib/net5.0/System.Diagnostics.DiagnosticSource.xml", - "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", - "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", - "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", - "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml", - "system.diagnostics.diagnosticsource.5.0.0.nupkg.sha512", - "system.diagnostics.diagnosticsource.nuspec", - "useSharedDesignerContext.txt", - "version.txt" - ] - }, - "System.Diagnostics.EventLog/8.0.1": { - "sha512": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==", - "type": "package", - "path": "system.diagnostics.eventlog/8.0.1", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.Diagnostics.EventLog.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Diagnostics.EventLog.targets", - "lib/net462/System.Diagnostics.EventLog.dll", - "lib/net462/System.Diagnostics.EventLog.xml", - "lib/net6.0/System.Diagnostics.EventLog.dll", - "lib/net6.0/System.Diagnostics.EventLog.xml", - "lib/net7.0/System.Diagnostics.EventLog.dll", - "lib/net7.0/System.Diagnostics.EventLog.xml", - "lib/net8.0/System.Diagnostics.EventLog.dll", - "lib/net8.0/System.Diagnostics.EventLog.xml", - "lib/netstandard2.0/System.Diagnostics.EventLog.dll", - "lib/netstandard2.0/System.Diagnostics.EventLog.xml", - "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll", - "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll", - "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.xml", - "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.Messages.dll", - "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.dll", - "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.xml", - "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll", - "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll", - "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.xml", - "system.diagnostics.eventlog.8.0.1.nupkg.sha512", - "system.diagnostics.eventlog.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Diagnostics.PerformanceCounter/8.0.1": { - "sha512": "9RfEDiEjlUADeThs8IPdDVTXSnPRSqjfgTQJALpmGFPKC0k2mbdufOXnb/9JZ4I0TkmxOfy3VTJxrHOJSs8cXg==", - "type": "package", - "path": "system.diagnostics.performancecounter/8.0.1", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.Diagnostics.PerformanceCounter.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Diagnostics.PerformanceCounter.targets", - "lib/net462/System.Diagnostics.PerformanceCounter.dll", - "lib/net462/System.Diagnostics.PerformanceCounter.xml", - "lib/net6.0/System.Diagnostics.PerformanceCounter.dll", - "lib/net6.0/System.Diagnostics.PerformanceCounter.xml", - "lib/net7.0/System.Diagnostics.PerformanceCounter.dll", - "lib/net7.0/System.Diagnostics.PerformanceCounter.xml", - "lib/net8.0/System.Diagnostics.PerformanceCounter.dll", - "lib/net8.0/System.Diagnostics.PerformanceCounter.xml", - "lib/netstandard2.0/System.Diagnostics.PerformanceCounter.dll", - "lib/netstandard2.0/System.Diagnostics.PerformanceCounter.xml", - "runtimes/win/lib/net6.0/System.Diagnostics.PerformanceCounter.dll", - "runtimes/win/lib/net6.0/System.Diagnostics.PerformanceCounter.xml", - "runtimes/win/lib/net7.0/System.Diagnostics.PerformanceCounter.dll", - "runtimes/win/lib/net7.0/System.Diagnostics.PerformanceCounter.xml", - "runtimes/win/lib/net8.0/System.Diagnostics.PerformanceCounter.dll", - "runtimes/win/lib/net8.0/System.Diagnostics.PerformanceCounter.xml", - "system.diagnostics.performancecounter.8.0.1.nupkg.sha512", - "system.diagnostics.performancecounter.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Drawing.Common/8.0.10": { - "sha512": "MdajRp3P+FOlThgY6FBjAqnmLiVl5t2yWEC/2AsDMqx1zYbJG3G5TnscFBQ4obqcaGqvN5UnhQHSFaJFG2HftQ==", - "type": "package", - "path": "system.drawing.common/8.0.10", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.Drawing.Common.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Drawing.Common.targets", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net462/System.Drawing.Common.dll", - "lib/net462/System.Drawing.Common.pdb", - "lib/net462/System.Drawing.Common.xml", - "lib/net6.0/System.Drawing.Common.dll", - "lib/net6.0/System.Drawing.Common.pdb", - "lib/net6.0/System.Drawing.Common.xml", - "lib/net7.0/System.Drawing.Common.dll", - "lib/net7.0/System.Drawing.Common.pdb", - "lib/net7.0/System.Drawing.Common.xml", - "lib/net8.0/System.Drawing.Common.dll", - "lib/net8.0/System.Drawing.Common.pdb", - "lib/net8.0/System.Drawing.Common.xml", - "lib/netstandard2.0/System.Drawing.Common.dll", - "lib/netstandard2.0/System.Drawing.Common.pdb", - "lib/netstandard2.0/System.Drawing.Common.xml", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "system.drawing.common.8.0.10.nupkg.sha512", - "system.drawing.common.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Management/8.0.0": { - "sha512": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "type": "package", - "path": "system.management/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Management.targets", - "lib/net462/_._", - "lib/net6.0/System.Management.dll", - "lib/net6.0/System.Management.xml", - "lib/net7.0/System.Management.dll", - "lib/net7.0/System.Management.xml", - "lib/net8.0/System.Management.dll", - "lib/net8.0/System.Management.xml", - "lib/netstandard2.0/System.Management.dll", - "lib/netstandard2.0/System.Management.xml", - "runtimes/win/lib/net6.0/System.Management.dll", - "runtimes/win/lib/net6.0/System.Management.xml", - "runtimes/win/lib/net7.0/System.Management.dll", - "runtimes/win/lib/net7.0/System.Management.xml", - "runtimes/win/lib/net8.0/System.Management.dll", - "runtimes/win/lib/net8.0/System.Management.xml", - "system.management.8.0.0.nupkg.sha512", - "system.management.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Reflection.Metadata/1.6.0": { - "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", - "type": "package", - "path": "system.reflection.metadata/1.6.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/netstandard1.1/System.Reflection.Metadata.dll", - "lib/netstandard1.1/System.Reflection.Metadata.xml", - "lib/netstandard2.0/System.Reflection.Metadata.dll", - "lib/netstandard2.0/System.Reflection.Metadata.xml", - "lib/portable-net45+win8/System.Reflection.Metadata.dll", - "lib/portable-net45+win8/System.Reflection.Metadata.xml", - "system.reflection.metadata.1.6.0.nupkg.sha512", - "system.reflection.metadata.nuspec", - "useSharedDesignerContext.txt", - "version.txt" - ] - }, - "System.Security.AccessControl/5.0.0": { - "sha512": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "type": "package", - "path": "system.security.accesscontrol/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/net46/System.Security.AccessControl.dll", - "lib/net461/System.Security.AccessControl.dll", - "lib/net461/System.Security.AccessControl.xml", - "lib/netstandard1.3/System.Security.AccessControl.dll", - "lib/netstandard2.0/System.Security.AccessControl.dll", - "lib/netstandard2.0/System.Security.AccessControl.xml", - "lib/uap10.0.16299/_._", - "ref/net46/System.Security.AccessControl.dll", - "ref/net461/System.Security.AccessControl.dll", - "ref/net461/System.Security.AccessControl.xml", - "ref/netstandard1.3/System.Security.AccessControl.dll", - "ref/netstandard1.3/System.Security.AccessControl.xml", - "ref/netstandard1.3/de/System.Security.AccessControl.xml", - "ref/netstandard1.3/es/System.Security.AccessControl.xml", - "ref/netstandard1.3/fr/System.Security.AccessControl.xml", - "ref/netstandard1.3/it/System.Security.AccessControl.xml", - "ref/netstandard1.3/ja/System.Security.AccessControl.xml", - "ref/netstandard1.3/ko/System.Security.AccessControl.xml", - "ref/netstandard1.3/ru/System.Security.AccessControl.xml", - "ref/netstandard1.3/zh-hans/System.Security.AccessControl.xml", - "ref/netstandard1.3/zh-hant/System.Security.AccessControl.xml", - "ref/netstandard2.0/System.Security.AccessControl.dll", - "ref/netstandard2.0/System.Security.AccessControl.xml", - "ref/uap10.0.16299/_._", - "runtimes/win/lib/net46/System.Security.AccessControl.dll", - "runtimes/win/lib/net461/System.Security.AccessControl.dll", - "runtimes/win/lib/net461/System.Security.AccessControl.xml", - "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll", - "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.xml", - "runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll", - "runtimes/win/lib/uap10.0.16299/_._", - "system.security.accesscontrol.5.0.0.nupkg.sha512", - "system.security.accesscontrol.nuspec", - "useSharedDesignerContext.txt", - "version.txt" - ] - }, - "System.Security.Cryptography.ProtectedData/8.0.0": { - "sha512": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==", - "type": "package", - "path": "system.security.cryptography.protecteddata/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.Security.Cryptography.ProtectedData.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Security.Cryptography.ProtectedData.targets", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net462/System.Security.Cryptography.ProtectedData.dll", - "lib/net462/System.Security.Cryptography.ProtectedData.xml", - "lib/net6.0/System.Security.Cryptography.ProtectedData.dll", - "lib/net6.0/System.Security.Cryptography.ProtectedData.xml", - "lib/net7.0/System.Security.Cryptography.ProtectedData.dll", - "lib/net7.0/System.Security.Cryptography.ProtectedData.xml", - "lib/net8.0/System.Security.Cryptography.ProtectedData.dll", - "lib/net8.0/System.Security.Cryptography.ProtectedData.xml", - "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", - "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", - "system.security.cryptography.protecteddata.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Security.Permissions/8.0.0": { - "sha512": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", - "type": "package", - "path": "system.security.permissions/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.Security.Permissions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Security.Permissions.targets", - "lib/net462/System.Security.Permissions.dll", - "lib/net462/System.Security.Permissions.xml", - "lib/net6.0/System.Security.Permissions.dll", - "lib/net6.0/System.Security.Permissions.xml", - "lib/net7.0/System.Security.Permissions.dll", - "lib/net7.0/System.Security.Permissions.xml", - "lib/net8.0/System.Security.Permissions.dll", - "lib/net8.0/System.Security.Permissions.xml", - "lib/netstandard2.0/System.Security.Permissions.dll", - "lib/netstandard2.0/System.Security.Permissions.xml", - "system.security.permissions.8.0.0.nupkg.sha512", - "system.security.permissions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Security.Principal.Windows/5.0.0": { - "sha512": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==", - "type": "package", - "path": "system.security.principal.windows/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/net46/System.Security.Principal.Windows.dll", - "lib/net461/System.Security.Principal.Windows.dll", - "lib/net461/System.Security.Principal.Windows.xml", - "lib/netstandard1.3/System.Security.Principal.Windows.dll", - "lib/netstandard2.0/System.Security.Principal.Windows.dll", - "lib/netstandard2.0/System.Security.Principal.Windows.xml", - "lib/uap10.0.16299/_._", - "ref/net46/System.Security.Principal.Windows.dll", - "ref/net461/System.Security.Principal.Windows.dll", - "ref/net461/System.Security.Principal.Windows.xml", - "ref/netcoreapp3.0/System.Security.Principal.Windows.dll", - "ref/netcoreapp3.0/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/System.Security.Principal.Windows.dll", - "ref/netstandard1.3/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", - "ref/netstandard2.0/System.Security.Principal.Windows.dll", - "ref/netstandard2.0/System.Security.Principal.Windows.xml", - "ref/uap10.0.16299/_._", - "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", - "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", - "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", - "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", - "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", - "runtimes/win/lib/net461/System.Security.Principal.Windows.dll", - "runtimes/win/lib/net461/System.Security.Principal.Windows.xml", - "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", - "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", - "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", - "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", - "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", - "runtimes/win/lib/uap10.0.16299/_._", - "system.security.principal.windows.5.0.0.nupkg.sha512", - "system.security.principal.windows.nuspec", - "useSharedDesignerContext.txt", - "version.txt" - ] - }, - "System.Windows.Extensions/8.0.0": { - "sha512": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==", - "type": "package", - "path": "system.windows.extensions/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/net6.0/System.Windows.Extensions.dll", - "lib/net6.0/System.Windows.Extensions.xml", - "lib/net7.0/System.Windows.Extensions.dll", - "lib/net7.0/System.Windows.Extensions.xml", - "lib/net8.0/System.Windows.Extensions.dll", - "lib/net8.0/System.Windows.Extensions.xml", - "runtimes/win/lib/net6.0/System.Windows.Extensions.dll", - "runtimes/win/lib/net6.0/System.Windows.Extensions.xml", - "runtimes/win/lib/net7.0/System.Windows.Extensions.dll", - "runtimes/win/lib/net7.0/System.Windows.Extensions.xml", - "runtimes/win/lib/net8.0/System.Windows.Extensions.dll", - "runtimes/win/lib/net8.0/System.Windows.Extensions.xml", - "system.windows.extensions.8.0.0.nupkg.sha512", - "system.windows.extensions.nuspec", - "useSharedDesignerContext.txt" - ] - } - }, - "projectFileDependencyGroups": { - "net8.0-windows": [ - "FlaUI.UIA3 >= 5.0.0", - "Microsoft.NET.Test.Sdk >= 17.12.0", - "NUnit >= 4.3.2", - "NUnit3TestAdapter >= 5.0.0" - ] - }, - "packageFolders": { - "C:\\Users\\plesz\\.nuget\\packages\\": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", - "projectName": "FileManager.UiTests", - "projectPath": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", - "packagesPath": "C:\\Users\\plesz\\.nuget\\packages\\", - "outputPath": "D:\\FileManager\\tests\\FileManager.UiTests\\obj\\", - "projectStyle": "PackageReference", - "configFilePaths": [ - "C:\\Users\\plesz\\AppData\\Roaming\\NuGet\\NuGet.Config" - ], - "originalTargetFrameworks": [ - "net8.0-windows" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net8.0-windows": { - "framework": "net8.0-windows7.0", - "targetAlias": "net8.0-windows", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "10.0.400" - }, - "frameworks": { - "net8.0-windows": { - "framework": "net8.0-windows7.0", - "targetAlias": "net8.0-windows", - "dependencies": { - "FlaUI.UIA3": { - "target": "Package", - "version": "[5.0.0, )" - }, - "Microsoft.NET.Test.Sdk": { - "target": "Package", - "version": "[17.12.0, )" - }, - "NUnit": { - "target": "Package", - "version": "[4.3.2, )" - }, - "NUnit3TestAdapter": { - "suppressParent": "All", - "target": "Package", - "version": "[5.0.0, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "downloadDependencies": [ - { - "name": "Microsoft.AspNetCore.App.Ref", - "version": "[8.0.30, 8.0.30]" - }, - { - "name": "Microsoft.NETCore.App.Ref", - "version": "[8.0.30, 8.0.30]" - }, - { - "name": "Microsoft.WindowsDesktop.App.Ref", - "version": "[8.0.30, 8.0.30]" - } - ], - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.400/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/tests/FileManager.UiTests/obj/project.nuget.cache b/tests/FileManager.UiTests/obj/project.nuget.cache deleted file mode 100644 index 98cd1498..00000000 --- a/tests/FileManager.UiTests/obj/project.nuget.cache +++ /dev/null @@ -1,44 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "mMB6YJ3PAdo=", - "success": true, - "projectFilePath": "D:\\FileManager\\tests\\FileManager.UiTests\\FileManager.UiTests.csproj", - "expectedPackageFiles": [ - "C:\\Users\\plesz\\.nuget\\packages\\flaui.core\\5.0.0\\flaui.core.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\flaui.uia3\\5.0.0\\flaui.uia3.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\interop.uiautomationclient\\10.19041.0\\interop.uiautomationclient.10.19041.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.applicationinsights\\2.22.0\\microsoft.applicationinsights.2.22.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.codecoverage\\17.12.0\\microsoft.codecoverage.17.12.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.net.test.sdk\\17.12.0\\microsoft.net.test.sdk.17.12.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.netcore.platforms\\5.0.0\\microsoft.netcore.platforms.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.extensions.telemetry\\1.5.3\\microsoft.testing.extensions.telemetry.1.5.3.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.extensions.trxreport.abstractions\\1.5.3\\microsoft.testing.extensions.trxreport.abstractions.1.5.3.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.extensions.vstestbridge\\1.5.3\\microsoft.testing.extensions.vstestbridge.1.5.3.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.platform\\1.5.3\\microsoft.testing.platform.1.5.3.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testing.platform.msbuild\\1.5.3\\microsoft.testing.platform.msbuild.1.5.3.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.12.0\\microsoft.testplatform.objectmodel.17.12.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.testplatform.testhost\\17.12.0\\microsoft.testplatform.testhost.17.12.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.win32.registry\\5.0.0\\microsoft.win32.registry.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.win32.systemevents\\8.0.0\\microsoft.win32.systemevents.8.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\nunit\\4.3.2\\nunit.4.3.2.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\nunit3testadapter\\5.0.0\\nunit3testadapter.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.codedom\\8.0.0\\system.codedom.8.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.configuration.configurationmanager\\8.0.1\\system.configuration.configurationmanager.8.0.1.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.diagnostics.diagnosticsource\\5.0.0\\system.diagnostics.diagnosticsource.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.diagnostics.eventlog\\8.0.1\\system.diagnostics.eventlog.8.0.1.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.diagnostics.performancecounter\\8.0.1\\system.diagnostics.performancecounter.8.0.1.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.drawing.common\\8.0.10\\system.drawing.common.8.0.10.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.management\\8.0.0\\system.management.8.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.security.accesscontrol\\5.0.0\\system.security.accesscontrol.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.security.cryptography.protecteddata\\8.0.0\\system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.security.permissions\\8.0.0\\system.security.permissions.8.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.security.principal.windows\\5.0.0\\system.security.principal.windows.5.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\system.windows.extensions\\8.0.0\\system.windows.extensions.8.0.0.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.netcore.app.ref\\8.0.30\\microsoft.netcore.app.ref.8.0.30.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\8.0.30\\microsoft.windowsdesktop.app.ref.8.0.30.nupkg.sha512", - "C:\\Users\\plesz\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\8.0.30\\microsoft.aspnetcore.app.ref.8.0.30.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file