123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- package table
- import (
- "bytes"
- "fmt"
- "io/ioutil"
- "os"
- "strings"
- "testing"
- "github.com/mattn/go-runewidth"
- "github.com/stretchr/testify/assert"
- )
- func TestFormatter(t *testing.T) {
- t.Parallel()
- var formatter Formatter
- fn := func(a string, b ...interface{}) string { return "" }
- f := Formatter(fn)
- assert.IsType(t, formatter, f)
- }
- func TestTable_New(t *testing.T) {
- t.Parallel()
- buf := bytes.Buffer{}
- New("foo", "bar").WithWriter(&buf).Print()
- out := buf.String()
- assert.Contains(t, out, "foo")
- assert.Contains(t, out, "bar")
- buf.Reset()
- New().WithWriter(&buf).Print()
- out = buf.String()
- assert.Empty(t, strings.TrimSpace(out))
- }
- func TestTable_WithHeaderFormatter(t *testing.T) {
- t.Parallel()
- uppercase := func(f string, v ...interface{}) string {
- return strings.ToUpper(fmt.Sprintf(f, v...))
- }
- buf := bytes.Buffer{}
- tbl := New("foo", "bar").WithWriter(&buf).WithHeaderFormatter(uppercase)
- tbl.Print()
- out := buf.String()
- assert.Contains(t, out, "FOO")
- assert.Contains(t, out, "BAR")
- buf.Reset()
- tbl.WithHeaderFormatter(nil).Print()
- out = buf.String()
- assert.Contains(t, out, "foo")
- assert.Contains(t, out, "bar")
- }
- func TestTable_WithFirstColumnFormatter(t *testing.T) {
- t.Parallel()
- uppercase := func(f string, v ...interface{}) string {
- return strings.ToUpper(fmt.Sprintf(f, v...))
- }
- buf := bytes.Buffer{}
- tbl := New("foo", "bar").WithWriter(&buf).WithFirstColumnFormatter(uppercase).AddRow("fizz", "buzz")
- tbl.Print()
- out := buf.String()
- assert.Contains(t, out, "foo")
- assert.Contains(t, out, "bar")
- assert.Contains(t, out, "FIZZ")
- assert.Contains(t, out, "buzz")
- buf.Reset()
- tbl.WithFirstColumnFormatter(nil).Print()
- out = buf.String()
- assert.Contains(t, out, "fizz")
- assert.Contains(t, out, "buzz")
- }
- func TestTable_WithPadding(t *testing.T) {
- t.Parallel()
- // zero value
- buf := bytes.Buffer{}
- tbl := New("foo", "bar").WithWriter(&buf).WithPadding(0)
- tbl.Print()
- out := buf.String()
- assert.Contains(t, out, "foobar")
- // positive value
- buf.Reset()
- tbl.WithPadding(4).Print()
- out = buf.String()
- assert.Contains(t, out, "foo bar ")
- // negative value
- buf.Reset()
- tbl.WithPadding(-1).Print()
- out = buf.String()
- assert.Contains(t, out, "foobar")
- }
- func TestTable_WithWriter(t *testing.T) {
- t.Parallel()
- // not that we haven't been using it in all these tests but:
- buf := bytes.Buffer{}
- New("foo", "bar").WithWriter(&buf).Print()
- assert.NotEmpty(t, buf.String())
- stdout := os.Stdout
- temp, _ := ioutil.TempFile("", "")
- os.Stdout = temp
- defer func() {
- os.Stdout = stdout
- temp.Close()
- }()
- New("foo", "bar").WithWriter(nil).Print()
- temp.Seek(0, 0)
- out, _ := ioutil.ReadAll(temp)
- assert.NotEmpty(t, out)
- }
- func TestTable_AddRow(t *testing.T) {
- t.Parallel()
- buf := bytes.Buffer{}
- tbl := New("foo", "bar").WithWriter(&buf).AddRow("fizz", "buzz")
- tbl.Print()
- out := buf.String()
- assert.Contains(t, out, "fizz")
- assert.Contains(t, out, "buzz")
- lines := strings.Count(out, "\n")
- // empty should add empty line
- buf.Reset()
- tbl.AddRow().Print()
- assert.Equal(t, lines+1, strings.Count(buf.String(), "\n"))
- // less than one will fill left-to-right
- buf.Reset()
- tbl.AddRow("cat").Print()
- assert.Contains(t, buf.String(), "\ncat")
- // more than initial length are truncated
- buf.Reset()
- tbl.AddRow("bippity", "boppity", "boo").Print()
- assert.NotContains(t, buf.String(), "boo")
- }
- func TestTable_WithWidthFunc(t *testing.T) {
- t.Parallel()
- buf := bytes.Buffer{}
- New("", "").
- WithWriter(&buf).
- WithPadding(1).
- WithWidthFunc(runewidth.StringWidth).
- AddRow("请求", "alpha").
- AddRow("abc", "beta").
- Print()
- actual := buf.String()
- assert.Contains(t, actual, "请求 alpha")
- assert.Contains(t, actual, "abc beta")
- }
|