feat(cmd): add version, plain json, struct inference and schema modes
Test / test (push) Successful in 1m35s
Test / test (push) Successful in 1m35s
Assisted-by: GLM 5.3 Flash
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -446,3 +447,123 @@ n = "a"
|
||||
t.Errorf("round trip changed the document:\noriginal: %#v\nencoded: %#v\noutput: %q", want, got, out.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestRunVersion(t *testing.T) {
|
||||
var stdout, stderr bytes.Buffer
|
||||
code := Run([]string{"-version"}, strings.NewReader(""), &stdout, &stderr)
|
||||
if code != 0 {
|
||||
t.Fatalf("Run returned %d, want 0; stderr = %q", code, stderr.String())
|
||||
}
|
||||
out := stdout.String()
|
||||
if !strings.HasPrefix(out, "interpres-decode ") {
|
||||
t.Errorf("output = %q, want the version prefix", out)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRunPlainJSON(t *testing.T) {
|
||||
var stdout, stderr bytes.Buffer
|
||||
in := strings.NewReader("host = \"db\"\nwhen = 1979-05-27T07:32:00-07:00\nitems = [1, 2]\n")
|
||||
code := Run([]string{"-json"}, in, &stdout, &stderr)
|
||||
if code != 0 {
|
||||
t.Fatalf("Run returned %d, want 0; stderr = %q", code, stderr.String())
|
||||
}
|
||||
out := stdout.String()
|
||||
if !strings.Contains(out, "\"host\": \"db\"") {
|
||||
t.Errorf("output = %q, want plain JSON keys", out)
|
||||
}
|
||||
if strings.Contains(out, "\"type\"") {
|
||||
t.Errorf("output = %q, want no tags", out)
|
||||
}
|
||||
if !strings.Contains(out, "\n \"") {
|
||||
t.Errorf("output = %q, want indentation", out)
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateDirectorySummary(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
os.WriteFile(filepath.Join(dir, "good.toml"), []byte("a = 1\n"), 0o644)
|
||||
os.WriteFile(filepath.Join(dir, "bad.toml"), []byte("a =\n"), 0o644)
|
||||
sub := filepath.Join(dir, "nested")
|
||||
os.Mkdir(sub, 0o755)
|
||||
os.WriteFile(filepath.Join(sub, "deep.toml"), []byte("b = true\n"), 0o644)
|
||||
|
||||
var stdout, stderr bytes.Buffer
|
||||
code := Run([]string{"-validate", dir}, strings.NewReader(""), &stdout, &stderr)
|
||||
if code != 1 {
|
||||
t.Fatalf("Run returned %d, want 1 for a directory with an invalid file", code)
|
||||
}
|
||||
if !strings.Contains(stderr.String(), "checked 3 documents, 1 invalid") {
|
||||
t.Errorf("stderr = %q, want the summary", stderr.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestInferStruct(t *testing.T) {
|
||||
var stdout, stderr bytes.Buffer
|
||||
in := strings.NewReader("host = \"db\"\nport = 5432\ntags = [\"a\"]\n\n[server]\nname = \"edge\"\n\n[[items]]\nn = 1\n")
|
||||
code := Run([]string{"-struct"}, in, &stdout, &stderr)
|
||||
if code != 0 {
|
||||
t.Fatalf("Run returned %d, want 0; stderr = %q", code, stderr.String())
|
||||
}
|
||||
out := stdout.String()
|
||||
for _, want := range []string{
|
||||
"type inferred struct {",
|
||||
"Host string `toml:\"host\"`",
|
||||
"Port int64 `toml:\"port\"`",
|
||||
"Tags []string `toml:\"tags\"`",
|
||||
"Server struct {",
|
||||
"Items []struct {",
|
||||
} {
|
||||
if !strings.Contains(out, want) {
|
||||
t.Errorf("output missing %q:\n%s", want, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRunSchemaTemplate(t *testing.T) {
|
||||
src := filepath.Join(t.TempDir(), "config.go")
|
||||
body := `package cfg
|
||||
|
||||
type Server struct {
|
||||
Host string ` + "`toml:\"host,comment=The host to dial,default=example.org\"`" + `
|
||||
Port int ` + "`toml:\"port,default=8080\"`" + `
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
Name string ` + "`toml:\"name\"`" + `
|
||||
Rate float64 ` + "`toml:\"rate,default=0.5\"`" + `
|
||||
On bool ` + "`toml:\"on\"`" + `
|
||||
Started time.Time ` + "`toml:\"started\"`" + `
|
||||
Server Server ` + "`toml:\"server,comment=The server section\"`" + `
|
||||
Items []Item ` + "`toml:\"items\"`" + `
|
||||
}
|
||||
|
||||
type Item struct {
|
||||
N int ` + "`toml:\"n\"`" + `
|
||||
}
|
||||
`
|
||||
if err := os.WriteFile(src, []byte(body), 0o644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var stdout, stderr bytes.Buffer
|
||||
code := Run([]string{"-schema", "Config", src}, strings.NewReader(""), &stdout, &stderr)
|
||||
if code != 0 {
|
||||
t.Fatalf("Run returned %d, want 0; stderr = %q", code, stderr.String())
|
||||
}
|
||||
out := stdout.String()
|
||||
for _, want := range []string{
|
||||
"# The server section",
|
||||
"[server]",
|
||||
"# The host to dial",
|
||||
"host = \"example.org\"",
|
||||
"port = 8080",
|
||||
"rate = 0.5",
|
||||
"on = false",
|
||||
"started = 1979-05-27T00:00:00Z",
|
||||
"[[items]]",
|
||||
"n = 0",
|
||||
} {
|
||||
if !strings.Contains(out, want) {
|
||||
t.Errorf("output missing %q:\n%s", want, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user