packages feed

spdx-1.1.0.1: tests/Generators.hs

{-# LANGUAGE CPP #-}
module Generators where

import           Test.Tasty.QuickCheck as QC

import           Distribution.SPDX

latestLicenseListVersion :: LicenseListVersion
#if MIN_VERSION_Cabal_syntax(3,16,0)
latestLicenseListVersion = LicenseListVersion_3_26
#elif MIN_VERSION_Cabal_syntax(3,14,0)
latestLicenseListVersion = LicenseListVersion_3_25
#elif MIN_VERSION_Cabal_syntax(3,12,0)
latestLicenseListVersion = LicenseListVersion_3_23
#else
latestLicenseListVersion = LicenseListVersion_3_16
#endif

licenseIdGen :: Gen LicenseId
licenseIdGen = elements $ licenseIdList latestLicenseListVersion

licenseExceptionGen :: Gen LicenseExceptionId
licenseExceptionGen = elements $ licenseExceptionIdList latestLicenseListVersion

licenseRefGen :: Gen LicenseRef
licenseRefGen = mkLicenseRef' <$> liftArbitrary idStringGen <*> idStringGen

idStringGen :: Gen String
idStringGen = elements ["foo", "bar", "baz", "AllRightsReserved"]

mkExprGen :: Gen LicenseExpression -> Gen License
mkExprGen licGen = License <$> sized gen where
    gen 0 = licGen
    gen n = oneof [ licGen
                  , EOr <$> gen' <*> gen'
                  , EAnd <$> gen' <*> gen'
                  ]
      where gen' = gen (n `div` 2)

exprGen :: Gen License
exprGen = mkExprGen $ ELicense <$> simpleLicenseExprGen <*> pure Nothing

-- | 'exprGen' which contains also LicenseRefs and exceptions
exprGen' :: Gen License
exprGen' = mkExprGen $ ELicense <$> simpleLicenseExprGen <*> liftArbitrary licenseExceptionGen

simpleLicenseExprGen :: Gen SimpleLicenseExpression
simpleLicenseExprGen = oneof [ELicenseId <$> licenseIdGen, ELicenseRef <$> licenseRefGen]

exprShrink :: License -> [License]
exprShrink NONE        = []
exprShrink (License e) = map License (go e) where
    go :: LicenseExpression -> [LicenseExpression]
    go (ELicense _ _) = []
    go (EOr a b)      = a : b : map (uncurry EOr)  (liftShrink2 go go (a, b))
    go (EAnd a b)     = a : b : map (uncurry EAnd) (liftShrink2 go go (a, b))

scaleGen :: (Int -> Int) -> Gen a -> Gen a
scaleGen f g = sized (\n -> resize (f n) g)