stylish-haskell-0.12.0.0: tests/Language/Haskell/Stylish/Config/Tests.hs
module Language.Haskell.Stylish.Config.Tests
( tests
) where
--------------------------------------------------------------------------------
import qualified Data.Set as Set
import System.Directory
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit (Assertion, assert)
--------------------------------------------------------------------------------
import Language.Haskell.Stylish.Config
import Language.Haskell.Stylish.Tests.Util
--------------------------------------------------------------------------------
tests :: Test
tests = testGroup "Language.Haskell.Stylish.Config"
[ testCase "Extensions extracted correctly from .cabal file"
testExtensionsFromDotCabal
, testCase "Extensions extracted correctly from .stylish-haskell.yaml file"
testExtensionsFromDotStylish
, testCase "Extensions extracted correctly from .stylish-haskell.yaml and .cabal files"
testExtensionsFromBoth
, testCase "Correctly read .stylish-haskell.yaml file with default max column number"
testDefaultColumns
, testCase "Correctly read .stylish-haskell.yaml file with specified max column number"
testSpecifiedColumns
, testCase "Correctly read .stylish-haskell.yaml file with no max column number"
testNoColumns
]
--------------------------------------------------------------------------------
-- | Put an example config files (.cabal/.stylish-haskell.yaml/both)
-- into the current directory and extract extensions from it.
createFilesAndGetConfig :: [(FilePath, String)] -> IO Config
createFilesAndGetConfig files = withTestDirTree $ do
mapM_ (\(k, v) -> writeFile k v) files
-- create an empty directory and change into it
createDirectory "src"
setCurrentDirectory "src"
-- from that directory read the config file and extract extensions
-- to make sure the search for .cabal file works
config <- loadConfig (const (pure ())) Nothing
pure config
--------------------------------------------------------------------------------
testExtensionsFromDotCabal :: Assertion
testExtensionsFromDotCabal =
assert $ (expected ==) . Set.fromList . configLanguageExtensions <$>
createFilesAndGetConfig [("test.cabal", dotCabal True)]
where
expected = Set.fromList ["ScopedTypeVariables", "DataKinds"]
--------------------------------------------------------------------------------
testExtensionsFromDotStylish :: Assertion
testExtensionsFromDotStylish =
assert $ (expected ==) . Set.fromList . configLanguageExtensions <$>
createFilesAndGetConfig [(".stylish-haskell.yaml", dotStylish)]
where
expected = Set.fromList ["TemplateHaskell", "QuasiQuotes"]
--------------------------------------------------------------------------------
testExtensionsFromBoth :: Assertion
testExtensionsFromBoth =
assert $ (expected ==) . Set.fromList . configLanguageExtensions <$>
createFilesAndGetConfig [ ("test.cabal", dotCabal True)
, (".stylish-haskell.yaml", dotStylish)]
where
expected = Set.fromList
["ScopedTypeVariables", "DataKinds", "TemplateHaskell", "QuasiQuotes"]
--------------------------------------------------------------------------------
testSpecifiedColumns :: Assertion
testSpecifiedColumns =
assert $ (expected ==) . configColumns <$>
createFilesAndGetConfig [(".stylish-haskell.yaml", dotStylish)]
where
expected = Just 110
--------------------------------------------------------------------------------
testDefaultColumns :: Assertion
testDefaultColumns =
assert $ (expected ==) . configColumns <$>
createFilesAndGetConfig [(".stylish-haskell.yaml", dotStylish2)]
where
expected = Just 80
--------------------------------------------------------------------------------
testNoColumns :: Assertion
testNoColumns =
assert $ (expected ==) . configColumns <$>
createFilesAndGetConfig [(".stylish-haskell.yaml", dotStylish3)]
where
expected = Nothing
-- | Example cabal file borrowed from
-- https://www.haskell.org/cabal/users-guide/developing-packages.html
-- with some default-extensions added
dotCabal :: Bool -> String
dotCabal includeExtensions = unlines $
[ "name: TestPackage"
, "version: 0.0"
, "synopsis: Package with library and two programs"
, "license: BSD3"
, "author: Angela Author"
, "build-type: Simple"
, "cabal-version: >= 1.2"
, ""
, "library"
, " build-depends: HUnit"
, " exposed-modules: A, B, C"
] ++
[if includeExtensions then " default-extensions: ScopedTypeVariables"
else ""]
++
[ ""
, "executable program1"
, " main-is: Main.hs"
, " hs-source-dirs: prog1"
, " other-modules: A, B"
] ++
[if includeExtensions then " default-extensions: DataKinds"
else ""]
-- | Example .stylish-haskell.yaml
dotStylish :: String
dotStylish = unlines $
[ "steps:"
, " - imports:"
, " align: none"
, " list_align: after_alias"
, " long_list_align: inline"
, " separate_lists: true"
, " - language_pragmas:"
, " style: vertical"
, " align: false"
, " remove_redundant: true"
, " - trailing_whitespace: {}"
, " - records:"
, " equals: \"same_line\""
, " first_field: \"indent 2\""
, " field_comment: 2"
, " deriving: 4"
, " via: \"indent 2\""
, "columns: 110"
, "language_extensions:"
, " - TemplateHaskell"
, " - QuasiQuotes"
]
-- | Example .stylish-haskell.yaml
dotStylish2 :: String
dotStylish2 = unlines $
[ "steps:"
, " - imports:"
, " align: none"
, " list_align: after_alias"
, " long_list_align: inline"
, " separate_lists: true"
, " - language_pragmas:"
, " style: vertical"
, " align: false"
, " remove_redundant: true"
, " - trailing_whitespace: {}"
, "language_extensions:"
, " - TemplateHaskell"
, " - QuasiQuotes"
]
-- | Example .stylish-haskell.yaml
dotStylish3 :: String
dotStylish3 = unlines $
[ "steps:"
, " - imports:"
, " align: none"
, " list_align: after_alias"
, " long_list_align: inline"
, " separate_lists: true"
, " - language_pragmas:"
, " style: vertical"
, " align: false"
, " remove_redundant: true"
, " - trailing_whitespace: {}"
, "columns: null"
, "language_extensions:"
, " - TemplateHaskell"
, " - QuasiQuotes"
]