diff --git a/src/main/kotlin/dartzee/game/X01Config.kt b/src/main/kotlin/dartzee/game/X01Config.kt index 2d4367a6..5847f6da 100644 --- a/src/main/kotlin/dartzee/game/X01Config.kt +++ b/src/main/kotlin/dartzee/game/X01Config.kt @@ -3,6 +3,8 @@ package dartzee.game import com.fasterxml.jackson.module.kotlin.readValue import dartzee.core.util.jsonMapper +val X01_PARTY_CONFIG = X01Config(301, FinishType.Any) + enum class FinishType { Any, Doubles diff --git a/src/main/kotlin/dartzee/screen/MenuScreen.kt b/src/main/kotlin/dartzee/screen/MenuScreen.kt index 41b09c98..8a7d6593 100644 --- a/src/main/kotlin/dartzee/screen/MenuScreen.kt +++ b/src/main/kotlin/dartzee/screen/MenuScreen.kt @@ -8,6 +8,7 @@ import dartzee.screen.player.PlayerManagementScreen import dartzee.screen.preference.PreferencesScreen import dartzee.screen.reporting.ReportingSetupScreen import dartzee.screen.stats.overall.LeaderboardsScreen +import dartzee.screen.stats.overall.SimplifiedLeaderboardScreen import dartzee.screen.sync.SyncManagementScreen import dartzee.utils.DARTS_VERSION_NUMBER import dartzee.utils.InjectedThings @@ -181,6 +182,14 @@ class MenuScreen : EmbeddedScreen() { } } + private fun openLeaderboards() { + if (InjectedThings.partyMode) { + ScreenCache.switch() + } else { + ScreenCache.switch() + } + } + override fun showBackButton() = false override fun actionPerformed(arg0: ActionEvent) { @@ -190,7 +199,7 @@ class MenuScreen : EmbeddedScreen() { btnNewGame -> newGame() btnManagePlayers -> ScreenCache.switch() btnGameReport -> ScreenCache.switch() - btnLeaderboards -> ScreenCache.switch() + btnLeaderboards -> openLeaderboards() btnUtilities -> ScreenCache.switch() btnDartzeeTemplates -> ScreenCache.switch() else -> super.actionPerformed(arg0) diff --git a/src/main/kotlin/dartzee/screen/SimplePlayerSelectionScreen.kt b/src/main/kotlin/dartzee/screen/SimplePlayerSelectionScreen.kt index 6a9cf067..66deeeb3 100644 --- a/src/main/kotlin/dartzee/screen/SimplePlayerSelectionScreen.kt +++ b/src/main/kotlin/dartzee/screen/SimplePlayerSelectionScreen.kt @@ -1,10 +1,9 @@ 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.game.X01_PARTY_CONFIG import dartzee.utils.InjectedThings.gameLauncher import java.awt.BorderLayout @@ -28,7 +27,7 @@ class SimplePlayerSelectionScreen : EmbeddedScreen() { GameLaunchParams( playerSelector.getSelectedPlayers(), GameType.X01, - X01Config(301, FinishType.Any).toJson(), + X01_PARTY_CONFIG.toJson(), playerSelector.pairMode(), ) diff --git a/src/main/kotlin/dartzee/screen/stats/overall/LeaderboardTotalScore.kt b/src/main/kotlin/dartzee/screen/stats/overall/LeaderboardTotalScore.kt index 259a34a4..15c213e3 100644 --- a/src/main/kotlin/dartzee/screen/stats/overall/LeaderboardTotalScore.kt +++ b/src/main/kotlin/dartzee/screen/stats/overall/LeaderboardTotalScore.kt @@ -7,6 +7,7 @@ import dartzee.core.util.sortedBy import dartzee.db.PlayerEntity import dartzee.game.GameType import dartzee.utils.InjectedThings.mainDatabase +import dartzee.utils.InjectedThings.partyMode import dartzee.utils.PREFERENCES_INT_LEADERBOARD_SIZE import dartzee.utils.PreferenceUtil import dartzee.utils.combinePlayerFlags @@ -20,7 +21,7 @@ import javax.swing.JRadioButton import javax.swing.JSeparator import javax.swing.SwingConstants -class LeaderboardTotalScore(private val gameType: GameType) : +class LeaderboardTotalScore(private val gameType: GameType, gameParams: String? = null) : AbstractLeaderboard(), ActionListener { private val panelGameParams = getFilterPanel(gameType) @@ -46,15 +47,24 @@ class LeaderboardTotalScore(private val gameType: GameType) : add(panelFilters, BorderLayout.NORTH) - panelFilters.add(panelGameParams) - panelFilters.add(makeSeparator()) + if (!partyMode) { + panelFilters.add(panelGameParams) + panelFilters.add(makeSeparator()) + } + panelFilters.add(panelTeamsOrIndividuals) panelFilters.add(makeSeparator()) - panelFilters.add(panelPlayerFilters) - panelFilters.add(makeSeparator()) + + if (!partyMode) { + panelFilters.add(panelPlayerFilters) + panelFilters.add(makeSeparator()) + } + panelFilters.add(panelBestOrWorst) add(table, BorderLayout.CENTER) + gameParams?.let(panelGameParams::setGameParams) + panelGameParams.addActionListener(this) panelPlayerFilters.addActionListener(this) panelTeamsOrIndividuals.addActionListener(this) diff --git a/src/main/kotlin/dartzee/screen/stats/overall/SimplifiedLeaderboardScreen.kt b/src/main/kotlin/dartzee/screen/stats/overall/SimplifiedLeaderboardScreen.kt new file mode 100644 index 00000000..5ded1bd4 --- /dev/null +++ b/src/main/kotlin/dartzee/screen/stats/overall/SimplifiedLeaderboardScreen.kt @@ -0,0 +1,20 @@ +package dartzee.screen.stats.overall + +import dartzee.game.GameType +import dartzee.game.X01_PARTY_CONFIG +import dartzee.screen.EmbeddedScreen +import java.awt.BorderLayout + +class SimplifiedLeaderboardScreen : EmbeddedScreen() { + private val tab = LeaderboardTotalScore(GameType.X01, X01_PARTY_CONFIG.toJson()) + + init { + add(tab, BorderLayout.CENTER) + } + + override fun getScreenName() = "Leaderboard" + + override fun initialise() { + tab.buildTable() + } +} diff --git a/src/test/kotlin/dartzee/screen/TestMenuScreen.kt b/src/test/kotlin/dartzee/screen/TestMenuScreen.kt index 2acd6373..37c6674a 100644 --- a/src/test/kotlin/dartzee/screen/TestMenuScreen.kt +++ b/src/test/kotlin/dartzee/screen/TestMenuScreen.kt @@ -12,6 +12,7 @@ import dartzee.screen.player.PlayerManagementScreen import dartzee.screen.preference.PreferencesScreen import dartzee.screen.reporting.ReportingSetupScreen import dartzee.screen.stats.overall.LeaderboardsScreen +import dartzee.screen.stats.overall.SimplifiedLeaderboardScreen import dartzee.screen.sync.SyncManagementScreen import dartzee.utils.InjectedThings import io.kotest.matchers.nulls.shouldNotBeNull @@ -65,6 +66,15 @@ class TestMenuScreen : AbstractTest() { ScreenCache.currentScreen().shouldBeInstanceOf() } + @Test + fun `Should go to the simplified leaderboards screen in party mode`() { + InjectedThings.partyMode = true + + val scrn = MenuScreen() + scrn.clickChild(text = "Leaderboards") + ScreenCache.currentScreen().shouldBeInstanceOf() + } + @Test fun `Should go to the utilities screen`() { val scrn = MenuScreen() diff --git a/src/test/kotlin/dartzee/screen/TestSimplePlayerSelectionScreen.kt b/src/test/kotlin/dartzee/screen/TestSimplePlayerSelectionScreen.kt index e4af70a4..aca340cc 100644 --- a/src/test/kotlin/dartzee/screen/TestSimplePlayerSelectionScreen.kt +++ b/src/test/kotlin/dartzee/screen/TestSimplePlayerSelectionScreen.kt @@ -5,11 +5,10 @@ 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.game.X01_PARTY_CONFIG import dartzee.getDialogMessage import dartzee.getErrorDialog import dartzee.helper.AbstractTest @@ -55,12 +54,7 @@ class TestSimplePlayerSelectionScreen : AbstractTest() { verify { gameLauncher.launchNewGame( - GameLaunchParams( - listOf(p1, p2), - GameType.X01, - X01Config(301, FinishType.Any).toJson(), - false - ) + GameLaunchParams(listOf(p1, p2), GameType.X01, X01_PARTY_CONFIG.toJson(), false) ) } } diff --git a/src/test/kotlin/dartzee/screen/stats/overall/TestLeaderboardTotalScore.kt b/src/test/kotlin/dartzee/screen/stats/overall/TestLeaderboardTotalScore.kt index ad69b4a3..79de4dbd 100644 --- a/src/test/kotlin/dartzee/screen/stats/overall/TestLeaderboardTotalScore.kt +++ b/src/test/kotlin/dartzee/screen/stats/overall/TestLeaderboardTotalScore.kt @@ -1,19 +1,27 @@ package dartzee.screen.stats.overall import com.github.alyssaburlton.swingtest.clickChild +import com.github.alyssaburlton.swingtest.findChild import com.github.alyssaburlton.swingtest.getChild +import dartzee.bean.GameParamFilterPanel +import dartzee.bean.GameParamFilterPanelRoundTheClock import dartzee.bean.GameParamFilterPanelX01 +import dartzee.bean.PlayerTypeFilterPanel import dartzee.bean.SpinnerX01 import dartzee.core.bean.ScrollTable +import dartzee.game.ClockType import dartzee.game.FinishType import dartzee.game.GameType +import dartzee.game.RoundTheClockConfig import dartzee.game.X01Config import dartzee.helper.AbstractRegistryTest import dartzee.helper.insertFinishedParticipant import dartzee.helper.insertFinishedTeam +import dartzee.utils.InjectedThings import dartzee.utils.PREFERENCES_INT_LEADERBOARD_SIZE import dartzee.utils.PreferenceUtil import io.kotest.matchers.shouldBe +import javax.swing.JCheckBox import javax.swing.JRadioButton import org.junit.jupiter.api.Test @@ -161,6 +169,29 @@ class TestLeaderboardTotalScore : AbstractRegistryTest() { leaderboard.getNameAt(1) shouldBe "Robocop" } + @Test + fun `Should support pre-populating game params`() { + val leaderboard = + LeaderboardTotalScore( + GameType.ROUND_THE_CLOCK, + RoundTheClockConfig(ClockType.Trebles, false).toJson() + ) + + val filterPanel = leaderboard.getChild() + filterPanel.getChild(text = "In order").isSelected shouldBe false + filterPanel.getChild(text = ClockType.Trebles.toString()).isSelected shouldBe + true + } + + @Test + fun `Should omit irrelevant filters in party mode`() { + InjectedThings.partyMode = true + + val leaderboard = LeaderboardTotalScore(GameType.X01) + leaderboard.findChild() shouldBe null + leaderboard.findChild() shouldBe null + } + private fun LeaderboardTotalScore.rowCount() = table().rowCount private fun LeaderboardTotalScore.getNameAt(row: Int) = table().getValueAt(row, 2) diff --git a/src/test/kotlin/dartzee/screen/stats/overall/TestSimplifiedLeaderboardScreen.kt b/src/test/kotlin/dartzee/screen/stats/overall/TestSimplifiedLeaderboardScreen.kt new file mode 100644 index 00000000..8ac63e5f --- /dev/null +++ b/src/test/kotlin/dartzee/screen/stats/overall/TestSimplifiedLeaderboardScreen.kt @@ -0,0 +1,32 @@ +package dartzee.screen.stats.overall + +import com.github.alyssaburlton.swingtest.findAll +import com.github.alyssaburlton.swingtest.getChild +import dartzee.core.bean.ScrollTable +import dartzee.game.GameType +import dartzee.game.X01_PARTY_CONFIG +import dartzee.helper.AbstractTest +import dartzee.helper.insertFinishedParticipant +import dartzee.only +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeInstanceOf +import org.junit.jupiter.api.Test + +class TestSimplifiedLeaderboardScreen : AbstractTest() { + @Test + fun `Should show just one leaderboard of the right type`() { + val leaderboard = SimplifiedLeaderboardScreen().findAll().only() + leaderboard.shouldBeInstanceOf() + } + + @Test + fun `Should populate the leaderboard`() { + insertFinishedParticipant("Stuart", GameType.X01, 34, X01_PARTY_CONFIG.toJson()) + + val scrn = SimplifiedLeaderboardScreen() + scrn.initialise() + + val leaderboard = scrn.getChild() + leaderboard.getChild().rowCount shouldBe 1 + } +}