module Main where
import Test.HUnit
import Text.Printf (printf)
import Language.Java.Lexer
import qualified LexerQCTest as LQCT
data LexerTest = LexerTest
String -- given input
[Token] -- expected result
lexerTests :: [LexerTest]
lexerTests = concat [
integerTests 0
, integerTests 1
, integerTests 23
, integerTests 52
, [ LexerTest "\"\\\\\" \"\""
[StringTok "\\", StringTok ""] ]
, blockCommentTests
]
-- | Generates integer lexing tests using decimal, octal, and
-- hexadecimal representations of @int@ and @long@ literals.
integerTests :: Integer -> [LexerTest]
integerTests expectedValue =
concat [ intAndLongs decimalRep,
intAndLongs octalRep,
intAndLongs hexRep ]
where intAndLongs rep = [ LexerTest rep [intToken],
LexerTest (rep ++ "l") [longToken],
LexerTest (rep ++ "L") [longToken] ]
decimalRep = printf "%d" expectedValue
octalRep = printf "0%o" expectedValue
hexRep = printf "0x%x" expectedValue
intToken = IntTok expectedValue
longToken = LongTok expectedValue
blockCommentTests :: [LexerTest]
blockCommentTests =
map mkTest [ "",
"*",
"**",
"***",
"** / ***",
"*\n/ ***\n /**"]
where mkTest commentBody =
LexerTest (comment ++ "class" ++ comment) [KW_Class]
where comment = "/*" ++ commentBody ++ "*/"
main :: IO ()
main = do
_ <- runTestTT $ TestList $ map lexerTestToTest lexerTests
LQCT.run
return ();
where
lexerTestToTest (LexerTest input expected) = TestCase $ do
let result = [ x | L _ x <- lexer input ]
assertEqual input expected result