1package config
2
3import (
4	"testing"
5	"time"
6
7	"github.com/pascaldekloe/goe/verify"
8)
9
10func TestMerge(t *testing.T) {
11	tests := []struct {
12		desc string
13		cfgs []Config
14		want Config
15	}{
16		{
17			"top level fields",
18			[]Config{
19				{AdvertiseAddrLAN: pString("a")},
20				{AdvertiseAddrLAN: pString("b")},
21				{RaftProtocol: pInt(1)},
22				{RaftProtocol: pInt(2)},
23				{ServerMode: pBool(false)},
24				{ServerMode: pBool(true)},
25				{StartJoinAddrsLAN: []string{"a"}},
26				{StartJoinAddrsLAN: []string{"b"}},
27				{NodeMeta: map[string]string{"a": "b"}},
28				{NodeMeta: map[string]string{"c": "d"}},
29				{NodeMeta: map[string]string{"c": "e"}},
30				{Ports: Ports{DNS: pInt(1)}},
31				{Ports: Ports{DNS: pInt(2), HTTP: pInt(3)}},
32			},
33			Config{
34				AdvertiseAddrLAN:  pString("b"),
35				RaftProtocol:      pInt(2),
36				ServerMode:        pBool(true),
37				StartJoinAddrsLAN: []string{"a", "b"},
38				NodeMeta: map[string]string{
39					"a": "b",
40					"c": "e",
41				},
42				Ports: Ports{DNS: pInt(2), HTTP: pInt(3)},
43			},
44		},
45	}
46
47	for _, tt := range tests {
48		t.Run(tt.desc, func(t *testing.T) {
49			got, want := Merge(tt.cfgs...), tt.want
50			if !verify.Values(t, "", got, want) {
51				t.FailNow()
52			}
53		})
54	}
55}
56
57func pBool(v bool) *bool                { return &v }
58func pInt(v int) *int                   { return &v }
59func pString(v string) *string          { return &v }
60func pDuration(v time.Duration) *string { s := v.String(); return &s }
61func pFloat64(v float64) *float64       { return &v }
62