Deploy SWA to staging environment#228
Merged
Merged
GitHub Actions / .NET Tests
succeeded
Apr 17, 2026 in 0s
710 passed, 0 failed and 0 skipped
✅ TestResults/_runnervmeorf1_2026-04-17_13_06_18.trx
710 tests were completed in 7s with 710 passed, 0 failed and 0 skipped.
✅ UnitTests.API.DependencyInjectionTests
✅ ApiDefaults_WhenInvalidAzureConfiguration_ExceptionThrownDuringServiceCreation
✅ ApiDefaults_WhenServicesRegistered_AllRequiredServicesAreRegistered
✅ ApiDefaults_WhenServicesRegistered_CanCreateControllerWithDependencies
✅ ApiDefaults_WhenServicesRegistered_CanResolveAllEventHandlers
✅ ApiDefaults_WhenServicesRegistered_CanResolveApplicationServices
✅ ApiDefaults_WhenServicesRegistered_CanResolveAzureStorageService
✅ ApiDefaults_WhenServicesRegistered_CanResolveDomainEventHandlers
✅ ApiDefaults_WhenServicesRegistered_CanResolveGamesController
✅ ApiDefaults_WhenServicesRegistered_CanResolveInfrastructureServices
✅ ApiDefaults_WhenServicesRegistered_CanResolveMediatRHandlers
✅ ApiDefaults_WhenServicesRegistered_CanResolvePlayersController
✅ ApiDefaults_WhenServicesRegistered_CanResolvePuzzleServices
✅ ApiDefaults_WhenServicesRegistered_VerifyServiceLifetimes
✅ UnitTests.API.GameActionsControllerTests
✅ MakeMoveAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ MakeMoveAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ MakeMoveAsync_WhenMakeMoveReturnsFailed_ReturnsBadRequest
✅ MakeMoveAsync_WithEmptyAlias_ReturnsBadRequest
✅ MakeMoveAsync_WithEmptyGameId_ReturnsBadRequest
✅ MakeMoveAsync_WithValidParameters_ReturnsNoContent
✅ ResetGameAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ ResetGameAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ ResetGameAsync_WhenResetGameReturnsFailed_ReturnsBadRequest
✅ ResetGameAsync_WithEmptyAlias_ReturnsBadRequest
✅ ResetGameAsync_WithEmptyGameId_ReturnsBadRequest
✅ ResetGameAsync_WithValidParameters_ReturnsNoContent
✅ UndoMoveAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ UndoMoveAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ UndoMoveAsync_WhenUndoLastMoveReturnsFailed_ReturnsBadRequest
✅ UndoMoveAsync_WithEmptyAlias_ReturnsBadRequest
✅ UndoMoveAsync_WithEmptyGameId_ReturnsBadRequest
✅ UndoMoveAsync_WithValidParameters_ReturnsNoContent
✅ UnitTests.API.GamesControllerTests
✅ CreateGameAsync_WhenServiceReturnsFailed_ReturnsBadRequest
✅ CreateGameAsync_WithEmptyAlias_ReturnsBadRequest
✅ CreateGameAsync_WithEmptyDifficulty_ReturnsBadRequest
✅ CreateGameAsync_WithValidParameters_ReturnsCreatedAtAction
✅ DeleteAllGamesAsync_WhenServiceReturnsFailed_ReturnsBadRequest
✅ DeleteAllGamesAsync_WithEmptyAlias_ReturnsBadRequest
✅ DeleteAllGamesAsync_WithValidAlias_ReturnsNoContent
✅ DeleteGameAsync_WhenDeleteGameReturnsFailed_ReturnsBadRequest
✅ DeleteGameAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ DeleteGameAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ DeleteGameAsync_WithEmptyAlias_ReturnsBadRequest
✅ DeleteGameAsync_WithEmptyGameId_ReturnsBadRequest
✅ DeleteGameAsync_WithValidParameters_ReturnsNoContent
✅ GetAllGamesAsync_WhenServiceReturnsFailed_ReturnsBadRequest
✅ GetAllGamesAsync_WithEmptyAlias_ReturnsBadRequest
✅ GetAllGamesAsync_WithValidAlias_ReturnsOkWithGames
✅ GetGameAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ GetGameAsync_WhenServiceReturnsFailed_ReturnsBadRequest
✅ GetGameAsync_WithEmptyAlias_ReturnsBadRequest
✅ GetGameAsync_WithEmptyGameId_ReturnsBadRequest
✅ GetGameAsync_WithValidParameters_ReturnsOkWithGame
✅ UnitTests.API.GameStatusControllerTests
✅ UpdateGameStatusAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ UpdateGameStatusAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ UpdateGameStatusAsync_WhenUpdateGameStatusReturnsFailed_ReturnsBadRequest
✅ UpdateGameStatusAsync_WithEmptyAlias_ReturnsBadRequest
✅ UpdateGameStatusAsync_WithEmptyGameId_ReturnsBadRequest
✅ UpdateGameStatusAsync_WithValidParameters_ReturnsNoContent
✅ ValidateGameAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ ValidateGameAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ ValidateGameAsync_WhenValidateGameReturnsFailed_ReturnsBadRequest
✅ ValidateGameAsync_WithEmptyAlias_ReturnsBadRequest
✅ ValidateGameAsync_WithEmptyGameId_ReturnsBadRequest
✅ ValidateGameAsync_WithValidParameters_ReturnsOkWithValidationResult
✅ UnitTests.API.PlayersControllerTests
✅ CreatePlayerAsync_WhenServiceReturnsFailed_ReturnsBadRequest
✅ CreatePlayerAsync_WhenServiceReturnsSuccess_ReturnsCreatedAlias
✅ CreatePlayerAsync_WithCustomAlias_PassesAliasToService
✅ PlayerExistsAsync_WhenServiceFails_ReturnsBadRequest
✅ PlayerExistsAsync_WithEmptyAlias_ReturnsBadRequest
✅ PlayerExistsAsync_WithValidAlias_ReturnsOkWithResult
✅ UnitTests.API.PossibleValuesControllerTests
✅ AddPossibleValueAsync_WhenAddPossibleValueFails_ReturnsBadRequest
✅ AddPossibleValueAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ AddPossibleValueAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ AddPossibleValueAsync_WithEmptyAlias_ReturnsBadRequest
✅ AddPossibleValueAsync_WithEmptyGameId_ReturnsBadRequest
✅ AddPossibleValueAsync_WithValidParameters_ReturnsNoContent
✅ ClearPossibleValuesAsync_WhenClearPossibleValuesFails_ReturnsBadRequest
✅ ClearPossibleValuesAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ ClearPossibleValuesAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ ClearPossibleValuesAsync_WithEmptyAlias_ReturnsBadRequest
✅ ClearPossibleValuesAsync_WithEmptyGameId_ReturnsBadRequest
✅ ClearPossibleValuesAsync_WithValidParameters_ReturnsNoContent
✅ RemovePossibleValueAsync_WhenGameBelongsToAnotherPlayer_ReturnsNotFound
✅ RemovePossibleValueAsync_WhenGetGameReturnsFailed_ReturnsBadRequest
✅ RemovePossibleValueAsync_WhenRemovePossibleValueFails_ReturnsBadRequest
✅ RemovePossibleValueAsync_WithEmptyAlias_ReturnsBadRequest
✅ RemovePossibleValueAsync_WithEmptyGameId_ReturnsBadRequest
✅ RemovePossibleValueAsync_WithValidParameters_ReturnsNoContent
✅ UnitTests.Application.Common.ResultOfTTests
✅ Failure_WithEmptyErrorList_CreatesFailureResult
✅ Failure_WithMultipleErrors_CreatesFailureResult
✅ Failure_WithSingleError_CreatesFailureResult
✅ Map_WhenFailure_PreservesError
✅ Map_WhenFailureWithMultipleErrors_PreservesAllErrors
✅ Map_WhenSuccessful_TransformsValue
✅ Map_WithComplexTransformation_WorksCorrectly
✅ Success_WithNullValue_CreatesSuccessfulResult
✅ Success_WithValue_CreatesSuccessfulResult
✅ UnitTests.Application.Common.ResultTests
✅ Failure_WithEmptyErrorList_CreatesFailureResult
✅ Failure_WithMultipleErrors_CreatesFailureResult
✅ Failure_WithSingleError_CreatesFailureResult
✅ Success_CreatesSuccessfulResult
✅ UnitTests.Application.DTOs.GameDtoTests
✅ Constructor_WithAllParameters_CreatesCorrectDto
✅ FromGame_MapsAllCellsCorrectly
✅ FromGame_MapsMoveHistoryCorrectly
✅ FromGame_MapsStatisticsCorrectly
✅ FromGame_WithPausedGame_IncludesPausedAt
✅ FromGame_WithStartedGame_IncludesStartedAt
✅ FromGame_WithValidGame_CreatesCorrectDto
✅ UnitTests.Application.Handlers.CreateGameCommandHandlerTests
✅ Handle_CallsRepositoryWithCorrectParameters
✅ Handle_WhenDomainExceptionThrown_ReturnsFailureWithDomainMessage
✅ Handle_WhenNoPuzzleAvailable_ReturnsFailureResult
✅ Handle_WhenRepositoryThrowsException_ReturnsFailureResult
✅ Handle_WithInvalidDifficulty_ReturnsFailureResult
✅ Handle_WithInvalidPlayerAlias_ReturnsFailureResult
✅ Handle_WithValidCommand_ReturnsSuccessResult
✅ UnitTests.Application.Handlers.DeleteGameCommandHandlerTests
✅ Handle_WithValidGameId_ReturnsSuccessResult
✅ UnitTests.Application.Handlers.DeletePlayerGamesCommandHandlerTests
✅ Handle_CallsDeleteAsyncForEachGame
✅ Handle_LogsInformationWithGameCount
✅ Handle_WhenDomainExceptionThrown_ReturnsFailureResult
✅ Handle_WhenRepositoryThrowsException_ReturnsFailureResult
✅ Handle_WithNoGames_ReturnsSuccessResult
✅ Handle_WithValidPlayerAlias_ReturnsSuccessResult
✅ UnitTests.Application.Handlers.GetGameQueryHandlerTests
✅ Handle_CallsRepositoryWithCorrectGameId
✅ Handle_ReturnsCorrectGameDto
✅ Handle_WhenDomainExceptionThrown_ReturnsFailureWithDomainMessage
✅ Handle_WhenGameNotFound_ReturnsFailureResult
✅ Handle_WhenRepositoryThrowsException_ReturnsFailureResult
✅ Handle_WithInvalidGameId_ReturnsFailureResult
✅ Handle_WithValidGameId_ReturnsSuccessResult
✅ UnitTests.Application.Handlers.MakeMoveCommandHandlerTests
✅ Handle_CallsGameMakeMoveWithCorrectParameters
✅ Handle_CallsRepositoryWithCorrectGameId
✅ Handle_WhenDomainExceptionThrown_ReturnsFailureWithDomainMessage
✅ Handle_WhenGameNotFound_ReturnsFailureResult
✅ Handle_WhenRepositoryThrowsException_ReturnsFailureResult
✅ Handle_WithInvalidGameId_ReturnsFailureResult
✅ Handle_WithInvalidMove_ReturnsSuccessAndSavesGame
✅ Handle_WithValidMove_ReturnsSuccessResult
✅ UnitTests.Application.Handlers.ResetGameCommandHandlerTests
✅ Handle_CallsSaveAsyncWithUpdatedGame
✅ Handle_LogsInformationWhenSuccessful
✅ Handle_WhenGameInInvalidState_ReturnsFailureResult
✅ Handle_WhenRepositoryThrowsException_ReturnsFailureResult
✅ Handle_WithNonExistentGameId_ReturnsFailureResult
✅ Handle_WithValidGameId_ReturnsSuccessResult
✅ UnitTests.Application.Handlers.UndoLastMoveCommandHandlerTests
✅ Handle_CallsSaveAsyncWithUpdatedGame
✅ Handle_LogsInformationWhenSuccessful
✅ Handle_WhenGameInInvalidState_ReturnsFailureResult
✅ Handle_WhenRepositoryThrowsException_ReturnsFailureResult
✅ Handle_WithNoMoveHistory_ReturnsFailureResult
✅ Handle_WithNonExistentGameId_ReturnsFailureResult
✅ Handle_WithValidGameId_ReturnsSuccessResult
✅ UnitTests.Application.Handlers.ValidateGameQueryHandlerTests
✅ Handle_LogsInformationWithValidationResult
✅ Handle_WhenDomainExceptionThrown_ReturnsFailureResult
✅ Handle_WithInvalidGame_ReturnsValidationErrorsResult
✅ Handle_WithNonExistentGameId_ReturnsFailureResult
✅ Handle_WithValidGameId_ReturnsValidationResult
✅ UnitTests.Application.Services.GameApplicationServiceTests
✅ CreateGameAsync_WhenCommandFails_ReturnsFailureResult
✅ CreateGameAsync_WhenGetPlayerGamesFails_ReturnsFailureResult
✅ CreateGameAsync_WhenNoGamesReturned_ReturnsFailureResult
✅ CreateGameAsync_WithValidParameters_ReturnsSuccessResult
✅ GetGameAsync_WhenQueryFails_ReturnsFailureResult
✅ GetGameAsync_WithValidGameId_ReturnsSuccessResult
✅ GetPlayerGamesAsync_WithValidPlayerAlias_ReturnsSuccessResult
✅ GetPlayerGamesByStatusAsync_WithValidParameters_ReturnsSuccessResult
✅ MakeMoveAsync_WhenCommandFails_ReturnsFailureResult
✅ MakeMoveAsync_WithValidParameters_ReturnsSuccessResult
✅ UpdateGameStatusAsync_Abandoned_UsesAbandonCommand
✅ UpdateGameStatusAsync_Completed_UsesCompleteCommand
✅ UpdateGameStatusAsync_Completed_WhenMediatorFails_PropagatesFailure
✅ UpdateGameStatusAsync_InProgress_UsesResumeCommand
✅ UpdateGameStatusAsync_InvalidStatus_ReturnsFailure
✅ UpdateGameStatusAsync_NotStarted_ReturnsFailure
✅ UpdateGameStatusAsync_Paused_UsesPauseCommand
✅ UpdateGameStatusAsync_WhenMediatorReturnsFailure_PropagatesFailure
✅ UnitTests.Blazor.Components.CellInputTests
✅ CellFocusNotify_WhenCellIsInRowColumnOrMiniGrid_HighlightsCell
✅ CellInput_WhenPossibleNumbersEntered_DisplaysInCell
✅ CellInput_WhenValueChangedInPencilMode_RaisesCellChangedEvent
✅ CellInput_WhenValueChangedNotInPencilMode_RaisesCellChangedEvent
✅ CellInput_WhenValueEnteredInCellWithPossibleNumbers_ClearsPossibleNumbers
✅ InvalidCellNotify_WhenCellIncludedInInvalidListOfCells_MarksInvalid
✅ RenderingCellInput_WhenCellIsLocked_RendersLabel
✅ RenderingCellInput_WhenCellIsNotLocked_RendersInput
✅ UnitTests.Blazor.Components.GameBoardTests
✅ GameBoard_FocusDown_SendsFocusToCorrectCell
✅ GameBoard_FocusLeft_SendsFocusToCorrectCell
✅ GameBoard_FocusRight_SendsFocusToCorrectCell
✅ GameBoard_FocusUp_SendsFocusToCorrectCell
✅ GameBoard_RendersCellsCorrectly
✅ GameBoard_ShouldBubbleUp_CellChangedEvent
✅ UnitTests.Blazor.Components.GameControlsTests
✅ HomeButton_RendersCorrectly
✅ HomeButton_WhenClicked_InvokesOnHomeCallback
✅ NumberButton_RendersNumbersCorrectly(number: 1)
✅ NumberButton_RendersNumbersCorrectly(number: 2)
✅ NumberButton_RendersNumbersCorrectly(number: 3)
✅ NumberButton_RendersNumbersCorrectly(number: 4)
✅ NumberButton_RendersNumbersCorrectly(number: 5)
✅ NumberButton_RendersNumbersCorrectly(number: 6)
✅ NumberButton_RendersNumbersCorrectly(number: 7)
✅ NumberButton_RendersNumbersCorrectly(number: 8)
✅ NumberButton_RendersNumbersCorrectly(number: 9)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 1)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 2)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 3)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 4)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 5)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 6)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 7)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 8)
✅ NumberButton_WhenClickedInPencilMode_RaisesEventWithValue(expected: 9)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 1)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 2)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 3)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 4)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 5)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 6)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 7)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 8)
✅ NumberButton_WhenClickedNotInPencilMode_RaisesEventWithValue(expected: 9)
✅ PencilModeButton_RendersCorrectMode(isPencilMode: False, cssClass: "btn btn-outline-primary")
✅ PencilModeButton_RendersCorrectMode(isPencilMode: True, cssClass: "btn btn-primary")
✅ PencilModeButton_WhenClicked_SendsButtonModeArgument
✅ ResetButton_WhenClicked_ResetsGameBoard
✅ UndoAsync_WhenClicked_CallsGameStateManagerUndo
✅ UndoAsync_WhenOnInitialGameState_IsDisabled(totalMoves: 0, disabled: True)
✅ UndoAsync_WhenOnInitialGameState_IsDisabled(totalMoves: 1, disabled: False)
✅ UndoAsync_WhenOnInitialGameState_IsDisabled(totalMoves: 2, disabled: False)
✅ UnitTests.Blazor.Components.GameStatsTests
✅ GameStats_WhenCollapsed_RendersCorrectly
✅ GameStats_WhenExpanded_RendersCorrectly
✅ GameStats_WhenMovesAreRecorded_ShouldUpdate
✅ GameStats_WhenTimerTicks_ShouldUpdate
✅ UnitTests.Blazor.Components.VictoryDisplayTests
✅ ElapsedTimeIsDisplayedCorrectly
✅ VictoryMessageIsDisplayedWhenIsVictoryIsTrue
✅ UnitTests.Blazor.Pages.GamePageTests
✅ Game_GameBoard_OnCellFocus_UpdatesSelectedCell
✅ Game_OnLocationChanging_PausesSession
✅ Game_VictoryDisplay_ShowsWhenPuzzleIsSolved
✅ Game_WhenButtonGroupClicked_SetsCellValue
✅ Game_WhenCellChanged_RecordsMove
✅ Game_WhenInvalidNumberIsEntered_NotifiesInvalidCell
✅ Game_WhenPuzzleLoaded_SendsGameStartedNotification
✅ Game_WhenPuzzleSolved_DeletesGame
✅ Game_WhenPuzzleSolved_DisplaysWinScreen
✅ Game_WhenPuzzleSolved_SendsGameEndedNotification
✅ HandleCellChanged_WhenGameBoardRaisesChangedEvent_ReceivesExpectedArgs
✅ HandleReset_ShouldLoadInitialGameStateAndUpdatePuzzle
✅ HandleUndo_ShouldLoadPreviousGameStateAndUpdatePuzzle
✅ HomeButton_RendersInGameControls
✅ HomeButton_WhenClicked_NavigatesToHomePage
✅ HomeButton_WhenClicked_PausesGameSession
✅ OnAfterRenderAsync_LoadsGameState
✅ OnAfterRenderAsync_StartsGame
✅ UnitTests.Blazor.Pages.IndexPageTests
✅ DeleteGame_RemovesGameFromList
✅ DeleteGame_WhenClicked_RemovesGameFromGameStateManager
✅ Render_WhenSavedGamesPresent_DisplaysEachSavedGame
✅ RendersCorrectly
✅ ShowsDifficultyOptions_WhenStartNewGameClicked
✅ ShowsSavedGames_WhenLoadGameClicked
✅ UnitTests.Blazor.Pages.NewPageTests
✅ OnInitializedAsync_GeneratesNewPuzzle
✅ OnInitializedAsync_NavigatesToGamePageWithPuzzleId
✅ RendersLoader
✅ UnitTests.Blazor.Services.AliasGeneratorTests
✅ GenerateAlias_ShouldBeRandomized
✅ GenerateAlias_ShouldContainAdjectiveAndAnimalAndNumber
✅ GenerateAlias_ShouldReturnNonNullOrEmptyString
✅ UnitTests.Blazor.Services.GameManagerTests
✅ StartGameAsync_SetsGameStatusToExpected(currentGameStatus: "Abandoned", expectedGameStatus: "Abandoned")
✅ StartGameAsync_SetsGameStatusToExpected(currentGameStatus: "Completed", expectedGameStatus: "Completed")
✅ StartGameAsync_SetsGameStatusToExpected(currentGameStatus: "InProgress", expectedGameStatus: "InProgress")
✅ StartGameAsync_SetsGameStatusToExpected(currentGameStatus: "NotStarted", expectedGameStatus: "InProgress")
✅ StartGameAsync_SetsGameStatusToExpected(currentGameStatus: "Paused", expectedGameStatus: "InProgress")
✅ UnitTests.Blazor.Services.GameStateManagerTests
✅ CreateGameAsync_WhenApiCallFails_ThrowsException
✅ CreateGameAsync_WhenApiReturnsNull_ThrowsException
✅ CreateGameAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: "")
✅ CreateGameAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: null)
✅ CreateGameAsync_WithEmptyOrNullDifficulty_ThrowsArgumentException(difficulty: "")
✅ CreateGameAsync_WithEmptyOrNullDifficulty_ThrowsArgumentException(difficulty: null)
✅ CreateGameAsync_WithValidParameters_CreatesGameSuccessfully
✅ CreateGameAsync_WithValidParameters_SavesGameToLocalStorage
✅ DeleteGameAsync_WhenApiCallFails_ThrowsException
✅ DeleteGameAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: "")
✅ DeleteGameAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: null)
✅ DeleteGameAsync_WithEmptyOrNullGameId_ThrowsArgumentException(gameId: "")
✅ DeleteGameAsync_WithEmptyOrNullGameId_ThrowsArgumentException(gameId: null)
✅ DeleteGameAsync_WithLoadedGame_CallsApiClient
✅ DeleteGameAsync_WithLoadedGame_DeletesFromLocalStorage
✅ DeleteGameAsync_WithLoadedGame_DeletesSuccessfully
✅ DeleteGameAsync_WithNoLoadedGame_ThrowsException
✅ DeleteGameAsync_WithParameters_DeletesGameFromLocalStorage
✅ DeleteGameAsync_WithParameters_DeletesGameFromServer
✅ LoadGameAsync_FromApi_SavesGameToLocalStorage
✅ LoadGameAsync_FromApi_WhenNotInLocalStorage_ReturnsGameSuccessfully
✅ LoadGameAsync_WhenApiCallFails_ThrowsException
✅ LoadGameAsync_WhenApiReturnsNull_ThrowsException
✅ LoadGameAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: "")
✅ LoadGameAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: null)
✅ LoadGameAsync_WithEmptyOrNullGameId_ThrowsArgumentException(gameId: "")
✅ LoadGameAsync_WithEmptyOrNullGameId_ThrowsArgumentException(gameId: null)
✅ LoadGamesAsync_FromApi_SavesGamesToLocalStorage
✅ LoadGamesAsync_FromApi_WhenLocalStorageEmpty_ReturnsGamesSuccessfully
✅ LoadGamesAsync_FromLocalStorage_ReturnsGamesSuccessfully
✅ LoadGamesAsync_WhenApiCallFails_ThrowsException
✅ LoadGamesAsync_WhenApiReturnsNull_ThrowsException
✅ LoadGamesAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: "")
✅ LoadGamesAsync_WithEmptyOrNullAlias_ThrowsArgumentException(alias: null)
✅ ResetGameAsync_ResetsGameSuccessfully
✅ ResetGameAsync_SavesResetGameToLocalStorage
✅ ResetGameAsync_WhenApiCallFails_ThrowsException
✅ ResetGameAsync_WithNullGame_ThrowsNullReferenceException
✅ SaveGameAsync_SavesGameSuccessfully
✅ SaveGameStatusAsync_CallsApiClient_SaveGameStatusAsync
✅ UndoGameAsync_WhenApiCallFails_ThrowsException
✅ UndoGameAsync_WithMovesAvailable_UndoesSuccessfully
✅ UndoGameAsync_WithNoMoves_ReturnsCurrentGame
✅ UndoGameAsync_WithNullGame_ThrowsNullReferenceException
✅ UnitTests.Blazor.Services.GameStatisticsManagerTests
✅ CurrentStatistics_WhenGameIsLoaded_ReturnsGameStatistics
✅ EndSession_ResetsTimer
✅ EndSession_UnsubscribesFromTimerTick
✅ EndSession_WhenGameCompleted_SavesGameStatus
✅ EndSession_WhenGameIsSolved_SetsGameStatusToCompleted
✅ EndSession_WhenGameNotComplete_SavesGameStatus
✅ EndSession_WhenGameNotComplete_SetsGameStatusToAbandoned
✅ OnTimerTick_UpdatesPlayDuration
✅ OnTimerTick_WithLargeElapsedTime_UpdatesPlayDuration
✅ OnTimerTick_WithZeroElapsedTime_UpdatesPlayDurationToZero
✅ PauseSession_PausesTimer
✅ PauseSession_SavesGameStatus
✅ PauseSession_SetsGameStatusToPaused
✅ RecordMove_InvalidMove_RecordsInvalidMove
✅ RecordMove_InvalidMove_SavesGame
✅ RecordMove_MixedValidAndInvalidMoves_CalculatesCorrectly
✅ RecordMove_MultipleInvalidMoves_IncrementsCountCorrectly
✅ RecordMove_MultipleValidMoves_IncrementsCountCorrectly
✅ RecordMove_ValidMove_RecordsValidMove
✅ RecordMove_ValidMove_SavesGame
✅ ResumeSession_ResumesTimerWithPlayDuration
✅ ResumeSession_SavesGameStatus
✅ ResumeSession_SetsGameStatusToInProgress
✅ ResumeSession_WithZeroPlayDuration_ResumesTimerWithZeroDuration
✅ StartNewSession_ResetsStatistics
✅ StartNewSession_ResetsTimer
✅ StartNewSession_SavesGameStatus
✅ StartNewSession_SetsGameStatusToInProgress
✅ StartNewSession_StartsTimer
✅ StartNewSession_SubscribesToTimerTick
✅ UnitTests.Blazor.Services.GameTimerTests
✅ OnTick_ShouldFireAtInterval
✅ Pause_ShouldStopElapsedTime
✅ Reset_ShouldClearElapsedTime
✅ Reset_ShouldStopTimer
✅ Resume_ShouldContinueElapsedTime
✅ Resume_WithInitialDuration_ShouldContinueFromInitialDuration
✅ Resume_WithInitialDuration_ShouldRaiseTickEventWithCorrectDuration
✅ Resume_WithInitialDuration_ShouldStartWithCorrectDuration
✅ Resume_WithInitialDuration_WhenAlreadyRunning_ShouldNotChangeDuration
✅ Start_ShouldIncreaseElapsedTime
✅ Start_ShouldSetIsRunning
✅ UnitTests.Blazor.Services.LocalStorageServiceTests
✅ DeleteGameAsync_LoadsGamesFromStorage
✅ DeleteGameAsync_WithEmptyStorage_DoesNotThrow
✅ DeleteGameAsync_WithExistingGame_RemovesGameFromStorage
✅ DeleteGameAsync_WithNonExistentGame_DoesNotModifyStorage
✅ GetAliasAsync_CallsJsRuntimeWithCorrectKey
✅ GetAliasAsync_WhenAliasExists_ReturnsAlias
✅ GetAliasAsync_WhenAliasIsNull_ReturnsNull
✅ LoadGameAsync_LoadsGamesFromStorage
✅ LoadGameAsync_WithEmptyStorage_ReturnsNull
✅ LoadGameAsync_WithExistingGame_ReturnsGame
✅ LoadGameAsync_WithNonExistentGame_ReturnsNull
✅ LoadGameStatesAsync_CallsJsRuntimeWithCorrectKey
✅ LoadGameStatesAsync_WithEmptyStorage_ReturnsEmptyList
✅ LoadGameStatesAsync_WithInvalidJson_ReturnsEmptyList
✅ LoadGameStatesAsync_WithNullJson_ReturnsEmptyList
✅ LoadGameStatesAsync_WithValidJson_ReturnsGamesList
✅ LoadGameStatesAsync_WithWhitespaceJson_ReturnsEmptyList
✅ SaveGameStateAsync_LoadsExistingGamesFirst
✅ SaveGameStateAsync_WithEmptyStorage_AddsFirstGame
✅ SaveGameStateAsync_WithExistingGame_UpdatesGameInStorage
✅ SaveGameStateAsync_WithNewGame_AddsGameToStorage
✅ SetAliasAsync_CallsJsRuntimeWithCorrectParameters
✅ SetAliasAsync_WithEmptyAlias_StillCallsJsRuntime
✅ SetAliasAsync_WithNullAlias_StillCallsJsRuntime
✅ UnitTests.Blazor.Services.PlayerManagerTests
✅ CreatePlayerAsync_WhenApiCallFails_ThrowsException
✅ CreatePlayerAsync_WhenApiReturnsNullValue_ThrowsException
✅ CreatePlayerAsync_WithNullAlias_CallsApiWithNull
✅ CreatePlayerAsync_WithValidAlias_ReturnsCreatedAlias
✅ CreatePlayerAsync_WithValidAlias_StoresAliasInLocalStorage
✅ GetCurrentPlayerAsync_ReturnsAliasFromLocalStorage
✅ GetCurrentPlayerAsync_WhenNoAliasStored_ReturnsNull
✅ PlayerExistsAsync_WhenApiCallFails_ThrowsException
✅ PlayerExistsAsync_WithEmptyAlias_ThrowsArgumentException
✅ PlayerExistsAsync_WithNullAlias_ThrowsArgumentException
✅ PlayerExistsAsync_WithValidAlias_ReturnsFalse
✅ PlayerExistsAsync_WithValidAlias_ReturnsTrue
✅ SetCurrentPlayerAsync_WithEmptyAlias_ThrowsArgumentException
✅ SetCurrentPlayerAsync_WithNullAlias_ThrowsArgumentException
✅ SetCurrentPlayerAsync_WithValidAlias_CallsLocalStorageService
✅ UnitTests.Domain.CellTests
✅ AddPossibleValue_OnCellWithValue_ThrowsInvalidOperationException
✅ AddPossibleValue_OnEmptyCell_AddsPossibleValue
✅ AddPossibleValue_OnFixedCell_ThrowsCellIsFixedException
✅ AddPossibleValue_WithExistingValue_DoesNotAddDuplicate
✅ AddPossibleValue_WithInvalidValue_ThrowsInvalidCellValueException(value: -1)
✅ AddPossibleValue_WithInvalidValue_ThrowsInvalidCellValueException(value: 0)
✅ AddPossibleValue_WithInvalidValue_ThrowsInvalidCellValueException(value: 10)
✅ AddPossibleValue_WithMultipleValues_AddsPossibleValues
✅ ClearPossibleValues_OnFixedCell_ThrowsCellIsFixedException
✅ ClearPossibleValues_WithNoValues_DoesNothing
✅ ClearPossibleValues_WithValues_ClearsPossibleValues
✅ ClearValue_OnFixedCell_ThrowsCellIsFixedException
✅ ClearValue_OnNonFixedCell_ClearsValue
✅ Create_WithInvalidColumn_ThrowsInvalidCellPositionException(row: 5, column: -1)
✅ Create_WithInvalidColumn_ThrowsInvalidCellPositionException(row: 5, column: 10)
✅ Create_WithInvalidColumn_ThrowsInvalidCellPositionException(row: 5, column: 9)
✅ Create_WithInvalidRow_ThrowsInvalidCellPositionException(row: -1, column: 5)
✅ Create_WithInvalidRow_ThrowsInvalidCellPositionException(row: 10, column: 5)
✅ Create_WithInvalidRow_ThrowsInvalidCellPositionException(row: 9, column: 5)
✅ Create_WithInvalidValue_ThrowsInvalidCellValueException(value: -1)
✅ Create_WithInvalidValue_ThrowsInvalidCellValueException(value: 0)
✅ Create_WithInvalidValue_ThrowsInvalidCellValueException(value: 10)
✅ Create_WithValidParameters_CreatesCell
✅ CreateEmpty_WithValidParameters_CreatesEmptyCell
✅ CreateFixed_WithValidParameters_CreatesFixedCell
✅ DeepCopy_CreatesDeepCopy
✅ DeepCopy_EmptyCell_CreatesDeepCopy
✅ DeepCopy_ModifyingClonedCell_DoesNotAffectOriginal
✅ RemovePossibleValue_OnFixedCell_ThrowsCellIsFixedException
✅ RemovePossibleValue_WithExistingValue_RemovesPossibleValue
✅ RemovePossibleValue_WithInvalidValue_ThrowsInvalidCellValueException(value: -1)
✅ RemovePossibleValue_WithInvalidValue_ThrowsInvalidCellValueException(value: 0)
✅ RemovePossibleValue_WithInvalidValue_ThrowsInvalidCellValueException(value: 10)
✅ RemovePossibleValue_WithNonExistingValue_DoesNothing
✅ SetValue_ClearsPossibleValues
✅ SetValue_OnFixedCell_ThrowsCellIsFixedException
✅ SetValue_OnNonFixedCell_UpdatesValue
✅ SetValue_WithInvalidValue_ThrowsInvalidCellValueException(value: -1)
✅ SetValue_WithInvalidValue_ThrowsInvalidCellValueException(value: 0)
✅ SetValue_WithInvalidValue_ThrowsInvalidCellValueException(value: 10)
✅ SetValue_WithNullableInt_ClearsPossibleValuesWhenValueIsSet
✅ SetValue_WithNullableInt_DoesNotClearPossibleValuesWhenValueIsNull
✅ SetValue_WithNullableInt_OnFixedCell_ThrowsCellIsFixedException
✅ SetValue_WithNullableInt_OnNonFixedCell_UpdatesValue
✅ SetValue_WithNullableInt_WithInvalidValue_ThrowsInvalidCellValueException(value: -1)
✅ SetValue_WithNullableInt_WithInvalidValue_ThrowsInvalidCellValueException(value: 0)
✅ SetValue_WithNullableInt_WithInvalidValue_ThrowsInvalidCellValueException(value: 10)
✅ SetValue_WithNullValue_ClearsValue
✅ SetValue_WithNullValue_OnFixedCell_ThrowsCellIsFixedException
✅ ToString_WithoutValue_ReturnsDot
✅ ToString_WithValue_ReturnsValueAsString
✅ UnitTests.Domain.GameDifficultyTests
✅ Equality_WithDifferentValues_AreNotEqual
✅ Equality_WithSameValue_AreEqual
✅ FromName_WithInvalidName_ThrowsInvalidGameDifficultyException(invalidName: "")
✅ FromName_WithInvalidName_ThrowsInvalidGameDifficultyException(invalidName: "invalid")
✅ FromName_WithInvalidName_ThrowsInvalidGameDifficultyException(invalidName: null)
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "easy", expectedName: "Easy")
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "EASY", expectedName: "Easy")
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "expert", expectedName: "Expert")
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "EXPERT", expectedName: "Expert")
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "hard", expectedName: "Hard")
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "HARD", expectedName: "Hard")
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "medium", expectedName: "Medium")
✅ FromName_WithValidName_ReturnsCorrectDifficulty(name: "MEDIUM", expectedName: "Medium")
✅ FromValue_WithInvalidValue_ThrowsInvalidGameDifficultyException(invalidValue: -1)
✅ FromValue_WithInvalidValue_ThrowsInvalidGameDifficultyException(invalidValue: 0)
✅ FromValue_WithInvalidValue_ThrowsInvalidGameDifficultyException(invalidValue: 5)
✅ FromValue_WithValidValue_ReturnsCorrectDifficulty(value: 1, expectedName: "Easy")
✅ FromValue_WithValidValue_ReturnsCorrectDifficulty(value: 2, expectedName: "Medium")
✅ FromValue_WithValidValue_ReturnsCorrectDifficulty(value: 3, expectedName: "Hard")
✅ FromValue_WithValidValue_ReturnsCorrectDifficulty(value: 4, expectedName: "Expert")
✅ ImplicitConversion_ToInt_ReturnsValue
✅ ImplicitConversion_ToString_ReturnsName
✅ PredefinedDifficulties_HaveCorrectValues
✅ ToString_ReturnsName
✅ UnitTests.Domain.GameIdTests
✅ Create_WithGuid_CreatesGameIdWithCorrectValue
✅ Create_WithInvalidString_ThrowsFormatException(invalidGuid: "")
✅ Create_WithInvalidString_ThrowsFormatException(invalidGuid: "not-a-guid")
✅ Create_WithValidString_CreatesGameIdWithCorrectValue
✅ Equality_WithDifferentValues_AreNotEqual
✅ Equality_WithSameValue_AreEqual
✅ ImplicitConversion_ToGuid_ReturnsValue
✅ ImplicitConversion_ToString_ReturnsValueAsString
✅ New_CreatesGameIdWithNewGuid
✅ ToString_ReturnsValueAsString
✅ UnitTests.Domain.GameStatisticsTests
✅ AccuracyPercentage_CalculatesCorrectly(totalMoves: 10, validMoves: 5, expectedAccuracy: 50)
✅ AccuracyPercentage_CalculatesCorrectly(totalMoves: 4, validMoves: 3, expectedAccuracy: 75)
✅ AccuracyPercentage_CalculatesCorrectly(totalMoves: 5, validMoves: 0, expectedAccuracy: 0)
✅ AccuracyPercentage_CalculatesCorrectly(totalMoves: 5, validMoves: 5, expectedAccuracy: 100)
✅ AccuracyPercentage_WithNoMoves_ReturnsZero
✅ Create_ReturnsNewGameStatisticsWithInitialValues
✅ Equality_WithSameValues_AreEqual
✅ HasMoves_AfterRecordingMoves_ReturnsTrue
✅ RecordMove_MultipleMoves_UpdatesAllCounts
✅ RecordMove_WithInvalidMove_IncrementsInvalidMoves
✅ RecordMove_WithValidMove_IncrementsValidMoves
✅ UpdatePlayDuration_SetsPlayDuration
✅ UnitTests.Domain.PlayerAliasTests
✅ Create_TrimsSpaces_FromBeginningAndEnd
✅ Create_WithAliasTooLong_ThrowsInvalidPlayerAliasException
✅ Create_WithAliasTooShort_ThrowsInvalidPlayerAliasException
✅ Create_WithInvalidCharacters_ThrowsInvalidPlayerAliasException(aliasValue: "Hello!")
✅ Create_WithInvalidCharacters_ThrowsInvalidPlayerAliasException(aliasValue: "John@Doe")
✅ Create_WithInvalidCharacters_ThrowsInvalidPlayerAliasException(aliasValue: "No-Hyphens")
✅ Create_WithInvalidCharacters_ThrowsInvalidPlayerAliasException(aliasValue: "Player#1")
✅ Create_WithNullOrEmptyAlias_ThrowsInvalidPlayerAliasException(aliasValue: " ")
✅ Create_WithNullOrEmptyAlias_ThrowsInvalidPlayerAliasException(aliasValue: "")
✅ Create_WithNullOrEmptyAlias_ThrowsInvalidPlayerAliasException(aliasValue: null)
✅ Create_WithValidAlias_CreatesPlayerAlias(aliasValue: "A very long player name with exactly 50 characters")
✅ Create_WithValidAlias_CreatesPlayerAlias(aliasValue: "AB")
✅ Create_WithValidAlias_CreatesPlayerAlias(aliasValue: "Jane Doe")
✅ Create_WithValidAlias_CreatesPlayerAlias(aliasValue: "John")
✅ Create_WithValidAlias_CreatesPlayerAlias(aliasValue: "Player123")
✅ ImplicitConversion_ToString_ReturnsValue
✅ ToString_ReturnsValue
✅ UnitTests.Domain.SudokuGameMoveHistoryTests
✅ GetMoveHistory_NewGame_ReturnsEmptyCollection
✅ MakeMove_AddsEntryToMoveHistory
✅ Reconstitute_WithMoveHistory_RestoresMoveHistory
✅ ResetGame_ClearsMoveHistory
✅ UndoLastMove_RemovesEntryFromMoveHistory
✅ UnitTests.Domain.SudokuGamePossibleValuesTests
✅ AddPossibleValue_ToCellWithValue_ThrowsInvalidOperationException
✅ AddPossibleValue_ToEmptyCell_AddsPossibleValue
✅ AddPossibleValue_ToFixedCell_ThrowsCellIsFixedException
✅ AddPossibleValue_WhenGameNotInProgress_ThrowsGameNotInProgressException
✅ ClearPossibleValues_FromCellWithPossibleValues_ClearsPossibleValues
✅ ClearPossibleValues_FromFixedCell_ThrowsCellIsFixedException
✅ ClearPossibleValues_WhenGameNotInProgress_ThrowsGameNotInProgressException
✅ MakeMove_ClearsPossibleValues
✅ RemovePossibleValue_FromCellWithPossibleValue_RemovesPossibleValue
✅ RemovePossibleValue_FromFixedCell_ThrowsCellIsFixedException
✅ RemovePossibleValue_WhenGameNotInProgress_ThrowsGameNotInProgressException
✅ ResetGame_ClearsPossibleValuesForAllNonFixedCells
✅ UnitTests.Domain.SudokuGameTests
✅ AbandonGame_WhenGameIsCompleted_ThrowsGameAlreadyCompletedException
✅ AbandonGame_WhenGameIsNotCompleted_ChangesStatusToAbandoned
✅ Create_WithValidParameters_CreatesGameWithCorrectProperties
✅ IsGameComplete_WithAllCellsFilledCorrectly_ReturnsTrue
✅ IsGameComplete_WithNotAllCellsFilled_ReturnsFalse
✅ MakeMove_ClearEmptyCell_DoesNotThrow
✅ MakeMove_ClearFixedCell_ThrowsCellIsFixedException
✅ MakeMove_OnFixedCell_ThrowsCellIsFixedException
✅ MakeMove_WhenGameIsNotInProgress_ThrowsGameNotInProgressException
✅ MakeMove_WithInvalidMove_AllowsMoveAndIncrementsInvalidMoveCount
✅ MakeMove_WithNullValue_ClearsCellValue
✅ MakeMove_WithNullValue_RaisesDomainEventWithNullValue
✅ MakeMove_WithValidMove_RaisesDomainEvent
✅ MakeMove_WithValidMove_UpdatesCell
✅ PauseGame_WhenGameIsInProgress_ChangesStatusToPaused
✅ PauseGame_WhenGameIsNotInProgress_ThrowsGameNotInProgressException
✅ ResumeGame_WhenGameIsNotPaused_ThrowsGameNotPausedException
✅ ResumeGame_WhenGameIsPaused_ChangesStatusToInProgress
✅ StartGame_WhenGameIsAlreadyInProgress_ThrowsGameNotInStartStateException
✅ StartGame_WhenGameIsNotStarted_ChangesStatusToInProgress
✅ UpdatePlayDuration_UpdatesStatisticsDuration
✅ UnitTests.Domain.SudokuPuzzleTests
✅ Clone_CreatesDeepCopyOfPuzzle
✅ Clone_EachCellIsDeepCopied
✅ Clone_ModifyingClonedPuzzle_DoesNotAffectOriginal
✅ Clone_PreservesValidationRules
✅ Clone_WithPossibleValues_PreservesPossibleValues
✅ UnitTests.Infrastructure.EventHandling.DomainEventDispatcherTests
✅ DispatchAsync_WhenHandlerThrows_RethrowsException
✅ DispatchAsync_WithDifferentEventTypes_CallsCorrectHandlers
✅ DispatchAsync_WithEmptyEventCollection_DoesNotThrow
✅ DispatchAsync_WithMixedSuccessAndFailureHandlers_ThrowsFirstException
✅ DispatchAsync_WithMultipleEvents_CallsHandlersForEachEvent
✅ DispatchAsync_WithMultipleHandlers_CallsAllHandlers
✅ DispatchAsync_WithNoHandlers_DoesNotThrow
✅ DispatchAsync_WithServiceProviderThrows_RethrowsException
✅ DispatchAsync_WithSingleEvent_CallsCorrectHandler
✅ UnitTests.Infrastructure.EventHandling.GameCompletedEventHandlerTests
✅ HandleAsync_WithDifferentGameId_LogsCorrectGameId
✅ HandleAsync_WithValidEvent_CompletesSuccessfully
✅ HandleAsync_WithValidEvent_LogsCorrectGameId
✅ HandleAsync_WithValidEvent_LogsInformation
✅ UnitTests.Infrastructure.EventHandling.GameCreatedEventHandlerTests
✅ HandleAsync_WithDifferentDifficulties_LogsCorrectDifficulty
✅ HandleAsync_WithDifferentPlayerAlias_LogsCorrectPlayerAlias
✅ HandleAsync_WithValidEvent_CompletesSuccessfully
✅ HandleAsync_WithValidEvent_LogsInformation
✅ UnitTests.Infrastructure.EventHandling.MoveMadeEventHandlerTests
✅ HandleAsync_WithDifferentCoordinates_LogsCorrectCoordinates
✅ HandleAsync_WithNullValue_LogsCorrectly
✅ HandleAsync_WithValidEvent_CompletesSuccessfully
✅ HandleAsync_WithValidEvent_LogsDebugInformation
✅ UnitTests.Infrastructure.Repositories.AzureBlobGameRepositoryTests
✅ CountBySpecificationAsync_WithMatchingGames_ReturnsCorrectCount
✅ DeleteAsync_WhenStorageServiceThrows_RethrowsException
✅ DeleteAsync_WithExistingGame_DeletesGame
✅ Dispose_WhenCalled_DisposesResourcesWithoutException
✅ ExistsAsync_WhenStorageServiceThrows_RethrowsException
✅ ExistsAsync_WithExistingGame_ReturnsTrue
✅ ExistsAsync_WithNonExistingGame_ReturnsFalse
✅ GetAverageCompletionTimeAsync_WithNoCompletedGames_ReturnsZero
✅ GetByIdAsync_WhenStorageServiceThrows_RethrowsException
✅ GetByIdAsync_WithExistingGame_ReturnsGame
✅ GetByIdAsync_WithNonExistingGame_ReturnsNull
✅ GetByPlayerAndStatusAsync_WithMatchingGames_ReturnsFilteredGames
✅ GetByPlayerAsync_WhenStorageServiceThrows_RethrowsException
✅ GetByPlayerAsync_WithExistingPlayer_ReturnsGamesOrderedByCreatedAt
✅ GetByPlayerAsync_WithNonExistingPlayer_ReturnsEmptyCollection
✅ GetBySpecificationAsync_WithValidSpecification_ReturnsFilteredGames
✅ GetCompletedGamesAsync_WithCompletedGames_ReturnsOnlyCompletedGames
✅ GetCompletedGamesCountAsync_WithCompletedGames_ReturnsCorrectCount
✅ GetGamesByDifficultyAsync_WithMatchingDifficulty_ReturnsFilteredGames
✅ GetGamesByStatusAsync_WithMatchingStatus_ReturnsFilteredGames
✅ GetRecentGamesAsync_WithMultipleGames_ReturnsLimitedGamesOrderedByCreatedAt
✅ GetSingleBySpecificationAsync_WithMatchingGame_ReturnsFirstGame
✅ GetSingleBySpecificationAsync_WithNoMatchingGame_ReturnsNull
✅ GetTotalGamesCountAsync_WithoutPlayerFilter_ReturnsAllGamesCount
✅ GetTotalGamesCountAsync_WithPlayerFilter_ReturnsPlayerGamesCount
✅ SaveAsync_WhenStorageServiceThrows_RethrowsException
✅ SaveAsync_WithExistingGame_CreatesNewRevision
✅ SaveAsync_WithValidGame_SavesGameSuccessfully
✅ UnitTests.Infrastructure.Repositories.CosmosDbGameRepositoryTests
✅ DeleteAsync_ShouldCallDeleteItemAsync
✅ ExistsAsync_WhenGameExists_ShouldReturnTrue
✅ GetByIdAsync_WhenGameDoesNotExist_ShouldReturnNull
✅ GetByIdAsync_WhenGameExists_ShouldReturnGame
✅ GetByPlayerAsync_WithMatchingGames_ShouldReturnPlayerGames
✅ SaveAsync_ShouldCallUpsertItemAsync
✅ UnitTests.Infrastructure.Services.PuzzleGeneratorTests
✅ Generate_RemovesRandomCellsFromSolvedPuzzle(difficulty: "Easy", minEmptyCells: 40, maxEmptyCells: 45)
✅ Generate_RemovesRandomCellsFromSolvedPuzzle(difficulty: "Expert", minEmptyCells: 54, maxEmptyCells: 58)
✅ Generate_RemovesRandomCellsFromSolvedPuzzle(difficulty: "Hard", minEmptyCells: 50, maxEmptyCells: 53)
✅ Generate_RemovesRandomCellsFromSolvedPuzzle(difficulty: "Medium", minEmptyCells: 46, maxEmptyCells: 49)
✅ Generate_SolvesEmptyPuzzle
✅ Generate_WhenGeneratingPuzzle_MarksAllCellsWithValueAsLocked
✅ Generate_WhenSolverThrowsInvalidBoardException_RegeneratesBoard
✅ UnitTests.Infrastructure.Services.Strategies.ColumnRowMiniGridEliminationStrategyTests
✅ SolvePuzzle_WhenACellValueIsNotSet_ReturnsScoreOfZero
✅ SolvePuzzle_WhenACellValueIsSet_ReturnsTrue
✅ SolvePuzzle_WhenOnlyOnePossibleValue_ThenValueEqualsThatNumber
✅ UnitTests.Infrastructure.Services.Strategies.SinglesInColumnsStrategyTests
✅ SolvePuzzle_WhenCellValueIsNotSet_ReturnsFalse
✅ SolvePuzzle_WhenCellValueIsSet_RemovesThatValueFromColumnCellsPossibleValues
✅ SolvePuzzle_WhenCellValueIsSet_ReturnsTrue
✅ SolvePuzzle_WhenPossibleNumberOccursOnlyOnceInColumn_SetValueToThatNumber
✅ UnitTests.Infrastructure.Services.Strategies.SinglesInMiniGridStrategyTests
✅ SolvePuzzle_WhenACellValueIsNotSet_ReturnsScoreOfZero
✅ SolvePuzzle_WhenACellValueIsSet_ReturnsExpectedScore
✅ SolvePuzzle_WhenPossibleNumberOccursOnlyOnceInMiniGrid_SetValueToThatNumber
✅ UnitTests.Infrastructure.Services.Strategies.SinglesInRowsStrategyTests
✅ SolvePuzzle_WhenACellValueIsNotSet_ReturnsFalse
✅ SolvePuzzle_WhenACellValueIsSet_ReturnsTrue
✅ SolvePuzzle_WhenPossibleNumberOccursOnlyOnceInRow_SetValueToThatNumber
✅ UnitTests.Infrastructure.Services.Strategies.TripletsInColumnsStrategyTests
✅ Execute_WhenRemovalLeadsToEmptyPossibleValues_ThrowsInvalidMoveException
✅ Execute_WithCellsAlreadySet_IgnoresSetCells
✅ Execute_WithEmptyPuzzle_ReturnsFalse
✅ Execute_WithHiddenTripletsInColumn_RestrictsCellsToTripletValues
✅ Execute_WithHiddenTripletsInColumn_SetsTripletsValues
✅ Execute_WithMultipleColumnsWithTriplets_ProcessesAllColumns
✅ Execute_WithNakedTriplets_SetsTripletsPossibleValues
✅ Execute_WithNakedTripletsInColumn_RemovesTripletValuesFromOtherCells
✅ Execute_WithNoTripletsInAnyColumn_ReturnsFalse
✅ UnitTests.Infrastructure.Services.Strategies.TripletsInMiniGridsStrategyTests
✅ Execute_CallsHandleHiddenTripletsForEachMiniGrid
✅ Execute_CallsHandleNakedTripletsForEachMiniGrid
✅ Execute_CombinesResultsFromBothNakedAndHiddenTripletHandlers
✅ Execute_EnsuresChangesMadeOrOperationCombinesCorrectly
✅ Execute_IteratesThroughAllNineMiniGrids
✅ Execute_WithAllCellsHavingValues_ReturnsFalse
✅ Execute_WithEmptyPuzzle_ReturnsFalse
✅ Execute_WithHiddenTripletsInMiniGrid_ReturnsTrue
✅ Execute_WithMinimalEmptyCellsInMiniGrid_StillProcessesCorrectly
✅ Execute_WithMultipleTripletsInSameMiniGrid_ProcessesAll
✅ Execute_WithNakedTripletsInMiniGrid_ReturnsTrue
✅ Execute_WithNoTripletsInAnyMiniGrid_ReturnsFalse
✅ UnitTests.Infrastructure.Services.Strategies.TripletsInRowsStrategyTests
✅ Execute_IteratesThroughAllNineRows
✅ Execute_OnlyProcessesEmptyCells
✅ Execute_WhenRemovalLeadsToEmptyPossibleValues_ThrowsInvalidMoveException
✅ Execute_WithCellsAlreadySet_IgnoresSetCells
✅ Execute_WithEmptyPuzzle_ReturnsFalse
✅ Execute_WithHiddenTripletsInRow_RestrictsCellsToTripletValues
✅ Execute_WithHiddenTripletsInRow_SetsTripletsValues
✅ Execute_WithMultipleRowsWithTriplets_ProcessesAllRows
✅ Execute_WithNakedTriplets_SetsTripletsPossibleValues
✅ Execute_WithNakedTripletsInRow_RemovesTripletValuesFromOtherCells
✅ Execute_WithNoTripletsInAnyRow_ReturnsFalse
✅ UnitTests.Infrastructure.Services.Strategies.TwinsInColumnsStrategyTests
✅ Execute_WhenAllColumnsProcessed_ChecksAllNineColumns
✅ Execute_WhenCellsHaveSameValuesButNotTwins_DoesNotEliminateThem
✅ Execute_WhenColumnHasCellsWithValues_IgnoresThemForTwins
✅ Execute_WhenColumnHasMultipleTwins_HandlesAllTwins
✅ Execute_WhenColumnHasNakedTwins_EliminatesTwinValuesFromOtherCells
✅ Execute_WhenColumnHasNakedTwinsAndCellBecomesNaked_SetsCellValue
✅ Execute_WhenColumnHasNoTwins_ReturnsFalse
✅ Execute_WhenTwinEliminationLeadsToInvalidCell_ThrowsInvalidMoveException
✅ SolvePuzzle_CallsPopulatePossibleValuesAndExecute
✅ UnitTests.Infrastructure.Services.Strategies.TwinsInMiniGridsStrategyTests
✅ Execute_CorrectlyIdentifiesMiniGridBoundaries
✅ Execute_MinimalDebugTest_CheckAlgorithmLogic
✅ Execute_WhenTwinEliminationLeadsToInvalidState_ThrowsInvalidMoveException
✅ Execute_WithEasyPuzzle_RunsWithoutError
✅ Execute_WithEmptyPuzzle_ReturnsFalse
✅ Execute_WithSolvedPuzzle_ReturnsFalse
✅ Execute_WithTwinLeadingToNakedSingle_SetsCellValue
✅ Execute_WithTwinsButNoEliminationPossible_ReturnsFalse
✅ Execute_WithValidTwinScenario_ReturnsTrueAndEliminatesTwinValues
✅ Execute_WorkingTwinScenario_SuccessfullyEliminatesValues
✅ SolvePuzzle_CallsPopulatePossibleValuesAndExecute
✅ UnitTests.Infrastructure.Services.Strategies.TwinsInRowsStrategyTests
✅ Execute_WhenAllRowsProcessed_ChecksAllNineRows
✅ Execute_WhenCellsHaveSameValuesButNotTwins_DoesNotEliminateThem
✅ Execute_WhenEmptyPuzzle_ReturnsFalse
✅ Execute_WhenRowHasCellsWithValues_IgnoresThemForTwins
✅ Execute_WhenRowHasMultipleTwins_HandlesAllTwins
✅ Execute_WhenRowHasNakedTwins_EliminatesTwinValuesFromOtherCells
✅ Execute_WhenRowHasNakedTwinsAndCellBecomesNaked_SetsCellValue
✅ Execute_WhenRowHasNoTwins_ReturnsFalse
✅ Execute_WhenSolvedPuzzle_ReturnsFalse
✅ Execute_WhenTwinEliminationLeadsToInvalidCell_ThrowsInvalidMoveException
✅ SolvePuzzle_CallsPopulatePossibleValuesAndExecute
✅ UnitTests.Infrastructure.Services.StrategyBasedPuzzleSolverTests
✅ SolvePuzzle_WhenInvalidMoveOccurs_TriggersUndo
✅ SolvePuzzle_WhenPuzzleIsSolved_CallsSaveAsync
✅ SolvePuzzle_WhenPuzzleIsSolved_ReturnsSolvedPuzzle
✅ SolvePuzzle_WhenUndoReturnsNull_ThrowsNoMoveHistoryException
✅ UnitTests.Infrastructure.Utilities.CircularStackReferenceTypeTests
✅ CloneFunction_ReceivesCorrectItemToClone
✅ Constructor_WithNullCloneFunction_UsesFallbackCloning
✅ Push_CircularOverwrite_MaintainsIndependentCopiesWhenOverwriting
✅ Push_MultipleReferenceTypesWithModifications_MaintainsIndependentCopies
✅ Push_WithCustomCloneFunction_UsesProvidedCloneLogic
✅ Push_WithCustomCloneFunctionThatReturnsNull_HandlesGracefully
✅ Push_WithICloneableType_CreatesIndependentCopy
✅ Push_WithNullReferenceType_HandlesNullCorrectly
✅ Push_WithReferenceTypeWithoutCloning_ModificationDoesNotAffectStoredItem
✅ Push_WithString_WorksAsExpected
✅ Push_WithValueType_WorksAsExpected
✅ UnitTests.Infrastructure.Utilities.CircularStackTests
✅ Capacity_ReturnsTheCapacityValueGivenDuringCreation
✅ Clear_EmptiesEntireStack
✅ ConstructorTest_WhenCreatingWithCapacityLessOrEqualToZero_ThrowsArgumentOutOfRangeException(capacity: -1)
✅ ConstructorTest_WhenCreatingWithCapacityLessOrEqualToZero_ThrowsArgumentOutOfRangeException(capacity: 0)
✅ IsEmpty_AfterInitialCreation_ReturnsTrue
✅ IsFull_AfterInitialCreation_ReturnsFalse
✅ Peek_ReturnsLastItem_ButDoesNotReduceCount
✅ Pop_ReturnsLastItemAdded
✅ Push_AfterAddingItem_ReturnsCountOfOne
✅ Push_AfterAddingMoreItemsThanCapacity_StillAcceptsItem
✅ Push_WhenAddingItemsToCapacity_FillsUpStack
Loading