module Graphics.QML.Test.Harness where
import Graphics.QML.Test.Framework
import Test.QuickCheck
import Test.QuickCheck.Monadic
import Test.QuickCheck.Test
import Graphics.QML
import Data.IORef
import Data.Proxy
import Data.Typeable
import Data.Maybe
import System.IO
import System.Directory
qmlPrelude :: String
qmlPrelude = unlines [
"import Qt 4.7",
"Rectangle {",
" id: page;",
" width: 100; height: 100;",
" color: 'green';",
" Component.onCompleted: {"]
qmlPostscript :: String
qmlPostscript = unlines [
" }",
"}"]
finishTest :: MockObj a -> IO ()
finishTest mock = do
let statusRef = mockStatus mock
status <- readIORef statusRef
let status' = case status of
TestStatus (_:_) Nothing _ _ -> status {
testFault = Just TUnderAction}
_ -> status
writeIORef statusRef status'
runTest :: (TestAction a) => TestBoxSrc a -> IO TestStatus
runTest src = do
let js = showTestCode (srcTestBoxes src) ""
tmpDir <- getTemporaryDirectory
(qmlPath, hndl) <- openTempFile tmpDir "test1-.qml"
hPutStr hndl (qmlPrelude ++ js ++ qmlPostscript)
hClose hndl
mock <- mockFromSrc src
go <- newObject mock
runEngineLoop defaultEngineConfig {
initialURL = filePathToURI qmlPath,
initialWindowState = HideWindow,
contextObject = Just $ anyObjRef go}
removeFile qmlPath
finishTest mock
status <- readIORef (mockStatus mock)
if isJust $ testFault status
then putStrLn $ show status
else return ()
return status
testProperty :: (TestAction a) => TestBoxSrc a -> Property
testProperty src = monadicIO $ do
status <- run $ runTest src
assert $ isNothing $ testFault status
return ()
checkProperty :: TestType -> IO Bool
checkProperty (TestType pxy) = do
putStrLn $ "Checking " ++ show (typeOf $ asProxyTypeOf undefined pxy)
r <- quickCheckResult $ testProperty . constrainSrc pxy
return $ isSuccess r
constrainSrc :: (TestAction a) => Proxy a -> TestBoxSrc a -> TestBoxSrc a
constrainSrc = flip const