(assert-fail (buffer 123))(def b (buffer))(assert (io? b))(assert (eq? (type-of b) 'io))(assert (eq? (io-buffer-mode b) :memory))(assert (= (size-of b) 0)) ; no data(assert (= (io-pos b) 0))(assert (= (io-pos! b 1) 0))(assert (eof-object? (io-read b 'u8))) ; empty - EOF(assert (io-eof? b))(assert (eof-object? (io-read b 'u8))) ; still empty - EOF again(assert (io-eof? b)); write one rune(assert (= (io-write b #\¢) 3))(assert (= (size-of b) 3))(assert (= (io-pos b) 3)); go back(assert (= (io-pos! b 0) 0))(assert (not (io-eof? b))); read it back and compare(def x (io-read b 'rune))(assert (eq? (type-of x) 'rune))(assert (equal? x #\¢))(assert (not (io-eof? b)))(assert (eof-object? (io-read b 'rune)))(assert (io-eof? b))(assert (= (io-pos b) 3)); read as an array of bytes and compare(assert (= (io-pos! b 0) 0))(assert (equal? (io-read b 'u8 3) (arr 'u8 #xef #xbf #xa0))); go back and try reading more than there is(assert (= (io-pos! b 0) 0))(assert (eof-object? (io-read b 'u8 4)));(assert (io-eof? b)) ; FIXME shouldn't it return T?; go back and read as an utf8 string(assert (= (io-pos! b 0) 0))(assert (equal? (io-read b 'utf8) "¢")); go back and read as an array of runes(assert (= (io-pos! b 0) 0))(assert (equal? (io-read b 'rune 1) (arr 'rune #\¢))); skip back and forth(assert (= (io-skip b -1) 2))(assert (= (io-pos b) 2))(assert (= (io-skip b -1) 1))(assert (= (io-pos b) 1))(assert (= (io-skip b -2 :end T) 1))(assert (= (io-pos b) 1))(assert (= (io-skip b -3 :end T) 0))(assert (= (io-pos b) 0))(assert (equal? (io-read b 'rune) #\¢)); convert to string - destructive operation(assert (= (io-pos! b 0) 0))(assert (equal? (io->str b) "¢"))(assert (= (io-pos b) 0))(assert (= (io-pos! b 9) 0))(assert (= (size-of b) 0)); filename(assert (equal? (io-filename b) ""))(assert (equal? (io-filename! b "hi") "hi"))(assert (equal? (io-filename b) "hi")); write some more(assert (= (io-write b "hello") 5)); truncate(assert (void? (io-truncate b 3))) ; shrinking(assert (= (size-of b) 3))(assert (= (io-pos b) 3))(assert (void? (io-truncate b 0))) ; emptying(assert (eof-object? (io-read b 'u8)))(assert (io-eof? b))(assert (= (size-of b) 0))(assert (= (io-pos b) 0))(assert (= (io-pos! b 1) 0))(assert (eof-object? (io-read b 'u8)))(assert (io-eof? b)); closed from now on(assert (void? (io-close b))); can close again without errors - noop(assert (void? (io-close b))); filename still usable(assert (equal? (io-filename b) "hi"))(assert (equal? (io-filename! b "no") "no"))(assert (equal? (io-filename b) "no")); can't do much(assert-fail (io->str b) io-error)(assert-fail (io-buffer-mode b) io-error)(assert-fail (io-buffer-mode! b NIL) io-error)(assert-fail (io-eof? b) io-error)(assert-fail (io-peek-rune b) io-error)(assert-fail (io-pos b) io-error)(assert-fail (io-pos! b 0) io-error)(assert-fail (io-read b 'u8) io-error)(assert-fail (io-read-all b) io-error)(assert-fail (io-read-line b) io-error)(assert-fail (io-read-lines b) io-error)(assert-fail (io-read-until b #\x) io-error)(assert-fail (io-skip b 0) io-error)(assert-fail (io-truncate b 0) io-error)(assert-fail (io-write b "") io-error)(def b (buffer)); write an array of runes(assert (= (io-write b (arr 'rune #\¡ #\¿ #\nul #\x #\y #\z)) 8))(assert (= (io-pos! b 0))); read back as an utf8 string, 3 runes total(assert (equal? (io-read b 'utf8 3) "¡¿\x00"))(assert (= (io-pos! b 0))); now peek a rune(assert (equal? (io-peek-rune b) #\¡))(assert (equal? (io-peek-rune b) #\¡)); read until #\nul(assert (equal? (io-read-until b #\nul) "¡¿\x00")); read the rest as a line(assert (equal? (io-read-line b) "xyz")); nothing left(assert (equal? (io-read-all b) ""))(assert (eof-object? (io-read b 'u8))); path-cwd(assert (str? (path-cwd)))(assert (path-cwd "."))(assert-fail (path-cwd "." ".") arity-error)(assert-fail (path-cwd "does/not/exist") io-error); path-exists? + delete-file(assert (path-exists? "."))(assert (not (path-exists? "doesnotexist.txt")))(assert-fail (delete-file "doesnotexist.txt") io-error)(def f (file "doesexist.txt" :write :create :truncate))(assert (io? f))(assert (path-exists? "doesexist.txt"))(assert-fail (io-read f 'u8) io-error) ; read on write-only(io-close f)(assert (path-exists? "doesexist.txt"))(def f (file "doesexist.txt"))(assert (io? f))(assert-fail (io-write f (u8 0)) io-error) ; write on read-only(assert (delete-file "doesexist.txt"))(assert (not (path-exists? "doesexist.txt")))(assert (eof-object? (io-read f 'u8)))(assert (void? (io-close f)))(def lines '("12345 абвгд weoiwhefohwefoihweoifh wefiweu3209u092039 jhksjdvksdjvbksdvb qwhqhfohwefe weofhweofhoiewhfoiwhefh\n" "hello, world!\n" "\n" "\n" "x"))(def data (apply str lines))(def f (file "test.txt" :write :create :append :truncate))(assert (io? f))(assert (eq? (io-buffer-mode f) :block))(assert-fail (io-buffer-mode!))(assert-fail (io-buffer-mode! f))(assert-fail (io-buffer-mode! f 'blah))(assert-fail (io-buffer-mode! f :memory))(assert (eq? (io-buffer-mode! f :block) :block))(assert (eq? (io-buffer-mode f) :block))(assert (eq? (io-buffer-mode! f :line) :line))(assert (eq? (io-buffer-mode f) :line))(assert (eq? (io-buffer-mode! f NIL) NIL))(assert (eq? (io-buffer-mode f) NIL))(assert (eq? (io-buffer-mode! f :line) :line))(assert (= (io-write f data) (size-of data)))(def f2 (file "test.txt"))(assert (= (io-skip f2 0 :end T) (1- (size-of data))))(assert (io-flush f))(assert (= (io-skip f2 0 :end T) (size-of data)))(assert (void? (io-close f2)))(assert (void? (io-close f)))(def f (file "test.txt" :read))(assert (io? f))(assert (equal? (io-read-lines f) lines))(assert (= (io-line f) 5))(assert (= (io-column f) 1))(assert (= (io-pos! f 0)))(assert (equal? (io-read-all f) data))(assert (= (io-line f) 5))(assert (= (io-column f) 1))(assert-fail (io-truncate f 0))(assert (void? (io-close f)))(assert (void? (delete-file "test.txt")))
(assert-fail (buffer 123))
(def b (buffer))
(assert (io? b))
(assert (eq? (type-of b) 'io))
(assert (eq? (io-buffer-mode b) :memory))
(assert (= (size-of b) 0)) ; no data
(assert (= (io-pos b) 0))
(assert (= (io-pos! b 1) 0))
(assert (eof-object? (io-read b 'u8))) ; empty - EOF
(assert (io-eof? b))
(assert (eof-object? (io-read b 'u8))) ; still empty - EOF again
(assert (io-eof? b))
; write one rune
(assert (= (io-write b #\¢) 3))
(assert (= (size-of b) 3))
(assert (= (io-pos b) 3))
; go back
(assert (= (io-pos! b 0) 0))
(assert (not (io-eof? b)))
; read it back and compare
(def x (io-read b 'rune))
(assert (eq? (type-of x) 'rune))
(assert (equal? x #\¢))
(assert (not (io-eof? b)))
(assert (eof-object? (io-read b 'rune)))
(assert (io-eof? b))
(assert (= (io-pos b) 3))
; read as an array of bytes and compare
(assert (= (io-pos! b 0) 0))
(assert (equal? (io-read b 'u8 3) (arr 'u8 #xef #xbf #xa0)))
; go back and try reading more than there is
(assert (= (io-pos! b 0) 0))
(assert (eof-object? (io-read b 'u8 4)))
;(assert (io-eof? b)) ; FIXME shouldn't it return T?
; go back and read as an utf8 string
(assert (= (io-pos! b 0) 0))
(assert (equal? (io-read b 'utf8) "¢"))
; go back and read as an array of runes
(assert (= (io-pos! b 0) 0))
(assert (equal? (io-read b 'rune 1) (arr 'rune #\¢)))
; skip back and forth
(assert (= (io-skip b -1) 2))
(assert (= (io-pos b) 2))
(assert (= (io-skip b -1) 1))
(assert (= (io-pos b) 1))
(assert (= (io-skip b -2 :end T) 1))
(assert (= (io-pos b) 1))
(assert (= (io-skip b -3 :end T) 0))
(assert (= (io-pos b) 0))
(assert (equal? (io-read b 'rune) #\¢))
; convert to string - destructive operation
(assert (= (io-pos! b 0) 0))
(assert (equal? (io->str b) "¢"))
(assert (= (io-pos b) 0))
(assert (= (io-pos! b 9) 0))
(assert (= (size-of b) 0))
; filename
(assert (equal? (io-filename b) ""))
(assert (equal? (io-filename! b "hi") "hi"))
(assert (equal? (io-filename b) "hi"))
; write some more
(assert (= (io-write b "hello") 5))
; truncate
(assert (void? (io-truncate b 3))) ; shrinking
(assert (= (size-of b) 3))
(assert (= (io-pos b) 3))
(assert (void? (io-truncate b 0))) ; emptying
(assert (eof-object? (io-read b 'u8)))
(assert (io-eof? b))
(assert (= (size-of b) 0))
(assert (= (io-pos b) 0))
(assert (= (io-pos! b 1) 0))
(assert (eof-object? (io-read b 'u8)))
(assert (io-eof? b))
; closed from now on
(assert (void? (io-close b)))
; can close again without errors - noop
(assert (void? (io-close b)))
; filename still usable
(assert (equal? (io-filename b) "hi"))
(assert (equal? (io-filename! b "no") "no"))
(assert (equal? (io-filename b) "no"))
; can't do much
(assert-fail (io->str b) io-error)
(assert-fail (io-buffer-mode b) io-error)
(assert-fail (io-buffer-mode! b NIL) io-error)
(assert-fail (io-eof? b) io-error)
(assert-fail (io-peek-rune b) io-error)
(assert-fail (io-pos b) io-error)
(assert-fail (io-pos! b 0) io-error)
(assert-fail (io-read b 'u8) io-error)
(assert-fail (io-read-all b) io-error)
(assert-fail (io-read-line b) io-error)
(assert-fail (io-read-lines b) io-error)
(assert-fail (io-read-until b #\x) io-error)
(assert-fail (io-skip b 0) io-error)
(assert-fail (io-truncate b 0) io-error)
(assert-fail (io-write b "") io-error)
(def b (buffer))
; write an array of runes
(assert (= (io-write b (arr 'rune #\¡ #\¿ #\nul #\x #\y #\z)) 8))
(assert (= (io-pos! b 0)))
; read back as an utf8 string, 3 runes total
(assert (equal? (io-read b 'utf8 3) "¡¿\x00"))
(assert (= (io-pos! b 0)))
; now peek a rune
(assert (equal? (io-peek-rune b) #\¡))
(assert (equal? (io-peek-rune b) #\¡))
; read until #\nul
(assert (equal? (io-read-until b #\nul) "¡¿\x00"))
; read the rest as a line
(assert (equal? (io-read-line b) "xyz"))
; nothing left
(assert (equal? (io-read-all b) ""))
(assert (eof-object? (io-read b 'u8)))
; path-cwd
(assert (str? (path-cwd)))
(assert (path-cwd "."))
(assert-fail (path-cwd "." ".") arity-error)
(assert-fail (path-cwd "does/not/exist") io-error)
; path-exists? + delete-file
(assert (path-exists? "."))
(assert (not (path-exists? "doesnotexist.txt")))
(assert-fail (delete-file "doesnotexist.txt") io-error)
(def f (file "doesexist.txt" :write :create :truncate))
(assert (io? f))
(assert (path-exists? "doesexist.txt"))
(assert-fail (io-read f 'u8) io-error) ; read on write-only
(io-close f)
(assert (path-exists? "doesexist.txt"))
(def f (file "doesexist.txt"))
(assert (io? f))
(assert-fail (io-write f (u8 0)) io-error) ; write on read-only
(assert (delete-file "doesexist.txt"))
(assert (not (path-exists? "doesexist.txt")))
(assert (eof-object? (io-read f 'u8)))
(assert (void? (io-close f)))
(def lines '("12345 абвгд weoiwhefohwefoihweoifh wefiweu3209u092039 jhksjdvksdjvbksdvb qwhqhfohwefe weofhweofhoiewhfoiwhefh\n"
"hello, world!\n"
"\n"
"\n"
"x"))
(def data (apply str lines))
(def f (file "test.txt" :write :create :append :truncate))
(assert (io? f))
(assert (eq? (io-buffer-mode f) :block))
(assert-fail (io-buffer-mode!))
(assert-fail (io-buffer-mode! f))
(assert-fail (io-buffer-mode! f 'blah))
(assert-fail (io-buffer-mode! f :memory))
(assert (eq? (io-buffer-mode! f :block) :block))
(assert (eq? (io-buffer-mode f) :block))
(assert (eq? (io-buffer-mode! f :line) :line))
(assert (eq? (io-buffer-mode f) :line))
(assert (eq? (io-buffer-mode! f NIL) NIL))
(assert (eq? (io-buffer-mode f) NIL))
(assert (eq? (io-buffer-mode! f :line) :line))
(assert (= (io-write f data) (size-of data)))
(def f2 (file "test.txt"))
(assert (= (io-skip f2 0 :end T) (1- (size-of data))))
(assert (io-flush f))
(assert (= (io-skip f2 0 :end T) (size-of data)))
(assert (void? (io-close f2)))
(assert (void? (io-close f)))
(def f (file "test.txt" :read))
(assert (io? f))
(assert (equal? (io-read-lines f) lines))
(assert (= (io-line f) 5))
(assert (= (io-column f) 1))
(assert (= (io-pos! f 0)))
(assert (equal? (io-read-all f) data))
(assert (= (io-line f) 5))
(assert (= (io-column f) 1))
(assert-fail (io-truncate f 0))
(assert (void? (io-close f)))
(assert (void? (delete-file "test.txt")))