diff --git a/src/main/kotlin/dartzee/screen/ai/NewSetupRuleDialog.kt b/src/main/kotlin/dartzee/screen/ai/NewSetupRuleDialog.kt deleted file mode 100644 index 7237a5b3..00000000 --- a/src/main/kotlin/dartzee/screen/ai/NewSetupRuleDialog.kt +++ /dev/null @@ -1,136 +0,0 @@ -package dartzee.screen.ai - -import dartzee.ai.AimDart -import dartzee.ai.getX01AimDart -import dartzee.bean.SpinnerSingleSelector -import dartzee.core.bean.NumberField -import dartzee.core.bean.RadioButtonPanel -import dartzee.core.screen.SimpleDialog -import dartzee.core.util.DialogUtil -import dartzee.game.FinishType -import dartzee.`object`.Dart -import dartzee.screen.ScreenCache -import dartzee.utils.isBust -import java.awt.BorderLayout -import java.awt.Dimension -import java.awt.event.ActionEvent -import javax.swing.JLabel -import javax.swing.JRadioButton -import net.miginfocom.swing.MigLayout - -class NewSetupRuleDialog(private val hmScoreToDart: MutableMap) : SimpleDialog() { - val panel = RadioButtonPanel() - private val lblScore = JLabel("Score") - val nfScore = NumberField(4, 501) - private val lblAimFor = JLabel("Aim for") - val rdbtnSingle = JRadioButton("Single") - val rdbtnDouble = JRadioButton("Double") - val rdbtnTreble = JRadioButton("Treble") - val spinner = SpinnerSingleSelector() - - init { - title = "Add Rule" - setSize(200, 200) - isResizable = false - isModal = true - - contentPane.add(panel, BorderLayout.CENTER) - panel.layout = MigLayout("", "[][][]", "[][][][]") - panel.add(lblScore, "cell 0 0,alignx trailing") - panel.add(nfScore, "cell 1 0,growx") - panel.add(lblAimFor, "cell 0 1") - rdbtnSingle.preferredSize = Dimension(53, 25) - panel.add(rdbtnSingle, "cell 1 1") - panel.add(spinner, "cell 2 1") - rdbtnDouble.preferredSize = Dimension(59, 25) - panel.add(rdbtnDouble, "cell 1 2") - rdbtnTreble.preferredSize = Dimension(55, 25) - panel.add(rdbtnTreble, "cell 1 3") - - rdbtnSingle.addActionListener(this) - rdbtnDouble.addActionListener(this) - rdbtnTreble.addActionListener(this) - - pack() - } - - private fun getDartFromSelections(): AimDart { - val multiplier = getMultiplier() - val value = spinner.value as Int - return AimDart(value, multiplier) - } - - private fun getMultiplier(): Int { - return when (panel.selection) { - rdbtnSingle -> 1 - rdbtnDouble -> 2 - else -> 3 - } - } - - override fun actionPerformed(arg0: ActionEvent) { - if (panel.isEventSource(arg0)) { - panel.remove(spinner) - - val multiplier = getMultiplier() - panel.add(spinner, "cell 2 $multiplier") - - pack() - } else { - super.actionPerformed(arg0) - } - } - - override fun okPressed() { - if (valid()) { - val score = nfScore.getNumber() - val drt = getDartFromSelections() - - hmScoreToDart[score] = drt - - dispose() - } - } - - private fun valid(): Boolean { - val score = nfScore.getNumber() - if (score == -1) { - DialogUtil.showError("You must enter a score for this rule to apply to.") - return false - } - - val drt = getDartFromSelections() - if (drt.score == 25 && drt.multiplier == 3) { - DialogUtil.showError("Treble 25 is not a valid dart!") - return false - } - - val actualDart = Dart(drt.score, drt.multiplier).apply { startingScore = score } - if (isBust(actualDart, FinishType.Doubles)) { - DialogUtil.showError("This target would bust the player") - return false - } - - // If we're specifying a rule for under 60, validate whether what we're setting up is - // already the default - if (score <= 60) { - val defaultDart = getX01AimDart(score, FinishType.Doubles) - if (defaultDart == drt) { - DialogUtil.showError( - "The selected dart is already the default for this starting score." - ) - return false - } - } - - return true - } - - companion object { - fun addNewSetupRule(hmScoreToDart: MutableMap) { - val dlg = NewSetupRuleDialog(hmScoreToDart) - dlg.setLocationRelativeTo(ScreenCache.mainScreen) - dlg.isVisible = true - } - } -} diff --git a/src/test/kotlin/dartzee/screen/ai/TestNewSetupRuleDialog.kt b/src/test/kotlin/dartzee/screen/ai/TestNewSetupRuleDialog.kt deleted file mode 100644 index d1b54d9e..00000000 --- a/src/test/kotlin/dartzee/screen/ai/TestNewSetupRuleDialog.kt +++ /dev/null @@ -1,133 +0,0 @@ -package dartzee.screen.ai - -import com.github.alyssaburlton.swingtest.clickCancel -import com.github.alyssaburlton.swingtest.clickOk -import com.github.alyssaburlton.swingtest.shouldBeVisible -import com.github.alyssaburlton.swingtest.shouldNotBeVisible -import dartzee.ai.AimDart -import dartzee.getDialogMessage -import dartzee.getErrorDialog -import dartzee.helper.AbstractTest -import io.kotest.matchers.collections.shouldBeEmpty -import io.kotest.matchers.maps.shouldContain -import io.kotest.matchers.shouldBe -import net.miginfocom.swing.MigLayout -import org.junit.jupiter.api.Test - -class TestNewSetupRuleDialog : AbstractTest() { - @Test - fun `Should move the spinner to the correct cell when radio selection changes`() { - val dlg = NewSetupRuleDialog(mutableMapOf()) - - val layout = dlg.panel.layout as MigLayout - - dlg.rdbtnSingle.doClick() - layout.getComponentConstraints(dlg.spinner) shouldBe "cell 2 1" - - dlg.rdbtnDouble.doClick() - layout.getComponentConstraints(dlg.spinner) shouldBe "cell 2 2" - - dlg.rdbtnTreble.doClick() - layout.getComponentConstraints(dlg.spinner) shouldBe "cell 2 3" - } - - @Test - fun `Should not allow the score field to be left blank`() { - val dlg = NewSetupRuleDialog(mutableMapOf()) - dlg.isModal = false - dlg.isVisible = true - dlg.clickOk(async = true) - - getErrorDialog().getDialogMessage() shouldBe - "You must enter a score for this rule to apply to." - - dlg.shouldBeVisible() - } - - @Test - fun `Should not allow treble 25 to be entered as a target`() { - val dlg = NewSetupRuleDialog(mutableMapOf()) - - dlg.nfScore.value = 50 - dlg.spinner.value = 25 - dlg.rdbtnTreble.doClick() - - dlg.clickOk(async = true) - getErrorDialog().getDialogMessage() shouldBe "Treble 25 is not a valid dart!" - } - - @Test - fun `Should not allow a target that would bust the player`() { - val dlg = NewSetupRuleDialog(mutableMapOf()) - - dlg.nfScore.value = 50 - - dlg.spinner.value = 20 - dlg.rdbtnTreble.doClick() - - dlg.clickOk(async = true) - getErrorDialog().getDialogMessage() shouldBe "This target would bust the player" - } - - @Test - fun `Should not allow a rule that overlaps with the existing default`() { - val dlg = NewSetupRuleDialog(mutableMapOf()) - - dlg.nfScore.value = 60 - dlg.spinner.value = 20 - dlg.rdbtnSingle.doClick() - - dlg.clickOk(async = true) - getErrorDialog().getDialogMessage() shouldBe - "The selected dart is already the default for this starting score." - } - - @Test - fun `Should add a valid rule to the HashMap`() { - val hm = mutableMapOf() - val dlg = NewSetupRuleDialog(hm) - - dlg.nfScore.value = 50 - dlg.spinner.value = 25 - dlg.rdbtnDouble.doClick() - - dlg.clickOk() - dlg.shouldNotBeVisible() - hm.shouldContain(50, AimDart(25, 2)) - hm.size shouldBe 1 - } - - @Test - fun `Should not add to the HashMap when cancelled`() { - val hm = mutableMapOf() - val dlg = NewSetupRuleDialog(hm) - - dlg.nfScore.value = 50 - dlg.spinner.value = 25 - dlg.rdbtnDouble.doClick() - - dlg.clickCancel() - hm.size shouldBe 0 - } - - @Test - fun `Should set the correct score and multiplier on the target dart`() { - verifyDart("Single", 1) - verifyDart("Double", 2) - verifyDart("Treble", 3) - } - - private fun verifyDart(rdbtn: String, multiplier: Int) { - val hm = mutableMapOf() - val dlg = NewSetupRuleDialog(hm) - - dlg.nfScore.value = 60 - dlg.spinner.value = 10 - dlg.panel.setSelection(rdbtn) - - dlg.clickOk() - dialogFactory.errorsShown.shouldBeEmpty() - hm.shouldContain(60, AimDart(10, multiplier)) - hm.size shouldBe 1 - } -}