packages feed

stack-hpc-coveralls-0.0.7.0: test/SHCSpec.hs

{-# OPTIONS_GHC -fno-warn-type-defaults -fno-warn-orphans #-}
{-# LANGUAGE CPP                #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE StandaloneDeriving #-}
module SHCSpec (spec)
    where

import           Control.DeepSeq          (force)
import           Control.Exception        (evaluate)
import           Data.Aeson
import qualified Data.Map.Strict          as M
import           Data.Time.Clock          (getCurrentTime)
import           Data.Version
import           System.IO.Unsafe         (unsafePerformIO)
import           Test.Hspec
import           Test.Hspec.Contrib.HUnit
import           Trace.Hpc.Mix
import           Trace.Hpc.Util

import           SHCHUnits

import           SHC.Coverage
import           SHC.Lix
import           SHC.Types
import           SHC.Utils

#if __GLASGOW_HASKELL__ < 710
deriving instance Eq Mix
#endif


covEntries :: [CoverageEntry]
covEntries =
    [ ([(toHpcPos (1, 2, 3, 4), ExpBox True)], [1, 2, 3, 0, 1, 4], ["a"])
    , ([(toHpcPos (1, 2, 3, 8), ExpBox True)], [1, 2, 3, 3, 1, 4], ["a"])
    , ([(toHpcPos (2, 5, 6, 7), ExpBox True)], [1, 2, 3, 4, 2, 4], ["b"])
    , ([(toHpcPos (4, 8, 9, 9), ExpBox True)], [0], ["c"])
    ]

mix :: Mix
mix = Mix undefined undefined undefined undefined boxes2

mix2 :: Mix
mix2 = Mix "path" (unsafePerformIO getCurrentTime) (toHash 'c') 3 boxes2

spec :: Spec
spec = do
    describe "SHC.Coverage" $ do
        describe "toSimpleCoverage" $ do
            it "works with strictConverter" $
                toSimpleCoverage strictConverter 4 covEntries `shouldBe`
                    [Number 0, Number 1, Null, Number 0]
            it "works with looseConverter" $
                toSimpleCoverage looseConverter 4 covEntries `shouldBe`
                    [Number 1, Number 2, Null, Number 0]
        describe "coverageToJson" $
            it "works with standard coverage data" $
                coverageToJson strictConverter "path"
                               ("a\nb\nc\n", mix, [1, 2, 3])
                    `shouldBe`
                    object [ "name"          .= ("path"::String)
                           , "source_digest" .= ("40c53c58fdafacc83cfff6ee3d2f6d69"::String)
                           , "coverage"      .= [Number 1, Null, Null]
                           ]
        describe "mergeCoverageData" $
            it "works with standard coverage data" $
                mergeCoverageData
                     [ M.fromList [ ("path1", ("", mix2, [1, 2, 3]))
                                  , ("path2", ("a", mix2, [4, 5, 6]))
                                  ]
                     , M.fromList [("path1", ("c", mix2, [8, 1, 3]))]
                     ]
                    `shouldBe` M.fromList [ ("path1", ("", mix2, [9, 3, 6]))
                                          , ("path2", ("a", mix2, [4, 5, 6]))
                                          ]
    describe "SHC.Lix" $ do
        describe "toHit" $
            fromHUnitTest testToHit
        it "startLine" $
            startLine (toHpcPos (1, 2, 3, 4), undefined) `shouldBe` 1
        describe "toLineHit" $ do
            it "throws an exception with empty lists" $
                evaluate (force (toLineHit ([], [], [""]))) `shouldThrow` anyException
            fromHUnitTest testToLineHit
        describe "isOtherwiseEntry" $
            fromHUnitTest testIsOtherwiseEntry
        describe "adjust" $
            fromHUnitTest testAdjust
        it "toLix" $
            toLix 4 covEntries `shouldBe` [Partial, Full, Irrelevant, None]
    describe "SHC.Utils" $ do
        it "verifyVersion" $
            let ver = Version [0,1,7,0] []
            in  (not (verifyVersion "0.1.6.0" ver) &&
                 verifyVersion "0.1.7.0" ver &&
                 verifyVersion "1.100.4.56" ver) `shouldBe` True
        it "fst3" $ fst3 (1, 2, 3) `shouldBe` 1
        it "snd3" $ snd3 (1, 2, 3) `shouldBe` 2
        it "trd3" $ trd3 (1, 2, 3) `shouldBe` 3
        it "fst4" $ fst4 (1, 2, 3, 4) `shouldBe` 1
        it "toFirstAndRest" $
            toFirstAndRest (1, 2, 3, 4) `shouldBe` (1, (2, 3, 4))
        describe "mcons" $
            fromHUnitTest testMcons
        describe "matchAny" $
            fromHUnitTest testMatchAny
        describe "mapFirst" $
            fromHUnitTest testMapFirst
        describe "mapLast" $
            fromHUnitTest testMapLast
        describe "subSeq" $
            fromHUnitTest testSubSeq
        describe "subSubSeq" $
            fromHUnitTest testSubSubSeq
        describe "groupByIndex" $
            fromHUnitTest testGroupByIndex