#lang racket (require rackunit) (require 2htdp/batch-io) ;; --------------------------------------------------------------------------------------------------- ;; use simulate file to test the I/O functions (check-equal? (simulate-file read-file "hello world" " good bye" "done") "hello world\n good bye\ndone") (check-equal? (simulate-file read-lines "hello world" " good bye" "done") '("hello world" " good bye" "done")) (check-equal? (simulate-file read-words "hello world" " good bye" "done") '("hello" "world" "good" "bye" "done")) (check-equal? (simulate-file read-words/line "hello world" " good bye" "done") '(("hello" "world") ("good" "bye") ("done"))) (check-equal? (simulate-file read-file) "") ;; --------------------------------------------------------------------------------------------------- ;; manipulate an actual file on disk (let () (define file "batch-io.txt") (define test1 #<list test1))) (write-file file test1) (check-equal? (read-1strings file) as-1strings1 "as-1strings 1") (define as-1strings2 (map string (apply append (map string->list (cdr (foldr (lambda (f r) (cons "\n" (cons f r))) '() test2-as-list)))))) (write-file file test2) (check-equal? (read-1strings file) as-1strings2 "as-lines 2") (define test2-a-as-list '("test1" "" "test2")) (define test2-a (apply string-append (list (first test2-as-list) (string #\newline) (string #\newline) (second test2-as-list)))) (write-file file test2-a) (check-equal? (read-lines file) test2-a-as-list "as-lines 2-a") (check-equal? (read-words file) '("test1" "test2") "as-words 2-a") (define test3 #<< eos word1, word2 word3, word4 eos ) (write-file file test3) (check-equal? (read-words file) '("word1," "word2" "word3," "word4") "as-words") (check-equal? (read-words/line file) '(("word1," "word2") ("word3," "word4")) "as-words") (check-equal? (read-csv-file file) '(("word1" "word2") ("word3" "word4")) "as-cvs 1") (check-equal? (read-csv-file/rows file length) '(2 2) "as-csv/rows") (delete-file file)) ;; --------------------------------------------------------------------------------------------------- ;; check failure more of functions. (check-exn exn:fail:contract? (lambda () (simulate-file cons))) ;; (check-exn exn:fail:contract? (lambda () (simulate-file))) ;; <--- figure this out (check-exn exn:fail:contract? (lambda () (write-file 0 1))) (check-exn exn:fail:contract? (lambda () (write-file '("test") 1))) (check-exn exn:fail:contract? (lambda () (write-file "test" '("test")))) (check-exn exn:fail:contract? (lambda () (read-file 0))) (check-exn exn:fail:contract? (lambda () (read-file '("test")))) (check-exn exn:fail:contract? (lambda () (read-lines 0))) (check-exn exn:fail:contract? (lambda () (read-lines '("test")))) (check-exn exn:fail:contract? (lambda () (read-1strings 0))) (check-exn exn:fail:contract? (lambda () (read-1strings '("test")))) ;; --------------------------------------------------------------------------------------------------- ;; read from stdio (let () (define *standard-out* "") (define-syntax-rule (catch-stdo e) (set! *standard-out* (with-output-to-string (lambda () e)))) (define-syntax-rule (pipe-stdi e) (with-input-from-string *standard-out* (lambda () e))) (define test1 #<list test1))) (catch-stdo (write-file 'standard-out test1)) (check-equal? (pipe-stdi (read-1strings 'standard-in)) as-1strings1 "as-1strings 1") (define as-1strings2 (map string (apply append (map string->list (cdr (foldr (lambda (f r) (cons "\n" (cons f r))) '() test2-as-list)))))) (catch-stdo (write-file 'standard-out test2)) (check-equal? (pipe-stdi (read-1strings 'standard-in)) as-1strings2 "as-lines 2") (define test2-a-as-list '("test1" "" "test2")) (define test2-a (apply string-append (list (first test2-as-list) (string #\newline) (string #\newline) (second test2-as-list)))) (catch-stdo (write-file 'standard-out test2-a)) (check-equal? (pipe-stdi (read-lines 'standard-in)) test2-a-as-list "as-lines 2-a") (check-equal? (pipe-stdi (read-words 'standard-in)) '("test1" "test2") "as-words 2-a") (define test3 #<< eos word1, word2 word3, word4 eos ) (catch-stdo (write-file 'standard-out test3)) (check-equal? (pipe-stdi (read-words 'standard-in)) '("word1," "word2" "word3," "word4") "as-words") (check-equal? (pipe-stdi (read-words/line 'standard-in)) '(("word1," "word2") ("word3," "word4")) "as-words") (check-equal? (pipe-stdi (read-csv-file 'standard-in)) '(("word1" "word2") ("word3" "word4")) "as-cvs 1") (check-equal? (pipe-stdi (read-csv-file/rows 'standard-in length)) '(2 2) "as-csv/rows"))