public CostCommand(ITariffSource source) { Spec = CommandSpec.Named( "cost", new[] { "POWER_USAGE_KWH", "GAS_USAGE_KWH" }, ctx => { // model 0's explicitly as no fuel supply for that type var p = ctx.GetRequiredDecimal("POWER_USAGE_KWH"); var powerKwh = p == 0 ? new Kwh <Power>?() : new Kwh <Power>(p); var g = ctx.GetRequiredDecimal("GAS_USAGE_KWH"); var gasKwh = g == 0 ? new Kwh <Gas>?() : new Kwh <Gas>(g); // calculate the costs and output foreach (var line in FuelCalculator .CostsPerTariff(source.GetAll(), powerKwh, gasKwh) .Select(cost => $"{cost.Tariff.Name} {cost.Total.PostTax:F2}")) { ctx.Output.WriteLine(line); } return(Commands.Ok()); }); }
public void CostsPerTariff_PowerNotInTariff_ReturnsCosts() { // Arrange var tariff = new Tariff("test", null, 3m, 4m); // Act var actual = FuelCalculator.CostsPerTariff(new[] { tariff }, null, new Kwh <Gas>(2000)).ToList(); // Assert actual.Should().HaveCount(1); var actualCost = actual.First(); actualCost.Tariff.Should().Be(tariff); actualCost.Total.PostTax.Should().Be(((4 * 12) + (2000 * 3)) * 1.05M); }
public void CostsPerTariff_GasNotInTariff_TariffIgnored() { // Arrange var tariff = new Tariff("test", 2m, 3m, 4m); var tariff2 = new Tariff("test2", 4m, null, 8m); // Act var actual = FuelCalculator.CostsPerTariff(new[] { tariff, tariff2 }, new Kwh <Power>(1000), new Kwh <Gas>(2000)).ToList(); // Assert actual.Should().HaveCount(1); var actualCost = actual.First(); actualCost.Tariff.Should().Be(tariff); actualCost.Total.PostTax.Should().Be(((4 * 12) + (1000 * 2) + (4 * 12) + (2000 * 3)) * 1.05M); }
public void CostsPerTariff_PowerUsageNotSupplied_ReturnsCostsForValidTariffs() { // Arrange var tariff1 = new Tariff("test1", 2m, null, 4m); var tariff2 = new Tariff("test2", 4m, 6m, 8m); // Act var actual = FuelCalculator.CostsPerTariff(new[] { tariff1, tariff2 }, null, new Kwh <Gas>(2000)).ToList(); // Assert actual.Should().HaveCount(1); var actualCost = actual.First(); actualCost.Tariff.Should().Be(tariff2); actualCost.Total.PostTax.Should().Be(((8 * 12) + (2000 * 6)) * 1.05M); }
public void CostsPerTariff_AllFuelTypesSupported_ReturnsCostsInOrder() { // Arrange var tariff1 = new Tariff("test1", 2m, 3m, 4m); var tariff2 = new Tariff("test2", 4m, 6m, 8m); // Act var actual = FuelCalculator.CostsPerTariff(new[] { tariff1, tariff2 }, new Kwh <Power>(1000), new Kwh <Gas>(2000)).ToList(); // Assert actual.Should().HaveCount(2); var actualCost = actual.First(); actualCost.Tariff.Should().Be(tariff1); actualCost.Total.PostTax.Should().Be(((4 * 12) + (1000 * 2) + (4 * 12) + (2000 * 3)) * 1.05M); actual.ElementAt(1).Tariff.Should().Be(tariff2); }