Skip to content

CQRS Call-Site Migration: Phase 2 Extension Handlers & Phase 3 Base Classes - #269

Merged
michaelbeale-IL merged 2 commits into
masterfrom
copilot/migrate-cqrs-call-sites
Feb 24, 2026
Merged

CQRS Call-Site Migration: Phase 2 Extension Handlers & Phase 3 Base Classes#269
michaelbeale-IL merged 2 commits into
masterfrom
copilot/migrate-cqrs-call-sites

CQRS call-site migration: Phase 2 extension handlers and Phase 3 base…

73426b4
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
GitHub Actions / Test Results succeeded Feb 24, 2026 in 1s

455 passed, 0 failed and 3 skipped

Tests passed successfully

Report Passed Failed Skipped Time
src/TestResults/architecture-results.trx 61✅ 4s
src/TestResults/config-results.trx 288✅ 19s
src/TestResults/integration-results.trx 27✅ 1⚪ 43s
src/TestResults/logging-results.trx 25✅ 3s
src/TestResults/migration-results.trx 9✅ 2⚪ 4s
src/TestResults/performance-results.trx 45✅ 3s

✅ src/TestResults/architecture-results.trx

61 tests were completed in 4s with 61 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
ACATCore.Tests.Architecture.CqrsTests 9✅ 17ms
ACATCore.Tests.Architecture.EventBusTests 12✅ 12ms
ACATCore.Tests.Architecture.FactoryTests 32✅ 2s
ACATCore.Tests.Architecture.RepositoryTests 8✅ 568ms

✅ ACATCore.Tests.Architecture.CqrsTests

✅ CommandHandler_Handle_ExecutesAction
✅ GetActivePanelQuery_IsIQuery
✅ GetAllPanelNamesQuery_IsIQuery
✅ GetConfigurationValueQuery_IsIQuery
✅ HandleActuatorSwitchCommand_IsICommand
✅ HandleActuatorSwitchCommand_Resume_StoresAction
✅ HidePanelCommand_IsICommand
✅ QueryHandler_Handle_ReturnsExpectedResult
✅ ShowPanelCommand_IsICommand

✅ ACATCore.Tests.Architecture.EventBusTests

✅ ActuatorSwitchActivatedEvent_SwitchName_SetCorrectly
✅ AgentContextChangedEvent_Properties_SetCorrectly
✅ ConfigurationReloadEvent_ConfigPath_SetCorrectly
✅ PanelHideEvent_PanelClass_SetCorrectly
✅ PanelShowEvent_PanelClass_SetCorrectly
✅ Publish_NullEventData_ThrowsArgumentNullException
✅ Publish_WithMultipleSubscribers_AllReceiveEvent
✅ Publish_WithNoSubscribers_DoesNotThrow
✅ Publish_WithSubscriber_InvokesHandler
✅ Subscribe_DifferentEventTypes_OnlyCorrectHandlerCalled
✅ Subscribe_NullHandler_ThrowsArgumentNullException
✅ Unsubscribe_ByHandler_HandlerNoLongerCalled

✅ ACATCore.Tests.Architecture.FactoryTests

✅ ActuatorFactory_Constructor_NullServiceProvider_Throws
✅ ActuatorFactory_Constructor_ValidServiceProvider_Succeeds
✅ ActuatorFactory_CreateByName_EmptyName_Throws
✅ ActuatorFactory_CreateByName_NullName_Throws
✅ ActuatorFactory_CreateByName_UnknownName_Throws
✅ ActuatorFactory_CreateByType_NonActuatorType_Throws
✅ ActuatorFactory_CreateByType_NullType_Throws
✅ ActuatorFactory_ImplementsIActuatorFactory
✅ AgentFactory_Constructor_NullServiceProvider_Throws
✅ AgentFactory_Constructor_ValidServiceProvider_Succeeds
✅ AgentFactory_CreateByName_EmptyName_Throws
✅ AgentFactory_CreateByName_NullName_Throws
✅ AgentFactory_CreateByName_UnknownName_Throws
✅ AgentFactory_CreateByType_NonAgentType_Throws
✅ AgentFactory_CreateByType_NullType_Throws
✅ AgentFactory_ImplementsIAgentFactory
✅ DI_Factories_AreSingletons
✅ DI_IActuatorFactory_IsRegistered_AfterAddActuatorManagement
✅ DI_IAgentFactory_IsRegistered_AfterAddAgentManagement
✅ DI_IScannerFactory_IsRegistered_AfterAddPanelManagement
✅ DI_IWidgetFactory_IsRegistered_AfterAddWidgetManagement
✅ ScannerFactory_Constructor_NullServiceProvider_Throws
✅ ScannerFactory_Constructor_ValidServiceProvider_Succeeds
✅ ScannerFactory_CreateByName_EmptyName_Throws
✅ ScannerFactory_CreateByName_NullName_Throws
✅ ScannerFactory_CreateByName_UnknownName_Throws
✅ ScannerFactory_CreateByType_NonScannerType_Throws
✅ ScannerFactory_CreateByType_NullType_Throws
✅ ScannerFactory_ImplementsIScannerFactory
✅ WidgetFactory_Constructor_NullServiceProvider_Throws
✅ WidgetFactory_Constructor_ValidServiceProvider_Succeeds
✅ WidgetFactory_ImplementsIWidgetFactory

