buffers.Writer
parent
df322d81e8
commit
711b415c61
|
@ -0,0 +1,33 @@
|
||||||
|
package buffers
|
||||||
|
|
||||||
|
type Writer struct {
|
||||||
|
dst []byte
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWriter(dst []byte) Writer {
|
||||||
|
return Writer{
|
||||||
|
dst:dst,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver *Writer) Write(src []byte) (n int, err error) {
|
||||||
|
if nil == receiver {
|
||||||
|
return 0, errNilReceiver
|
||||||
|
}
|
||||||
|
|
||||||
|
dst := receiver.dst
|
||||||
|
if nil == dst {
|
||||||
|
return 0, errNilDestination
|
||||||
|
}
|
||||||
|
dst = dst[receiver.index:]
|
||||||
|
|
||||||
|
if expectedAtLeast, actual := len(src), len(dst); actual < expectedAtLeast {
|
||||||
|
return 0, errTooShort(uint64(expectedAtLeast), uint64(actual))
|
||||||
|
}
|
||||||
|
|
||||||
|
n = copy(dst, src)
|
||||||
|
receiver.index += n
|
||||||
|
|
||||||
|
return n, err
|
||||||
|
}
|
|
@ -0,0 +1,928 @@
|
||||||
|
package buffers_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/reiver/go-buffers"
|
||||||
|
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestWriterSingleWrite(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
BufferLength int
|
||||||
|
Src []byte
|
||||||
|
Expected []byte
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
BufferLength: 0,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 1,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 2,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 3,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 4,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 5,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 6,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 7,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 8,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 9,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 10,
|
||||||
|
Src: []byte("apple"),
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
BufferLength: 0,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 1,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 2,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 3,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 4,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 5,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 6,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 7,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 8,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 9,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 10,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 11,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 12,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 13,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 14,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 15,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 16,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 17,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 18,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 19,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 20,
|
||||||
|
Src: []byte("apple BANANA"),
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
BufferLength: 0,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 1,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 2,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 3,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 4,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 5,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 6,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 7,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 8,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 9,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 10,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 11,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 12,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 13,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 14,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 15,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 16,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 17,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 18,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 19,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 20,
|
||||||
|
Src: []byte("apple BANANA Cherry"),
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer []byte = make([]byte, test.BufferLength)
|
||||||
|
|
||||||
|
var dst buffers.Writer = buffers.NewWriter(buffer)
|
||||||
|
|
||||||
|
n, err := dst.Write(test.Src)
|
||||||
|
if _, casted := err.(buffers.TooShort); !casted {
|
||||||
|
if nil != err {
|
||||||
|
t.Errorf("For test #%d, did not expect an error, but actually got one.", testNumber)
|
||||||
|
t.Logf("SRC: %q", test.Src)
|
||||||
|
t.Logf("DST: %q (full)", buffer)
|
||||||
|
t.Logf("DST EXPECTED: %q", test.Expected)
|
||||||
|
t.Logf("ERROR TYPE: %T", err)
|
||||||
|
t.Logf("ERROR: %q", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var expectedWritten int
|
||||||
|
{
|
||||||
|
lenBuffer := len(buffer)
|
||||||
|
lenSrc := len(test.Src)
|
||||||
|
|
||||||
|
if lenBuffer < lenSrc {
|
||||||
|
expectedWritten = lenBuffer
|
||||||
|
} else {
|
||||||
|
expectedWritten = lenSrc
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, casted := err.(buffers.TooShort); casted {
|
||||||
|
expectedWritten = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected, actual := expectedWritten, n; expected != actual {
|
||||||
|
t.Errorf("For test #%d, the actual number of bytes written was not what was expected.", testNumber)
|
||||||
|
t.Logf("SRC: %q", test.Src)
|
||||||
|
t.Logf("DST: %q (full)", buffer)
|
||||||
|
t.Logf("DST: %q", buffer[n:])
|
||||||
|
t.Logf("DST EXPECTED: %q", test.Expected)
|
||||||
|
t.Logf("EXPECTED: %d", expected)
|
||||||
|
t.Logf("ACTUAL: %d", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer[:n]; !reflect.DeepEqual(expected, actual) {
|
||||||
|
t.Errorf("For test #%d, what was written is not what was expected.", testNumber)
|
||||||
|
t.Logf("SRC: %q", test.Src)
|
||||||
|
t.Logf("DST: %q (full)", buffer)
|
||||||
|
t.Logf("DST: %q", buffer[n:])
|
||||||
|
t.Logf("DST EXPECTED: %q", test.Expected)
|
||||||
|
t.Logf("EXPECTED: %q", expected,)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWriterMultipleWrites(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
BufferLength int
|
||||||
|
Srces [][]byte
|
||||||
|
Expected []byte
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
BufferLength: 0,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 1,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("a"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 2,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("ap"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 3,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("app"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 4,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("appl"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 5,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 6,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 7,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 8,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 9,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 10,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("a"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("p"),
|
||||||
|
[]byte("l"),
|
||||||
|
[]byte("e"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple"),
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
BufferLength: 0,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 1,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 2,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 3,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 4,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 5,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BANAN"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 6,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 7,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 8,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 9,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 10,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("BA"),
|
||||||
|
[]byte("NA"),
|
||||||
|
[]byte("N"),
|
||||||
|
[]byte("A"),
|
||||||
|
},
|
||||||
|
Expected: []byte("BANANA"),
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
BufferLength: 0,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 1,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 2,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 3,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 4,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 5,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 6,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 7,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 8,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 9,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 10,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 11,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 12,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 13,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 14,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 15,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 16,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 17,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 18,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 19,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 20,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 21,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 22,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 23,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 24,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BufferLength: 25,
|
||||||
|
Srces: [][]byte{
|
||||||
|
[]byte("apple "),
|
||||||
|
[]byte("BANANA"),
|
||||||
|
[]byte(" "),
|
||||||
|
[]byte("Cherry"),
|
||||||
|
},
|
||||||
|
Expected: []byte("apple BANANA Cherry"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
TestLoop: for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer []byte = make([]byte, test.BufferLength)
|
||||||
|
|
||||||
|
var dst buffers.Writer = buffers.NewWriter(buffer)
|
||||||
|
|
||||||
|
var sum int
|
||||||
|
|
||||||
|
InnerLoop: for srcNumber, src := range test.Srces {
|
||||||
|
|
||||||
|
n, err := dst.Write(src)
|
||||||
|
if _, casted := err.(buffers.TooShort); casted {
|
||||||
|
break InnerLoop
|
||||||
|
}
|
||||||
|
if nil != err {
|
||||||
|
t.Errorf("For test #%d and src #%d, did not expect an error, but actually got one.", testNumber, srcNumber)
|
||||||
|
t.Logf("BUFFER LENGTH: %d", test.BufferLength)
|
||||||
|
for i, s := range test.Srces {
|
||||||
|
t.Logf("SRC[%d]: %q", i, s)
|
||||||
|
}
|
||||||
|
t.Logf("SRC: %q", src)
|
||||||
|
t.Logf("DST: %q (full)", buffer)
|
||||||
|
t.Logf("DST EXPECTED: %q", test.Expected)
|
||||||
|
t.Logf("ERROR TYPE: %T", err)
|
||||||
|
t.Logf("ERROR: %q", err)
|
||||||
|
continue TestLoop
|
||||||
|
}
|
||||||
|
|
||||||
|
var expectedWritten int
|
||||||
|
{
|
||||||
|
lenBuffer := len(buffer)
|
||||||
|
lenSrc := len(src)
|
||||||
|
|
||||||
|
if lenBuffer-sum < lenSrc {
|
||||||
|
expectedWritten = lenBuffer-sum
|
||||||
|
} else {
|
||||||
|
expectedWritten = lenSrc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected, actual := expectedWritten, n; expected != actual {
|
||||||
|
t.Errorf("For test #%d and src #%d, the actual number of bytes written was not what was expected.", testNumber, srcNumber)
|
||||||
|
t.Logf("BUFFER LENGTH: %d", test.BufferLength)
|
||||||
|
for i, s := range test.Srces {
|
||||||
|
t.Logf("SRC[%d]: %q", i, s)
|
||||||
|
}
|
||||||
|
t.Logf("SRC: %q", src)
|
||||||
|
t.Logf("DST: %q (full)", buffer)
|
||||||
|
t.Logf("DST: %q", buffer[n:])
|
||||||
|
t.Logf("DST EXPECTED: %q", test.Expected)
|
||||||
|
t.Logf("EXPECTED: %d", expected)
|
||||||
|
t.Logf("ACTUAL: %d", actual)
|
||||||
|
continue TestLoop
|
||||||
|
}
|
||||||
|
|
||||||
|
sum += n
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer[:sum]; !reflect.DeepEqual(expected, actual) {
|
||||||
|
t.Errorf("For test #%d, what was written is not what was expected.", testNumber)
|
||||||
|
t.Logf("BUFFER LENGTH: %d", test.BufferLength)
|
||||||
|
for i, s := range test.Srces {
|
||||||
|
t.Logf("SRC[%d]: %q", i, s)
|
||||||
|
}
|
||||||
|
t.Logf("DST: %q (full)", buffer)
|
||||||
|
t.Logf("DST: %q", buffer[sum:])
|
||||||
|
t.Logf("DST EXPECTED: %q", test.Expected)
|
||||||
|
t.Logf("EXPECTED: %q", expected,)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue TestLoop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue