Example #1
0
        public void TestBonusBuilder()
        {
            // arrange
            var user           = new UserGameKey(-1, 109);
            var requestContext = new RequestContext <SpinArgs>("simulation", "Cleopatra", PlatformType.None)
            {
                GameSetting = new GameSetting {
                    GameSettingGroupId = 1
                },
                Query = new QueryCollection {
                },
            };

            var userSession = new UserSession
            {
                SessionKey = "unittest"
            };
            var spinArgs = new SpinArgs
            {
                LineBet    = 1,
                Multiplier = 1
            };

            requestContext.Parameters  = spinArgs;
            requestContext.UserSession = userSession;
            var freeSpinWheel = new FortuneChimesWheel
            {
                Reels = new List <int[]> {
                    new [] { 0, 1, 2 },
                    new [] { 0, 10, 1 },
                    new [] { 0, 10, 3 },
                    new [] { 0, 10, 2 },
                    new [] { 2, 3, 4 }
                }
            };

            var explodingWheel = new FortuneChimesWheel
            {
                Reels = new List <int[]> {
                    new [] { 0, 1, 2 },
                    new [] { 0, 4, 1 },
                    new [] { 0, 10, 3 },
                    new [] { 0, 10, 2 },
                    new [] { 2, 3, 4 }
                }
            };

            // Action
            var freeSpin = GameReduce.DoSpin(1, requestContext, freeSpinWheel);
            var expoding = GameReduce.DoSpin(1, requestContext, explodingWheel);

            // Assert
            Assert.IsTrue(freeSpin.HasBonus);
            Assert.IsTrue(freeSpin.Bonus.ClientId == 3);
            Assert.IsTrue(freeSpin.Bonus.Count == 14);

            Assert.IsTrue(expoding.HasBonus);
            Assert.IsTrue(expoding.Bonus.ClientId == 4);
            Assert.IsTrue(expoding.Bonus.Count == 1);
        }
Example #2
0
        public void TestCreateFreeAndReSpinGameBonus()
        {
            // Arrange
            var user  = new UserGameKey(-1, 109);
            var wheel = new FortuneChimesWheel
            {
                Reels = new List <int[]>
                {
                    new int[] { 1, 1, 1 },
                    new int[] { 2, 2, 2 },
                    new int[] { 10, 10, 10 },
                    new int[] { 4, 4, 4 },
                    new int[] { 5, 5, 5 }
                },
                Indices = new int[] { 0, 0, 0, 0, 0 }
            };
            var result1 = new FortuneChimesSpinResult(user)
            {
                Wheel        = wheel,
                WinPositions = new List <WinPosition>
                {
                    new WinPosition
                    {
                        Line = 0, Count = 3, Symbol = 10, Multiplier = 1, RowPositions = new List <int> {
                            0, 2, 2, 2, 0
                        }
                    },
                    new WinPosition {
                        Line = 1, Count = 3, RowPositions = new List <int> {
                            1, 1, 1, 0, 0
                        }
                    }
                },
                Bonus = new Stake(Guid.NewGuid(), 3)
                {
                    Count = 4
                }
            };

            // action
            var bonus1 = module.CreateBonus(result1);
            var state1 = ((FortuneChimesBonus)bonus1.Value).State;

            // Assert
            Assert.AreEqual(result1.Bonus.Guid, bonus1.Value.Guid);
            Assert.AreEqual(true, state1 is FreeSpinState);
            Assert.AreEqual(true, ((FreeSpinState)state1).Count == 4);
            Assert.AreEqual(true, !state1.IsCompleted);
            Assert.AreEqual(((FreeSpinState)state1).ReSpinCollapse.Indices, wheel.Indices);
            Assert.AreEqual(((FreeSpinState)state1).ReSpinCollapse.ReelsReSpin, new List <int[]>
            {
                new int[0],
                new int[0],
                new int[0],
                new int[0],
                new int[] { 5, 5, 5 }
            });
        }