✅ ACATCore.Tests.Architecture.RepositoryTests

✅ ConfigurationRepository_GetDefault_ReturnsNonNull
✅ ConfigurationRepository_ImplementsIRepository
✅ ConfigurationRepository_Load_MissingFile_ReturnsDefault
✅ ConfigurationRepository_Load_NullPath_ReturnsNull
✅ PreferencesRepository_GetDefault_ReturnsNonNull
✅ PreferencesRepository_ImplementsIRepository
✅ PreferencesRepository_Load_NullPath_ReturnsNull
✅ PreferencesRepository_Save_RoundTrip

✅ src/TestResults/config-results.trx

288 tests were completed in 19s with 288 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
ACATCore.Tests.Configuration.AbbreviationsJsonTests 9✅ 1s
ACATCore.Tests.Configuration.ActuatorSettingsConverterTests 11✅ 20ms
ACATCore.Tests.Configuration.ActuatorSettingsJsonTests 8✅ 82ms
ACATCore.Tests.Configuration.ActuatorSettingsValidatorTests 10✅ 29ms
ACATCore.Tests.Configuration.ConfigurationEnhancementsTests 31✅ 3s
ACATCore.Tests.Configuration.ConfigurationMigrationTests 25✅ 139ms
ACATCore.Tests.Configuration.ConfigurationWatcherTests 17✅ 10s
ACATCore.Tests.Configuration.ContextDependencyInjectionTests 10✅ 35ms
ACATCore.Tests.Configuration.ContextLoggerTests 10✅ 2ms
ACATCore.Tests.Configuration.ContextThreadSafetyTests 6✅ 1s
ACATCore.Tests.Configuration.CQRSPatternTests 18✅ 76ms
ACATCore.Tests.Configuration.ExtensionLoadingIntegrationTests 16✅ 11ms
ACATCore.Tests.Configuration.FactoryRegistrationTests 13✅ 41ms
ACATCore.Tests.Configuration.JsonConfigurationLoaderTests 15✅ 46ms
ACATCore.Tests.Configuration.ManagerFactoryTests 12✅ 2ms
ACATCore.Tests.Configuration.PanelConfigJsonTests 6✅ 28ms
ACATCore.Tests.Configuration.PanelConfigValidatorTests 10✅ 38ms
ACATCore.Tests.Configuration.PreferredWordPredictorsJsonTests 11✅ 31ms
ACATCore.Tests.Configuration.PronunciationsJsonTests 10✅ 75ms
ACATCore.Tests.Configuration.ServiceConfigurationTests 12✅ 5ms
ACATCore.Tests.Configuration.ServiceLifetimeTests 14✅ 10ms
ACATCore.Tests.Configuration.ThemeJsonTests 5✅ 5ms
ACATCore.Tests.Configuration.ThemeValidatorTests 9✅ 19ms

✅ ACATCore.Tests.Configuration.AbbreviationsJsonTests

✅ AbbreviationsClassCanLoadFromJson
✅ AbbreviationsClassCanSaveToJson
✅ CanCreateDefaultAbbreviations
✅ CanDeserializeFromJson
✅ CanLoadAndSaveJsonConfiguration
✅ CanSerializeToJson
✅ ValidatorAcceptsValidConfiguration
✅ ValidatorRejectsEmptyWord
✅ ValidatorRejectsInvalidMode

✅ ACATCore.Tests.Configuration.ActuatorSettingsConverterTests

✅ ConvertInvalidGuidHandlesGracefully
✅ ConvertJsonListToLegacyList
✅ ConvertJsonToLegacy_BasicProperties
✅ ConvertJsonToLegacy_SwitchSettings
✅ ConvertLegacyListToJson
✅ ConvertLegacyToJson_BasicProperties
✅ ConvertLegacyToJson_SwitchSettings
✅ ConvertNullJsonReturnsEmpty
✅ ConvertNullLegacyListReturnsEmptyJson
✅ ConvertNullStringsHandlesGracefully
✅ RoundTripConversion_PreservesData

✅ ACATCore.Tests.Configuration.ActuatorSettingsJsonTests

✅ CanCreateDefaultSettings
✅ CanDeserializeFromJson
✅ CanSerializeToJson
✅ FactoryMethodCreatesBCIActuator
✅ FactoryMethodCreatesCameraActuator
✅ FactoryMethodCreatesKeyboardActuator
✅ RoundTripSerializationPreservesData
✅ SwitchFactoryCreatesTriggerSwitch

