254 lines
6.8 KiB
Julia
254 lines
6.8 KiB
Julia
# This file is a part of Julia. License is MIT: https://julialang.org/license
|
||
|
||
ioslength(io::IOBuffer) = (io.seekable ? io.size : nb_available(io))
|
||
|
||
let io = IOBuffer()
|
||
@test eof(io)
|
||
@test_throws EOFError read(io,UInt8)
|
||
@test write(io,"abc") === 3
|
||
@test isreadable(io)
|
||
@test iswritable(io)
|
||
@test isopen(io)
|
||
@test ioslength(io) == 3
|
||
@test position(io) == 3
|
||
@test eof(io)
|
||
seek(io, 0)
|
||
@test read(io,UInt8) == convert(UInt8, 'a')
|
||
a = Array{UInt8}(2)
|
||
@test read!(io, a) == a
|
||
@test a == UInt8['b','c']
|
||
@test String(io) == "abc"
|
||
seek(io, 1)
|
||
truncate(io, 2)
|
||
@test position(io) == 1
|
||
@test !eof(io)
|
||
seekend(io)
|
||
@test position(io) == 2
|
||
truncate(io, 0)
|
||
@test position(io) == 0
|
||
truncate(io, 10)
|
||
@test position(io) == 0
|
||
@test all(io.data .== 0)
|
||
@test write(io,Int16[1,2,3,4,5,6]) === 12
|
||
seek(io, 2)
|
||
truncate(io, 10)
|
||
@test ioslength(io) == 10
|
||
io.readable = false
|
||
@test_throws ArgumentError read!(io,UInt8[0])
|
||
truncate(io, 0)
|
||
@test write(io,"boston\ncambridge\n") > 0
|
||
@test String(take!(io)) == "boston\ncambridge\n"
|
||
@test String(take!(io)) == ""
|
||
@test write(io, Complex{Float64}(0)) === 16
|
||
@test write(io, Rational{Int64}(1//2)) === 16
|
||
close(io)
|
||
@test_throws ArgumentError write(io,UInt8[0])
|
||
@test_throws ArgumentError seek(io,0)
|
||
@test eof(io)
|
||
end
|
||
|
||
let io = IOBuffer("hamster\nguinea pig\nturtle")
|
||
@test position(io) == 0
|
||
@test readline(io) == "hamster"
|
||
@test readstring(io) == "guinea pig\nturtle"
|
||
@test_throws EOFError read(io,UInt8)
|
||
seek(io,0)
|
||
@test read(io,UInt8) == convert(UInt8, 'h')
|
||
@test_throws ArgumentError truncate(io,0)
|
||
@test_throws ArgumentError write(io,UInt8(0))
|
||
@test_throws ArgumentError write(io,UInt8[0])
|
||
@test String(take!(io)) == "hamster\nguinea pig\nturtle"
|
||
@test String(take!(io)) == "hamster\nguinea pig\nturtle" #should be unchanged
|
||
close(io)
|
||
end
|
||
|
||
let io = PipeBuffer()
|
||
@test_throws EOFError read(io,UInt8)
|
||
@test write(io,"pancakes\nwaffles\nblueberries\n") > 0
|
||
@test position(io) == 0
|
||
@test readline(io) == "pancakes"
|
||
Base.compact(io)
|
||
@test readline(io) == "waffles"
|
||
@test write(io,"whipped cream\n") > 0
|
||
@test readline(io) == "blueberries"
|
||
@test_throws ArgumentError seek(io,0)
|
||
@test_throws ArgumentError truncate(io,0)
|
||
@test readline(io) == "whipped cream"
|
||
@test write(io,"pancakes\nwaffles\nblueberries\n") > 0
|
||
@test readlines(io) == String["pancakes", "waffles", "blueberries"]
|
||
write(io,"\n\r\n\n\r \n") > 0
|
||
@test readlines(io, chomp=false) == String["\n", "\r\n", "\n", "\r \n"]
|
||
write(io,"\n\r\n\n\r \n") > 0
|
||
@test readlines(io, chomp=true) == String["", "", "", "\r "]
|
||
@test write(io,"α\nβ\nγ\nδ") > 0
|
||
@test readlines(io, chomp=false) == String["α\n","β\n","γ\n","δ"]
|
||
@test write(io,"α\nβ\nγ\nδ") > 0
|
||
@test readlines(io, chomp=true) == String["α", "β", "γ", "δ"]
|
||
@test readlines(IOBuffer(""), chomp=false) == []
|
||
@test readlines(IOBuffer(""), chomp=true) == []
|
||
@test readlines(IOBuffer("first\nsecond"), chomp=false) == String["first\n", "second"]
|
||
@test readlines(IOBuffer("first\nsecond"), chomp=true) == String["first", "second"]
|
||
|
||
let fname = tempname()
|
||
for dochomp in [true, false],
|
||
endline in ["\n", "\r\n"],
|
||
i in -5:5
|
||
|
||
ref = ("1"^(2^17 - i)) * endline
|
||
open(fname, "w") do io
|
||
write(io, ref)
|
||
end
|
||
x = readlines(fname, chomp = dochomp)
|
||
if dochomp
|
||
ref = chomp(ref)
|
||
end
|
||
@test ref == x[1]
|
||
end
|
||
rm(fname)
|
||
end
|
||
|
||
Base.compact(io)
|
||
@test position(io) == 0
|
||
@test ioslength(io) == 0
|
||
Base.ensureroom(io,50)
|
||
@test position(io) == 0
|
||
@test ioslength(io) == 0
|
||
@test length(io.data) == 50
|
||
Base.ensureroom(io,10)
|
||
@test ioslength(io) == 0
|
||
@test length(io.data) == 50
|
||
io.maxsize = 75
|
||
Base.ensureroom(io,100)
|
||
@test ioslength(io) == 0
|
||
@test length(io.data) == 75
|
||
seekend(io)
|
||
@test ioslength(io) == 0
|
||
@test position(io) == 0
|
||
write(io,zeros(UInt8,200))
|
||
@test ioslength(io) == 75
|
||
@test length(io.data) == 75
|
||
write(io,1)
|
||
@test ioslength(io) == 75
|
||
@test length(io.data) == 75
|
||
write(io,[1,2,3])
|
||
@test ioslength(io) == 75
|
||
@test length(io.data) == 75
|
||
skip(io,1)
|
||
@test write(io,UInt8(104)) === 1
|
||
skip(io,3)
|
||
@test write(io,b"apples") === 3
|
||
skip(io,71)
|
||
@test write(io,'y') === 1
|
||
@test readstring(io) == "happy"
|
||
@test eof(io)
|
||
write(io,zeros(UInt8,73))
|
||
write(io,'a')
|
||
write(io,'b')
|
||
write(io,'c')
|
||
write(io,'d')
|
||
write(io,'e')
|
||
@test ioslength(io) == 75
|
||
@test length(io.data) == 75
|
||
@test position(io) == 0
|
||
skip(io,72)
|
||
@test String(take!(io)) == "\0ab"
|
||
@test String(take!(io)) == ""
|
||
|
||
# issues 4021
|
||
print(io, true)
|
||
close(io)
|
||
end
|
||
|
||
# issue 5453
|
||
let io=IOBuffer("abcdef")
|
||
a = Array{UInt8}(1024)
|
||
@test_throws EOFError read!(io,a)
|
||
@test eof(io)
|
||
end
|
||
|
||
@test isempty(readlines(IOBuffer(), chomp=false))
|
||
|
||
# issue #8193
|
||
let io=IOBuffer("asdf")
|
||
@test position(skip(io, -1)) == 0
|
||
@test position(skip(io, 6)) == 4
|
||
@test position(seek(io, -1)) == 0
|
||
@test position(seek(io, 6)) == 4
|
||
end
|
||
|
||
# issue #10658
|
||
let io=IOBuffer("hello")
|
||
@test position(skip(io, 4)) == 4
|
||
@test position(skip(io, 10)) == 5
|
||
@test position(skip(io, -2)) == 3
|
||
@test position(skip(io, -3)) == 0
|
||
@test position(skip(io, -3)) == 0
|
||
end
|
||
|
||
# pr #11554
|
||
let io=IOBuffer(SubString("***αhelloworldω***",4,16)), io2 = IOBuffer(b"goodnightmoon", true, true)
|
||
@test read(io, Char) == 'α'
|
||
@test_throws ArgumentError write(io,"!")
|
||
@test_throws ArgumentError write(io,'β')
|
||
a = Array{UInt8}(10)
|
||
@test read!(io, a) === a
|
||
@test String(a) == "helloworld"
|
||
@test read(io, Char) == 'ω'
|
||
@test_throws EOFError read(io,UInt8)
|
||
skip(io, -3)
|
||
@test readstring(io) == "dω"
|
||
@test String(io) == "αhelloworldω"
|
||
@test_throws ArgumentError write(io,"!")
|
||
@test take!(io) == b"αhelloworldω"
|
||
seek(io, 2)
|
||
seekend(io2)
|
||
write(io2, io)
|
||
@test readstring(io) == ""
|
||
@test readstring(io2) == ""
|
||
@test String(take!(io)) == "αhelloworldω"
|
||
seek(io2, 0)
|
||
truncate(io2, io2.size - 2)
|
||
@test readstring(io2) == "goodnightmoonhelloworld"
|
||
seek(io2, 0)
|
||
write(io2, io2)
|
||
@test readstring(io2) == ""
|
||
@test String(io2) == "goodnightmoonhelloworld"
|
||
end
|
||
|
||
# issue #11917
|
||
# (previous tests triggered this sometimes, but this should trigger nearly all the time)
|
||
let io = IOBuffer(0)
|
||
write(io, ones(UInt8, 1048577))
|
||
end
|
||
|
||
let bstream = BufferStream()
|
||
@test isopen(bstream)
|
||
@test isreadable(bstream)
|
||
@test iswritable(bstream)
|
||
@test nb_available(bstream) == 0
|
||
@test sprint(show, bstream) == "BufferStream() bytes waiting:$(nb_available(bstream.buffer)), isopen:true"
|
||
a = rand(UInt8,10)
|
||
write(bstream,a)
|
||
@test !eof(bstream)
|
||
@test flush(bstream) === nothing
|
||
b = read(bstream,UInt8)
|
||
@test a[1] == b
|
||
b = read(bstream,UInt8)
|
||
@test a[2] == b
|
||
c = zeros(UInt8,8)
|
||
@test nb_available(bstream) == 8
|
||
@test !eof(bstream)
|
||
read!(bstream,c)
|
||
@test c == a[3:10]
|
||
@test close(bstream) === nothing
|
||
@test eof(bstream)
|
||
@test nb_available(bstream) == 0
|
||
end
|
||
|
||
@test flush(IOBuffer()) === nothing # should be a no-op
|
||
|
||
# pr #19461
|
||
let io = IOBuffer()
|
||
@test Base.buffer_writes(io) === io
|
||
end
|