You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
2.4 KiB
Go
143 lines
2.4 KiB
Go
4 years ago
|
package iox
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"zero/core/fs"
|
||
|
"zero/core/stringx"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
func TestReadText(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
input string
|
||
|
expect string
|
||
|
}{
|
||
|
{
|
||
|
input: `a`,
|
||
|
expect: `a`,
|
||
|
}, {
|
||
|
input: `a
|
||
|
`,
|
||
|
expect: `a`,
|
||
|
}, {
|
||
|
input: `a
|
||
|
b`,
|
||
|
expect: `a
|
||
|
b`,
|
||
|
}, {
|
||
|
input: `a
|
||
|
b
|
||
|
`,
|
||
|
expect: `a
|
||
|
b`,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, test := range tests {
|
||
|
t.Run(test.input, func(t *testing.T) {
|
||
|
tmpfile, err := fs.TempFilenameWithText(test.input)
|
||
|
assert.Nil(t, err)
|
||
|
defer os.Remove(tmpfile)
|
||
|
|
||
|
content, err := ReadText(tmpfile)
|
||
|
assert.Nil(t, err)
|
||
|
assert.Equal(t, test.expect, content)
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestReadTextLines(t *testing.T) {
|
||
|
text := `1
|
||
|
|
||
|
2
|
||
|
|
||
|
#a
|
||
|
3`
|
||
|
|
||
|
tmpfile, err := fs.TempFilenameWithText(text)
|
||
|
assert.Nil(t, err)
|
||
|
defer os.Remove(tmpfile)
|
||
|
|
||
|
tests := []struct {
|
||
|
options []TextReadOption
|
||
|
expectLines int
|
||
|
}{
|
||
|
{
|
||
|
nil,
|
||
|
6,
|
||
|
}, {
|
||
|
[]TextReadOption{KeepSpace(), OmitWithPrefix("#")},
|
||
|
6,
|
||
|
}, {
|
||
|
[]TextReadOption{WithoutBlank()},
|
||
|
4,
|
||
|
}, {
|
||
|
[]TextReadOption{OmitWithPrefix("#")},
|
||
|
5,
|
||
|
}, {
|
||
|
[]TextReadOption{WithoutBlank(), OmitWithPrefix("#")},
|
||
|
3,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, test := range tests {
|
||
|
t.Run(stringx.Rand(), func(t *testing.T) {
|
||
|
lines, err := ReadTextLines(tmpfile, test.options...)
|
||
|
assert.Nil(t, err)
|
||
|
assert.Equal(t, test.expectLines, len(lines))
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestDupReadCloser(t *testing.T) {
|
||
|
input := "hello"
|
||
|
reader := ioutil.NopCloser(bytes.NewBufferString(input))
|
||
|
r1, r2 := DupReadCloser(reader)
|
||
|
verify := func(r io.Reader) {
|
||
|
output, err := ioutil.ReadAll(r)
|
||
|
assert.Nil(t, err)
|
||
|
assert.Equal(t, input, string(output))
|
||
|
}
|
||
|
|
||
|
verify(r1)
|
||
|
verify(r2)
|
||
|
}
|
||
|
|
||
|
func TestReadBytes(t *testing.T) {
|
||
|
reader := ioutil.NopCloser(bytes.NewBufferString("helloworld"))
|
||
|
buf := make([]byte, 5)
|
||
|
err := ReadBytes(reader, buf)
|
||
|
assert.Nil(t, err)
|
||
|
assert.Equal(t, "hello", string(buf))
|
||
|
}
|
||
|
|
||
|
func TestReadBytesNotEnough(t *testing.T) {
|
||
|
reader := ioutil.NopCloser(bytes.NewBufferString("hell"))
|
||
|
buf := make([]byte, 5)
|
||
|
err := ReadBytes(reader, buf)
|
||
|
assert.Equal(t, io.EOF, err)
|
||
|
}
|
||
|
|
||
|
func TestReadBytesChunks(t *testing.T) {
|
||
|
buf := make([]byte, 5)
|
||
|
reader, writer := io.Pipe()
|
||
|
|
||
|
go func() {
|
||
|
for i := 0; i < 10; i++ {
|
||
|
writer.Write([]byte{'a'})
|
||
|
time.Sleep(10 * time.Millisecond)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
err := ReadBytes(reader, buf)
|
||
|
assert.Nil(t, err)
|
||
|
assert.Equal(t, "aaaaa", string(buf))
|
||
|
}
|