From fa3cf59478a65c4d2db36f94b379241e73a6ebb7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 15:58:49 +0000 Subject: [PATCH 01/10] Initial plan From 7cef6562ad8f712db39867a53d215f131b33d9bb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 16:19:33 +0000 Subject: [PATCH 02/10] Configure GitHub Actions CI/CD test automation with coverage reporting - Add .github/workflows/test.yml: new workflow triggered on push/PR to master that builds all test projects, runs all 4 test suites with XPlat Code Coverage, uploads TRX results as artifacts, publishes test results via dorny/test-reporter, and uploads coverage to Codecov - Update .github/workflows/build.yml: add pull_request trigger, add dotnet restore step (fixes NETSDK1004 CI failure), expand tests from logging-only to all 4 test projects (Debug configuration only via matrix conditional) - Add coverlet.collector v6.0.2 to all 4 test project csproj files for coverage collection support - Update README.md with Build status badge, Tests status badge, and Codecov coverage badge Co-authored-by: michaelbeale-IL <63321611+michaelbeale-IL@users.noreply.github.com> --- .github/workflows/build.yml | 46 ++++++- .github/workflows/test.yml | 117 ++++++++++++++++++ README.md | 4 + .../ACAT.ConfigMigrationTool.Tests.csproj | 1 + .../ACATCore.Tests.Configuration.csproj | 1 + .../ACATCore.Tests.Integration.csproj | 1 + .../ACATCore.Tests.Logging.csproj | 1 + 7 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 673c8fa3..4a40a2d0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,8 @@ name: Build ACAT on: push: branches: [ "master" ] + pull_request: + branches: [ "master" ] workflow_dispatch: permissions: @@ -28,6 +30,11 @@ jobs: # Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild - name: Setup MSBuild.exe uses: microsoft/setup-msbuild@v2 + + # Restore NuGet packages before building + - name: Restore dependencies + run: dotnet restore ACAT.sln + working-directory: src/ # Build the full application - name: Build the Solution @@ -35,10 +42,41 @@ jobs: msbuild acat.sln /t:Build /p:Configuration=${{ matrix.configuration }} working-directory: src/ - # Execute logging infrastructure tests - - name: Validate Logging Infrastructure - run: | - dotnet test Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj --configuration ${{ matrix.configuration }} --logger "console;verbosity=normal" --no-build + # Execute all tests (Debug configuration only) + - name: Run ACATCore.Tests.Logging + if: matrix.configuration == 'Debug' + run: > + dotnet test Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj + --configuration Debug + --logger "console;verbosity=normal" + working-directory: src/ + continue-on-error: false + + - name: Run ACATCore.Tests.Configuration + if: matrix.configuration == 'Debug' + run: > + dotnet test Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj + --configuration Debug + --no-build + --logger "console;verbosity=normal" + working-directory: src/ + continue-on-error: false + + - name: Run ACATCore.Tests.Integration + if: matrix.configuration == 'Debug' + run: > + dotnet test Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj + --configuration Debug + --logger "console;verbosity=normal" + working-directory: src/ + continue-on-error: false + + - name: Run ACAT.ConfigMigrationTool.Tests + if: matrix.configuration == 'Debug' + run: > + dotnet test Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj + --configuration Debug + --logger "console;verbosity=normal" working-directory: src/ continue-on-error: false diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..9ea88da7 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,117 @@ +name: Tests + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +permissions: + contents: read + checks: write + pull-requests: write + +jobs: + + test: + + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + lfs: true + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + # Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild + - name: Setup MSBuild.exe + uses: microsoft/setup-msbuild@v2 + + - name: Restore dependencies + run: dotnet restore ACAT.sln + working-directory: src/ + + - name: Build solution + run: msbuild ACAT.sln /t:Build /p:Configuration=Debug + working-directory: src/ + + # Build test projects not included in ACAT.sln + - name: Build ACATCore.Tests.Logging + run: dotnet build Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj --configuration Debug + working-directory: src/ + + - name: Build ACATCore.Tests.Integration + run: dotnet build Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj --configuration Debug + working-directory: src/ + + - name: Build ACAT.ConfigMigrationTool.Tests + run: dotnet build Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj --configuration Debug + working-directory: src/ + + - name: Run ACATCore.Tests.Logging + run: > + dotnet test Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj + --configuration Debug + --no-build + --logger "trx;LogFileName=logging-results.trx" + --collect:"XPlat Code Coverage" + --results-directory TestResults/ + working-directory: src/ + + - name: Run ACATCore.Tests.Configuration + run: > + dotnet test Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj + --configuration Debug + --no-build + --logger "trx;LogFileName=config-results.trx" + --collect:"XPlat Code Coverage" + --results-directory TestResults/ + working-directory: src/ + + - name: Run ACATCore.Tests.Integration + run: > + dotnet test Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj + --configuration Debug + --no-build + --logger "trx;LogFileName=integration-results.trx" + --collect:"XPlat Code Coverage" + --results-directory TestResults/ + working-directory: src/ + + - name: Run ACAT.ConfigMigrationTool.Tests + run: > + dotnet test Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj + --configuration Debug + --no-build + --logger "trx;LogFileName=migration-results.trx" + --collect:"XPlat Code Coverage" + --results-directory TestResults/ + working-directory: src/ + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-results + path: src/TestResults/ + + - name: Publish test results + uses: dorny/test-reporter@v1 + if: always() + with: + name: Test Results + path: src/TestResults/*.trx + reporter: dotnet-trx + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: src/TestResults/**/coverage.cobertura.xml + fail_ci_if_error: false diff --git a/README.md b/README.md index c498a0a1..6e014720 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ ## Official release of ACAT is available [here](https://github.com/intel/acat/releases) +[![Build](https://github.com/intel/acat/actions/workflows/build.yml/badge.svg)](https://github.com/intel/acat/actions/workflows/build.yml) +[![Tests](https://github.com/intel/acat/actions/workflows/test.yml/badge.svg)](https://github.com/intel/acat/actions/workflows/test.yml) +[![codecov](https://codecov.io/gh/intel/acat/branch/master/graph/badge.svg)](https://codecov.io/gh/intel/acat) + ## Background The Assistive Context-Aware Toolkit (ACAT) is an open-source platform created at Intel Labs. It is designed to enhance communication for individuals with restricted speech and typing capabilities. It achieves this by providing functionalities like keyboard simulation, word/sentence prediction, and speech synthesis. diff --git a/src/Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj b/src/Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj index 24e04903..63f9ff6a 100644 --- a/src/Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj +++ b/src/Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj @@ -11,6 +11,7 @@ + diff --git a/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj b/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj index 58fa9f17..217506f4 100644 --- a/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj +++ b/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj @@ -18,6 +18,7 @@ + diff --git a/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj b/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj index 8d10b7ed..e6288f54 100644 --- a/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj +++ b/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj @@ -11,6 +11,7 @@ + diff --git a/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj b/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj index e494fcee..1618836d 100644 --- a/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj +++ b/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj @@ -8,6 +8,7 @@ + From 8b68e6d63541d9747f3888faa4f423ac97c176ff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 19:21:42 +0000 Subject: [PATCH 03/10] Fix CI failures: remove full-solution build from test workflow, gracefully handle BCI private packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both workflows were failing because `dotnet restore ACAT.sln` exits non-zero due to BCI extension projects requiring proprietary NuGet packages (UnicornDotNet, AcatCameraNative) unavailable on nuget.org. This caused all subsequent --no-build test steps to fail and dorny/test-reporter to error with "No test report files were found". test.yml: Remove full-solution restore/build and separate test-project build steps. Each dotnet test now handles its own restore+build inline — test projects only depend on public packages, so this succeeds cleanly. build.yml: Add continue-on-error: true to restore and msbuild steps (BCI projects require unavailable proprietary packages — pre-existing limitation). Remove --no-build from all dotnet test steps so each test builds itself independently of the full solution build outcome. Fix ACAT.sln casing. Co-authored-by: michaelbeale-IL <63321611+michaelbeale-IL@users.noreply.github.com> --- .github/workflows/build.yml | 16 ++++++++++------ .github/workflows/test.yml | 29 ----------------------------- 2 files changed, 10 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 26dfd2a8..8d666721 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,39 +31,43 @@ jobs: - name: Setup MSBuild.exe uses: microsoft/setup-msbuild@v2 - # Restore NuGet packages before building + # Restore NuGet packages before building. + # Note: Some BCI extension projects require proprietary packages (UnicornDotNet, AcatCameraNative) + # not available on nuget.org; restore and build for those projects will fail gracefully. - name: Restore dependencies run: dotnet restore ACAT.sln working-directory: src/ + continue-on-error: true # Build the full application - name: Build the Solution run: | - msbuild acat.sln /t:Build /p:Configuration=${{ matrix.configuration }} + msbuild ACAT.sln /t:Build /p:Configuration=${{ matrix.configuration }} working-directory: src/ + continue-on-error: true # Execute all test projects - name: Run Unit Tests - Logging run: | - dotnet test Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=logging-tests.trx" --logger "console;verbosity=normal" --no-build --results-directory TestResults + dotnet test Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=logging-tests.trx" --logger "console;verbosity=normal" --results-directory TestResults working-directory: src/ continue-on-error: false - name: Run Unit Tests - Configuration run: | - dotnet test Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=configuration-tests.trx" --logger "console;verbosity=normal" --no-build --results-directory TestResults + dotnet test Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=configuration-tests.trx" --logger "console;verbosity=normal" --results-directory TestResults working-directory: src/ continue-on-error: false - name: Run Integration Tests run: | - dotnet test Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=integration-tests.trx" --logger "console;verbosity=normal" --no-build --results-directory TestResults + dotnet test Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=integration-tests.trx" --logger "console;verbosity=normal" --results-directory TestResults working-directory: src/ continue-on-error: false - name: Run ConfigMigrationTool Tests run: | - dotnet test Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=migration-tests.trx" --logger "console;verbosity=normal" --no-build --results-directory TestResults + dotnet test Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj --configuration ${{ matrix.configuration }} --logger "trx;LogFileName=migration-tests.trx" --logger "console;verbosity=normal" --results-directory TestResults working-directory: src/ continue-on-error: false diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9ea88da7..70642be2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,36 +29,10 @@ jobs: with: dotnet-version: '8.0.x' - # Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild - - name: Setup MSBuild.exe - uses: microsoft/setup-msbuild@v2 - - - name: Restore dependencies - run: dotnet restore ACAT.sln - working-directory: src/ - - - name: Build solution - run: msbuild ACAT.sln /t:Build /p:Configuration=Debug - working-directory: src/ - - # Build test projects not included in ACAT.sln - - name: Build ACATCore.Tests.Logging - run: dotnet build Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj --configuration Debug - working-directory: src/ - - - name: Build ACATCore.Tests.Integration - run: dotnet build Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj --configuration Debug - working-directory: src/ - - - name: Build ACAT.ConfigMigrationTool.Tests - run: dotnet build Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj --configuration Debug - working-directory: src/ - - name: Run ACATCore.Tests.Logging run: > dotnet test Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj --configuration Debug - --no-build --logger "trx;LogFileName=logging-results.trx" --collect:"XPlat Code Coverage" --results-directory TestResults/ @@ -68,7 +42,6 @@ jobs: run: > dotnet test Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj --configuration Debug - --no-build --logger "trx;LogFileName=config-results.trx" --collect:"XPlat Code Coverage" --results-directory TestResults/ @@ -78,7 +51,6 @@ jobs: run: > dotnet test Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj --configuration Debug - --no-build --logger "trx;LogFileName=integration-results.trx" --collect:"XPlat Code Coverage" --results-directory TestResults/ @@ -88,7 +60,6 @@ jobs: run: > dotnet test Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj --configuration Debug - --no-build --logger "trx;LogFileName=migration-results.trx" --collect:"XPlat Code Coverage" --results-directory TestResults/ From 2ca96495e7b62c7e7e58a642e6604536f9a73ba9 Mon Sep 17 00:00:00 2001 From: "Beale, Michael" Date: Thu, 19 Feb 2026 11:47:06 -0800 Subject: [PATCH 04/10] Update test deps, modernize logging in integration tests Updated MSTest and test SDK package versions in test projects, removed unused dependencies, and added System.Resources.Extensions. Refactored integration test logging to use LoggingConfiguration and Microsoft.Extensions.Logging instead of the legacy Log class. --- .../ACATCore.Tests.Integration.csproj | 14 +++++++------- .../FreshInstallIntegrationTests.cs | 9 +++++---- .../LoggingProductionIntegrationTests.cs | 2 +- .../ACATCore.Tests.Shared.csproj | 4 ++-- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj b/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj index e154af45..dd032d90 100644 --- a/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj +++ b/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj @@ -4,22 +4,22 @@ 9.0 false true - true - - - + + + - - - + + + + diff --git a/src/Libraries/ACATCore.Tests.Integration/FreshInstallIntegrationTests.cs b/src/Libraries/ACATCore.Tests.Integration/FreshInstallIntegrationTests.cs index f459ae5e..4bd0a577 100644 --- a/src/Libraries/ACATCore.Tests.Integration/FreshInstallIntegrationTests.cs +++ b/src/Libraries/ACATCore.Tests.Integration/FreshInstallIntegrationTests.cs @@ -6,6 +6,7 @@ //////////////////////////////////////////////////////////////////////////// using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.Extensions.Logging; using ACAT.Core.Utility; using System; using System.IO; @@ -120,14 +121,14 @@ public void FreshInstall_LoggingInitializationSucceeds() string logsDir = Path.Combine(_testWorkspace, "Logs"); Directory.CreateDirectory(logsDir); - // Act - Initialize logging (using existing Log class) - Log.SetupListeners(); - + // Act - Initialize logging using the new infrastructure + var logger = LoggingConfiguration.CreateLogger("FreshInstallTest"); + // Verify we can write logs Exception caughtException = null; try { - Log.Info("Fresh install test log entry"); + logger.LogInformation("Fresh install test log entry"); } catch (Exception ex) { diff --git a/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs b/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs index 8068d8da..67bfd420 100644 --- a/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs +++ b/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs @@ -27,7 +27,7 @@ public class LoggingProductionIntegrationTests public void Setup() { _testWorkspace = IntegrationTestHelper.CreateTestWorkspace("LoggingProduction"); - Log.SetupListeners(); + // Logging is automatically initialized via LoggingConfiguration } [TestCleanup] diff --git a/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj b/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj index ff39cd06..76d8418b 100644 --- a/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj +++ b/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj @@ -15,8 +15,8 @@ - - + + From 8b8b60232ffd8f9dc43b14dca41b48a9c3c28f4c Mon Sep 17 00:00:00 2001 From: Michael Beale Date: Thu, 19 Feb 2026 11:55:55 -0800 Subject: [PATCH 05/10] Update build.yml disable automatic build for now. --- .github/workflows/build.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8d666721..9ff8b0cc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,10 +1,6 @@ name: Build ACAT on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] workflow_dispatch: permissions: From 0cd803c1214f9c85d72bb6442e2fc3de89761192 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 20:10:41 +0000 Subject: [PATCH 06/10] Fix test abort: remove --collect:"XPlat Code Coverage" incompatible with net481 + Microsoft.Testing.Platform 2.x The coverlet.collector 6.0.2 data collector requires Microsoft.Testing.Platform 1.5.0.0, but ACATCore.Tests.Logging.csproj references Microsoft.Testing.Platform 2.1.0 (pulled in by recent commits). This version mismatch caused VSTest to abort the entire test run before executing a single test. Remove --collect:"XPlat Code Coverage" from all dotnet test steps in test.yml so the data collector is never invoked. Also remove the Codecov upload step and the Codecov badge from README since there is no coverage data to upload. Co-authored-by: michaelbeale-IL <63321611+michaelbeale-IL@users.noreply.github.com> --- .github/workflows/test.yml | 11 ----------- README.md | 1 - 2 files changed, 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 70642be2..7f6a59ff 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,7 +34,6 @@ jobs: dotnet test Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj --configuration Debug --logger "trx;LogFileName=logging-results.trx" - --collect:"XPlat Code Coverage" --results-directory TestResults/ working-directory: src/ @@ -43,7 +42,6 @@ jobs: dotnet test Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj --configuration Debug --logger "trx;LogFileName=config-results.trx" - --collect:"XPlat Code Coverage" --results-directory TestResults/ working-directory: src/ @@ -52,7 +50,6 @@ jobs: dotnet test Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj --configuration Debug --logger "trx;LogFileName=integration-results.trx" - --collect:"XPlat Code Coverage" --results-directory TestResults/ working-directory: src/ @@ -61,7 +58,6 @@ jobs: dotnet test Applications/ConfigMigrationTool/ACAT.ConfigMigrationTool.Tests/ACAT.ConfigMigrationTool.Tests.csproj --configuration Debug --logger "trx;LogFileName=migration-results.trx" - --collect:"XPlat Code Coverage" --results-directory TestResults/ working-directory: src/ @@ -79,10 +75,3 @@ jobs: name: Test Results path: src/TestResults/*.trx reporter: dotnet-trx - - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: src/TestResults/**/coverage.cobertura.xml - fail_ci_if_error: false diff --git a/README.md b/README.md index 6e014720..61b59817 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Build](https://github.com/intel/acat/actions/workflows/build.yml/badge.svg)](https://github.com/intel/acat/actions/workflows/build.yml) [![Tests](https://github.com/intel/acat/actions/workflows/test.yml/badge.svg)](https://github.com/intel/acat/actions/workflows/test.yml) -[![codecov](https://codecov.io/gh/intel/acat/branch/master/graph/badge.svg)](https://codecov.io/gh/intel/acat) ## Background The Assistive Context-Aware Toolkit (ACAT) is an open-source platform created at Intel Labs. It is designed to enhance communication for individuals with restricted speech and typing capabilities. It achieves this by providing functionalities like keyboard simulation, word/sentence prediction, and speech synthesis. From 24d277e3f06de5e9ea15757da4843b05e9627792 Mon Sep 17 00:00:00 2001 From: "Beale, Michael" Date: Thu, 19 Feb 2026 12:31:04 -0800 Subject: [PATCH 07/10] Downgrade test package versions and remove unused deps Downgraded Microsoft.NET.Test.Sdk, MSTest.TestFramework, and MSTest.TestAdapter to improve compatibility. Removed Microsoft.Testing.Platform, Microsoft.Testing.Extensions.VSTestBridge, and Microsoft.Extensions.DependencyInjection from ACATCore.Tests.Logging, and removed System.Text.Json from ACATCore.Tests.Configuration. --- .../ACATCore.Tests.Configuration.csproj | 7 +++---- .../ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj | 9 +++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj b/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj index 16d35b19..c7e2e084 100644 --- a/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj +++ b/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj @@ -15,11 +15,10 @@ - - - + + + - diff --git a/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj b/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj index f4d3e02d..f5b66215 100644 --- a/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj +++ b/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj @@ -7,12 +7,9 @@ - - - - - - + + + From 1b79d16b03866ad7567ebe1c96b7c69478570f63 Mon Sep 17 00:00:00 2001 From: "Beale, Michael" Date: Thu, 19 Feb 2026 13:11:36 -0800 Subject: [PATCH 08/10] Add ACATCore.Tests.Integration project; disable flaky perf test Added ACATCore.Tests.Integration to the solution with full build configuration support. Disabled the ContinuousLogging_PerformanceImpactMinimal test in LoggingProductionIntegrationTests.cs due to unreliable and environment-dependent timing; replaced its body with an explanation and Assert.Inconclusive. The LoggingPerformanceTest is now recommended for performance validation. --- src/ACAT.sln | 33 ++++++++++++++++ .../LoggingProductionIntegrationTests.cs | 39 +++++-------------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/ACAT.sln b/src/ACAT.sln index 8b0d478e..1028296a 100644 --- a/src/ACAT.sln +++ b/src/ACAT.sln @@ -149,6 +149,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACATCore.Tests.Shared", "Li EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACATCore.Tests.Logging", "Libraries\ACATCore.Tests.Logging\ACATCore.Tests.Logging.csproj", "{2A492CE7-9014-6672-55E5-CC293561CFA3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACATCore.Tests.Integration", "Libraries\ACATCore.Tests.Integration\ACATCore.Tests.Integration.csproj", "{55D58F6D-68E0-52D6-5909-E5772FA29551}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_signed|Any CPU = Debug_signed|Any CPU @@ -1218,6 +1220,36 @@ Global {2A492CE7-9014-6672-55E5-CC293561CFA3}.Release|x64.Build.0 = Release|x64 {2A492CE7-9014-6672-55E5-CC293561CFA3}.Release|x86.ActiveCfg = Release|x64 {2A492CE7-9014-6672-55E5-CC293561CFA3}.Release|x86.Build.0 = Release|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_signed|Any CPU.ActiveCfg = Debug_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_signed|Any CPU.Build.0 = Debug_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_signed|x64.ActiveCfg = Debug_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_signed|x64.Build.0 = Debug_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_signed|x86.ActiveCfg = Debug_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_signed|x86.Build.0 = Debug_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_TestGTEC|Any CPU.ActiveCfg = Debug_TestGTEC|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_TestGTEC|Any CPU.Build.0 = Debug_TestGTEC|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_TestGTEC|x64.ActiveCfg = Debug_TestGTEC|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_TestGTEC|x64.Build.0 = Debug_TestGTEC|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_TestGTEC|x86.ActiveCfg = Debug_TestGTEC|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug_TestGTEC|x86.Build.0 = Debug_TestGTEC|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug|Any CPU.ActiveCfg = Debug|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug|Any CPU.Build.0 = Debug|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug|x64.ActiveCfg = Debug|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug|x64.Build.0 = Debug|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug|x86.ActiveCfg = Debug|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Debug|x86.Build.0 = Debug|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release_signed|Any CPU.ActiveCfg = Release_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release_signed|Any CPU.Build.0 = Release_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release_signed|x64.ActiveCfg = Release_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release_signed|x64.Build.0 = Release_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release_signed|x86.ActiveCfg = Release_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release_signed|x86.Build.0 = Release_signed|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release|Any CPU.ActiveCfg = Release|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release|Any CPU.Build.0 = Release|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release|x64.ActiveCfg = Release|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release|x64.Build.0 = Release|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release|x86.ActiveCfg = Release|x64 + {55D58F6D-68E0-52D6-5909-E5772FA29551}.Release|x86.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1271,6 +1303,7 @@ Global {B2C3D4E5-F6A7-8901-BCDE-234567890123} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} {85C163C5-C976-480F-A0C2-C56A2D2EC878} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} {2A492CE7-9014-6672-55E5-CC293561CFA3} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} + {55D58F6D-68E0-52D6-5909-E5772FA29551} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution RESX_AutoCreateNewLanguageFiles = True diff --git a/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs b/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs index 67bfd420..14070bde 100644 --- a/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs +++ b/src/Libraries/ACATCore.Tests.Integration/LoggingProductionIntegrationTests.cs @@ -112,38 +112,17 @@ public void LogFileCreation_SucceedsInProductionScenario() } [TestMethod] + [Ignore("Performance test is environment-dependent and flaky. Use LoggingPerformanceTest instead.")] public void ContinuousLogging_PerformanceImpactMinimal() { - // Arrange - var loggerFactory = LoggingConfiguration.CreateLoggerFactory(); - var logger = loggerFactory.CreateLogger("ContinuousTest"); - - // Act - Simulate 10 minutes of logging (scaled down to seconds for test) - var stopwatch = Stopwatch.StartNew(); - int messageCount = 1000; // Representing scaled-down continuous logging - - for (int i = 0; i < messageCount; i++) - { - logger.LogInformation("Continuous message {Index}", i); - if (i % 100 == 0) - { - // Simulate some work between log messages - System.Threading.Thread.Sleep(1); - } - } - - stopwatch.Stop(); - - // Assert - Performance impact should be < 5% (generous threshold for test) - // For 1000 messages with 10ms of work (10 sleeps), logging overhead should be minimal - double expectedTime = 10; // ms of work time - double actualTime = stopwatch.ElapsedMilliseconds; - double overhead = ((actualTime - expectedTime) / expectedTime) * 100; - - Assert.IsTrue(overhead < 500, // Very generous for test environment - $"Logging overhead too high: {overhead:F2}%"); - - loggerFactory?.Dispose(); + // This test was removed because: + // 1. Thread.Sleep() timing is unreliable on Windows (can vary 15-20ms) + // 2. Async logging makes timing comparisons meaningless + // 3. Debug vs Release builds have vastly different performance characteristics + // 4. The test was measuring OS scheduling variance, not logging overhead + // + // Use LoggingPerformanceTest() instead which tests absolute throughput. + Assert.Inconclusive("Test disabled - use LoggingPerformanceTest instead"); } [TestMethod] From 126c6f13ae8697cc04a9548962e92981c6a5306c Mon Sep 17 00:00:00 2001 From: "Beale, Michael" Date: Thu, 19 Feb 2026 15:21:24 -0800 Subject: [PATCH 09/10] Remove ACAT.Integration.Tests project and all test sources Deleted the entire ACAT.Integration.Tests project, including its .csproj file, all integration test source files, and test utilities. This removes all integration tests and related infrastructure for ACAT components from the repository. --- .../ACAT.Integration.Tests.csproj | 26 --- .../Harness/UITestHarness.cs | 138 --------------- .../Tests/AgentActivationTests.cs | 126 -------------- .../Tests/ConfigurationLoadingTests.cs | 161 ------------------ .../Tests/ExtensionLoadingTests.cs | 124 -------------- .../Tests/NamedPipeCommunicationTests.cs | 137 --------------- .../Tests/ScannerLifecycleTests.cs | 121 ------------- .../Utilities/PipeTestUtilities.cs | 126 -------------- .../ACAT.Integration.Tests.csproj | 27 --- .../CoreExtensionIntegrationTests.cs | 74 -------- 10 files changed, 1060 deletions(-) delete mode 100644 Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj delete mode 100644 Tests/ACAT.Integration.Tests/Harness/UITestHarness.cs delete mode 100644 Tests/ACAT.Integration.Tests/Tests/AgentActivationTests.cs delete mode 100644 Tests/ACAT.Integration.Tests/Tests/ConfigurationLoadingTests.cs delete mode 100644 Tests/ACAT.Integration.Tests/Tests/ExtensionLoadingTests.cs delete mode 100644 Tests/ACAT.Integration.Tests/Tests/NamedPipeCommunicationTests.cs delete mode 100644 Tests/ACAT.Integration.Tests/Tests/ScannerLifecycleTests.cs delete mode 100644 Tests/ACAT.Integration.Tests/Utilities/PipeTestUtilities.cs delete mode 100644 src/Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj delete mode 100644 src/Tests/ACAT.Integration.Tests/CoreExtensionIntegrationTests.cs diff --git a/Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj b/Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj deleted file mode 100644 index a904d0ef..00000000 --- a/Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - net481 - 9.0 - false - true - true - bin\$(Configuration)\ - false - true - ACAT.Integration.Tests - ACAT.Integration.Tests - - - - - - - - - - - - - - diff --git a/Tests/ACAT.Integration.Tests/Harness/UITestHarness.cs b/Tests/ACAT.Integration.Tests/Harness/UITestHarness.cs deleted file mode 100644 index 82d26db5..00000000 --- a/Tests/ACAT.Integration.Tests/Harness/UITestHarness.cs +++ /dev/null @@ -1,138 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Core.PanelManagement; -using ACAT.Core.Utility; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using System; -using System.IO; -using System.Threading; - -namespace ACAT.Integration.Tests.Harness -{ - /// - /// Provides a test harness for UI component integration tests. - /// Manages service provider setup, workspace isolation, and cleanup - /// so each test runs in a controlled, reproducible environment. - /// - public sealed class UITestHarness : IDisposable - { - private static readonly string TempBasePath = - Path.Combine(Path.GetTempPath(), "ACAT.Integration.Tests"); - - private bool _disposed; - private ServiceProvider _serviceProvider; - - /// - /// Gets the isolated workspace directory for this test instance. - /// - public string WorkspaceDirectory { get; private set; } - - /// - /// Gets the configured for this test instance. - /// - public IServiceProvider ServiceProvider => _serviceProvider; - - /// - /// Initialises the harness: creates an isolated workspace directory and - /// configures the ACAT service provider. - /// - /// A short name used to label the workspace folder. - public void Initialize(string testName) - { - WorkspaceDirectory = Path.Combine( - TempBasePath, - testName, - Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(WorkspaceDirectory); - - var services = new ServiceCollection(); - services.AddACATInfrastructure(); - _serviceProvider = services.BuildServiceProvider(); - - Context.ServiceProvider = _serviceProvider; - } - - /// - /// Returns a logger resolved from the test service provider. - /// - public ILogger GetLogger() => - _serviceProvider?.GetService>(); - - /// - /// Creates a sub-directory inside the workspace and returns its full path. - /// - public string CreateWorkspaceSubDirectory(string name) - { - string path = Path.Combine(WorkspaceDirectory, name); - Directory.CreateDirectory(path); - return path; - } - - /// - /// Writes a text file to the workspace and returns its full path. - /// - public string WriteWorkspaceFile(string relativePath, string content) - { - string fullPath = Path.Combine(WorkspaceDirectory, relativePath); - string directory = Path.GetDirectoryName(fullPath); - if (!string.IsNullOrEmpty(directory)) - { - Directory.CreateDirectory(directory); - } - File.WriteAllText(fullPath, content); - return fullPath; - } - - /// - /// Tears down the service provider and removes the workspace directory. - /// - public void Dispose() - { - if (_disposed) - { - return; - } - - Context.ServiceProvider = null; - - _serviceProvider?.Dispose(); - _serviceProvider = null; - - CleanupWorkspace(); - - _disposed = true; - } - - private void CleanupWorkspace() - { - if (!Directory.Exists(WorkspaceDirectory)) - { - return; - } - - try - { - Directory.Delete(WorkspaceDirectory, recursive: true); - } - catch (UnauthorizedAccessException) - { - // Retry once after a brief pause in case files are still locked. - Thread.Sleep(100); - try - { - Directory.Delete(WorkspaceDirectory, recursive: true); - } - catch - { - // Best-effort cleanup; do not fail the test. - } - } - } - } -} diff --git a/Tests/ACAT.Integration.Tests/Tests/AgentActivationTests.cs b/Tests/ACAT.Integration.Tests/Tests/AgentActivationTests.cs deleted file mode 100644 index 15f9bbf7..00000000 --- a/Tests/ACAT.Integration.Tests/Tests/AgentActivationTests.cs +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Core.AgentManagement; -using ACAT.Core.Utility; -using ACAT.Integration.Tests.Harness; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; - -namespace ACAT.Integration.Tests.Tests -{ - /// - /// Integration tests for agent activation, descriptor resolution, and - /// lifecycle management. These tests use the lightweight - /// so that no real UI or window-management is required. - /// - [TestClass] - public class AgentActivationTests - { - private UITestHarness _harness; - - [TestInitialize] - public void Setup() - { - _harness = new UITestHarness(); - _harness.Initialize(nameof(AgentActivationTests)); - } - - [TestCleanup] - public void Cleanup() - { - _harness?.Dispose(); - _harness = null; - } - - [TestMethod] - public void AgentActivation_NullAgentCanBeInstantiated() - { - // Act - var agent = new NullAgent(); - - // Assert - Assert.IsNotNull(agent, "NullAgent should be instantiatable without error."); - } - - [TestMethod] - public void AgentActivation_NullAgentHasDescriptor() - { - // Arrange - var agent = new NullAgent(); - - // Act - ClassDescriptorAttribute descriptor = agent.Descriptor; - - // Assert - Assert.IsNotNull(descriptor, - "NullAgent should expose a non-null ClassDescriptorAttribute."); - } - - [TestMethod] - public void AgentActivation_NullAgentDescriptorHasExpectedId() - { - // Arrange - var agent = new NullAgent(); - var expectedId = new Guid("92D2C512-DCAA-4773-8773-73E5D8C849FA"); - - // Act - Guid actualId = agent.Descriptor.Id; - - // Assert - Assert.AreEqual(expectedId, actualId, - "NullAgent descriptor should carry the well-known GUID."); - } - - [TestMethod] - public void AgentActivation_NullAgentSupportsNullAgentProcess() - { - // Arrange - var agent = new NullAgent(); - - // Act - var supported = agent.ProcessesSupported; - - // Assert - Assert.IsNotNull(supported, - "ProcessesSupported should not return null."); - - bool hasNullAgentEntry = false; - foreach (var process in supported) - { - if (process.ProcessName == "**nullagent**") - { - hasNullAgentEntry = true; - break; - } - } - - Assert.IsTrue(hasNullAgentEntry, - "NullAgent should list '**nullagent**' in its supported processes."); - } - - [TestMethod] - public void AgentActivation_NullAgentIsDisposable() - { - // Arrange & Act – disposal should not throw - using (var agent = new NullAgent()) - { - Assert.IsNotNull(agent); - } - } - - [TestMethod] - public void AgentActivation_ServiceProviderAvailableDuringAgentTest() - { - // The harness injects a service provider into Context, so agents that - // rely on it during initialisation can resolve their dependencies. - Assert.IsNotNull( - _harness.ServiceProvider, - "Service provider should be available for agent activation tests."); - } - } -} diff --git a/Tests/ACAT.Integration.Tests/Tests/ConfigurationLoadingTests.cs b/Tests/ACAT.Integration.Tests/Tests/ConfigurationLoadingTests.cs deleted file mode 100644 index 109f5ab4..00000000 --- a/Tests/ACAT.Integration.Tests/Tests/ConfigurationLoadingTests.cs +++ /dev/null @@ -1,161 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Core.Utility; -using ACAT.Integration.Tests.Harness; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.IO; - -namespace ACAT.Integration.Tests.Tests -{ - /// - /// Integration tests that verify JSON configuration loading behaviour, - /// including valid files, missing files, empty files, and malformed JSON. - /// - [TestClass] - public class ConfigurationLoadingTests - { - private UITestHarness _harness; - - // Simple POCO used as the configuration type for these tests. - private class SampleConfig - { - public string Name { get; set; } = "default"; - public bool Enabled { get; set; } = true; - public int MaxRetries { get; set; } = 3; - } - - [TestInitialize] - public void Setup() - { - _harness = new UITestHarness(); - _harness.Initialize(nameof(ConfigurationLoadingTests)); - } - - [TestCleanup] - public void Cleanup() - { - _harness?.Dispose(); - _harness = null; - } - - [TestMethod] - public void ConfigurationLoading_ValidJsonFileIsLoaded() - { - // Arrange - const string json = @"{ - ""name"": ""TestConfig"", - ""enabled"": true, - ""maxRetries"": 5 -}"; - string path = _harness.WriteWorkspaceFile("config.json", json); - - var loader = new JsonConfigurationLoader(); - - // Act - SampleConfig config = loader.Load(path, createDefaultOnError: false); - - // Assert - Assert.IsNotNull(config, "A valid JSON file should be loaded successfully."); - Assert.AreEqual("TestConfig", config.Name); - Assert.IsTrue(config.Enabled); - Assert.AreEqual(5, config.MaxRetries); - } - - [TestMethod] - public void ConfigurationLoading_MissingFileReturnsDefault() - { - // Arrange - string missingPath = Path.Combine(_harness.WorkspaceDirectory, "nonexistent.json"); - var loader = new JsonConfigurationLoader(); - - // Act - SampleConfig config = loader.Load(missingPath, createDefaultOnError: true); - - // Assert - Assert.IsNotNull(config, - "A missing file with createDefaultOnError=true should return a default config."); - } - - [TestMethod] - public void ConfigurationLoading_MissingFileWithNoDefaultReturnsNull() - { - // Arrange - string missingPath = Path.Combine(_harness.WorkspaceDirectory, "nonexistent.json"); - var loader = new JsonConfigurationLoader(); - - // Act - SampleConfig config = loader.Load(missingPath, createDefaultOnError: false); - - // Assert - Assert.IsNull(config, - "A missing file with createDefaultOnError=false should return null."); - } - - [TestMethod] - public void ConfigurationLoading_EmptyFileReturnsDefault() - { - // Arrange - string path = _harness.WriteWorkspaceFile("empty.json", string.Empty); - var loader = new JsonConfigurationLoader(); - - // Act - SampleConfig config = loader.Load(path, createDefaultOnError: true); - - // Assert - Assert.IsNotNull(config, - "An empty file with createDefaultOnError=true should return a default config."); - } - - [TestMethod] - public void ConfigurationLoading_NullPathReturnsDefault() - { - // Arrange - var loader = new JsonConfigurationLoader(); - - // Act - SampleConfig config = loader.Load(null, createDefaultOnError: true); - - // Assert - Assert.IsNotNull(config, - "A null path with createDefaultOnError=true should return a default config."); - } - - [TestMethod] - public void ConfigurationLoading_MissingFileCreatesDefaultOnDisk() - { - // Arrange - string path = Path.Combine(_harness.WorkspaceDirectory, "newconfig.json"); - var loader = new JsonConfigurationLoader(); - - // Act - loader.Load(path, createDefaultOnError: true); - - // Assert - Assert.IsTrue(File.Exists(path), - "Loading a missing file with createDefaultOnError=true should create the file."); - } - - [TestMethod] - public void ConfigurationLoading_WorkspaceIsCleanedUp() - { - // Arrange - string workspace; - using (var tempHarness = new UITestHarness()) - { - tempHarness.Initialize("TempConfig"); - workspace = tempHarness.WorkspaceDirectory; - tempHarness.WriteWorkspaceFile("cfg.json", "{}"); - Assert.IsTrue(Directory.Exists(workspace)); - } // Dispose called here - - // Assert - Assert.IsFalse(Directory.Exists(workspace), - "Workspace should be removed after harness disposal, ensuring test isolation."); - } - } -} diff --git a/Tests/ACAT.Integration.Tests/Tests/ExtensionLoadingTests.cs b/Tests/ACAT.Integration.Tests/Tests/ExtensionLoadingTests.cs deleted file mode 100644 index a4061c24..00000000 --- a/Tests/ACAT.Integration.Tests/Tests/ExtensionLoadingTests.cs +++ /dev/null @@ -1,124 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Core.Extensions; -using ACAT.Core.PanelManagement; -using ACAT.Core.Utility; -using ACAT.Integration.Tests.Harness; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ACAT.Integration.Tests.Tests -{ - /// - /// Integration tests for extension loading via the ACAT - /// and the DI service provider. - /// - [TestClass] - public class ExtensionLoadingTests - { - private UITestHarness _harness; - - [TestInitialize] - public void Setup() - { - _harness = new UITestHarness(); - _harness.Initialize(nameof(ExtensionLoadingTests)); - } - - [TestCleanup] - public void Cleanup() - { - _harness?.Dispose(); - _harness = null; - } - - [TestMethod] - public void ExtensionLoading_ServiceProviderIsConfigured() - { - Assert.IsNotNull( - _harness.ServiceProvider, - "Service provider must be available to load extensions."); - } - - [TestMethod] - public void ExtensionLoading_LoggerFactoryIsResolvable() - { - // Act - var loggerFactory = _harness.ServiceProvider.GetService(); - - // Assert - Assert.IsNotNull(loggerFactory, - "ILoggerFactory should be registered in the ACAT service provider."); - } - - [TestMethod] - public void ExtensionLoading_EmptyTypeListReturnsEmptyCollection() - { - // Arrange - var emptyTypes = new List(); - - // Act - var extensions = ExtensionInstantiator.CreateExtensionInstances( - _harness.ServiceProvider, - emptyTypes); - - // Assert - Assert.IsNotNull(extensions); - Assert.IsFalse(extensions.Any(), - "An empty type list should produce an empty extension collection."); - } - - [TestMethod] - public void ExtensionLoading_NullTypeListReturnsEmptyCollection() - { - // Act - var extensions = ExtensionInstantiator.CreateExtensionInstances( - _harness.ServiceProvider, - null); - - // Assert - Assert.IsNotNull(extensions); - Assert.IsFalse(extensions.Any(), - "A null type list should produce an empty extension collection."); - } - - [TestMethod] - public void ExtensionLoading_NullServiceProviderThrows() - { - Assert.ThrowsException(() => - ExtensionInstantiator.CreateExtensionInstances(null, new List())); - } - - [TestMethod] - public void ExtensionLoading_SingleNullTypeReturnsNull() - { - // Act - var extension = ExtensionInstantiator.CreateExtensionInstance( - _harness.ServiceProvider, - null); - - // Assert - Assert.IsNull(extension, - "Requesting an extension for a null type should return null."); - } - - [TestMethod] - public void ExtensionLoading_ContextServiceProviderMatchesHarness() - { - // The harness sets Context.ServiceProvider; verify the round-trip. - Assert.AreSame( - _harness.ServiceProvider, - Context.ServiceProvider, - "Context.ServiceProvider should reference the harness service provider."); - } - } -} diff --git a/Tests/ACAT.Integration.Tests/Tests/NamedPipeCommunicationTests.cs b/Tests/ACAT.Integration.Tests/Tests/NamedPipeCommunicationTests.cs deleted file mode 100644 index 6eeea1d8..00000000 --- a/Tests/ACAT.Integration.Tests/Tests/NamedPipeCommunicationTests.cs +++ /dev/null @@ -1,137 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Integration.Tests.Utilities; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; -using System.IO.Pipes; -using System.Threading; - -namespace ACAT.Integration.Tests.Tests -{ - /// - /// Integration tests for named-pipe communication between ACAT components. - /// - [TestClass] - public class NamedPipeCommunicationTests - { - [TestMethod] - public void Pipe_ServerCanBeCreatedAndDisposed() - { - // Arrange - string pipeName = PipeTestUtilities.CreateUniquePipeName(); - var messages = new List(); - using var messageEvent = new ManualResetEventSlim(false); - - // Act & Assert – no exception should be thrown - using var server = PipeTestUtilities.CreateAndStartServer(pipeName, messages, messageEvent); - Assert.IsNotNull(server); - } - - [TestMethod] - public void Pipe_ClientCanConnectToServer() - { - // Arrange - string pipeName = PipeTestUtilities.CreateUniquePipeName(); - var messages = new List(); - using var messageEvent = new ManualResetEventSlim(false); - - using var server = PipeTestUtilities.CreateAndStartServer(pipeName, messages, messageEvent); - - // Act - using var client = PipeTestUtilities.ConnectClient(pipeName); - - // Assert - Assert.IsNotNull(client, "Client should connect to the server without error."); - } - - [TestMethod] - public void Pipe_ClientCanSendMessageToServer() - { - // Arrange - const string expectedMessage = "hello_pipe"; - string pipeName = PipeTestUtilities.CreateUniquePipeName(); - var messages = new List(); - using var messageEvent = new ManualResetEventSlim(false); - - using var server = PipeTestUtilities.CreateAndStartServer(pipeName, messages, messageEvent); - using var client = PipeTestUtilities.ConnectClient(pipeName); - - // Act - client.Send(expectedMessage); - bool received = PipeTestUtilities.WaitForMessage(messageEvent); - - // Assert - Assert.IsTrue(received, "Server should receive the message within the timeout period."); - Assert.AreEqual(1, messages.Count, "Exactly one message should have been received."); - Assert.AreEqual(expectedMessage, messages[0], "Received message content should match what was sent."); - } - - [TestMethod] - public void Pipe_MultipleMessagesCanBeSent() - { - // Arrange - string pipeName = PipeTestUtilities.CreateUniquePipeName(); - var messages = new List(); - // We need to wait for all 3 messages, so reset the event manually each time. - using var allReceivedEvent = new ManualResetEventSlim(false); - int receiveCount = 0; - - using var server = PipeTestUtilities.CreateAndStartServer(pipeName, messages, allReceivedEvent); - // Override: attach an additional handler to count messages - server.MessageReceived += (_, __) => - { - if (Interlocked.Increment(ref receiveCount) >= 3) - { - allReceivedEvent.Set(); - } - }; - - using var client = PipeTestUtilities.ConnectClient(pipeName); - - // Act - client.Send("msg1"); - client.Send("msg2"); - client.Send("msg3"); - bool allReceived = PipeTestUtilities.WaitForMessage(allReceivedEvent, timeoutMs: 5000); - - // Assert - Assert.IsTrue(allReceived, "All three messages should arrive within the timeout."); - Assert.AreEqual(3, messages.Count, "Exactly 3 messages should have been received."); - CollectionAssert.AreEquivalent( - new[] { "msg1", "msg2", "msg3" }, - messages, - "Received messages should match the sent content."); - } - - [TestMethod] - public void Pipe_ServerIsDisposedCleanly() - { - // Arrange - string pipeName = PipeTestUtilities.CreateUniquePipeName(); - var messages = new List(); - using var messageEvent = new ManualResetEventSlim(false); - - var server = PipeTestUtilities.CreateAndStartServer(pipeName, messages, messageEvent); - - // Act & Assert – disposal should not throw - PipeTestUtilities.SafeDisposeServer(server); - } - - [TestMethod] - public void Pipe_UniqueNamesAreDistinct() - { - // Arrange & Act - string name1 = PipeTestUtilities.CreateUniquePipeName("test"); - string name2 = PipeTestUtilities.CreateUniquePipeName("test"); - - // Assert - Assert.AreNotEqual(name1, name2, - "Each call to CreateUniquePipeName should return a different value."); - } - } -} diff --git a/Tests/ACAT.Integration.Tests/Tests/ScannerLifecycleTests.cs b/Tests/ACAT.Integration.Tests/Tests/ScannerLifecycleTests.cs deleted file mode 100644 index 4368dd06..00000000 --- a/Tests/ACAT.Integration.Tests/Tests/ScannerLifecycleTests.cs +++ /dev/null @@ -1,121 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Integration.Tests.Harness; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.IO; - -namespace ACAT.Integration.Tests.Tests -{ - /// - /// Integration tests that verify scanner-related lifecycle behaviour. - /// These tests focus on configuration loading and directory structures - /// that scanners depend on, ensuring they can be created in isolation. - /// - [TestClass] - public class ScannerLifecycleTests - { - private UITestHarness _harness; - - [TestInitialize] - public void Setup() - { - _harness = new UITestHarness(); - _harness.Initialize(nameof(ScannerLifecycleTests)); - } - - [TestCleanup] - public void Cleanup() - { - _harness?.Dispose(); - _harness = null; - } - - [TestMethod] - public void ScannerLifecycle_WorkspaceIsCreated() - { - Assert.IsTrue( - Directory.Exists(_harness.WorkspaceDirectory), - "Harness workspace directory should exist after initialization."); - } - - [TestMethod] - public void ScannerLifecycle_ServiceProviderIsAvailable() - { - Assert.IsNotNull( - _harness.ServiceProvider, - "Service provider should be available after harness initialization."); - } - - [TestMethod] - public void ScannerLifecycle_PanelConfigDirectoryCanBeCreated() - { - // Arrange - string panelConfigDir = _harness.CreateWorkspaceSubDirectory("PanelConfig"); - - // Assert - Assert.IsTrue( - Directory.Exists(panelConfigDir), - "PanelConfig sub-directory should be creatable inside the workspace."); - } - - [TestMethod] - public void ScannerLifecycle_DefaultConfigFileCanBeWritten() - { - // Arrange - const string configContent = @"{ - ""panelClass"": ""AlphabetScanner"", - ""enabled"": true -}"; - - // Act - string configPath = _harness.WriteWorkspaceFile( - Path.Combine("PanelConfig", "AlphabetScanner.json"), - configContent); - - // Assert - Assert.IsTrue(File.Exists(configPath), - "Scanner config file should be written to the workspace."); - Assert.IsTrue(new FileInfo(configPath).Length > 0, - "Written config file should not be empty."); - } - - [TestMethod] - public void ScannerLifecycle_WorkspaceIsIsolatedBetweenTests() - { - // Each test gets a unique workspace path derived from a fresh GUID, - // so two different harness instances will never share the same directory. - using (var otherHarness = new UITestHarness()) - { - otherHarness.Initialize(nameof(ScannerLifecycle_WorkspaceIsIsolatedBetweenTests)); - - Assert.AreNotEqual( - _harness.WorkspaceDirectory, - otherHarness.WorkspaceDirectory, - "Each harness instance should have a unique workspace directory."); - } - } - - [TestMethod] - public void ScannerLifecycle_WorkspaceIsRemovedAfterDispose() - { - // Arrange - string workspace; - using (var tempHarness = new UITestHarness()) - { - tempHarness.Initialize("TempScanner"); - workspace = tempHarness.WorkspaceDirectory; - Assert.IsTrue(Directory.Exists(workspace)); - } // Dispose is called here - - // Assert - Assert.IsFalse( - Directory.Exists(workspace), - "Workspace directory should be deleted after harness disposal."); - } - } -} diff --git a/Tests/ACAT.Integration.Tests/Utilities/PipeTestUtilities.cs b/Tests/ACAT.Integration.Tests/Utilities/PipeTestUtilities.cs deleted file mode 100644 index 1fa3d9ab..00000000 --- a/Tests/ACAT.Integration.Tests/Utilities/PipeTestUtilities.cs +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Core.Utility.NamedPipe; -using System; -using System.Collections.Generic; -using System.IO.Pipes; -using System.Threading; - -namespace ACAT.Integration.Tests.Utilities -{ - /// - /// Helper utilities for writing integration tests that involve named-pipe - /// communication between ACAT components. - /// - public static class PipeTestUtilities - { - /// - /// Default timeout in milliseconds used when waiting for pipe events. - /// - public const int DefaultTimeoutMs = 3000; - - /// - /// Creates a unique pipe name that is safe to use in a single test run. - /// - public static string CreateUniquePipeName(string prefix = "acat_test") => - $"{prefix}_{Guid.NewGuid():N}"; - - /// - /// Creates a listening on , - /// starts it, and returns both the server and a - /// that is set the first time a message arrives. - /// - /// Name of the pipe to create. - /// - /// Collection that will be populated with every message received by the server. - /// - /// - /// Event that is signalled when the first message is received. - /// - /// The started . - public static PipeServer CreateAndStartServer( - string pipeName, - IList receivedMessages, - ManualResetEventSlim messageEvent) - { - if (receivedMessages == null) throw new ArgumentNullException(nameof(receivedMessages)); - if (messageEvent == null) throw new ArgumentNullException(nameof(messageEvent)); - - var server = new PipeServer(pipeName, PipeDirection.InOut); - server.MessageReceived += (_, args) => - { - if (args?.Message != null) - { - receivedMessages.Add(args.Message); - messageEvent.Set(); - } - }; - server.Start(); - return server; - } - - /// - /// Creates a , connects it to an already-started server, - /// and returns the client. - /// - /// Name of the pipe to connect to. - /// - /// Connection timeout in milliseconds. Defaults to . - /// - /// The connected . - public static PipeClient ConnectClient(string pipeName, int timeoutMs = DefaultTimeoutMs) - { - var client = new PipeClient(pipeName, PipeDirection.InOut); - client.Connect(timeoutMs); - return client; - } - - /// - /// Waits for to be signalled within - /// milliseconds. - /// - /// - /// if the event was signalled; - /// if the wait timed out. - /// - public static bool WaitForMessage(ManualResetEventSlim messageEvent, int timeoutMs = DefaultTimeoutMs) => - messageEvent.Wait(timeoutMs); - - /// - /// Disposes a without throwing, allowing tests to - /// clean up even when the server is in a faulted state. - /// - public static void SafeDisposeServer(PipeServer server) - { - try - { - server?.Stop(); - server?.Dispose(); - } - catch - { - // Best-effort cleanup. - } - } - - /// - /// Disposes a without throwing. - /// - public static void SafeDisposeClient(PipeClient client) - { - try - { - client?.Dispose(); - } - catch - { - // Best-effort cleanup. - } - } - } -} diff --git a/src/Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj b/src/Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj deleted file mode 100644 index 9df63d6e..00000000 --- a/src/Tests/ACAT.Integration.Tests/ACAT.Integration.Tests.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - Exe - net481 - 9.0 - false - true - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - - - - - diff --git a/src/Tests/ACAT.Integration.Tests/CoreExtensionIntegrationTests.cs b/src/Tests/ACAT.Integration.Tests/CoreExtensionIntegrationTests.cs deleted file mode 100644 index 1b76f8af..00000000 --- a/src/Tests/ACAT.Integration.Tests/CoreExtensionIntegrationTests.cs +++ /dev/null @@ -1,74 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013-2019; 2023 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -//////////////////////////////////////////////////////////////////////////// - -using ACAT.Core.Configuration; -using ACAT.Extension; -using System.Collections.Generic; -using Xunit; - -namespace ACAT.Integration.Tests -{ - /// - /// Sample integration tests demonstrating xUnit patterns for - /// interactions between ACATCore and ACATExtension. - /// - public class CoreExtensionIntegrationTests - { - [Fact] - public void ACATPreferences_LoadDefaultSettings_ReturnsValidPreferences() - { - var preferences = ACATPreferences.LoadDefaultSettings(); - - Assert.NotNull(preferences); - } - - [Fact] - public void AbbreviationsJson_CreateDefault_IsCompatibleWithExtensionPreferences() - { - var abbreviations = AbbreviationsJson.CreateDefault(); - var preferences = ACATPreferences.LoadDefaultSettings(); - - Assert.NotNull(abbreviations); - Assert.NotNull(preferences); - Assert.Empty(abbreviations.Abbreviations); - } - - [Fact] - public void PronunciationsJson_CreateDefault_IsCompatibleWithExtensionPreferences() - { - var pronunciations = PronunciationsJson.CreateDefault(); - var preferences = ACATPreferences.LoadDefaultSettings(); - - Assert.NotNull(pronunciations); - Assert.NotNull(preferences); - Assert.Empty(pronunciations.Pronunciations); - } - - [Fact] - public void AbbreviationsJson_And_PronunciationsJson_CanBeUsedTogether() - { - var abbreviations = new AbbreviationsJson - { - Abbreviations = new List - { - new AbbreviationJson { Word = "brb", ReplaceWith = "be right back" } - } - }; - - var pronunciations = new PronunciationsJson - { - Pronunciations = new List - { - new PronunciationJson { Word = "ACAT", Pronunciation = "ay-kat" } - } - }; - - Assert.Single(abbreviations.Abbreviations); - Assert.Single(pronunciations.Pronunciations); - } - } -} From dab063efda477e9c9ace189b1d7be2382bbbbf93 Mon Sep 17 00:00:00 2001 From: "Beale, Michael" Date: Thu, 19 Feb 2026 15:43:25 -0800 Subject: [PATCH 10/10] Update test SDK versions and remove ACAT.Integration.Tests Upgraded Microsoft.NET.Test.Sdk to 18.0.1 and standardized MSTest.TestAdapter/TestFramework to 3.6.4 across test projects. Added EnableMSTestRunner=false and custom output paths to avoid test discovery issues. Removed ACAT.Integration.Tests from the solution and its build configs. Minor formatting updates in .csproj files. --- src/ACAT.sln | 35 +------------------ .../ACATCore.Tests.Configuration.csproj | 22 +++++------- .../ACATCore.Tests.Integration.csproj | 12 +++++-- .../ACATCore.Tests.Logging.csproj | 14 +++++--- .../ACATCore.Tests.Shared.csproj | 7 ++-- .../ACATCore.Tests/ACATCore.Tests.csproj | 4 +-- .../ACATExtension.Tests.csproj | 7 ++-- 7 files changed, 38 insertions(+), 63 deletions(-) diff --git a/src/ACAT.sln b/src/ACAT.sln index 1028296a..badb22ed 100644 --- a/src/ACAT.sln +++ b/src/ACAT.sln @@ -143,8 +143,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACATCore.Tests", "Libraries EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACATExtension.Tests", "Libraries\ACATExtension.Tests\ACATExtension.Tests.csproj", "{A1B2C3D4-E5F6-7890-ABCD-123456789012}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACAT.Integration.Tests", "Tests\ACAT.Integration.Tests\ACAT.Integration.Tests.csproj", "{B2C3D4E5-F6A7-8901-BCDE-234567890123}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACATCore.Tests.Shared", "Libraries\ACATCore.Tests.Shared\ACATCore.Tests.Shared.csproj", "{85C163C5-C976-480F-A0C2-C56A2D2EC878}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ACATCore.Tests.Logging", "Libraries\ACATCore.Tests.Logging\ACATCore.Tests.Logging.csproj", "{2A492CE7-9014-6672-55E5-CC293561CFA3}" @@ -1130,36 +1128,6 @@ Global {A1B2C3D4-E5F6-7890-ABCD-123456789012}.Release|x64.Build.0 = Release|x64 {A1B2C3D4-E5F6-7890-ABCD-123456789012}.Release|x86.ActiveCfg = Release|x64 {A1B2C3D4-E5F6-7890-ABCD-123456789012}.Release|x86.Build.0 = Release|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_signed|Any CPU.ActiveCfg = Debug_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_signed|Any CPU.Build.0 = Debug_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_signed|x64.ActiveCfg = Debug_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_signed|x64.Build.0 = Debug_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_signed|x86.ActiveCfg = Debug_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_signed|x86.Build.0 = Debug_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_TestGTEC|Any CPU.ActiveCfg = Debug_TestGTEC|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_TestGTEC|Any CPU.Build.0 = Debug_TestGTEC|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_TestGTEC|x64.ActiveCfg = Debug_TestGTEC|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_TestGTEC|x64.Build.0 = Debug_TestGTEC|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_TestGTEC|x86.ActiveCfg = Debug_TestGTEC|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug_TestGTEC|x86.Build.0 = Debug_TestGTEC|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug|Any CPU.ActiveCfg = Debug|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug|Any CPU.Build.0 = Debug|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug|x64.ActiveCfg = Debug|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug|x64.Build.0 = Debug|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug|x86.ActiveCfg = Debug|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Debug|x86.Build.0 = Debug|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release_signed|Any CPU.ActiveCfg = Release_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release_signed|Any CPU.Build.0 = Release_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release_signed|x64.ActiveCfg = Release_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release_signed|x64.Build.0 = Release_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release_signed|x86.ActiveCfg = Release_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release_signed|x86.Build.0 = Release_signed|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release|Any CPU.ActiveCfg = Release|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release|Any CPU.Build.0 = Release|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release|x64.ActiveCfg = Release|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release|x64.Build.0 = Release|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release|x86.ActiveCfg = Release|x64 - {B2C3D4E5-F6A7-8901-BCDE-234567890123}.Release|x86.Build.0 = Release|x64 {85C163C5-C976-480F-A0C2-C56A2D2EC878}.Debug_signed|Any CPU.ActiveCfg = Debug_signed|x64 {85C163C5-C976-480F-A0C2-C56A2D2EC878}.Debug_signed|Any CPU.Build.0 = Debug_signed|x64 {85C163C5-C976-480F-A0C2-C56A2D2EC878}.Debug_signed|x64.ActiveCfg = Debug_signed|x64 @@ -1300,13 +1268,12 @@ Global {ABC43A09-30B7-93BC-8905-5ACCDCCA9993} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} {D1A2B3C4-E5F6-7890-ABCD-EF1234567890} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} {A1B2C3D4-E5F6-7890-ABCD-123456789012} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} - {B2C3D4E5-F6A7-8901-BCDE-234567890123} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} {85C163C5-C976-480F-A0C2-C56A2D2EC878} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} {2A492CE7-9014-6672-55E5-CC293561CFA3} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} {55D58F6D-68E0-52D6-5909-E5772FA29551} = {B1C7A56F-1DBD-4FF9-B402-B6B89244AED6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - RESX_AutoCreateNewLanguageFiles = True SolutionGuid = {6C18E44C-06E3-46DB-9C9C-5B18BC658072} + RESX_AutoCreateNewLanguageFiles = True EndGlobalSection EndGlobal diff --git a/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj b/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj index c7e2e084..10b59017 100644 --- a/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj +++ b/src/Libraries/ACATCore.Tests.Configuration/ACATCore.Tests.Configuration.csproj @@ -1,23 +1,22 @@ - + net481 9.0 false true true - + false + + bin\$(Configuration)\ - obj\$(Configuration)\ + obj\ obj\$(Configuration)\ - false - - true - - - + + + @@ -26,11 +25,6 @@ - - - - - diff --git a/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj b/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj index dd032d90..643b3b24 100644 --- a/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj +++ b/src/Libraries/ACATCore.Tests.Integration/ACATCore.Tests.Integration.csproj @@ -4,12 +4,18 @@ 9.0 false true + false + + + bin\$(Configuration)\ + obj\ + obj\$(Configuration)\ - - - + + + diff --git a/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj b/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj index f5b66215..43e98e2b 100644 --- a/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj +++ b/src/Libraries/ACATCore.Tests.Logging/ACATCore.Tests.Logging.csproj @@ -1,15 +1,21 @@ - + net481 9.0 false true + false + + + bin\$(Configuration)\ + obj\ + obj\$(Configuration)\ - - - + + + diff --git a/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj b/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj index 76d8418b..7fe87f2b 100644 --- a/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj +++ b/src/Libraries/ACATCore.Tests.Shared/ACATCore.Tests.Shared.csproj @@ -1,4 +1,4 @@ - + net481 9.0 @@ -12,11 +12,10 @@ - + - - + diff --git a/src/Libraries/ACATCore.Tests/ACATCore.Tests.csproj b/src/Libraries/ACATCore.Tests/ACATCore.Tests.csproj index 8ed1f4e7..d9475f40 100644 --- a/src/Libraries/ACATCore.Tests/ACATCore.Tests.csproj +++ b/src/Libraries/ACATCore.Tests/ACATCore.Tests.csproj @@ -1,4 +1,4 @@ - + Exe net481 @@ -9,7 +9,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Libraries/ACATExtension.Tests/ACATExtension.Tests.csproj b/src/Libraries/ACATExtension.Tests/ACATExtension.Tests.csproj index a2dbb642..ad91fbc6 100644 --- a/src/Libraries/ACATExtension.Tests/ACATExtension.Tests.csproj +++ b/src/Libraries/ACATExtension.Tests/ACATExtension.Tests.csproj @@ -1,18 +1,21 @@ - + Exe net481 9.0 false true + false + + runtime; build; native; contentfiles; analyzers; buildtransitive all - +