Exemplo n.º 1
0
        public void PaymentStartDate_WhenPlayerJoinedAfterRatesStarted_FirstPaymentDateIsWhenPlayerJoined()
        {
            DateTimeOffset startDate = DateTimeOffset.Now.AddDays(-21);
            DateTimeOffset joinDate  = DateTimeOffset.Now.AddDays(-5);

            _player = new Player("Anthraxx")
            {
                JoinedOn = joinDate
            };

            _tariff = new Tariff()
            {
                History = new[]
                {
                    new TariffItem()
                    {
                        Amount   = CurrencyAmount.FromGold(1),
                        BeginsOn = startDate,
                    },
                }
            };

            var sut = CreateSut();

            sut.PaymentsStartFrom.Should().Be(joinDate);
        }
Exemplo n.º 2
0
        public void ctor_WhenCalled_ExposesCurrentTaxRate()
        {
            var currentTariffItem = new TariffItem
            {
                Amount         = CurrencyAmount.FromGold(40),
                BeginsOn       = DateTimeOffset.Now,
                RepeatInterval = TimeSpan.FromDays(7)
            };
            var tariff = new Tariff
            {
                History = new []
                {
                    currentTariffItem
                }
            };

            var roster = new Roster()
                         .Add(new Player("Neffer"));

            IReadOnlyList <Transaction> transactions = new List <Transaction>();

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);

            var sut = CreateSut();

            sut.CurrentTaxTate.Should().BeSameAs(currentTariffItem);
        }
Exemplo n.º 3
0
        public void WhenPlayerJoinedAfterTaxStarted_CalculatesTaxForWeeksOnTheRoster()
        {
            var roster = new Roster()
                         .Add(new Player("Neffer")
            {
                JoinedOn = new DateTimeOffset(2020, 07, 1, 0, 0, 0, TimeSpan.Zero)
            });

            var tariff = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1)),
                        RepeatInterval = TimeSpan.FromDays(7)
                    }
                }
            };
            var now = new DateTimeOffset(2020, 07, 3, 0, 0, 0, TimeSpan.FromHours(1));

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);
            A.CallTo(() => _dataSource.NowServerTime).Returns(now);

            var sut = CreateSut();

            sut.BuildReport();

            var neffer = sut.PlayerReports.Single();

            neffer.AmountDueToDate.Should().Be(CurrencyAmount.FromGold(40));
        }
Exemplo n.º 4
0
        public void ctor_WhenCalled_AllTransactionsIsSetFromDataSource()
        {
            var now = DateTimeOffset.UtcNow;
            IReadOnlyList <Transaction> transactions = new List <Transaction>()
            {
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Neffer",
                    "FrozenGold",
                    now.AddDays(-2)),
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "FrozenGold",
                    "FrozBank",
                    now.AddDays(-1))
            };

            A.CallTo(() => _dataSource.GetTransactionHistory())
            .Returns(transactions);

            var sut = CreateSut();

            sut.AllTransactions.Should().BeEquivalentTo(transactions);
        }
Exemplo n.º 5
0
        public void ReportSummary_WhenPlayerHasPaidLessThanDueByExactWeeklyAmount_StatusIsBehindAndNumberOfFullWeeksIndicated()
        {
            var sut = CreateSut();

            sut.AmountPaid      = CurrencyAmount.FromGold(40);
            sut.AmountDueToDate = CurrencyAmount.FromGold(80);

            var summary = sut.ReportSummary;

            summary.Status.Should().Be(PlayerPaymentStatus.Behind);
            summary.WeeksDifference.Should().Be(1);
        }
Exemplo n.º 6
0
        public void ReportSummary_WhenPlayerHasPaidMoreThanDue_StatusIsAheadAndNumberOfFullWeeksIndicatedRoundedDown()
        {
            var sut = CreateSut();

            sut.AmountPaid      = CurrencyAmount.FromGold(90);
            sut.AmountDueToDate = CurrencyAmount.FromGold(40);

            var summary = sut.ReportSummary;

            summary.Status.Should().Be(PlayerPaymentStatus.Ahead);
            summary.WeeksDifference.Should().Be(1);
        }
Exemplo n.º 7
0
        public void ReportSummary_WhenPlayerHasPaidExactAmountDue_StatusIsPaidInFullAndZeroWeeksDifference()
        {
            var sut = CreateSut();

            sut.AmountPaid      = CurrencyAmount.FromGold(40);
            sut.AmountDueToDate = CurrencyAmount.FromGold(40);

            var summary = sut.ReportSummary;

            summary.Status.Should().Be(PlayerPaymentStatus.PaidInFull);
            summary.WeeksDifference.Should().Be(0);
        }
