{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}

module Pantry.GlobalHintsSpec
  ( spec
  ) where

import Distribution.Types.PackageName ( mkPackageName )
import Distribution.Version ( mkVersion )
import Pantry ( WantedCompiler (..), loadGlobalHints, runPantryAppClean )
import Pantry.Types ( getGlobalHintsFile )
import Path ( toFilePath )
import RIO
import qualified RIO.Map as Map
import Test.Hspec

spec :: Spec
spec = do
    let it' name inner = it name $ example $ runPantryAppClean $ do
          file <- getGlobalHintsFile
          writeFileBinary (toFilePath file) "this should be ignored"
          inner
    it' "unknown compiler" $ do
      mmap <- loadGlobalHints $ WCGhc (mkVersion [0, 0, 0, 0, 0, 0, 0])
      liftIO $ mmap `shouldBe` Nothing
    it' "known compiler" $ do
      mmap <- loadGlobalHints $ WCGhc (mkVersion [8, 4, 3])
      case mmap of
        Nothing -> error "not found"
        Just m -> liftIO $ do
          Map.lookup (mkPackageName "ghc") m `shouldBe` Just (mkVersion [8, 4, 3])
          Map.lookup (mkPackageName "base") m `shouldBe` Just (mkVersion [4, 11, 1, 0])
          Map.lookup (mkPackageName "bytestring") m `shouldBe` Just (mkVersion [0, 10, 8, 2])
          Map.lookup (mkPackageName "acme-missiles") m `shouldBe` Nothing
    it' "older known compiler" $ do
      mmap <- loadGlobalHints $ WCGhc (mkVersion [7, 8, 4])
      case mmap of
        Nothing -> error "not found"
        Just m -> liftIO $ do
          Map.lookup (mkPackageName "ghc") m `shouldBe` Just (mkVersion [7, 8, 4])
          Map.lookup (mkPackageName "base") m `shouldBe` Just (mkVersion [4, 7, 0, 2])
          Map.lookup (mkPackageName "Cabal") m `shouldBe` Just (mkVersion [1, 18, 1, 5])
          Map.lookup (mkPackageName "acme-missiles") m `shouldBe` Nothing
