public async Task available_funds_self_referential() { IBettingShop <string> bettingShop = null !; // ReSharper disable once AccessToModifiedClosure bettingShop = new DefaultBettingShop <string>( user => Task.FromResult(100 - bettingShop.GetBetsForUser(user).Sum(kvp => kvp.Value))); PlaceBetFailure?failure1 = await bettingShop.PlaceBet("user", Side.Blue, 101); Assert.IsInstanceOf <PlaceBetFailure.InsufficientFunds>(failure1); Assert.AreEqual(100, (failure1 as PlaceBetFailure.InsufficientFunds)?.AvailableMoney); Assert.Null(await bettingShop.PlaceBet("user", Side.Blue, 99)); // already bet amount must be incorporated into available money, since the bet gets replaced Assert.Null(await bettingShop.PlaceBet("user", Side.Blue, 100)); PlaceBetFailure?failure2 = await bettingShop.PlaceBet("user", Side.Blue, 101); Assert.IsInstanceOf <PlaceBetFailure.InsufficientFunds>(failure2); Assert.AreEqual(100, (failure2 as PlaceBetFailure.InsufficientFunds)?.AvailableMoney); }
public BettingPeriod(IBank <T> bank, IBettingShop <T> bettingShop) { _bank = bank; BettingShop = bettingShop; }