module Test.Data.TicTacToe.Board
(
  main
, boardTests
) where


import Prelude hiding (all, any)
import Data.TicTacToe.Board
import Data.TicTacToe.Position
import Data.Foldable
import Test.Data.TicTacToe.Position()
import Test.QuickCheck
import Test.Framework
import Test.Framework.Providers.QuickCheck2 (testProperty)

instance Arbitrary Board where
  arbitrary =
    do p <- arbitrary
       q <- resize 12 arbitrary
       return $ Prelude.foldr (\p b -> keepPlayingOr b id (p --> b)) (p --> empty) q


main ::
  IO ()
main =
  defaultMain boardTests

boardTests ::
  [Test]
boardTests =
  [
    testGroup "Board"
      [
        testProperty "whoseTurn"       prop_whoseTurn
      , testProperty "move_whoseTurn"  prop_move_whoseTurn
      , testProperty "move_moveBack"   prop_move_takeBack
      ]
  ]

prop_whoseTurn ::
  Board
  -> Bool
prop_whoseTurn b =
  whoseTurn b /= whoseNotTurn b

prop_move_whoseTurn ::
  Board
  -> Position
  -> Bool
prop_move_whoseTurn b p =
  (\b' -> whoseTurn b /= whoseTurn b') `all` keepPlaying (p --> b)

prop_move_takeBack ::
  Board
  -> Position
  -> Bool
prop_move_takeBack b p =
  foldMoveResult True (foldTakenBack False (==b) . takeBack) (\fb -> takeBack fb == b) (p --> b)