✅ ACATCore.Tests.Configuration.ActuatorSettingsValidatorTests

✅ DuplicateActuatorIdsFails
✅ DuplicateSwitchNamesWithinActuatorFails
✅ EmptyActuatorNameFails
✅ EmptyActuatorSettingsListFails
✅ EnabledActuatingSwitchWithoutCommandFails
✅ EnabledActuatorWithoutEnabledSwitchFails
✅ InvalidGuidFails
✅ NoEnabledActuatorsFails
✅ NullActuatorSettingsListFails
✅ ValidSettingsPass

✅ ACATCore.Tests.Configuration.ConfigurationEnhancementsTests

✅ ConfigurationReloadService_FileChanged_RaisesEvent
✅ ConfigurationReloadService_StartMonitoring_ValidFile_Success
✅ ConfigurationReloadService_StopMonitoring_StopsEvents
✅ ConfigurationVersion_IsCompatibleWith_SameMajor_ReturnsTrue
✅ ConfigurationVersion_IsNewerThan_NewerVersion_ReturnsTrue
✅ ConfigurationVersion_Parse_ValidVersion_Success
✅ ConfigurationVersionManager_GetVersion_FileWithVersion_ReturnsVersion
✅ ConfigurationVersionManager_NeedsMigration_OlderVersion_ReturnsTrue
✅ EnvironmentConfiguration_DetectEnvironment_CaseInsensitive
✅ EnvironmentConfiguration_DetectEnvironment_DefaultsToProduction
✅ EnvironmentConfiguration_DetectEnvironment_FallsBackToAspNetCoreEnvironment
✅ EnvironmentConfiguration_DetectEnvironment_FallsBackToDotnetEnvironment
✅ EnvironmentConfiguration_DetectEnvironment_FromACATEnvironmentVar_Development
✅ EnvironmentConfiguration_DetectEnvironment_FromACATEnvironmentVar_Production
✅ EnvironmentConfiguration_DetectEnvironment_FromACATEnvironmentVar_Staging
✅ EnvironmentConfiguration_DetectEnvironment_FromACATEnvironmentVar_Testing
✅ EnvironmentConfiguration_GetConfigurationFiles_AllThreeLayers_ReturnsAll
✅ EnvironmentConfiguration_GetConfigurationFiles_BaseAndEnv_ReturnsBoth
✅ EnvironmentConfiguration_GetConfigurationFiles_BaseOnly_ReturnsBase
✅ EnvironmentConfiguration_GetConfigurationFiles_LocalOverrideOnly_ReturnsBaseAndLocal
✅ EnvironmentConfiguration_GetEnvironmentFilePath_DevelopmentFile_ReturnsDevPath
✅ EnvironmentConfiguration_GetEnvironmentFilePath_NoEnvFile_ReturnsBasePath
✅ EnvironmentConfiguration_GetLocalOverrideFilePath_NullInput_ReturnsNull
✅ EnvironmentConfiguration_GetLocalOverrideFilePath_ReturnsLocalJson
✅ EnvironmentConfiguration_SetGetOverride_StoresValue
✅ JsonConfigurationLoader_EnableHotReload_LoadsAndReloads
✅ JsonConfigurationLoader_LoadWithEnvironment_LoadsDevConfig
✅ JsonSchemaValidator_LoadSchema_ValidSchema_Success
✅ JsonSchemaValidator_Validate_MissingRequired_Fails
✅ JsonSchemaValidator_Validate_Performance_CompletesWithin100ms
✅ JsonSchemaValidator_Validate_ValidJson_Success

✅ ACATCore.Tests.Configuration.ConfigurationMigrationTests

✅ AbbreviationsJson_HasVersionField_DefaultsTo_1_0_0
✅ ActuatorSettingsJson_HasVersionField_DefaultsTo_1_0_0
✅ GetBackups_AfterMigration_ReturnsAtLeastOneBackup
✅ GetBackups_NoMigrationDone_ReturnsEmpty
✅ GetVersion_FileWithNoVersionField_Returns_1_0_0
✅ GetVersion_FileWithVersionField_ReturnsParsedVersion
✅ MigrateIfNeeded_AppliesMigration_UpdatesVersionInFile
✅ MigrateIfNeeded_FailingMigration_RollsBackToOriginal
✅ MigrateIfNeeded_FileNotFound_ReturnsFailure
✅ MigrateIfNeeded_NoMigrationNeeded_ReturnsSuccessWithoutModifying
✅ MigrateIfNeeded_ReturnsCorrectFromAndToVersions
✅ MigrateIfNeeded_WithBackup_BackupContainsOriginalContent
✅ MigrateIfNeeded_WithBackup_CreatesBackupFile
✅ MigrateIfNeeded_WithoutBackup_NoBackupFileCreated
✅ MigrationBase_BuildMigratedElement_PreservesExistingProperties
✅ MigrationBase_BuildMigratedElement_SetsVersionToToVersion
✅ NeedsMigration_FileVersionMatchesCurrent_ReturnsFalse
✅ NeedsMigration_FileVersionOlderThanCurrent_ReturnsTrue
✅ NeedsMigration_NoVersionField_DefaultsTo_1_0_0_AndDetectsMigration
✅ PanelConfigJson_HasVersionField_DefaultsTo_1_0_0
✅ PreferredWordPredictorsJson_HasVersionField_DefaultsTo_1_0_0
✅ PronunciationsJson_HasVersionField_DefaultsTo_1_0_0
✅ Rollback_MissingBackupFile_ReturnsFalse
✅ Rollback_ValidBackup_RestoresFile
✅ ThemeJson_HasVersionField_DefaultsTo_1_0_0

