{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Data.Char (toUpper)
import QQ
import System.Exit (exitFailure, exitSuccess)
test :: String -> String -> IO Bool
test actual expected = do
putStrLn $ "-- Expecting: \"" <> expected <> "\""
putStrLn actual
if expected == actual
then do
putStrLn "-- ^ Test passed.\n"
return True
else do
putStrLn "-- ^ ERROR: NOT EQUAL!\n"
return False
runTests :: [(String, String)] -> IO ()
runTests tests = do
results <- mapM (uncurry test) tests
if and results
then exitSuccess
else exitFailure
main :: IO ()
main = do
runTests
[ ( [itest|Escaped dollar sign: \$|],
"Escaped dollar sign: $"
),
( [itest|Quoted expression containing an escaped closing brace evaluating to: ${case () of {() -> map toUpper ("hello world" ++ ['!'])}}|],
"Quoted expression containing an escaped closing brace evaluating to: HELLO WORLD!"
),
( [itest|Quoted expressions evaluating to: ${map toUpper "hello"} and ++{41 :: Int}|],
"Quoted expressions evaluating to: HELLO and 42"
),
let x = 42.3 :: Double
in ( [iManyBrackets|$<"<" <> "<" <> ">" <> ['>'] <> "<>>"> $(3 * (x - 6) + read "(7)") [[1, 2 ..] :: [Int]] {"hello"}|],
"<<>><>> " ++ show (3 * (x - 6) + 7) ++ " [1,2,3,4] HELLO"
),
-- readme examples
( [i|2^10 = {show (2 ^ 10)}. Some Fibonacci numbers: @{let x = (\fibs -> 1 : 1 : zipWith (+) fibs (tail fibs)) x in x}.|],
"2^10 = 1024. Some Fibonacci numbers: [1,1,2,3,5,8,13,21,34,55]."
),
( show [sql|SELECT * FROM user WHERE id = {(11 ^ 5)} AND lastName = {"Smith"}|],
"(\"SELECT * FROM user WHERE id = ? AND lastName = ?\",[161051,\"Smith\"])"
)
]