packages feed

typed-wire-0.3.0.0: test/TW/CodeGen/PureScriptTest.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}
{-# LANGUAGE OverloadedStrings #-}
module TW.CodeGen.PureScriptTest where

import TW.Ast
import TW.Check
import TW.Loader
import TW.Types
import qualified TW.CodeGen.PureScript as PS

import Data.Aeson ((.=))
import System.Directory
import System.Exit
import System.FilePath
import System.IO.Temp
import System.Process
import Test.Framework
import qualified Data.Aeson as A
import qualified Data.ByteString.Lazy as BSL
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Text.IO as T

mainTemplate :: T.Text
mainTemplate =
  T.unlines
  [ "module Main where"
  , "import Basic"
  , "import Data.Either"
  , "import Data.TypedWire.Prelude"
  , "import Control.Monad.Eff.Console"
  , "import Control.Monad.Eff"
  , ""
  , "main :: forall a. Eff (console :: CONSOLE | a) Unit"
  , "main = "
  , "  do log \"Lauching self-check ...\""
  , "     let b = Bar { someField: true, moreFields: 42 }"
  , "         bEnc = encodeJson b"
  , "         bDec = decodeJson bEnc"
  , "     if (Right b /= bDec) then error \"Bar enc/dec check ... failed\" else log \"Bar enc/dec check ... ok\""
  ]

bowerTemplate :: T.Text
bowerTemplate =
  T.decodeUtf8 $
  BSL.toStrict $
  A.encode $
  A.object
  [ "name" .= T.pack "purescript-typed-wire-test"
  , "version" .= T.pack "0.1.0"
  , "moduleType" .= [T.pack "node"]
  , "ignore" .= map T.pack ["**/.*", "node_modules", "bower_components", "output"]
  , "dependencies" .=
      A.object
      [ (li_name PS.libraryInfo) .= (li_version PS.libraryInfo)
      , "purescript-console" .= T.pack "0.1.1"
      ]
  , "repository" .=
       A.object
       [ "type" .= T.pack "git"
       , "url" .= T.pack "git://github.com/typed-wire/purescript-typed-wire"
       ]
  ]

test_pureScriptCodeGen :: IO ()
test_pureScriptCodeGen =
  withSystemTempDirectory "purescriptCodeGenX" $ \dir ->
  do let srcDir = dir </> "src"
     loaded <- loadModules ["samples"] [ModuleName ["Basic"]]
     allModules <- assertRight loaded
     checkedModules <- assertRight $ checkModules allModules
     mapM_ (runner srcDir PS.makeModule PS.makeFileName) checkedModules
     T.writeFile (dir </> "bower.json") bowerTemplate
     T.writeFile (srcDir </> "Main.purs") mainTemplate
     let pDeps =
           (shell "pulp dep install")
           { cwd = Just dir
           }
     (_, _, _, hDeps) <- createProcess pDeps
     ecDeps <- waitForProcess hDeps
     assertEqual ExitSuccess ecDeps
     let p =
           (shell "pulp build")
           { cwd = Just dir
           }
     (_, _, _, handle) <- createProcess p
     ec <- waitForProcess handle
     assertEqual ExitSuccess ec
     let pRun =
           (shell "pulp run")
           { cwd = Just dir
           }
     (_, _, _, hRun) <- createProcess pRun
     ecRun <- waitForProcess hRun
     assertEqual ExitSuccess ecRun

runner :: FilePath -> (Module -> T.Text) -> (ModuleName -> FilePath) -> Module -> IO ()
runner baseDir mkModule mkFilename m =
    let moduleSrc = mkModule m
        moduleFp = baseDir </> mkFilename (m_name m)
    in do createDirectoryIfMissing True (takeDirectory moduleFp)
          T.writeFile moduleFp moduleSrc