✅ ACATCore.Tests.Configuration.ConfigurationWatcherTests

✅ ConfigurationChanged_EventArgs_ContainsExpectedData
✅ ConfigurationChangeFailed_EventArgs_ContainsErrorMessage
✅ Constructor_EmptyDirectory_ThrowsArgumentNullException
✅ Constructor_NullDirectory_ThrowsArgumentNullException
✅ Constructor_ValidDirectory_CreatesInstance
✅ Dispose_StopsWatching
✅ FileChanged_AfterStop_DoesNotRaiseEvent
✅ FileChanged_CancelledByChangingEvent_RaisesFailedEvent
✅ FileChanged_RaisesConfigurationChangedEvent
✅ FileChanged_ValidationCallbackThrows_RaisesFailedEvent
✅ FileChanged_ValidationFails_RaisesFailedEvent
✅ FileChanged_ValidationPasses_RaisesChangedEvent
✅ RapidChanges_AreDebounced_SingleEventRaised
✅ Start_AlreadyWatching_ReturnsTrue
✅ Start_ExistingDirectory_ReturnsTrue
✅ Start_NonExistentDirectory_ReturnsFalse
✅ Stop_WhileWatching_StopsWatcher

✅ ACATCore.Tests.Configuration.ContextDependencyInjectionTests

✅ Context_AndIContext_ResolveSameSingletonInstance
✅ GetManager_MultipleManagers_AllResolvable
✅ GetManager_UnregisteredService_ReturnsNull
✅ GetManager_WithConfiguredServiceProvider_ReturnsManager
✅ GetManager_WithConfiguredServiceProvider_ReturnsSameInstanceAsDirect
✅ GetManager_WithNullServiceProvider_ThrowsInvalidOperationException
✅ IContext_ResolvedFromServiceProvider_IsNotNull
✅ IContext_ResolvingSetsStaticServiceProvider
✅ ServiceProvider_CanBeSet_AndRetrieved
✅ ServiceProvider_CanBeSetToNull

✅ ACATCore.Tests.Configuration.ContextLoggerTests

✅ GetLogger_AfterServiceProviderChange_UsesNewProvider
✅ GetLogger_CanLog_NoExceptions
✅ GetLogger_DifferentTypes_ReturnsDifferentCategories
✅ GetLogger_Generic_ReturnsTypedLogger
✅ GetLogger_SameType_ReturnsSameLoggerCategory
✅ GetLogger_WithNullType_ThrowsArgumentNullException
✅ GetLogger_WithType_ReturnsLogger
✅ LogManager_GetLogger_Generic_ReturnsTypedLogger
✅ LogManager_GetLogger_ReturnsValidLogger
✅ LogManager_GetLogger_WithNullType_ThrowsArgumentNullException

✅ ACATCore.Tests.Configuration.ContextThreadSafetyTests

✅ GetLogger_ConcurrentAccess_AllThreadsGetValidLogger
✅ GetManager_ConcurrentAccess_AllThreadsGetSameInstance
✅ GetManager_ConcurrentWithServiceProviderChange_NoExceptions
✅ MultipleManagers_ConcurrentAccess_AllReturnCorrectTypes
✅ ServiceProvider_ConcurrentSet_NoExceptions
✅ ServiceProvider_RapidSetAndGet_NoDeadlock

✅ ACATCore.Tests.Configuration.CQRSPatternTests

