{-# LANGUAGE CPP #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
module Test.Tasty.Sugar.Types where
import Control.Monad.IO.Class ( MonadIO )
import Data.Function ( on )
import qualified Data.List as L
import Data.Maybe ( catMaybes )
import Numeric.Natural
import System.FilePath
import qualified System.FilePath.GlobPattern as FPGP
#if MIN_VERSION_prettyprinter(1,7,0)
import Prettyprinter
#else
import Data.Text.Prettyprint.Doc
#endif
import Prelude hiding ( exp )
type FileSuffix = String
data CUBE = CUBE
{
CUBE -> String
inputDir :: FilePath
, CUBE -> [String]
inputDirs :: [FilePath]
, CUBE -> String
rootName :: FPGP.GlobPattern
, CUBE -> String
expectedSuffix :: FileSuffix
, CUBE -> String
separators :: Separators
, CUBE -> [(String, String)]
associatedNames :: [ (String, FileSuffix) ]
, CUBE -> [ParameterPattern]
validParams :: [ParameterPattern]
, CUBE
-> forall (m :: * -> *).
MonadIO m =>
CUBE -> [Sweets] -> m [Sweets]
sweetAdjuster :: forall m . MonadIO m => CUBE -> [Sweets] -> m [Sweets]
}
instance Show CUBE where
show :: CUBE -> String
show CUBE
c = [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [Maybe String] -> [String]
forall a. [Maybe a] -> [a]
catMaybes
[ String -> Maybe String
forall a. a -> Maybe a
Just String
"CUBE { "
, let i :: String
i = CUBE -> String
inputDir CUBE
c in if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
i then Maybe String
forall a. Maybe a
Nothing
else String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"inputDir=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> ShowS
forall a. Show a => a -> String
show String
i String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" {# DEPRECATED #}, "
, if Bool -> Bool
not (String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (String -> Bool) -> String -> Bool
forall a b. (a -> b) -> a -> b
$ CUBE -> String
inputDir CUBE
c) Bool -> Bool -> Bool
&& [String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (CUBE -> [String]
inputDirs CUBE
c) then Maybe String
forall a. Maybe a
Nothing
else String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"inputDirs=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> [String] -> String
forall a. Show a => a -> String
show (CUBE -> [String]
inputDirs CUBE
c) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
", "
, String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"rootName=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> ShowS
forall a. Show a => a -> String
show (CUBE -> String
rootName CUBE
c)
, String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"expectedSuffix=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> ShowS
forall a. Show a => a -> String
show (CUBE -> String
expectedSuffix CUBE
c)
, String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"separators=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> ShowS
forall a. Show a => a -> String
show (CUBE -> String
separators CUBE
c)
, String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"associatedNames=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> [(String, String)] -> String
forall a. Show a => a -> String
show (CUBE -> [(String, String)]
associatedNames CUBE
c)
, String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"validParams=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> [ParameterPattern] -> String
forall a. Show a => a -> String
show (CUBE -> [ParameterPattern]
validParams CUBE
c)
, String -> Maybe String
forall a. a -> Maybe a
Just String
"}"
]
{-# DEPRECATED inputDir "Use inputDirs instead" #-}
type ParameterPattern = (String, Maybe [String])
type Separators = String
mkCUBE :: CUBE
mkCUBE :: CUBE
mkCUBE = CUBE { inputDirs :: [String]
inputDirs = [String
"test/samples"]
, inputDir :: String
inputDir = String
""
, separators :: String
separators = String
".-"
, rootName :: String
rootName = String
"*"
, associatedNames :: [(String, String)]
associatedNames = []
, expectedSuffix :: String
expectedSuffix = String
"exp"
, validParams :: [ParameterPattern]
validParams = []
, sweetAdjuster :: forall (m :: * -> *). MonadIO m => CUBE -> [Sweets] -> m [Sweets]
sweetAdjuster = ([Sweets] -> m [Sweets]) -> CUBE -> [Sweets] -> m [Sweets]
forall a b. a -> b -> a
const [Sweets] -> m [Sweets]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
}
instance Pretty CUBE where
pretty :: forall ann. CUBE -> Doc ann
pretty CUBE
cube =
let assoc :: Maybe (Doc ann)
assoc = [(String, String)] -> Maybe (Doc ann)
forall ann. [(String, String)] -> Maybe (Doc ann)
prettyAssocNames ([(String, String)] -> Maybe (Doc ann))
-> [(String, String)] -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ CUBE -> [(String, String)]
associatedNames CUBE
cube
parms :: Maybe (Doc ann)
parms = [ParameterPattern] -> Maybe (Doc ann)
forall ann. [ParameterPattern] -> Maybe (Doc ann)
prettyParamPatterns ([ParameterPattern] -> Maybe (Doc ann))
-> [ParameterPattern] -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ CUBE -> [ParameterPattern]
validParams CUBE
cube
hdrs :: [Doc ann]
hdrs = [ Doc ann
"input dirs: "
Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [String] -> Doc ann
forall ann. [String] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([String] -> [String]
forall a. Eq a => [a] -> [a]
L.nub ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CUBE -> String
inputDir CUBE
cube String -> [String] -> [String]
forall a. a -> [a] -> [a]
: CUBE -> [String]
inputDirs CUBE
cube)
, Doc ann
"rootName: " Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (CUBE -> String
rootName CUBE
cube)
, Doc ann
"expected: " Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+>
Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc ann) -> String -> Doc ann
forall a b. (a -> b) -> a -> b
$ CUBE -> String
separators CUBE
cube) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>
String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (CUBE -> String
expectedSuffix CUBE
cube)
]
in Doc ann
"Sugar.CUBE" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> (Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
1 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann]
forall {ann}. [Doc ann]
hdrs [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Maybe (Doc ann)] -> [Doc ann]
forall a. [Maybe a] -> [a]
catMaybes [Maybe (Doc ann)
forall {ann}. Maybe (Doc ann)
assoc, Maybe (Doc ann)
forall {ann}. Maybe (Doc ann)
parms])
prettyAssocNames :: [(String, String)] -> Maybe (Doc ann)
prettyAssocNames :: forall ann. [(String, String)] -> Maybe (Doc ann)
prettyAssocNames = \case
[] -> Maybe (Doc ann)
forall a. Maybe a
Nothing
[(String, String)]
nms -> Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Doc ann
"associated:" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> (Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
1 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ ((String, String) -> Doc ann) -> [(String, String)] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ((String, String) -> Doc ann
forall ann. (String, String) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ((String, String) -> Doc ann)
-> ((String, String) -> (String, String))
-> (String, String)
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS -> (String, String) -> (String, String)
forall a b. (a -> b) -> (String, a) -> (String, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ShowS
forall a. Show a => a -> String
show) [(String, String)]
nms)
prettyParamPatterns :: [ParameterPattern] -> Maybe (Doc ann)
prettyParamPatterns :: forall ann. [ParameterPattern] -> Maybe (Doc ann)
prettyParamPatterns = \case
[] -> Maybe (Doc ann)
forall a. Maybe a
Nothing
[ParameterPattern]
prms -> Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Doc ann
"params:" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>
(let pp :: (a, Maybe [a]) -> Doc ann
pp (a
pn,Maybe [a]
mpv) =
a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
pn Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
equals Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+>
case Maybe [a]
mpv of
Maybe [a]
Nothing -> Doc ann
"*"
Just [a]
vl -> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$
Doc ann -> [Doc ann] -> [Doc ann]
forall a. a -> [a] -> [a]
L.intersperse Doc ann
forall ann. Doc ann
pipe ([Doc ann] -> [Doc ann]) -> [Doc ann] -> [Doc ann]
forall a b. (a -> b) -> a -> b
$
(a -> Doc ann) -> [a] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [a]
vl
in Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
1 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ (ParameterPattern -> Doc ann) -> [ParameterPattern] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ParameterPattern -> Doc ann
forall {a} {a} {ann}.
(Pretty a, Pretty a) =>
(a, Maybe [a]) -> Doc ann
pp [ParameterPattern]
prms)
data CandidateFile = CandidateFile
{
CandidateFile -> String
candidateDir :: FilePath
, CandidateFile -> [String]
candidateSubdirs :: [ FilePath ]
, CandidateFile -> String
candidateFile :: FilePath
, CandidateFile -> [NamedParamMatch]
candidatePMatch :: [NamedParamMatch]
, CandidateFile -> Natural
candidateMatchIdx :: Natural
}
deriving (CandidateFile -> CandidateFile -> Bool
(CandidateFile -> CandidateFile -> Bool)
-> (CandidateFile -> CandidateFile -> Bool) -> Eq CandidateFile
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CandidateFile -> CandidateFile -> Bool
== :: CandidateFile -> CandidateFile -> Bool
$c/= :: CandidateFile -> CandidateFile -> Bool
/= :: CandidateFile -> CandidateFile -> Bool
Eq, Int -> CandidateFile -> ShowS
[CandidateFile] -> ShowS
CandidateFile -> String
(Int -> CandidateFile -> ShowS)
-> (CandidateFile -> String)
-> ([CandidateFile] -> ShowS)
-> Show CandidateFile
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CandidateFile -> ShowS
showsPrec :: Int -> CandidateFile -> ShowS
$cshow :: CandidateFile -> String
show :: CandidateFile -> String
$cshowList :: [CandidateFile] -> ShowS
showList :: [CandidateFile] -> ShowS
Show)
data Sweets = Sweets
{ Sweets -> String
rootBaseName :: String
, Sweets -> String
rootMatchName :: String
, Sweets -> String
rootFile :: FilePath
, Sweets -> [ParameterPattern]
cubeParams :: [ParameterPattern]
, Sweets -> [Expectation]
expected :: [Expectation]
}
deriving (Int -> Sweets -> ShowS
[Sweets] -> ShowS
Sweets -> String
(Int -> Sweets -> ShowS)
-> (Sweets -> String) -> ([Sweets] -> ShowS) -> Show Sweets
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Sweets -> ShowS
showsPrec :: Int -> Sweets -> ShowS
$cshow :: Sweets -> String
show :: Sweets -> String
$cshowList :: [Sweets] -> ShowS
showList :: [Sweets] -> ShowS
Show, Sweets -> Sweets -> Bool
(Sweets -> Sweets -> Bool)
-> (Sweets -> Sweets -> Bool) -> Eq Sweets
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Sweets -> Sweets -> Bool
== :: Sweets -> Sweets -> Bool
$c/= :: Sweets -> Sweets -> Bool
/= :: Sweets -> Sweets -> Bool
Eq)
instance Pretty Sweets where
pretty :: forall ann. Sweets -> Doc ann
pretty Sweets
inp = Doc ann
"Sweet" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+>
(Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Maybe (Doc ann)] -> [Doc ann]
forall a. [Maybe a] -> [a]
catMaybes
[ Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Sweets -> String
rootMatchName Sweets
inp)
, Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Doc ann
"root:" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+>
Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [ String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Sweets -> String
rootBaseName Sweets
inp)
, String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Sweets -> String
rootFile Sweets
inp)
])
, [ParameterPattern] -> Maybe (Doc ann)
forall ann. [ParameterPattern] -> Maybe (Doc ann)
prettyParamPatterns ([ParameterPattern] -> Maybe (Doc ann))
-> [ParameterPattern] -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Sweets -> [ParameterPattern]
cubeParams Sweets
inp
, Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ (Expectation -> Doc ann) -> [Expectation] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Expectation -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Expectation -> Doc ann
pretty ([Expectation] -> [Doc ann]) -> [Expectation] -> [Doc ann]
forall a b. (a -> b) -> a -> b
$ Sweets -> [Expectation]
expected Sweets
inp
])
type Association = (String, FilePath)
type NamedParamMatch = (String, ParamMatch)
data Expectation = Expectation
{ Expectation -> String
expectedFile :: FilePath
, Expectation -> [NamedParamMatch]
expParamsMatch :: [ NamedParamMatch ]
, Expectation -> [(String, String)]
associated :: [ Association ]
}
deriving Int -> Expectation -> ShowS
[Expectation] -> ShowS
Expectation -> String
(Int -> Expectation -> ShowS)
-> (Expectation -> String)
-> ([Expectation] -> ShowS)
-> Show Expectation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Expectation -> ShowS
showsPrec :: Int -> Expectation -> ShowS
$cshow :: Expectation -> String
show :: Expectation -> String
$cshowList :: [Expectation] -> ShowS
showList :: [Expectation] -> ShowS
Show
instance Eq Expectation where
Expectation
e1 == :: Expectation -> Expectation -> Bool
== Expectation
e2 = let bagCmp :: [a] -> [a] -> Bool
bagCmp [a]
a [a]
b = ([a] -> Bool) -> [[a]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ([a]
a [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
==) ([[a]] -> Bool) -> [[a]] -> Bool
forall a b. (a -> b) -> a -> b
$ [a] -> [[a]]
forall a. [a] -> [[a]]
L.permutations [a]
b
in [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and [ Expectation -> String
expectedFile Expectation
e1 String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== Expectation -> String
expectedFile Expectation
e2
, ([NamedParamMatch] -> [NamedParamMatch] -> Bool
forall {a}. Eq a => [a] -> [a] -> Bool
bagCmp ([NamedParamMatch] -> [NamedParamMatch] -> Bool)
-> (Expectation -> [NamedParamMatch])
-> Expectation
-> Expectation
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Expectation -> [NamedParamMatch]
expParamsMatch) Expectation
e1 Expectation
e2
, ([(String, String)] -> [(String, String)] -> Bool
forall {a}. Eq a => [a] -> [a] -> Bool
bagCmp ([(String, String)] -> [(String, String)] -> Bool)
-> (Expectation -> [(String, String)])
-> Expectation
-> Expectation
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Expectation -> [(String, String)]
associated) Expectation
e1 Expectation
e2
]
instance Ord Expectation where
Expectation
e1 compare :: Expectation -> Expectation -> Ordering
`compare` Expectation
e2 = Expectation -> String
expectedFile Expectation
e1 String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` Expectation -> String
expectedFile Expectation
e2
Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> ([NamedParamMatch] -> [NamedParamMatch] -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ([NamedParamMatch] -> [NamedParamMatch] -> Ordering)
-> (Expectation -> [NamedParamMatch])
-> Expectation
-> Expectation
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` [NamedParamMatch] -> [NamedParamMatch]
forall a. Ord a => [a] -> [a]
L.sort ([NamedParamMatch] -> [NamedParamMatch])
-> (Expectation -> [NamedParamMatch])
-> Expectation
-> [NamedParamMatch]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expectation -> [NamedParamMatch]
expParamsMatch) Expectation
e1 Expectation
e2
Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> ([(String, String)] -> [(String, String)] -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ([(String, String)] -> [(String, String)] -> Ordering)
-> (Expectation -> [(String, String)])
-> Expectation
-> Expectation
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` [(String, String)] -> [(String, String)]
forall a. Ord a => [a] -> [a]
L.sort ([(String, String)] -> [(String, String)])
-> (Expectation -> [(String, String)])
-> Expectation
-> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expectation -> [(String, String)]
associated) Expectation
e1 Expectation
e2
instance Pretty Expectation where
pretty :: forall ann. Expectation -> Doc ann
pretty Expectation
exp =
let p :: [NamedParamMatch]
p = Expectation -> [NamedParamMatch]
expParamsMatch Expectation
exp
pp :: Maybe (Doc ann)
pp = if [NamedParamMatch] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [NamedParamMatch]
p
then Maybe (Doc ann)
forall a. Maybe a
Nothing
else Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Doc ann
"Matched Params:" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ (NamedParamMatch -> Doc ann) -> [NamedParamMatch] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map NamedParamMatch -> Doc ann
forall {a} {a} {ann}. (Pretty a, Pretty a) => (a, a) -> Doc ann
ppp [NamedParamMatch]
p)
ppp :: (a, a) -> Doc ann
ppp (a
n,a
v) = a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
equals Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
v
a :: [(String, String)]
a = Expectation -> [(String, String)]
associated Expectation
exp
pa :: Maybe (Doc ann)
pa = if [(String, String)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(String, String)]
a
then Maybe (Doc ann)
forall a. Maybe a
Nothing
else Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Doc ann
"Associated:" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ ((String, String) -> Doc ann) -> [(String, String)] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map (String, String) -> Doc ann
forall ann. (String, String) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [(String, String)]
a)
in Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
hang Int
4 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Maybe (Doc ann)] -> [Doc ann]
forall a. [Maybe a] -> [a]
catMaybes
[ Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Doc ann
"Expected: " Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Expectation -> String
expectedFile Expectation
exp))
, Maybe (Doc ann)
forall {ann}. Maybe (Doc ann)
pp
, Maybe (Doc ann)
forall {ann}. Maybe (Doc ann)
pa
]
data ParamMatch =
NotSpecified
| Assumed String
| Explicit String
deriving (Int -> ParamMatch -> ShowS
[ParamMatch] -> ShowS
ParamMatch -> String
(Int -> ParamMatch -> ShowS)
-> (ParamMatch -> String)
-> ([ParamMatch] -> ShowS)
-> Show ParamMatch
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ParamMatch -> ShowS
showsPrec :: Int -> ParamMatch -> ShowS
$cshow :: ParamMatch -> String
show :: ParamMatch -> String
$cshowList :: [ParamMatch] -> ShowS
showList :: [ParamMatch] -> ShowS
Show, ParamMatch -> ParamMatch -> Bool
(ParamMatch -> ParamMatch -> Bool)
-> (ParamMatch -> ParamMatch -> Bool) -> Eq ParamMatch
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ParamMatch -> ParamMatch -> Bool
== :: ParamMatch -> ParamMatch -> Bool
$c/= :: ParamMatch -> ParamMatch -> Bool
/= :: ParamMatch -> ParamMatch -> Bool
Eq, Eq ParamMatch
Eq ParamMatch =>
(ParamMatch -> ParamMatch -> Ordering)
-> (ParamMatch -> ParamMatch -> Bool)
-> (ParamMatch -> ParamMatch -> Bool)
-> (ParamMatch -> ParamMatch -> Bool)
-> (ParamMatch -> ParamMatch -> Bool)
-> (ParamMatch -> ParamMatch -> ParamMatch)
-> (ParamMatch -> ParamMatch -> ParamMatch)
-> Ord ParamMatch
ParamMatch -> ParamMatch -> Bool
ParamMatch -> ParamMatch -> Ordering
ParamMatch -> ParamMatch -> ParamMatch
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ParamMatch -> ParamMatch -> Ordering
compare :: ParamMatch -> ParamMatch -> Ordering
$c< :: ParamMatch -> ParamMatch -> Bool
< :: ParamMatch -> ParamMatch -> Bool
$c<= :: ParamMatch -> ParamMatch -> Bool
<= :: ParamMatch -> ParamMatch -> Bool
$c> :: ParamMatch -> ParamMatch -> Bool
> :: ParamMatch -> ParamMatch -> Bool
$c>= :: ParamMatch -> ParamMatch -> Bool
>= :: ParamMatch -> ParamMatch -> Bool
$cmax :: ParamMatch -> ParamMatch -> ParamMatch
max :: ParamMatch -> ParamMatch -> ParamMatch
$cmin :: ParamMatch -> ParamMatch -> ParamMatch
min :: ParamMatch -> ParamMatch -> ParamMatch
Ord)
instance Pretty ParamMatch where
pretty :: forall ann. ParamMatch -> Doc ann
pretty (Explicit String
s) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
s
pretty (Assumed String
s) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
s
pretty ParamMatch
NotSpecified = Doc ann
"*"
paramMatchVal :: String -> ParamMatch -> Bool
paramMatchVal :: String -> ParamMatch -> Bool
paramMatchVal String
v (Explicit String
s) = String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
v
paramMatchVal String
v (Assumed String
s) = String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
v
paramMatchVal String
_ ParamMatch
NotSpecified = Bool
True
isExplicit :: ParamMatch -> Bool
isExplicit :: ParamMatch -> Bool
isExplicit = \case
Explicit String
_ -> Bool
True
ParamMatch
_ -> Bool
False
getExplicit :: ParamMatch -> Maybe String
getExplicit :: ParamMatch -> Maybe String
getExplicit (Explicit String
v) = String -> Maybe String
forall a. a -> Maybe a
Just String
v
getExplicit ParamMatch
_ = Maybe String
forall a. Maybe a
Nothing
getParamVal :: ParamMatch -> Maybe String
getParamVal :: ParamMatch -> Maybe String
getParamVal (Explicit String
v) = String -> Maybe String
forall a. a -> Maybe a
Just String
v
getParamVal (Assumed String
v) = String -> Maybe String
forall a. a -> Maybe a
Just String
v
getParamVal ParamMatch
_ = Maybe String
forall a. Maybe a
Nothing
matchStrength :: [ParamMatch] -> Natural
matchStrength :: [ParamMatch] -> Natural
matchStrength = \case
[] -> Natural
0
(ParamMatch
NotSpecified : [ParamMatch]
ps) -> [ParamMatch] -> Natural
matchStrength [ParamMatch]
ps
((Explicit String
_) : [ParamMatch]
ps) -> Natural
1 Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
+ [ParamMatch] -> Natural
matchStrength [ParamMatch]
ps
((Assumed String
_) : [ParamMatch]
ps) -> Natural
1 Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
+ [ParamMatch] -> Natural
matchStrength [ParamMatch]
ps
data SweetExplanation =
SweetExpl { SweetExplanation -> String
rootPath :: FilePath
, SweetExplanation -> String
base :: String
, SweetExplanation -> [String]
expectedNames :: [String]
, SweetExplanation -> Sweets
results :: Sweets
}
instance Pretty SweetExplanation where
pretty :: forall ann. SweetExplanation -> Doc ann
pretty SweetExplanation
expl =
let nms :: [String]
nms = SweetExplanation -> [String]
expectedNames SweetExplanation
expl
in Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Maybe (Doc ann)] -> [Doc ann]
forall a. [Maybe a] -> [a]
catMaybes [
Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
fillSep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
","
[ Doc ann
"rootPath" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
dquotes (String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc ann) -> String -> Doc ann
forall a b. (a -> b) -> a -> b
$ SweetExplanation -> String
rootPath SweetExplanation
expl)
, Doc ann
"base" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
dquotes (String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc ann) -> String -> Doc ann
forall a b. (a -> b) -> a -> b
$ SweetExplanation -> String
base SweetExplanation
expl)
, if [String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
nms
then Doc ann
"no matches"
else (Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Int -> Doc ann) -> Int -> Doc ann
forall a b. (a -> b) -> a -> b
$ [String] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
nms) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"possible matches"
]
, if [String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
nms
then Maybe (Doc ann)
forall a. Maybe a
Nothing
else Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
8 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ (String -> Doc ann) -> [String] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [String]
nms
, Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann -> Maybe (Doc ann)) -> Doc ann -> Maybe (Doc ann)
forall a b. (a -> b) -> a -> b
$ Sweets -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Sweets -> Doc ann
pretty (Sweets -> Doc ann) -> Sweets -> Doc ann
forall a b. (a -> b) -> a -> b
$ SweetExplanation -> Sweets
results SweetExplanation
expl
]