1
0
treerack/cmd/treerack/show_test.go

231 lines
5.1 KiB
Go

package main
import (
"bytes"
"code.squareroundforest.org/arpio/treerack"
"errors"
"os"
"testing"
)
func TestShow(t *testing.T) {
t.Run("no syntax", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{Input: ptrto("bar_test.txt")}
if err := show(o, nil, &out); !errors.Is(err, errNoInput) {
t.Fatal()
}
})
t.Run("too many syntaxes", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
SyntaxString: ptrto(`foo = "baz"`),
Input: ptrto("bar_test.txt"),
}
if err := show(o, nil, &out); !errors.Is(err, errMultipleInputs) {
t.Fatal()
}
})
t.Run("syntax file not found", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("no-file.treerack"),
Input: ptrto("bar_test.txt"),
}
if err := show(o, nil, &out); !os.IsNotExist(err) {
t.Fatal()
}
})
t.Run("invalid syntax definition", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
SyntaxString: ptrto(`foo`),
Input: ptrto("bar_test.txt"),
}
var perr *treerack.ParseError
if err := show(o, nil, &out); !errors.As(err, &perr) {
t.Fatal()
}
})
t.Run("invalid syntax init", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
SyntaxString: ptrto(`foo = "bar"; foo = "baz"`),
Input: ptrto("bar_test.txt"),
}
if err := show(o, nil, &out); err == nil {
t.Fatal()
}
})
t.Run("no input", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{Syntax: ptrto("foo_test.treerack")}
if err := show(o, nil, &out); !errors.Is(err, errNoInput) {
t.Fatal()
}
})
t.Run("too many inputs", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
Input: ptrto("bar_test.txt"),
}
if err := show(o, nil, &out, "baz_test.txt"); !errors.Is(err, errMultipleInputs) {
t.Fatal()
}
})
t.Run("empty filename for input", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{Syntax: ptrto("foo_test.treerack")}
if err := show(o, nil, &out, ""); !errors.Is(err, errInvalidFilename) {
t.Fatal()
}
})
t.Run("input file not found", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{Syntax: ptrto("foo_test.treerack")}
if err := show(o, nil, &out, "baz_test.txt"); !os.IsNotExist(err) {
t.Fatal()
}
})
t.Run("input parse fail", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
InputString: ptrto("baz"),
}
var perr *treerack.ParseError
if err := show(o, nil, &out); !errors.As(err, &perr) {
t.Fatal()
}
})
t.Run("show", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
Input: ptrto("bar_test.txt"),
}
if err := show(o, nil, &out); err != nil {
t.Fatal(nil)
}
if out.String() != "{\"name\":\"foo\",\"from\":0,\"to\":3,\"text\":\"bar\"}\n" {
t.Fatal(out.String())
}
})
t.Run("show string", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
InputString: ptrto("bar"),
}
if err := show(o, nil, &out); err != nil {
t.Fatal(nil)
}
if out.String() != "{\"name\":\"foo\",\"from\":0,\"to\":3,\"text\":\"bar\"}\n" {
t.Fatal(out.String())
}
})
t.Run("show file", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{Syntax: ptrto("foo_test.treerack")}
if err := show(o, nil, &out, "bar_test.txt"); err != nil {
t.Fatal(nil)
}
if out.String() != "{\"name\":\"foo\",\"from\":0,\"to\":3,\"text\":\"bar\"}\n" {
t.Fatal(out.String())
}
})
t.Run("show stdin", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{Syntax: ptrto("foo_test.treerack")}
in := bytes.NewBufferString("bar")
if err := show(o, in, &out); err != nil {
t.Fatal(nil)
}
if out.String() != "{\"name\":\"foo\",\"from\":0,\"to\":3,\"text\":\"bar\"}\n" {
t.Fatal(out.String())
}
})
t.Run("indent", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
Input: ptrto("bar_test.txt"),
Pretty: true,
}
if err := show(o, nil, &out); err != nil {
t.Fatal(nil)
}
const expect = "{\n \"name\": \"foo\",\n \"from\": 0,\n \"to\": 3,\n \"text\": \"bar\"\n}\n"
if out.String() != expect {
t.Fatal(out.String())
}
})
t.Run("custom indent", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
Input: ptrto("bar_test.txt"),
Indent: "xx",
}
if err := show(o, nil, &out); err != nil {
t.Fatal(nil)
}
if out.String() != "{\nxx\"name\": \"foo\",\nxx\"from\": 0,\nxx\"to\": 3,\nxx\"text\": \"bar\"\n}\n" {
t.Fatal(out.String())
}
})
t.Run("redundant custom indent", func(t *testing.T) {
var out bytes.Buffer
o := showOptions{
Syntax: ptrto("foo_test.treerack"),
Input: ptrto("bar_test.txt"),
Pretty: true,
Indent: "xx",
}
if err := show(o, nil, &out); err != nil {
t.Fatal(nil)
}
if out.String() != "{\nxx\"name\": \"foo\",\nxx\"from\": 0,\nxx\"to\": 3,\nxx\"text\": \"bar\"\n}\n" {
t.Fatal(out.String())
}
})
}