2015-05-23 23:16:09 +08:00
|
|
|
package liner
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2016-03-15 13:36:43 +08:00
|
|
|
"fmt"
|
2015-05-23 23:16:09 +08:00
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestAppend(t *testing.T) {
|
|
|
|
var s State
|
|
|
|
s.AppendHistory("foo")
|
|
|
|
s.AppendHistory("bar")
|
|
|
|
|
|
|
|
var out bytes.Buffer
|
|
|
|
num, err := s.WriteHistory(&out)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("Unexpected error writing history", err)
|
|
|
|
}
|
|
|
|
if num != 2 {
|
|
|
|
t.Fatalf("Expected 2 history entries, got %d", num)
|
|
|
|
}
|
|
|
|
|
|
|
|
s.AppendHistory("baz")
|
|
|
|
num, err = s.WriteHistory(&out)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("Unexpected error writing history", err)
|
|
|
|
}
|
|
|
|
if num != 3 {
|
|
|
|
t.Fatalf("Expected 3 history entries, got %d", num)
|
|
|
|
}
|
|
|
|
|
|
|
|
s.AppendHistory("baz")
|
|
|
|
num, err = s.WriteHistory(&out)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("Unexpected error writing history", err)
|
|
|
|
}
|
|
|
|
if num != 3 {
|
|
|
|
t.Fatalf("Expected 3 history entries after duplicate append, got %d", num)
|
|
|
|
}
|
|
|
|
|
|
|
|
s.AppendHistory("baz")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestHistory(t *testing.T) {
|
|
|
|
input := `foo
|
|
|
|
bar
|
|
|
|
baz
|
|
|
|
quux
|
|
|
|
dingle`
|
|
|
|
|
|
|
|
var s State
|
|
|
|
num, err := s.ReadHistory(strings.NewReader(input))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("Unexpected error reading history", err)
|
|
|
|
}
|
|
|
|
if num != 5 {
|
|
|
|
t.Fatal("Wrong number of history entries read")
|
|
|
|
}
|
|
|
|
|
|
|
|
var out bytes.Buffer
|
|
|
|
num, err = s.WriteHistory(&out)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("Unexpected error writing history", err)
|
|
|
|
}
|
|
|
|
if num != 5 {
|
|
|
|
t.Fatal("Wrong number of history entries written")
|
|
|
|
}
|
|
|
|
if strings.TrimSpace(out.String()) != input {
|
|
|
|
t.Fatal("Round-trip failure")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test reading with a trailing newline present
|
|
|
|
var s2 State
|
|
|
|
num, err = s2.ReadHistory(&out)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("Unexpected error reading history the 2nd time", err)
|
|
|
|
}
|
|
|
|
if num != 5 {
|
|
|
|
t.Fatal("Wrong number of history entries read the 2nd time")
|
|
|
|
}
|
|
|
|
|
|
|
|
num, err = s.ReadHistory(strings.NewReader(input + "\n\xff"))
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Unexpected success reading corrupted history", err)
|
|
|
|
}
|
|
|
|
if num != 5 {
|
|
|
|
t.Fatal("Wrong number of history entries read the 3rd time")
|
|
|
|
}
|
|
|
|
}
|
2016-03-15 13:36:43 +08:00
|
|
|
|
|
|
|
func TestColumns(t *testing.T) {
|
|
|
|
list := []string{"foo", "food", "This entry is quite a bit longer than the typical entry"}
|
|
|
|
|
|
|
|
output := []struct {
|
|
|
|
width, columns, rows, maxWidth int
|
|
|
|
}{
|
|
|
|
{80, 1, 3, len(list[2]) + 1},
|
|
|
|
{120, 2, 2, len(list[2]) + 1},
|
|
|
|
{800, 14, 1, 0},
|
|
|
|
{8, 1, 3, 7},
|
|
|
|
}
|
|
|
|
|
|
|
|
for i, o := range output {
|
|
|
|
col, row, max := calculateColumns(o.width, list)
|
|
|
|
if col != o.columns {
|
|
|
|
t.Fatalf("Wrong number of columns, %d != %d, in TestColumns %d\n", col, o.columns, i)
|
|
|
|
}
|
|
|
|
if row != o.rows {
|
|
|
|
t.Fatalf("Wrong number of rows, %d != %d, in TestColumns %d\n", row, o.rows, i)
|
|
|
|
}
|
|
|
|
if max != o.maxWidth {
|
|
|
|
t.Fatalf("Wrong column width, %d != %d, in TestColumns %d\n", max, o.maxWidth, i)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// This example demonstrates a way to retrieve the current
|
|
|
|
// history buffer without using a file.
|
|
|
|
func ExampleState_WriteHistory() {
|
|
|
|
var s State
|
|
|
|
s.AppendHistory("foo")
|
|
|
|
s.AppendHistory("bar")
|
|
|
|
|
|
|
|
buf := new(bytes.Buffer)
|
|
|
|
_, err := s.WriteHistory(buf)
|
|
|
|
if err == nil {
|
|
|
|
history := strings.Split(strings.TrimSpace(buf.String()), "\n")
|
|
|
|
for i, line := range history {
|
|
|
|
fmt.Println("History entry", i, ":", line)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Output:
|
|
|
|
// History entry 0 : foo
|
|
|
|
// History entry 1 : bar
|
|
|
|
}
|