

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

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

/**
 * Controller tests: plain JUnit, no JavaFX, no window. Seed 42 deals A♣ 10♠ 8♦
 * 6♠ K♠ 4♣ 2♠.
 */
public class KlondikeControllerTest {
	private KlondikeGame game_;
	private FakeView view_;
	private KlondikeController controller_;

	@BeforeEach
	public void setUp () {
		game_ = new KlondikeGame(42);
		view_ = new FakeView();
		controller_ = new KlondikeController(game_,view_);
	}

	@Test
	public void drawClearsTheMessage () {
		controller_.drawFromStock();
		assertEquals("",view_.lastMessage);
	}

	@Test
	public void refusedMoveShowsTheReasonAndLeavesTheCard () {
		controller_.drawFromStock(); // waste: 3♣

		assertFalse(controller_.playWasteTo(0)); // 3♣ on A♣
		assertEquals("Colors must alternate: 3♣ can't go on A♣.",view_.lastMessage);
		assertEquals("3♣",game_.getWasteTop().toString());
	}

	@Test
	public void legalMoveClearsTheMessageAndMovesTheCard () {
		controller_.drawFromStock();
		controller_.drawFromStock(); // waste: Q♥
		controller_.playWasteTo(0); // refused: leaves a message

		assertTrue(controller_.playWasteTo(4)); // Q♥ on K♠
		assertEquals("",view_.lastMessage);
		assertEquals("Q♥",game_.getColumnTop(4).toString());
	}
}
