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); }
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 } }); }
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); }
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); }
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"); }
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); }
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); }