buildwrapper-0.7.3: test/Language/Haskell/BuildWrapper/ImportsTests.hs
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -F -pgmF htfpp #-}
-- |
-- Module : Language.Haskell.BuildWrapper.ImportsTests
-- Copyright : (c) JP Moresmau 2013
-- License : BSD3
--
-- Maintainer : jpmoresmau@gmail.com
-- Stability : beta
-- Portability : portable
--
-- Test import cleaning and such
module Language.Haskell.BuildWrapper.ImportsTests where
import Language.Haskell.BuildWrapper.Base hiding (writeFile)
import Language.Haskell.BuildWrapper.CMDTests
import System.FilePath
import Test.Framework
import Test.HUnit (Assertion)
test_CleanImportsNothing :: Assertion
test_CleanImportsNothing = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"f :: IO()",
"f=putStrLn \"hello\""
]
(ics,ns)<-cleanImports api root rel False
assertBool $ null ns
assertBool $ null ics
test_CleanImportsFunction :: Assertion
test_CleanImportsFunction = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.Unique",
"f = newUnique"
]
(ics,ns)<-cleanImports api root rel False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 19)) "import Data.Unique (newUnique)"] ics
test_CleanImportsRemove :: Assertion
test_CleanImportsRemove = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.Unique",
"f = putStrLn \"hello\""
]
(ics,ns)<-cleanImports api root rel False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 19)) ""] ics
test_CleanImportsFunctionType :: Assertion
test_CleanImportsFunctionType = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.Unique",
"f :: IO Unique",
"f = newUnique"
]
(ics,ns)<-cleanImports api root rel False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 19)) "import Data.Unique (newUnique, Unique)"] ics
test_CleanImportsConstructor :: Assertion
test_CleanImportsConstructor = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"data MyData=MyCons Int"
]
let rel2="src"</>"B"</>"C.hs"
write api root rel2 $ unlines [
"module B.C where",
"",
"import A",
"f = MyCons 2"
]
(ics,ns)<-cleanImports api root rel2 False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 9)) "import A (MyData (MyCons))"] ics
test_CleanImportsConstructorTyped :: Assertion
test_CleanImportsConstructorTyped = 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, attoparsec"]
synchronize api root False
configure api root Target
let rel2="src"</>"B"</>"C.hs"
write api root rel2 $ unlines [
"module B.C where",
"",
"import Data.Attoparsec",
"f r= case r of",
" Done _ js->True",
" _->False"
]
(ics,ns)<-cleanImports api root rel2 False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 23)) "import Data.Attoparsec (IResult (Done))"] ics
test_CleanImportsFunctionInExport :: Assertion
test_CleanImportsFunctionInExport = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"data MyData=MyCons Int",
"myUnCons (MyCons i)=i"
]
let rel2="src"</>"B"</>"C.hs"
write api root rel2 $ unlines [
"module B.C (f,myUnCons) where",
"",
"import A",
"f = MyCons 2"
]
(ics,ns)<-cleanImports api root rel2 False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 9)) "import A (MyData (MyCons), myUnCons)"] ics
test_CleanImportsConstructorQualified :: Assertion
test_CleanImportsConstructorQualified = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"data MyData=MyCons Int"
]
let rel2="src"</>"B"</>"C.hs"
write api root rel2 $ unlines [
"module B.C where",
"",
"import qualified A as MyA",
"f = MyA.MyCons 2"
]
(ics,ns)<-cleanImports api root rel2 False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 26)) "import qualified A as MyA (MyData (MyCons))"] ics
test_CleanImportsFunctionReExported :: Assertion
test_CleanImportsFunctionReExported = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.Char",
"f = toUpper"
]
(ics,ns)<-cleanImports api root rel False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 17)) "import Data.Char (toUpper)"] ics
test_CleanImportsFunctionReExportedInExport :: Assertion
test_CleanImportsFunctionReExportedInExport = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A (f,toLower) where",
"",
"import Data.Char",
"f = toUpper"
]
(ics,ns)<-cleanImports api root rel False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 17)) "import Data.Char (toLower, toUpper)"] ics
test_CleanImportsFunctionReExportedWithOthers :: Assertion
test_CleanImportsFunctionReExportedWithOthers = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.Char",
"import Data.List",
"f = toUpper",
"f2 = unzip5",
"f3 = isSeparator"
]
(ics,ns)<-cleanImports api root rel False
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 17))
"import Data.Char (isSeparator, toUpper)",
ImportClean (InFileSpan (InFileLoc 4 1) (InFileLoc 4 17))
"import Data.List (unzip5)"]
ics
test_CleanImportsFormat :: Assertion
test_CleanImportsFormat = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.Char",
"import qualified Data.Unique as U",
"f = toUpper",
"f2 = U.newUnique",
"f3 = isSeparator"
]
(ics,ns)<-cleanImports api root rel True
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 17))
"import Data.Char (isSeparator, toUpper)",
ImportClean (InFileSpan (InFileLoc 4 1) (InFileLoc 4 34))
"import qualified Data.Unique as U (newUnique)"]
ics
test_CleanImportsInfix :: Assertion
test_CleanImportsInfix = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
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, filepath"]
synchronize api root False
configure api root Target
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import System.FilePath",
"f = \"dir\" </> \"file\""
]
(ics,ns)<-cleanImports api root rel True
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 23))
"import System.FilePath ((</>))"
]
ics
test_CleanImportsHiding :: Assertion
test_CleanImportsHiding = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
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, bytestring"]
synchronize api root False
configure api root Target
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.ByteString.Lazy.Char8 hiding (writeFile)",
"f s= writeFile \"file\" s"
]
(ics,ns)<-cleanImports api root rel True
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 53))
""
]
ics
test_CleanImportsPrelude :: Assertion
test_CleanImportsPrelude = do
let api=cabalAPI
root<-createTestProject
synchronize api root False
let rel="src"</>"A.hs"
-- use api to write temp file
write api root rel $ unlines [
"module A where",
"",
"import Data.List",
"f = map id"
]
(ics,ns)<-cleanImports api root rel True
assertBool $ null ns
assertEqual [ImportClean (InFileSpan (InFileLoc 3 1) (InFileLoc 3 17))
""]
ics