forml-0.2: src/hs/Forml/Javascript/Test.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
module Forml.Javascript.Test where
import Text.InterpolatedString.Perl6
import Control.Concurrent
import System.Exit
import System.IO
import System.Process
import Forml.CLI
import Forml.Static
test :: RunConfig -> String -> String -> String -> IO ()
test rc @ RunConfig { run_tests = Node } js title tests =
let runner = if silent rc then run_silent else monitor in
runner [qq|Testing {title}.js [Node.js]|] $
do (Just std_in, Just std_out, _, p) <-
createProcess (proc "node" []) { std_in = CreatePipe, std_out = CreatePipe }
forkIO $ do errors <- hGetContents std_out
putStr errors
hFlush stdout
hPutStrLn std_in$ jasmine
hPutStrLn std_in$ js ++ "\n\n"
hPutStrLn std_in$ tests
hPutStrLn std_in$ console
z <- waitForProcess p
case z of
ExitFailure _ -> return$ Left []
ExitSuccess -> return$ Right ()
test rc @ RunConfig { run_tests = Phantom } js title tests =
let runner = if silent rc then run_silent else monitor in
runner [qq|Testing {title}.js [Phantom.js]|] $
do writeFile (output rc ++ ".phantom.js")
(jquery ++ jasmine ++ js ++ tests ++ console)
(Just std_in, Just std_out, _, p) <-
createProcess (proc "phantomjs" [output rc ++ ".phantom.js"]) { std_in = CreatePipe, std_out = CreatePipe }
forkIO $ do errors <- hGetContents std_out
putStr errors
hFlush stdout
z <- waitForProcess p
system $ " rm " ++ output rc ++ ".phantom.js"
case z of
ExitFailure _ -> return$ Left []
ExitSuccess -> return$ Right ()
test rc _ _ _ = if silent rc then do return () else warn "Testing" ()