add parse command
This commit is contained in:
parent
ab3032e868
commit
736741915c
@ -18,7 +18,7 @@ func check(args []string) int {
|
||||
o.command.flagSet.StringVar(&o.input.inline, "input-string", "", inputStringUsage)
|
||||
o.command.flagSet.StringVar(&o.input.fileName, "input", "", inputFileUsage)
|
||||
|
||||
if o.command.checkHelp() {
|
||||
if o.command.help() {
|
||||
return 0
|
||||
}
|
||||
|
||||
@ -26,13 +26,13 @@ func check(args []string) int {
|
||||
return code
|
||||
}
|
||||
|
||||
o.input.positional = o.command.flagSet.Args()
|
||||
input, code := o.input.open()
|
||||
s, code := o.syntax.openSyntax()
|
||||
if code != 0 {
|
||||
return code
|
||||
}
|
||||
|
||||
s, code := o.syntax.openSyntax()
|
||||
o.input.positional = o.command.flagSet.Args()
|
||||
input, code := o.input.open()
|
||||
if code != 0 {
|
||||
return code
|
||||
}
|
||||
|
@ -2,195 +2,211 @@ package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestCheck(t *testing.T) {
|
||||
runMainTest(t,
|
||||
mainTest{
|
||||
title: "help",
|
||||
args: []string{
|
||||
"treerack", "check", "-help",
|
||||
},
|
||||
stdout: []string{
|
||||
checkUsage,
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
checkExample,
|
||||
docRef,
|
||||
},
|
||||
var checkFailureTests = []mainTest{
|
||||
{
|
||||
title: "invalid flag",
|
||||
args: []string{
|
||||
"treerack", "check", "-foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "invalid flag",
|
||||
args: []string{
|
||||
"treerack", "check", "-foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
{
|
||||
title: "multiple syntaxes",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax", "foo.treerack", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple syntaxes",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax", "foo.treerack", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
{
|
||||
title: "multiple inputs",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "foo.txt", "-input-string", "bar",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "foo.txt", "-input-string", "bar",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
{
|
||||
title: "multiple inputs, positional",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "foo.txt", "bar.txt",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs, positional",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "foo.txt", "bar.txt",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
{
|
||||
title: "multiple inputs, positional and explicit file",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "foo.txt", "bar.txt",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs, positional and explicit file",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "foo.txt", "bar.txt",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
{
|
||||
title: "no syntax",
|
||||
args: []string{
|
||||
"treerack", "check", "-input-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"missing syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "no syntax",
|
||||
args: []string{
|
||||
"treerack", "check", "-input-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"missing syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
{
|
||||
title: "no input",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"missing input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "no input",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"missing input",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
},
|
||||
{
|
||||
title: "invalid syntax",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", "foo", "-input-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"parse failed",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "invalid syntax",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", "foo", "-input-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"parse failed",
|
||||
},
|
||||
{
|
||||
title: "syntax file open fails",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax", "noexist.treerack", "-input-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"file",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax file open fails",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax", "noexist.treerack", "-input-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"file",
|
||||
},
|
||||
{
|
||||
title: "input file open fails",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "noexist.txt",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"file",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "input file open fails",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "noexist.txt",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"file",
|
||||
},
|
||||
{
|
||||
title: "invalid input",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input-string", "foo",
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as file",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax", "foo_test.treerack", "-input-string", "bar",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"parse failed",
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as string",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "input as stdin",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
stdin: "bar",
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "input as file",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "bar_test.txt",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "input as string",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
},
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
var checkTests = []mainTest{
|
||||
{
|
||||
title: "syntax as file",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax", "foo_test.treerack", "-input-string", "bar",
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "syntax as string",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "input as stdin",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
stdin: "bar",
|
||||
},
|
||||
|
||||
{
|
||||
title: "input as file",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input", "bar_test.txt",
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "input as string",
|
||||
args: []string{
|
||||
"treerack", "check", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestCheck(t *testing.T) {
|
||||
runMainTest(t, mainTest{
|
||||
title: "help",
|
||||
args: []string{
|
||||
"treerack", "check", "-help",
|
||||
},
|
||||
stdout: []string{
|
||||
checkUsage,
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
checkExample,
|
||||
docRef,
|
||||
},
|
||||
})
|
||||
|
||||
runMainTest(t, checkFailureTests...)
|
||||
runMainTest(t, checkTests...)
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ func checkSyntax(args []string) int {
|
||||
o.command.flagSet.StringVar(&o.syntax.inline, "syntax-string", "", syntaxStringUsage)
|
||||
o.command.flagSet.StringVar(&o.syntax.fileName, "syntax", "", syntaxFileUsage)
|
||||
|
||||
if o.command.checkHelp() {
|
||||
if o.command.help() {
|
||||
return 0
|
||||
}
|
||||
|
||||
|
@ -2,128 +2,133 @@ package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestCheckSyntax(t *testing.T) {
|
||||
runMainTest(t,
|
||||
mainTest{
|
||||
title: "help",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-help",
|
||||
},
|
||||
stdout: []string{
|
||||
checkSyntaxUsage,
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
checkSyntaxExample,
|
||||
docRef,
|
||||
},
|
||||
var checkSyntaxFailureTests = []mainTest{
|
||||
{
|
||||
title: "invalid flag",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "invalid flag",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "multiple inputs",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "foo.treerack", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "foo.treerack", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "multiple inputs, positional",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "foo.treerack", "bar.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs, positional",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "foo.treerack", "bar.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "multiple inputs, positional and explicit file",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "foo.treerack", "bar.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs, positional and explicit file",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "foo.treerack", "bar.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "no input",
|
||||
args: []string{
|
||||
"treerack", "check-syntax",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"missing syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "no input",
|
||||
args: []string{
|
||||
"treerack", "check-syntax",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"missing syntax",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "invalid input",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"parse failed",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "invalid input",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"parse failed",
|
||||
},
|
||||
{
|
||||
title: "file open fails",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "noexist.treerack",
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "file open fails",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "noexist.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"file",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"file",
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as stdin",
|
||||
args: []string{
|
||||
"treerack", "check-syntax",
|
||||
},
|
||||
stdin: `foo = "bar"`,
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as file",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "foo_test.treerack",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as string",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
},
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
var checkSyntaxTests = []mainTest{
|
||||
{
|
||||
title: "syntax as stdin",
|
||||
args: []string{
|
||||
"treerack", "check-syntax",
|
||||
},
|
||||
stdin: `foo = "bar"`,
|
||||
},
|
||||
|
||||
{
|
||||
title: "syntax as file",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax", "foo_test.treerack",
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "syntax as string",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestCheckSyntax(t *testing.T) {
|
||||
runMainTest(t, mainTest{
|
||||
title: "help",
|
||||
args: []string{
|
||||
"treerack", "check-syntax", "-help",
|
||||
},
|
||||
stdout: []string{
|
||||
checkSyntaxUsage,
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
checkSyntaxExample,
|
||||
docRef,
|
||||
},
|
||||
})
|
||||
|
||||
runMainTest(t, checkSyntaxFailureTests...)
|
||||
runMainTest(t, checkSyntaxTests...)
|
||||
}
|
||||
|
@ -28,6 +28,10 @@ const packageNameUsage = `package name of the generated Go code`
|
||||
const exportUsage = `when the export flag is set, the generated code will have exported symbols to allow using
|
||||
it as a separate package.`
|
||||
|
||||
const prettyUsage = `when the pretty flag is set, the AST will be pretty printed`
|
||||
|
||||
const indentUsage = `string used for indentation of the printed AST`
|
||||
|
||||
const checkUsage = `'treerack check' takes a syntax description from a file or inline string, an arbitrary piece
|
||||
of text from the standard input, or a file, or inline string, and parses the input text with the defined syntax.
|
||||
It returns non-zero exit code and prints the problem if the provided syntax is not valid or the intput cannot be
|
||||
|
@ -19,7 +19,7 @@ func generate(args []string) int {
|
||||
o.command.flagSet.StringVar(&o.syntax.inline, "syntax-string", "", syntaxStringUsage)
|
||||
o.command.flagSet.StringVar(&o.syntax.fileName, "syntax", "", syntaxFileUsage)
|
||||
|
||||
if o.command.checkHelp() {
|
||||
if o.command.help() {
|
||||
return 0
|
||||
}
|
||||
|
||||
|
@ -2,161 +2,70 @@ package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGenerate(t *testing.T) {
|
||||
runMainTest(t,
|
||||
mainTest{
|
||||
title: "help",
|
||||
args: []string{
|
||||
"treerack", "generate", "-help",
|
||||
},
|
||||
stdout: []string{
|
||||
generateUsage,
|
||||
"-export",
|
||||
"-package-name",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
generateExample,
|
||||
docRef,
|
||||
},
|
||||
},
|
||||
var generateFailureTests = convertTests("generate", checkSyntaxFailureTests)
|
||||
|
||||
mainTest{
|
||||
title: "invalid flag",
|
||||
args: []string{
|
||||
"treerack", "generate", "-foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"-export",
|
||||
"-package-name",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
var generateTests = []mainTest{
|
||||
{
|
||||
title: "failing output",
|
||||
args: []string{
|
||||
"treerack", "generate", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
failingOutput: true,
|
||||
exit: -1,
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs",
|
||||
args: []string{
|
||||
"treerack", "generate", "-syntax", "foo.treerack", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-export",
|
||||
"-package-name",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "syntax as stdin",
|
||||
args: []string{
|
||||
"treerack", "generate", "-export", "-package-name", "foo",
|
||||
},
|
||||
stdin: `foo = "bar"`,
|
||||
stdout: []string{
|
||||
"package foo",
|
||||
"func Parse",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs, positional",
|
||||
args: []string{
|
||||
"treerack", "generate", "foo.treerack", "bar.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-export",
|
||||
"-package-name",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "syntax as file",
|
||||
args: []string{
|
||||
"treerack", "generate", "-export", "-package-name", "foo", "-syntax", "foo_test.treerack",
|
||||
},
|
||||
stdout: []string{
|
||||
"package foo",
|
||||
"func Parse",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "multiple inputs, positional and explicit file",
|
||||
args: []string{
|
||||
"treerack", "generate", "-syntax", "foo.treerack", "bar.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"only one syntax",
|
||||
"-export",
|
||||
"-package-name",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
{
|
||||
title: "syntax as string",
|
||||
args: []string{
|
||||
"treerack", "generate", "-export", "-package-name", "foo", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "no input",
|
||||
args: []string{
|
||||
"treerack", "generate",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"missing syntax",
|
||||
"-export",
|
||||
"-package-name",
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
},
|
||||
stdout: []string{
|
||||
"package foo",
|
||||
"func Parse",
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "invalid input",
|
||||
args: []string{
|
||||
"treerack", "generate", "-syntax-string", "foo",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"parse failed",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "file open fails",
|
||||
args: []string{
|
||||
"treerack", "generate", "-syntax", "noexist.treerack",
|
||||
},
|
||||
exit: -1,
|
||||
stderr: []string{
|
||||
"file",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "failing output",
|
||||
args: []string{
|
||||
"treerack", "generate", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
failingOutput: true,
|
||||
exit: -1,
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as stdin",
|
||||
args: []string{
|
||||
"treerack", "generate", "-export", "-package-name", "foo",
|
||||
},
|
||||
stdin: `foo = "bar"`,
|
||||
stdout: []string{
|
||||
"package foo",
|
||||
"func Parse",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as file",
|
||||
args: []string{
|
||||
"treerack", "generate", "-export", "-package-name", "foo", "-syntax", "foo_test.treerack",
|
||||
},
|
||||
stdout: []string{
|
||||
"package foo",
|
||||
"func Parse",
|
||||
},
|
||||
},
|
||||
|
||||
mainTest{
|
||||
title: "syntax as string",
|
||||
args: []string{
|
||||
"treerack", "generate", "-export", "-package-name", "foo", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
stdout: []string{
|
||||
"package foo",
|
||||
"func Parse",
|
||||
},
|
||||
},
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
func TestGenerate(t *testing.T) {
|
||||
runMainTest(t, mainTest{
|
||||
title: "help",
|
||||
args: []string{
|
||||
"treerack", "generate", "-help",
|
||||
},
|
||||
stdout: []string{
|
||||
generateUsage,
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-export",
|
||||
"-package-name",
|
||||
generateExample,
|
||||
docRef,
|
||||
},
|
||||
})
|
||||
|
||||
runMainTest(t, generateFailureTests...)
|
||||
runMainTest(t, generateTests...)
|
||||
}
|
||||
|
@ -32,6 +32,23 @@ func init() {
|
||||
isTest = true
|
||||
}
|
||||
|
||||
func convertTest(cmd string, t mainTest) mainTest {
|
||||
args := make([]string, len(t.args))
|
||||
copy(args, t.args)
|
||||
args[1] = cmd
|
||||
t.args = args
|
||||
return t
|
||||
}
|
||||
|
||||
func convertTests(cmd string, t []mainTest) []mainTest {
|
||||
tt := make([]mainTest, len(t))
|
||||
for i := range t {
|
||||
tt[i] = convertTest(cmd, t[i])
|
||||
}
|
||||
|
||||
return tt
|
||||
}
|
||||
|
||||
func mockArgs(args ...string) (reset func()) {
|
||||
original := os.Args
|
||||
os.Args = args
|
||||
|
@ -38,7 +38,7 @@ func (o *commandOptions) parseArgs() (exit int) {
|
||||
return
|
||||
}
|
||||
|
||||
func (o *commandOptions) help() {
|
||||
func (o *commandOptions) printHelp() {
|
||||
stdout(o.usage)
|
||||
stdout()
|
||||
|
||||
@ -52,11 +52,11 @@ func (o *commandOptions) help() {
|
||||
stdout(docRef)
|
||||
}
|
||||
|
||||
func (o *commandOptions) checkHelp() bool {
|
||||
func (o *commandOptions) help() bool {
|
||||
if len(o.args) == 0 || o.args[0] != "-help" {
|
||||
return false
|
||||
}
|
||||
|
||||
o.help()
|
||||
o.printHelp()
|
||||
return true
|
||||
}
|
||||
|
@ -1,5 +1,103 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"github.com/aryszka/treerack"
|
||||
)
|
||||
|
||||
type parseOptions struct {
|
||||
command *commandOptions
|
||||
syntax *fileOptions
|
||||
input *fileOptions
|
||||
pretty bool
|
||||
indent string
|
||||
}
|
||||
|
||||
type node struct {
|
||||
Name string `json:"name"`
|
||||
From int `json:"from"`
|
||||
To int `json:"to"`
|
||||
Text string `json:"text,omitempty"`
|
||||
Nodes []*node `json:"nodes,omitempty"`
|
||||
}
|
||||
|
||||
func mapNode(n *treerack.Node) *node {
|
||||
var nn node
|
||||
nn.Name = n.Name
|
||||
nn.From = n.From
|
||||
nn.To = n.To
|
||||
|
||||
if len(n.Nodes) == 0 {
|
||||
nn.Text = n.Text()
|
||||
return &nn
|
||||
}
|
||||
|
||||
for i := range n.Nodes {
|
||||
nn.Nodes = append(nn.Nodes, mapNode(n.Nodes[i]))
|
||||
}
|
||||
|
||||
return &nn
|
||||
}
|
||||
|
||||
func parse(args []string) int {
|
||||
var o parseOptions
|
||||
o.command = initOptions(parseUsage, parseExample, args)
|
||||
o.syntax = &fileOptions{typ: "syntax", flagSet: o.command.flagSet}
|
||||
o.input = &fileOptions{typ: "input", flagSet: o.command.flagSet}
|
||||
|
||||
o.command.flagSet.StringVar(&o.syntax.inline, "syntax-string", "", syntaxStringUsage)
|
||||
o.command.flagSet.StringVar(&o.syntax.fileName, "syntax", "", syntaxFileUsage)
|
||||
|
||||
o.command.flagSet.StringVar(&o.input.inline, "input-string", "", inputStringUsage)
|
||||
o.command.flagSet.StringVar(&o.input.fileName, "input", "", inputFileUsage)
|
||||
|
||||
o.command.flagSet.BoolVar(&o.pretty, "pretty", false, prettyUsage)
|
||||
o.command.flagSet.StringVar(&o.indent, "indent", "", indentUsage)
|
||||
|
||||
if o.command.help() {
|
||||
return 0
|
||||
}
|
||||
|
||||
if code := o.command.parseArgs(); code != 0 {
|
||||
return code
|
||||
}
|
||||
|
||||
s, code := o.syntax.openSyntax()
|
||||
if code != 0 {
|
||||
return code
|
||||
}
|
||||
|
||||
o.input.positional = o.command.flagSet.Args()
|
||||
input, code := o.input.open()
|
||||
if code != 0 {
|
||||
return code
|
||||
}
|
||||
|
||||
n, err := s.Parse(input)
|
||||
if err != nil {
|
||||
stderr(err)
|
||||
return -1
|
||||
}
|
||||
|
||||
nn := mapNode(n)
|
||||
|
||||
marshal := json.Marshal
|
||||
if o.pretty || o.indent != "" {
|
||||
if o.indent == "" {
|
||||
o.indent = " "
|
||||
}
|
||||
|
||||
marshal = func(n interface{}) ([]byte, error) {
|
||||
return json.MarshalIndent(n, "", o.indent)
|
||||
}
|
||||
}
|
||||
|
||||
b, err := marshal(nn)
|
||||
if err != nil {
|
||||
stderr(err)
|
||||
}
|
||||
|
||||
stdout(string(b))
|
||||
return 0
|
||||
}
|
||||
|
122
cmd/treerack/parse_test.go
Normal file
122
cmd/treerack/parse_test.go
Normal file
@ -0,0 +1,122 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
var parseFailureTests = convertTests("parse", checkFailureTests)
|
||||
|
||||
var parseTests = []mainTest{
|
||||
{
|
||||
title: "syntax as file",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax", "foo_test.treerack", "-input-string", "bar",
|
||||
},
|
||||
stdout: []string{
|
||||
`"name":"foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "syntax as string",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
stdout: []string{
|
||||
`"name":"foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "input as stdin",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"`,
|
||||
},
|
||||
stdin: "bar",
|
||||
stdout: []string{
|
||||
`"name":"foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "input as file",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"`, "-input", "bar_test.txt",
|
||||
},
|
||||
stdout: []string{
|
||||
`"name":"foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "input as string",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"`, "-input-string", "bar",
|
||||
},
|
||||
stdout: []string{
|
||||
`"name":"foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "pretty",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"`, "-input-string", "bar", "-pretty",
|
||||
},
|
||||
stdout: []string{
|
||||
` "name": "foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "pretty and indent",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"`, "-input-string", "bar", "-pretty", "-indent", "xx",
|
||||
},
|
||||
stdout: []string{
|
||||
`xx"name": "foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "indent without pretty",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"`, "-input-string", "bar", "-pretty", "-indent", "xx",
|
||||
},
|
||||
stdout: []string{
|
||||
`xx"name": "foo"`,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "with child nodes",
|
||||
args: []string{
|
||||
"treerack", "parse", "-syntax-string", `foo = "bar"; doc = foo`, "-input-string", "bar",
|
||||
},
|
||||
stdout: []string{
|
||||
`"nodes":[`,
|
||||
`"text":"bar"`,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestParse(t *testing.T) {
|
||||
runMainTest(t, mainTest{
|
||||
title: "help",
|
||||
args: []string{
|
||||
"treerack", "parse", "-help",
|
||||
},
|
||||
stdout: []string{
|
||||
parseUsage,
|
||||
"-syntax",
|
||||
"-syntax-string",
|
||||
"-input",
|
||||
"-input-string",
|
||||
"-pretty",
|
||||
"-indent",
|
||||
parseExample,
|
||||
docRef,
|
||||
},
|
||||
})
|
||||
|
||||
runMainTest(t, parseFailureTests...)
|
||||
runMainTest(t, parseTests...)
|
||||
}
|
1150
self/self.go
1150
self/self.go
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user