/// <summary>
        /// Accept the payment already inserted and then dispense the change. Dispense amount can't be greater than paymentAmount.
        ///
        /// Note: The accept and payment is in one method call to prevent change being dispense without accepting the payment first :)
        /// </summary>
        /// <param name="change">The change to return.</param>
        /// <returns>True if success. Else false.</returns>
        public bool TryAcceptPaymentAndDispenseChange(int change)
        {
            if (change > PaymentAmount)
            {
                _logger.LogError("Cannot return change that is more than the payment amount.");
                return(false);
            }

            var coinsToReturn = _coinReturnAlgorithm.Calculate(_coinInventory, change);

            if (coinsToReturn == null)
            {
                _logger.LogError("Change required is not possible using coins in current inventory.");
                return(false);
            }
            return(TryAcceptPayment() ? (TryDispenseChange(coinsToReturn) ? true : false) : false);
        }
 public void Calculate_CoinInventoryIsNull_ThrowArgumentNullException()
 {
     Assert.Throws <ArgumentNullException>(() => algorithm.Calculate(null, 10));
 }