package integrationTest;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;

import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.function.Executable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import exceptions.BidBelowZeroException;
import project.Auction;
import project.AuctionManager;
import project.User;

public class AuctionManagerIntegrationTest {

	@TestFactory
	public Collection<DynamicTest> externalAddBidTestFalse() {

		Auction auction = Auction.getInstance();
		User user = User.getInstance();
		AuctionManager manager = AuctionManager.getInstance();
		ArrayList<Integer> values = new ArrayList<Integer>();

		manager.setAuction(auction);

		for (int i = 1; i < 6; i++) {
			values.add(i);
		}

		Collection<DynamicTest> dynamicTests = new ArrayList<DynamicTest>();

		for (int e = 0; e < 5; e++) {

			DynamicTest dTest;
			auction.setPrice(10);
			int toCheck = values.get(e);

			Executable exec = () -> assertFalse(manager.placeBid(user, toCheck));
			dTest = DynamicTest.dynamicTest("Lower bid than current auction price", exec);

			dynamicTests.add(dTest);
		}

		return dynamicTests;

	}

	@ParameterizedTest
	@ValueSource(ints = { 2, 3, 4, 5, 6 })
	public void externalAddBidTrue(int toCheck) throws BidBelowZeroException, ParseException {

		Auction auction = Auction.getInstance();
		User user = User.getInstance();
		AuctionManager manager = AuctionManager.getInstance();

		auction.setPrice(1);
		manager.setAuction(auction);

		assertTrue(manager.placeBid(user, toCheck));

	}
}