packages feed

dovin-0.2: test/Move.hs

module Move where

import TestPrelude

test_Move = testGroup "move/moveTo"
  [ prove "moves card from one location to another" $ do
      withLocation (Active, Hand) $ addLand "Forest"
      move (Active, Hand) (Active, Exile) "Forest"

      validate "Forest" $ matchLocation (Active, Exile)
  , prove "exiles jumpstart'ed cards" $ do
      withLocation (Active, Stack) $ addInstant "Chemister's Insight"
      gainAttribute exileWhenLeaveStack "Chemister's Insight"

      move (Active, Stack) (Active, Graveyard) "Chemister's Insight"

      validate "Chemister's Insight" $
           matchLocation (Active, Exile)
        <> missingAttribute exileWhenLeaveStack
  , prove "adds summoned attribute when moving to play" $ do
      withLocation (Active, Hand) $ addLand "Forest"
      move (Active, Hand) (Active, Play) "Forest"

      validate "Forest" $ matchAttribute summoned
  , prove "removes gained attribute when leaving play" $ do
      withLocation (Active, Play) $ addLand "Forest"

      gainAttribute "bogus" "Forest"

      move (Active, Play) (Active, Hand) "Forest"

      validate "Forest" $ missingAttribute "bogus"
  , prove "adds +1/+1 to when undying" $ do
      withLocation (Active, Play)
        $ withAttribute undying
        $ addCreature (1, 1) "Zombie"

      moveTo Graveyard "Zombie"

      validate "Zombie" $
        matchLocation (Active, Play) <> matchPlusOneCounters 1
  , prove "moves to graveyard when undying and has +1/+1 counters" $ do
      withLocation (Active, Play)
        $ withAttribute undying
        $ withPlusOneCounters 3
        $ addCreature (1, 1) "Zombie"

      moveTo Graveyard "Zombie"

      validate "Zombie" $
        matchLocation (Active, Graveyard) <> matchPlusOneCounters 0
  , prove "removes damage when leaving play" $ do
      withLocation (Active, Play) $ addCreature (1, 1) "Zombie"
      modifyCardDeprecated "Zombie" cardDamage (const 1)

      moveTo Graveyard "Zombie"

      validate "Zombie" $ matchDamage 0
  , prove "moves card to graveyard of same owner" $ do
      withLocation (Opponent, Hand) $ addLand "Forest"
      moveTo Graveyard "Forest"
      validate "Forest" $ matchLocation (Opponent, Graveyard)
  , prove "can change controller of token" $ do
      withLocation (Active, Play)
        $ withAttribute token
        $ addArtifact "Treasure"

      move (Active, Play) (Opponent, Play) "Treasure"
      validate "Treasure" $ matchLocation (Opponent, Play)
  , refute
      "cannot move to stack"
      "cannot move directly to stack" $ do
        withLocation (Active, Hand) $ addInstant "Shock"

        move (Active, Hand) (Active, Stack) "Shock"
  , refute
      "requires card exists"
      "Card does not exist: Forest" $ do
        move (Active, Hand) (Active, Exile) "Forest"
  , refute
      "cannot move to same location"
      "cannot move to same location" $ do
        withLocation (Active, Hand) $ addInstant "Shock"

        move (Active, Hand) (Active, Hand) "Shock"
  , refute
      "cannot move token from non-play location"
      "cannot move token from non-play location" $ do
        withLocation (Active, Graveyard)
          $ withAttribute token
          $ addArtifact "Treasure"

        move (Active, Graveyard) (Active, Play) "Treasure"
  , refute
      "cannot move copy from non-stack location"
      "cannot move copy from non-stack location" $ do
        withLocation (Active, Hand) $ addInstant "Shock"

        cast "" "Shock"
        copySpell "Shock 1" "Shock" >> resolveTop

        move (Active, Graveyard) (Active, Play) "Shock 1"
  ]