public static IEnumerable <object[]> CalculateCapitalGainData(CgtCalculationMethod method) { var p1 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 01, 01), new ParcelProperties(1000, 1000.00m, 1000.00m), null); var p2 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 01, 01), new ParcelProperties(1000, 2000.00m, 2000.00m), null); var p3 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 06, 30), new ParcelProperties(1000, 1000.00m, 1000.00m), null); var p4 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 06, 30), new ParcelProperties(1000, 2000.00m, 2000.00m), null); var scenarios = new CapitalGainScenario[] { new CapitalGainScenario(new Date(2019, 08, 01), p1, p3, "Parcel 1, no discount before Parcel 2, no discount", -1, 1, -1, -1), new CapitalGainScenario(new Date(2020, 02, 01), p1, p3, "Parcel 1, discount before Parcel 2, no discount", -1, 1, -1, -1), new CapitalGainScenario(new Date(2020, 08, 01), p1, p3, "Parcel 1, discount before Parcel 2, discount", -1, 1, -1, -1), new CapitalGainScenario(new Date(2019, 08, 01), p3, p1, "Parcel 1, no discount after Parcel 2, no discount", 1, -1, 1, 1), new CapitalGainScenario(new Date(2020, 02, 01), p3, p1, "Parcel 1, no discount after Parcel 2, discount", 1, -1, 1, 1), new CapitalGainScenario(new Date(2019, 08, 01), p3, p1, "Parcel 1, discount after Parcel 2, discount", 1, -1, 1, 1), new CapitalGainScenario(new Date(2019, 08, 01), p1, p2, "Parcel 1 same date as Parcel 2", 0, 0, -1, 1), new CapitalGainScenario(new Date(2019, 08, 01), p4, p1, "Parcel 1, no discount > Parcel 2, no discount", 1, -1, 1, -1), new CapitalGainScenario(new Date(2020, 02, 01), p4, p1, "Parcel 1, no discount > Parcel 2, discount", 1, -1, 1, 1), new CapitalGainScenario(new Date(2020, 02, 01), p2, p3, "Parcel 1, discount > Parcel 2, no discount", -1, 1, -1, -1), new CapitalGainScenario(new Date(2020, 08, 01), p2, p3, "Parcel 1, discount > Parcel 2, discount", -1, 1, 1, -1), new CapitalGainScenario(new Date(2019, 08, 01), p2, p3, "Parcel 1, no discount < Parcel 2, no discount", -1, 1, 1, -1), new CapitalGainScenario(new Date(2020, 02, 01), p3, p2, "Parcel 1, no discount < Parcel 2, discount", 1, -1, 1, 1), new CapitalGainScenario(new Date(2020, 02, 01), p1, p4, "Parcel 1, discount < Parcel 2, no discount", -1, 1, -1, -1), new CapitalGainScenario(new Date(2020, 08, 01), p1, p4, "Parcel 1, discount < Parcel 2, discount", -1, 1, -1, 1) }; return(scenarios.Select(x => x.TestData(method))); }
public object[] TestData(CgtCalculationMethod method) { switch (method) { case CgtCalculationMethod.FirstInFirstOut: return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), FirstInFirstOutResult, "FirstInFirstOut(" + Message + ")" }); case CgtCalculationMethod.LastInFirstOut: return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), LastInFirstOutResult, "LastInFirstOut(" + Message + ")" }); case CgtCalculationMethod.MaximizeGain: return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), MaximizeGainResult, "MaximizeGain(" + Message + ")" }); case CgtCalculationMethod.MinimizeGain: return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), MinimizeGainResult, "MinimizeGain(" + Message + ")" }); default: return(null); } }
public static IComparer <IReadOnlyParcel> GetCgtComparer(Date disposalDate, CgtCalculationMethod method) { switch (method) { case CgtCalculationMethod.FirstInFirstOut: return(new FirstInFirstOutCgtComparer()); case CgtCalculationMethod.LastInFirstOut: return(new LastInFirstOutCgtComparer()); case CgtCalculationMethod.MaximizeGain: return(new MaximizeGainCgtComparer(disposalDate)); case CgtCalculationMethod.MinimizeGain: return(new MinimizeGainCgtComparer(disposalDate)); default: throw new ArgumentException(); } }
public void DisposeOfShares(Guid stockId, Date disposalDate, int units, decimal averagePrice, decimal transactionCosts, CgtCalculationMethod cgtMethod, bool createCashTransaction, string comment, Guid transactionId) { var @event = new DisposalOccurredEvent(Id, Version, transactionId, disposalDate, stockId, comment) { Units = units, AveragePrice = averagePrice, TransactionCosts = transactionCosts, CgtMethod = cgtMethod, CreateCashTransaction = createCashTransaction }; Apply(@event); PublishEvent(@event); }
public void CheckAllCgtMethodsHaveAComparere(CgtCalculationMethod method) { var comparer = CgtCalculator.GetCgtComparer(Date.MinValue, method); comparer.Should().BeAssignableTo <IComparer <Parcel> >(); }