package sources import ( "bufio" "bytes" "io" "strings" "testing" "github.com/stretchr/testify/require" ) func Test_readUntilSafeBoundary(t *testing.T) { // Arrange cases := []struct { name string r io.Reader expected string }{ // Current split is fine, exit early. { name: "safe original split - LF", r: strings.NewReader("abc\n\ndefghijklmnop\n\nqrstuvwxyz"), expected: "abc\n\n", }, { name: "safe original split - CRLF", r: strings.NewReader("a\r\n\r\nbcdefghijklmnop\n"), expected: "a\r\n\r\n", }, // Current split is bad, look for a better one. { name: "safe split - LF", r: strings.NewReader("abcdefg\nhijklmnop\n\nqrstuvwxyz"), expected: "abcdefg\nhijklmnop\n\n", }, { name: "safe split - CRLF", r: strings.NewReader("abcdefg\r\nhijklmnop\r\n\r\nqrstuvwxyz"), expected: "abcdefg\r\nhijklmnop\r\n\r\n", }, { name: "safe split - blank line", r: strings.NewReader("abcdefg\nhijklmnop\n\t \t\nqrstuvwxyz"), expected: "abcdefg\nhijklmnop\n\t \t\n", }, // Current split is bad, exhaust options. { name: "no safe split", r: strings.NewReader("abcdefg\nhijklmnopqrstuvwxyz"), expected: "abcdefg\nhijklmnopqrstuvwx", }, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { buf := make([]byte, 5) n, err := c.r.Read(buf) require.NoError(t, err) // Act reader := bufio.NewReader(c.r) peekBuf := bytes.NewBuffer(buf[:n]) err = readUntilSafeBoundary(reader, n, 20, peekBuf) require.NoError(t, err) // Assert t.Log(peekBuf.String()) require.Equal(t, c.expected, peekBuf.String()) }) } }