From 24b81222735b0043bfb294ec94077a2ca5e22b4c Mon Sep 17 00:00:00 2001 From: dtookey Date: Sun, 10 Sep 2023 20:27:06 -0400 Subject: [PATCH] cleanup --- src/main/kotlin/simulation/dice/DiceRoller.kt | 8 +++-- src/test/kotlin/simulation/DiceTest.kt | 29 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/simulation/dice/DiceRoller.kt b/src/main/kotlin/simulation/dice/DiceRoller.kt index dadd649..e40d624 100644 --- a/src/main/kotlin/simulation/dice/DiceRoller.kt +++ b/src/main/kotlin/simulation/dice/DiceRoller.kt @@ -8,8 +8,8 @@ import kotlin.math.min /** * Enumeration of different dice roll types. * - * @property Advantage Rolls the dice twice and takes the higher result. * @property Normal Rolls the dice normally once. + * @property Advantage Rolls the dice twice and takes the higher result. * @property Disadvantage Rolls the dice twice and takes the lower result. */ enum class RollType { @@ -33,6 +33,10 @@ data class RollResult(val min: Int, val max: Int, val result: Int) interface DiceRoller { + /** + * string representation of the base dice in {n}d{size} format + * i.e. 1d20, 2d7, 30d100 + */ val rollString: String val modifiers: List> val nDice: Int @@ -40,7 +44,7 @@ interface DiceRoller { companion object { - internal fun defaultDiceStringParseFn(rollString: String): Pair { + fun defaultDiceStringParseFn(rollString: String): Pair { val cleanRollString = rollString.lowercase() val parts = cleanRollString.split('d') return Pair(parts[0].toInt(), parts[1].toInt()) diff --git a/src/test/kotlin/simulation/DiceTest.kt b/src/test/kotlin/simulation/DiceTest.kt index 158e4f6..f25cd19 100644 --- a/src/test/kotlin/simulation/DiceTest.kt +++ b/src/test/kotlin/simulation/DiceTest.kt @@ -82,26 +82,32 @@ internal class DiceRollerTests { verifyBoundariesForTypes(1, 20) verifyBoundariesForTypes(2, 6) verifyBoundariesForTypes(5, 8) - verifyBoundariesForTypes(1000, 6) - verifyBoundariesForTypes(6, 1000) + + //we have to increase the iteration count by a few orders of magnitude in order to have a chance of hitting a max + // roll w/disadvantage + verifyBoundariesForTypes(6, 1000, 100_000_000) + verifyBoundariesForTypes(1000, 6, 100_000_000) + } - private fun verifyBoundariesForTypes(nDice: Int, dieSize: Int) { + private fun verifyBoundariesForTypes(nDice: Int, dieSize: Int, iterationCount: Long = 10_000) { val rollString = "${nDice}d${dieSize}" - val iterations = 10_000_000 val max = nDice * dieSize - var observedMin = false - var observedMax = false - - RollType.entries.parallelStream() .forEach { + var observedMin = false + var observedMax = false val dice = Dice.regular(rollString) val r = Random(1) - for (i in 0..