packages feed

fay-0.9.1.0: src/Tests.hs

-- | Generate the web site/documentation for the Fay project.
--
-- This depends on the Fay compiler to generate examples and the
-- javascript of the page is also built with Fay.

module Main where

import           Data.Default
import           Data.List
import           Language.Fay.Compiler
import           Language.Fay.Types
import           System.Directory
import           System.FilePath
import           System.Process.Extra
import qualified Test.Api              as Api
import qualified Test.CommandLine      as Cmd
import qualified Test.Convert          as C
import           Test.HUnit (assertEqual)
import           Test.Framework
import           Test.Framework.Providers.HUnit

-- | Main test runner.
main :: IO ()
main = do
  compiler <- makeCompilerTests
  defaultMain [Api.tests, Cmd.tests, compiler, C.tests]

-- | Make the case-by-case unit tests.
makeCompilerTests :: IO Test
makeCompilerTests = do
  files <- fmap (map ("tests" </>) . sort . filter dotHs) $ getDirectoryContents "tests"
  return $ testGroup "Tests" $ flip map files $ \file ->
    testCase file $ do
      let root = (reverse . drop 1 . dropWhile (/='.') . reverse) file
          out = toJsName file
      outExists <- doesFileExist root
      compileFromTo def { configAutorun = True, configDirectoryIncludes = ["tests/"] } file out
      result <- runJavaScriptFile out
      if outExists
         then do output <- readFile root
                 assertEqual file output (either show id result)
         else assertEqual file True (either (const True) (const False) result)
  where dotHs = isSuffixOf ".hs"

-- | Run a JS file.
runJavaScriptFile :: String -> IO (Either String String)
runJavaScriptFile file = readAllFromProcess "node" file