Skip to content

Commit 0a65a4f

Browse files
authored
io.string_reader: fix fill_buffer(), add tests (#25682)
1 parent c40da32 commit 0a65a4f

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

vlib/io/string_reader/string_reader.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ pub fn (mut r StringReader) fill_buffer(read_till_end_of_stream bool) !int {
7676
}
7777

7878
for {
79-
read := reader.read(mut r.builder[start..]) or {
79+
read := reader.read(mut r.builder[end..]) or {
8080
r.end_of_stream = true
8181
break
8282
}
8383
end += read
8484

85-
if !read_till_end_of_stream && read == 0 {
85+
if !read_till_end_of_stream || read == 0 {
8686
break
8787
} else if r.builder.len == end {
8888
unsafe { r.builder.grow_len(io.read_all_grow_len) }

vlib/io/string_reader/string_reader_test.v

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ mut:
99
i int
1010
}
1111

12+
struct TwoByteReader {
13+
mut:
14+
data string
15+
pos int
16+
}
17+
1218
fn (mut b Buf) read(mut buf []u8) !int {
1319
if !(b.i < b.bytes.len) {
1420
return io.Eof{}
@@ -18,6 +24,18 @@ fn (mut b Buf) read(mut buf []u8) !int {
1824
return n
1925
}
2026

27+
fn (mut r TwoByteReader) read(mut buf []u8) !int {
28+
if r.pos >= r.data.len {
29+
return io.Eof{}
30+
}
31+
min := int_min(r.data.len - r.pos, 2)
32+
for i in 0 .. min {
33+
buf[i] = r.data[r.pos]
34+
r.pos++
35+
}
36+
return min
37+
}
38+
2139
fn test_read_all() {
2240
mut reader := StringReader.new()
2341

@@ -122,3 +140,21 @@ fn test_flush() {
122140
assert reader.offset == 0
123141
assert reader.builder.len == 0
124142
}
143+
144+
fn test_fill_buffer_true() {
145+
mut two := TwoByteReader{
146+
data: '12345'
147+
}
148+
mut reader := StringReader.new(reader: two)
149+
assert reader.fill_buffer(true)! == 5
150+
assert reader.get_string() == '12345'
151+
}
152+
153+
fn test_fill_buffer_false() {
154+
mut two := TwoByteReader{
155+
data: '12345'
156+
}
157+
mut reader := StringReader.new(reader: two)
158+
assert reader.fill_buffer(false)! == 2
159+
assert reader.get_string() == '12'
160+
}

0 commit comments

Comments
 (0)