packages feed

elynx-tree-0.2.1: test/ELynx/Data/Tree/MultipartitionSpec.hs

{-# LANGUAGE OverloadedStrings #-}

{- |
Module      :  ELynx.Data.Tree.MultipartitionSpec
Copyright   :  (c) Dominik Schrempf 2020
License     :  GPL-3.0-or-later

Maintainer  :  dominik.schrempf@gmail.com
Stability   :  unstable
Portability :  portable

Creation date: Fri Aug 30 09:38:50 2019.

-}

module ELynx.Data.Tree.MultipartitionSpec
  ( spec
  )
where

import           Data.Set                       ( Set
                                                , empty
                                                , fromList
                                                )
import           Data.Tree
import           Test.Hspec
import           Test.QuickCheck
import           Test.QuickCheck.Instances.Containers
                                                ( )

import           ELynx.Data.Tree
import           ELynx.Data.Tree.PhyloTreeArbitraryInstance
                                                ( )

ex1 :: Tree Int
ex1 = Node 0 [Node 1 [], Node 2 [Node 4 [], Node 5 [], Node 6 []], Node 3 []]

sol1 :: Set (Multipartition Int)
sol1 = fromList
  [ mp [fromList [1], fromList [3], fromList [4, 5, 6]]
  , mp [fromList [1, 3], fromList [4], fromList [5], fromList [6]]
  ]

ex2 :: Tree Int
ex2 = Node 0 [Node 1 [], Node 2 [], Node 0 [Node 3 [], Node 4 []], Node 5 []]

sol2 :: Set (Multipartition Int)
sol2 =
  fromList [mp [fromList [1], fromList [2], fromList [3, 4], fromList [5]]]

prop_bifurcating_tree
  :: (Ord a, Measurable a, Named a, BranchSupported a) => Tree a -> Bool
prop_bifurcating_tree t = multipartitions (removeMultifurcations t) == empty

spec :: Spec
spec = describe "multipartitions" $ do
  it "calculates correct multipartitions for a sample tree" $ do
    -- t <- removeBrInfo <$> getMultifurcatingTree
    -- print $ multipartitions ex1
    multipartitions ex1 `shouldBe` sol1
    multipartitions ex2 `shouldBe` sol2
  it "is empty for a collection of random bifurcating trees"
    $ property (prop_bifurcating_tree :: Tree (PhyloLabel Double) -> Bool)