123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- package flags
-
- import (
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "path"
- "runtime"
- "testing"
- )
-
- func assertCallerInfo() (string, int) {
- ptr := make([]uintptr, 15)
- n := runtime.Callers(1, ptr)
-
- if n == 0 {
- return "", 0
- }
-
- mef := runtime.FuncForPC(ptr[0])
- mefile, meline := mef.FileLine(ptr[0])
-
- for i := 2; i < n; i++ {
- f := runtime.FuncForPC(ptr[i])
- file, line := f.FileLine(ptr[i])
-
- if file != mefile {
- return file, line
- }
- }
-
- return mefile, meline
- }
-
- func assertErrorf(t *testing.T, format string, args ...interface{}) {
- msg := fmt.Sprintf(format, args...)
-
- file, line := assertCallerInfo()
-
- t.Errorf("%s:%d: %s", path.Base(file), line, msg)
- }
-
- func assertFatalf(t *testing.T, format string, args ...interface{}) {
- msg := fmt.Sprintf(format, args...)
-
- file, line := assertCallerInfo()
-
- t.Fatalf("%s:%d: %s", path.Base(file), line, msg)
- }
-
- func assertString(t *testing.T, a string, b string) {
- if a != b {
- assertErrorf(t, "Expected %#v, but got %#v", b, a)
- }
- }
-
- func assertStringArray(t *testing.T, a []string, b []string) {
- if len(a) != len(b) {
- assertErrorf(t, "Expected %#v, but got %#v", b, a)
- return
- }
-
- for i, v := range a {
- if b[i] != v {
- assertErrorf(t, "Expected %#v, but got %#v", b, a)
- return
- }
- }
- }
-
- func assertBoolArray(t *testing.T, a []bool, b []bool) {
- if len(a) != len(b) {
- assertErrorf(t, "Expected %#v, but got %#v", b, a)
- return
- }
-
- for i, v := range a {
- if b[i] != v {
- assertErrorf(t, "Expected %#v, but got %#v", b, a)
- return
- }
- }
- }
-
- func assertParserSuccess(t *testing.T, data interface{}, args ...string) (*Parser, []string) {
- parser := NewParser(data, Default&^PrintErrors)
- ret, err := parser.ParseArgs(args)
-
- if err != nil {
- t.Fatalf("Unexpected parse error: %s", err)
- return nil, nil
- }
-
- return parser, ret
- }
-
- func assertParseSuccess(t *testing.T, data interface{}, args ...string) []string {
- _, ret := assertParserSuccess(t, data, args...)
- return ret
- }
-
- func assertError(t *testing.T, err error, typ ErrorType, msg string) {
- if err == nil {
- assertFatalf(t, "Expected error: %s", msg)
- return
- }
-
- if e, ok := err.(*Error); !ok {
- assertFatalf(t, "Expected Error type, but got %#v", err)
- } else {
- if e.Type != typ {
- assertErrorf(t, "Expected error type {%s}, but got {%s}", typ, e.Type)
- }
-
- if e.Message != msg {
- assertErrorf(t, "Expected error message %#v, but got %#v", msg, e.Message)
- }
- }
- }
-
- func assertParseFail(t *testing.T, typ ErrorType, msg string, data interface{}, args ...string) []string {
- parser := NewParser(data, Default&^PrintErrors)
- ret, err := parser.ParseArgs(args)
-
- assertError(t, err, typ, msg)
- return ret
- }
-
- func diff(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())
-
- if err.Error() == "exit status 1" {
- return string(ret), nil
- }
-
- return string(ret), err
- }
-
- func assertDiff(t *testing.T, actual, expected, msg string) {
- if actual == expected {
- return
- }
-
- ret, err := diff(actual, expected)
-
- if err != nil {
- assertErrorf(t, "Unexpected diff error: %s", err)
- assertErrorf(t, "Unexpected %s, expected:\n\n%s\n\nbut got\n\n%s", msg, expected, actual)
- } else {
- assertErrorf(t, "Unexpected %s:\n\n%s", msg, ret)
- }
- }
|