Skip to content

Commit e75fa70

Browse files
authored
Merge pull request #17 from lvan100/main
Add Object Cleanup Function Test
2 parents 2b2c14d + c930def commit e75fa70

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

gs/gs.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,13 @@ func Config() *gs_conf.AppConfig {
243243
return gs_app.GS.P
244244
}
245245

246+
// Component registers a bean definition for a given object.
247+
func Component[T any](i T) T {
248+
b := gs_bean.NewBean(reflect.ValueOf(i))
249+
gs_app.GS.C.Register(b).Caller(1)
250+
return i
251+
}
252+
246253
// Object registers a bean definition for a given object.
247254
func Object(i interface{}) *RegisteredBean {
248255
b := gs_bean.NewBean(reflect.ValueOf(i))

gs/internal/gs_core/injecting/injecting_test.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"fmt"
2323
"net/http"
2424
"reflect"
25+
"runtime"
2526
"testing"
2627
"time"
2728

@@ -927,20 +928,36 @@ type DyncValue struct {
927928
func TestForceClean(t *testing.T) {
928929

929930
t.Run("no dync value", func(t *testing.T) {
931+
release := make(map[string]struct{})
932+
930933
r := New(conf.Map(map[string]interface{}{
931934
"spring": map[string]interface{}{
932935
"force-clean": true,
933936
},
934937
}))
935-
beans := []*gs.BeanDefinition{
936-
objectBean(&SimpleLogger{}).Name("biz"),
937-
objectBean(&SimpleLogger{}).Name("sys"),
938-
}
938+
939+
b1 := objectBean(&SimpleLogger{}).Name("biz")
940+
runtime.AddCleanup(&b1, func(s string) {
941+
release[s] = struct{}{}
942+
}, "biz")
943+
944+
b2 := objectBean(&SimpleLogger{}).Name("sys")
945+
runtime.AddCleanup(&b2, func(s string) {
946+
release[s] = struct{}{}
947+
}, "sys")
948+
949+
beans := []*gs.BeanDefinition{b1, b2}
939950
err := r.Refresh(extractBeans(beans))
940951
assert.Nil(t, err)
941952
assert.Nil(t, r.p)
942953
assert.Nil(t, r.beansByName)
943954
assert.Nil(t, r.beansByType)
955+
956+
runtime.GC()
957+
assert.That(t, release).Equal(map[string]struct{}{
958+
"biz": {},
959+
"sys": {},
960+
})
944961
})
945962

946963
t.Run("has dync value", func(t *testing.T) {

gs/internal/gs_dync/dync_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,35 @@ func TestDync(t *testing.T) {
181181
assert.ThatError(t, err).Matches("strconv.ParseInt: parsing \\\"xyz\\\": invalid syntax")
182182
assert.That(t, p.ObjectsCount()).Equal(4)
183183
})
184+
185+
t.Run("refresh struct", func(t *testing.T) {
186+
p := New(conf.Map(map[string]interface{}{
187+
"config.s1.value": "99",
188+
}))
189+
190+
v := &Value[struct {
191+
S1 struct {
192+
Value int `value:"${value}"`
193+
} `value:"${s1}"`
194+
}]{}
195+
196+
var param conf.BindParam
197+
err := param.BindTag("${config}", "")
198+
assert.Nil(t, err)
199+
200+
err = p.RefreshField(reflect.ValueOf(v), param)
201+
assert.Nil(t, err)
202+
assert.That(t, v.Value().S1.Value).Equal(99)
203+
204+
err = p.Refresh(conf.Map(map[string]interface{}{
205+
"config.s1.value": "xyz",
206+
}))
207+
assert.ThatError(t, err).Matches("strconv.ParseInt: parsing \"xyz\": invalid syntax")
208+
209+
err = p.Refresh(conf.Map(map[string]interface{}{
210+
"config.s1.value": "10",
211+
}))
212+
assert.Nil(t, err)
213+
assert.That(t, v.Value().S1.Value).Equal(10)
214+
})
184215
}

0 commit comments

Comments
 (0)