Skip to content

Commit 45a0459

Browse files
committed
Added more to-directory-tree tests
1 parent 6b9103d commit 45a0459

File tree

5 files changed

+92
-33
lines changed

5 files changed

+92
-33
lines changed

dhall/src/Dhall/DirectoryTree.hs

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ module Dhall.DirectoryTree
1212
toDirectoryTree
1313
, FilesystemError(..)
1414

15-
-- * Exported for testing only
15+
-- * Low-level types and functions
16+
, module Dhall.DirectoryTree.Types
17+
, decodeDirectoryTree
1618
, directoryTreeType
1719
) where
1820

@@ -170,7 +172,7 @@ toDirectoryTree
170172
-> FilePath
171173
-> Expr Void Void
172174
-> IO ()
173-
toDirectoryTree allowSeparators path expression = case Core.alphaNormalize expression of
175+
toDirectoryTree allowSeparators path expression = case expression of
174176
RecordLit keyValues ->
175177
Map.unorderedTraverseWithKey_ process $ recordFieldValue <$> keyValues
176178

@@ -197,24 +199,10 @@ toDirectoryTree allowSeparators path expression = case Core.alphaNormalize expre
197199
-- If this pattern matches we assume the user wants to use the fixpoint
198200
-- approach, hence we typecheck it and output error messages like we would
199201
-- do for every other Dhall program.
200-
Lam _ _ (Lam _ _ body) -> do
201-
let body' = Core.renote body
202-
let expression' = Core.renote expression
203-
204-
expected' <- case directoryTreeType of
205-
Success x -> return x
206-
Failure e -> Exception.throwIO e
207-
208-
_ <- Core.throws $ TypeCheck.typeOf $ Annot expression' expected'
209-
210-
entries <- case Decode.extract decoder body' of
211-
Success x -> return x
212-
Failure e -> Exception.throwIO e
202+
Lam _ _ (Lam _ _ _) -> do
203+
entries <- decodeDirectoryTree expression
213204

214205
processFilesystemEntryList allowSeparators path entries
215-
where
216-
decoder :: Decoder (Seq FilesystemEntry)
217-
decoder = Decode.auto
218206

219207
_ ->
220208
die
@@ -241,6 +229,23 @@ toDirectoryTree allowSeparators path expression = case Core.alphaNormalize expre
241229
where
242230
unexpectedExpression = expression
243231

232+
-- | Decode a fixpoint directory tree from a Dhall expression.
233+
decodeDirectoryTree :: Expr s Void -> IO (Seq FilesystemEntry)
234+
decodeDirectoryTree (Core.alphaNormalize . Core.denote -> expression@(Lam _ _ (Lam _ _ body))) = do
235+
expected' <- case directoryTreeType of
236+
Success x -> return x
237+
Failure e -> Exception.throwIO e
238+
239+
_ <- Core.throws $ TypeCheck.typeOf $ Annot expression expected'
240+
241+
case Decode.extract decoder body of
242+
Success x -> return x
243+
Failure e -> Exception.throwIO e
244+
where
245+
decoder :: Decoder (Seq FilesystemEntry)
246+
decoder = Decode.auto
247+
decodeDirectoryTree expr = Exception.throwIO $ FilesystemError $ Core.denote expr
248+
244249
-- | The type of a fixpoint directory tree expression.
245250
directoryTreeType :: Expector (Expr Src Void)
246251
directoryTreeType = Pi Nothing "tree" (Const Type)

