public void Formatting_WithEntryHavingSingleDebitAndCredit_IsExpected()
        {
            var entry = new AccountingEntryBuilder()
                        .WithLine(new CreditBuilder()
                                  .WithAccountNumber(3000)
                                  .WithProductName("Credit")
                                  .WithNetSum(1000)
                                  .WithVat(24)
                                  .WithVatType(VatType.Sale)
                                  .Build())
                        .WithLine(new DebitBuilder()
                                  .WithAccountNumber(1700)
                                  .WithProductName("Debit")
                                  .WithNetSum(1240)
                                  .WithVat(null)
                                  .WithVatType(VatType.Undefined)
                                  .Build())
                        .Build();
            var sut = new AccountingEntryFormatCsvBuilder().Build();

            var actual = sut.Format(entry);

            var expected = @"
Account number;Product;Sum;Dimension;Dimension item;VAT %;VAT type
1700;Debit;1240;;;;
3000;Credit;-1000;;;24;S
".TrimStart();

            Assert.AreEqual(expected, actual);
        }
        public void Creating_WithoutLines_ReturnsEmptyList()
        {
            var sut = new AccountingEntryBuilder().Build();

            var actual = sut.GetLines();

            CollectionAssert.IsEmpty(actual);
        }
        public void Creating_WithoutLineSumsBeingZero_ThrowsException()
        {
            var credit = new CreditBuilder().WithNetSum(100).WithVat(24).Build();
            var debit  = new DebitBuilder().WithNetSum(10).WithVat(10).Build();
            var sut    = new AccountingEntryBuilder().WithLine(credit).WithLine(debit);

            Assert.IsFalse(AccountingEntry.IsValid(new AccountingEntryLine[] { credit, debit }));
            Assert.Throws <ArgumentException>(() => sut.Build());
        }
        public void Formatting_WithEntryHavingMultipleLines_IsExpected()
        {
            var entry = new AccountingEntryBuilder()
                        .WithLine(new CreditBuilder()
                                  .WithAccountNumber(3100)
                                  .WithProductName("Product1")
                                  .WithNetSum(33)
                                  .WithVat(14)
                                  .WithVatType(VatType.Sale)
                                  .Build())
                        .WithLine(new CreditBuilder()
                                  .WithAccountNumber(3200)
                                  .WithProductName("Product2")
                                  .WithNetSum(89)
                                  .WithVat(10)
                                  .WithVatType(VatType.Purchase)
                                  .Build())
                        .WithLine(new DebitBuilder()
                                  .WithAccountNumber(1600)
                                  .WithProductName("Counter Transaction")
                                  .WithNetSum(135.52m)
                                  .WithVat(null)
                                  .WithVatType(VatType.Undefined)
                                  .Build())
                        .Build();
            var sut = new AccountingEntryFormatCsvBuilder().Build();

            var actual = sut.Format(entry);

            var expected = @"
Account number;Product;Sum;Dimension;Dimension item;VAT %;VAT type
1600;Counter Transaction;135,52;;;;
3200;Product2;-89;;;10;P
3100;Product1;-33;;;14;S
".TrimStart();

            Assert.AreEqual(expected, actual);
        }
        public void AskingLines_WithLinesHavingDifferentVats_OrdersThemCorrectly()
        {
            var vat24 = new CreditBuilder().WithNetSum(100).WithVat(24).Build();
            var vat14 = new CreditBuilder().WithNetSum(100).WithVat(14).Build();
            var vat10 = new CreditBuilder().WithNetSum(100).WithVat(10).Build();
            var vat0  = new CreditBuilder().WithNetSum(100).WithVat(0).Build();
            var noVat = new DebitBuilder().WithNetSum(448).WithVat(null).Build();
            var sut   = new AccountingEntryBuilder()
                        .WithLine(vat14)
                        .WithLine(vat24)
                        .WithLine(vat0)
                        .WithLine(noVat)
                        .WithLine(vat10)
                        .Build();

            var actual = sut.GetLines();

            var expected = new List <AccountingEntryLine>()
            {
                noVat, vat0, vat10, vat14, vat24
            };

            CollectionAssert.AreEqual(expected, actual);
        }