{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE DataKinds #-} {-# OPTIONS_GHC -Wno-orphans #-} module Arbitrary where import Control.Monad ( replicateM ) import qualified Data.ByteString.Char8 as BSC import qualified Data.Text as T import Test.Tasty.QuickCheck import System.Nix.Hash import System.Nix.Internal.Hash import System.Nix.StorePath import System.Nix.Internal.StorePath genSafeChar :: Gen Char genSafeChar = choose ('\1', '\127') -- ASCII without \NUL nonEmptyString :: Gen String nonEmptyString = listOf1 genSafeChar dir :: Gen String dir = ('/':) <$> (listOf1 $ elements $ '/':['a'..'z']) instance Arbitrary StorePathName where arbitrary = StorePathName . T.pack <$> ((:) <$> s1 <*> listOf sn) where alphanum = ['a' .. 'z'] <> ['A' .. 'Z'] <> ['0' .. '9'] s1 = elements $ alphanum <> "+-_?=" sn = elements $ alphanum <> "+-._?=" instance Arbitrary (Digest StorePathHashAlgo) where arbitrary = hash . BSC.pack <$> arbitrary instance Arbitrary (Digest 'SHA256) where arbitrary = hash . BSC.pack <$> arbitrary newtype NixLike = NixLike {getNixLike :: StorePath} deriving (Eq, Ord, Show) instance Arbitrary NixLike where arbitrary = NixLike <$> (StorePath <$> arbitraryTruncatedDigest <*> arbitrary <*> pure "/nix/store" ) where -- 160-bit hash, 20 bytes, 32 chars in base32 arbitraryTruncatedDigest = Digest . BSC.pack <$> replicateM 20 genSafeChar instance Arbitrary StorePath where arbitrary = StorePath <$> arbitrary <*> arbitrary <*> dir