dhall/src/Dhall/DirectoryTree/Types.hs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE DeriveAnyClass #-}
23
{-# LANGUAGE DeriveGeneric #-}
34
{-# LANGUAGE FlexibleInstances #-}
45
{-# LANGUAGE LambdaCase #-}
@@ -12,9 +13,9 @@
1213

1314
-- | Types used by the implementation of the @to-directory-tree@ subcommand
1415
module Dhall.DirectoryTree.Types
15-
( DirectoryEntry
16+
( FilesystemEntry(..)
17+
, DirectoryEntry
1618
, FileEntry
17-
, FilesystemEntry(..)
1819
, Entry(..)
1920
, User(..)
2021
, Group(..)
@@ -61,7 +62,7 @@ type FileEntry = Entry Text
6162
data FilesystemEntry
6263
= DirectoryEntry (Entry (Seq FilesystemEntry))
6364
| FileEntry (Entry Text)
64-
deriving Show
65+
deriving (Eq, Generic, Ord, Show)
6566

6667
instance FromDhall FilesystemEntry where
6768
autoWith normalizer = Decoder
@@ -83,7 +84,7 @@ data Entry a = Entry
8384
, entryGroup :: Maybe Group
8485
, entryMode :: Maybe (Mode Maybe)
8586
}
86-
deriving (Generic, Show)
87+
deriving (Eq, Generic, Ord, Show)
8788

8889
instance FromDhall a => FromDhall (Entry a) where
8990
autoWith = Decode.genericAutoWithInputNormalizer Decode.defaultInterpretOptions
@@ -94,7 +95,7 @@ instance FromDhall a => FromDhall (Entry a) where
9495
data User
9596
= UserId UserID
9697
| UserName String
97-
deriving (Generic, Show)
98+
deriving (Eq, Generic, Ord, Show)
9899

99100
instance FromDhall User
100101

@@ -110,7 +111,7 @@ instance FromDhall Posix.CUid where
110111
data Group
111112
= GroupId GroupID
112113
| GroupName String
113-
deriving (Generic, Show)
114+
deriving (Eq, Generic, Ord, Show)
114115

115116
instance FromDhall Group
116117

@@ -137,6 +138,8 @@ data Mode f = Mode
137138

138139
deriving instance Eq (Mode Identity)
139140
deriving instance Eq (Mode Maybe)
141+
deriving instance Ord (Mode Identity)
142+
deriving instance Ord (Mode Maybe)
140143
deriving instance Show (Mode Identity)
141144
deriving instance Show (Mode Maybe)
142145

@@ -161,6 +164,8 @@ data Access f = Access
161164

162165
deriving instance Eq (Access Identity)
163166
deriving instance Eq (Access Maybe)
167+
deriving instance Ord (Access Identity)
168+
deriving instance Ord (Access Maybe)
164169
deriving instance Show (Access Identity)
165170
deriving instance Show (Access Maybe)
166171

dhall/tests/Dhall/Test/DirectoryTree.hs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
{-# LANGUAGE OverloadedLists #-}
2+
{-# LANGUAGE OverloadedStrings #-}
3+
14
module Dhall.Test.DirectoryTree (tests) where
25

36
import Control.Monad
47
import Data.Either (partitionEithers)
58
import Data.Either.Validation
9+
import Dhall.DirectoryTree (Entry(..), Group(..), User(..))
610
import Lens.Family (set)
711
import System.FilePath ((</>))
812
import Test.Tasty
@@ -22,15 +26,15 @@ tests = testGroup "to-directory-tree"
2226
[ fixpointedType
2327
, fixpointedEmpty
2428
, fixpointedSimple
25-
, fixpointedMetadata
29+
, fixpointedPermissions
30+
, fixpointedUserGroup
2631
]
2732
]
2833

2934
fixpointedType :: TestTree
3035
fixpointedType = testCase "Type is as expected" $ do
3136
let file = "./tests/to-directory-tree/type.dhall"
32-
text <- Data.Text.IO.readFile file
33-
ref <- Dhall.inputExpr text
37+
ref <- Dhall.inputExpr file
3438
expected' <- case Dhall.DirectoryTree.directoryTreeType of
3539
Failure e -> assertFailure $ show e
3640
Success expr -> return expr
@@ -54,10 +58,10 @@ fixpointedSimple = testCase "simple" $ do
5458
, Directory $ outDir </> "directory"
5559
]
5660

57-
fixpointedMetadata :: TestTree
58-
fixpointedMetadata = testCase "metadata" $ do
59-
let outDir = "./tests/to-directory-tree/fixpoint-metadata.out"
60-
path = "./tests/to-directory-tree/fixpoint-metadata.dhall"
61+
fixpointedPermissions :: TestTree
62+
fixpointedPermissions = testCase "permissions" $ do
63+
let outDir = "./tests/to-directory-tree/fixpoint-permissions.out"
64+
path = "./tests/to-directory-tree/fixpoint-permissions.dhall"
6165
entries <- runDirectoryTree False outDir path
6266
entries @?=
6367
[ Directory outDir
@@ -67,6 +71,28 @@ fixpointedMetadata = testCase "metadata" $ do
6771
let mode = Files.fileMode s `Files.intersectFileModes` Files.accessModes
6872
mode @?= Files.ownerModes
6973

74+
fixpointedUserGroup :: TestTree
75+
fixpointedUserGroup = testCase "user and group" $ do
76+
let file = "./tests/to-directory-tree/fixpoint-usergroup.dhall"
77+
expr <- Dhall.inputExpr file
78+
entries <- Dhall.DirectoryTree.decodeDirectoryTree expr
79+
entries @?=
80+
[ Dhall.DirectoryTree.FileEntry $ Entry
81+
{ entryName = "ids"
82+
, entryContent = ""
83+
, entryUser = Just (UserId 0)
84+
, entryGroup = Just (GroupId 0)
85+
, entryMode = Nothing
86+
}
87+
, Dhall.DirectoryTree.FileEntry $ Entry
88+
{ entryName = "names"
89+
, entryContent = ""
90+
, entryUser = Just (UserName "user")
91+
, entryGroup = Just (GroupName "group")
92+
, entryMode = Nothing
93+
}
94+
]
95+
7096
runDirectoryTree :: Bool -> FilePath -> FilePath -> IO [FilesystemEntry]
7197
runDirectoryTree allowSeparators outDir path = do
7298
doesOutDirExist <- Directory.doesDirectoryExist outDir

dhall/tests/to-directory-tree/fixpoint-metadata.dhall renamed to dhall/tests/to-directory-tree/fixpoint-permissions.dhall

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ let User = (./fixpoint-helper.dhall).User
22

33
let Group = (./fixpoint-helper.dhall).Group
44

5-
let Access = (./fixpoint-helper.dhall).Access
6-
75
let Make = (./fixpoint-helper.dhall).Make
86

97
let no-access = { execute = Some False, read = Some False, write = Some False }
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
let User = (./fixpoint-helper.dhall).User
2+
3+
let Group = (./fixpoint-helper.dhall).Group
4+
5+
let Mode = (./fixpoint-helper.dhall).Mode
6+
7+
let Make = (./fixpoint-helper.dhall).Make
8+
9+
in \(r : Type) ->
10+
\(make : Make r) ->
11+
[ make.file
12+
{ name = "ids"
13+
, content = ""
14+
, user = Some (User.UserId 0)
15+
, group = Some (Group.GroupId 0)
16+
, mode = None Mode
17+
}
18+
, make.file
19+
{ name = "names"
20+
, content = ""
21+
, user = Some (User.UserName "user")
22+
, group = Some (Group.GroupName "group")
23+
, mode = None Mode
24+
}
25+
]

0 commit comments

Comments
 (0)