File: Simple.hs

package info (click to toggle)
haskell-cabal-install 3.12.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 3,552 kB
  • sloc: haskell: 65,985; sh: 80; makefile: 5
file content (204 lines) | stat: -rw-r--r-- 7,554 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
module UnitTests.Distribution.Client.Init.Simple
  ( tests
  ) where

import Test.Tasty
import Test.Tasty.HUnit
import Prelude as P

import Distribution.Client.Init.Defaults
import Distribution.Client.Init.Simple
import Distribution.Client.Init.Types

import Data.List.NonEmpty hiding (zip)
import Distribution.Client.Types
import Distribution.Simple.PackageIndex hiding (fromList)
import Distribution.Types.PackageName
import Distribution.Verbosity

import qualified Data.List.NonEmpty as NEL
import qualified Data.Set as Set
import Distribution.Client.Init.FlagExtractors (getCabalVersionNoPrompt)
import Distribution.Client.Init.Utils (getBaseDep, mkPackageNameDep)
import Distribution.Simple.Setup
import Distribution.Types.Dependency
import UnitTests.Distribution.Client.Init.Utils

tests
  :: Verbosity
  -> InitFlags
  -> InstalledPackageIndex
  -> SourcePackageDb
  -> TestTree
tests v _initFlags pkgIx srcDb =
  testGroup
    "Distribution.Client.Init.Simple.hs"
    [ simpleCreateProjectTests v pkgIx srcDb pkgName
    ]
  where
    pkgName = mkPackageName "simple-test"

simpleCreateProjectTests
  :: Verbosity
  -> InstalledPackageIndex
  -> SourcePackageDb
  -> PackageName
  -> TestTree
