import Test.Tasty import Test.Tasty.Hspec import Test.Tasty.QuickCheck import Yi.Regex import Text.Regex.TDFA.ReadRegex (parseRegex) import Text.Regex.TDFA.Pattern ignoreDoPa :: Pattern -> Pattern ignoreDoPa (PCarat dp ) = PCarat (DoPa 0) ignoreDoPa (PDollar dp ) = PDollar (DoPa 0) ignoreDoPa (PDot dp ) = PDot (DoPa 0) ignoreDoPa (PAny dp ps) = PAny (DoPa 0) ps ignoreDoPa (PAnyNot dp ps) = PAnyNot (DoPa 0) ps ignoreDoPa (PEscape dp pc) = PEscape (DoPa 0) pc ignoreDoPa (PChar dp pc) = PChar (DoPa 0) pc ignoreDoPa (PGroup m p ) = PGroup m (ignoreDoPa p) ignoreDoPa (POr l ) = POr (map ignoreDoPa l) ignoreDoPa (PConcat l ) = PConcat (map ignoreDoPa l) ignoreDoPa (PQuest p ) = PQuest (ignoreDoPa p) ignoreDoPa (PPlus p ) = PPlus (ignoreDoPa p) ignoreDoPa (PStar b p ) = PStar b (ignoreDoPa p) ignoreDoPa (PBound i m p) = PBound i m (ignoreDoPa p) ignoreDoPa (PNonCapture p) = PNonCapture (ignoreDoPa p) ignoreDoPa (PNonEmpty p) = PNonEmpty (ignoreDoPa p) ignoreDoPa p = p mapFst f (a,b) = (f a,b) main = defaultMain =<< tests tests = testSpec "(Hspec tests)" $ do describe "reversePattern" $ do it "reverses normal characters" $ (mapFst ignoreDoPa . reversePattern <$> parseRegex "ab") `shouldBe` (mapFst ignoreDoPa <$> parseRegex "ba") it "changes carat to dollar" $ (reversePattern <$> parseRegex "^") `shouldBe` parseRegex "$" it "changes dollar to carat" $ (reversePattern <$> parseRegex "$") `shouldBe` parseRegex "^" it "forms the identity when applied twice" $ property $ \p -> (reversePattern . reversePattern <$> parseRegex p) `shouldBe` parseRegex p it "recursively reverses patterns" $ (mapFst ignoreDoPa . reversePattern <$> parseRegex "foo|bar") `shouldBe` (mapFst ignoreDoPa <$> parseRegex "oof|rab")