Exemplo n.º 8
0
        public void BuildReport_WhenMoneyReceivedAndSentToBanker_GoldOnHandIsCorrectWithMailboxFees()
        {
            var firstRateStart = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1));
            var now            = firstRateStart.AddDays(14);
            var tariff         = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = firstRateStart,
                        RepeatInterval = TimeSpan.FromDays(7)
                    }
                }
            };

            var roster = new Roster()
                         .Add(new Player("Neffer"));

            IReadOnlyList <Transaction> transactions = new []
            {
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Neffer",
                    "Frozengold",
                    firstRateStart.AddDays(1)),
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(20),
                    "Frozengold",
                    "Frozbank",
                    firstRateStart.AddDays(9)),
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(5),
                    "Frozengold",
                    "Frozbank",
                    firstRateStart.AddDays(9)),
            };

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);
            A.CallTo(() => _dataSource.NowServerTime).Returns(now);
            A.CallTo(() => _dataSource.GetTransactionHistory()).Returns(transactions);

            var sut = CreateSut();

            sut.BuildReport();

            sut.GoldOnHand.Should().Be(new CurrencyAmount(14, 99, 40));
        }
Exemplo n.º 9
0
        public void BuildReport_WhenRosterAltCharacterSentMoneyToTaxman_AddsToTotalForPlayer()
        {
            var firstRateStart = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1));
            var now            = firstRateStart.AddDays(14);
            var tariff         = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = firstRateStart,
                        RepeatInterval = TimeSpan.FromDays(7)
                    }
                }
            };

            var roster = new Roster()
                         .Add(new Player("Neffer", "Confused", "Marnaa"))
                         .Add(new Player("Jiwari"));

            IReadOnlyList <Transaction> transactions = new []
            {
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Marnaa",
                    "Frozengold",
                    firstRateStart.AddDays(1)),
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Marnaa",
                    "Frozengold",
                    firstRateStart.AddDays(9)),
            };

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);
            A.CallTo(() => _dataSource.NowServerTime).Returns(now);
            A.CallTo(() => _dataSource.GetTransactionHistory()).Returns(transactions);

            var sut = CreateSut();

            sut.BuildReport();

            var neffer = sut.PlayerReports.Single(pr => pr.Player.Main.Name == "Neffer");

            neffer.AmountPaid.Should().Be(CurrencyAmount.FromGold(80));
        }
Exemplo n.º 10
0
        public PlayerReportTests()
        {
            _player = new Player("Neffer");

            _tariffItem = new TariffItem
            {
                Amount         = CurrencyAmount.FromGold(40),
                BeginsOn       = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1)),
                RepeatInterval = TimeSpan.FromDays(7)
            };
            _tariff = new Tariff()
            {
                History = new[] { _tariffItem }
            };
        }
Exemplo n.º 11
0
        public void BuildReport_WhenTariffHasMultipleRates_CalculatesTaxDueForEachTimePeriodToCurrentDate()
        {
            var firstRateStart = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1));
            var tariff         = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = firstRateStart,
                        RepeatInterval = TimeSpan.FromDays(7)
                    },
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(20),
                        BeginsOn       = firstRateStart.AddDays(21),
                        RepeatInterval = TimeSpan.FromDays(7)
                    },
                }
            };

            var roster = new Roster()
                         .Add(new Player("Neffer"));

            // 3 weeks of 40g, 5 weeks of 20g
            var            now = firstRateStart.AddDays(7 * 8);
            CurrencyAmount expectedAmountDue = CurrencyAmount.FromGold(220);

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);
            A.CallTo(() => _dataSource.NowServerTime).Returns(now);

            var sut = CreateSut();

            sut.BuildReport();

            var neffer = sut.PlayerReports.Single();

            neffer.AmountDueToDate.Should().Be(expectedAmountDue);
        }
Exemplo n.º 12
0
        public void BuildReport_WhenCalled_AddsPlayerReportForEachPlayerInRoster()
        {
            var roster = new Roster()
                         .Add(new Player("Jiwari"))
                         .Add(new Player("Pykkles"))
                         .Add(new Player("Fesha"));

            var tariff = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1)),
                        RepeatInterval = TimeSpan.FromDays(7)
                    }
                }
            };

            A.CallTo(() => _dataSource.GetRoster())
            .Returns(roster);
            A.CallTo(() => _dataSource.GetTariff())
            .Returns(tariff);

            var sut = CreateSut();

            sut.BuildReport();

            sut.PlayerReports.Count().Should().Be(roster.Players.Count());

            foreach (Player player in roster.Players)
            {
                sut.PlayerReports
                .SingleOrDefault(pr => pr.Player == player)
                .Should().NotBeNull();
            }
        }
Exemplo n.º 13
0
        public void BuildReport_WhenPlayerHasRetired_CalculatesTaxDueUntilRetirementDate()
        {
            var tariff = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1)),
                        RepeatInterval = TimeSpan.FromDays(7)
                    }
                }
            };

            var roster = new Roster()
                         .Add(new Player("Neffer")
            {
                LeftOn = tariff.CurrentRate.BeginsOn.AddDays(9)
            });

            var now =
                tariff.CurrentRate.BeginsOn.AddMonths(2);

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);
            A.CallTo(() => _dataSource.NowServerTime).Returns(now);

            var sut = CreateSut();

            sut.BuildReport();

            var neffer = sut.PlayerReports.Single();

            neffer.AmountDueToDate.Should().Be(CurrencyAmount.FromGold(40));
        }