✅ CreatePanelCommand_DefaultStartupArgIsNull
✅ CreatePanelCommand_DefaultTitleIsNull
✅ CreatePanelCommand_ImplementsICommand
✅ CreatePanelCommand_StoresPanelClass
✅ CreatePanelCommand_StoresTitleAndStartupArg
✅ GetActiveAgentNameQuery_ImplementsIQuery
✅ GetActiveAgentNameQueryHandler_ReturnsAgentName
✅ GetActiveAgentNameQueryHandler_ReturnsEmptyStringWhenNoAgent
✅ GetConfigurationValueQuery_ImplementsIQuery
✅ GetConfigurationValueQuery_StoresKey
✅ GetConfigurationValueQueryHandler_ReturnsNullForMissingKey
✅ GetConfigurationValueQueryHandler_ReturnsStoredOverrideValue
✅ GetConfigurationValueQueryHandler_ReturnsUpdatedValue_AfterOverrideChanges
✅ HandleActuatorSwitchCommand_ImplementsICommand
✅ HandleActuatorSwitchCommand_StoresPauseAction
✅ HandleActuatorSwitchCommand_StoresResumeAction
✅ HandleActuatorSwitchCommandHandler_Pause_CallsPauseOnManager
✅ HandleActuatorSwitchCommandHandler_Resume_CallsResumeOnManager

✅ ACATCore.Tests.Configuration.ExtensionLoadingIntegrationTests

✅ ExtensionInstantiator_CreateSingleExtension_WithNullType_ReturnsNull
✅ ExtensionInstantiator_WithNullExtensionTypes_ReturnsEmptyList
✅ ExtensionInstantiator_WithNullServiceProvider_ThrowsArgumentNullException
✅ ExtensionInstantiator_WithServiceProvider_CanCreateExtensions
✅ ExtensionLoader_AddExtensionLoader_RegistersIExtensionLoaderAsSingleton
✅ ExtensionLoader_Constructor_WithNullServiceProvider_ThrowsArgumentNullException
✅ ExtensionLoader_Constructor_WithServiceProvider_Succeeds
✅ ExtensionLoader_CreateAllInstances_WithNoTypesLoaded_ReturnsEmptyCollection
✅ ExtensionLoader_CreateInstance_WithUnknownGuid_ReturnsNull
✅ ExtensionLoader_ImplementsIExtensionLoader
✅ ExtensionLoader_LoadedTypes_IsEmptyBeforeLoadingAssemblies
✅ ExtensionLoader_RegisterExtensions_WithNoLoadedTypes_LeavesServicesUnchanged
✅ ExtensionLoader_RegisterExtensions_WithNullServices_ThrowsArgumentNullException
✅ ServiceProvider_CanCreateLoggers
✅ ServiceProvider_CanResolveLoggerFactory
✅ ServiceProvider_IsAvailableInContext_AfterSetup

✅ ACATCore.Tests.Configuration.FactoryRegistrationTests

✅ AbbreviationsManagerFactory_FromDI_CreatesManager
✅ ActuatorManagerFactory_FromDI_CreatesManager
✅ AddACATServices_RegistersAllFactories
✅ AgentManagerFactory_FromDI_CreatesManager
✅ AutomationEventManagerFactory_FromDI_CreatesManager
✅ CommandManagerFactory_FromDI_CreatesManager
✅ Factory_CreatedManager_MatchesDIResolvedManager
✅ Factory_MultipleCalls_ReturnsSameInstance
✅ PanelManagerFactory_FromDI_CreatesManager
✅ SpellCheckManagerFactory_FromDI_CreatesManager
✅ ThemeManagerFactory_FromDI_CreatesManager
✅ TTSManagerFactory_FromDI_CreatesManager
✅ WordPredictionManagerFactory_FromDI_CreatesManager

✅ ACATCore.Tests.Configuration.JsonConfigurationLoaderTests

✅ CreateDefaultCallsStaticFactoryMethod
✅ GetValidationErrorMessageReturnsEmptyForValidConfig
✅ GetValidationErrorMessageReturnsMessageForInvalidConfig
✅ LoadEmptyFileCreatesDefault
✅ LoadHandlesJsonCommentsAndTrailingCommas
✅ LoadInvalidJsonCreatesDefault
✅ LoadNonExistentFileCreatesDefault
✅ LoadNonExistentFileReturnsNullWhenCreateDefaultFalse
✅ LoadValidatesWithValidator
✅ LoadWithSchemaValidator_NonStrictMode_InvalidJson_StillDeserializes
✅ LoadWithSchemaValidator_StrictMode_InvalidJson_ReturnsDefault
✅ LoadWithSchemaValidator_ValidJson_LoadsSuccessfully
✅ SaveAndLoadRoundTrip
✅ SaveCreatesDirectoryIfNotExists
✅ SaveValidatesBeforeSaving

✅ ACATCore.Tests.Configuration.ManagerFactoryTests

