import Test.HUnit import ProjectM36.Base import TutorialD.Interpreter.Import.TutorialD import System.Exit import qualified Data.Text as T import System.IO.Temp import System.FilePath import qualified Data.Map as M import System.IO import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL import qualified Data.Text.Encoding as TE import Text.URI hiding (makeAbsolute) import Network.Wai.Handler.Warp import Control.Concurrent.MVar import Control.Concurrent import Network.Wai import Network.HTTP.Types main :: IO () main = do tcounts <- runTestTT $ TestList [testTutdFileImport ,testTutdHTTPSImport ] if errors tcounts + failures tcounts > 0 then exitFailure else exitSuccess testTutdFileImport :: Test testTutdFileImport = TestCase $ withSystemTempFile "m.tutd" $ \tempPath handle -> do BS.hPut handle (TE.encodeUtf8 "x:=relation{tuple{a 5,b \"spam\"}}; y:=relation{tuple{b \"漢字\"}}") hClose handle let expectedExpr = MultipleExpr [ Assign "x" (MakeRelationFromExprs Nothing $ TupleExprs () [TupleExpr (M.fromList [("a", NakedAtomExpr $ IntegerAtom 5), ("b", NakedAtomExpr $ TextAtom "spam")])]), Assign "y" (MakeRelationFromExprs Nothing $ TupleExprs () [TupleExpr (M.fromList [("b", NakedAtomExpr (TextAtom "漢字"))])])] --on Windows, the file URI should not include the drive letter "/c/Users..." -> "/Users" let uri = "file://" <> map (\c -> if c == '\\' then '/' else c) ( joinDrive "/" (dropDrive tempPath)) fileURI <- mkURI (T.pack uri) imported <- importTutorialDFromFile fileURI Nothing assertEqual "import tutd" (Right expectedExpr) imported startTestHTTPServer :: MVar () -> IO ThreadId startTestHTTPServer startVar = do let settings = setHost "127.0.0.1" $ setBeforeMainLoop (putMVar startVar ()) $ setPort 8899 defaultSettings app req respond = do case pathInfo req of ["test1"] -> respond $ responseLBS status200 [] "x:=true;\ny:=false;" other -> respond $ responseLBS status404 [] (BSL.fromStrict $ TE.encodeUtf8 $ T.pack ("no path at" <> show other)) forkIO $ runSettings settings app testTutdHTTPSImport :: Test testTutdHTTPSImport = TestCase $ do uri <- mkURI "http://localhost:8899/test1" let hash = "effe32b247586dc3ac0079fc241b9618d41d189afcaeb7907edbe5a8b45992a4" expected = Right (MultipleExpr [Assign "x" (RelationVariable "true" ()),Assign "y" (RelationVariable "false" ())]) continueTestVar <- newEmptyMVar httpServerThread <- startTestHTTPServer continueTestVar actual <- importTutorialDViaHTTP uri (Just hash) assertEqual "github https" expected actual killThread httpServerThread