blob: c66150d63ffa81f174f39be5cf4bfc9f5aeab408 (
plain)
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
|
(.using
[library
[lux "*"
["_" test {"+" Test}]
[abstract
["[0]" monad {"+" do}]]
[control
["[0]" try {"+" Try}]
[concurrency
["[0]" async {"+" Async}]]]
[data
[binary {"+" Binary}]
["[0]" product]
["[0]" text ("[1]#[0]" equivalence)
["%" format {"+" format}]]
[collection
["[0]" list ("[1]#[0]" functor)]
["[0]" set]]]
[math
["[0]" random {"+" Random}]
[number
["n" nat]]]
[world
["[0]" file {"+" Path}]]]]
[//
["@[0]" version]
[//
["@[0]" profile]
[//
[lux
[data
["$[0]" binary]]]]]]
[\\program
["[0]" /
["//[1]" /// "_"
["[1]" profile]
["[1][0]" action {"+" Action}]]]])
(def: node_name
(Random Text)
(random.ascii/alpha 10))
(def: (files prefix)
(-> Path (Random (List [Path Binary])))
(do [! random.monad]
[count (# ! each (n.% 10) random.nat)
names (random.set text.hash count ..node_name)
contents (random.list count ($binary.random 100))]
(in (list.zipped/2 (list#each (|>> (format prefix)) (set.list names))
contents))))
(def: (create_file! fs [path content])
(-> (file.System Async) [Path Binary] (Async (Try Any)))
(# fs write content path))
(def: (create_directory! fs path files)
(-> (file.System Async) Path (List [Path Binary]) (Async (Try Any)))
(do [! (try.with async.monad)]
[_ (: (Async (Try Any))
(file.make_directories async.monad fs path))
_ (monad.each ! (..create_file! fs) files)]
(in [])))
(def: (directory_exists? fs)
(-> (file.System Async) Path (Async (Try Bit)))
(|>> (# fs directory?) (try.lifted async.monad)))
(def: (file_exists? fs)
(-> (file.System Async) Path (Async (Try Bit)))
(|>> (# fs file?) (try.lifted async.monad)))
(def: (assets_exist? fs directory_path files)
(-> (file.System Async) Path (List [Path Binary]) (Async (Try Bit)))
(do [! (try.with async.monad)]
[directory_exists? (..directory_exists? fs directory_path)
files_exist? (: (Action (List Bit))
(|> files
(list#each product.left)
(monad.each ///action.monad (..file_exists? fs))))]
(in (and directory_exists?
(list.every? (|>>) files_exist?)))))
(def: .public test
Test
(<| (_.covering /._)
(do [! random.monad]
[context ..node_name
target ..node_name
sub ..node_name
.let [fs (file.mock (# file.default separator))
/ (# fs separator)
target_path (format context / target)
sub_path (format target_path / sub)]
direct_files (..files (format target_path /))
sub_files (..files (format sub_path /))
dummy @profile.random]
(in (do async.monad
[.let [console (@version.echo "")]
verdict (do [! (try.with async.monad)]
[_ (..create_directory! fs target_path direct_files)
_ (..create_directory! fs sub_path sub_files)
context_exists!/pre (..directory_exists? fs context)
target_exists!/pre (..assets_exist? fs target_path direct_files)
sub_exists!/pre (..assets_exist? fs sub_path sub_files)
_ (/.do! console fs (with@ ///.#target target_path dummy))
context_exists!/post (..directory_exists? fs context)
target_exists!/post (..assets_exist? fs target_path direct_files)
sub_exists!/post (..assets_exist? fs sub_path sub_files)
logging (# console read_line [])]
(in (and (and context_exists!/pre
context_exists!/post)
(and target_exists!/pre
(not target_exists!/post))
(and sub_exists!/pre
(not sub_exists!/post))
(text#= (/.success target_path) logging))))]
(_.cover' [/.do! /.success]
(try.else false verdict)))))))
|