{-# LANGUAGE CPP, DeriveDataTypeable #-}
module Test.Tasty.Patterns
( TestPattern(..)
, parseExpr
, parseTestPattern
, noPattern
, Path
, exprMatches
, testPatternMatches
) where
import Test.Tasty.Options
import Test.Tasty.Patterns.Types
import Test.Tasty.Patterns.Parser
import Test.Tasty.Patterns.Eval
import Data.Char
import Data.Typeable
import Options.Applicative hiding (Success)
#if !MIN_VERSION_base(4,11,0)
import Data.Monoid
#endif
newtype TestPattern = TestPattern (Maybe Expr)
deriving (Typeable, Show, Eq)
noPattern :: TestPattern
noPattern = TestPattern Nothing
instance IsOption TestPattern where
defaultValue = noPattern
parseValue = parseTestPattern
optionName = return "pattern"
optionHelp = return "Select only tests which satisfy a pattern or awk expression"
optionCLParser = mkOptionCLParser (short 'p' <> metavar "PATTERN")
parseExpr :: String -> Maybe Expr
parseExpr s
| all (\c -> isAlphaNum c || c `elem` "._- ") s =
Just $ ERE s
| otherwise = parseAwkExpr s
parseTestPattern :: String -> Maybe TestPattern
parseTestPattern s
| null s = Just noPattern
| otherwise = TestPattern . Just <$> parseExpr s
exprMatches :: Expr -> Path -> Bool
exprMatches e fields =
case withFields fields $ asB =<< eval e of
Left msg -> error msg
Right b -> b
testPatternMatches :: TestPattern -> Path -> Bool
testPatternMatches pat fields =
case pat of
TestPattern Nothing -> True
TestPattern (Just e) -> exprMatches e fields