main
1package ioc
2
3import (
4 "testing"
5 "time"
6
7 "github.com/golobby/container/v3"
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10)
11
12type testItem struct {
13 num int64
14}
15
16func TestIOC(t *testing.T) {
17 c := container.New()
18
19 t.Run("Register", func(t *testing.T) {
20 var ctr int64
21 err := Register[*testItem](c, func() *testItem {
22 item := &testItem{num: ctr}
23 ctr++
24 return item
25 })
26
27 require.NoError(t, err)
28
29 assert.Nil(t, c.Call(func(result *testItem) {
30 assert.Equal(t, int64(1), result.num)
31 }))
32
33 assert.Nil(t, c.Call(func(result *testItem) {
34 assert.Equal(t, int64(2), result.num)
35 }))
36 })
37
38 t.Run("RegisterSingleton", func(t *testing.T) {
39 err := RegisterSingleton[*testItem](c, func() *testItem {
40 return &testItem{num: time.Now().Unix()}
41 })
42 require.NoError(t, err)
43
44 var first int64
45 assert.Nil(t, c.Call(func(result *testItem) {
46 first = result.num
47 }))
48
49 assert.Nil(t, c.Call(func(result *testItem) {
50 assert.Equal(t, first, result.num)
51 }))
52 })
53
54 t.Run("Resolve", func(t *testing.T) {
55 item := &testItem{}
56
57 require.NoError(t, Register[*testItem](c, func() *testItem { return item }))
58
59 result, err := Resolve[*testItem](c)
60 require.NoError(t, err)
61
62 assert.Equal(t, item, result)
63 })
64
65 t.Run("MustResolve", func(t *testing.T) {
66 item := &testItem{}
67
68 require.NoError(t, Register[*testItem](c, func() *testItem { return item }))
69
70 result := MustResolve[*testItem](c)
71 assert.Equal(t, item, result)
72 })
73}