public void CalculateBestRate_WhenLenderIsLeftWithSomeMoneyAfterLendingToBorrower_ReturnsWeightedRateUsingTheUtilisedMoney()
        {
            const double requestedAmt = 1200.0d;

            var mockLender1     = CreateMockLender(700, 0.10);
            var mockMarketData1 = CreateMockMarketData(mockLender1);

            var mockLender2     = CreateMockLender(800, 0.04);
            var mockMarketData2 = CreateMockMarketData(mockLender2);

            var calculator = new MarketDataRateCalculator(new List <IMarketData> {
                mockMarketData1, mockMarketData2
            });
            var rate = calculator.CalculateBestRate(requestedAmt);

            Assert.AreEqual(0.06, rate);
        }
        public void CalculateBestRate_WhenRequestedAmountIsLessThanLenderAmtAndThereAre2Lenders_ReturnsWeightedRate()
        {
            const double requestedAmt = 1000.0d;

            var mockLender1     = CreateMockLender(600, 0.05);
            var mockMarketData1 = CreateMockMarketData(mockLender1);

            var mockLender2     = CreateMockLender(400, 0.07);
            var mockMarketData2 = CreateMockMarketData(mockLender2);

            var calculator = new MarketDataRateCalculator(new List <IMarketData> {
                mockMarketData1, mockMarketData2
            });
            var rate = calculator.CalculateBestRate(requestedAmt);

            Assert.AreEqual(0.058, rate);
        }
        public void MarketDataRateCalculator_WhenRequestedAmountIsMoreThanTotalMarketMoney_ThrowsException()
        {
            const double requestedAmt = 1200;
            const double lenderAmt    = 1000.0d;
            const double lenderRate   = 0.07d;

            var mockMarketData = MockRepository.GenerateMock <IMarketData>();
            var mockLender     = CreateMockLender(lenderAmt, lenderRate);

            mockMarketData.Stub(m => m.Lender).Return(mockLender);

            var calculator = new MarketDataRateCalculator(new List <IMarketData> {
                mockMarketData
            });

            ExceptionAssert.Throws <Exception>(() => calculator.CalculateBestRate(requestedAmt));
        }
        public void CalculateBestRate_WhenRequestedAmountIsEqualToLenderAmtAndThereIsOnlyOneLender_ReturnsLenderRate()
        {
            const double requestedAmt = 1000.0d;
            const double lenderAmt    = 1000.0d;
            const double lenderRate   = 0.07d;

            var mockMarketData = MockRepository.GenerateMock <IMarketData>();
            var mockLender     = CreateMockLender(lenderAmt, lenderRate);

            mockMarketData.Stub(m => m.Lender).Return(mockLender);

            var calculator = new MarketDataRateCalculator(new List <IMarketData> {
                mockMarketData
            });
            var rate = calculator.CalculateBestRate(requestedAmt);

            Assert.AreEqual(0.07, rate);
        }