module Main where import Instances () import Language.Lua.Lexer import Language.Lua.Parser import Language.Lua.Pretty import Language.Lua.Syntax import Language.Lua.Token import Data.Loc import Test.QuickCheck import Test.Tasty import Test.Tasty.HUnit import qualified Test.Tasty.QuickCheck as QC main :: IO () main = defaultMain $ testGroup "tests" [ lexerTests -- TODO: Make smarter shrinks and re-enable -- , parserTests ] lexerTests :: TestTree lexerTests = testGroup "lexer tests" [ stringLiteralTests , intLiteralTests , floatLiteralTests ] where stringLiteralTests :: TestTree stringLiteralTests = testCase "string literals" $ do let tk = [TkStringLit "alo\n123\""] l "\'alo\\\n123\"\'" @?= tk l "\"alo\\\n123\\\"\"" @?= tk l "\'\\97lo\\10\\04923\"\'" @?= tk l "[[alo\n123\"]]" @?= tk l "[==[\nalo\n123\"]==]" @?= tk intLiteralTests :: TestTree intLiteralTests = testCase "int literals" $ do l "3" @?= [TkIntLit "3"] l "345" @?= [TkIntLit "345"] l "0xff" @?= [TkIntLit "0xff"] l "0XBEBada" @?= [TkIntLit "0XBEBada"] floatLiteralTests :: TestTree floatLiteralTests = testCase "float literals" $ do l "3." @?= [TkFloatLit "3."] l "3.1416" @?= [TkFloatLit "3.1416"] l "3.14e-2" @?= [TkFloatLit "3.14e-2"] l "3.14E+2" @?= [TkFloatLit "3.14E+2"] l "3.14E2" @?= [TkFloatLit "3.14E2"] l "0x0.1E" @?= [TkFloatLit "0x0.1E"] l "0xA23p-4" @?= [TkFloatLit "0xA23p-4"] l "0X1.92P+1" @?= [TkFloatLit "0X1.92P+1"] l "0X1.92p1" @?= [TkFloatLit "0X1.92p1"] l :: String -> [Token] l = map unLoc . streamToList . runLexer luaLexer "" parserTests :: TestTree parserTests = QC.testProperty "Pretty-printer round-trip" (\luaAst -> luaFromString (luaToString luaAst) == Just luaAst) luaToString :: Chunk () -> String luaToString c = displayS (renderPretty 1.0 80 (pretty c)) "" luaFromString :: String -> Maybe (Chunk ()) luaFromString s = either (const Nothing) Just (streamToEitherList (runLexer luaLexer "" s)) >>= \tks -> case fullParses (parser luaChunk tks) of ([c], _) -> Just (() <$ c) _ -> Nothing