Beispiel #1
0
        public Result <SpinSlotsResponse> BuildSpin(SpinSlotsRequest request)
        {
            var totalOutcome = 0m;
            var rows         = new List <SymbolBase>();

            for (var i = 0; i < Rows; i++)
            {
                var rowResult = RowBuilder.BuildRow();
                if (!rowResult.Success)
                {
                    return(Result <SpinSlotsResponse> .OnFailure(rowResult.FailureMessage));
                }

                rows.AddRange(rowResult.Data);

                var outcomeResult = OutcomeBuilder.Build(rowResult.Data);
                if (!outcomeResult.Success)
                {
                    return(Result <SpinSlotsResponse> .OnFailure(rowResult.FailureMessage));
                }

                totalOutcome += outcomeResult.Data;
            }

            return(ResponseBuilder.Build(request, rows, totalOutcome));
        }
Beispiel #2
0
        public Result <SpinSlotsResponse> Spin(SpinSlotsRequest request)
        {
            var result = Validator.Validate(request);

            if (!result.Success)
            {
                return(Result <SpinSlotsResponse> .OnFailure(result.FailureMessage));
            }

            return(Builder.BuildSpin(request));
        }
        public IActionResult Spin([FromBody] SpinSlotsRequest request)
        {
            var result = Service.Spin(request);

            if (!result.Success)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
        }
        public Result <SpinSlotsResponse> Build(SpinSlotsRequest request, List <SymbolBase> rows, decimal outcome)
        {
            var currentBalance = request.Balance - request.Stake;
            var winnings       = outcome * request.Stake;

            currentBalance += winnings;

            return(Result <SpinSlotsResponse> .OnSuccess(new SpinSlotsResponse()
            {
                Balance = Math.Max(0, Math.Round(currentBalance, 2)),
                Winnings = Math.Round(winnings, 2),
                Rows = rows.Select(symbol => symbol.Symbol).ToArray <string>()
            }));
        }
Beispiel #5
0
        public void Spin_BuilderHasRan()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 10,
                Stake   = 5
            };

            // Act
            var result = Service.Spin(request);

            // Assert
            _mockBuilder.Verify(mb => mb.BuildSpin(request), Times.Once);
        }
Beispiel #6
0
        public void Spin_ValidatorHasRan()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 10,
                Stake   = 5
            };

            // Act
            var result = Service.Spin(request);

            // Assert
            _mockValidator.Verify(mv => mv.Validate(request), Times.Once);
        }
Beispiel #7
0
        public void Spin_ValidSpin()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 10,
                Stake   = 5
            };

            // Act
            var result = Service.Spin(request);

            // Assert
            result.Success.Should().BeTrue();
            result.Data.Balance.Should().BeGreaterOrEqualTo(5);
        }
Beispiel #8
0
        public void Spin_ValidatorHasFailed()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 10,
                Stake   = 20
            };

            // Act
            var result = Service.Spin(request);

            // Assert
            _mockValidator.Verify(mv => mv.Validate(request), Times.Once);
            _mockBuilder.Verify(mb => mb.BuildSpin(request), Times.Never);
        }
        public void BuildSpin_VerifyBuilders()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 200,
                Stake   = 10
            };

            // Act
            var result = Builder.BuildSpin(request);

            // Assert
            _mockRowBuilder.Verify(mrb => mrb.BuildRow(), Times.Exactly(SpinSlotsBuilder.Rows));
            _mockOutcomeBuilder.Verify(mob => mob.Build(It.IsAny <List <SymbolBase> >()), Times.Exactly(SpinSlotsBuilder.Rows));
            _mockSpinSlotsResponseBuilder.Verify(mob => mob.Build(It.IsAny <SpinSlotsRequest>(), It.IsAny <List <SymbolBase> >(), It.IsAny <decimal>()), Times.Once);
        }
        public void BuildSpin_WinningSpin()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 200,
                Stake   = 10
            };
            var expectedBalance = 238;

            // Act
            var result = Builder.BuildSpin(request);

            // Assert
            result.Success.Should().BeTrue();
            result.Data.Balance.Should().Be(expectedBalance);
        }
        public void Validate_BalanceGreaterThanZero()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 0
            };
            var expectedResult  = false;
            var expectedMessage = "Your current balance is empty. Please deposit more funds to continue playing.";

            // Act
            var result = new SpinSlotsValidator().Validate(request);

            // Assert
            result.Success.Should().Be(expectedResult);
            result.FailureMessage.Should().Be(expectedMessage);
        }
        public void Validate_ValidSpinSlotsRequest()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 10,
                Stake   = 10
            };
            var expectedResult = true;

            // Act
            var result = new SpinSlotsValidator().Validate(request);

            // Assert
            result.Success.Should().Be(expectedResult);
            result.FailureMessage.Should().BeNullOrWhiteSpace();
        }
        public void Validate_StakeeGreaterThanZero()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 10,
                Stake   = 0
            };
            var expectedResult  = false;
            var expectedMessage = "Please stake a bet of 1 or higher.";

            // Act
            var result = new SpinSlotsValidator().Validate(request);

            // Assert
            result.Success.Should().Be(expectedResult);
            result.FailureMessage.Should().Be(expectedMessage);
        }
        public void BuildResponse_BalancePositiveOrZero()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 5,
                Stake   = 10
            };
            var rows    = new List <SymbolBase>();
            var outcome = 0;

            // Act
            var result = new SpinSlotsResponseBuilder().Build(request, rows, outcome);

            // Assert
            result.Success.Should().BeTrue();
            result.Data.Balance.Should().Be(0);
        }
        public void Validate_BalanceGreaterThanOrEqualStake()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 10,
                Stake   = 11
            };
            var expectedResult  = false;
            var expectedMessage = $"You can not stake more than your current balance. Please add a stake less than {request.Balance}.";

            // Act
            var result = new SpinSlotsValidator().Validate(request);

            // Assert
            result.Success.Should().Be(expectedResult);
            result.FailureMessage.Should().Be(expectedMessage);
        }
        public void BuildResponse_BalanceUpdated()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 200,
                Stake   = 10
            };
            var rows            = new List <SymbolBase>();
            var outcome         = 2;
            var expectedBalance = 210;

            // Act
            var result = new SpinSlotsResponseBuilder().Build(request, rows, outcome);

            // Assert
            result.Success.Should().BeTrue();
            result.Data.Balance.Should().Be(expectedBalance);
        }
        public void BuildResponse_DisplayNameReturned()
        {
            // Assign
            var request = new SpinSlotsRequest()
            {
                Balance = 200,
                Stake   = 10
            };
            var rows = new List <SymbolBase>()
            {
                new Apple()
            };
            var outcome = 2;

            // Act
            var result = new SpinSlotsResponseBuilder().Build(request, rows, outcome);

            // Assert
            result.Success.Should().BeTrue();
            result.Data.Rows.All(item => item == new Apple().Symbol).Should().BeTrue();
        }