#97 add As for all interface.

This commit is contained in:
Gorbunov Kirill Andreevich 2024-02-27 23:11:53 +03:00
parent 2fba1544a7
commit d07ac67300

View File

@ -1,24 +1,103 @@
package micro package micro
import "testing" import (
"context"
"fmt"
"reflect"
"testing"
"go.unistack.org/micro/v3/broker"
"go.unistack.org/micro/v3/fsm"
"go.unistack.org/micro/v3/options"
)
func TestAs(t *testing.T) { func TestAs(t *testing.T) {
type args struct { var b *bro
broTarget := &bro{name: "kafka"}
fsmTarget := &fsmT{name: "fsm"}
testCases := []struct {
b any b any
target any target any
} match bool
tests := []struct { want any
name string
args args
want bool
}{ }{
// TODO: Add test cases. {
broTarget,
&b,
true,
broTarget,
},
{
nil,
&b,
false,
nil,
},
{
fsmTarget,
&b,
false,
nil,
},
} }
for _, tt := range tests { for i, tc := range testCases {
t.Run(tt.name, func(t *testing.T) { name := fmt.Sprintf("%d:As(Errorf(..., %v), %v)", i, tc.b, tc.target)
if got := As(tt.args.b, tt.args.target); got != tt.want { // Clear the target pointer, in case it was set in a previous test.
t.Errorf("As() = %v, want %v", got, tt.want) rtarget := reflect.ValueOf(tc.target)
rtarget.Elem().Set(reflect.Zero(reflect.TypeOf(tc.target).Elem()))
t.Run(name, func(t *testing.T) {
match := As(tc.b, tc.target)
if match != tc.match {
t.Fatalf("match: got %v; want %v", match, tc.match)
}
if !match {
return
}
if got := rtarget.Elem().Interface(); got != tc.want {
t.Fatalf("got %#v, want %#v", got, tc.want)
} }
}) })
} }
} }
type bro struct {
name string
}
func (p *bro) Name() string { return p.name }
func (p *bro) Init(opts ...options.Option) error { return nil }
// Options returns broker options
func (p *bro) Options() broker.Options { return broker.Options{} }
// Address return configured address
func (p *bro) Address() string { return "" }
// Connect connects to broker
func (p *bro) Connect(ctx context.Context) error { return nil }
// Disconnect disconnect from broker
func (p *bro) Disconnect(ctx context.Context) error { return nil }
// Publish message, msg can be single broker.Message or []broker.Message
func (p *bro) Publish(ctx context.Context, msg interface{}, opts ...options.Option) error { return nil }
// Subscribe subscribes to topic message via handler
func (p *bro) Subscribe(ctx context.Context, topic string, handler interface{}, opts ...options.Option) (broker.Subscriber, error) {
return nil, nil
}
// String type of broker
func (p *bro) String() string { return p.name }
type fsmT struct {
name string
}
func (f *fsmT) Start(ctx context.Context, a interface{}, o ...Option) (interface{}, error) {
return nil, nil
}
func (f *fsmT) Current() string { return f.name }
func (f *fsmT) Reset() {}
func (f *fsmT) State(s string, sf fsm.StateFunc) {}