packages feed

LambdaHack-0.11.0.0: test/ItemRevUnitTests.hs

module ItemRevUnitTests (itemRevUnitTests) where

import Prelude ()

import Game.LambdaHack.Core.Prelude

import qualified Control.Monad.Trans.State.Strict as St
import qualified Data.EnumMap.Strict as EM
import qualified Data.EnumSet as ES
import qualified Data.Vector.Unboxed as U
import qualified System.Random.SplitMix32 as SM
import           Test.Tasty
import           Test.Tasty.HUnit

import           Game.LambdaHack.Content.ItemKind
import           Game.LambdaHack.Core.Dice
import           Game.LambdaHack.Core.Random
import qualified Game.LambdaHack.Definition.Ability as Ability
import           Game.LambdaHack.Definition.Color
import           Game.LambdaHack.Definition.DefsInternal
import           Game.LambdaHack.Definition.Flavour
import           Game.LambdaHack.Server.ItemRev

itemRevUnitTests :: TestTree
itemRevUnitTests = testGroup "itemRevUnitTests" $
  let testItemKind = ItemKind
        { isymbol  = 'x'
        , iname    = "12345678901234567890123"
        , ifreq    = [ (UNREPORTED_INVENTORY, 1) ]
        , iflavour = zipStory [Black]
        , icount   = 1 + 1 `d` 2
        , irarity  = [(1, 50), (10, 1)]
        , iverbHit = "hit"
        , iweight  = 300
        , idamage  = 1 `d` 1
        , iaspects = [ AddSkill Ability.SkHurtMelee $ -16 * 5
                     , SetFlag Ability.Fragile
                     , toVelocity 70 ]
        , ieffects = []
        , idesc    = "A really cool test item."
        , ikit     = []
        }
      testItemKind2Flavours = testItemKind
        { iflavour = zipStory [Black,Green] }
      emptyIdToFlavourSymbolToFlavourSetPair = ( EM.empty, EM.empty )
      singletonIdToFlavourSymbolToFlavourSetPair =
        ( EM.singleton (toContentId 0) dummyFlavour
        , EM.singleton 'x' (ES.singleton dummyFlavour) )
      flavourBlack = head $ zipStory [Black]
      flavourGreen = head $ zipStory [Green]
  in
  [ testCase "empty & default initializers -> first is single dummy result" $
      let rndMapPair0 = return emptyIdToFlavourSymbolToFlavourSetPair
          mapPair1 = St.evalState (rollFlavourMap U.empty rndMapPair0 (toContentId 0) testItemKind) $ SM.mkSMGen 1
        in fst mapPair1 @?= EM.singleton (toContentId 0) dummyFlavour
  , testCase "empty & default initializers -> second is empty" $
      let rndMapPair0 = return emptyIdToFlavourSymbolToFlavourSetPair
          (mapPair1, _) = St.runState (rollFlavourMap U.empty rndMapPair0 (toContentId 0) testItemKind) $ SM.mkSMGen 1
        in snd mapPair1 @?= EM.empty
  , testCase "singleton initializers -> first is single dummy result" $
      let rndMapPair0 = return singletonIdToFlavourSymbolToFlavourSetPair
          (mapPair1, _) = St.runState (rollFlavourMap U.empty rndMapPair0 (toContentId 0) testItemKind) $ SM.mkSMGen 1
        in fst mapPair1 @?= EM.singleton (toContentId 0) dummyFlavour
  , testCase "singleton initializers -> second is single dummy result" $
      let rndMapPair0 = return singletonIdToFlavourSymbolToFlavourSetPair
          (mapPair1, _) = St.runState (rollFlavourMap U.empty rndMapPair0 (toContentId 0) testItemKind) $ SM.mkSMGen 1
        in snd mapPair1 @?= EM.singleton 'x' (ES.singleton dummyFlavour)
  , testCase "rollFlavourMap on two flavours -> first flavour can be rolled" $  -- relies on us not messing with RNG
      let rndMapPair0 = return singletonIdToFlavourSymbolToFlavourSetPair
          (mapPair1, _) = St.runState (rollFlavourMap (U.singleton invalidInformationCode) rndMapPair0 (toContentId 0) testItemKind2Flavours) $ SM.mkSMGen 1
        in fst mapPair1 @?= EM.singleton (toContentId 0) flavourBlack
  , testCase "rollFlavourMap on two flavours -> second flavour can be rolled" $  -- relies on us not messing with RNG
      let rndMapPair0 = return singletonIdToFlavourSymbolToFlavourSetPair
          (mapPair1, _) = St.runState (rollFlavourMap (U.singleton invalidInformationCode) rndMapPair0 (toContentId 0) testItemKind2Flavours) $ SM.mkSMGen 2
        in fst mapPair1 @?= EM.singleton (toContentId 0) flavourGreen
  ]