blob: d8129cc209b525824a24a5185348f83b6c4f36fe [file] [edit]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"bytes"
"flag"
"io"
"os"
"path/filepath"
"strings"
"testing"
)
func TestUsageLine(t *testing.T) {
binName := filepath.Base(os.Args[0])
tests := []struct {
name string
c *command
want string
}{
{
name: "no args",
c: &command{name: "version"},
want: binName + " version",
},
{
name: "with args",
c: &command{name: "package", args: "<package>[@version]"},
want: binName + " package [flags] <package>[@version]",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.usageLine(); got != tt.want {
t.Errorf("usageLine() = %q, want %q", got, tt.want)
}
})
}
}
func TestDispatch(t *testing.T) {
dummyCmd := &command{
name: "dummy",
summary: "dummy command",
run: func(fs *flag.FlagSet, stdout, stderr io.Writer) int {
return 0
},
}
flagsCmd := &command{
name: "flags",
summary: "command with flags",
flags: flag.NewFlagSet("flags", flag.ContinueOnError),
run: func(fs *flag.FlagSet, stdout, stderr io.Writer) int {
return 0
},
}
cmds := []*command{dummyCmd, flagsCmd}
tests := []struct {
name string
args []string
wantExit int
wantStdout string
wantStderr string
}{
{
name: "no arguments",
args: []string{},
wantExit: 2,
wantStderr: "Usage:",
},
{
name: "only flags",
args: []string{"-json"},
wantExit: 2,
wantStderr: "Usage:",
},
{
name: "known command",
args: []string{"dummy"},
wantExit: 0,
wantStdout: "",
},
{
name: "known command with flags",
args: []string{"flags"},
wantExit: 0,
wantStdout: "",
},
{
name: "unknown command",
args: []string{"unknown"},
wantExit: 2,
wantStderr: "unknown command: unknown",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var stdout, stderr bytes.Buffer
exit := dispatch(tt.args, cmds, &stdout, &stderr)
if exit != tt.wantExit {
t.Errorf("dispatch() exit = %d, want %d", exit, tt.wantExit)
}
if tt.wantStdout != "" && !strings.Contains(stdout.String(), tt.wantStdout) {
t.Errorf("dispatch() stdout = %q, want to contain %q", stdout.String(), tt.wantStdout)
}
if tt.wantStderr != "" && !strings.Contains(stderr.String(), tt.wantStderr) {
t.Errorf("dispatch() stderr = %q, want to contain %q", stderr.String(), tt.wantStderr)
}
})
}
}
func TestVersionInfo(t *testing.T) {
v := versionInfo()
binName := filepath.Base(os.Args[0])
if !strings.HasPrefix(v, binName) {
t.Errorf("versionInfo() = %q, want to start with %q", v, binName)
}
}