231 lines
5.1 KiB
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())
|
|
}
|
|
})
|
|
}
|