public void DoesNotAllowReceiveNewBidWhenAuctionIsClosed(
            int quantityBidsExpected, double[] amounts)
        {
            //Arranje
            var evaluation = new UpperAmount();
            var auction    = new Auction("Van Gogh", evaluation);
            var johnDoe    = new Interested("John Doe");
            var janeDoe    = new Interested("Jane Doe");

            auction.StartAuction();

            for (int i = 0; i < amounts.Length; i++)
            {
                var amount = amounts[i];
                if ((i % 2) == 0)
                {
                    auction.ReceiveBid(johnDoe, amount);
                }
                else
                {
                    auction.ReceiveBid(janeDoe, amount);
                }
            }

            auction.FinishAuction();

            //Act
            auction.ReceiveBid(johnDoe, 1000);

            //Assert
            Assert.Equal(quantityBidsExpected, auction.Bids.Count());
        }
        public void ReturnMaxAmountWhenHaveAtLastOneBid(double expectedAmount, double[] amounts)
        {
            //Arrange
            var modality = new UpperAmount();
            var auction  = new Auction("Van Gogh", modality);
            var johnDoe  = new Interested("John Doe");
            var janeDoe  = new Interested("Jane Doe");

            auction.StartAuction();

            for (int i = 0; i < amounts.Length; i++)
            {
                double amount = amounts[i];
                if ((i % 2) == 0)
                {
                    auction.ReceiveBid(johnDoe, amount);
                }
                else
                {
                    auction.ReceiveBid(janeDoe, amount);
                }
            }

            //Act
            auction.FinishAuction();

            //Assert
            Assert.Equal(expectedAmount, auction.Winner.Amount);
        }
        public void ReurnZeroWhenHaveNoBids()
        {
            //Arrange
            var evaluation = new UpperAmount();
            var auction    = new Auction("Van Gogh", evaluation);

            auction.StartAuction();

            //Act
            auction.FinishAuction();

            //Assert
            Assert.Equal(0, auction.Winner.Amount);
        }
        public void ThrowsInvalidOperationExceptionWhenCloseAuctionNotStarted()
        {
            //Arrange
            var evaluation = new UpperAmount();
            var auction    = new Auction("Van Gogh", evaluation);

            //Act
            Action act = () => auction.FinishAuction();

            //Assert
            var exception = Assert.Throws <InvalidOperationException>(act);

            Assert.Equal($"Não é possível fechar um leilão sem iniciá-lo. Utilize o método {nameof(auction.StartAuction)}.", exception.Message);
        }
        public void DoesNotAllowReceiveBidWhenLastBidIsFromSameInterested()
        {
            //Arrange
            var evaluation = new UpperAmount();
            var auction    = new Auction("Van Gogh", evaluation);
            var johnDoe    = new Interested("John Doe");

            auction.StartAuction();
            auction.ReceiveBid(johnDoe, 800);

            //Act
            auction.ReceiveBid(johnDoe, 1000);

            //Assert
            Assert.Single(auction.Bids);
        }