✅ AbbreviationsManagerFactory_Create_ReturnsInstance
✅ ActuatorManagerFactory_Create_ReturnsInstance
✅ AgentManagerFactory_Create_ReturnsInstance
✅ AutomationEventManagerFactory_Create_ReturnsInstance
✅ CommandManagerFactory_Create_ReturnsInstance
✅ Factory_Create_ReturnsSameInstanceAsDirectResolution
✅ PanelManagerFactory_Create_ReturnsInstance
✅ ServiceConfiguration_RegistersAllFactories
✅ SpellCheckManagerFactory_Create_ReturnsInstance
✅ ThemeManagerFactory_Create_ReturnsInstance
✅ TTSManagerFactory_Create_ReturnsInstance
✅ WordPredictionManagerFactory_Create_ReturnsInstance

✅ ACATCore.Tests.Configuration.PanelConfigJsonTests

✅ CanCreateSimpleMenu
✅ CanDeserializeComplexPanel
✅ CanDeserializeFontSizeAsNumber
✅ CanDeserializeFontSizeAsString
✅ CanDeserializeFromJson
✅ CanSerializeToJson

✅ ACATCore.Tests.Configuration.PanelConfigValidatorTests

✅ DuplicateAnimationNamesFails
✅ DuplicateWidgetAttributeNamesFails
✅ EmptyAnimationStepsFails
✅ EmptyAnimationStepWidgetNameFails
✅ EmptyColorSchemeFails
✅ EmptyWidgetClassFails
✅ EmptyWidgetNameFails
✅ NullLayoutFails
✅ NullWidgetAttributesFails
✅ ValidPanelConfigPasses

✅ ACATCore.Tests.Configuration.PreferredWordPredictorsJsonTests

✅ CanCreateDefaultPreferredWordPredictors
✅ CanDeserializeFromJson
✅ CanLoadAndSaveJsonConfiguration
✅ CanSerializeToJson
✅ ConverterHandlesEmptyList
✅ ConverterHandlesNullList
✅ PreferredWordPredictorsCanLoadFromJson
✅ PreferredWordPredictorsCanSaveToJson
✅ ValidatorAcceptsValidConfiguration
✅ ValidatorRejectsEmptyLanguage
✅ ValidatorRejectsInvalidGuid

✅ ACATCore.Tests.Configuration.PronunciationsJsonTests

✅ BackwardCompatibilityWithXml
✅ CanCreateDefaultPronunciations
✅ CanDeserializeFromJson
✅ CanLoadAndSaveJsonConfiguration
✅ CanSerializeToJson
✅ PronunciationsClassCanLoadFromJson
✅ PronunciationsClassCanSaveToJson
✅ ValidatorAcceptsValidConfiguration
✅ ValidatorRejectsEmptyPronunciation
✅ ValidatorRejectsEmptyWord

✅ ACATCore.Tests.Configuration.ServiceConfigurationTests

✅ AddACATInfrastructure_AllowsChaining
✅ AddACATInfrastructure_ConfiguresLoggingAndServices
✅ AddACATInfrastructure_WithNullServices_ThrowsArgumentNullException
✅ AddACATServices_AllowsChaining
✅ AddACATServices_InterfaceAndConcreteTypeResolveToSameInstance
✅ AddACATServices_RegistersAllManagerInterfaces
✅ AddACATServices_RegistersAllManagers
✅ AddACATServices_RegistersManagersAsSingletons
✅ AddACATServices_WithNullServices_ThrowsArgumentNullException
✅ CreateServiceProvider_ReturnsConfiguredProvider
✅ CreateServiceProvider_WithLoggerFactory_UsesProvidedFactory
✅ CreateServiceProvider_WithNullLoggerFactory_ThrowsArgumentNullException

✅ ACATCore.Tests.Configuration.ServiceLifetimeTests

✅ AbbreviationsManager_MultipleCalls_ReturnsSameInstance
✅ ActuatorManager_MultipleCalls_ReturnsSameInstance
✅ AgentManager_MultipleCalls_ReturnsSameInstance
✅ AllFactories_AreRegisteredAsSingletons
✅ AllManagers_AreRegisteredAsSingletons
✅ AutomationEventManager_MultipleCalls_ReturnsSameInstance
✅ CommandManager_MultipleCalls_ReturnsSameInstance
✅ MultipleServiceProviders_ShareGlobalSingletonInstances
✅ PanelManager_MultipleCalls_ReturnsSameInstance
✅ Singletons_SharedAcrossNestedScopes
✅ SpellCheckManager_MultipleCalls_ReturnsSameInstance
✅ ThemeManager_MultipleCalls_ReturnsSameInstance
✅ TTSManager_MultipleCalls_ReturnsSameInstance
✅ WordPredictionManager_MultipleCalls_ReturnsSameInstance

✅ ACATCore.Tests.Configuration.ThemeJsonTests

✅ CanCreateDefaultTheme
✅ CanDeserializeFromJson
✅ CanSerializeToJson
✅ FactoryMethodCreatesScanner
✅ FactoryMethodCreatesScannerButton

✅ ACATCore.Tests.Configuration.ThemeValidatorTests

