packages feed

nix-derivation-1.0.0: tests/Property.hs

{-# LANGUAGE RecordWildCards #-}

{-# OPTIONS_GHC -fno-warn-orphans #-}

module Main where

import Data.Text (Text)
import Data.Vector (Vector)
import Filesystem.Path.CurrentOS (FilePath)
import Nix.Derivation (Derivation(..), DerivationOutput(..))
import Prelude hiding (FilePath, either)
import Test.QuickCheck (Arbitrary(..))

import qualified Data.Attoparsec.Text.Lazy
import qualified Data.Text
import qualified Data.Text.Lazy.Builder
import qualified Data.Vector
import qualified Filesystem.Path.CurrentOS
import qualified Nix.Derivation
import qualified Test.QuickCheck

instance Arbitrary Text where
    arbitrary = fmap Data.Text.pack arbitrary

instance Arbitrary FilePath where
    arbitrary = fmap Filesystem.Path.CurrentOS.decodeString arbitrary

instance Arbitrary a => Arbitrary (Vector a) where
    arbitrary = fmap Data.Vector.fromList arbitrary

instance Arbitrary DerivationOutput where
    arbitrary = do
        path     <- arbitrary
        hashAlgo <- arbitrary
        hash     <- arbitrary
        return (DerivationOutput {..})

instance Arbitrary Derivation where
    arbitrary = do
        outputs   <- arbitrary
        inputDrvs <- arbitrary
        inputSrcs <- arbitrary
        platform  <- arbitrary
        builder   <- arbitrary
        args      <- arbitrary
        env       <- arbitrary
        return (Derivation {..})

property :: Derivation -> Bool
property derivation0 = either == Right derivation0
  where
    builder = Nix.Derivation.buildDerivation derivation0

    text = Data.Text.Lazy.Builder.toLazyText builder

    result =
        Data.Attoparsec.Text.Lazy.parse Nix.Derivation.parseDerivation text

    either =
        Data.Attoparsec.Text.Lazy.eitherResult result

main :: IO ()
main = Test.QuickCheck.quickCheck property