packages feed

inventory-0.1.0.3: test/Spec.hs

import           Data.Bifunctor
import           Data.Map.Append.Strict (AppendMap(..))
import qualified Data.Map.Strict as M
import           Data.Monoid
import           Test.Tasty
import           Test.Tasty.HUnit

import           DefCounts.ProcessHie
import           GHC.Api
import           GHC.DynFlags
import           GHC.Output hiding ((<>))
import           HieFile hiding (getCounters)
import           MatchSigs.ProcessHie
import           UseCounts.ProcessHie

main :: IO ()
main = defaultMain $
  withResource baseDynFlags mempty $ \ioResources ->
  testGroup "Unit Tests"
    [ testCase "Valid Signature Matching" $ do
        dynFlags <- ioResources
        sigMatchTest "T1" dynFlags [2]
        sigMatchTest "T2" dynFlags [2]
        sigMatchTest "T3" dynFlags [2]
        sigMatchTest "T4" dynFlags [2]
        sigMatchTest "T5" dynFlags [2]
        sigMatchTest "T6" dynFlags [3]
        sigMatchTest "T7" dynFlags [2,1]
        sigMatchTest "T8" dynFlags [2,2]
        sigMatchTest "T9" dynFlags [3]
        sigMatchTest "T10" dynFlags [5]
        sigMatchTest "T11" dynFlags [1,1]
        sigMatchTest "T12" dynFlags [1,1]
        sigMatchTest "T13" dynFlags [2]
        sigMatchTest "T14" dynFlags [1,2]
        sigMatchTest "T18" dynFlags [4]
        sigMatchTest "T19" dynFlags [3]
        sigMatchTest "T20" dynFlags [2,1,1]
        sigMatchTest "T21" dynFlags [1,1,1,1]

    , testCase "Definition Counting" $ do
        dynFlags <- ioResources
        defCountTest "T15" dynFlags
          . AppendMap $ M.fromList [(Class, (2, 1)), (ClassInst, (2, 1))]
        defCountTest "T17" dynFlags
          . AppendMap $ M.fromList
              [ (Class, (1, 1))
              , (Data, (1, 1))
              , (Newtype, (2, 1))
              , (Fam, (2, 2))
              , (Func, (2, 1))
              , (PatSyn, (1, 1))
              , (Syn, (1, 1))
              , (ClassInst, (2, 2))
              , (TyFamInst, (2, 2))
              , (ModImport, (1, 1))
              , (ExportThing, (5, 5))
              ]

    , testCase "Use Counts" $ do
        dynFlags <- ioResources
        useCountTest "T16" dynFlags
          [ ("foo", 1)
          , ("f", 1)
          , ("T", 1)
          , ("T", 3)
          ]
    ]

sigMatchTest :: String -> DynFlags -> [Int] -> IO ()
sigMatchTest testName dynFlags sigGroupSizes = do
  (_, _, AppendMap sigMap, _) <- getCounters testName dynFlags

  assertEqual testName sigGroupSizes
    . concatMap (map (\(_, _, names) -> length names) . getMatchedSigs)
    $ M.elems sigMap

defCountTest :: FilePath -> DynFlags -> DefCounter -> IO ()
defCountTest testName dynFlags expectedDefCount = do
  (defCount, _, _, _) <- getCounters testName dynFlags
  assertEqual testName expectedDefCount defCount

useCountTest :: FilePath -> DynFlags -> [(String, Int)] -> IO ()
useCountTest testName dynFlags expectedUseCount = do
  (_, AppendMap useCount, _, _) <- getCounters testName dynFlags
  let printName = showSDoc dynFlags . pprNameUnqualified
      actualCount = map (bimap printName usages) . M.toList
                  $ M.filter locallyDefined useCount
  assertEqual testName expectedUseCount actualCount

getHiePath :: String -> FilePath
getHiePath testName = "test/hie/HieSource/" <> testName <> ".hie"

getCounters :: String -> DynFlags -> IO (DefCounter, UsageCounter, SigMap, Sum Int)
getCounters testName dynFlags = do
  [hieFile] <- hieFilesFromPaths . (:[]) $ getHiePath testName
  pure $ hieFileToCounters dynFlags hieFile