public void That_TakeShot_ThrowsWhenAngleIsInvalid()
        {
            // given a game flow object
            IGameFlow serviceToTest = GetTestGameFlowObject(
                out Mock <ITargetGenerator> mockTargetGenerator,
                out Mock <IAngleValidator> mockAngleValidator,
                TestTarget, isAngleValid: false);

            // when TakeShot is called
            Exception exActual = null;

            try
            {
                serviceToTest.TakeShot(currentShotCount: 0,
                                       angle: 45M, velocity: 10M, currentTarget: TestTarget);
            }
            catch (Exception ex)
            {
                exActual = ex;
            }

            // error is thrown
            Assert.IsNotNull(exActual);
            Assert.AreEqual(MOCK_ANGLE_ERROR_MSG, exActual.Message);
        }
        public void That_TakeShot_DoesNotCallCounterWhenVelocityIsInvalid()
        {
            // given a game flow object
            IGameFlow serviceToTest = GetTestGameFlowObject(
                out Mock <ITargetGenerator> mockTargetGenerator,
                out Mock <IAngleValidator> mockAngleValidator,
                out Mock <IVelocityValidator> mockVelocityValidator,
                out Mock <IShotCounter> mockShotCounter,
                TestTarget, isAngleValid: true,
                isVelocityValid: false,
                shotCount: 1);

            // when TakeShot is called
            try
            {
                serviceToTest.TakeShot(currentShotCount: 0,
                                       angle: 45M, velocity: 10M, currentTarget: TestTarget);
            }
            catch (Exception)
            {
            }

            // then shot counter is not called
            mockShotCounter.Verify(x => x.AddShot(It.IsAny <int>()), Times.Never);
        }
        public ActionResult Index(
            [Bind(Include = "Angle,Velocity,TargetX,TargetY,ShotsTaken")] GameFlowView model)
        {
            if (ModelState.IsValid)
            {
                model.WasTargetHit = _gameFlow.TakeShot(Request["ShotCount"].AsInt(),
                                                        model.Angle, model.Velocity,
                                                        new Coordinate(model.TargetX, model.TargetY));

                model.ShotsTaken = _gameFlow.GetShotCount();
            }
            return(View(model));
        }
        public void That_TakeShot_CallsYCalculatorForValidShot()
        {
            IGameFlow serviceToTest = GetTestGameFlowObject(
                out Mock <IXCoordinateCalculator> mockXCalculator,
                out Mock <IYCoordinateCalculator> mockYCalculator,
                shotCount: 0);

            // when TakeShot is called
            serviceToTest.TakeShot(currentShotCount: 0,
                                   angle: 45M, velocity: 10M, currentTarget: TestTarget);

            // then YCalculator is called
            mockYCalculator.Verify(x => x.Get(It.IsAny <decimal>(), It.IsAny <decimal>()),
                                   Times.Once);
        }
        public void That_TakeShot_CallsAngleValidatorOnce()
        {
            // given a game flow object
            IGameFlow serviceToTest = GetTestGameFlowObject(
                out Mock <ITargetGenerator> mockTargetGenerator,
                out Mock <IAngleValidator> mockAngleValidator,
                TestTarget, isAngleValid: true);

            // when TakeShot is called
            bool actual = serviceToTest.TakeShot(currentShotCount: 0,
                                                 angle: 45M, velocity: 10M, currentTarget: TestTarget);

            // IAngleValidator is called once
            mockAngleValidator.Verify(x => x.GetIsValid(It.IsAny <decimal>()),
                                      Times.Once);
        }
        public void That_TakeShot_CallsShotCounterForValidShot()
        {
            // given a game flow object
            IGameFlow serviceToTest = GetTestGameFlowObject(
                out Mock <ITargetGenerator> mockTargetGenerator,
                out Mock <IAngleValidator> mockAngleValidator,
                out Mock <IVelocityValidator> mockVelocityValidator,
                out Mock <IShotCounter> mockShotCounter,
                TestTarget, isAngleValid: true,
                isVelocityValid: true,
                shotCount: 1);

            // when TakeShot is called
            serviceToTest.TakeShot(currentShotCount: 0,
                                   angle: 45M, velocity: 10M, currentTarget: TestTarget);

            // then shot counter is called once
            mockShotCounter.Verify(x => x.AddShot(It.IsAny <int>()), Times.Once);
        }
        public void That_TakeShot_ReturnsTrueForValidShotMissed()
        {
            // given a game flow object
            var testStartTarget = new Coordinate(x: 1, y: 2);

            IGameFlow serviceToTest = GetTestGameFlowObject(
                out Mock <ITargetGenerator> mockTargetGenerator,
                out Mock <IAngleValidator> mockAngleValidator,
                out Mock <IVelocityValidator> mockVelocityValidator,
                out Mock <IShotCounter> mockShotCounter,
                out Mock <IXCoordinateCalculator> xCalculator,
                out Mock <IYCoordinateCalculator> yCalculator,
                testStartTarget, isAngleValid: true,
                isVelocityValid: true,
                shotCount: 1, xResult: 1, yResult: 2);

            // when TakeShot is called for vaid hit shot
            bool actual = serviceToTest.TakeShot(currentShotCount: 0,
                                                 angle: 45M, velocity: 10M, currentTarget: testStartTarget);

            // then true is returned
            Assert.IsTrue(actual);
        }