github.com/alecthomas/kong@v0.9.1-0.20240410131203-2ab5733f1179/options_test.go (about)

     1  package kong
     2  
     3  import (
     4  	"reflect"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/alecthomas/assert/v2"
     9  )
    10  
    11  func TestOptions(t *testing.T) {
    12  	var cli struct{}
    13  	p, err := New(&cli, Name("name"), Description("description"), Writers(nil, nil), Exit(nil))
    14  	assert.NoError(t, err)
    15  	assert.Equal(t, "name", p.Model.Name)
    16  	assert.Equal(t, "description", p.Model.Help)
    17  	assert.Zero(t, p.Stdout)
    18  	assert.Zero(t, p.Stderr)
    19  	assert.Zero(t, p.Exit)
    20  }
    21  
    22  type impl string
    23  
    24  func (impl) Method() {}
    25  
    26  func TestBindTo(t *testing.T) {
    27  	type iface interface {
    28  		Method()
    29  	}
    30  
    31  	saw := ""
    32  	method := func(i iface) error {
    33  		saw = string(i.(impl)) //nolint
    34  		return nil
    35  	}
    36  
    37  	var cli struct{}
    38  
    39  	p, err := New(&cli, BindTo(impl("foo"), (*iface)(nil)))
    40  	assert.NoError(t, err)
    41  	err = callFunction(reflect.ValueOf(method), p.bindings)
    42  	assert.NoError(t, err)
    43  	assert.Equal(t, "foo", saw)
    44  }
    45  
    46  func TestInvalidCallback(t *testing.T) {
    47  	type iface interface {
    48  		Method()
    49  	}
    50  
    51  	saw := ""
    52  	method := func(i iface) string {
    53  		saw = string(i.(impl)) //nolint
    54  		return saw
    55  	}
    56  
    57  	var cli struct{}
    58  
    59  	p, err := New(&cli, BindTo(impl("foo"), (*iface)(nil)))
    60  	assert.NoError(t, err)
    61  	err = callFunction(reflect.ValueOf(method), p.bindings)
    62  	assert.EqualError(t, err, `return value of func(kong.iface) string must implement "error"`)
    63  }
    64  
    65  type zrror struct{}
    66  
    67  func (*zrror) Error() string {
    68  	return "error"
    69  }
    70  
    71  func TestCallbackCustomError(t *testing.T) {
    72  	type iface interface {
    73  		Method()
    74  	}
    75  
    76  	saw := ""
    77  	method := func(i iface) *zrror {
    78  		saw = string(i.(impl)) //nolint
    79  		return nil
    80  	}
    81  
    82  	var cli struct{}
    83  
    84  	p, err := New(&cli, BindTo(impl("foo"), (*iface)(nil)))
    85  	assert.NoError(t, err)
    86  	err = callFunction(reflect.ValueOf(method), p.bindings)
    87  	assert.NoError(t, err)
    88  	assert.Equal(t, "foo", saw)
    89  }
    90  
    91  type bindToProviderCLI struct {
    92  	Called bool
    93  	Cmd    bindToProviderCmd `cmd:""`
    94  }
    95  
    96  type boundThing struct {
    97  }
    98  
    99  type bindToProviderCmd struct{}
   100  
   101  func (*bindToProviderCmd) Run(cli *bindToProviderCLI, b *boundThing) error {
   102  	cli.Called = true
   103  	return nil
   104  }
   105  
   106  func TestBindToProvider(t *testing.T) {
   107  	var cli bindToProviderCLI
   108  	app, err := New(&cli, BindToProvider(func() (*boundThing, error) { return &boundThing{}, nil }))
   109  	assert.NoError(t, err)
   110  	ctx, err := app.Parse([]string{"cmd"})
   111  	assert.NoError(t, err)
   112  	err = ctx.Run()
   113  	assert.NoError(t, err)
   114  	assert.True(t, cli.Called)
   115  }
   116  
   117  func TestFlagNamer(t *testing.T) {
   118  	var cli struct {
   119  		SomeFlag string
   120  	}
   121  	app, err := New(&cli, FlagNamer(strings.ToUpper))
   122  	assert.NoError(t, err)
   123  	assert.Equal(t, "SOMEFLAG", app.Model.Flags[1].Name)
   124  }