packages feed

dojang-0.2.0: test/Dojang/Types/FileRouteMap/EvaluateSpec.hs

{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}

module Dojang.Types.FileRouteMap.EvaluateSpec (spec) where

import Data.Map.Strict (Map)
import System.OsPath (OsPath, encodeFS)
import Test.Hspec (Spec, runIO, specify)
import Test.Hspec.Expectations.Pretty (shouldBe)

import Dojang.MonadFileSystem (FileType (..))
import Dojang.Types.Environment
  ( Architecture (..)
  , Environment (Environment)
  , Kernel (..)
  , OperatingSystem (..)
  )
import Dojang.Types.EnvironmentPredicate.Evaluate (EvaluationWarning (..))
import Dojang.Types.FilePathExpression (FilePathExpression (..))
import Dojang.Types.FileRoute (FileRoute, fileRoute)
import Dojang.Types.FileRouteMap.Evaluate
  ( evaluateRoutes
  , evaluateRoutesWithFileTypes
  )
import Dojang.Types.FileRouteSpec (monikerMap)
import Dojang.Types.MonikerName (parseMonikerName)


spec :: Spec
spec = do
  foo <- runIO $ encodeFS "foo"
  bar <- runIO $ encodeFS "bar"
  baz <- runIO $ encodeFS "baz"

  let Right posix = parseMonikerName "posix"
  let Right undefined' = parseMonikerName "undefined"
  let Right windows = parseMonikerName "windows"

  let route = fileRoute monikerMap
  let routes =
        [
          ( foo
          , route
              [(posix, Just $ Substitution "FOO"), (windows, Nothing)]
              Directory
          )
        ,
          ( bar
          , route
              [ (posix, Just $ Substitution "BAR")
              , (windows, Just $ Root $ Just 'B')
              ]
              Directory
          )
        ,
          ( baz
          , route
              [ (undefined', Just $ BareComponent "baz")
              , (windows, Just $ Substitution "BAZ")
              ]
              File
          )
        ]
          :: Map OsPath FileRoute

  specify "evaluateRoutes" $ do
    evaluateRoutes [] (Environment Linux X86_64 $ Kernel "Linux" "5.10.0-8")
      `shouldBe` ([], [])
    evaluateRoutes
      routes
      ( Environment Windows X86_64 $
          Kernel "Microsoft Windows" "10.0.23585.1001"
      )
      `shouldBe` (
                   [ (bar, Root $ Just 'B')
                   , (baz, Substitution "BAZ")
                   ]
                 , [UndefinedMoniker undefined']
                 )
    evaluateRoutes
      routes
      (Environment Linux AArch64 $ Kernel "Linux" "6.5.9-300.fc35.aarch64")
      `shouldBe` (
                   [ (foo, Substitution "FOO")
                   , (bar, Substitution "BAR")
                   ]
                 , []
                 )

  specify "evaluateRoutesWithFileTypes" $ do
    let eval = evaluateRoutesWithFileTypes
    eval [] (Environment Linux X86_64 $ Kernel "Linux" "5.10.0-8")
      `shouldBe` ([], [])
    eval
      routes
      ( Environment Windows X86_64 $
          Kernel "Microsoft Windows" "10.0.23585.1001"
      )
      `shouldBe` (
                   [ (bar, (Root $ Just 'B', Directory))
                   , (baz, (Substitution "BAZ", File))
                   ]
                 , [UndefinedMoniker undefined']
                 )
    eval
      routes
      (Environment Linux AArch64 $ Kernel "Linux" "6.5.9-300.fc35.aarch64")
      `shouldBe` (
                   [ (foo, (Substitution "FOO", Directory))
                   , (bar, (Substitution "BAR", Directory))
                   ]
                 , []
                 )