-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy path03-ToCTestData.purs
58 lines (50 loc) · 2.15 KB
/
03-ToCTestData.purs
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
module Test.ToC.MainLogic.ToCTestData (ToCTestData(..)) where
import Prelude
import Control.Comonad.Cofree (head, tail)
import Control.Monad.Rec.Class (Step(..), tailRec)
import Data.List (List(..), filter, (:))
import Data.Tree (Tree, Forest, showTree)
import Test.QuickCheck (class Arbitrary)
import Test.ToC.MainLogic.Common (FileSystemInfo(..))
import Test.ToC.MainLogic.Generators (genFileSystem)
newtype ToCTestData = ToCTestData { fileSystem :: Tree FileSystemInfo
, expectedOutput :: String
}
instance showToCTestData :: Show ToCTestData where
show (ToCTestData rec) = showTree rec.fileSystem
instance arbitraryToCTestData :: Arbitrary ToCTestData where
arbitrary = do
fileSystemTree <- genFileSystem
pure $ ToCTestData
{ fileSystem: fileSystemTree
, expectedOutput: renderFS fileSystemTree
}
where
renderFS :: Tree FileSystemInfo -> String
renderFS fsTree =
let
rootDirChildren = tail fsTree
isTopLevelIncludedDir cofree = case head cofree of
DirectoryInfo _ included | included -> true
_ -> false
topLevelIncludedDirs = filter isTopLevelIncludedDir rootDirChildren
in
tailRec renderForest { content: "", treeList: topLevelIncludedDirs }
renderTree :: Tree FileSystemInfo -> String
renderTree oneTree =
let
dirOrFile = head oneTree
children = tail oneTree
in
case dirOrFile of
DirectoryInfo path included | included ->
tailRec renderForest { content: path <> "\n", treeList: children }
FileInfo path included _ _ | included -> path <> "\n"
_ -> ""
renderForest :: { content :: String, treeList :: Forest FileSystemInfo }
-> Step { content :: String, treeList :: Forest FileSystemInfo } String
renderForest { content: c, treeList: Nil } = Done c
renderForest { content: c, treeList: thisTree:remainingTrees } =
Loop { content: c <> renderTree thisTree
, treeList: remainingTrees
}