2020-11-10 00:56:25 +01:00
|
|
|
package notation
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"errors"
|
2020-11-26 18:05:14 +01:00
|
|
|
"io"
|
2020-11-10 00:56:25 +01:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
type failingWriter int
|
|
|
|
|
|
|
|
var errTest = errors.New("test")
|
|
|
|
|
|
|
|
func failAfter(n int) *failingWriter {
|
|
|
|
w := failingWriter(n)
|
|
|
|
return &w
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *failingWriter) Write(p []byte) (int, error) {
|
|
|
|
*w = failingWriter(int(*w) - len(p))
|
|
|
|
if *w >= 0 {
|
|
|
|
return len(p), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return len(p) + int(*w), errTest
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFailingWriter(t *testing.T) {
|
|
|
|
t.Run("single object", func(t *testing.T) {
|
|
|
|
o := struct{ fooBarBaz int }{42}
|
|
|
|
w := failAfter(9)
|
|
|
|
n, err := Fprint(w, o)
|
|
|
|
if n == 9 && err == errTest {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if n != 9 {
|
|
|
|
t.Fatalf("failed to writ the expected bytes; expected: 9, written: %d", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != errTest {
|
|
|
|
t.Fatalf("failed to receive the right error; expected: %v, received: %v", errTest, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("multiple objects, fail first", func(t *testing.T) {
|
|
|
|
o := struct{ fooBarBaz int }{42}
|
|
|
|
w := failAfter(9)
|
|
|
|
n, err := Fprint(w, o, o)
|
|
|
|
if n == 9 && err == errTest {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if n != 9 {
|
|
|
|
t.Fatalf("failed to writ the expected bytes; expected: 9, written: %d", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != errTest {
|
|
|
|
t.Fatalf("failed to receive the right error; expected: %v, received: %v", errTest, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("multiple objects, fail second", func(t *testing.T) {
|
|
|
|
o := struct{ fooBarBaz int }{42}
|
|
|
|
w := failAfter(18)
|
|
|
|
n, err := Fprint(w, o, o)
|
|
|
|
if n == 9 && err == errTest {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if n != 18 {
|
|
|
|
t.Fatalf("failed to writ the expected bytes; expected: 9, written: %d", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != errTest {
|
|
|
|
t.Fatalf("failed to receive the right error; expected: %v, received: %v", errTest, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFprint(t *testing.T) {
|
2020-11-26 18:05:14 +01:00
|
|
|
defer withEnv(t, "TABWIDTH=0", "LINEWIDTH=0", "LINEWIDTH1=0")()
|
|
|
|
o := struct{ fooBarBaz int }{42}
|
|
|
|
for _, test := range []struct {
|
|
|
|
name string
|
|
|
|
fn func(io.Writer, ...interface{}) (int, error)
|
|
|
|
expect string
|
|
|
|
}{{
|
|
|
|
name: "Fprint",
|
|
|
|
fn: Fprint,
|
|
|
|
expect: `{fooBarBaz: 42}`,
|
|
|
|
}, {
|
|
|
|
name: "Fprintw",
|
|
|
|
fn: Fprintw,
|
|
|
|
expect: `{
|
2020-11-10 00:56:25 +01:00
|
|
|
fooBarBaz: 42,
|
2020-11-26 18:05:14 +01:00
|
|
|
}`,
|
|
|
|
}, {
|
|
|
|
name: "Fprintt",
|
|
|
|
fn: Fprintt,
|
|
|
|
expect: `struct{fooBarBaz int}{fooBarBaz: 42}`,
|
|
|
|
}, {
|
|
|
|
name: "Fprintwt",
|
|
|
|
fn: Fprintwt,
|
|
|
|
expect: `struct{
|
2020-11-10 00:56:25 +01:00
|
|
|
fooBarBaz int
|
|
|
|
}{
|
|
|
|
fooBarBaz: 42,
|
2020-11-26 18:05:14 +01:00
|
|
|
}`,
|
|
|
|
}, {
|
|
|
|
name: "Fprintv",
|
|
|
|
fn: Fprintv,
|
|
|
|
expect: `struct{fooBarBaz int}{fooBarBaz: int(42)}`,
|
|
|
|
}, {
|
|
|
|
name: "Fprintwv",
|
|
|
|
fn: Fprintwv,
|
|
|
|
expect: `struct{
|
2020-11-10 00:56:25 +01:00
|
|
|
fooBarBaz int
|
|
|
|
}{
|
|
|
|
fooBarBaz: int(42),
|
2020-11-26 18:05:14 +01:00
|
|
|
}`,
|
|
|
|
}} {
|
|
|
|
t.Run(test.name, func(t *testing.T) {
|
|
|
|
var b bytes.Buffer
|
|
|
|
n, err := test.fn(&b, o)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if n != len(test.expect) {
|
|
|
|
t.Fatalf("invalid write length; expected %d, got: %d", len(test.expect), n)
|
|
|
|
}
|
|
|
|
|
|
|
|
if b.String() != test.expect {
|
|
|
|
t.Fatalf("invalid output; expected: %s, got: %s", test.expect, b.String())
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2020-11-10 00:56:25 +01:00
|
|
|
}
|