public void HoldingShouldBeCreatedWhenVentureStarts() { var venture = new Venture(new Name("Ventura"), new Amount(100), new Amount(1)); var investor0 = new Investor(new Name("Investor0"), new Amount(100)); var investor1 = new Investor(new Name("Investor1"), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.AddOffer(investor1, new Amount(50)); venture.Start(); Assert.Greater(venture.Holding.Investments.Count, 0); }
public void Holding_Should_Be_Created_When_Venture_Starts() { Venture venture = new Venture(new Name("Ventura"), new Amount(100), new Amount(1)); Investor investor0 = new Investor(new Name("Investor0"), new GringottsDate(DateTime.Now), new Amount(100)); Investor investor1 = new Investor(new Name("Investor1"), new GringottsDate(DateTime.Now), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.AddOffer(investor1, new Amount(50)); venture.Start(); Assert.Greater(venture.Holding.Investments.Count, 0); }
public void ShouldCreateTwoVenturesOnSplit() { var venture = new Venture(new Name("venture-name"), new Amount(100), new Amount(10)); var firstVentureName = new Name("new-venture-1"); var secondVentureName = new Name("new-venture-2"); var terms = new TermsOfSplit(new Percentage(0.8f), firstVentureName, secondVentureName); venture.AddOffer(new Investor(new Name("testName"), new Amount(1000)), new Amount(100)); venture.Start(); var ventures = venture.Split(terms); Assert.AreEqual(2, ventures.Count()); }
public void ShouldCreateVenturesWithPassedNames() { var venture = new Venture(new Name("venture-name"), new Amount(100), new Amount(10)); var firstVentureName = new Name("new-venture-1"); var secondVentureName = new Name("new-venture-2"); var terms = new TermsOfSplit(new Percentage(0.8f), firstVentureName, secondVentureName); venture.AddOffer(new Investor(new Name("testName"), new Amount(1000)), new Amount(100)); venture.Start(); var ventures = venture.Split(terms); Assert.AreEqual(firstVentureName.GetValue(), ventures.First().Name); Assert.AreEqual(secondVentureName.GetValue(), ventures.Last().Name); }
public void ShouldCloseTheVentureWhenAVentureSplits() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var investor0 = new Investor(new Name("Investor0"), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); var firstVentureName = new Name("new-venture-1"); var secondVentureName = new Name("new-venture-2"); var percentage = new Percentage(0.2f); var terms = new TermsOfSplit(percentage, firstVentureName, secondVentureName); venture.Split(terms); Assert.IsTrue(venture.IsClosed()); }
public void ShouldCreateABalanceEventWhenVentureBankruptcyIsNotified() { var investor = new Investor(new Name("Inverstor1"), new Amount(1100)); var venture = new Venture(new Name("Hacker's Venture"), new Amount(500), new Amount(500)); Offer offer = venture.AddOffer(investor, new Amount(500)); Investment investment = offer.ToInvestment(); venture.Start(); investor.NotifyVentureBankruptcy(investment); BalanceHistory history = investor.GetBalanceHistory(); String offerEvent = String.Format(BalanceEvent.VENTURE_BANKRUPT, "Hacker's Venture"); BalanceEvent expectedBalanceEvent = new BalanceEvent(offerEvent, new Amount(600)); Assert.Contains(expectedBalanceEvent, history.GetEvents()); }
public void ShouldNotTakeMoreInvestmentThanOutlay() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var investor0 = new Investor(new Name("Investor0"), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); // TODO: make aggregation in venture Assert.AreEqual(outlay, venture.Holding.Investments.Aggregate(new Amount(0), (sum, inv) => sum + inv.Value)); }
public void ShouldUpdateThePortfolioOfTheInvestorWhenVentureCloses() { var outlay = new Amount(50); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var investor0 = new Investor(new Name("Investor0"), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); var firstVentureName = new Name("new-venture-1"); var secondVentureName = new Name("new-venture-2"); var percentage = new Percentage(0.2f); var terms = new TermsOfSplit(percentage, firstVentureName, secondVentureName); var ventures = venture.Split(terms); Assert.IsFalse(investor0.HasInvestmentIn(venture)); Assert.IsTrue(investor0.HasInvestmentIn(ventures.First())); Assert.IsTrue(investor0.HasInvestmentIn(ventures.Last())); }
public void Should_Not_Take_More_Investment_Than_Outlay() { Amount outlay = new Amount(40); Venture venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); Investor investor0 = new Investor(new Name("Investor0"), new GringottsDate(DateTime.Now), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); // TODO: make aggregation in venture Assert.AreEqual(outlay, venture.Holding.Investments.Aggregate(new Amount(0), (sum, inv) => sum + inv.Value)); }
public void ShouldBeAbleToHandOutDividends() { var venture = new Venture(new Name("Venture"), new Amount(1000), new Amount(1)); var quarterInvestor = new Investor(new Name("investor"), new Amount(1000)); var threeFourthsInvestor = new Investor(new Name("investor"), new Amount(1000)); var dividend = new Amount(1000); venture.AddOffer(quarterInvestor, new Amount(250)); venture.AddOffer(threeFourthsInvestor, new Amount(750)); venture.Start(); venture.HandOutDividends(dividend); }
public void ShouldSplitOutlayMoneyAccordingToRatio() { var venture = new Venture(new Name("venture-name"), new Amount(100), new Amount(10)); var firstVentureName = new Name("new-venture-1"); var secondVentureName = new Name("new-venture-2"); var percentage = new Percentage(0.2f); var terms = new TermsOfSplit(percentage, firstVentureName, secondVentureName); venture.AddOffer(new Investor(new Name("testName"), new Amount(1000)), new Amount(100)); venture.Start(); var ventures = venture.Split(terms); Assert.AreEqual(percentage.Apply(venture.Outlay), ventures.First().Outlay); Assert.AreEqual(percentage.ApplyRemaining(venture.Outlay), ventures.Last().Outlay); }
public void Should_Be_Able_To_Start_A_Venture() { Amount outlay = new Amount(40); Venture venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); Investor investor0 = new Investor(new Name("Investor0"), new GringottsDate(DateTime.Now), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); Assert.True(venture.IsStarted()); }
public void StartedVentureMayGoBankrupt() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var initialCorpus = new Amount(100); var investor = new Investor(new Name("Investor0"), initialCorpus); venture.AddOffer(investor, new Amount(50)); venture.Start(); venture.GoBankrupt(); Assert.AreEqual(Venture.BANKRUPT_STATE, venture.State); }
public void ShouldCreateAOfferPartiallyAcceptedEventWhenOffersAreConfirmed() { var initialBalance = new Amount(1000); var investor1 = new Investor(new Name("Inverstor 1"), initialBalance); var outlay = new Amount(400); var venture = new Venture(new Name("Ventura Inc."), outlay, new Amount(1)); var excess = new Amount(100); venture.AddOffer(investor1, outlay + excess); Assert.AreEqual(initialBalance - (outlay + excess), investor1.Balance); venture.Start(); BalanceHistory history = investor1.GetBalanceHistory(); string offerEvent = string.Format(BalanceEvent.OFFER_PARTIALLY_ACCEPTED, venture.Name); BalanceEvent balanceEvent = new BalanceEvent(offerEvent, initialBalance - outlay); Assert.Contains(balanceEvent, history.GetEvents()); }
public void ShouldCreateDividendReceivedEventWhenDividendIsDeclared() { var initialBalance = new Amount(1000); var investor1 = new Investor(new Name("Inverstor 1"), initialBalance); var outlay = new Amount(400); var venture = new Venture(new Name("Ventura Inc."), outlay, new Amount(1)); venture.AddOffer(investor1, outlay); venture.Start(); var dividend = new Amount(1000); venture.HandOutDividends(dividend); BalanceHistory history = investor1.GetBalanceHistory(); string dividendEvent = string.Format(BalanceEvent.DIVIDEND_RECEIVED, venture.Name); BalanceEvent balanceEvent = new BalanceEvent(dividendEvent, initialBalance - outlay + dividend); Assert.Contains(balanceEvent, history.GetEvents()); }
public void Should_Return_Over_Investment_To_Investor_When_Start() { Amount outlay = new Amount(40); Venture venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); Amount initialCorpus = new Amount(100); Investor investor = new Investor(new Name("Investor0"), new GringottsDate(DateTime.Now), initialCorpus); venture.AddOffer(investor, new Amount(50)); venture.Start(); Assert.AreEqual(initialCorpus - outlay, investor.Corpus); }
public void ShouldNotGiveDividendsIfItIsBankrupt() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var initialCorpus = new Amount(100); var investor = new Investor(new Name("Investor0"), initialCorpus); venture.AddOffer(investor, new Amount(50)); venture.Start(); venture.GoBankrupt(); Assert.Throws<InvalidOperationException>(()=> venture.HandOutDividends(new Amount(100))); }
public void ShouldCreateVentureEventWhenVentureSplits() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var investor0 = new Investor(new Name("Investor0"), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); var firstVentureName = new Name("new-venture-1"); var secondVentureName = new Name("new-venture-2"); var percentage = new Percentage(0.2f); var terms = new TermsOfSplit(percentage, firstVentureName, secondVentureName); var newVentures = venture.Split(terms); Assert.IsTrue(newVentures.First().IsStarted()); Assert.IsTrue(newVentures.Last().IsStarted()); VentureEvent ventureEventSplit1 = new VentureEvent(VentureEvent.SPLIT,new Amount(8)); VentureEvent ventureEventStarted1 = new VentureEvent(VentureEvent.STARTED,new Amount(8)); VentureEvent ventureEventSplit2 = new VentureEvent(VentureEvent.SPLIT,new Amount(32)); VentureEvent ventureEventStarted2 = new VentureEvent(VentureEvent.STARTED,new Amount(32)); VentureHistory ventureHistory1 = newVentures.First().GetVentureHistory(); VentureHistory ventureHistory2 = newVentures.Last().GetVentureHistory(); Assert.Contains(ventureEventSplit1, ventureHistory1.GetEvents()); Assert.Contains(ventureEventStarted1, ventureHistory1.GetEvents()); Assert.Contains(ventureEventSplit2, ventureHistory2.GetEvents()); Assert.Contains(ventureEventStarted2, ventureHistory2.GetEvents()); }
public void ShouldBeAbleToStartAVenture() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var investor0 = new Investor(new Name("Investor0"), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); Assert.True(venture.IsStarted()); }
public void ShouldCreateVentureEventWhenVentureGoesBankrupt() { var outlay = new Amount(50); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var initialCorpus = new Amount(100); var investor = new Investor(new Name("Investor0"), initialCorpus); var investmentAmount = new Amount(50); venture.AddOffer(investor, investmentAmount); venture.Start(); venture.GoBankrupt(); VentureEvent ventureEventProposed = new VentureEvent(VentureEvent.PROPOSED, outlay); VentureEvent ventureEventStarted = new VentureEvent(VentureEvent.STARTED, outlay); VentureEvent ventureEventForBankruptcy = new VentureEvent(VentureEvent.BANKRUPT, outlay); VentureHistory ventureHistory = venture.GetVentureHistory(); Assert.Contains(ventureEventProposed, ventureHistory.GetEvents()); Assert.Contains(ventureEventStarted, ventureHistory.GetEvents()); Assert.Contains(ventureEventForBankruptcy, ventureHistory.GetEvents()); }
public void ShouldSplitHoldingInvestmentsAccordingToRatio() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var investor0 = new Investor(new Name("Investor0"), new Amount(100)); venture.AddOffer(investor0, new Amount(50)); venture.Start(); var firstVentureName = new Name("new-venture-1"); var secondVentureName = new Name("new-venture-2"); var percentage = new Percentage(0.2f); var terms = new TermsOfSplit(percentage, firstVentureName, secondVentureName); var ventures = venture.Split(terms); Assert.AreEqual(venture.HoldingValue.Denomination, ventures.Sum(n => n.HoldingValue.Denomination)); }
public void ShouldReturnOverInvestmentToInvestorWhenStart() { var outlay = new Amount(40); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var initialCorpus = new Amount(100); var investor = new Investor(new Name("Investor0"), initialCorpus); venture.AddOffer(investor, new Amount(50)); venture.Start(); Assert.AreEqual(initialCorpus - outlay, investor.Balance); }
public void ShouldCreateAOfferRejectedEventWhenVentureRejectsAnOffer() { var initialBalance = new Amount(1000); var investor1 = new Investor(new Name("Inverstor 1"), initialBalance); var investor2 = new Investor(new Name("Inverstor 2"), initialBalance); var outlay = new Amount(500); var venture = new Venture(new Name("Ventura Inc."), outlay, new Amount(1)); venture.AddOffer(investor1, outlay); var offerAmount2 = new Amount(600); venture.AddOffer(investor2, offerAmount2); venture.Start(); BalanceHistory history = investor2.GetBalanceHistory(); string offerEvent = string.Format(BalanceEvent.OFFER_REJECTED, venture.Name); BalanceEvent balanceEvent = new BalanceEvent(offerEvent, initialBalance); Assert.Contains(balanceEvent, history.GetEvents()); }
public void ShouldUpdateInvestorBalancesWhileStartingAVenture() { var outlay = new Amount(600); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var initialBalance = new Amount(1000); var investor1 = new Investor(new Name("Investor1"), initialBalance); var investor2 = new Investor(new Name("Investor2"), initialBalance); var investor3 = new Investor(new Name("Investor3"), initialBalance); var investor4 = new Investor(new Name("Investor4"), initialBalance); var offerAmount1 = new Amount(100); venture.AddOffer(investor1, offerAmount1); Assert.AreEqual(initialBalance - offerAmount1, investor1.Balance); var offerAmount2 = new Amount(200); venture.AddOffer(investor2, offerAmount2); Assert.AreEqual(initialBalance - offerAmount2, investor2.Balance); var offerAmount3 = new Amount(400); venture.AddOffer(investor3, offerAmount3); Assert.AreEqual(initialBalance - offerAmount3, investor3.Balance); var offerAmount4 = new Amount(500); venture.AddOffer(investor4, offerAmount4); Assert.AreEqual(initialBalance - offerAmount4, investor4.Balance); venture.Start(); // check the new balances Assert.AreEqual(initialBalance - offerAmount1, investor1.Balance); Assert.AreEqual(initialBalance - offerAmount2, investor2.Balance); Assert.AreEqual(initialBalance - offerAmount3 + new Amount(100), investor3.Balance, "Partially accepted amount should have been refunded"); Assert.AreEqual(initialBalance, investor4.Balance); }
public void ShouldUpdateInvestorPortfolioWhenVentureGoesBankrupt() { var outlay = new Amount(50); var venture = new Venture(new Name("Ventura"), outlay, new Amount(1)); var initialCorpus = new Amount(100); var investor = new Investor(new Name("Investor0"), initialCorpus); var investmentAmount = new Amount(50); venture.AddOffer(investor, investmentAmount); venture.Start(); var previousAmount = investor.PortfolioValue; venture.GoBankrupt(); var currentAmount = investor.PortfolioValue; Assert.AreEqual(previousAmount-investmentAmount, currentAmount); }
public void Should_Be_Able_To_Hand_Out_Dividends() { Venture venture = new Venture(new Name("Venture"), new Amount(1000), new Amount(1)); Investor quarterInvestor = new Investor(new Name("investor"), new GringottsDate(DateTime.Now), new Amount(1000)); Investor threeFourthsInvestor = new Investor(new Name("investor"), new GringottsDate(DateTime.Now), new Amount(1000)); Amount dividend = new Amount(1000); venture.AddOffer(quarterInvestor, new Amount(250)); venture.AddOffer(threeFourthsInvestor, new Amount(750)); venture.Start(); venture.HandOutDividends(dividend); }