packages feed

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

{-# LANGUAGE OverloadedStrings #-}

{- |
Module      :  ELynx.Data.Tree.MultipartitionSpec
Copyright   :  (c) Dominik Schrempf 2019
License     :  GPL-3

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.BranchSupportTree
import           ELynx.Data.Tree.MeasurableTree
import           ELynx.Data.Tree.Multipartition       (Multipartition, mp,
                                                       multipartitions)
import           ELynx.Data.Tree.NamedTree
import           ELynx.Data.Tree.PhyloTree
import           ELynx.Data.Tree.Subset               (sfromlist)

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 [sfromlist [1], sfromlist [3], sfromlist [4,5,6]]
                , mp [sfromlist [1,3], sfromlist [4], sfromlist [5], sfromlist [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 [sfromlist [1], sfromlist [2], sfromlist [3,4], sfromlist [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)