mirror of
https://github.com/octoleo/syncthing.git
synced 2024-12-23 03:18:59 +00:00
154 lines
3.4 KiB
Go
154 lines
3.4 KiB
Go
package flags
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func helpDiff(a, b string) (string, error) {
|
|
atmp, err := ioutil.TempFile("", "help-diff")
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
btmp, err := ioutil.TempFile("", "help-diff")
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if _, err := io.WriteString(atmp, a); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if _, err := io.WriteString(btmp, b); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
ret, err := exec.Command("diff", "-u", "-d", "--label", "got", atmp.Name(), "--label", "expected", btmp.Name()).Output()
|
|
|
|
os.Remove(atmp.Name())
|
|
os.Remove(btmp.Name())
|
|
|
|
return string(ret), nil
|
|
}
|
|
|
|
type helpOptions struct {
|
|
Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information" ini-name:"verbose"`
|
|
Call func(string) `short:"c" description:"Call phone number" ini-name:"call"`
|
|
PtrSlice []*string `long:"ptrslice" description:"A slice of pointers to string"`
|
|
|
|
OnlyIni string `ini-name:"only-ini" description:"Option only available in ini"`
|
|
|
|
Other struct {
|
|
StringSlice []string `short:"s" description:"A slice of strings"`
|
|
IntMap map[string]int `long:"intmap" description:"A map from string to int" ini-name:"int-map"`
|
|
} `group:"Other Options"`
|
|
}
|
|
|
|
func TestHelp(t *testing.T) {
|
|
var opts helpOptions
|
|
|
|
p := NewNamedParser("TestHelp", HelpFlag)
|
|
p.AddGroup("Application Options", "The application options", &opts)
|
|
|
|
_, err := p.ParseArgs([]string{"--help"})
|
|
|
|
if err == nil {
|
|
t.Fatalf("Expected help error")
|
|
}
|
|
|
|
if e, ok := err.(*Error); !ok {
|
|
t.Fatalf("Expected flags.Error, but got %#T", err)
|
|
} else {
|
|
if e.Type != ErrHelp {
|
|
t.Errorf("Expected flags.ErrHelp type, but got %s", e.Type)
|
|
}
|
|
|
|
expected := `Usage:
|
|
TestHelp [OPTIONS]
|
|
|
|
Application Options:
|
|
-v, --verbose Show verbose debug information
|
|
-c= Call phone number
|
|
--ptrslice= A slice of pointers to string
|
|
|
|
Other Options:
|
|
-s= A slice of strings
|
|
--intmap= A map from string to int
|
|
|
|
Help Options:
|
|
-h, --help Show this help message
|
|
`
|
|
|
|
if e.Message != expected {
|
|
ret, err := helpDiff(e.Message, expected)
|
|
|
|
if err != nil {
|
|
t.Errorf("Unexpected diff error: %s", err)
|
|
t.Errorf("Unexpected help message, expected:\n\n%s\n\nbut got\n\n%s", expected, e.Message)
|
|
} else {
|
|
t.Errorf("Unexpected help message:\n\n%s", ret)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMan(t *testing.T) {
|
|
var opts helpOptions
|
|
|
|
p := NewNamedParser("TestMan", HelpFlag)
|
|
p.ShortDescription = "Test manpage generation"
|
|
p.LongDescription = "This is a somewhat longer description of what this does"
|
|
p.AddGroup("Application Options", "The application options", &opts)
|
|
|
|
var buf bytes.Buffer
|
|
p.WriteManPage(&buf)
|
|
|
|
got := buf.String()
|
|
|
|
tt := time.Now()
|
|
|
|
expected := fmt.Sprintf(`.TH TestMan 1 "%s"
|
|
.SH NAME
|
|
TestMan \- Test manpage generation
|
|
.SH SYNOPSIS
|
|
\fBTestMan\fP [OPTIONS]
|
|
.SH DESCRIPTION
|
|
This is a somewhat longer description of what this does
|
|
.SH OPTIONS
|
|
.TP
|
|
\fB-v, --verbose\fP
|
|
Show verbose debug information
|
|
.TP
|
|
\fB-c\fP
|
|
Call phone number
|
|
.TP
|
|
\fB--ptrslice\fP
|
|
A slice of pointers to string
|
|
.TP
|
|
\fB-s\fP
|
|
A slice of strings
|
|
.TP
|
|
\fB--intmap\fP
|
|
A map from string to int
|
|
`, tt.Format("2 January 2006"))
|
|
|
|
if got != expected {
|
|
ret, err := helpDiff(got, expected)
|
|
|
|
if err != nil {
|
|
t.Errorf("Unexpected man page, expected:\n\n%s\n\nbut got\n\n%s", expected, got)
|
|
} else {
|
|
t.Errorf("Unexpected man page:\n\n%s", ret)
|
|
}
|
|
}
|
|
}
|