public async void MinerWontStartWhenManuallyPaused()
        {
            var mockMiner = new Mock <IMiner>();

            mockMiner.SetupProperty(x => x.CurrentState);

            var firstState = new MinerStoppedFromUserRequest();

            mockMiner.Object.CurrentState = firstState;

            var stateHandler           = new TrexMiner.MinerStateHandler(mockMiner.Object);
            var newState               = new MinerStartedFromNoGaming();
            var eventVerification      = AddVerifyableEventHandler(stateHandler);
            var stateTransitionSuccess = await stateHandler.TransitionToStateAsync(newState);

            stateTransitionSuccess.Should().Be(false, "We should not start mining when there is no gaming activity even when the user has manually paused.");
            mockMiner.Verify(x => x.Start(), Times.Never);
            mockMiner.Object.CurrentState.Should().Be(firstState);
            eventVerification().Should().Be(false, "No notification should happen when state does not change.");
        }
        public async void StateTransitionDoesNotHappenWhenThereIsNoChange()
        {
            var mockMiner = new Mock <IMiner>();

            mockMiner.SetupProperty(x => x.CurrentState);

            var firstState = new MinerStartedFromNoGaming();

            mockMiner.Object.CurrentState = firstState;

            var stateHandler           = new TrexMiner.MinerStateHandler(mockMiner.Object);
            var newState               = new MinerStartedFromNoGaming();
            var eventVerification      = AddVerifyableEventHandler(stateHandler);
            var stateTransitionSuccess = await stateHandler.TransitionToStateAsync(newState);

            stateTransitionSuccess.Should().Be(false, "We should not transition state when we are already in that state.");
            mockMiner.Verify(x => x.Start(), Times.Never);
            mockMiner.Object.CurrentState.Should().Be(firstState);
            eventVerification().Should().Be(false, "we should not be notified if state transition failed.");
        }
        public async void MinerStartsFromNogaming()
        {
            var mockMiner = new Mock <IMiner>();

            mockMiner.SetupProperty(x => x.CurrentState);

            var firstState = new UnknownMinerState();

            mockMiner.Object.CurrentState = firstState;

            var stateHandler           = new TrexMiner.MinerStateHandler(mockMiner.Object);
            var newState               = new MinerStartedFromNoGaming();
            var eventVerification      = AddVerifyableEventHandler(stateHandler);
            var stateTransitionSuccess = await stateHandler.TransitionToStateAsync(newState);

            stateTransitionSuccess.Should().Be(true, "We should start when there is no gaming activity");
            mockMiner.Verify(x => x.Start(), Times.Once);
            mockMiner.Object.CurrentState.Should().Be(newState);
            eventVerification().Should().Be(true, "we should be notified during successful state transition.");
        }
        public async void UserCanOnlySuccessfullyStartWhenTheyHavePaused()
        {
            var mockMiner = new Mock <IMiner>();

            mockMiner.SetupProperty(x => x.CurrentState);

            var firstState = new MinerStartedFromNoGaming();

            mockMiner.Object.CurrentState = firstState;

            var stateHandler           = new TrexMiner.MinerStateHandler(mockMiner.Object);
            var newState               = new MinerStartedFromUserRequest();
            var eventVerification      = AddVerifyableEventHandler(stateHandler);
            var stateTransitionSuccess = await stateHandler.TransitionToStateAsync(newState);

            stateTransitionSuccess.Should().Be(false, "We should not transition state when the user has not paused.");
            mockMiner.Verify(x => x.Start(), Times.Never);
            mockMiner.Object.CurrentState.Should().Be(firstState);
            eventVerification().Should().Be(false, "we should not be notified if state transition failed.");
        }
        public async void MinerStopsWhenManuallyPaused()
        {
            var mockMiner = new Mock <IMiner>();

            mockMiner.SetupProperty(x => x.CurrentState);

            var firstState = new MinerStartedFromNoGaming();

            mockMiner.Object.CurrentState = firstState;

            var stateHandler           = new TrexMiner.MinerStateHandler(mockMiner.Object);
            var newState               = new MinerStoppedFromUserRequest();
            var eventVerification      = AddEventHandler(stateHandler, newState);
            var stateTransitionSuccess = await stateHandler.TransitionToStateAsync(newState);

            stateTransitionSuccess.Should().Be(true, "We should pause from user request if running.");
            mockMiner.Verify(x => x.Stop(), Times.Once);
            mockMiner.Object.CurrentState.Should().Be(newState);
            eventVerification().Should().Be(true, "We should be notified during successful state transition.");
        }