diff --git a/pkgs/racket-test-core/tests/racket/portlib.rktl b/pkgs/racket-test-core/tests/racket/portlib.rktl index 288a34a26b..141a9ab77d 100644 --- a/pkgs/racket-test-core/tests/racket/portlib.rktl +++ b/pkgs/racket-test-core/tests/racket/portlib.rktl @@ -898,6 +898,28 @@ (test-values '(2 2 4) (lambda () (port-next-location i2))) (test (file-stream-buffer-mode i) file-stream-buffer-mode i2)) + +;; Check `transplant-output-port` on an uncooperative output port +;; whose positions count down +(let* ([pos 100] + [o (make-output-port + 'demo + always-evt + (lambda (bstr start end buffer? block?) + (define len (- end start)) + (set! pos (- pos len)) + len) + void + #f #f #f #f + void + (lambda () pos))]) + (define o2 (transplant-output-port o #f 50)) + (test 49 file-position o2) + (write-bytes #"hello" o2) + (test 44 file-position o2) + (write-bytes (make-bytes 80) o2) + (test 0 file-position o2)) + ;; -------------------------------------------------- (let-values ([(in out) (make-pipe)]) diff --git a/racket/collects/racket/private/port.rkt b/racket/collects/racket/private/port.rkt index e5589a8e60..711a811300 100644 --- a/racket/collects/racket/private/port.rkt +++ b/racket/collects/racket/private/port.rkt @@ -105,7 +105,7 @@ p (lambda () (define v (file-position* p)) - (and v (+ delta v))))) + (and v (max 1 (+ delta v)))))) (case-lambda [(mode) (file-stream-buffer-mode p mode)] [() (file-stream-buffer-mode p)]))))