Skip to content

Commit

Permalink
Merge pull request #18 from Suptzs/Development
Browse files Browse the repository at this point in the history
Basic implementation of an online lottery
  • Loading branch information
Suptzs authored Apr 10, 2017
2 parents ffe0940 + 9e60e3d commit 4915ca9
Show file tree
Hide file tree
Showing 19 changed files with 371 additions and 4 deletions.
1 change: 1 addition & 0 deletions FitNesseRoot/OnlineLottery/SettlementTestSuite.wiki
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
!contents -R
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
Test
---
|Tickets in the Draw|
|Player|Numbers|Value|
|Ford|2,11,22,33,39,18|50|
|Arthur|1,5,4,7,9,20|50|
|Trisha|10,21,30,6,16,26|50|
|Marvin|12,13,14,15,16,17|50|

|Draw results are|1,5,4,20,9,7|

|Prize Distribution|
|Winning Tickets?|Prize Money?|
|1 |68 |

|Accounts after the Draw|
|Player|Balance?|
|Arthur|118|
|Ford|50|
|Trisha|50|
|Marvin|50|
8 changes: 8 additions & 0 deletions FitNesseRoot/OnlineLottery/SettlementTestSuite/SetUp.wiki
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
!|OnlineLottery.Test.SettlementTest|

|Accounts before the draw|
|player|balance|
|Arthur|100|
|Ford|100|
|Trisha|100|
|Marvin|100|
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
Test
---
|Tickets in the Draw|
|Player|Numbers|Value|
|Ford|2,11,22,33,39,18|50|
|Arthur|1,5,4,7,9,20|80|
|Trisha|10,1,20,5,4,11|20|
|Marvin|12,13,14,15,16,17|50|

|Draw results are|1,5,4,20,38,37|

|Prize Distribution|
|Winning Tickets?|Prize Money?|
|2 |2, 8 |

|Accounts after the Draw|
|Player|Balance?|
|Arthur|28|
|Ford|50|
|Trisha|82|
|Marvin|50|
4 changes: 4 additions & 0 deletions FitNesseRoot/OnlineLottery/TicketReview.wiki
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
Suite
---
!contents -R
5 changes: 5 additions & 0 deletions FitNesseRoot/OnlineLottery/TicketReview/SetUp.wiki
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
!|OnlineLottery.Test.ReviewTickets|

|Draw on |01.01.2017| is open|

|Player|john|opens account with|100|dollars|
14 changes: 14 additions & 0 deletions FitNesseRoot/OnlineLottery/TicketReview/SeveralTicketsOneDraw.wiki
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
Test
---
|Player|john|buys a ticket with numbers|1,3,4,5,8,10|for draw on|01.01.2017|

|Player|john|buys a ticket with numbers|2,4,5,8,10,12|for draw on|01.01.2017|

|Player|john|buys|5|tickets with numbers|3,6,9,12,15,18|for draw on|01.01.2017|

|Player|john|lists open tickets|
|Drawdate|Numbers|Value|
|01.01.2017|1,3,4,5,8,10|10|
|01.01.2017|2,4,5,8,10,12|10|
|01.01.2017|3,6,9,12,15,18|50|
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
Test
---
|Draw on|02.01.2017|is open|

|Draw on|03.01.2017|is open|

|Player|john|buys a ticket with numbers|1,3,4,5,8,10|for draw on|02.01.2017|

|Player|john|buys a ticket with numbers|1,3,4,5,8,10|for draw on|01.01.2017|

|Player|john|buys|5|tickets with numbers|3,6,9,12,15,18|for draw on|01.01.2017|

|Player|john|lists tickets for draw on|01.01.2017|
|value|numbers|
|10|1,3,4,5,8,10|
|50|3,6,9,12,15,18|

|Player|john|lists tickets for draw on|02.01.2017|
|value|numbers|
|10|1,3,4,5,8,10|

|Player|john|lists tickets for draw on|03.01.2017|
|value|numbers|
16 changes: 16 additions & 0 deletions FitNesseRoot/OnlineLottery/TicketReview/TwoAccountsOneDraw.wiki
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
Test
---
|Player|tom|opens account with|50|dollars|

|Player|john|buys a ticket with numbers|1,3,4,5,8,10|for draw on|01/01/2017|

|Player|tom|buys a ticket with numbers|2,4,5,8,10,12|for draw on|01/01/2017|

|Player|john|lists tickets for draw on|01/01/2017|
|value|numbers|
|10|1,3,4,5,8,10|

|Player|tom|lists tickets for draw on|01/01/2017|
|value|numbers|
|10|2,4,5,8,10,12|
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
Test
---
|Draw on|02.01.2017|is open|