Example #3
0
        public void TestExplodingFeature()
        {
            // arrange
            var user        = new UserGameKey(-1, 109);
            var userSession = new UserSession
            {
                SessionKey = "unittest",
                UserId     = -1
            };
            var bet = new SpinBet(user, PlatformType.None)
            {
                Lines      = 30,
                LineBet    = 1.0m,
                Multiplier = 1
            };
            var requestBonusContext = new RequestContext <BonusArgs>("unittest", "FortuneChimes", PlatformType.None)
            {
                GameSetting = new GameSetting {
                    GameSettingGroupId = 1
                },
                Query = new QueryCollection {
                },
            };

            requestBonusContext.UserSession = userSession;
            requestBonusContext.UserGameKey = user;
            var bonusContext = new BonusStateContext(1, new FortuneChimesBonus {
                SpinBet = bet
            });
            var bonusPositions = new List <BonusPosition> {
                new BonusPosition {
                    RowPositions = new List <int> {
                        1, 1, 1, 0, 0
                    }
                }
            };
            var wheel = new FortuneChimesWheel
            {
                Reels = new List <int[]> {
                    new[] { 1, -1, -1 }, new[] { 1, -1, -1 }, new[] { 1, -1, -1 }, new[] { -1, -1, -1 }, new[] { -1, -1, -1 }
                },
                Indices = new int[] { 1, 2, 3, 4, 5 }
            };
            var reSpinCollapse = new ReSpinCollapse(bonusPositions, wheel, new List <int[]> {
                new int[0], new int[0], new int[0], new int[] { -1, -2, -3 }, new int[] { -1, -2, -3 }
            });
            var state = new ReSpinState(reSpinCollapse);

            //Action
            var response = state.Handle(requestBonusContext, bonusContext);

            // Assert
            Assert.AreEqual(response.result.Win > 0, response.nextState is ReSpinState);
            Assert.AreEqual(response.result.Win > 0, !response.nextState.IsCompleted);
            Assert.AreEqual(response.result.Win == 0, response.nextState is Finish);
        }
Example #4
0
        public void TestSpin()
        {
            // Arrange
            var user           = new UserGameKey(-1, 109);
            var requestContext = new RequestContext <SpinArgs>("simulation", "Cleopatra", PlatformType.None)
            {
                GameSetting = new GameSetting {
                    GameSettingGroupId = 1
                },
                Query = new QueryCollection {
                },
            };

            var userSession = new UserSession
            {
                SessionKey = "unittest"
            };
            var spinArgs = new SpinArgs
            {
                LineBet    = 1,
                Multiplier = 1
            };

            requestContext.Parameters  = spinArgs;
            requestContext.UserSession = userSession;
            var wheel = new FortuneChimesWheel
            {
                Reels = new List <int[]> {
                    new [] { 0, 1, 2 },
                    new [] { 0, 10, 1 },
                    new [] { 0, 10, 3 },
                    new [] { 0, 10, 2 },
                    new [] { 2, 3, 4 }
                }
            };

            // Action
            var result      = GameReduce.DoSpin(1, requestContext, wheel);
            var responseXml = xmlhelper.Serialize(result.ToResponseXml(ResponseXmlFormat.None));
            var element     = XElement.Parse(responseXml, LoadOptions.PreserveWhitespace);

            // Assert
            Assert.IsNotNull(element);
            Assert.IsTrue(element.Element("wheels") != null);
            Assert.AreEqual(wheel.Reels.Select(ele => string.Join(',', ele)).Aggregate((s1, s2) => string.Join(',', s1, s2)), element.Element("wheels").Attribute("val").Value);
            Assert.AreEqual(result.Win > 0, element.Element("win") != null);
            Assert.AreEqual(result.Win, decimal.Parse(element.Element("win").Value));
            Assert.AreEqual(result.Win > 0, element.Element("winposition") != null);
            Assert.AreEqual(result.HasBonus, element.Element("bonus") != null);
            Assert.AreEqual(result.HasBonus, element.Element("bonusposition") != null);
        }
