|
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 |
-- ------------------------------------------------------------
|