|Player|john|buys a ticket with numbers|1,3,4,5,8,10|for draw on|01.01.2017|

|Player|john|buys a ticket with numbers|1,3,4,5,8,10|for draw on|02.01.2017|

|Player|john|buys|5|tickets with numbers|3,6,9,12,15,18|for draw on|01.01.2017|

|Numbers|1,3,4,5,31,32|are drawn on|01.01.2017|

|Player|john|lists tickets for draw on|01.01.2017|
|value|numbers|is open|winnings|
|10|1,3,4,5,8,10|false|3|
|50|3,6,9,12,15,18|false|0|

|Player|john|lists open tickets|
|drawdate|value|numbers|
|02.01.2017|10|1,3,4,5,8,10|
10 changes: 10 additions & 0 deletions FitNesseRoot/RecentChanges.wiki
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
|OnlineLottery.TicketReview.SeveralTicketsOneDraw||23:18:36 Mo, Apr 10, 2017|
|OnlineLottery.TicketReview.WinningsRecordedCorrectly||22:36:05 Mo, Apr 10, 2017|
|OnlineLottery.TicketReview.SeveralTicketsTwoDraws||22:19:41 Mo, Apr 10, 2017|
|OnlineLottery.TicketReview.TwoAccountsOneDraw||22:05:37 Mo, Apr 10, 2017|
|OnlineLottery.TicketReview.SetUp||21:11:28 Mo, Apr 10, 2017|
|OnlineLottery.TicketReview||21:09:28 Mo, Apr 10, 2017|
|OnlineLottery.SettlementTestSuite.OneWinnerSixBalls||24:49:38 Mo, Apr 10, 2017|
|OnlineLottery.SettlementTestSuite.TwoWinnersFourBalls||24:49:01 Mo, Apr 10, 2017|
|OnlineLottery.SettlementTestSuite.SetUp||22:16:55 So, Apr 09, 2017|
|OnlineLottery.SettlementTestSuite||22:13:42 So, Apr 09, 2017|
|OnlineLottery.PurchaseTicketTestSuite.NotEnoughMoney||22:14:46 Do, Apr 06, 2017|
|OnlineLottery.PurchaseTicketTestSuite.NegativeAmountOfTickets||22:14:26 Do, Apr 06, 2017|
|OnlineLottery.PurchaseTicketTestSuite.MoreThanSixNumbers||22:14:04 Do, Apr 06, 2017|
Expand Down
4 changes: 2 additions & 2 deletions FitNesseRoot/properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
##FitNesse properties
#Thu Apr 06 21:36:03 CEST 2017
Version=vUnknown
#Mon Apr 10 18:54:43 CEST 2017
Version=v20161106
63 changes: 61 additions & 2 deletions OnlineLottery/DrawManager.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;

