Files

165 lines
5.6 KiB
Racket

#lang racket/base
(require rackunit
racket/path
racket/file
racket/port
"../private/coreutils.rkt"
"../private/extended.rkt"
"../private/dispatcher.rkt"
"../private/help.rkt"
"../private/racket-tools.rkt"
"../private/env-support.rkt")
(define (capture-output procedure . args)
(with-output-to-string
(λ ()
(apply procedure args))))
(define (capture-filter input procedure . args)
(parameterize ([current-input-port (open-input-string input)])
(apply capture-output procedure args)))
(define test-root (make-temporary-file "rash-coreutils-~a" 'directory))
(dynamic-wind
void
(λ ()
(parameterize ([current-directory test-root])
(coreutils-mkdir "a")
(check-true (directory-exists? "a"))
(coreutils-mkdir "-p" "b/c")
(check-true (directory-exists? "b/c"))
(coreutils-touch "one.txt")
(check-true (file-exists? "one.txt"))
(call-with-output-file "one.txt"
#:exists 'truncate
(λ (out)
(display "hello\n" out)))
(check-equal? (capture-output coreutils-cat "one.txt") "hello\n")
(coreutils-cp "one.txt" "two.txt")
(check-true (file-exists? "two.txt"))
(coreutils-mv "two.txt" "three.txt")
(check-false (file-exists? "two.txt"))
(check-true (file-exists? "three.txt"))
(check-equal? (capture-output coreutils-echo "hello" "world")
"hello world\n")
(check-true (regexp-match? #rx"one[.]txt"
(capture-output coreutils-ls)))
(define long-listing (capture-output coreutils-ls "-l"))
(check-true (regexp-match? #rx"[-] +[0-9]+ +one[.]txt"
long-listing))
(coreutils-touch ".hidden")
(define long-all-listing (capture-output coreutils-ls "-la"))
(check-true (regexp-match? #rx"[-] +[0-9]+ +[.]hidden"
long-all-listing))
(coreutils-touch "info1.rkt")
(coreutils-touch "info22.rkt")
(coreutils-touch "other.rkt")
(define regexp-arguments
(expand-coreutils-arguments (list #px"^info[0-9]+[.]rkt$")))
(check-equal?
(sort (map (λ (path)
(path->string (file-name-from-path path)))
regexp-arguments)
string<?)
(list "info1.rkt" "info22.rkt"))
(define regexp-listing
(with-output-to-string
(λ ()
(dispatch-coreutils-command
'ls
#px"^info[0-9]+[.]rkt$"))))
(check-true (regexp-match? #rx"info1[.]rkt" regexp-listing))
(check-true (regexp-match? #rx"info22[.]rkt" regexp-listing))
(check-false (regexp-match? #rx"other[.]rkt" regexp-listing))
(define multiple-file-listing
(capture-output coreutils-ls "info1.rkt" "info22.rkt"))
(check-equal? multiple-file-listing
"info1.rkt\ninfo22.rkt\n")
(check-equal? (coreutils-help-search-term 'ls) "rash-coreutils-ls")
(check-equal? (coreutils-help-search-term 'directory-list)
"directory-list")
(check-equal? (coreutils-help-search-term 'raco) "rash-coreutils-raco")
(check-true (path? (find-raco-executable)))
(check-true (procedure? coreutils-raco))
(call-with-output-file "lines.txt"
#:exists 'truncate
(λ (out)
(display "one\ntwo\nthree\n" out)))
(check-equal? (capture-output coreutils-head "-n" "2" "lines.txt")
"one\ntwo\n")
(check-equal? (capture-output coreutils-tail "-n" "1" "lines.txt")
"three\n")
(check-equal? (capture-output coreutils-wc "-l" "lines.txt")
"3\n")
(check-equal? (capture-output coreutils-basename "a/b/c.txt")
"c.txt\n")
(check-equal? (capture-filter "abcde\n" coreutils-tr "a-z" "A-Z")
"ABCDE\n")
(check-equal? (capture-filter "a1b2c3\n" coreutils-tr "-d" "0-9")
"abc\n")
(check-equal? (capture-filter "a b\n" coreutils-tr "-s" " ")
"a b\n")
(check-true (regexp-match? #rx"a[/\\]b"
(capture-output coreutils-dirname "a/b/c.txt")))
(define env-output
(parameterize ([current-coreutils-command-runner
(λ (command)
(and (equal? command '(printenv RASH_COREUTILS_VALUE))
(begin
(coreutils-printenv 'RASH_COREUTILS_VALUE)
#t)))])
(capture-output
coreutils-env
(environment-assignment "RASH_COREUTILS_VALUE" 42)
'printenv
'RASH_COREUTILS_VALUE)))
(check-equal? env-output "42\n")
(define test-environment
(environment-variables-copy (current-environment-variables)))
(environment-variables-set!
test-environment
#"RASH_COREUTILS_TEST"
#"before")
(parameterize ([current-environment-variables test-environment])
(check-equal? (capture-output coreutils-printenv "RASH_COREUTILS_TEST")
"before\n"))
(check-true (regexp-match? #px"[0-9]{4}-[0-9]{2}-[0-9]{2}T"
(capture-output coreutils-date "--iso")))
(check-exn
exn:fail?
(λ ()
(expand-coreutils-arguments (list #px"^does-not-exist$"))))
(coreutils-rm "three.txt")
(check-false (file-exists? "three.txt"))
(coreutils-rm "-r" "b")
(check-false (directory-exists? "b"))
(coreutils-rmdir "a")
(check-false (directory-exists? "a"))))
(λ ()
(when (directory-exists? test-root)
(delete-directory/files test-root))))