1
Fork 0
simple-sql-parser/tools/Language/SQL/SimpleSQL/LexerTests.lhs

155 lines
5.7 KiB
Plaintext
Raw Normal View History

2015-07-31 23:04:18 +02:00
Test for the lexer
> module Language.SQL.SimpleSQL.LexerTests (lexerTests) where
> import Language.SQL.SimpleSQL.TestTypes
> import Language.SQL.SimpleSQL.Lex (Token(..))
2015-07-31 23:04:18 +02:00
> --import Debug.Trace
> import Data.Char (isAlpha)
2015-07-31 23:04:18 +02:00
> ansiLexerTable :: [(String,[Token])]
> ansiLexerTable =
2015-07-31 23:04:18 +02:00
> -- single char symbols
> map (\s -> ([s],[Symbol [s]])) "+-^*/%~&|?<>[]=,;()"
> -- multi char symbols
> ++ map (\s -> (s,[Symbol s])) [">=","<=","!=","<>","||"]
> ++ (let idens = ["a", "_a", "test", "table", "Stuff", "STUFF"]
> -- simple identifiers
> in map (\i -> (i, [Identifier i])) idens
> ++ map (\i -> ("\"" ++ i ++ "\"", [QuotedIdentifier "\"" "\"" i])) idens
2015-07-31 23:04:18 +02:00
> -- todo: in order to make lex . pretty id, need to
> -- preserve the case of the u
> ++ map (\i -> ("u&\"" ++ i ++ "\"", [QuotedIdentifier "u&\"" "\"" i])) idens
2015-07-31 23:04:18 +02:00
> -- host param
> ++ map (\i -> (':':i, [HostParam i])) idens
> )
> -- quoted identifiers with embedded double quotes
> ++ [("\"normal \"\" iden\"", [QuotedIdentifier "\"" "\"" "normal \" iden"])]
2015-07-31 23:04:18 +02:00
> -- strings
> ++ [("'string'", [SqlString "'" "'" "string"])
> ,("'normal '' quote'", [SqlString "'" "'" "normal ' quote"])
> ,("'normalendquote '''", [SqlString "'" "'" "normalendquote '"])]
2015-07-31 23:04:18 +02:00
> -- csstrings
> ++ map (\c -> (c ++ "'test'", [SqlString (c ++ "'") "'" "test"]))
2015-07-31 23:04:18 +02:00
> ["n", "N","b", "B","x", "X", "u&"]
> -- numbers
> ++ [("10", [SqlNumber "10"])
> ,(".1", [SqlNumber ".1"])
> ,("5e3", [SqlNumber "5e3"])
> ,("5e+3", [SqlNumber "5e+3"])
> ,("5e-3", [SqlNumber "5e-3"])
> ,("10.2", [SqlNumber "10.2"])
> ,("10.2e7", [SqlNumber "10.2e7"])]
> -- whitespace
> ++ concat [[([a],[Whitespace [a]])
> ,([a,b], [Whitespace [a,b]])]
> | a <- " \n\t", b <- " \n\t"]
> -- line comment
> ++ map (\c -> (c, [LineComment c]))
2015-08-02 14:58:09 +02:00
> ["--", "-- ", "-- this is a comment", "-- line com\n"]
2015-07-31 23:04:18 +02:00
> -- block comment
> ++ map (\c -> (c, [BlockComment c]))
> ["/**/", "/* */","/* this is a comment */"
> ,"/* this *is/ a comment */"
2015-07-31 23:04:18 +02:00
> ]
> lexerTests :: TestItem
> lexerTests = Group "lexerTests" $
> [Group "lexer token tests" [ansiLexerTests]]
> ansiLexerTests :: TestItem
> ansiLexerTests = Group "ansiLexerTests" $
> [Group "ansi lexer token tests" $ [LexerTest ansi2011 s t | (s,t) <- ansiLexerTable]
> ,Group "ansi generated combination lexer tests" $
> [ LexerTest ansi2011 (s ++ s1) (t ++ t1)
> | (s,t) <- ansiLexerTable
> , (s1,t1) <- ansiLexerTable
2015-07-31 23:04:18 +02:00
which combinations won't work:
<> <= >= || two single symbols which make a double char symbol
identifier + identifier if both are quoted or unquoted
string string
csstring string
line comment anything (can add newline?)
number number (todo: double check more carefully)
> , isGood $ t ++ t1
> ]
> ,Group "adhoc lexer tests" $
> map (uncurry $ LexerTest ansi2011)
2015-07-31 23:04:18 +02:00
> [("", [])
> ,("-- line com\nstuff", [LineComment "-- line com\n",Identifier "stuff"])
2015-07-31 23:04:18 +02:00
> ]
> ]
2015-07-31 23:04:18 +02:00
> where
> isGood :: [Token] -> Bool
> isGood l = {-let b =-} and $ map not [p l | p <- map listPred badCombos]
> -- in trace ("isGood " ++ show (l,b)) b
> badCombos :: [((Token -> Bool),(Token -> Bool))]
> badCombos = [symbolPair "<" ">"
> ,symbolPair "<" "="
> ,symbolPair ">" "="
> ,symbolPair "!" "="
> ,symbolPair "|" "|"
> ,symbolPair "||" "|"
> ,symbolPair "|" "||"
> ,symbolPair "||" "||"
> ,symbolPair "<" ">="
> ,symbolPair "-" "-"
> ,symbolPair "/" "*"
> ,symbolPair "*" "/"
> ,(isIdentifier, isIdentifier)
> ,(isDQIdentifier, isDQIdentifier)
> ,(isCQIdentifier, isDQIdentifier)
> ,(isString, isNonCsString)
2015-08-02 14:58:09 +02:00
> ,(isEofLineComment, const True)
2015-07-31 23:04:18 +02:00
> ,(isNumber, isNumber)
> ,(isHostParam,isIdentifier)
> ,(isHostParam,isCsString)
> ,(isHostParam,isCQIdentifier)
2015-07-31 23:04:18 +02:00
> ,(isIdentifier,isCsString)
> ,(isIdentifier,isCQIdentifier)
2015-07-31 23:04:18 +02:00
> ,(isWhitespace, isWhitespace)
> ,(isIdentifier, isNumber)
> ,(isHostParam, isNumber)
> ,(isMinus, isLineComment)
> ]
> isIdentifier (Identifier _) = True
> isIdentifier _ = False
> isDQIdentifier (QuotedIdentifier "\"" _ _) = True
> isDQIdentifier _ = False
> isCQIdentifier (QuotedIdentifier (x:_) _ _) | isAlpha x = True
> isCQIdentifier _ = False
> isCsString (SqlString (x:_) _ _) | isAlpha x = True
2015-07-31 23:04:18 +02:00
> isCsString _ = False
> isString (SqlString _ _ _) = True
> isString _ = False
> isNonCsString (SqlString [] _ _) = True
> isNonCsString (SqlString (x:_) _ _) | not (isAlpha x) = True
> isNonCsString _ = False
2015-08-02 14:58:09 +02:00
> isEofLineComment (LineComment s) = last s /= '\n'
> isEofLineComment _ = False
> isLineComment (LineComment {}) = True
2015-07-31 23:04:18 +02:00
> isLineComment _ = False
> isNumber (SqlNumber{}) = True
> isNumber _ = False
> isHostParam (HostParam{}) = True
> isHostParam _ = False
> isWhitespace (Whitespace{}) = True
> isWhitespace _ = False
> isMinus (Symbol "-") = True
> isMinus _ = False
> symbolPair a b = ((==Symbol a), (==Symbol b))
> listPred :: ((Token -> Bool),(Token -> Bool)) -> [Token] -> Bool
> listPred _ [] = False
> listPred _ [_] = False
> listPred (p,p1) (t:t1:ts) | p t && p1 t1 = True
> | otherwise = listPred (p,p1) (t1:ts)