diff --git a/src/main/kotlin/dartzee/bean/AbstractPlayerSelector.kt b/src/main/kotlin/dartzee/bean/AbstractPlayerSelector.kt index 923b40ac..ec34a05d 100644 --- a/src/main/kotlin/dartzee/bean/AbstractPlayerSelector.kt +++ b/src/main/kotlin/dartzee/bean/AbstractPlayerSelector.kt @@ -32,7 +32,7 @@ abstract class AbstractPlayerSelector : private val btnUnselect = JButton("") protected fun render() { - layout = MigLayout("", "[452px][100px][452px]", "[407px]") + layout = MigLayout("al center center", "[452px][100px][452px]", "[407px]") val panelMovementOptions = JPanel() add(tablePlayersToSelectFrom, "cell 0 0,alignx left,growy") diff --git a/src/main/kotlin/dartzee/bean/GameSetupPlayerSelector.kt b/src/main/kotlin/dartzee/bean/GameSetupPlayerSelector.kt index 7c14e31d..21dcbd93 100644 --- a/src/main/kotlin/dartzee/bean/GameSetupPlayerSelector.kt +++ b/src/main/kotlin/dartzee/bean/GameSetupPlayerSelector.kt @@ -35,20 +35,20 @@ class GameSetupPlayerSelector : AbstractPlayerSelector() { val selectedPlayers = getSelectedPlayers() val rowCount = selectedPlayers.size if (rowCount < 1) { - DialogUtil.showErrorOLD("You must select at least 1 player.") + DialogUtil.showError("You must select at least 1 player.") return false } val playerOrTeamDesc = if (btnPairs.isSelected) "teams" else "players" val matchMinimum = if (btnPairs.isSelected) 4 else 2 if (match && rowCount < matchMinimum) { - DialogUtil.showErrorOLD("You must select at least 2 $playerOrTeamDesc for a match.") + DialogUtil.showError("You must select at least 2 $playerOrTeamDesc for a match.") return false } val maxPlayers = if (btnPairs.isSelected) MAX_PLAYERS * 2 else MAX_PLAYERS if (rowCount > maxPlayers) { - DialogUtil.showErrorOLD("You cannot select more than $MAX_PLAYERS $playerOrTeamDesc.") + DialogUtil.showError("You cannot select more than $MAX_PLAYERS $playerOrTeamDesc.") return false } diff --git a/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt b/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt index c0a38c10..b4bc737b 100644 --- a/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt +++ b/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt @@ -71,7 +71,7 @@ abstract class EmbeddedScreen : JPanel(), ActionListener { ScreenCache.switch(getBackTarget(), false) } - fun toggleNextVisibility(visible: Boolean) { + protected fun toggleNextVisibility(visible: Boolean) { btnNext.isVisible = visible } diff --git a/src/main/kotlin/dartzee/screen/GameSetupScreen.kt b/src/main/kotlin/dartzee/screen/GameSetupScreen.kt index 1d329b25..0abe654f 100644 --- a/src/main/kotlin/dartzee/screen/GameSetupScreen.kt +++ b/src/main/kotlin/dartzee/screen/GameSetupScreen.kt @@ -34,7 +34,7 @@ class GameSetupScreen : EmbeddedScreen() { private val panelGameType = JPanel() private val panelPlayers = JPanel() private val launchPanel = JPanel() - val btnLaunch = JButton("Launch Game") + private val btnLaunch = JButton("Launch Game") val playerSelector = GameSetupPlayerSelector() val gameTypeComboBox = ComboBoxGameType() private val panelGameTypeCb = JPanel() @@ -93,6 +93,7 @@ class GameSetupScreen : EmbeddedScreen() { spinners.forEachIndexed { ix, spinner -> panelPointBreakdown.add(spinner, "cell $ix 0,alignx center") } + btnLaunch.name = "LaunchButton" matchConfigPanel.addActionListener(this) gameTypeComboBox.addActionListener(this) diff --git a/src/main/kotlin/dartzee/screen/MenuScreen.kt b/src/main/kotlin/dartzee/screen/MenuScreen.kt index 863870f8..41b09c98 100644 --- a/src/main/kotlin/dartzee/screen/MenuScreen.kt +++ b/src/main/kotlin/dartzee/screen/MenuScreen.kt @@ -173,13 +173,21 @@ class MenuScreen : EmbeddedScreen() { } } + private fun newGame() { + if (InjectedThings.partyMode) { + ScreenCache.switch() + } else { + ScreenCache.switch() + } + } + override fun showBackButton() = false override fun actionPerformed(arg0: ActionEvent) { when (arg0.source) { btnPreferences -> ScreenCache.switch() btnSyncSummary -> ScreenCache.switch() - btnNewGame -> ScreenCache.switch() + btnNewGame -> newGame() btnManagePlayers -> ScreenCache.switch() btnGameReport -> ScreenCache.switch() btnLeaderboards -> ScreenCache.switch() diff --git a/src/main/kotlin/dartzee/screen/SimplePlayerSelectionScreen.kt b/src/main/kotlin/dartzee/screen/SimplePlayerSelectionScreen.kt new file mode 100644 index 00000000..6a9cf067 --- /dev/null +++ b/src/main/kotlin/dartzee/screen/SimplePlayerSelectionScreen.kt @@ -0,0 +1,43 @@ +package dartzee.screen + +import dartzee.bean.GameSetupPlayerSelector +import dartzee.game.FinishType +import dartzee.game.GameLaunchParams +import dartzee.game.GameType +import dartzee.game.X01Config +import dartzee.utils.InjectedThings.gameLauncher +import java.awt.BorderLayout + +class SimplePlayerSelectionScreen : EmbeddedScreen() { + private val playerSelector = GameSetupPlayerSelector() + + init { + add(playerSelector, BorderLayout.CENTER) + } + + override fun initialise() { + playerSelector.init() + } + + override fun nextPressed() { + if (!playerSelector.valid(false)) { + return + } + + val launchParams = + GameLaunchParams( + playerSelector.getSelectedPlayers(), + GameType.X01, + X01Config(301, FinishType.Any).toJson(), + playerSelector.pairMode(), + ) + + gameLauncher.launchNewGame(launchParams) + } + + override fun getNextText() = "Launch Game" + + override fun showNextButton() = true + + override fun getScreenName() = "Select Players" +} diff --git a/src/test/kotlin/dartzee/TestUtils.kt b/src/test/kotlin/dartzee/TestUtils.kt index d41cd2c1..c38b6fc3 100644 --- a/src/test/kotlin/dartzee/TestUtils.kt +++ b/src/test/kotlin/dartzee/TestUtils.kt @@ -8,6 +8,7 @@ import com.github.alyssaburlton.swingtest.findAll import com.github.alyssaburlton.swingtest.findWindow import com.github.alyssaburlton.swingtest.flushEdt import com.github.alyssaburlton.swingtest.getChild +import com.github.alyssaburlton.swingtest.purgeWindows import com.github.alyssaburlton.swingtest.typeText import dartzee.bean.ComboBoxGameType import dartzee.bean.InteractiveDartboard @@ -251,6 +252,20 @@ fun runAsync(block: () -> T?): T? { return result } +fun runExpectingError(errorText: String, block: () -> Boolean) { + var result: Boolean? = null + SwingUtilities.invokeLater { result = block() } + + flushEdt() + getErrorDialog().getDialogMessage() shouldBe errorText + + getErrorDialog().clickOk() + flushEdt() + purgeWindows() + + result shouldBe false +} + fun purgeGameAndConfirm(localId: Long): String { runAsync { DevUtilities.purgeGame(localId) } diff --git a/src/test/kotlin/dartzee/bean/TestGameSetupPlayerSelector.kt b/src/test/kotlin/dartzee/bean/TestGameSetupPlayerSelector.kt index ca107475..81b69469 100644 --- a/src/test/kotlin/dartzee/bean/TestGameSetupPlayerSelector.kt +++ b/src/test/kotlin/dartzee/bean/TestGameSetupPlayerSelector.kt @@ -4,9 +4,7 @@ import com.github.alyssaburlton.swingtest.clickChild import dartzee.db.PlayerEntity import dartzee.helper.AbstractTest import dartzee.helper.insertPlayer -import io.kotest.matchers.collections.shouldBeEmpty -import io.kotest.matchers.collections.shouldContain -import io.kotest.matchers.collections.shouldContainExactly +import dartzee.runExpectingError import io.kotest.matchers.shouldBe import javax.swing.JToggleButton import org.junit.jupiter.api.Test @@ -17,10 +15,8 @@ class TestGameSetupPlayerSelector : AbstractTest() { val selector = GameSetupPlayerSelector() selector.init() - selector.valid(false) shouldBe false - selector.valid(true) shouldBe false - - dialogFactory.errorsShown.shouldContain("You must select at least 1 player.") + runExpectingError("You must select at least 1 player.") { selector.valid(false) } + runExpectingError("You must select at least 1 player.") { selector.valid(true) } } @Test @@ -29,9 +25,7 @@ class TestGameSetupPlayerSelector : AbstractTest() { val selector = GameSetupPlayerSelector() selector.init(listOf(alex)) - selector.valid(false) shouldBe true - dialogFactory.errorsShown.shouldBeEmpty() } @Test @@ -41,10 +35,9 @@ class TestGameSetupPlayerSelector : AbstractTest() { val selector = GameSetupPlayerSelector() selector.init(listOf(alex)) - selector.valid(true) shouldBe false - dialogFactory.errorsShown.shouldContainExactly( - "You must select at least 2 players for a match." - ) + runExpectingError("You must select at least 2 players for a match.") { + selector.valid(true) + } } @Test @@ -55,10 +48,7 @@ class TestGameSetupPlayerSelector : AbstractTest() { selector.init(listOf(alex, alyssa)) selector.clickChild() - selector.valid(true) shouldBe false - dialogFactory.errorsShown.shouldContainExactly( - "You must select at least 2 teams for a match." - ) + runExpectingError("You must select at least 2 teams for a match.") { selector.valid(true) } } @Test @@ -73,7 +63,6 @@ class TestGameSetupPlayerSelector : AbstractTest() { selector.valid(true) shouldBe true selector.valid(false) shouldBe true - dialogFactory.errorsShown.shouldBeEmpty() val p = insertPlayer() players.add(p) @@ -90,7 +79,6 @@ class TestGameSetupPlayerSelector : AbstractTest() { selector.valid(true) shouldBe true selector.valid(false) shouldBe true - dialogFactory.errorsShown.shouldBeEmpty() val p = insertPlayer() players.add(p) @@ -107,12 +95,8 @@ class TestGameSetupPlayerSelector : AbstractTest() { val selector = GameSetupPlayerSelector() selector.init(players) - selector.valid(true) shouldBe false - dialogFactory.errorsShown.shouldContainExactly("You cannot select more than 6 players.") - - dialogFactory.errorsShown.clear() - selector.valid(false) shouldBe false - dialogFactory.errorsShown.shouldContainExactly("You cannot select more than 6 players.") + runExpectingError("You cannot select more than 6 players.") { selector.valid(true) } + runExpectingError("You cannot select more than 6 players.") { selector.valid(false) } } @Test @@ -124,12 +108,8 @@ class TestGameSetupPlayerSelector : AbstractTest() { selector.init(players) selector.clickChild() - selector.valid(true) shouldBe false - dialogFactory.errorsShown.shouldContainExactly("You cannot select more than 6 teams.") - - dialogFactory.errorsShown.clear() - selector.valid(false) shouldBe false - dialogFactory.errorsShown.shouldContainExactly("You cannot select more than 6 teams.") + runExpectingError("You cannot select more than 6 teams.") { selector.valid(true) } + runExpectingError("You cannot select more than 6 teams.") { selector.valid(false) } } @Test diff --git a/src/test/kotlin/dartzee/screen/TestGameSetupScreen.kt b/src/test/kotlin/dartzee/screen/TestGameSetupScreen.kt index b425bdeb..dbdc65e3 100644 --- a/src/test/kotlin/dartzee/screen/TestGameSetupScreen.kt +++ b/src/test/kotlin/dartzee/screen/TestGameSetupScreen.kt @@ -1,5 +1,7 @@ package dartzee.screen +import com.github.alyssaburlton.swingtest.clickChild +import com.github.alyssaburlton.swingtest.clickOk import com.github.alyssaburlton.swingtest.getChild import dartzee.bean.GameParamFilterPanelDartzee import dartzee.bean.GameParamFilterPanelGolf @@ -7,6 +9,7 @@ import dartzee.bean.GameParamFilterPanelX01 import dartzee.bean.SpinnerX01 import dartzee.bean.getAllPlayers import dartzee.core.bean.items +import dartzee.core.helper.verifyNotCalled import dartzee.dartzee.aggregate.DartzeeTotalRulePrime import dartzee.dartzee.dart.DartzeeDartRuleEven import dartzee.dartzee.dart.DartzeeDartRuleOdd @@ -19,6 +22,8 @@ import dartzee.game.GameLauncher import dartzee.game.GameType import dartzee.game.MatchMode import dartzee.game.X01Config +import dartzee.getDialogMessage +import dartzee.getErrorDialog import dartzee.helper.AbstractTest import dartzee.helper.DEFAULT_X01_CONFIG import dartzee.helper.insertDartzeeTemplate @@ -30,17 +35,18 @@ import dartzee.updateSelection import dartzee.utils.InjectedThings import io.kotest.matchers.collections.shouldBeEmpty import io.kotest.matchers.collections.shouldContain -import io.kotest.matchers.collections.shouldContainExactly import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.collections.shouldNotContain import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeInstanceOf +import io.kotest.matchers.types.shouldNotBeInstanceOf import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.runs import io.mockk.slot import io.mockk.verify +import javax.swing.JButton import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -64,9 +70,12 @@ class TestGameSetupScreen : AbstractTest() { @Test fun `Should perform player selector validation when attempting to launch a game`() { val screen = GameSetupScreen() - screen.btnLaunch.doClick() + screen.clickChild(text = "Launch Game", async = true) - dialogFactory.errorsShown.shouldContainExactly("You must select at least 1 player.") + val error = getErrorDialog() + error.getDialogMessage() shouldBe "You must select at least 1 player." + error.clickOk() + verifyNotCalled { gameLauncher.launchNewGame(any()) } } @Test @@ -95,7 +104,7 @@ class TestGameSetupScreen : AbstractTest() { val gameParamsPanel = screen.gameParamFilterPanel as GameParamFilterPanelX01 gameParamsPanel.getChild().value = 701 - screen.btnLaunch.doClick() + screen.launchButton().doClick() val expectedParams = GameLaunchParams( @@ -119,7 +128,7 @@ class TestGameSetupScreen : AbstractTest() { screen.lblGames.isVisible shouldBe false screen.spinnerGames.isVisible shouldBe false screen.matchConfigPanel.components.toList() shouldNotContain screen.panelPointBreakdown - screen.btnLaunch.text shouldBe "Launch Game" + screen.launchButton().text shouldBe "Launch Game" // First to screen.rdbtnFirstTo.doClick() @@ -128,7 +137,7 @@ class TestGameSetupScreen : AbstractTest() { screen.lblGames.isVisible shouldBe false screen.spinnerGames.isVisible shouldBe false screen.matchConfigPanel.components.toList() shouldNotContain screen.panelPointBreakdown - screen.btnLaunch.text shouldBe "Launch Match" + screen.launchButton().text shouldBe "Launch Match" // Points-based screen.rdbtnPoints.doClick() @@ -137,7 +146,7 @@ class TestGameSetupScreen : AbstractTest() { screen.lblGames.isVisible shouldBe true screen.spinnerGames.isVisible shouldBe true screen.matchConfigPanel.components.toList() shouldContain screen.panelPointBreakdown - screen.btnLaunch.text shouldBe "Launch Match" + screen.launchButton().text shouldBe "Launch Match" // Back to single game screen.rdbtnSingleGame.doClick() @@ -146,7 +155,7 @@ class TestGameSetupScreen : AbstractTest() { screen.lblGames.isVisible shouldBe false screen.spinnerGames.isVisible shouldBe false screen.matchConfigPanel.components.toList() shouldNotContain screen.panelPointBreakdown - screen.btnLaunch.text shouldBe "Launch Game" + screen.launchButton().text shouldBe "Launch Game" } @Test @@ -156,13 +165,13 @@ class TestGameSetupScreen : AbstractTest() { val screen = GameSetupScreen() screen.gameTypeComboBox.updateSelection(GameType.DARTZEE) - screen.btnLaunch.isVisible shouldBe false + screen.launchButton().isVisible shouldBe false screen.btnNext.isVisible shouldBe true val dartzeeParamPanel = screen.gameParamFilterPanel as GameParamFilterPanelDartzee dartzeeParamPanel.comboBox.selectedIndex = 2 - screen.btnLaunch.isVisible shouldBe true + screen.launchButton().isVisible shouldBe true screen.btnNext.isVisible shouldBe false } @@ -183,7 +192,7 @@ class TestGameSetupScreen : AbstractTest() { val dartzeeParamPanel = screen.gameParamFilterPanel as GameParamFilterPanelDartzee dartzeeParamPanel.comboBox.selectedIndex = 2 - screen.btnLaunch.doClick() + screen.launchButton().doClick() val expectedParams = GameLaunchParams(players, GameType.DARTZEE, templateId, false, listOf(ruleOne, ruleTwo)) @@ -200,7 +209,7 @@ class TestGameSetupScreen : AbstractTest() { scrn.rdbtnFirstTo.doClick() scrn.spinnerWins.value = 7 - scrn.btnLaunch.doClick() + scrn.launchButton().doClick() val launchParams = GameLaunchParams(players, GameType.X01, DEFAULT_X01_CONFIG.toJson(), false) @@ -229,7 +238,7 @@ class TestGameSetupScreen : AbstractTest() { scrn.spinners[4].value = 2 scrn.spinners[5].value = 1 - scrn.btnLaunch.doClick() + scrn.launchButton().doClick() verify { gameLauncher.launchNewMatch(any(), any()) } @@ -246,9 +255,14 @@ class TestGameSetupScreen : AbstractTest() { setupScreen.playerSelector.init(listOf()) setupScreen.gameTypeComboBox.updateSelection(GameType.DARTZEE) - setupScreen.btnNext.doClick() + setupScreen.clickChild(text = "Next > ", async = true) + + val error = getErrorDialog() + error.getDialogMessage() shouldBe "You must select at least 1 player." + error.clickOk() - dialogFactory.errorsShown.shouldContainExactly("You must select at least 1 player.") + val currentScreen = ScreenCache.currentScreen() + currentScreen.shouldNotBeInstanceOf() } @Test @@ -263,8 +277,6 @@ class TestGameSetupScreen : AbstractTest() { setupScreen.gameTypeComboBox.updateSelection(GameType.DARTZEE) setupScreen.btnNext.doClick() - dialogFactory.errorsShown.shouldBeEmpty() - val currentScreen = ScreenCache.currentScreen() currentScreen.shouldBeInstanceOf() currentScreen.btnNext.text shouldBe "Launch Game >" @@ -291,8 +303,6 @@ class TestGameSetupScreen : AbstractTest() { setupScreen.gameTypeComboBox.updateSelection(GameType.DARTZEE) setupScreen.btnNext.doClick() - dialogFactory.errorsShown.shouldBeEmpty() - val currentScreen = ScreenCache.currentScreen() currentScreen.shouldBeInstanceOf() currentScreen.btnNext.text shouldBe "Launch Match >" @@ -322,6 +332,8 @@ class TestGameSetupScreen : AbstractTest() { newFilterPanel.comboBox.items().mapNotNull { it.hiddenData }.shouldHaveSize(1) } + private fun GameSetupScreen.launchButton() = getChild("LaunchButton") + private fun makeGameSetupScreenReadyToLaunch(): Pair> { val p1 = insertPlayer(strategy = "") val p2 = insertPlayer(strategy = "") diff --git a/src/test/kotlin/dartzee/screen/TestMenuScreen.kt b/src/test/kotlin/dartzee/screen/TestMenuScreen.kt index 74d148e3..2acd6373 100644 --- a/src/test/kotlin/dartzee/screen/TestMenuScreen.kt +++ b/src/test/kotlin/dartzee/screen/TestMenuScreen.kt @@ -35,6 +35,15 @@ class TestMenuScreen : AbstractTest() { ScreenCache.currentScreen().shouldBeInstanceOf() } + @Test + fun `Should go to the simplified game setup screen in party mode`() { + InjectedThings.partyMode = true + + val scrn = MenuScreen() + scrn.clickChild(text = "New Game") + ScreenCache.currentScreen().shouldBeInstanceOf() + } + @Test fun `Should go to the player management screen`() { val scrn = MenuScreen() diff --git a/src/test/kotlin/dartzee/screen/TestSimplePlayerSelectionScreen.kt b/src/test/kotlin/dartzee/screen/TestSimplePlayerSelectionScreen.kt new file mode 100644 index 00000000..e4af70a4 --- /dev/null +++ b/src/test/kotlin/dartzee/screen/TestSimplePlayerSelectionScreen.kt @@ -0,0 +1,67 @@ +package dartzee.screen + +import com.github.alyssaburlton.swingtest.clickChild +import com.github.alyssaburlton.swingtest.clickOk +import com.github.alyssaburlton.swingtest.getChild +import dartzee.bean.GameSetupPlayerSelector +import dartzee.core.helper.verifyNotCalled +import dartzee.game.FinishType +import dartzee.game.GameLaunchParams +import dartzee.game.GameLauncher +import dartzee.game.GameType +import dartzee.game.X01Config +import dartzee.getDialogMessage +import dartzee.getErrorDialog +import dartzee.helper.AbstractTest +import dartzee.helper.preparePlayers +import dartzee.utils.InjectedThings +import io.kotest.matchers.shouldBe +import io.mockk.mockk +import io.mockk.verify +import javax.swing.JButton +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test + +class TestSimplePlayerSelectionScreen : AbstractTest() { + private val gameLauncher = mockk(relaxed = true) + + @BeforeEach + fun beforeEach() { + InjectedThings.gameLauncher = gameLauncher + } + + @Test + fun `Should perform player selector validation when attempting to launch a game`() { + val screen = SimplePlayerSelectionScreen() + screen.postInit() + screen.clickChild(text = "Launch Game >", async = true) + + val error = getErrorDialog() + error.getDialogMessage() shouldBe "You must select at least 1 player." + error.clickOk() + verifyNotCalled { gameLauncher.launchNewGame(any()) } + } + + @Test + fun `Should launch a game of 301 with the right parameters`() { + val (p1, p2) = preparePlayers(2) + + val screen = SimplePlayerSelectionScreen() + screen.initialise() + screen.postInit() + + screen.getChild().init(listOf(p1, p2)) + screen.clickChild(text = "Launch Game >") + + verify { + gameLauncher.launchNewGame( + GameLaunchParams( + listOf(p1, p2), + GameType.X01, + X01Config(301, FinishType.Any).toJson(), + false + ) + ) + } + } +}