github.com/maresnic/mr-kong@v1.0.0/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 }