packages feed

cobot-io-0.1.4.2: test/RangeSpec.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}

module RangeSpec where

import Bio.Sequence (Range (..), extendLeft, extendRight, mapRange, overlap, preciseSpan,
                     shiftRange)
import Test.Hspec


rangeSpec :: Spec
rangeSpec = do
    rangeOverlapTests
    rangeShiftTests
    rangeMapTests
    rangeExtendTests

rangeOverlapTests :: Spec
rangeOverlapTests = describe "Range overlap tests" $ do
    it "Point-Point, should not overlap" $ 
        overlap (Point 42) (Point 24) `shouldBe` False
    it "Point-Point, should overlap" $ 
        overlap (Point 42) (Point 42) `shouldBe` True

    it "Point-Span, should not overlap" $ 
        overlap (Point 42) (preciseSpan (14, 24)) `shouldBe` False
    it "Point-Span, should overlap" $ 
        overlap (Point 42) (preciseSpan (14, 42)) `shouldBe` True
    it "Point-Span, should overlap" $ 
        overlap (Point 42) (preciseSpan (14, 43)) `shouldBe` True
    it "Point-Span, should overlap" $ 
        overlap (Point 42) (preciseSpan (42, 50)) `shouldBe` True
    it "Span-Point, should not overlap" $ 
        overlap (preciseSpan (14, 24)) (Point 42) `shouldBe` False
    it "Span-Point, should overlap" $ 
        overlap (preciseSpan (14, 42)) (Point 42) `shouldBe` True
    it "Span-Point, should overlap" $ 
        overlap (preciseSpan (14, 43)) (Point 42) `shouldBe` True
    it "Span-Point, should overlap" $ 
        overlap (preciseSpan (42, 50)) (Point 42) `shouldBe` True

    it "Point-Between, should not overlap" $ 
        overlap (Point 42) (Between 42 43) `shouldBe` False
    it "Between-Point, should not overlap" $ 
        overlap (Between 23 24) (Point 24) `shouldBe` False

    it "Point-Join, should not overlap" $ 
        overlap (Point 42) (Join [Point 24, preciseSpan (29, 41), Between 42 43, preciseSpan (77, 99)]) `shouldBe` False
    it "Point-join, should overlap" $ 
        overlap (Point 42) (Join [Point 10, Point 20, preciseSpan (30, 50), Between 88 89]) `shouldBe` True
    it "Join-Point, should not overlap" $ 
        flip overlap (Point 42) (Join [Point 24, preciseSpan (29, 41), Between 42 43, preciseSpan (77, 99)]) `shouldBe` False
    it "Join-Point, should overlap" $ 
        flip overlap (Point 42) (Join [Point 10, Point 20, preciseSpan (30, 50), Between 88 89]) `shouldBe` True

    it "Point-Complement, should not overlap" $ 
        overlap (Point 42) (Join [Point 24, preciseSpan (29, 41), Between 42 43, preciseSpan (77, 99)]) `shouldBe` False
    it "Point-Complement, should overlap" $ 
        overlap (Point 42) (Join [Point 10, Point 20, preciseSpan (30, 50), Between 88 89]) `shouldBe` True
    it "Complement-Point, should not overlap" $ 
        flip overlap (Point 42) (Join [Point 24, preciseSpan (29, 41), Between 42 43, preciseSpan (77, 99)]) `shouldBe` False
    it "Complement-Point, should overlap" $ 
        flip overlap (Point 42) (Join [Point 10, Point 20, preciseSpan (30, 50), Between 88 89]) `shouldBe` True

    it "Span-Span, should not overlap" $
        --  -----xxxxxxxxxxxxx---------------------------
        --  --------------------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (preciseSpan (30, 40)) `shouldBe` False
    it "Span-Span, should not overlap" $
        --  -----xxxxxxxxxxxxx-------------------
        --  ------------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (preciseSpan (21, 40)) `shouldBe` False
    it "Span-Span, should overlap" $
        --  -----xxxxxxxxxxxxx------------------
        --  -----------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (preciseSpan (20, 40)) `shouldBe` True 
    it "Span-Span, should overlap" $
        --  -----xxxxxxxxxxxxx---------------
        --  --------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (preciseSpan (17, 40)) `shouldBe` True 
    it "Span-Span, should overlap" $
        --  -----xxxxxxxxxxxxx----------------
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (preciseSpan (5, 40)) `shouldBe` True 
    it "Span-Span, should overlap" $
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        --  -----xxxxxxxxxxxxx----------------
        overlap (preciseSpan (5, 40)) (preciseSpan (10, 20)) `shouldBe` True 

    it "Span-Join, should not overlap" $
        -- ---xxxxxxxx--------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (preciseSpan (5, 10)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` False
    it "Span-Join, should overlap" $
        -- ----xxxxxxxx-------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (preciseSpan (6, 11)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Span-Join, should overlap" $
        -- ----------xxxxxxxx-------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (preciseSpan (9, 18)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Span-Join, should overlap" $
        -- ------------------xxxxxxxx-----------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (preciseSpan (18, 32)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Span-Join, should overlap" $
        -- -----------------------------xxxxxxxx
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (preciseSpan (40, 50)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Join-Span, should not overlap" $
        -- ---xxxxxxxx--------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (preciseSpan (5, 10)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` False
    it "Join-Span, should overlap" $
        -- ----xxxxxxxx-------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (preciseSpan (6, 11)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Join-Span, should overlap" $
        -- ----------xxxxxxxx-------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (preciseSpan (9, 18)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Join-Span, should overlap" $
        -- ------------------xxxxxxxx-----------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (preciseSpan (18, 32)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Join-Span, should overlap" $
        -- -----------------------------xxxxxxxx
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (preciseSpan (40, 50)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True

    it "Span-Complement, should not overlap" $
        --  -----xxxxxxxxxxxxx---------------------------
        --  --------------------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (30, 40)) `shouldBe` False
    it "Span-Complement, should not overlap" $
        --  -----xxxxxxxxxxxxx-------------------
        --  ------------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (21, 40)) `shouldBe` False
    it "Span-Complement, should overlap" $
        --  -----xxxxxxxxxxxxx------------------
        --  -----------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (20, 40)) `shouldBe` True 
    it "Span-Complement, should overlap" $
        --  -----xxxxxxxxxxxxx---------------
        --  --------------xxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (17, 40)) `shouldBe` True 
    it "Span-Complement, should overlap" $
        --  -----xxxxxxxxxxxxx----------------
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (5, 40)) `shouldBe` True 
    it "Span-Complement, should overlap" $
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        --  -----xxxxxxxxxxxxx----------------
        overlap (preciseSpan (5, 40)) (Complement $ preciseSpan (10, 20)) `shouldBe` True 
    it "Complement-Span, should not overlap" $
        --  -----xxxxxxxxxxxxx---------------------------
        --  --------------------------xxxxxxxxxxxxx------
        flip overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (30, 40)) `shouldBe` False
    it "Complement-Span, should not overlap" $
        --  -----xxxxxxxxxxxxx-------------------
        --  ------------------xxxxxxxxxxxxx------
        flip overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (21, 40)) `shouldBe` False
    it "Complement-Span, should overlap" $
        --  -----xxxxxxxxxxxxx------------------
        --  -----------------xxxxxxxxxxxxx------
        flip overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (20, 40)) `shouldBe` True 
    it "Complement-Span, should overlap" $
        --  -----xxxxxxxxxxxxx---------------
        --  --------------xxxxxxxxxxxxx------
        flip overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (17, 40)) `shouldBe` True 
    it "Complement-Span, should overlap" $
        --  -----xxxxxxxxxxxxx----------------
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        flip overlap (preciseSpan (10, 20)) (Complement $ preciseSpan (5, 40)) `shouldBe` True 
    it "Complement-Span, should overlap" $
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        --  -----xxxxxxxxxxxxx----------------
        flip overlap (preciseSpan (5, 40)) (Complement $ preciseSpan (10, 20)) `shouldBe` True 

    it "Join-Join, should not overlap" $
        -- ---xxx--|--xxxxx----x----xxxx------
        -- x|-----x---------xx---xx-------xxxx
        overlap (Join [preciseSpan (5, 10), Between 15 16, preciseSpan (30, 40), Point 50, preciseSpan (60, 70)]) (Join [Point 1, Between 1 2, Point 15, preciseSpan (42, 46), preciseSpan (52, 55), preciseSpan (80, 100)]) `shouldBe` False
    it "Join-Join, should overlap" $
        -- ---xxx--|--xxxxx----x----xxxx---
        -- x|-----x---------xx---xx----xxxx
        overlap (Join [preciseSpan (5, 10), Between 15 16, preciseSpan (30, 40), Point 50, preciseSpan (60, 70)]) (Join [Point 1, Between 1 2, Point 15, preciseSpan (42, 46), preciseSpan (52, 55), preciseSpan (70, 100)]) `shouldBe` True 
    it "Join-Join, should overlap" $
        -- ---xxx--|--xxxxx--x------xxxx------
        -- x|-----x---------xx---xx-------xxxx
        overlap (Join [preciseSpan (5, 10), Between 15 16, preciseSpan (30, 40), Point 46, preciseSpan (60, 70)]) (Join [Point 1, Between 1 2, Point 15, preciseSpan (42, 46), preciseSpan (52, 55), preciseSpan (80, 100)]) `shouldBe` True 

    it "Join-Complement, should not overlap" $
        -- ---xxxxxxxx--------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (Complement $ preciseSpan (5, 10)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` False
    it "Join-Complement, should overlap" $
        -- ----xxxxxxxx-------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (Complement $ preciseSpan (6, 11)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Join-Complement, should overlap" $
        -- ----------xxxxxxxx-------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (Complement $ preciseSpan (9, 18)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Join-Complement, should overlap" $
        -- ------------------xxxxxxxx-----------
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (Complement $ preciseSpan (18, 32)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Join-Complement, should overlap" $
        -- -----------------------------xxxxxxxx
        -- -x---------|--xxxxx---xxxxxxxx-------
        flip overlap (Complement $ preciseSpan (40, 50)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Complement-Join, should not overlap" $
        -- ---xxxxxxxx--------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (Complement $ preciseSpan (5, 10)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` False
    it "Complement-Join, should overlap" $
        -- ----xxxxxxxx-------------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (Complement $ preciseSpan (6, 11)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Complement-Join, should overlap" $
        -- ----------xxxxxxxx-------------------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (Complement $ preciseSpan (9, 18)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Complement-Join, should overlap" $
        -- ------------------xxxxxxxx-----------
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (Complement $ preciseSpan (18, 32)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True
    it "Complement-Join, should overlap" $
        -- -----------------------------xxxxxxxx
        -- -x---------|--xxxxx---xxxxxxxx-------
        overlap (Complement $ preciseSpan (40, 50)) (Join [Point 2, Between 10 11, preciseSpan (15, 20), preciseSpan (30, 40)]) `shouldBe` True

    it "Complement-Complement, should not overlap" $
        --  -----xxxxxxxxxxxxx---------------------------
        --  --------------------------xxxxxxxxxxxxx------
        overlap (Complement $ preciseSpan (10, 20)) (Complement $ preciseSpan (30, 40)) `shouldBe` False
    it "Complement-Complement, should not overlap" $
        --  -----xxxxxxxxxxxxx-------------------
        --  ------------------xxxxxxxxxxxxx------
        overlap (Complement $ preciseSpan (10, 20)) (Complement $ preciseSpan (21, 40)) `shouldBe` False
    it "Complement-Complement, should overlap" $
        --  -----xxxxxxxxxxxxx------------------
        --  -----------------xxxxxxxxxxxxx------
        overlap (Complement $ preciseSpan (10, 20)) (Complement $ preciseSpan (20, 40)) `shouldBe` True 
    it "Complement-Complement, should overlap" $
        --  -----xxxxxxxxxxxxx---------------
        --  --------------xxxxxxxxxxxxx------
        overlap (Complement $ preciseSpan (10, 20)) (Complement $ preciseSpan (17, 40)) `shouldBe` True 
    it "Complement-Complement, should overlap" $
        --  -----xxxxxxxxxxxxx----------------
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        overlap (Complement $ preciseSpan (10, 20)) (Complement $ preciseSpan (5, 40)) `shouldBe` True 
    it "Complement-Complement, should overlap" $
        --  ---xxxxxxxxxxxxxxxxxxxxxxxxx------
        --  -----xxxxxxxxxxxxx----------------
        overlap (Complement $ preciseSpan (5, 40)) (Complement $ preciseSpan (10, 20)) `shouldBe` True 


rangeShiftTests :: Spec
rangeShiftTests = describe "Range shift tests" $ do
    it "Shifts a point" $ shiftRange 22 (Point 20) `shouldBe` Point 42
    it "Shifts a Between feature" $ shiftRange 22 (Between 20 21) `shouldBe` Between 42 43
    it "Shifts a span" $ shiftRange 22 (preciseSpan (20, 21)) `shouldBe` preciseSpan (42, 43)
    it "Shifts a Join feature" $ shiftRange 22 (Join [Point 10, Between 11 12, preciseSpan (13, 14)]) `shouldBe` Join [Point 32, Between 33 34, preciseSpan (35, 36)]
    it "Shifts a Complement feature" $ shiftRange 22 (Complement $ Point 20) `shouldBe` Complement (Point 42)

rangeMapTests :: Spec
rangeMapTests = describe "Range map tests" $ do
    it "Maps a point" $ mapRange ((-) 1) (Point 20) `shouldBe` Point (-19)
    it "Maps a Between feature" $ mapRange ((-) 1) (Between 20 21) `shouldBe` Between (-19) (-20) 
    it "Maps a span" $ mapRange ((-) 1) (preciseSpan (20, 21)) `shouldBe` preciseSpan (-19, -20)
    it "Maps a Join feature" $ mapRange ((-) 1) (Join [Point 10, Between 11 12, preciseSpan (13, 14)]) `shouldBe` Join [Point (-9), Between (-10) (-11), preciseSpan (-12, -13)]
    it "Maps a Complement feature" $ mapRange ((-) 1) (Complement $ Point 20) `shouldBe` Complement (Point (-19))

rangeExtendTests :: Spec
rangeExtendTests = do
    describe "Range extend tests" $ do
        describe "Extend left" $ do
            it "Extends a point" $ extendLeft 10 (Point 10) `shouldBe` preciseSpan (0, 10)
            it "Extends a Between feature" $ extendLeft 10 (Between 10 11) `shouldBe` Between 10 11
            it "Extends a span" $ extendLeft 10 (preciseSpan (10, 20)) `shouldBe` preciseSpan (0, 20)
            it "Extends a Join feature" $ extendLeft 10 (Join [Point 10, Between 11 12, preciseSpan (13, 14)]) `shouldBe` Join [preciseSpan (0, 10), Between 11 12, preciseSpan (3, 14)]
            it "Extends a Complement feature" $ extendLeft 10 (Complement $ Point 10) `shouldBe` (Complement $ preciseSpan (0, 10))
        describe "Extend right" $ do
            it "Extends a point" $ extendRight 10 (Point 10) `shouldBe` preciseSpan (10, 20)
            it "Extends a Between feature" $ extendRight 10 (Between 10 11) `shouldBe` Between 10 11
            it "Extends a span" $ extendRight 10 (preciseSpan (10, 20)) `shouldBe` preciseSpan (10, 30)
            it "Extends a Join feature" $ extendRight 10 (Join [Point 10, Between 11 12, preciseSpan (13, 14)]) `shouldBe` Join [preciseSpan (10, 20), Between 11 12, preciseSpan (13, 24)]
            it "Extends a Complement feature" $ extendRight 10 (Complement $ Point 10) `shouldBe` (Complement $ preciseSpan (10, 20))