packages feed

sequence-formats-1.6.6.0: test/SequenceFormats/BedSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module SequenceFormats.BedSpec (spec) where

import Control.Foldl (purely, list)
import Pipes (each)
import qualified Pipes.Prelude as P
import Pipes.Safe (runSafeT)
import SequenceFormats.Bed (BedEntry(..), readBedFile)
import SequenceFormats.Genomic (filterThroughBed)
import SequenceFormats.Eigenstrat (EigenstratSnpEntry(EigenstratSnpEntry))
import SequenceFormats.Utils (Chrom(..))
import Test.Hspec

spec :: Spec
spec = do
    testReadBed
    testFilterThroughBed

mockDatBed :: [BedEntry]
mockDatBed = [
    BedEntry (Chrom "11") 0 100,
    BedEntry (Chrom "11") 200 300,
    BedEntry (Chrom "11") 400 500]
    
testReadBed :: Spec
testReadBed = describe "readBed" $ do
    it "should read the correct eigenstrat file" $ do
        bedEntries <- runSafeT $ purely P.fold list (readBedFile "testDat/example.bed")
        bedEntries `shouldBe` mockDatBed 

mockDatEigenstratSnp :: [EigenstratSnpEntry]
mockDatEigenstratSnp = [
    EigenstratSnpEntry (Chrom "1") 0   0.000000 "rs0000" 'A' 'C',
    EigenstratSnpEntry (Chrom "11") 10  0.001000 "rs1111" 'A' 'G',
    EigenstratSnpEntry (Chrom "11") 100 0.002000 "rs2222" 'A' 'T',
    EigenstratSnpEntry (Chrom "11") 110 0.003000 "rs3333" 'C' 'A',
    EigenstratSnpEntry (Chrom "11") 210 0.004000 "rs4444" 'G' 'A',
    EigenstratSnpEntry (Chrom "11") 310 0.005000 "rs5555" 'T' 'A',
    EigenstratSnpEntry (Chrom "14") 400 0.006000 "rs6666" 'G' 'T']

mockFiltered :: [EigenstratSnpEntry]
mockFiltered = [
    EigenstratSnpEntry (Chrom "11") 10  0.001000 "rs1111" 'A' 'G',
    EigenstratSnpEntry (Chrom "11") 100 0.002000 "rs2222" 'A' 'T',
    EigenstratSnpEntry (Chrom "11") 210 0.004000 "rs4444" 'G' 'A']

testFilterThroughBed :: Spec
testFilterThroughBed = describe "filterThroughBed" $ do
    it "should filter correctly" $ do
        let bedProd = readBedFile "testDat/example.bed"
        let eigenstratProd = each mockDatEigenstratSnp
        filtered <- runSafeT $ purely P.fold list (filterThroughBed bedProd eigenstratProd)
        filtered `shouldBe` mockFiltered