simpleCreateProjectTests v pkgIx srcDb pkgName =
  testGroup
    "Simple createProject tests"
    [ testCase "Simple lib createProject - no tests" $ do
        let inputs =
              fromList
                [ "1" -- package type: Library
                , "simple.test" -- package dir: used for determining package name;
                -- note that . will be replaced with - in a sanitization step,
                -- and we get the expected "simple-test" -- regression test for #8404
                , "simple.test" -- package dir again: the prompt monad needs extra parameter for every
                -- IO call, and this one will be used for canonicalizePath,
                -- which is called as a part of sanitization
                , "n" -- no tests
                ]

            flags = emptyFlags{packageType = Flag Library}
            settings =
              ProjectSettings
                (WriteOpts False False False v "/home/test/1" Library pkgName defaultCabalVersion)
                (simplePkgDesc pkgName)
                (Just $ simpleLibTarget baseDep)
                Nothing
                Nothing

        case _runPrompt (createProject v pkgIx srcDb flags) inputs of
          Left e -> assertFailure $ "Failed to create simple lib project: " ++ show e
          Right (settings', _) -> settings @=? settings'
    , testCase "Simple lib createProject - with tests" $ do
        let inputs = fromList ["1", "simple-test", "simple-test", "y", "1"]
            flags = emptyFlags{packageType = Flag Library}
            settings =
              ProjectSettings
                (WriteOpts False False False v "/home/test/1" Library pkgName defaultCabalVersion)
                (simplePkgDesc pkgName)
                (Just $ simpleLibTarget baseDep)
                Nothing
                (Just $ simpleTestTarget (Just pkgName) baseDep)

        case _runPrompt (createProject v pkgIx srcDb flags) inputs of
          Left e -> assertFailure $ "Failed to create simple lib (with tests)project: " ++ show e
          Right (settings', _) -> settings @=? settings'
    , testCase "Simple exe createProject" $ do
        let inputs = fromList ["2", "simple-test", "simple-test"]
            flags = emptyFlags{packageType = Flag Executable}
            settings =
              ProjectSettings
                (WriteOpts False False False v "/home/test/2" Executable pkgName defaultCabalVersion)
                (simplePkgDesc pkgName)
                Nothing
                (Just $ simpleExeTarget Nothing baseDep)
                Nothing

        case _runPrompt (createProject v pkgIx srcDb flags) inputs of
          Left e -> assertFailure $ "Failed to create simple exe project: " ++ show e
          Right (settings', _) -> settings @=? settings'
    , testCase "Simple lib+exe createProject - no tests" $ do
        let inputs = fromList ["2", "simple-test", "simple-test", "n"]
            flags = emptyFlags{packageType = Flag LibraryAndExecutable}
            settings =
              ProjectSettings
                (WriteOpts False False False v "/home/test/2" LibraryAndExecutable pkgName defaultCabalVersion)
                (simplePkgDesc pkgName)
                (Just $ simpleLibTarget baseDep)
                (Just $ simpleExeTarget (Just pkgName) baseDep)
                Nothing

        case _runPrompt (createProject v pkgIx srcDb flags) inputs of
          Left e -> assertFailure $ "Failed to create simple lib+exe project: " ++ show e
          Right (settings', _) -> settings @=? settings'
    , testCase "Simple lib+exe createProject - with tests" $ do
        let inputs = fromList ["2", "simple-test", "simple-test", "y", "1"]
            flags = emptyFlags{packageType = Flag LibraryAndExecutable}
            settings =
              ProjectSettings
                (WriteOpts False False False v "/home/test/2" LibraryAndExecutable pkgName defaultCabalVersion)
                (simplePkgDesc pkgName)
                (Just $ simpleLibTarget baseDep)
                (Just $ simpleExeTarget (Just pkgName) baseDep)
                (Just $ simpleTestTarget (Just pkgName) baseDep)

        case _runPrompt (createProject v pkgIx srcDb flags) inputs of
          Left e -> assertFailure $ "Failed to create simple lib+exe (with tests) project: " ++ show e
          Right (settings', _) -> settings @=? settings'
    , testCase "Simple standalone tests" $ do
        let inputs = fromList ["2", "simple-test", "simple-test", "y", "1"]
            flags = emptyFlags{packageType = Flag TestSuite}
            settings =
              ProjectSettings
                (WriteOpts False False False v "/home/test/2" TestSuite pkgName defaultCabalVersion)
                (simplePkgDesc pkgName)
                Nothing
                Nothing
                (Just $ simpleTestTarget Nothing baseDep)

        case _runPrompt (createProject v pkgIx srcDb flags) inputs of
          Left e -> assertFailure $ "Failed to create simple standalone test project: " ++ show e
          Right (settings', _) -> settings @=? settings'
    ]
  where
    baseDep = case _runPrompt (getBaseDep pkgIx emptyFlags) $ fromList [] of
      Left e -> error $ show e
      Right a -> fst a

-- -------------------------------------------------------------------- --
-- Utils

mkPkgDep :: Maybe PackageName -> [Dependency]
mkPkgDep Nothing = []
mkPkgDep (Just pn) = [mkPackageNameDep pn]

simplePkgDesc :: PackageName -> PkgDescription
simplePkgDesc pkgName =
  PkgDescription
    defaultCabalVersion
    pkgName
    defaultVersion
    (defaultLicense $ getCabalVersionNoPrompt dummyFlags)
    ""
    ""
    ""
    ""
    ""
    mempty
    (Just $ Set.singleton defaultChangelog)

simpleLibTarget :: [Dependency] -> LibTarget
simpleLibTarget baseDep =
  LibTarget
    [defaultSourceDir]
    defaultLanguage
    (myLibModule NEL.:| [])
    []
    []
    baseDep
    []

simpleExeTarget :: Maybe PackageName -> [Dependency] -> ExeTarget
simpleExeTarget pn baseDep =
  ExeTarget
    defaultMainIs
    [defaultApplicationDir]
    defaultLanguage
    []
    []
    (baseDep ++ mkPkgDep pn)
    []

simpleTestTarget :: Maybe PackageName -> [Dependency] -> TestTarget
simpleTestTarget pn baseDep =
  TestTarget
    defaultMainIs
    [defaultTestDir]
    defaultLanguage
    []
    []
    (baseDep ++ mkPkgDep pn)
    []