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());
    }
}
