From 8d0fb81ba992060c533d77b0294f698e28ef9e4b Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sun, 13 Sep 2026 21:43:48 +0200 Subject: [PATCH] test: cover run --- tests/run.lua | 177 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 173 insertions(+), 4 deletions(-) diff --git a/tests/run.lua b/tests/run.lua index e4682d9..39d85e0 100644 --- a/tests/run.lua +++ b/tests/run.lua @@ -14574,10 +14574,179 @@ end local order = { "rngDeterminism", "mapDeterminism", "tilesRegistry", "fovKnownScene", "losSightLine", "astarPathing", "combatResolution", "itemsAndEquipment", "affixes", "statusEffects", - "scheduler", "generators", "connectivityRepair", "dungeonPersistence", "monsterAiChase", "monsterAiRanged", - "monsterAiFlee", "monsterAiDeterministic", "doorsAndKeys", "traps", "lightAndDark", - "identification", "effects", "messageLog", "weaponAffixOnHit", "saveLoadRoundTrip", - "deterministicPlaythrough", "autoplayDescends", + "scheduler", "generators", + "mazeGeneratorIsDeterministicDiffersAcrossSeedsAndLeavesEveryFloorCellReachable", + "mazeGeneratorIsRegisteredButExcludedFromTheDepthCycle", + "mazeGeneratorProducesOneWideCorridorsRatherThanOpenRooms", + "mazeGeneratorBraidingOpensSomeDeadEndsWithoutTouchingConnectivity", + "prefabVaultSizeMatchesItsWidestRowAndItsRowCount", + "prefabVaultFitsAcceptsAnAnchorWithAWallGapToEveryBorderAndRejectsOneWithout", + "prefabVaultStampWritesEveryGlyphAndCollectsTreasureMonsterAndLootMarkersInMapOrder", + "prefabVaultStampIsDeterministicForAFixedAnchor", + "builderCanBeExplicitlySteeredToAMazeFloorAndStillYieldsAPlayableLevel", + "connectivityRepair", "dungeonPersistence", "monsterAiChase", "monsterAiRanged", + "monsterAiFlee", "monsterAiDeterministic", + "aiActConfusedMonsterSometimesStumblesInsteadOfChasing", + "aiActWithoutConfusionAlwaysRunsTheNormalBehaviour", + "aiActBlindedArcherNeitherShootsNorChasesEvenWithAClearShot", + "gameAdjacentAllyFindsACompanionStandingRightNextToAMonster", + "gameAdjacentAllyIgnoresAHostileMonsterAndOnlyCountsCardinalAdjacency", + "gameAdjacentAllyBreaksTiesByTheLowerEntityIdAndIgnoresADeadAlly", + "aiChaseAttacksAnAllyBlockingTheOnlyCorridorToThePlayerInsteadOfIdlingForever", + "aiChasePrefersAnAdjacentPlayerOverAnAdjacentAllyWhenBothAreInMeleeRange", + "aiPackAttacksAnAllyBlockingTheOnlyCorridorToThePlayerInsteadOfIdlingForever", + "aiTunnelAttacksAnAllyBlockingItsOnlyGapInsteadOfIdling", + "aiRangedAttacksABlockingAllyWhenItHasNoLineOfSightToThePlayerAtAll", + "gameMoveMonsterAttacksAnAllyItBumpsIntoInsteadOfDoingNothing", + "aiActConfusedMonsterCanStumbleIntoAttackingABlockingAllyInsteadOfIdling", + "doorsAndKeys", "traps", + "gameSpringTrapConfuseEffectAppliesToAnyVictimNotJustThePlayer", + "gameSpringTrapBlindEffectAppliesToAnyVictimNotJustThePlayer", + "gameSpringTrapStunEffectAppliesToAnyVictimNotJustThePlayer", + "gameMovePlayerConfusionEitherFollowsTheChosenDirectionOrStumblesElsewhere", + "gameMovePlayerConfusionStumbleIntoAWallStillSpendsTheTurn", + "gameMovePlayerWithoutConfusionNeverStumbles", + "gameAllyActsConfusedReturnsFalseImmediatelyWithoutTheStatus", + "lightAndDark", + "identification", "identifyGivesEveryPotionTypeItsOwnDistinctUnidentifiedLook", "effects", + "effectsMessagesAddressThePlayerInSecondPersonNotThirdPersonSingular", + "effectsClarityMessageAddressesThePlayerPossessively", + "effectsCureMessagesAddressThePlayerPossessivelyForAllFourOutcomes", "hazards", + "shrinePrayGrantsWarBlessingWhenFavorHolds", "shrinePrayGrantsVitalityBlessing", + "shrinePrayGrantsWisdomBlessing", "shrinePrayGrantsFortuneBlessingAndCleansesAilments", + "shrinePrayCanCurseInsteadOfBless", "shrinePrayFailsWithoutEnoughGold", + "shrineCostAndCurseOddsRiseWithUse", "shrineFieldsSurviveSerialization", + "builderOccasionallyPlacesAShrineFromDepthFour", "shrinesStayOffTheShallowFloors", + "autopilotPraysAtAnUnspentShrineWhenAffordable", "autopilotSkipsAnAlreadyUsedShrine", + "shrineRendersItsGlyphWhenVisible", + "messageLog", "weaponAffixOnHit", + "progressionLeveling", "progressionMonsterKillGrantsXp", + "spellCastMissileKillsAndGrantsXp", "spellCastFailsWithoutSpendingState", + "spellLearnFromTome", "spellHealAndShield", "spellBlinkMovesWithinRadius", + "manaRegeneratesEachTurn", + "throwWeaponHitsAndLands", "throwWeaponKillGrantsXp", "throwPotionAppliesHostileEffect", + "throwConfusePotionAppliesTheStatusToTheTargetNotTheThrower", + "throwBlindPotionAppliesTheStatusToTheTargetNotTheThrower", + "throwLevitatePotionAppliesTheStatusToTheTargetNotTheThrower", + "throwOutOfRangeFails", + "rangedShotHitsAtRangeAndConsumesAmmo", "rangedShotKillGrantsXp", "rangedFailsWithoutAmmo", + "rangedFailsOutOfRange", "ammoStacksOnPickup", + "trollRegenerateUnlessBurning", "ratHasNoRegen", "wretchDeathBurstsPoisonSpores", + "dragonBreathIgnitesPlayer", + "necromancerSummonsZombie", "summonRespectsPopulationCap", + "curseAtRangeHurtsAndWeakens", "curseDamageIsMitigatedByThePlayersDefenseLikeAnyOtherAttack", + "curseBreaksThePlayersMeleeMomentumStack", "curseWearsThePlayersEquippedArmor", + "curseWithheldWhenAdjacent", "abilityCooldownBlocksImmediateReuse", + "shriekAtRangeBlindsThePlayer", "shriekWithheldWhenAdjacent", "shriekIsUnavailableOutOfRange", + "shriekBlindnessReducesTheVictimsEffectiveSightRadius", + "healerMendsNeediestAlly", "healerSkipsWhenAlliesAreHealthy", + "healerNeverMendsThePlayersOwnCompanionHirelingOrThrall", + "rallyBuffsAdjacentAllies", "rallySkipsWhenNoUnbuffedAlliesAdjacent", + "rallyNeverBuffsThePlayersOwnCompanionHirelingOrThrall", + "footpadStealsThenFlees", "footpadWithNothingToStealStillFlees", + "slimeSplitsOnSurvivedHit", "splitCapsAtTwoGenerations", + "takeMonsterTurnPrefersAbilityOverMovement", "takeMonsterTurnFallsBackToAiWhenOnCooldown", + "abilityFieldsSurviveSerialization", + "statusEffectKillGrantsXpAndLogsDeath", + "hazardKillDuringMonsterTurnGrantsXp", "hazardStepRunsOncePerPlayerRound", + "saveLoadRoundTrip", "deterministicPlaythrough", "autoplayDescends", + "amuletSpawnsOnFinalFloorOnly", "descendIsBlockedAtTheFinalFloor", + "ascendWithoutAmuletDoesNotWin", "ascendWithAmuletWinsTheGame", "wonGameHaltsTheAutopilot", + "autopilotFetchesTheAmuletAndWins", + "shopPriceCatalogScalesWithPower", "shopStockRollsAffordableWares", + "goldPickupAddsToWalletNotInventory", + "affordableWareIsBoughtAutomaticallyOnPickup", "unaffordableWareStaysOnTheGround", + "deadKeeperMakesWaresFreeToLoot", "stealingFromShopTurnsTheKeeperHostile", + "hostileShopkeeperChasesLikeAnyMonster", "passiveShopkeeperIgnoresTheAdjacentPlayer", + "sellItemGrantsHalfPriceAndRemovesIt", "builderOccasionallySeedsAShopWithMatchingWares", + "shopAndLooseGoldStayOffTheShallowFloors", + "classApplyGrantsFighterStatBonuses", "classApplyGrantsRogueGoldAndAttack", + "classApplyGrantsMageManaAndAttack", "classApplyGrantsRangerBowAndAmmo", "invalidClassIsIgnored", + "skillLearnRespectsClassLevelAndPoints", "skillCooldownBlocksImmediateReuseAndTicksDown", + "fighterCleaveHitsPrimaryAndAdjacentMonsters", + "fighterCleaveSplashRespectsAFireImmuneTargetLikeThePrimaryHitAlreadyDoes", + "fighterSecondWindRestoresPortionOfMaxHp", + "fighterBerserkBoostsAttackAtLowHp", "rogueBackstabDoublesDamageOnFullHpTarget", + "rogueEvasionCanFullyNegateMeleeHit", "poisonBladeAppliesPoisonOnNextMeleeHitOnly", + "pendingPoisonBladeReadinessSurvivesAGameSaveLoadRoundTrip", + "mageOverloadBoostsMissileDamage", "mageMeditateRestoresManaWithinCap", + "mageManaShieldRaisesDefenseWhileManaHeld", "rangerMultishotHitsTwoTargetsForOneArrow", + "rangerMultishotRespectsPhysicalResistanceOnBothSplitArrows", + "rangerCamouflageShrinksDetectionOnDarkFloors", "rangerTrueshotAddsFlatRangedDamage", + "effectiveRadiusBlindStatusOverridesLightAndWeatherToAMinimumOfOne", + "canSeePlayerBlindedMonsterOnlyDetectsThePlayerAtMeleeRange", + "autopilotLearnsSkillsAutomaticallyAsPointsAllow", "skillFieldsSurviveSerialization", + "craftingForgeSpendsEssenceForATierOneGem", "craftingMergeGemsCombinesMatchingPairsIntoTheNextTier", + "craftingSocketAddsPowerAndSwapsRiderOnResocket", "craftingTemperRaisesPowerAtRisingCostUpToACap", + "craftingTemperRefusesWithoutEnoughEssence", "craftingEnchantGrantsAChosenAffixOnce", + "craftingDisenchantStripsAffixAndRefundsEssence", "craftingSocketedGemRidersStackWithARolledAffixOnHit", + "craftingShockRiderActuallyStunsTheVictimOnItsNextTurnNotJustOnPaper", + "gameCraftingWrappersDriveTheFullPipeline", "monsterKillsGrantEssenceScaledToTheirXpReward", + "craftingFieldsSurviveSerialization", + "alchemyBrewResolvesAKnownPairToItsFixedPotion", "alchemyBrewIsOrderIndependent", + "alchemyBrewCurdlesOnAnOpposedPairing", "alchemyLookupRejectsAnUnknownHerb", + "gameBrewAtCombinesTwoHerbsIntoAPotionAtACauldron", "gameBrewAtFailsWithoutACauldronUnderfoot", + "gameBrewAtRequiresTwoHerbItems", "gameBrewAtCurdlesIntoGasInsteadOfAPotion", + "buildersScatterHerbsFromTheFirstFloor", "cauldronsStayOffTheEntranceFloor", + "buildersOccasionallyPlaceACauldronFromDepthTwo", "cauldronFieldsSurviveSerialization", + "cauldronRendersItsGlyphWhenVisible", + "nodesHarvestingAnOreVeinPaysEssenceAndSpendsACharge", + "nodesHarvestingAnOreVeinDoublesItsYieldDuringRichVeins", + "nodesHarvestingAGemSeamYieldsARawTierOneGemOfItsElement", + "nodesGoingFallowRefusesFurtherHarvestsUntilItReopens", + "nodesStepCountsDownAndReopensAFallowNode", "nodesFieldsSurviveSerialization", + "nodeRendersItsGlyphWhenVisible", + "gameHarvestNodeAtAnOreVeinAddsEssenceAndSpendsACharge", + "gameHarvestNodeFailsWithoutANodeUnderfoot", "gameHarvestNodeOnAFallowVeinFails", + "autopilotHarvestsAnOreVeinWhenIdleAndStandingOnIt", "autopilotSkipsAFallowNode", + "buildersNeverPlaceANodeOnTheEntranceFloor", "buildersAlwaysPlaceAtLeastOneNodeFromDepthTwoOn", + "corpsesSpawnsForAWildMonsterButNotForUndeadMimicOrBoss", + "corpsesNutritionScalesWithTheFelledSpeciesMaxHpClampedToAFixedBand", + "corpsesStepCountsDownAndRotsAwayEntirely", + "corpsesGoesRottenPastItsThresholdButStaysButcherableUntilThen", + "corpsesButcheringFreshMeatAddsFoodToInventoryAndConsumesTheCorpse", + "corpsesButcheringRottenMeatPoisonsThePlayerInsteadAndStillConsumesTheCorpse", + "corpseFieldsSurviveSerialization", "corpseRendersItsGlyphWhenVisible", + "gameAwardKillLeavesACorpseForAWildMonsterButNotForUndeadOrMimic", + "gameButcherCorpseAtFreshMeatFeedsThePlayerAndClearsTheCorpse", + "gameButcherCorpseFailsWithoutACorpseUnderfoot", + "autopilotButchersAFreshCorpseWhenIdleAndStandingOnIt", + "autopilotLeavesARottenCorpseAloneRatherThanRiskingPoison", + "hungerCurrentDefaultsToCapForAFreshEntity", + "hungerTierOfClassifiesEachBandAtItsBoundaries", + "hungerAttackAndDefensePenaltiesEscalateByTier", + "entityEffectiveAttackAndDefenseFoldInTheHungerPenalty", + "hungerSuppressesRegenOnlyAtWeakOrWorse", + "hungerTickDrainsByOneAndLogsOnlyOnATierCrossing", + "hungerTickBitesForOneHpEveryRoundWhileStarving", + "hungerEatCapsAtTheCeilingAndWastesAnOverfullMealIntoBloat", + "hungerEatBelowTheCeilingBanksNutritionWithNoWaste", + "hungerEatClampsAMealThatWouldOverflowPastTheCapWithoutBloating", + "gameHungerTorchTickSuppressesRingRegenOnceThePlayerIsWeak", + "gameUseItemEatingFoodRestoresSatiationAndLogsTheMeal", + "gameUseItemEatingFoodWhileAlreadyFullAppliesSlowAndLogsBloat", + "reanimationRaiseCreatesAThrallAdjacentToThePlayerAndSpendsTheCorpseAndSanity", + "reanimationRaiseRefusesARottenCorpseWithoutSpendingAnything", + "reanimationRaiseRefusesWithoutEnoughSanityAndLeavesTheCorpseAlone", + "reanimationRaiseScalesThrallStatsDownFromTheOriginSpecies", + "reanimationRaiseFallsBackToAPlainSkeletonForAnUnrecognisedSpecies", + "reanimationRaiseRetiresAnEarlierThrallWhenRaisingAnother", + "reanimationActAttacksAnAdjacentHostileMonsterAndCanKillIt", + "reanimationActAdvancesOnAVisibleMonsterItCannotYetReach", + "reanimationActIgnoresAMonsterBeyondItsSightRadius", + "reanimationActBlindedThrallOnlyDetectsAnAdjacentHostileNotOneWithinItsSightRadius", + "reanimationActAttackingAnAdjacentMonsterEmitsNoiseThatCanStirADormantBystander", + "reanimationActFollowsThePlayerWhenNoMonsterIsVisible", + "reanimationActConfusedThrallSometimesStumblesInsteadOfFightingAnAdjacentHostile", + "reanimationActCollapsesOnceItsBorrowedAnimationRunsOut", + "takeMonsterTurnRoutesAThrallThroughReanimationAct", + "gameRaiseCorpseSucceedsAndLogsTheCallAnswered", + "gameRaiseCorpseFailsWithoutACorpseUnderfoot", + "scavengingHerbForMapsEachWildFactionToItsOwnFixedHerb", + "scavengingHerbForReturnsNilForACorpseWithNoBestiaryEntry", + "gameScavengeCorpseCarvesTheMatchingHerbAndClearsTheCorpse", + "gameScavengeCorpseFailsWithoutACorpseUnderfoot", + "gameScavengeCorpseFailsOnARottenCorpse", } for _, name in ipairs(order) do