{-# LANGUAGE CPP, DeriveDataTypeable #-}
module Test.Tasty.Patterns
( TestPattern(..)
, parseTestPattern
, noPattern
, testPatternMatches
) where
import Test.Tasty.Options
import Test.Tasty.Patterns.Types
import Test.Tasty.Patterns.Parser
import Test.Tasty.Patterns.Eval
import Data.Monoid
import Data.Char
import qualified Data.Sequence as Seq
import Data.Typeable
import Options.Applicative hiding (Success)
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")
parseTestPattern :: String -> Maybe TestPattern
parseTestPattern s
| null s = Just noPattern
| all (\c -> isAlphaNum c || c `elem` "._- ") s =
Just . TestPattern . Just $ ERE s
| otherwise = TestPattern . Just <$> parseAwkExpr s
testPatternMatches :: TestPattern -> Seq.Seq String -> Bool
testPatternMatches pat fields =
case pat of
TestPattern Nothing -> True
TestPattern (Just e) ->
case withFields fields $ asB =<< eval e of
Left msg -> error msg
Right b -> b