packages feed

hnix-store-remote-0.8.0.0: tests/EnumSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module EnumSpec (spec) where

import Test.Hspec (SpecWith, Spec, describe, it, shouldBe)

import Data.Word (Word64)
import System.Nix.Build (BuildMode(..), BuildSuccessStatus(..), BuildFailureStatus(..))
import System.Nix.Store.Remote.Serializer
  ( activity
  , activityResult
  , enum
  , int
  , loggerOpCode
  , runP
  , workerOp
  , LoggerSError
  , NixSerializer
  , SError
  )
import System.Nix.Store.Remote.Types

spec :: Spec
spec = do
  let
    itE
      :: ( Bounded a
         , Enum a
         , Show a
         )
      => String
      -> a
      -> Word64
      -> SpecWith ()
    itE name constr value =
      it name
        $ runP @SError enum constr
          `shouldBe`
          runP @SError (int @Word64) value

    itE'
      :: Show a
      => NixSerializer LoggerSError a
      -> String
      -> a
      -> Word64
      -> SpecWith ()
    itE' s name constr value =
      it name
        $ runP s constr
          `shouldBe`
          runP @LoggerSError (int @Word64) value

  describe "Enums" $ do
    describe "BuildMode enum order matches Nix" $ do
      itE "Normal" BuildMode_Normal 0
      itE "Repair" BuildMode_Repair 1
      itE "Check"  BuildMode_Check  2

    describe "BuildSuccessStatus enum order matches Nix" $ do
      itE "Built"                  BuildSuccessStatus_Built                   0
      itE "Substituted"            BuildSuccessStatus_Substituted             1
      itE "AlreadyValid"           BuildSuccessStatus_AlreadyValid            2
      itE "ResolvesToAlreadyValid" BuildSuccessStatus_ResolvesToAlreadyValid  3

    describe "BuildFailureStatus enum order matches Nix" $ do
      itE "PermanentFailure"       BuildFailureStatus_PermanentFailure        0
      itE "InputRejected"          BuildFailureStatus_InputRejected           1
      itE "OutputRejected"         BuildFailureStatus_OutputRejected          2
      itE "TransientFailure"       BuildFailureStatus_TransientFailure        3
      itE "CachedFailure"          BuildFailureStatus_CachedFailure           4
      itE "TimedOut"               BuildFailureStatus_TimedOut                5
      itE "MiscFailure"            BuildFailureStatus_MiscFailure             6
      itE "DependencyFailed"       BuildFailureStatus_DependencyFailed        7
      itE "LogLimitExceeded"       BuildFailureStatus_LogLimitExceeded        8
      itE "NotDeterministic"       BuildFailureStatus_NotDeterministic        9
      itE "NoSubstituters"         BuildFailureStatus_NoSubstituters         10
      itE "HashMismatch"           BuildFailureStatus_HashMismatch           11

    describe "GCAction enum order matches Nix" $ do
      itE "ReturnLive"     GCAction_ReturnLive     0
      itE "ReturnDead"     GCAction_ReturnDead     1
      itE "DeleteDead"     GCAction_DeleteDead     2
      itE "DeleteSpecific" GCAction_DeleteSpecific 3

    describe "Logger" $ do
      let itA = itE' activity
      describe "Activity enum order matches Nix" $ do
        itA "CopyPath"      Activity_CopyPath      100
        itA "FileTransfer"  Activity_FileTransfer  101
        itA "Realise"       Activity_Realise       102
        itA "CopyPaths"     Activity_CopyPaths     103
        itA "Builds"        Activity_Builds        104
        itA "Build"         Activity_Build         105
        itA "OptimiseStore" Activity_OptimiseStore 106
        itA "VerifyPaths"   Activity_VerifyPaths   107
        itA "Substitute"    Activity_Substitute    108
        itA "QueryPathInfo" Activity_QueryPathInfo 109
        itA "PostBuildHook" Activity_PostBuildHook 110
        itA "BuildWaiting"  Activity_BuildWaiting  111

      let itR = itE' activityResult
      describe "ActivityResult enum order matches Nix" $ do
        itR "FileLinked"       ActivityResult_FileLinked       100
        itR "BuildLogLine"     ActivityResult_BuildLogLine     101
        itR "UnstrustedPath"   ActivityResult_UnstrustedPath   102
        itR "CorruptedPath"    ActivityResult_CorruptedPath    103
        itR "SetPhase"         ActivityResult_SetPhase         104
        itR "Progress"         ActivityResult_Progress         105
        itR "SetExpected"      ActivityResult_SetExpected      106
        itR "PostBuildLogLine" ActivityResult_PostBuildLogLine 107


      let itL = itE' loggerOpCode
      describe "LoggerOpCode matches Nix" $ do
        itL "Next"          LoggerOpCode_Next          0x6f6c6d67
        itL "Read"          LoggerOpCode_Read          0x64617461
        itL "Write"         LoggerOpCode_Write         0x64617416
        itL "Last"          LoggerOpCode_Last          0x616c7473
        itL "Error"         LoggerOpCode_Error         0x63787470
        itL "StartActivity" LoggerOpCode_StartActivity 0x53545254
        itL "StopActivity"  LoggerOpCode_StopActivity  0x53544f50
        itL "Result"        LoggerOpCode_Result        0x52534c54

      describe "Verbosity enum order matches Nix" $ do
        itE "Error"     Verbosity_Error     0
        itE "Warn"      Verbosity_Warn      1
        itE "Notice"    Verbosity_Notice    2
        itE "Info"      Verbosity_Info      3
        itE "Talkative" Verbosity_Talkative 4
        itE "Chatty"    Verbosity_Chatty    5
        itE "Debug"     Verbosity_Debug     6
        itE "Vomit"     Verbosity_Vomit     7

      describe "WorkerOp enum order matches Nix" $ do
        let itW name constr value =
              it name
                $ runP workerOp constr
                  `shouldBe`
                  runP @SError (int @Word64) value
        itW "IsValidPath"           WorkerOp_IsValidPath              1
        itW "BuildPathsWithResults" WorkerOp_BuildPathsWithResults   46
        itW "SubmitOutput"          WorkerOp_SubmitOutput          1000
        itW "AddToStoreScanning"    WorkerOp_AddToStoreScanning    1001