buildwrapper-0.8.0: test/Language/Haskell/BuildWrapper/CMDLongRunningTests.hs
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -F -pgmF htfpp #-}
-- |
-- Module : Language.Haskell.BuildWrapper.CMDTests
-- Copyright : (c) JP Moresmau 2013
-- License : BSD3
--
-- Maintainer : jpmoresmau@gmail.com
-- Stability : beta
-- Portability : portable
--
-- Testing for long running operations
module Language.Haskell.BuildWrapper.CMDLongRunningTests where
import Language.Haskell.BuildWrapper.CMDTests
import Language.Haskell.BuildWrapper.Base hiding (writeFile,readFile)
import Data.ByteString.Lazy ()
import Data.ByteString.Lazy.Char8()
import Data.Maybe
import Data.List
import System.FilePath
import Test.Framework
import Test.HUnit (Assertion)
import Control.Concurrent (threadDelay)
test_NameDefsInScopeLongRunning :: Assertion
test_NameDefsInScopeLongRunning = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
configure api root Source
let rel="src"</>"Main.hs"
writeFile (root </> rel) $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"toto\"",
"data Type1=MkType1_1 Int"
]
build api root True Source
synchronize api root False
(inp,out,_,_)<-build1lr root rel
(mtts,ns)<- readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (isJust mtts)
assertBool (not $ notesInError ns)
let tts=fromJust mtts
assertBool (NameDef "Main.main" [Function] (Just "IO [Char]") `elem` tts)
assertBool (NameDef "B.D.fD" [Function] (Just "forall a. a") `elem` tts)
assertBool (NameDef "Main.Type1" [Type] Nothing `elem` tts)
assertBool (NameDef "Main.MkType1_1" [Constructor] (Just "Int -> Type1") `elem` tts)
assertBool (NameDef "GHC.Types.Char" [Type] Nothing `elem` tts)
assertBool (NameDef "Main.Type2" [Type] Nothing `notElem` tts)
threadDelay 1000000
write api root rel $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"toto\"",
"data Type1=MkType1_1 Int",
"data Type2=MkType2_1 Int"
]
continue inp
(mtts2,ns2)<-readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (not $ notesInError ns2)
assertBool (isJust mtts2)
let tts2=fromJust mtts2
assertBool (NameDef "Main.Type1" [Type] Nothing `elem` tts2)
assertBool (NameDef "Main.Type2" [Type] Nothing `elem` tts2)
write api root rel $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"toto\"",
"data Type1=MkType1_1 Int",
"data Type2=MkType2_1 Int2"
]
continue inp
(_,ns3)<-readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (notesInError ns3)
threadDelay 1000000
write api root rel $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"toto\"",
"data Type1=MkType1_1 Int",
"data Type2=MkType2_1 Int"
]
continue inp
(mtts4,ns4)<-readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (not $ notesInError ns4)
assertBool (isJust mtts4)
let tts4=fromJust mtts4
assertBool (NameDef "Main.Type1" [Type] Nothing `elem` tts4)
assertBool (NameDef "Main.Type2" [Type] Nothing `elem` tts4)
end inp
test_EvalLongRunning :: Assertion
test_EvalLongRunning = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
configure api root Source
let rel="src"</>"Main.hs"
writeFile (root </> rel) $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"toto\"",
"data Type1=MkType1_1 Int"
]
build api root True Source
synchronize api root False
(inp,out,_,_)<-build1lr root rel
(mtts,ns)<- readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (isJust mtts)
assertBool (not $ notesInError ns)
evalLR inp "reverse \"toto\""
(s1,_)<- readResult out :: IO (OpResult [EvalResult])
assertEqual [EvalResult (Just "[GHC.Types.Char]") (Just "\"otot\"") Nothing] s1
evalLR inp "main"
(s2,_)<- readResult out :: IO (OpResult [EvalResult])
assertEqual [EvalResult (Just "[GHC.Types.Char]") (Just "\"toto\"") Nothing] s2
evalLR inp "MkType1_1"
(s3,_)<- readResult out :: IO (OpResult [EvalResult])
assertBool $ isPrefixOf "No instance for" $ (\(EvalResult _ _ (Just err))->err) $ head s3
threadDelay 1000000
write api root rel $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"titi\"",
"data Type1=MkType1_1 Int",
"data Type2=MkType2_1 Int"
]
continue inp
readResult out :: IO (OpResult (Maybe [NameDef]))
evalLR inp "main"
(s4,_)<- readResult out :: IO (OpResult [EvalResult])
assertEqual [EvalResult (Just "[GHC.Types.Char]") (Just "\"titi\"") Nothing] s4
end inp
test_EvalTextLongRunning :: Assertion
test_EvalTextLongRunning = do
let api=cabalAPI
root<-createTestProject
let cf=testCabalFile root
writeFile cf $ unlines ["name: "++testProjectName,
"version:0.1",
"cabal-version: >= 1.8",
"build-type: Simple",
"",
"library",
" hs-source-dirs: src",
" exposed-modules: A",
" other-modules: B.C",
" build-depends: base",
"",
"executable BWTest",
" hs-source-dirs: src",
" main-is: Main.hs",
" other-modules: B.D",
" build-depends: base, text",
"",
"test-suite BWTest-test",
" type: exitcode-stdio-1.0",
" hs-source-dirs: test",
" main-is: Main.hs",
" other-modules: TestA",
" build-depends: base",
""
]
synchronize api root False
configure api root Source
let rel="src"</>"Main.hs"
writeFile (root </> rel) $ unlines [
"{-# LANGUAGE OverloadedStrings #-}",
"module Main where",
"import qualified Data.Text as T",
"t=T.pack \"test\""
]
build api root True Source
synchronize api root False
(inp,out,_,_)<-build1lr root rel
(mtts,ns)<- readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (isJust mtts)
assertBool (not $ notesInError ns)
evalLR inp "t"
(s1,_)<- readResult out :: IO (OpResult [EvalResult])
assertEqual [EvalResult (Just "Data.Text.Internal.Text") (Just "\"test\"") Nothing] s1
evalLR inp "T.breakOnEnd \"/\" \"a/b\""
(s2,_)<- readResult out :: IO (OpResult [EvalResult])
assertEqual [EvalResult (Just "(Data.Text.Internal.Text, Data.Text.Internal.Text)") (Just "(\"a/\",\"b\")") Nothing] s2
end inp
test_TokenTypesLongRunning :: Assertion
test_TokenTypesLongRunning = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
configure api root Source
let rel="src"</>"Main.hs"
writeFile (root </> rel) $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"toto\"",
"data Type1=MkType1_1 Int"
]
build api root True Source
synchronize api root False
(inp,out,_,_)<-build1lr root rel
(mtts,ns)<- readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (isJust mtts)
assertBool (not $ notesInError ns)
tokenTypesLR inp
(tts,nsErrors1)<-readResult out ::IO (OpResult [TokenDef])
assertBool (null nsErrors1)
assertBool (not $ null tts)
continue inp
(mtts2,ns2)<-readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (not $ notesInError ns2)
assertBool (isJust mtts2)
end inp
test_ThingAtPointLongRunning :: Assertion
test_ThingAtPointLongRunning = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
configure api root Source
let rel="src"</>"Main.hs"
writeFile (root </> rel) $ unlines [
"module Main where",
"import B.D",
"main=return $ map id \"toto\"",
"data Type1=MkType1_1 Int"
]
build api root True Source
synchronize api root False
(inp,out,_,_)<-build1lr root rel
(mtts,ns)<- readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (isJust mtts)
assertBool (not $ notesInError ns)
tokenTypesLR inp
(tts,nsErrors1)<-readResult out ::IO (OpResult [TokenDef])
assertBool (null nsErrors1)
assertBool (not $ null tts)
tapLR inp 3 16
(tap1,nsErrorsTap)<-readResult out :: IO (OpResult (Maybe ThingAtPoint))
assertBool (null nsErrorsTap)
assertBool $ isJust tap1
assertEqual "map" (tapName $ fromJust tap1)
continue inp
(mtts2,ns2)<-readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (not $ notesInError ns2)
assertBool (isJust mtts2)
end inp
test_LocalsLongRunning :: Assertion
test_LocalsLongRunning = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
configure api root Source
let rel="src"</>"Main.hs"
writeFile (root </> rel) $ unlines [
"module Main where",
"main=return $ map id \"toto\"",
"",
"fun1 l1=let",
" l2=reverse \"toto\"",
" in head l2"
]
build api root True Source
synchronize api root False
(inp,out,_,_)<-build1lr root rel
(mtts,ns)<- readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (isJust mtts)
assertBool (not $ notesInError ns)
localsLR inp 4 1 6 10
(tap1,nsErrorsTap)<-readResult out :: IO (OpResult [ThingAtPoint])
assertBool (null nsErrorsTap)
let namesM=map tapName tap1
assertBool ("l2" `elem` namesM)
assertBool ("l1" `elem` namesM)
continue inp
(mtts2,ns2)<-readResult out :: IO (OpResult (Maybe [NameDef]))
assertBool (not $ notesInError ns2)
assertBool (isJust mtts2)
end inp