sequence-formats-1.5.0: test/SequenceFormats/PlinkSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module SequenceFormats.PlinkSpec (spec) where
import SequenceFormats.Eigenstrat (EigenstratIndEntry (..),
EigenstratSnpEntry (..), Sex (..), GenoLine, GenoEntry(..))
import SequenceFormats.Plink (readBimFile, readFamFile, readPlinkBedFile)
import SequenceFormats.Utils (Chrom (..))
import Control.Foldl (list, purely)
import Data.Vector (fromList)
import qualified Pipes.Prelude as P
import Pipes.Safe (runSafeT)
import Test.Hspec
spec :: Spec
spec = do
testReadBimFile
testReadFamFile
testReadBedFile
mockDatEigenstratSnp :: [EigenstratSnpEntry]
mockDatEigenstratSnp = [
EigenstratSnpEntry (Chrom "11") 0 0.000000 "rs0000" 'A' 'C',
EigenstratSnpEntry (Chrom "11") 100000 0.001000 "rs1111" 'A' 'G',
EigenstratSnpEntry (Chrom "11") 200000 0.002000 "rs2222" 'A' 'T',
EigenstratSnpEntry (Chrom "11") 300000 0.003000 "rs3333" 'C' 'A',
EigenstratSnpEntry (Chrom "11") 400000 0.004000 "rs4444" 'G' 'A',
EigenstratSnpEntry (Chrom "11") 500000 0.005000 "rs5555" 'T' 'A',
EigenstratSnpEntry (Chrom "11") 600000 0.006000 "rs6666" 'G' 'T']
mockDatEigenstratInd :: [EigenstratIndEntry]
mockDatEigenstratInd = [
EigenstratIndEntry "SAMPLE0" Female "1",
EigenstratIndEntry "SAMPLE1" Male "2",
EigenstratIndEntry "SAMPLE2" Female "3",
EigenstratIndEntry "SAMPLE3" Male "4",
EigenstratIndEntry "SAMPLE4" Female "5"]
mockDatPlinkBed :: [GenoLine]
mockDatPlinkBed = [
fromList [Het, Het, Het, HomAlt, HomAlt],
fromList [HomAlt, Het, HomRef, Het, HomRef],
fromList [HomRef, Het, Het, HomAlt, Het],
fromList [HomAlt, HomAlt, Het, HomRef, HomRef],
fromList [HomRef, Het, Het, HomAlt, HomAlt],
fromList [HomAlt, HomAlt, Het, Het, Het],
fromList [HomRef, HomRef, Het, Het, HomAlt]]
testReadBimFile :: Spec
testReadBimFile = describe "readBimFile" $
it "should read a BIM file correctly" $ do
let esSnpProd = readBimFile "testDat/example.bim"
(runSafeT $ purely P.fold list esSnpProd) `shouldReturn` mockDatEigenstratSnp
testReadFamFile :: Spec
testReadFamFile = describe "readFamFile" $
it "should read a FAM file correctly" $ do
readFamFile "testDat/example.fam" `shouldReturn` mockDatEigenstratInd
testReadBedFile :: Spec
testReadBedFile = describe "readBedFile" $
it "should read genotypes correctly" $ do
let fn = "testDat/example.plink.bed"
bedDat <- runSafeT $ do
bedProd <- readPlinkBedFile fn 5
purely P.fold list bedProd
bedDat `shouldBe` mockDatPlinkBed