packages feed

cardano-addresses-4.0.0: test/Options/Applicative/DerivationSpec.hs

module Options.Applicative.DerivationSpec
    ( spec
    ) where

import Prelude

import Control.Arrow
    ( left )
import Data.List
    ( isInfixOf )
import Options.Applicative.Derivation
    ( DerivationIndex
    , DerivationPath
    , derivationIndexFromString
    , derivationIndexToString
    , derivationPathFromString
    , derivationPathToString
    )
import Test.Hspec
    ( Spec, SpecWith, describe, it, shouldBe )
import Test.Hspec.QuickCheck
    ( prop )
import Test.QuickCheck
    ( Property, (===) )

import Test.Arbitrary
    ()

spec :: Spec
spec = do
    describe "DerivationIndex" $ do
        specInvalidSoftIndex
        specInvalidHardIndex
        prop "toString . fromString @ DerivationIndex"
            prop_roundtripStringDerivationIndex

    describe "DerivationPath" $ do
        specEmptyPath
        prop "toString . fromString @ DerivationPath"
            prop_roundtripStringDerivationPath

specInvalidSoftIndex
    :: SpecWith ()
specInvalidSoftIndex = it "invalid soft derivation index" $ do
    left (isInfixOf "Unable to parse soft index") (derivationIndexFromString "💩")
        `shouldBe` (Left True)

specInvalidHardIndex
    :: SpecWith ()
specInvalidHardIndex = it "invalid hard derivation index" $ do
    left (isInfixOf "Unable to parse hardened index") (derivationIndexFromString "💩H")
        `shouldBe` (Left True)


prop_roundtripStringDerivationIndex
    :: DerivationIndex
    -> Property
prop_roundtripStringDerivationIndex ix =
    derivationIndexFromString (derivationIndexToString ix) === pure ix

specEmptyPath
    :: SpecWith ()
specEmptyPath = it "empty derivation path" $ do
    derivationPathFromString "" `shouldBe`
        (Left "An empty string is not a derivation index!")

prop_roundtripStringDerivationPath
    :: DerivationPath
    -> Property
prop_roundtripStringDerivationPath path =
    derivationPathFromString (derivationPathToString path) === pure path