✅ DuplicateColorSchemeNamesFails
✅ EmptyColorSchemesFails
✅ EmptyDescriptionFails
✅ InvalidColorFormatFails
✅ MissingBackgroundAndImageFails
✅ NullColorSchemesFails
✅ ValidColorNamePasses
✅ ValidHexColorPasses
✅ ValidThemePass

✅ src/TestResults/integration-results.trx

28 tests were completed in 43s with 27 passed, 0 failed and 1 skipped.

Test suite Passed Failed Skipped Time
ACATCore.Tests.Integration.ConfigurationValidationIntegrationTests 8✅ 99ms
ACATCore.Tests.Integration.FreshInstallIntegrationTests 5✅ 456ms
ACATCore.Tests.Integration.LoggingProductionIntegrationTests 7✅ 1⚪ 41s
ACATCore.Tests.Integration.XmlMigrationIntegrationTests 7✅ 50ms

✅ ACATCore.Tests.Integration.ConfigurationValidationIntegrationTests

✅ ConfigValidation_DefaultsCreatedOnError
✅ CorruptedConfigFile_ProducesUserFriendlyError
✅ EmptyConfigFile_HandledGracefully
✅ InvalidJson_LoadReturnsGracefulError
✅ InvalidJsonSchema_ValidationDetectsErrors
✅ MissingConfigFile_FallsBackToDefaults
✅ MissingRequiredFields_ValidationFails
✅ ReadOnlyConfigFile_ErrorHandledGracefully

✅ ACATCore.Tests.Integration.FreshInstallIntegrationTests

✅ FreshInstall_DefaultDirectoryStructureCreated
✅ FreshInstall_DefaultJsonConfigsCreated
✅ FreshInstall_LogFilesCreatedInCorrectLocation
✅ FreshInstall_LoggingInitializationSucceeds
✅ FreshInstall_VerifyMinimalFileCount

✅ ACATCore.Tests.Integration.LoggingProductionIntegrationTests

⚪ ContinuousLogging_PerformanceImpactMinimal
✅ ExceptionLogging_WorksInProduction
✅ HighVolumeLogging_NoMemoryLeaks
✅ LogFileCreation_SucceedsInProductionScenario
✅ LogFileRotation_HandlesLargeFiles
✅ LoggingPerformanceTest
✅ ProductionLogLevels_ConfiguredCorrectly
✅ StructuredLogging_PerformanceAcceptable

✅ ACATCore.Tests.Integration.XmlMigrationIntegrationTests

✅ MigratedJson_LoadsSuccessfully
✅ MigrationResult_ReportsSuccessCount
✅ MigrationTool_HandlesMultipleConfigFiles
✅ XmlBackup_PreservedAfterMigration
✅ XmlMigration_AllSettingsPreserved
✅ XmlToJson_ActuatorSettingsMigrated
✅ XmlToJson_ThemeSettingsMigrated

✅ src/TestResults/logging-results.trx

25 tests were completed in 3s with 25 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
ACATCore.Tests.Logging.CachedLogBehaviorTests 7✅ 710ms
ACATCore.Tests.Logging.LoggingPerformanceTests 7✅ 63ms
ACATCore.Tests.Logging.ModernLoggingConfigTests 11✅ 12ms

✅ ACATCore.Tests.Logging.CachedLogBehaviorTests

✅ EmptyCachedLogCanBeSavedWithoutError
✅ LogEntryMethodAcceptsTypeAndData
✅ MultipleEntriesCanBeAddedBeforeSave
✅ NewCachedLogInstanceCreatesSuccessfully
✅ SaveOperationReturnsTrue
✅ SpecialCharactersInDataAreHandled
✅ SubsequentSavesAppendToExistingFile

✅ ACATCore.Tests.Logging.LoggingPerformanceTests

✅ ConcurrentLoggingFromMultipleThreadsSucceeds
✅ HighVolumeLoggingCompletesQuickly
✅ LoggerFactoryCreationIsConsistent
✅ ParallelLoggingWithExceptionsHandled
✅ RapidSequentialCallsComplete
✅ SharedLoggerFactoryWritesToSameFile
✅ SingleLogCallReturnsQuickly

✅ ACATCore.Tests.Logging.ModernLoggingConfigTests

✅ CategoryNameLoggerCreationSucceeds
✅ DebugLevelLoggingAccepted
✅ ErrorLevelLoggingAccepted
✅ ExceptionLoggingWithMessageWorks
✅ FactoryCanCreateMultipleLoggers
✅ GenericLoggerCreationSucceeds
✅ InformationLevelLoggingAccepted
✅ LoggerFactoryCreationSucceeds
✅ MultipleLoggerInstancesCoexist
✅ StructuredLoggingWithParametersWorks
✅ WarningLevelLoggingAccepted

✅ src/TestResults/migration-results.trx

