Blame test/SimpleTest.hs

Packit 5b08af
{-# LANGUAGE RankNTypes          #-}
Packit 5b08af
{-# LANGUAGE ScopedTypeVariables #-}
Packit 5b08af
{-# LANGUAGE ViewPatterns        #-}
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
module Main
Packit 5b08af
where
Packit 5b08af
Packit 5b08af
import           Control.Arrow
Packit 5b08af
Packit 5b08af
import qualified Data.ByteString.Char8                   as B
Packit 5b08af
import qualified Data.ByteString.Lazy.Char8              as BL
Packit 5b08af
import           Data.String                             (IsString (..))
Packit 5b08af
import qualified Data.Text                               as T
Packit 5b08af
import qualified Data.Text.Lazy                          as TL
Packit 5b08af
Packit 5b08af
import           System.Exit                             (ExitCode (..),
Packit 5b08af
                                                          exitWith)
Packit 5b08af
Packit 5b08af
import           Text.Regex.XMLSchema.Generic
Packit 5b08af
import           Text.Regex.XMLSchema.Generic.Regex
Packit 5b08af
import           Text.Regex.XMLSchema.Generic.StringLike
Packit 5b08af
Packit 5b08af
import           Test.HUnit
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
newtype Test' a = Test' {unTest' :: Test}
Packit 5b08af
Packit 5b08af
type BS    = B.ByteString
Packit 5b08af
type BL    = BL.ByteString
Packit 5b08af
type Text  = T.Text
Packit 5b08af
type TextL = TL.Text
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
parseTestsStdLatin1 :: forall s . StringLike s => Test' s
Packit 5b08af
parseTestsStdLatin1 = parseTestsStd' testsLatin1
Packit 5b08af
Packit 5b08af
parseTestsStdUnicode :: forall s . StringLike s => Test' s
Packit 5b08af
parseTestsStdUnicode = parseTestsStd' testsUnicode
Packit 5b08af
Packit 5b08af
parseTestsStd' :: forall s . StringLike s => [(String, String)] -> Test' s
Packit 5b08af
parseTestsStd' tests
Packit 5b08af
    = Test' $
Packit 5b08af
      TestLabel "standard XML parse tests" $
Packit 5b08af
      TestList $
Packit 5b08af
      map parseTest $ tests
Packit 5b08af
    where
Packit 5b08af
    parseTest (re0, rep)
Packit 5b08af
        = TestCase $
Packit 5b08af
          assertEqual (show re ++ " must be parsed as " ++ show rep)
Packit 5b08af
                      rep
Packit 5b08af
                      (show . parseRegexExt $ re)
Packit 5b08af
        where
Packit 5b08af
          re :: s
Packit 5b08af
          re = fromString re0
Packit 5b08af
Packit 5b08af
testsLatin1 :: [(String, String)]
Packit 5b08af
testsLatin1
Packit 5b08af
    = [ ("",              "()")
Packit 5b08af
      , (".",             ".")
Packit 5b08af
      , (".*",            "(.*)")
Packit 5b08af
      , ("(())",          "()")
Packit 5b08af
      , ("(a*)*",         "(a*)")
Packit 5b08af
      , ("(a*)+",         "(a*)")
Packit 5b08af
      , ("(a+)*",         "(a*)")
Packit 5b08af
      , ("(a+)+",         "(a+)")
Packit 5b08af
      , ("(a?){2,}",              "(a*)")
Packit 5b08af
      , ("((a?){2,}){0,}",        "(a*)")
Packit 5b08af
      , ("((a?){2,}){3,}",        "(a*)")
Packit 5b08af
      , ("(a{0,}){2,}",           "(a*)")
Packit 5b08af
      , ("(a{2,}){3,}",           "(a{6,})")
Packit 5b08af
      , ("[9-0]",                 "{empty char range}")
Packit 5b08af
      , ("[0-9]",                 "[0-9]")
Packit 5b08af
      , ("[0-99-0]",              "[0-9]")
Packit 5b08af
      , ("[abc]",                 "[a-c]")
Packit 5b08af
      , ("[abc-[b]]",             "[ac]" )
Packit 5b08af
      , ("a|b|c|d",               "[a-d]" )
Packit 5b08af
      , ("(a|b)|c",               "[a-c]" )
Packit 5b08af
      , ("a|(b|c)",               "[a-c]" )
Packit 5b08af
      , ("abc",                   "(a(bc))"       )                               -- seq is right ass
Packit 5b08af
      , ("({1}a+)",               "({1}(a+))"     )                               -- extension: labeled subexpressions
Packit 5b08af
      , ("({1}({2}({3}a)))",      "({1}({2}({3}a)))"      )
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
testsUnicode :: [(String, String)]
Packit 5b08af
testsUnicode
Packit 5b08af
    = [ ("[\0-\1114111]",         "\\a")
Packit 5b08af
      , ("[\0-\1114111]|[0-9]",   "\\a")
Packit 5b08af
      , ("[\0-\1114110]",         "[�-􏿾]"     )
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
parseTestsExtLatin1 :: forall s . StringLike s => Test' s
Packit 5b08af
parseTestsExtLatin1 = parseTestsExt' testsExtLatin1
Packit 5b08af
Packit 5b08af
parseTestsExtUnicode :: forall s . StringLike s => Test' s
Packit 5b08af
parseTestsExtUnicode = parseTestsExt' testsExtUnicode
Packit 5b08af
Packit 5b08af
parseTestsExt' :: forall s . StringLike s => [(String, String)] -> Test' s
Packit 5b08af
parseTestsExt' tests
Packit 5b08af
    = Test' $
Packit 5b08af
      TestLabel "extended parse tests" $
Packit 5b08af
      TestList $
Packit 5b08af
      map parseTest $ tests
Packit 5b08af
    where
Packit 5b08af
    parseTest (re0, rep)
Packit 5b08af
        = TestCase $
Packit 5b08af
          assertEqual (show re ++ " must be parsed as " ++ show rep)
Packit 5b08af
                      rep
Packit 5b08af
                      (show . parseRegexExt $ re)
Packit 5b08af
        where
Packit 5b08af
          re :: s
Packit 5b08af
          re = fromString re0
Packit 5b08af
Packit 5b08af
testsExtLatin1 :: [(String, String)]
Packit 5b08af
testsExtLatin1
Packit 5b08af
    = [ ("",              "()")
Packit 5b08af
      , (".",             ".")
Packit 5b08af
      , (".*",            "(.*)")
Packit 5b08af
      , ("\\a",           "\\a")
Packit 5b08af
      , ("\\A",           "\\A")
Packit 5b08af
      , ("(())",          "()")
Packit 5b08af
      , ("(a*)*",         "(a*)")
Packit 5b08af
      , ("(a*)+",         "(a*)")
Packit 5b08af
      , ("(a+)*",         "(a*)")
Packit 5b08af
      , ("(a+)+",         "(a+)")
Packit 5b08af
      , ("(a?){2,}",              "(a*)")
Packit 5b08af
      , ("((a?){2,}){0,}",        "(a*)")
Packit 5b08af
      , ("((a?){2,}){3,}",        "(a*)")
Packit 5b08af
      , ("(a{0,}){2,}",           "(a*)")
Packit 5b08af
      , ("(a{2,}){3,}",           "(a{6,})")
Packit 5b08af
      , ("[9-0]",                 "{empty char range}")
Packit 5b08af
      , ("[0-9]",                 "[0-9]")
Packit 5b08af
      , ("[0-99-0]",              "[0-9]")
Packit 5b08af
      , ("[abc]",                 "[a-c]")
Packit 5b08af
      , ("[abc-[b]]",             "[ac]" )
Packit 5b08af
      , ("a|b|c|d",               "[a-d]" )
Packit 5b08af
      , ("(a|b)|c",               "[a-c]" )
Packit 5b08af
      , ("a|(b|c)",               "[a-c]" )
Packit 5b08af
      , ("abc",                   "(a(bc))"       )                               -- seq is right ass
Packit 5b08af
      , ("a*{^}b*",               "((a*){^}(b*))" )                               -- extension: exor
Packit 5b08af
      , ("a*{^}b*{^}c*",          "((a*){^}((b*){^}(c*)))")
Packit 5b08af
      , ("a*{&}b*",               "((a*){&}(b*))" )                               -- extension: intersection
Packit 5b08af
      , ("a*{&}b*{&}c*",          "((a*){&}((b*){&}(c*)))")
Packit 5b08af
      , ("a*{\\}b*",              "((a*){\\}(b*))"        )                       -- extension: set difference
Packit 5b08af
      , ("a*{\\}b*{\\}c*",        "(((a*){\\}(b*)){\\}(c*))"      )
Packit 5b08af
      , ("(a|b)*{\\}(.*aa.*)",    "(([ab]*){\\}((.*)(a(a(.*)))))" )
Packit 5b08af
      , ("({1}a+)",               "({1}(a+))"     )                               -- extension: labeled subexpressions
Packit 5b08af
      , ("({1}({2}({3}a)))",      "({1}({2}({3}a)))"      )
Packit 5b08af
      , ("({1}do){|}({2}[a-z]+)", "(({1}(do)){|}({2}([a-z]+)))"   )               -- deterministic choice of submatches
Packit 5b08af
      , ("a{:}b{:}c",             "(a{:}(b{:}c))" )                               -- interleave
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
testsExtUnicode :: [(String, String)]
Packit 5b08af
testsExtUnicode
Packit 5b08af
    = [ ("[\0-\1114111]",         "\\a")
Packit 5b08af
      , ("[\0-\1114111]|[0-9]",   "\\a")
Packit 5b08af
      , ("[\0-\1114110]",         "[�-􏿾]"     )
Packit 5b08af
      , ("[abc-[b]]",             "[ac]" )
Packit 5b08af
      , ("a|b|c|d",               "[a-d]" )
Packit 5b08af
      , ("(a|b)|c",               "[a-c]" )
Packit 5b08af
      , ("a|(b|c)",               "[a-c]" )
Packit 5b08af
      , ("abc",                   "(a(bc))"       )                               -- seq is right ass
Packit 5b08af
      , ("a*{^}b*",               "((a*){^}(b*))" )                               -- extension: exor
Packit 5b08af
      , ("a*{^}b*{^}c*",          "((a*){^}((b*){^}(c*)))")
Packit 5b08af
      , ("a*{&}b*",               "((a*){&}(b*))" )                               -- extension: intersection
Packit 5b08af
      , ("a*{&}b*{&}c*",          "((a*){&}((b*){&}(c*)))")
Packit 5b08af
      , ("a*{\\}b*",              "((a*){\\}(b*))"        )                       -- extension: set difference
Packit 5b08af
      , ("a*{\\}b*{\\}c*",        "(((a*){\\}(b*)){\\}(c*))"      )
Packit 5b08af
      , ("(a|b)*{\\}(.*aa.*)",    "(([ab]*){\\}((.*)(a(a(.*)))))" )
Packit 5b08af
      , ("({1}a+)",               "({1}(a+))"     )                               -- extension: labeled subexpressions
Packit 5b08af
      , ("({1}({2}({3}a)))",      "({1}({2}({3}a)))"      )
Packit 5b08af
      , ("({1}do){|}({2}[a-z]+)", "(({1}(do)){|}({2}([a-z]+)))"   )               -- deterministic choice of submatches
Packit 5b08af
      , ("a{:}b{:}c",             "(a{:}(b{:}c))" )                               -- interleave
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
simpleMatchTests :: forall a . StringLike a => Test' a
Packit 5b08af
simpleMatchTests
Packit 5b08af
    = Test' $
Packit 5b08af
      TestLabel "simple match tests" $
Packit 5b08af
      TestList $
Packit 5b08af
      concatMap matchTest $ testsMatch
Packit 5b08af
    where
Packit 5b08af
      matchTest :: (String, [String], [String]) -> [Test]
Packit 5b08af
      matchTest (re0, ok, er)
Packit 5b08af
          = map (matchOK  re . fromString) ok
Packit 5b08af
            ++
Packit 5b08af
            map (matchErr re . fromString) er
Packit 5b08af
          where
Packit 5b08af
            re :: a
Packit 5b08af
            re = fromString re0
Packit 5b08af
Packit 5b08af
      matchOK :: a -> a -> Test
Packit 5b08af
      matchOK  re xs
Packit 5b08af
          = TestCase $ assertBool (show xs ++ " must match "     ++ show re)      (matchExt re xs)
Packit 5b08af
      matchErr re xs
Packit 5b08af
          = TestCase $ assertBool (show xs ++ " must not match " ++ show re) (not (matchExt re xs))
Packit 5b08af
Packit 5b08af
testsMatch :: [(String, [String], [String])]
Packit 5b08af
testsMatch
Packit 5b08af
    = [ ( ""
Packit 5b08af
        , [""]
Packit 5b08af
        , ["a"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a"
Packit 5b08af
        , ["a"]
Packit 5b08af
        , ["", "b", "ab"]
Packit 5b08af
        )
Packit 5b08af
      , ( "()"
Packit 5b08af
        , [""]
Packit 5b08af
        , ["a"]
Packit 5b08af
        )
Packit 5b08af
      , ( "ab"
Packit 5b08af
        , ["ab"]
Packit 5b08af
        , ["", "b", "abc"]
Packit 5b08af
        )
Packit 5b08af
      , ( "."
Packit 5b08af
        , [".","a","\0","\1114111"]
Packit 5b08af
        , ["\n","\r","",".."]
Packit 5b08af
        )
Packit 5b08af
      , ( "\\a"
Packit 5b08af
        , [".","a","\n","\r","\0","\1114111"]
Packit 5b08af
        , ["",".."]
Packit 5b08af
        )
Packit 5b08af
      , ( "\\A"
Packit 5b08af
        , ["",".","a","\n","\r","\0","\1114111",".."]
Packit 5b08af
        , []
Packit 5b08af
        )
Packit 5b08af
      , ( "a*"
Packit 5b08af
        , ["", "a", "aa"]
Packit 5b08af
        , ["b", "ab", "aab"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a+"
Packit 5b08af
        , ["a", "aa", "aaa"]
Packit 5b08af
        , ["", "b", "ab"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a?"
Packit 5b08af
        , ["", "a"]
Packit 5b08af
        , ["b", "ab"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a{2}"
Packit 5b08af
        , ["aa"]
Packit 5b08af
        , ["", "a", "aaa"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a{2,}"
Packit 5b08af
        , ["aa","aaa"]
Packit 5b08af
        , ["", "a", "aaab"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a{2,4}"
Packit 5b08af
        , ["aa", "aaa", "aaaa"]
Packit 5b08af
        , ["", "a", "aaaaa", "ab"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a|b"
Packit 5b08af
        , ["a", "b"]
Packit 5b08af
        , ["", "c", "ab", "abc"]
Packit 5b08af
        )
Packit 5b08af
      , ( "[0-9]"
Packit 5b08af
        , ["0", "5", "9"]
Packit 5b08af
        , ["", "a", "00"]
Packit 5b08af
        )
Packit 5b08af
      , ( "[^0-9]"
Packit 5b08af
        , ["a"]
Packit 5b08af
        , ["", "0", "9", "00"])
Packit 5b08af
      , ( "\32"
Packit 5b08af
        , [" "]
Packit 5b08af
        , []
Packit 5b08af
        )
Packit 5b08af
      , ( "[\0-\1114111]"
Packit 5b08af
        , ["\0","\1114111","a"]
Packit 5b08af
        , ["","aaa"]
Packit 5b08af
        )
Packit 5b08af
      , ( "[^\0-\1114111]"
Packit 5b08af
        , []
Packit 5b08af
        , ["","aaa","\0","\1114111","a"]
Packit 5b08af
        )
Packit 5b08af
      , ( ".*a.*|.*b.*|.*c.*"
Packit 5b08af
        , ["a", "abc", "acdc"]
Packit 5b08af
        , ["", "dddd"]
Packit 5b08af
        )
Packit 5b08af
      , ( ".*a.*{&}.*b.*{&}.*c.*"
Packit 5b08af
        , ["abc", "abcd", "abcabcd"]
Packit 5b08af
        , ["", "a", "bc", "acdc", "dddd"]
Packit 5b08af
        )
Packit 5b08af
      , ( ".*a.*{&}.*b.*{&}.*c.*{&}.{3}"          -- all permutations of "abc"
Packit 5b08af
        , ["abc", "acb", "bac", "bca", "cab", "cba"]
Packit 5b08af
        , ["", "a", "bc", "acd", "aaaa", "aba"]
Packit 5b08af
        )
Packit 5b08af
      , ( ".*a.*{&}.*b.*{&}.*c.*"                 -- all words containing at least 1 a, 1 b and 1 c
Packit 5b08af
        , ["abc", "acb", "bac", "bca", "cab", "cba", "abcd", "abcabc"]
Packit 5b08af
        , ["", "a", "bc", "acd", "aaaa"]
Packit 5b08af
        )
Packit 5b08af
      , ( ".*a.*{^}.*b.*"                         -- all words containing at least 1 a or 1 b but not both a's and b's
Packit 5b08af
        , ["a", "b", "ac", "bc", "aaaa", "bbb", "aacc", "ccbb", "acdc"]
Packit 5b08af
        , ["", "ab", "abc", "dddd"]
Packit 5b08af
        )
Packit 5b08af
      , ( "/[*](.*{\\}(.*[*]/.*))[*]/"            -- single line C comment of form /*...*/, but without any */ in the comment body
Packit 5b08af
                                                  -- this is the way to specify none greedy expessions
Packit 5b08af
                                                  -- if multi-line comment are required, substitute .* by \A, so newlines are allowed
Packit 5b08af
        , ["/**/","/***/","/*x*/","/*///*/"]
Packit 5b08af
        , ["", "/", "/*", "/*/", "/**/*/", "/*xxx*/xxx*/"]
Packit 5b08af
        )
Packit 5b08af
      , ( "a{:}b{:}c"
Packit 5b08af
        , ["abc", "acb", "bac", "bca", "cab", "cba"]
Packit 5b08af
        , ["", "a", "ab", "abcc", "abca", "aba"]
Packit 5b08af
        )
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
simpleSplitTests :: forall a . StringLike a => Test' a
Packit 5b08af
simpleSplitTests
Packit 5b08af
    = Test' $
Packit 5b08af
      TestLabel "simple split tests" $
Packit 5b08af
      TestList $
Packit 5b08af
      map splitTest $ testsSplit
Packit 5b08af
    where
Packit 5b08af
      splitTest (re0, inp0, tok0, rest0)
Packit 5b08af
          = TestCase $
Packit 5b08af
            assertEqual
Packit 5b08af
            ("split " ++ show re ++ " " ++ show inp0 ++ " = " ++ show (tok, rest))
Packit 5b08af
            (tok, rest)
Packit 5b08af
            (split re (fromString inp0))
Packit 5b08af
          where
Packit 5b08af
            re, tok, rest :: a
Packit 5b08af
            re   = fromString re0
Packit 5b08af
            tok  = fromString tok0
Packit 5b08af
            rest = fromString rest0
Packit 5b08af
Packit 5b08af
testsSplit :: [(String, String, String, String)]
Packit 5b08af
testsSplit
Packit 5b08af
    = [ ("",      "a",    "",   "a"    )
Packit 5b08af
      , ("a*b",   "abc",  "ab",  "c"   )
Packit 5b08af
      , ("a*",    "bc",   "",    "bc"  )
Packit 5b08af
      , ("a+",    "bc",   "",    "bc"  )
Packit 5b08af
      , ("[",     "bc",   "",    "bc"  )
Packit 5b08af
      , ("a{2}",  "aaa",  "aa",  "a"   )
Packit 5b08af
      , ("a{2,}", "aaa",  "aaa", ""    )
Packit 5b08af
      , ("a|b",   "ab",   "a",   "b"   )
Packit 5b08af
      , ("a|b*",  "bbba", "bbb", "a"   )
Packit 5b08af
      , ("abc",   "abcd", "abc", "d"   )
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
simpleTokenTests :: forall a . StringLike a => Test' a
Packit 5b08af
simpleTokenTests
Packit 5b08af
    = Test' $
Packit 5b08af
      TestLabel "simple token tests" $
Packit 5b08af
      TestList $
Packit 5b08af
      map tokenTest $ testsToken
Packit 5b08af
    where
Packit 5b08af
      tokenTest (re0, inp0, toks0)
Packit 5b08af
          = TestCase $
Packit 5b08af
            assertEqual
Packit 5b08af
            ("tokenize " ++ show re ++ " " ++ show inp ++ " = " ++ show toks)
Packit 5b08af
            toks
Packit 5b08af
            (tokenize re inp)
Packit 5b08af
          where
Packit 5b08af
            re, inp :: a
Packit 5b08af
            re   = fromString re0
Packit 5b08af
            inp  = fromString inp0
Packit 5b08af
            toks :: [a]
Packit 5b08af
            toks = map fromString toks0
Packit 5b08af
Packit 5b08af
testsToken :: [(String, String, [String])]
Packit 5b08af
testsToken
Packit 5b08af
    = [ ("",      "",     []      )
Packit 5b08af
      , ("a",     "aba",  ["a", "a"]      )
Packit 5b08af
      , ("a",     "b",    []      )
Packit 5b08af
      , ("a",     "ba",   ["a"]   )
Packit 5b08af
      , ("a*",    "a",    ["a"]   )
Packit 5b08af
      , ("a*",    "ba",   ["","a"]        )
Packit 5b08af
      , ("a*",    "aba",  ["a", "a"]      )
Packit 5b08af
      , ("a*",    "abba", ["a", "", "a"]  )
Packit 5b08af
      , ("a+",    "abba", ["a", "a"]      )
Packit 5b08af
      , ("a*b",   "abba", ["ab", "b"]     )
Packit 5b08af
      , (".*",    "a\n\nb",       ["a", "", "b"]  )
Packit 5b08af
      , (".*",    "a\n\nb\n",     ["a", "", "b"]  )
Packit 5b08af
      , ("\\w+",  "a\n\nb\n",     ["a", "b"]      )
Packit 5b08af
      , ("\\w|ab",        "aaa\n\nabc\n", ["a", "a", "a", "ab", "c"]      )
Packit 5b08af
      , ("\\w|ab",        "aaa abc",      ["a", "a", "a", "ab", "c"]      )
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
genericTest :: (forall a . StringLike a => Test' a) -> Test
Packit 5b08af
genericTest t
Packit 5b08af
    = TestList $
Packit 5b08af
      [ TestLabel "Test with 'String'"          $ unTest' (t :: Test' String)
Packit 5b08af
      , TestLabel "Test with 'Text'"            $ unTest' (t :: Test' Text)
Packit 5b08af
      , TestLabel "Test with 'Text.Lazy'"       $ unTest' (t :: Test' TextL)
Packit 5b08af
      , TestLabel "Test with 'ByteString'"      $ unTest' (t :: Test' BS)
Packit 5b08af
      , TestLabel "Test with 'ByteString.Lazy'" $ unTest' (t :: Test' BL)
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
unicodeTest :: (forall a . StringLike a => Test' a) -> Test
Packit 5b08af
unicodeTest t
Packit 5b08af
    = TestList $
Packit 5b08af
      [ TestLabel "Test with 'String'"          $ unTest' (t :: Test' String)
Packit 5b08af
      , TestLabel "Test with 'Text'"            $ unTest' (t :: Test' Text)
Packit 5b08af
      , TestLabel "Test with 'Text.Lazy'"       $ unTest' (t :: Test' TextL)
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
allTests        :: Test
Packit 5b08af
allTests
Packit 5b08af
    = TestList
Packit 5b08af
      [ genericTest parseTestsStdLatin1
Packit 5b08af
      , unicodeTest parseTestsStdUnicode
Packit 5b08af
      , genericTest parseTestsExtLatin1
Packit 5b08af
      , unicodeTest parseTestsExtUnicode
Packit 5b08af
      , genericTest simpleMatchTests
Packit 5b08af
      , genericTest simpleSplitTests
Packit 5b08af
      , genericTest simpleTokenTests
Packit 5b08af
      ]
Packit 5b08af
Packit 5b08af
main    :: IO ()
Packit 5b08af
main
Packit 5b08af
    = do
Packit 5b08af
      c <- runTestTT allTests
Packit 5b08af
      putStrLn $ show c
Packit 5b08af
      let errs = errors c
Packit 5b08af
          fails = failures c
Packit 5b08af
      exitWith (codeGet errs fails)
Packit 5b08af
Packit 5b08af
codeGet :: Int -> Int -> ExitCode
Packit 5b08af
codeGet errs fails
Packit 5b08af
    | fails > 0       = ExitFailure 2
Packit 5b08af
    | errs > 0        = ExitFailure 1
Packit 5b08af
    | otherwise       = ExitSuccess
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
deltaTrc                :: StringLike s => s -> GenRegex s -> [(s, GenRegex s)]
Packit 5b08af
deltaTrc s@(uncons -> Just (c, cs)) re
Packit 5b08af
                        =  (s,  re)
Packit 5b08af
                           :
Packit 5b08af
                           ( if isZero re'
Packit 5b08af
                             then [(emptyS,re')]
Packit 5b08af
                             else deltaTrc cs re'
Packit 5b08af
                           )
Packit 5b08af
                          where
Packit 5b08af
                          re' = delta1 c s re
Packit 5b08af
deltaTrc _        re    = [(emptyS, re)]
Packit 5b08af
Packit 5b08af
matchTrc                :: StringLike s => s -> s -> (Bool, [(s, GenRegex s)])
Packit 5b08af
matchTrc re s           = (nullable . snd . last $ res, res)
Packit 5b08af
                          where
Packit 5b08af
                            res = deltaTrc s (parseRegex re)
Packit 5b08af
Packit 5b08af
Packit 5b08af
trcMatch                :: StringLike s => s -> s -> IO()
Packit 5b08af
trcMatch re             = putStrLn . showTrc . matchTrc re
Packit 5b08af
                          where
Packit 5b08af
                          showTrc =
Packit 5b08af
                              ( (show >>> (++ "\n"))
Packit 5b08af
                                ***
Packit 5b08af
                                (concatMap ( ( (toString >>> (++ "\t"))
Packit 5b08af
                                               ***
Packit 5b08af
                                               (show >>> (++"\n"))
Packit 5b08af
                                             )
Packit 5b08af
                                             >>> uncurry (++)
Packit 5b08af
                                           )
Packit 5b08af
                                )
Packit 5b08af
                              )
Packit 5b08af
                              >>>
Packit 5b08af
                              uncurry (flip (++))
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------