Exemplo n.º 14
0
        public void BuildReport_RefundsToPlayersWhoHaveLeft_ShouldNotBeOddTransactions()
        {
            var firstRateStart = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1));
            var now            = firstRateStart.AddDays(7);
            var tariff         = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = firstRateStart,
                        RepeatInterval = TimeSpan.FromDays(7)
                    }
                }
            };

            var roster = new Roster()
                         .Add(new Player("Neffer"))
                         .Add(new Player("Gicanu")
            {
                // Left during week 2
                LeftOn = firstRateStart.AddDays(9)
            });

            var refundTxn = new Transaction(
                TransactionType.MoneyTransfer,
                CurrencyAmount.FromGold(40),
                "Frozengold",
                "Gicanu",
                firstRateStart.AddDays(10));

            IReadOnlyList <Transaction> transactions = new []
            {
                // Income week 1
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Neffer",
                    "Frozengold",
                    firstRateStart.AddHours(12)),
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Gicanu",
                    "Frozengold",
                    firstRateStart.AddHours(12)),
                // Income week 2
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Neffer",
                    "Frozengold",
                    firstRateStart.AddDays(8)),
                new Transaction(
                    TransactionType.MoneyTransfer,
                    CurrencyAmount.FromGold(40),
                    "Gicanu",
                    "Frozengold",
                    firstRateStart.AddDays(8)),
                // Refund
                refundTxn,
            };

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);
            A.CallTo(() => _dataSource.NowServerTime).Returns(now);
            A.CallTo(() => _dataSource.GetTransactionHistory()).Returns(transactions);

            var sut = CreateSut();

            sut.BuildReport();

            sut.Received.Should().Be(CurrencyAmount.FromGold(160));
            sut.Refunded.Should().Be(CurrencyAmount.FromGold(40));
            sut.GoldOnHand.Should().Be(CurrencyAmount.FromGold(120));
            sut.OddTransactions.Should().BeEmpty();
            sut.Refunds.Count().Should().Be(1);
            sut.Refunds.Should().Contain(refundTxn);

            var gicanu = sut.PlayerReports.Single(pr => pr.Player.Main.Name == "Gicanu");

            gicanu.AmountPaid.Should().Be(CurrencyAmount.FromGold(40));
            gicanu.AmountDueToDate.Should().Be(CurrencyAmount.FromGold(40));
        }
Exemplo n.º 15
0
        public void BuildReport_WithMultipleRatesAndPlayersWithDifferentMembershipDurations_CalculatesCorrectAmountDueForEachPlayer()
        {
            var firstRateStart = new DateTimeOffset(2020, 06, 24, 0, 0, 0, TimeSpan.FromHours(1));
            var tariff         = new Tariff
            {
                History = new []
                {
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(40),
                        BeginsOn       = firstRateStart,
                        RepeatInterval = TimeSpan.FromDays(7)
                    },
                    new TariffItem
                    {
                        Amount         = CurrencyAmount.FromGold(20),
                        BeginsOn       = firstRateStart.AddDays(21),
                        RepeatInterval = TimeSpan.FromDays(7)
                    },
                }
            };

            var roster = new Roster()
                         .Add(new Player("Neffer"))
                         .Add(new Player("Demusske")
            {
                JoinedOn = firstRateStart.AddDays(7)
            })
                         .Add(new Player("Dizzay")
            {
                LeftOn = firstRateStart.AddDays(28)
            })
                         .Add(new Player("Unboned")
            {
                LeftOn = firstRateStart.AddDays(-5)
            });

            // 3 weeks of 40g, 5 weeks of 20g
            var            now = firstRateStart.AddDays(7 * 8);
            CurrencyAmount nefferExpectedDue   = CurrencyAmount.FromGold(220);
            CurrencyAmount demusskeExpectedDue = CurrencyAmount.FromGold(180);
            CurrencyAmount dizzayExpectedDue   = CurrencyAmount.FromGold(140);
            CurrencyAmount unbonedExpectedDue  = CurrencyAmount.FromGold(0);

            A.CallTo(() => _dataSource.GetRoster()).Returns(roster);
            A.CallTo(() => _dataSource.GetTariff()).Returns(tariff);
            A.CallTo(() => _dataSource.NowServerTime).Returns(now);

            var sut = CreateSut();

            sut.BuildReport();

            var neffer   = sut.PlayerReports.Single(pr => pr.Player.Main.Name == "Neffer");
            var demusske = sut.PlayerReports.Single(pr => pr.Player.Main.Name == "Demusske");
            var dizzay   = sut.PlayerReports.Single(pr => pr.Player.Main.Name == "Dizzay");
            var unboned  = sut.PlayerReports.Single(pr => pr.Player.Main.Name == "Unboned");

            neffer.AmountDueToDate.Should().Be(nefferExpectedDue);
            demusske.AmountDueToDate.Should().Be(demusskeExpectedDue);
            dizzay.AmountDueToDate.Should().Be(dizzayExpectedDue);
            unboned.AmountDueToDate.Should().Be(unbonedExpectedDue);
        }