aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/world/file.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/test/lux/world/file.lux')
-rw-r--r--stdlib/source/test/lux/world/file.lux195
1 files changed, 195 insertions, 0 deletions
diff --git a/stdlib/source/test/lux/world/file.lux b/stdlib/source/test/lux/world/file.lux
new file mode 100644
index 000000000..b3693f207
--- /dev/null
+++ b/stdlib/source/test/lux/world/file.lux
@@ -0,0 +1,195 @@
+(.module:
+ [lux #*
+ ["." io (#+ IO)]
+ [control
+ [monad (#+ do)]
+ [security
+ ["." integrity (#+ Dirty)]]]
+ [concurrency
+ ["." promise]]
+ [data
+ ["." error (#+ Error)]
+ ["." number]
+ ["." text
+ format]
+ [collection
+ ["." list]]]
+ [time
+ ["." instant]
+ ["." duration]]
+ [world
+ ["@" file (#+ Path File)]
+ ["." binary (#+ Binary)]]
+ [math
+ ["r" random ("r/." monad)]]]
+ lux/test
+ [//
+ ["_." binary]])
+
+(def: truncate-millis
+ (|>> (i// +1_000) (i/* +1_000)))
+
+(def: (creation-and-deletion number)
+ (-> Nat Test)
+ (r/wrap (do promise.monad
+ [#let [path (format "temp_file_" (%n number))]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [#let [check-existence! (: (IO (Error Bit))
+ (io.from-io (@.exists? io.monad @.system path)))]
+ pre! check-existence!
+ file (:: @.system create-file path)
+ post! check-existence!
+ _ (:: file delete [])
+ remains? check-existence!]
+ (wrap (and (not pre!)
+ post!
+ (not remains?)))))]
+ (assert "Can create/delete files."
+ (error.default #0 result)))))
+
+(def: (read-and-write number data)
+ (-> Nat Binary Test)
+ (r/wrap (do promise.monad
+ [#let [path (format "temp_file_" (%n number))]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [file (:: @.system create-file path)
+ _ (:: file over-write data)
+ content (:: file content [])
+ _ (:: file delete [])]
+ (wrap (:: binary.equivalence = data (integrity.trust content)))))]
+ (assert "Can write/read files."
+ (error.default #0 result)))))
+
+(context: "File system."
+ (do @
+ [file-size (|> r.nat (:: @ map (|>> (n/% 100) (n/max 10))))
+ dataL (_binary.binary file-size)
+ dataR (_binary.binary file-size)
+ new-modified (|> r.int (:: @ map (|>> (:: number.number abs)
+ truncate-millis
+ duration.from-millis
+ instant.absolute)))]
+ ($_ seq
+ (creation-and-deletion 0)
+ (read-and-write 1 dataL)
+ (wrap (do promise.monad
+ [#let [path "temp_file_2"]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [file (:: @.system create-file path)
+ _ (:: file over-write dataL)
+ read-size (:: file size [])
+ _ (:: file delete [])]
+ (wrap (n/= file-size read-size))))]
+ (assert "Can read file size."
+ (error.default #0 result))))
+ (wrap (do promise.monad
+ [#let [path "temp_file_3"]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [file (:: @.system create-file path)
+ _ (:: file over-write dataL)
+ _ (:: file append dataR)
+ content (:: file content [])
+ read-size (:: file size [])
+ _ (:: file delete [])]
+ (wrap (and (n/= (n/* 2 file-size) read-size)
+ (:: binary.equivalence =
+ dataL
+ (error.assume (binary.slice 0 (dec file-size)
+ (integrity.trust content))))
+ (:: binary.equivalence =
+ dataR
+ (error.assume (binary.slice file-size (dec read-size)
+ (integrity.trust content))))))))]
+ (assert "Can append to files."
+ (error.default #0 result))))
+ (wrap (do promise.monad
+ [#let [path "temp_dir_4"]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [#let [check-existence! (: (IO (Error Bit))
+ (io.from-io (@.exists? io.monad @.system path)))]
+ pre! check-existence!
+ dir (:: @.system create-directory path)
+ post! check-existence!
+ _ (:: dir discard [])
+ remains? check-existence!]
+ (wrap (and (not pre!)
+ post!
+ (not remains?)))))]
+ (assert "Can create/delete directories."
+ (error.default #0 result))))
+ (wrap (do promise.monad
+ [#let [file-path "temp_file_5"
+ dir-path "temp_dir_5"]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [dir (:: @.system create-directory dir-path)
+ file (:: @.system create-file (format dir-path "/" file-path))
+ _ (:: file over-write dataL)
+ read-size (:: file size [])
+ _ (:: file delete [])
+ _ (:: dir discard [])]
+ (wrap (n/= file-size read-size))))]
+ (assert "Can create files inside of directories."
+ (error.default #0 result))))
+ (wrap (do promise.monad
+ [#let [file-path "temp_file_6"
+ dir-path "temp_dir_6"
+ inner-dir-path "inner_temp_dir_6"]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [dir (:: @.system create-directory dir-path)
+ pre-files (:: dir files [])
+ pre-directories (:: dir directories [])
+
+ file (:: @.system create-file (format dir-path "/" file-path))
+ inner-dir (:: @.system create-directory (format dir-path "/" inner-dir-path))
+ post-files (:: dir files [])
+ post-directories (:: dir directories [])
+
+ _ (:: file delete [])
+ _ (:: inner-dir discard [])
+ _ (:: dir discard [])]
+ (wrap (and (and (n/= 0 (list.size pre-files))
+ (n/= 0 (list.size pre-directories)))
+ (and (n/= 1 (list.size post-files))
+ (n/= 1 (list.size post-directories)))))))]
+ (assert "Can list files/directories inside a directory."
+ (error.default #0 result))))
+ (wrap (do promise.monad
+ [#let [path "temp_file_7"]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [file (:: @.system create-file path)
+ _ (:: file over-write dataL)
+ _ (:: file modify new-modified)
+ old-modified (:: file last-modified [])
+ _ (:: file delete [])]
+ (wrap (:: instant.equivalence = new-modified old-modified))))]
+ (assert "Can change the time of last modification."
+ (error.default #0 result))))
+ (wrap (do promise.monad
+ [#let [path0 (format "temp_file_8+0")
+ path1 (format "temp_file_8+1")]
+ result (promise.future
+ (do (error.ErrorT io.monad)
+ [#let [check-existence! (: (-> Path (IO (Error Bit)))
+ (|>> (@.exists? io.monad @.system) io.from-io))]
+ file0 (:: @.system create-file path0)
+ _ (:: file0 over-write dataL)
+ pre! (check-existence! path0)
+ file1 (: (IO (Error (File IO))) ## TODO: Remove :
+ (:: file0 move path1))
+ post! (check-existence! path0)
+ confirmed? (check-existence! path1)
+ _ (:: file1 delete [])]
+ (wrap (and pre!
+ (not post!)
+ confirmed?))))]
+ (assert "Can move a file from one path to another."
+ (error.default #0 result))))
+ )))