11 tests were completed in 4s with 9 passed, 0 failed and 2 skipped.

Test suite Passed Failed Skipped Time
ACAT.ConfigMigrationTool.Tests.ConfigurationMigratorTests 5✅ 2⚪ 4s
ACAT.ConfigMigrationTool.Tests.XmlDeserializersTests 4✅ 951ms

✅ ACAT.ConfigMigrationTool.Tests.ConfigurationMigratorTests

✅ MigrateAsync_EmptyDirectory_ReturnsZeroFiles
✅ MigrateAsync_WithBackup_CreatesBackupFiles
⚪ MigrateAsync_WithDryRun_NoFilesCreated
⚪ MigrateAsync_WithValidActuatorSettings_Success
✅ RollbackAsync_WithBackupFiles_RestoresOriginals
✅ ValidateAsync_InvalidJson_ReportsError
✅ ValidateAsync_ValidJson_Success

✅ ACAT.ConfigMigrationTool.Tests.XmlDeserializersTests

✅ DeserializeActuatorSettings_InvalidFormat_ThrowsException
✅ DeserializeActuatorSettings_ValidXml_Success
✅ DeserializePanelConfig_ValidXml_Success
✅ DeserializeTheme_ValidXml_Success

✅ src/TestResults/performance-results.trx

45 tests were completed in 3s with 45 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
ACATCore.Tests.Performance.MemoryProfilerTests 7✅ 32ms
ACATCore.Tests.Performance.PerformanceRegressionDetectorTests 18✅ 347ms
ACATCore.Tests.Performance.RuntimeMetricCategoryTests 12✅ 9ms
ACATCore.Tests.Performance.RuntimeMetricsCollectorTests 8✅ 2s

✅ ACATCore.Tests.Performance.MemoryProfilerTests

✅ CaptureSnapshot_ReturnsValidSnapshot
✅ CaptureSnapshot_StoredInList
✅ ClearSnapshots_RemovesAll
✅ CompareSnapshots_ReturnsReport
✅ IsPotentialLeak_AboveThreshold_ReturnsTrue
✅ IsPotentialLeak_BelowThreshold_ReturnsFalse
✅ IsPotentialLeak_NullArguments_ReturnsFalse

✅ ACATCore.Tests.Performance.PerformanceRegressionDetectorTests

✅ CommittedBaselineFile_ContainsAllRequiredThresholds
✅ CommittedBaselineFile_DetectorIdentifiesRegressions
✅ CommittedBaselineFile_Exists
✅ CommittedBaselineFile_LoadsSuccessfully
✅ CommittedBaselineFile_ThresholdValuesMatchTargets
✅ CreateDefault_ContainsExpectedThresholds
✅ DetectRegressions_MultipleMetrics_FindsOnlyExceeded
✅ DetectRegressions_NullInput_ReturnsEmptyList
✅ GenerateReport_AlertContent_IncludesExceedanceAndUnit
✅ GenerateReport_NoRegressions_IndicatesPass
✅ GenerateReport_WithRegressions_IncludesMetricName
✅ IsRegression_AboveThreshold_ReturnsTrue
✅ IsRegression_BelowThreshold_ReturnsFalse
✅ IsRegression_UnknownMetric_ReturnsFalse
✅ Load_MissingFile_ReturnsDefault
✅ PerformanceBaseline_Save_CreatesDirectory
✅ RegressionResult_ToString_ContainsKeyInfo
✅ SaveAndLoad_RoundTrip_PreservesThresholds

✅ ACATCore.Tests.Performance.RuntimeMetricCategoryTests

✅ Record_AllCategories_AllStoredIndependently
✅ Record_CpuMetric_CategoryPreserved
✅ Record_IoOperation_CategoryPreserved
✅ Record_MemoryMetric_CategoryPreserved
✅ Record_MemoryMetric_MultipleValues_AggregatesCorrectly
✅ Record_MultipleIoOperations_StoredSeparately
✅ Record_PredictionLatency_CategoryPreserved
✅ Record_PredictionLatency_MultipleValues_AggregatesCorrectly
✅ Record_ResumedAfterReenable_EntryAdded
✅ Record_SkippedWhenCategoryDisabled_NoEntryAdded
✅ Record_UiInputLag_CategoryAndUnitPreserved
✅ Record_UiInputLag_MultipleValues_AggregatesCorrectly

✅ ACATCore.Tests.Performance.RuntimeMetricsCollectorTests

✅ Dispose_StopsSampling
✅ Record_CategoryAndUnitPreserved
✅ Record_MultipleValues_AggregatesCorrectly
✅ Record_NullOrEmptyName_DoesNotThrow
✅ Record_SingleValue_StoresEntry
✅ Start_CollectsSamplesOverTime
✅ Start_PeriodicSamplesPopulateNamedEntries
✅ Start_SamplesHavePositiveWorkingSet