elynx-tree-0.2.1: test/ELynx/Data/Tree/BipartitionSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{- |
Module : ELynx.Data.Tree.BipartitionSpec
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.BipartitionSpec
( spec
)
where
import qualified Data.ByteString.Lazy as L
import qualified Data.Map as M
import Data.Monoid
import qualified Data.Set as S
import Data.Tree
import Test.Hspec
import ELynx.Data.Tree
import ELynx.Import.Tree.Newick
import ELynx.Tools
sfrom :: [L.ByteString] -> S.Set L.ByteString
sfrom = S.fromList
treeFileSimple :: FilePath
treeFileSimple = "data/TreeDist.trees"
getSimpleTrees :: IO [Tree (PhyloLabel L.ByteString)]
getSimpleTrees = parseFileWith (manyNewick Standard) treeFileSimple
bipartitionToBranchAnswer :: M.Map (Bipartition L.ByteString) (Sum Double)
bipartitionToBranchAnswer = M.fromList
[ (bp (sfrom ["B"]) (sfrom ["A", "C", "D", "E"]), Sum { getSum = 0.3 })
, (bp (sfrom ["B", "C", "D", "E"]) (sfrom ["A"]), Sum { getSum = 0.1 })
, (bp (sfrom ["B", "C", "E"]) (sfrom ["A", "D"]), Sum { getSum = 5.0e-2 })
, (bp (sfrom ["B", "E"]) (sfrom ["A", "C", "D"]), Sum { getSum = 0.4 })
, (bp (sfrom ["C"]) (sfrom ["A", "B", "D", "E"]), Sum { getSum = 1.0e-2 })
, (bp (sfrom ["D"]) (sfrom ["A", "B", "C", "E"]), Sum { getSum = 0.25 })
, (bp (sfrom ["E"]) (sfrom ["A", "B", "C", "D"]), Sum { getSum = 0.8 })
]
bipartitionsFirstTree :: S.Set (Bipartition L.ByteString)
bipartitionsFirstTree = S.fromList
[ bp (sfrom ["B"]) (sfrom ["A", "C", "D", "E"])
, bp (sfrom ["B", "C", "D", "E"]) (sfrom ["A"])
, bp (sfrom ["B", "D", "E"]) (sfrom ["A", "C"])
, bp (sfrom ["B", "E"]) (sfrom ["A", "C", "D"])
, bp (sfrom ["C"]) (sfrom ["A", "B", "D", "E"])
, bp (sfrom ["D"]) (sfrom ["A", "B", "C", "E"])
, bp (sfrom ["E"]) (sfrom ["A", "B", "C", "D"])
]
bipartitionsSecondTree :: S.Set (Bipartition L.ByteString)
bipartitionsSecondTree = S.fromList
[ bp (sfrom ["B"]) (sfrom ["A", "C", "D", "E"])
, bp (sfrom ["B", "C", "D", "E"]) (sfrom ["A"])
, bp (sfrom ["B", "C", "E"]) (sfrom ["A", "D"])
, bp (sfrom ["B", "E"]) (sfrom ["A", "C", "D"])
, bp (sfrom ["C"]) (sfrom ["A", "B", "D", "E"])
, bp (sfrom ["D"]) (sfrom ["A", "B", "C", "E"])
, bp (sfrom ["E"]) (sfrom ["A", "B", "C", "D"])
]
spec :: Spec
spec = do
describe "bipartitions"
$ it "calculates correct bipartitions for sample trees"
$ do
simpleTrees <- map removeBrInfo <$> getSimpleTrees
let t1 = head simpleTrees
t2 = simpleTrees !! 1
bipartitions t1 `shouldBe` bipartitionsFirstTree
bipartitions t2 `shouldBe` bipartitionsSecondTree
describe "bipartitionToBranch"
$ it "creates a map from bipartitions to branch lengths"
$ do
simpleTrees <- getSimpleTrees
bipartitionToBranchLength label (Sum . getLen) (simpleTrees !! 2)
`shouldBe` bipartitionToBranchAnswer