mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-27 17:25:16 +00:00
106 lines
2.0 KiB
Go
106 lines
2.0 KiB
Go
|
package dynamic
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
|
||
|
"github.com/c9s/bbgo/pkg/service"
|
||
|
"github.com/c9s/bbgo/pkg/types"
|
||
|
)
|
||
|
|
||
|
func Test_injectField(t *testing.T) {
|
||
|
type TT struct {
|
||
|
TradeService *service.TradeService
|
||
|
}
|
||
|
|
||
|
// only pointer object can be set.
|
||
|
var tt = &TT{}
|
||
|
|
||
|
// get the value of the pointer, or it can not be set.
|
||
|
var rv = reflect.ValueOf(tt).Elem()
|
||
|
|
||
|
_, ret := HasField(rv, "TradeService")
|
||
|
assert.True(t, ret)
|
||
|
|
||
|
ts := &service.TradeService{}
|
||
|
|
||
|
err := InjectField(rv, "TradeService", ts, true)
|
||
|
assert.NoError(t, err)
|
||
|
}
|
||
|
|
||
|
func Test_parseStructAndInject(t *testing.T) {
|
||
|
t.Run("skip nil", func(t *testing.T) {
|
||
|
ss := struct {
|
||
|
a int
|
||
|
Env *testEnvironment
|
||
|
}{
|
||
|
a: 1,
|
||
|
Env: nil,
|
||
|
}
|
||
|
err := ParseStructAndInject(&ss, nil)
|
||
|
assert.NoError(t, err)
|
||
|
assert.Nil(t, ss.Env)
|
||
|
})
|
||
|
t.Run("pointer", func(t *testing.T) {
|
||
|
ss := struct {
|
||
|
a int
|
||
|
Env *testEnvironment
|
||
|
}{
|
||
|
a: 1,
|
||
|
Env: nil,
|
||
|
}
|
||
|
err := ParseStructAndInject(&ss, &testEnvironment{})
|
||
|
assert.NoError(t, err)
|
||
|
assert.NotNil(t, ss.Env)
|
||
|
})
|
||
|
|
||
|
t.Run("composition", func(t *testing.T) {
|
||
|
type TT struct {
|
||
|
*service.TradeService
|
||
|
}
|
||
|
ss := TT{}
|
||
|
err := ParseStructAndInject(&ss, &service.TradeService{})
|
||
|
assert.NoError(t, err)
|
||
|
assert.NotNil(t, ss.TradeService)
|
||
|
})
|
||
|
|
||
|
t.Run("struct", func(t *testing.T) {
|
||
|
ss := struct {
|
||
|
a int
|
||
|
Env testEnvironment
|
||
|
}{
|
||
|
a: 1,
|
||
|
}
|
||
|
err := ParseStructAndInject(&ss, testEnvironment{
|
||
|
startTime: time.Now(),
|
||
|
})
|
||
|
assert.NoError(t, err)
|
||
|
assert.NotEqual(t, time.Time{}, ss.Env.startTime)
|
||
|
})
|
||
|
t.Run("interface/any", func(t *testing.T) {
|
||
|
ss := struct {
|
||
|
Any interface{} // anything
|
||
|
}{
|
||
|
Any: nil,
|
||
|
}
|
||
|
err := ParseStructAndInject(&ss, &testEnvironment{
|
||
|
startTime: time.Now(),
|
||
|
})
|
||
|
assert.NoError(t, err)
|
||
|
assert.NotNil(t, ss.Any)
|
||
|
})
|
||
|
t.Run("interface/stringer", func(t *testing.T) {
|
||
|
ss := struct {
|
||
|
Stringer types.Stringer // stringer interface
|
||
|
}{
|
||
|
Stringer: nil,
|
||
|
}
|
||
|
err := ParseStructAndInject(&ss, &types.Trade{})
|
||
|
assert.NoError(t, err)
|
||
|
assert.NotNil(t, ss.Stringer)
|
||
|
})
|
||
|
}
|