packages feed

hnix-store-core-0.4.1.0: tests/Arbitrary.hs

{-# 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