Example #5
0
        public void TestCreateReSpinBonus()
        {
            // Arrange
            var user  = new UserGameKey(-1, 109);
            var wheel = new FortuneChimesWheel
            {
                Reels = new List <int[]>
                {
                    new int[] { 1, 1, 1 },
                    new int[] { 2, 2, 2 },
                    new int[] { 3, 3, 3 },
                    new int[] { 4, 4, 4 },
                    new int[] { 5, 5, 5 },
                },
                Indices = new int[] { 0, 0, 0, 0, 0 }
            };
            var result1 = new FortuneChimesSpinResult(user)
            {
                Wheel          = wheel,
                BonusPositions = new List <BonusPosition> {
                    new BonusPosition {
                        Line = 1, Multiplier = 1, RowPositions = new List <int> {
                            1, 2, 2, 2, 0
                        }
                    }
                },
                Bonus = new Stake(Guid.NewGuid(), 4)
                {
                    Count = 1
                }
            };

            // action
            var bonus1 = module.CreateBonus(result1);
            var state1 = ((FortuneChimesBonus)bonus1.Value).State;

            // Assert
            Assert.AreEqual(result1.Bonus.Guid, bonus1.Value.Guid);
            Assert.AreEqual(true, state1 is ReSpinState);
            Assert.AreEqual(true, ((ReSpinState)state1).Count == 1);
        }
        public void FullCycle(int level, decimal spinBet)
        {
            var strips = Slot.Games.FortuneChimes.Configuration.Config.MainGameReelStrip[0];
            var reel1  = strips[0];
            var reel2  = strips[1];
            var reel3  = strips[2];
            var reel4  = strips[3];
            var reel5  = strips[4];
            var user   = new UserGameKey(-1, 109)
            {
                Level = level
            };
            var summData = new SummaryData();
            var sdt      = DateTime.Now;
            var spinArgs = new SpinArgs
            {
                LineBet    = spinBet,
                Multiplier = 1
            };
            var request = user.CreateRequestContext <SpinArgs>("fortunechimes");

            for (int i1 = 0; i1 < reel1.Count; i1++)
            {
                for (int i2 = 0; i2 < reel2.Count; i2++)
                {
                    for (int i3 = 0; i3 < reel3.Count; i3++)
                    {
                        for (int i4 = 0; i4 < reel4.Count; i4++)
                        {
                            for (int i5 = 0; i5 < reel5.Count; i5++)
                            {
                                request.Parameters = spinArgs;
                                var r1 = reel1.TakeCircular(i1, 3).ToArray();
                                var r2 = reel2.TakeCircular(i2, 3).ToArray();
                                var r3 = reel3.TakeCircular(i3, 3).ToArray();
                                var r4 = reel4.TakeCircular(i4, 3).ToArray();
                                var r5 = reel5.TakeCircular(i5, 3).ToArray();
                                if (i1 == 2 && i2 == i3 && i3 == i4 && i4 == 9)
                                {
                                }
                                var wheel = new FortuneChimesWheel
                                {
                                    Reels = new List <int[]> {
                                        r1, r2, r3, r4, r5
                                    },
                                    Indices = new int[] { i1, i2, i3, i4, i5 }
                                };
                                summData.SpinCounter++;
                                summData.TotalBet += Slot.Games.FortuneChimes.Configuration.Config.Lines * spinBet;
                                var result        = GameReduce.DoSpin(level, request, wheel);
                                var scatterPayout = result.WinPositions.Where(ele => ele.Line == 0 && ele.Symbol == 10).Sum(item => item.Win);
                                summData.MainGameScatterWin     += scatterPayout;
                                summData.MainGameNoneScatterWin += result.Win - scatterPayout;
                                if (scatterPayout > 0)
                                {
                                    summData.MgFHit++;
                                }
                                if (result.HasBonus)
                                {
                                    var bonus        = result.Bonus;
                                    var bonusRequest = user.CreateRequestContext <BonusArgs>("fortunechimes");
                                    var typeOfBonus  = bonus.ClientId;
                                    switch (typeOfBonus)
                                    {
                                    case 4:
                                    case 5:
                                        summData.MgExplodingHit++;
                                        break;

                                    case 3:
                                        summData.MgFHit++;
                                        break;

                                    default:
                                        throw new Exception();
                                    }
                                    summData += ExecuteBonus(level, bonusRequest, result);
                                }
                            }
                        }
                    }
                }
            }

            var edt        = DateTime.Now;
            var oldOut     = Console.Out;
            var fileStream = new FileStream($@"..\..\..\Results\FortuneChimes\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write);
            var writer     = new StreamWriter(fileStream);

            Console.SetOut(writer);
            Console.WriteLine(String.Format("Test.Level                  : {0}", level));
            Console.WriteLine(String.Format("Test.TimeStart              : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString()));
            Console.WriteLine(String.Format("Test.TimeEnd                : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString()));
            Console.WriteLine(String.Format("SpinCount                   : {0}", summData.SpinCounter));
            Console.WriteLine(String.Format("TotalBet                    : {0,12:0.00}", summData.TotalBet));
            Console.WriteLine("----------------------------------------");
            Console.WriteLine(String.Format("Exploding Hit Rate     (MG) : {0,12:0.00}", summData.MgExplodingHitRate));
            Console.WriteLine(String.Format("MG Feature Hit Rate         : {0,12:0.00}", summData.MgFHitRate));
            Console.WriteLine(String.Format("MG Scatter ReSpin Hit       : {0,12:0.00}", summData.MgScatterReSpinFHit));
            Console.WriteLine(String.Format("MG None Scatter ReSpin Hit  : {0,12:0.00}", summData.MgNoneScatterReSpinFHit));
            Console.WriteLine(String.Format("MG ReSpin Feature Hit Rate  : {0,12:0.00}", summData.MgReSpinFHitRate));

            //Console.WriteLine(String.Format("MG Avg Feature Hit Rate     : {0,12:0.00}", summData));
            Console.WriteLine(String.Format("Exploding Feature Hit Rate  : {0,12:0.00}", summData.MgExplodingFHitRate));
            Console.WriteLine(String.Format("Exploding Hit Rate     (FG) : {0,12:0.00}", summData.FgExplodingHitRate));
            Console.WriteLine(String.Format("Reveal Hit Rate        (FG) : {0,12:0.00}", summData.FgRevealHitRate));
            Console.WriteLine(String.Format("MG Scatter Win              : {0,12:0.00}", summData.MainGameScatterWin));
            Console.WriteLine(String.Format("MG None Scatter Win         : {0,12:0.00}", summData.MainGameNoneScatterWin));
            Console.WriteLine(String.Format("MG ReSpin Scatter Win       : {0,12:0.00}", summData.MgScatterExplodingWin));
            Console.WriteLine(String.Format("MG ReSpin None Scatter Win  : {0,12:0.00}", summData.MgNonScatterExplodingWin));
            Console.WriteLine(String.Format("MG Reveal Win               : {0,12:0.00}", summData.MgRevealWin));
            Console.WriteLine(String.Format("FG Win                      : {0,12:0.00}", summData.FSTotalWin));
            Console.WriteLine(String.Format("FG Exploding Win            : {0,12:0.00}", summData.FgExplodingWin));
            Console.WriteLine(String.Format("FG Reveal Win               : {0,12:0.00}", summData.FgRevealWin));
            Console.WriteLine("----------------------------------------");
            if (summData.TotalBet > 0)
            {
                Console.WriteLine(String.Format("MG Scatter RTP             : {0,11:0.00000000000000000000000000}%", 100 * summData.MainGameScatterWin / summData.TotalBet));
                Console.WriteLine(String.Format("MG None Scatter RTP        : {0,11:0.00000000000000000000000000}%", 100 * summData.MainGameNoneScatterWin / summData.TotalBet));
                Console.WriteLine(String.Format("MG ReSpin Scatter RTP      : {0,11:0.00000000000000000000000000}%", 100 * summData.MgScatterExplodingWin / summData.TotalBet));
                Console.WriteLine(String.Format("MG ReSpin None Scatter RTP : {0,11:0.00000000000000000000000000}%", 100 * summData.MgNonScatterExplodingWin / summData.TotalBet));
                Console.WriteLine(String.Format("MG Reveal  RTP             : {0,11:0.00000000000000000000000000}%", 100 * summData.MgRevealWin / summData.TotalBet));

                Console.WriteLine(String.Format("FG RTP                     : {0,11:0.00}%", 100 * summData.FSTotalWin / summData.TotalBet));
                Console.WriteLine(String.Format("FG Exploding RTP           : {0,11:0.00}%", 100 * summData.FgExplodingWin / summData.TotalBet));
                Console.WriteLine(String.Format("FG Reveal RTP              : {0,11:0.00}%", 100 * summData.FgRevealWin / summData.TotalBet));
            }
            Console.WriteLine("--- RTP.OverAll ------------------------");
            Console.WriteLine(String.Format("RTP.Total (Over All)      : {0,11:0.0000}%", 100 * summData.RTPOverAll));

            Console.SetOut(oldOut);
            writer.Close();
            fileStream.Close();

            Console.WriteLine($"Max Collapse {maxCollapse}");
            Console.WriteLine("Done");
        }
Example #7
0
        public void TestExecuteBonus()
        {
            // Arrange
            var user    = new UserGameKey(-1, 109);
            var spinBet = new SpinBet(user, PlatformType.None)
            {
                Lines   = 30,
                LineBet = 1.0m
            };
            var wheel = new FortuneChimesWheel
            {
                Reels = new List <int[]>
                {
                    new int[] { 1, 1, 1 },
                    new int[] { 2, 10, 2 },
                    new int[] { 3, 10, 3 },
                    new int[] { 4, 10, 4 },
                    new int[] { 5, 5, 5 },
                },
                Indices = new int[] { 0, 0, 0, 0, 0 }
            };
            var result1 = new FortuneChimesSpinResult(user)
            {
                Wheel          = wheel,
                BonusPositions = new List <BonusPosition> {
                    new BonusPosition {
                        Line = 1, Multiplier = 1, RowPositions = new List <int> {
                            0, 2, 2, 2, 0
                        }
                    }
                },
                Bonus = new Stake(Guid.NewGuid(), 3)
                {
                    Count = 1
                }
            };

            result1.SpinBet = spinBet;
            var userSession = new UserSession
            {
                SessionKey = "unittest",
                UserId     = -1
            };
            var requestContext = new RequestContext <SpinArgs>("simulation", "Cleopatra", PlatformType.None)
            {
                GameSetting = new GameSetting {
                    GameSettingGroupId = 1
                },
                Query = new QueryCollection {
                },
                Game  = new Game {
                    Id = 109
                }
            };
            var requestBonusContext = new RequestContext <BonusArgs>("unittest", "Cleopatra", PlatformType.None)
            {
                GameSetting = new GameSetting {
                    GameSettingGroupId = 1
                },
                Query = new QueryCollection {
                },
            };

            requestBonusContext.UserSession = userSession;
            requestBonusContext.UserGameKey = user;
            var bonus1 = module.CreateBonus(result1).Value;

            var entity1 = new BonusEntity
            {
                UserId       = userSession.UserId,
                GameId       = requestContext.Game.Id,
                Guid         = bonus1.Guid.ToString("N"),
                Data         = Model.Utility.Extension.ToByteArray(bonus1),
                BonusType    = bonus1.GetType().Name,
                Version      = 3,
                IsOptional   = bonus1.IsOptional,
                IsStarted    = bonus1.IsStarted,
                RoundId      = 1,
                BetReference = ""
            };

            // action
            var freeSpinResult1 = module.ExecuteBonus(1, entity1, requestBonusContext).Value as FortuneChimesBonusSpinResult;

            // assert
            Assert.NotNull(freeSpinResult1);
            Assert.AreEqual(freeSpinResult1.GameResultType, GameResultType.FreeSpinResult);
        }
Example #8
0
        public void TestReSpinCollapseFeature()
        {
            // arrange
            var user        = new UserGameKey(-1, 109);
            var userSession = new UserSession
            {
                SessionKey = "unittest",
                UserId     = -1
            };
            var bet = new SpinBet(user, PlatformType.None)
            {
                Lines      = 30,
                LineBet    = 1.0m,
                Multiplier = 1
            };
            var requestBonusContext = new RequestContext <BonusArgs>("unittest", "Fortune Chimes", PlatformType.None)
            {
                GameSetting = new GameSetting {
                    GameSettingGroupId = 1
                },
                Query = new QueryCollection {
                },
            };

            requestBonusContext.UserSession = userSession;
            requestBonusContext.UserGameKey = user;
            var bonusContext = new BonusStateContext(1, new FortuneChimesBonus {
                SpinBet = bet
            });
            var bonusPositions = new List <BonusPosition> {
                new BonusPosition {
                    Line = 1, RowPositions = new List <int> {
                        1, 1, 1, 0, 0
                    }
                }
            };
            var wheel = new FortuneChimesWheel
            {
                Reels = new List <int[]> {
                    new[] { 1, -1, -1 }, new[] { 1, -1, -1 }, new[] { 1, -1, -1 }, new[] { -1, -1, -1 }, new[] { -1, -1, -1 }
                },
                Indices = new int[] { 1, 2, 3, 4, 5 }
            };
            var state = new ReSpinState(new ReSpinCollapse(bonusPositions, wheel, new List <int[]> {
                new int[0], new int[0], new int[0], new int[] { 1, 2, 4 }, new int[] { 2, 5, 7 }
            }));

            //Action
            var response    = state.Handle(requestBonusContext, bonusContext);
            var result      = response.result;
            var instanceWin = result.SpinResult.InstanceWin;
            var responseXml = xmlhelper.Serialize(result.ToResponseXml(ResponseXmlFormat.None));
            var element     = XElement.Parse(responseXml, LoadOptions.PreserveWhitespace);

            // Assert
            Assert.IsNotNull(element);
            Assert.IsTrue(element.Element("data").Element("spin").Element("wheels") != null);
            Assert.AreEqual(result.Win, decimal.Parse(element.Element("win").Value));
            Assert.AreEqual(result.Win > 0, element.Element("data").Element("spin").Element("winposition").Descendants().Count() > 0);
            Assert.AreEqual(result.SpinResult.HasBonus, !string.IsNullOrEmpty(element.Element("data").Element("spin").Element("bonus").Value));
            Assert.AreEqual(result.SpinResult.HasBonus, element.Element("data").Element("spin").Element("bonusposition").Descendants().Count() > 0);
            Assert.AreEqual(instanceWin != null, element.Element("data").Element("spin").Element("iw").HasAttributes);
        }