summaryrefslogtreecommitdiff
path: root/pkg/x/option_test.go
blob: 7d6a33d04377f1d60c5d302ebe3c00a50c365f81 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package x

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

type person struct {
	name string
	age  int
}

func withName(name string) Option[*person] {
	return With(func(person *person) {
		person.name = name
	})
}

func withAge(age int) Option[*person] {
	return With(func(person *person) {
		person.age = age
	})
}

func TestOption(t *testing.T) {
	t.Run("New", func(t *testing.T) {
		t.Run("without options", func(t *testing.T) {
			item := New[*person]()

			require.NotNil(t, item)
			assert.Equal(t, "", item.name)
			assert.Zero(t, item.age)
		})

		t.Run("with name", func(t *testing.T) {
			item := New[*person](withName("mo"))

			require.NotNil(t, item)
			assert.Equal(t, "mo", item.name)
		})

		t.Run("with age", func(t *testing.T) {
			item := New[*person](withAge(42))

			require.NotNil(t, item)
			assert.Equal(t, 42, item.age)
		})
	})

	t.Run("NewWith", func(t *testing.T) {
		t.Run("without options", func(t *testing.T) {
			p := &person{}
			item := NewWith[*person](p)

			require.NotNil(t, item)
			require.Same(t, p, item)
			assert.Equal(t, "", item.name)
			assert.Zero(t, item.age)
		})

		t.Run("with name", func(t *testing.T) {
			p := &person{}
			item := NewWith[*person](p, withName("mo"))

			require.NotNil(t, item)
			require.Same(t, p, item)
			assert.Equal(t, "mo", item.name)
		})

		t.Run("with age", func(t *testing.T) {
			p := &person{}
			item := NewWith[*person](p, withAge(42))

			require.NotNil(t, item)
			require.Same(t, p, item)
			assert.Equal(t, 42, item.age)
		})
	})
}