Skip to content

Commit 38b969d

Browse files
authored
Fix position for NoopStream in :write mode (#118)
1 parent 2fac971 commit 38b969d

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

src/noop.jl

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,16 @@ Note that this method may return a wrong position when
5151
- the position of the wrapped stream has been changed outside of this package.
5252
"""
5353
function Base.position(stream::NoopStream)
54-
return position(stream.stream) - buffersize(stream.state.buffer1)
54+
mode = stream.state.mode
55+
@checkmode (:idle, :read, :write)
56+
if mode === :idle
57+
return Int64(0)
58+
elseif mode === :write
59+
return position(stream.stream) + buffersize(stream.state.buffer1)
60+
elseif mode === :read
61+
return position(stream.stream) - buffersize(stream.state.buffer1)
62+
end
63+
@assert false "unreachable"
5564
end
5665

5766
function Base.seek(stream::NoopStream, pos::Integer)
@@ -126,7 +135,7 @@ function stats(stream::NoopStream)
126135
mode = state.mode
127136
@checkmode (:idle, :read, :write)
128137
buffer = state.buffer1
129-
@assert buffer == stream.state.buffer2
138+
@assert buffer === stream.state.buffer2
130139
if mode == :idle
131140
consumed = supplied = 0
132141
elseif mode == :read

test/codecnoop.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,29 @@
283283
@test_throws ArgumentError NoopStream(let s = IOBuffer(); close(s); s; end)
284284
@test_throws ArgumentError TranscodingStream(Noop(), IOBuffer(), bufsize=0)
285285
@test_throws ArgumentError TranscodingStream(Noop(), IOBuffer(), sharedbuf=true)
286+
287+
@testset "position" begin
288+
iob = IOBuffer()
289+
sink = IOBuffer()
290+
stream = NoopStream(sink, bufsize=16)
291+
@test position(stream) == position(iob)
292+
for len in 0:10:100
293+
write(stream, repeat("x", len))
294+
write(iob, repeat("x", len))
295+
@test position(stream) == position(iob)
296+
end
297+
@test position(stream) == position(sink) == position(iob)
298+
close(stream)
299+
close(iob)
300+
301+
mktemp() do path, sink
302+
stream = NoopStream(sink, bufsize=16)
303+
pos = 0
304+
for len in 0:10:100
305+
write(stream, repeat("x", len))
306+
pos += len
307+
@test position(stream) == pos
308+
end
309+
end
310+
end
286311
end

test/codecquadruple.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,28 @@ end
8383
stream = TranscodingStream(QuadrupleCodec(), IOBuffer("foo"))
8484
@test_throws EOFError unsafe_read(stream, pointer(Vector{UInt8}(undef, 13)), 13)
8585
close(stream)
86+
87+
@testset "position" begin
88+
iob = IOBuffer()
89+
sink = IOBuffer()
90+
stream = TranscodingStream(QuadrupleCodec(), sink, bufsize=16)
91+
@test position(stream) == position(iob)
92+
for len in 0:10:100
93+
write(stream, repeat("x", len))
94+
write(iob, repeat("x", len))
95+
@test position(stream) == position(iob)
96+
end
97+
close(stream)
98+
close(iob)
99+
100+
mktemp() do path, sink
101+
stream = TranscodingStream(QuadrupleCodec(), sink, bufsize=16)
102+
pos = 0
103+
for len in 0:10:100
104+
write(stream, repeat("x", len))
105+
pos += len
106+
@test position(stream) == pos
107+
end
108+
end
109+
end
86110
end

0 commit comments

Comments
 (0)