namespace OnlineLottery
{
public class DrawManager : IDrawManager
{
public decimal OperatorDeductionFactor => 0.5m;

private readonly IPlayerManager _playerManager;
private readonly Dictionary<DateTime, Draw> _draws = new Dictionary<DateTime, Draw>();

Expand All @@ -28,13 +31,69 @@ public IDraw CreateDraw(DateTime drawDate)
public void PurchaseTicket(DateTime drawDate, int playerId, int[] numbers, decimal value)
{
if (!_draws.ContainsKey(drawDate)) throw new DrawNotOpenException();
if(numbers.Length != 6) throw new WrongAmountOfNumbersException();
if(value < 0) throw new InvalidPurchaseException();
if (numbers.Length != 6) throw new WrongAmountOfNumbersException();
if (value < 0) throw new InvalidPurchaseException();

var d = _draws[drawDate];
var player = _playerManager.GetPlayer(playerId);
_playerManager.AdjustBalance(playerId, -value);
d.AddTicket(new Ticket(player, drawDate, numbers, value));
}

public IList<ITicket> GetOpenTickets(int playerId)
=> (from draw in _draws
from ticket in draw.Value.Tickets
where ticket.Holder.PlayerId == playerId && ticket.IsOpen
select ticket).ToList();

public IList<ITicket> GetTickets(DateTime drawDate, int playerId)
=> (from draw in _draws
from ticket in draw.Value.Tickets
where ticket.Holder.PlayerId == playerId && ticket.DrawDate == drawDate
select ticket).ToList();

public void SettleDraw(DateTime drawDate, int[] results)
{
var d = _draws[drawDate];
d.IsOpen = false;
var ticketCategories = SplitTicketsIntoCategories(results, d.Tickets);
for (var commonNumbers = 0; commonNumbers <= results.Length; commonNumbers++)
SettleTicketCategories(commonNumbers, d, ticketCategories[commonNumbers]);
}

private void SettleTicketCategories(int commonNumbers, IDraw draw, List<ITicket> tickets)
{
var prizePool = new WinningsCalculator().GetPrizePool(commonNumbers, draw.TotalPoolSize * (1 - OperatorDeductionFactor));
var totalTicketValue = GetTotalTicketValue(tickets);
foreach (Ticket t in tickets)
SettleTicket(t, prizePool, totalTicketValue);
}

private void SettleTicket(Ticket t, decimal prizePool, decimal totalTicketValue)
{
t.IsOpen = false;
if (prizePool <= 0) return;

t.Winnings = t.Value * prizePool / totalTicketValue;
_playerManager.AdjustBalance(t.Holder.PlayerId, t.Winnings);
}

private static Dictionary<int, List<ITicket>> SplitTicketsIntoCategories(int[] results, IEnumerable<ITicket> tickets)
{
var ticketCategories = new Dictionary<int, List<ITicket>>();

for (var i = 0; i <= results.Length; i++)
ticketCategories[i] = new List<ITicket>();

foreach(var t in tickets)
ticketCategories[CountCommonElements(t.Numbers, results)].Add(t);

return ticketCategories;
}

private static int CountCommonElements(IEnumerable<int> ticketNumbers, int[] results)
=> ticketNumbers.Sum(ticketNumber => results.Count(result => result == ticketNumber));

private static decimal GetTotalTicketValue(IEnumerable<ITicket> tickets) => tickets.Sum(t => t.Value);
}
}
5 changes: 5 additions & 0 deletions OnlineLottery/IDrawManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace OnlineLottery
{
Expand All @@ -22,5 +23,9 @@ public interface IDrawManager
IDraw GetDraw(DateTime date);
IDraw CreateDraw(DateTime drawDate);
void PurchaseTicket(DateTime drawDate, int playerId, int[] numbers, decimal value);
void SettleDraw(DateTime drawDate, int[] results);
IList<ITicket> GetOpenTickets(int playerId);
decimal OperatorDeductionFactor { get; }
IList<ITicket> GetTickets(DateTime drawDate, int playerId);
}
}
2 changes: 2 additions & 0 deletions OnlineLottery/ITicket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ public interface ITicket
IPlayerInfo Holder { get; }
DateTime DrawDate { get; }
decimal Value { get; }
bool IsOpen { get; }
decimal Winnings { get; }
}
}
2 changes: 2 additions & 0 deletions OnlineLottery/OnlineLottery.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
<Compile Include="PlayerRegistrationInfo.cs" />
<Compile Include="Test\PrizeDistributionForPayoutPool.cs" />
<Compile Include="Test\PurchaseTicket.cs" />
<Compile Include="Test\ReviewTickets.cs" />
<Compile Include="Test\SettlementTest.cs" />
<Compile Include="Ticket.cs" />
<Compile Include="WinningsCalculator.cs" />
</ItemGroup>
Expand Down
42 changes: 42 additions & 0 deletions OnlineLottery/Test/ReviewTickets.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using fitlibrary;

namespace OnlineLottery.Test
{
public class ReviewTickets : DoFixture
{
private readonly IDrawManager _drawManager;
private readonly IPlayerManager _playerManager;

public ReviewTickets()
{
_playerManager = new PlayerManager();
_drawManager = new DrawManager(_playerManager);
}

public void DrawOnIsOpen(DateTime drawDate) => _drawManager.CreateDraw(drawDate);

public void PlayerOpensAccountWithDollars(string username, decimal balance)
=> _playerManager.AdjustBalance(_playerManager.RegisterPlayer(new PlayerRegistrationInfo
{
Username = username,
Name = username,
Password = "XXXXXX"
}), balance);

public void PlayerBuysATicketWithNumbersForDrawOn(string username, int[] numbers, DateTime drawDate)
=> PlayerBuysTicketsWithNumbersForDrawOn(username, 1, numbers, drawDate);

public void PlayerBuysTicketsWithNumbersForDrawOn(string username, int tickets, int[] numbers,
DateTime drawDate) => _drawManager.PurchaseTicket(drawDate, _playerManager.GetPlayer(username).PlayerId, numbers, 10 * tickets);

public IList<ITicket> PlayerListsOpenTickets(string username)
=> _drawManager.GetOpenTickets(_playerManager.GetPlayer(username).PlayerId);

public IList<ITicket> PlayerListsTicketsForDrawOn(string username, DateTime drawDate)
=> _drawManager.GetTickets(drawDate, _playerManager.GetPlayer(username).PlayerId);

public void NumbersAreDrawnOn(int[] numbers, DateTime drawDate) => _drawManager.SettleDraw(drawDate, numbers);
}
}
Loading

0 comments on commit 4915ca9

Please sign in to comment.