packages feed

dojang-0.2.1: test/Dojang/Types/Environment/CurrentSpec.hs

{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}

module Dojang.Types.Environment.CurrentSpec (spec) where

import Dojang.Types.Environment
  ( Architecture (..)
  , Environment (..)
  , Kernel (..)
  , OperatingSystem (..)
  )
import Dojang.Types.Environment.Current
  ( currentArchitecture
  , currentEnvironment
  , currentKernel
  , currentOperatingSystem
  , parseArchitecture
  , parseOperatingSystem
  )

import Data.CaseInsensitive (original)
import Data.String (IsString (fromString))
import Data.Text (Text)
import System.Info (arch, os)
import Test.Hspec (Spec, specify)
import Test.Hspec.Expectations.Pretty (shouldBe, shouldSatisfy)
import Text.Regex.TDFA ((=~))


spec :: Spec
spec = do
  specify "currentOperatingSystem" $ do
    os' <- currentOperatingSystem
    os' `shouldBe` expectedOS

  specify "currentArchitecture" $ do
    arch' <- currentArchitecture
    arch' `shouldBe` expectedArch

  specify "currentKernel" $ do
    kernel <- currentKernel
    expectKernel kernel

  specify "currentEnvironment" $ do
    env <- currentEnvironment
    env.operatingSystem `shouldBe` expectedOS
    env.architecture `shouldBe` expectedArch
    expectKernel env.kernel

  specify "parseOperatingSystem" $ do
    parseOperatingSystem "linux-android" `shouldBe` Android
    parseOperatingSystem "darwin" `shouldBe` MacOS
    parseOperatingSystem "freebsd" `shouldBe` FreeBSD
    parseOperatingSystem "linux" `shouldBe` Linux
    parseOperatingSystem "netbsd" `shouldBe` NetBSD
    parseOperatingSystem "openbsd" `shouldBe` OpenBSD
    parseOperatingSystem "mingw32" `shouldBe` Windows
    parseOperatingSystem "other-os" `shouldBe` OtherOS "other-os"

  specify "parseArchitecture" $ do
    parseArchitecture "aarch64" `shouldBe` AArch64
    parseArchitecture "i386" `shouldBe` X86
    parseArchitecture "x86_64" `shouldBe` X86_64
    parseArchitecture "other-arch" `shouldBe` Etc "other-arch"


expectedOS :: OperatingSystem
expectedOS = case os of
  "darwin" -> MacOS
  "linux" -> Linux
  "mingw32" -> Windows
  "freebsd" -> FreeBSD
  os' -> OtherOS $ fromString os'


expectedArch :: Architecture
expectedArch = case arch of
  "aarch64" -> AArch64
  "x86_64" -> X86_64
  arch' -> Etc $ fromString arch'


expectKernel :: Kernel -> IO ()
expectKernel = case os of
  "darwin" -> expectMacOSKernel
  "linux" -> expectLinuxKernel
  "mingw32" -> expectWindowsKernel
  _ -> \_ -> return ()


expectMacOSKernel :: Kernel -> IO ()
expectMacOSKernel kernel = do
  original kernel.name `shouldBe` "Darwin"
  original kernel.release
    `shouldSatisfy` (=~ ("^[0-9]+\\.[0-9]+\\.[0-9]+$" :: Text))


expectLinuxKernel :: Kernel -> IO ()
expectLinuxKernel kernel = do
  original kernel.name `shouldBe` "Linux"
  original kernel.release
    `shouldSatisfy` (=~ ("^[0-9]+\\.[0-9]+\\.?[0-9]+[.-][0-9]+([-.]|$)" :: Text))


expectWindowsKernel :: Kernel -> IO ()
expectWindowsKernel kernel = do
  original kernel.name `shouldBe` "Microsoft Windows"
  original kernel.release
    `shouldSatisfy` (=~ ("^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$" :: Text))