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}