/tests/Language/Haskell/Stylish/Step/Imports/Tests.hs

https://gitlab.com/alx741/stylish-haskell · Haskell · 468 lines · 382 code · 58 blank · 28 comment · 0 complexity · b7eb33a77696739ee93eec4c481df552 MD5 · raw file

  1. --------------------------------------------------------------------------------
  2. module Language.Haskell.Stylish.Step.Imports.Tests
  3. ( tests
  4. ) where
  5. --------------------------------------------------------------------------------
  6. import Test.Framework (Test, testGroup)
  7. import Test.Framework.Providers.HUnit (testCase)
  8. import Test.HUnit (Assertion, (@=?))
  9. --------------------------------------------------------------------------------
  10. import Language.Haskell.Stylish.Step.Imports
  11. import Language.Haskell.Stylish.Tests.Util
  12. --------------------------------------------------------------------------------
  13. defaultAlign :: Align
  14. defaultAlign = Align Global AfterAlias Inline Inherit 4 True
  15. --------------------------------------------------------------------------------
  16. fromImportAlign :: ImportAlign -> Align
  17. fromImportAlign align = defaultAlign { importAlign = align }
  18. --------------------------------------------------------------------------------
  19. tests :: Test
  20. tests = testGroup "Language.Haskell.Stylish.Step.Imports.Tests"
  21. [ testCase "case 01" case01
  22. , testCase "case 02" case02
  23. , testCase "case 03" case03
  24. , testCase "case 04" case04
  25. , testCase "case 05" case05
  26. , testCase "case 06" case06
  27. , testCase "case 07" case07
  28. , testCase "case 08" case08
  29. , testCase "case 09" case09
  30. , testCase "case 10" case10
  31. , testCase "case 11" case11
  32. , testCase "case 12" case12
  33. , testCase "case 13" case13
  34. , testCase "case 14" case14
  35. , testCase "case 15" case15
  36. , testCase "case 16" case16
  37. , testCase "case 17" case17
  38. , testCase "case 18" case18
  39. , testCase "case 19" case19
  40. ]
  41. --------------------------------------------------------------------------------
  42. input :: String
  43. input = unlines
  44. [ "module Herp where"
  45. , ""
  46. , "import qualified Data.Map as M"
  47. , "import Control.Monad"
  48. , "import Only.Instances()"
  49. , "import Data.Map (lookup, (!), insert, Map)"
  50. , "import Data.List as List (concat, foldl, foldr, head, init, last,\
  51. \ length, map, null, reverse, tail, (++))"
  52. , ""
  53. , "import Herp.Derp.Internals hiding (foo)"
  54. , "import Foo (Bar (..))"
  55. , ""
  56. , "herp = putStrLn \"import Hello world\""
  57. ]
  58. --------------------------------------------------------------------------------
  59. case01 :: Assertion
  60. case01 = expected @=? testStep (step 80 $ fromImportAlign Global) input
  61. where
  62. expected = unlines
  63. [ "module Herp where"
  64. , ""
  65. , "import Control.Monad"
  66. , "import Data.List as List (concat, foldl, foldr, head, init,"
  67. , " last, length, map, null, reverse,"
  68. , " tail, (++))"
  69. , "import Data.Map (Map, insert, lookup, (!))"
  70. , "import qualified Data.Map as M"
  71. , "import Only.Instances ()"
  72. , ""
  73. , "import Foo (Bar (..))"
  74. , "import Herp.Derp.Internals hiding (foo)"
  75. , ""
  76. , "herp = putStrLn \"import Hello world\""
  77. ]
  78. --------------------------------------------------------------------------------
  79. case02 :: Assertion
  80. case02 = expected @=? testStep (step 80 $ fromImportAlign Group) input
  81. where
  82. expected = unlines
  83. [ "module Herp where"
  84. , ""
  85. , "import Control.Monad"
  86. , "import Data.List as List (concat, foldl, foldr, head, init, last,"
  87. , " length, map, null, reverse, tail, (++))"
  88. , "import Data.Map (Map, insert, lookup, (!))"
  89. , "import qualified Data.Map as M"
  90. , "import Only.Instances ()"
  91. , ""
  92. , "import Foo (Bar (..))"
  93. , "import Herp.Derp.Internals hiding (foo)"
  94. , ""
  95. , "herp = putStrLn \"import Hello world\""
  96. ]
  97. --------------------------------------------------------------------------------
  98. case03 :: Assertion
  99. case03 = expected @=? testStep (step 80 $ fromImportAlign None) input
  100. where
  101. expected = unlines
  102. [ "module Herp where"
  103. , ""
  104. , "import Control.Monad"
  105. , "import Data.List as List (concat, foldl, foldr, head, init, last, length, map,"
  106. , " null, reverse, tail, (++))"
  107. , "import Data.Map (Map, insert, lookup, (!))"
  108. , "import qualified Data.Map as M"
  109. , "import Only.Instances ()"
  110. , ""
  111. , "import Foo (Bar (..))"
  112. , "import Herp.Derp.Internals hiding (foo)"
  113. , ""
  114. , "herp = putStrLn \"import Hello world\""
  115. ]
  116. --------------------------------------------------------------------------------
  117. case04 :: Assertion
  118. case04 = expected @=? testStep (step 80 $ fromImportAlign Global) input'
  119. where
  120. input' =
  121. "import Data.Aeson.Types (object, typeMismatch, FromJSON(..)," ++
  122. "ToJSON(..), Value(..), parseEither, (.!=), (.:), (.:?), (.=))"
  123. expected = unlines
  124. [ "import Data.Aeson.Types (FromJSON (..), ToJSON (..), Value (..),"
  125. , " object, parseEither, typeMismatch, (.!=),"
  126. , " (.:), (.:?), (.=))"
  127. ]
  128. --------------------------------------------------------------------------------
  129. case05 :: Assertion
  130. case05 = input' @=? testStep (step 80 $ fromImportAlign Group) input'
  131. where
  132. input' = "import Distribution.PackageDescription.Configuration " ++
  133. "(finalizePackageDescription)\n"
  134. --------------------------------------------------------------------------------
  135. case06 :: Assertion
  136. case06 = input' @=? testStep (step 80 $ fromImportAlign File) input'
  137. where
  138. input' = unlines
  139. [ "import Bar.Qux"
  140. , "import Foo.Bar"
  141. ]
  142. --------------------------------------------------------------------------------
  143. case07 :: Assertion
  144. case07 = expected @=? testStep (step 80 $ fromImportAlign File) input'
  145. where
  146. input' = unlines
  147. [ "import Bar.Qux"
  148. , ""
  149. , "import qualified Foo.Bar"
  150. ]
  151. expected = unlines
  152. [ "import Bar.Qux"
  153. , ""
  154. , "import qualified Foo.Bar"
  155. ]
  156. --------------------------------------------------------------------------------
  157. case08 :: Assertion
  158. case08 = expected
  159. @=? testStep (step 80 $ Align Global WithAlias Inline Inherit 4 True) input
  160. where
  161. expected = unlines
  162. [ "module Herp where"
  163. , ""
  164. , "import Control.Monad"
  165. , "import Data.List as List (concat, foldl, foldr, head, init,"
  166. , " last, length, map, null, reverse, tail,"
  167. , " (++))"
  168. , "import Data.Map (Map, insert, lookup, (!))"
  169. , "import qualified Data.Map as M"
  170. , "import Only.Instances ()"
  171. , ""
  172. , "import Foo (Bar (..))"
  173. , "import Herp.Derp.Internals hiding (foo)"
  174. , ""
  175. , "herp = putStrLn \"import Hello world\""
  176. ]
  177. --------------------------------------------------------------------------------
  178. case09 :: Assertion
  179. case09 = expected
  180. @=? testStep (step 80 $ Align Global WithAlias Multiline Inherit 4 True) input
  181. where
  182. expected = unlines
  183. [ "module Herp where"
  184. , ""
  185. , "import Control.Monad"
  186. , "import Data.List as List"
  187. , " ( concat"
  188. , " , foldl"
  189. , " , foldr"
  190. , " , head"
  191. , " , init"
  192. , " , last"
  193. , " , length"
  194. , " , map"
  195. , " , null"
  196. , " , reverse"
  197. , " , tail"
  198. , " , (++)"
  199. , " )"
  200. , "import Data.Map (Map, insert, lookup, (!))"
  201. , "import qualified Data.Map as M"
  202. , "import Only.Instances ()"
  203. , ""
  204. , "import Foo (Bar (..))"
  205. , "import Herp.Derp.Internals hiding (foo)"
  206. , ""
  207. , "herp = putStrLn \"import Hello world\""
  208. ]
  209. --------------------------------------------------------------------------------
  210. case10 :: Assertion
  211. case10 = expected
  212. @=? testStep (step 40 $ Align Group WithAlias Multiline Inherit 4 True) input
  213. where
  214. expected = unlines
  215. [ "module Herp where"
  216. , ""
  217. , "import Control.Monad"
  218. , "import Data.List as List"
  219. , " ( concat"
  220. , " , foldl"
  221. , " , foldr"
  222. , " , head"
  223. , " , init"
  224. , " , last"
  225. , " , length"
  226. , " , map"
  227. , " , null"
  228. , " , reverse"
  229. , " , tail"
  230. , " , (++)"
  231. , " )"
  232. , "import Data.Map"
  233. , " ( Map"
  234. , " , insert"
  235. , " , lookup"
  236. , " , (!)"
  237. , " )"
  238. , "import qualified Data.Map as M"
  239. , "import Only.Instances ()"
  240. , ""
  241. , "import Foo (Bar (..))"
  242. , "import Herp.Derp.Internals hiding (foo)"
  243. , ""
  244. , "herp = putStrLn \"import Hello world\""
  245. ]
  246. --------------------------------------------------------------------------------
  247. case11 :: Assertion
  248. case11 = expected
  249. @=? testStep (step 80 $ Align Group NewLine Inline Inherit 4 True) input
  250. where
  251. expected = unlines
  252. [ "module Herp where"
  253. , ""
  254. , "import Control.Monad"
  255. , "import Data.List as List"
  256. , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"
  257. , " (++))"
  258. , "import Data.Map"
  259. , " (Map, insert, lookup, (!))"
  260. , "import qualified Data.Map as M"
  261. , "import Only.Instances"
  262. , " ()"
  263. , ""
  264. , "import Foo"
  265. , " (Bar (..))"
  266. , "import Herp.Derp.Internals hiding"
  267. , " (foo)"
  268. , ""
  269. , "herp = putStrLn \"import Hello world\""
  270. ]
  271. --------------------------------------------------------------------------------
  272. case12 :: Assertion
  273. case12 = expected
  274. @=? testStep (step 80 $ Align Group NewLine Inline Inherit 2 True) input'
  275. where
  276. input' = unlines
  277. [ "import Data.List (map)"
  278. ]
  279. expected = unlines
  280. [ "import Data.List"
  281. , " (map)"
  282. ]
  283. --------------------------------------------------------------------------------
  284. case13 :: Assertion
  285. case13 = expected
  286. @=? testStep (step 80 $ Align None WithAlias InlineWithBreak Inherit 4 True) input'
  287. where
  288. input' = unlines
  289. [ "import qualified Data.List as List (concat, foldl, foldr, head, init,"
  290. , " last, length, map, null, reverse, tail, (++))"
  291. ]
  292. expected = unlines
  293. [ "import qualified Data.List as List"
  294. , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"
  295. , " (++))"
  296. ]
  297. --------------------------------------------------------------------------------
  298. case14 :: Assertion
  299. case14 = expected
  300. @=? testStep
  301. (step 80 $ Align None WithAlias InlineWithBreak Inherit 10 True) expected
  302. where
  303. expected = unlines
  304. [ "import qualified Data.List as List (concat, map, null, reverse, tail, (++))"
  305. ]
  306. --------------------------------------------------------------------------------
  307. case15 :: Assertion
  308. case15 = expected
  309. @=? testStep (step 80 $ Align None AfterAlias Multiline Inherit 4 True) input'
  310. where
  311. expected = unlines
  312. [ "import Data.Acid (AcidState)"
  313. , "import qualified Data.Acid as Acid"
  314. , " ( closeAcidState"
  315. , " , createCheckpoint"
  316. , " , openLocalStateFrom"
  317. , " )"
  318. , "import Data.Default.Class (Default (def))"
  319. , ""
  320. , "import qualified Herp.Derp.Internal.Types.Foobar as Internal (bar, foo)"
  321. ]
  322. input' = unlines
  323. [ "import Data.Acid (AcidState)"
  324. , "import qualified Data.Acid as Acid (closeAcidState, createCheckpoint, openLocalStateFrom)"
  325. , "import Data.Default.Class (Default (def))"
  326. , ""
  327. , "import qualified Herp.Derp.Internal.Types.Foobar as Internal (foo, bar)"
  328. ]
  329. --------------------------------------------------------------------------------
  330. case16 :: Assertion
  331. case16 = expected
  332. @=? testStep (step 80 $ Align None AfterAlias Multiline Inherit 4 False) input'
  333. where
  334. expected = unlines
  335. [ "import Data.Acid (AcidState)"
  336. , "import Data.Default.Class (Default(def))"
  337. , ""
  338. , "import Data.Maybe (Maybe(Just, Nothing))"
  339. , ""
  340. , "import Data.Foo (Foo(Bar, Foo), Goo(Goo))"
  341. ]
  342. input' = unlines
  343. [ "import Data.Acid (AcidState)"
  344. , "import Data.Default.Class (Default(def))"
  345. , ""
  346. , "import Data.Maybe (Maybe (Just, Nothing))"
  347. , ""
  348. , "import Data.Foo (Foo (Foo,Bar), Goo(Goo))"
  349. ]
  350. --------------------------------------------------------------------------------
  351. case17 :: Assertion
  352. case17 = expected
  353. @=? testStep (step 80 $ Align None AfterAlias Multiline Inherit 4 True) input'
  354. where
  355. expected = unlines
  356. [ "import Control.Applicative (Applicative (pure, (<*>)))"
  357. , ""
  358. , "import Data.Identity (Identity (Identity, runIdentity))"
  359. ]
  360. input' = unlines
  361. [ "import Control.Applicative (Applicative ((<*>),pure))"
  362. , ""
  363. , "import Data.Identity (Identity (runIdentity,Identity))"
  364. ]
  365. --------------------------------------------------------------------------------
  366. case18 :: Assertion
  367. case18 = expected @=? testStep
  368. (step 40 $ Align None AfterAlias InlineToMultiline Inherit 4 True) input'
  369. where
  370. expected = unlines
  371. ----------------------------------------
  372. [ "import Data.Foo as Foo (Bar, Baz, Foo)"
  373. , ""
  374. , "import Data.Identity"
  375. , " (Identity (Identity, runIdentity))"
  376. , ""
  377. , "import Data.Acid as Acid"
  378. , " ( closeAcidState"
  379. , " , createCheckpoint"
  380. , " , openLocalStateFrom"
  381. , " )"
  382. ]
  383. input' = unlines
  384. [ "import Data.Foo as Foo (Bar, Baz, Foo)"
  385. , ""
  386. , "import Data.Identity (Identity (Identity, runIdentity))"
  387. , ""
  388. , "import Data.Acid as Acid (closeAcidState, createCheckpoint, openLocalStateFrom)"
  389. ]
  390. --------------------------------------------------------------------------------
  391. case19 :: Assertion
  392. case19 = expected @=? testStep
  393. (step 40 $ Align Global NewLine InlineWithBreak RightAfter 17 True) input'
  394. where
  395. expected = unlines
  396. ----------------------------------------
  397. [ "import Prelude ()"
  398. , "import Prelude.Compat hiding"
  399. , " (foldMap)"
  400. , ""
  401. , "import Data.List"
  402. , " (foldl', intercalate,"
  403. , " intersperse)"
  404. ]
  405. input' = unlines
  406. [ "import Prelude.Compat hiding (foldMap)"
  407. , "import Prelude ()"
  408. , ""
  409. , "import Data.List (foldl', intercalate, intersperse)"
  410. ]