1
0
textedit/lib_test.go

209 lines
4.0 KiB
Go
Raw Normal View History

2025-11-01 03:49:02 +01:00
package textedit_test
import (
"bytes"
"code.squareroundforest.org/arpio/textedit"
"errors"
"io"
"testing"
)
var errTest = errors.New("test")
type failingWriter struct {
out io.Writer
fail bool
}
type flusherWriter struct {
out io.Writer
fail bool
flushed bool
}
type flusherWriterNoErr struct {
out io.Writer
flushed bool
}
2025-11-01 03:49:02 +01:00
func (w *failingWriter) Write(p []byte) (int, error) {
if w.fail {
return 0, errTest
}
return w.out.Write(p)
}
func (w *flusherWriter) Write(p []byte) (int, error) {
return w.out.Write(p)
}
func (w *flusherWriter) Flush() error {
w.flushed = true
if w.fail {
return errTest
}
return nil
}
func (w *flusherWriterNoErr) Write(p []byte) (int, error) {
return w.out.Write(p)
}
func (w *flusherWriterNoErr) Flush() {
w.flushed = true
}
2025-11-01 03:49:02 +01:00
func TestNoop(t *testing.T) {
t.Run("editor", func(t *testing.T) {
var b bytes.Buffer
w := textedit.New(&b, textedit.Func(nil, func(int) []rune { return nil }))
2025-11-01 05:14:20 +01:00
w.Write([]byte("foo bar baz"))
w.Flush()
2025-11-01 03:49:02 +01:00
if b.String() != "foo bar baz" {
t.Fatal(b.String())
}
})
t.Run("release", func(t *testing.T) {
var b bytes.Buffer
w := textedit.New(&b, textedit.Func(func(r rune, s int) ([]rune, int) { return []rune{r}, 9 }, nil))
2025-11-01 05:14:20 +01:00
w.Write([]byte("foo bar baz"))
w.Flush()
2025-11-01 03:49:02 +01:00
if b.String() != "foo bar baz" {
t.Fatal(b.String())
}
})
}
func TestWriteRune(t *testing.T) {
var b bytes.Buffer
w := textedit.New(&b, textedit.Replace("o", "e"))
for _, r := range []rune("foo bar baz") {
2025-11-01 05:14:20 +01:00
w.WriteRune(r)
2025-11-01 03:49:02 +01:00
}
2025-11-01 05:14:20 +01:00
w.Flush()
2025-11-01 03:49:02 +01:00
if b.String() != "fee bar baz" {
t.Fatal(b.String())
2025-11-01 05:06:41 +01:00
}
}
func TestBrokenUnicode(t *testing.T) {
var b bytes.Buffer
w := textedit.New(&b)
2025-11-01 05:14:20 +01:00
w.Write([]byte("foo \xc2bar baz"))
w.Flush()
2025-11-01 05:06:41 +01:00
if b.String() != "foo bar baz" {
t.Fatal(b.String())
2025-11-01 03:49:02 +01:00
}
}
func TestFailingWriter(t *testing.T) {
t.Run("after write", func(t *testing.T) {
var b bytes.Buffer
fw := failingWriter{out: &b}
w := textedit.New(&fw, textedit.Replace("o", "e"))
if _, err := w.Write([]byte("foo ")); err != nil {
t.Fatal(err)
}
fw.fail = true
if _, err := w.Write([]byte("bar")); !errors.Is(err, errTest) {
t.Fatal("failed to fail with the right error", err)
}
if _, err := w.Write([]byte("bar")); !errors.Is(err, errTest) {
t.Fatal("failed to fail with the right error", err)
}
if err := w.Flush(); !errors.Is(err, errTest) {
t.Fatal("failed to fail with the right error", err)
}
})
t.Run("after flush", func(t *testing.T) {
var b bytes.Buffer
fw := failingWriter{out: &b}
w := textedit.New(&fw, textedit.Replace("o", "e"))
if _, err := w.Write([]byte("foo bar")); err != nil {
t.Fatal(err)
}
fw.fail = true
if err := w.Flush(); !errors.Is(err, errTest) {
t.Fatal("failed to fail with the right error", err)
}
})
}
func TestFlush(t *testing.T) {
2025-11-01 20:59:45 +01:00
t.Run("with err", func(t *testing.T) {
var b bytes.Buffer
fw := flusherWriter{out: &b}
w := textedit.New(&fw, textedit.Replace("o", "e"))
if _, err := w.Write([]byte("foo bar")); err != nil {
t.Fatal(err)
}
if err := w.Flush(); err != nil {
t.Fatal(err)
}
if b.String() != "fee bar" {
t.Fatal(b.String())
}
2025-11-01 20:59:45 +01:00
if fw.flushed {
t.Fatal("should not flush")
}
})
t.Run("without err", func(t *testing.T) {
var b bytes.Buffer
fw := flusherWriterNoErr{out: &b}
w := textedit.New(&fw, textedit.Replace("o", "e"))
if _, err := w.Write([]byte("foo bar")); err != nil {
t.Fatal(err)
}
if err := w.Flush(); err != nil {
t.Fatal(err)
}
if b.String() != "fee bar" {
t.Fatal(b.String())
}
2025-11-01 20:59:45 +01:00
if fw.flushed {
t.Fatal("should not flush")
}
})
}
2025-12-06 00:57:43 +01:00
func TestInit(t *testing.T) {
edit := func(r rune, lineStart bool) ([]rune, bool) {
if r == '\n' {
return []rune{'\n'}, true
}
if lineStart {
return append([]rune("> "), r), false
}
return []rune{r}, false
}
var b bytes.Buffer
e := textedit.FuncInit(edit, func(bool) []rune { return nil }, true)
w := textedit.New(&b, e)
if _, err := w.Write([]byte("quoted\nemail")); err != nil {
t.Fatal(err)
}
if b.String() != "> quoted\n> email" {
t.Fatal(b.String())
}
}