packages feed

euler-tour-tree-0.1.0.0: test/PropertyTests.hs

import           Data.EulerTourTree

import           Data.Foldable
import           Data.Key
import           Data.Monoid
import           Data.Sequence         hiding (empty)
import           Data.Tree
import           Test.QuickCheck.Gen
import           Test.Tasty
import           Test.Tasty.QuickCheck


-- Unsafe version of fromTree
fromTree' :: Ord node => Tree node -> EulerTourTree node
fromTree' tree = let Just a = fromTree tree in a


main :: IO ()
main = defaultMain $ testGroup "Property tests"
  [ fromToTree
  , spliceEmpty
  ]

fromToTree :: TestTree
fromToTree = testProperty "toTree . fromTree == id" $ do
  tree <- genTree
  let intermediate = fromTree tree
      result = toTree =<< intermediate
  return $ counterexample (show tree <> "\n" <> show intermediate <> "\n" <> show result) $
    Just tree == result

spliceEmpty :: TestTree
spliceEmpty = testProperty "splice empty == id" $ do
  tree <- fromTree' <$> genTree
  node <- genElement tree
  let result = splice empty node tree
  return $ counterexample (show tree <> "\n" <> show node <> "\n" <> show result) $ Just tree == result


genElement :: Foldable f => f a -> Gen a
genElement = elements . toList

genTree :: Gen (Tree (Seq Int))
genTree = genTreeDepth =<< elements [1..1]

genTreeDepth :: Int -> Gen (Tree (Seq Int))
genTreeDepth n = mapWithKey (\key _ -> key) <$> genTreeDepth' n

genTreeDepth' :: Int -> Gen (Tree ())
genTreeDepth' 0 = return $ Node () []
genTreeDepth' n = Node () <$> vectorOf 5 (genTreeDepth' $ n-1)