packages feed

keuringsdienst-0.1.0.2: test/KeuringsdienstSpec.hs

{-
  Copyright © 2023 Josep Bigorra

  This file is part of Keuringsdienst.
  Keuringsdienst is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation,
    either version 3 of the License, or (at your option) any later version.

  Keuringsdienst is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
    without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  See the GNU General Public License for more details.
  You should have received a copy of the GNU General Public License along with Keuringsdienst.
  If not, see <https://www.gnu.org/licenses/>.
-}
{-# OPTIONS_GHC -F -pgmF htfpp #-}

module KeuringsdienstSpec
  ( htf_thisModulesTests,
  )
where

import Data.Text
import Keuringsdienst as K
import Test.Framework

-- λ test helpers
someErrorMessage :: Text
someErrorMessage = "You're simply a test! Better than all the rest!"

alwaysSuccessfulValidationRule :: ValidationRule a
alwaysSuccessfulValidationRule = ValidationRule {performValidation = const K.Success}

alwaysFailureValidationRule :: ValidationRule a
alwaysFailureValidationRule = ValidationRule {performValidation = const (K.Failure [someErrorMessage])}

-- λ test cases
test_validationResultsCanBeComposedIfBothSuccess :: IO ()
test_validationResultsCanBeComposedIfBothSuccess =
  assertEqual K.Success systemUnderTest
  where
    systemUnderTest :: ValidationResult
    systemUnderTest = K.Success <> K.Success

test_validationResultsCanBeComposedIfSuccessFailure :: IO ()
test_validationResultsCanBeComposedIfSuccessFailure =
  assertEqual expected systemUnderTest
  where
    expected :: ValidationResult
    expected = K.Failure [someErrorMessage]
    systemUnderTest :: ValidationResult
    systemUnderTest = K.Success <> K.Failure [someErrorMessage]

test_validationResultsCanBeComposedIfFailureSuccess :: IO ()
test_validationResultsCanBeComposedIfFailureSuccess =
  assertEqual expected systemUnderTest
  where
    expected :: ValidationResult
    expected = K.Failure [someErrorMessage]
    systemUnderTest :: ValidationResult
    systemUnderTest = K.Failure [someErrorMessage] <> K.Success

test_keurenOperatorAppliesValidation :: IO ()
test_keurenOperatorAppliesValidation =
  assertEqual K.Success systemUnderTest
  where
    systemUnderTest :: ValidationResult
    systemUnderTest = ("" :: Text) |?| alwaysSuccessfulValidationRule

test_nonInfixKeurenOperatorAppliesValidation :: IO ()
test_nonInfixKeurenOperatorAppliesValidation =
  assertEqual K.Success systemUnderTest
  where
    systemUnderTest :: ValidationResult
    systemUnderTest = keuren ("" :: Text) alwaysSuccessfulValidationRule

test_nonInfixValidateOperatorAppliesValidation :: IO ()
test_nonInfixValidateOperatorAppliesValidation =
  assertEqual K.Success systemUnderTest
  where
    systemUnderTest :: ValidationResult
    systemUnderTest = validate ("" :: Text) alwaysSuccessfulValidationRule

test_misschienKeurenOperatorAppliesValidation :: IO ()
test_misschienKeurenOperatorAppliesValidation =
  assertEqual expected systemUnderTest
  where
    expected :: ValidationResult
    expected = K.Failure [someErrorMessage]
    systemUnderTest :: ValidationResult
    systemUnderTest = (Just "" :: Maybe Text) |??| alwaysFailureValidationRule

test_nonInfixMisschienKeurenOperatorAppliesValidation :: IO ()
test_nonInfixMisschienKeurenOperatorAppliesValidation =
  assertEqual expected systemUnderTest
  where
    expected :: ValidationResult
    expected = K.Failure [someErrorMessage]
    systemUnderTest :: ValidationResult
    systemUnderTest = misschienKeuren (Just "" :: Maybe Text) alwaysFailureValidationRule

test_nonInfixMaybeValidateOperatorAppliesValidation :: IO ()
test_nonInfixMaybeValidateOperatorAppliesValidation =
  assertEqual expected systemUnderTest
  where
    expected :: ValidationResult
    expected = K.Failure [someErrorMessage]
    systemUnderTest :: ValidationResult
    systemUnderTest = maybeValidate (Just "" :: Maybe Text) alwaysFailureValidationRule

test_misschienKeurenOperatorAppliesValidationOnNothing :: IO ()
test_misschienKeurenOperatorAppliesValidationOnNothing =
  assertEqual K.Success systemUnderTest
  where
    systemUnderTest :: ValidationResult
    systemUnderTest = (Nothing :: Maybe Text) |??| alwaysSuccessfulValidationRule

test_nonInfixMisschienKeurenOperatorAppliesValidationOnNothing :: IO ()
test_nonInfixMisschienKeurenOperatorAppliesValidationOnNothing =
  assertEqual K.Success systemUnderTest
  where
    systemUnderTest :: ValidationResult
    systemUnderTest = misschienKeuren (Nothing :: Maybe Text) alwaysSuccessfulValidationRule

test_nonInfixMaybeValidateOperatorAppliesValidationOnNothing :: IO ()
test_nonInfixMaybeValidateOperatorAppliesValidationOnNothing =
  assertEqual K.Success systemUnderTest
  where
    systemUnderTest :: ValidationResult
    systemUnderTest = maybeValidate (Nothing :: Maybe Text) alwaysSuccessfulValidationRule