mirror of
https://github.com/zrepl/zrepl.git
synced 2024-12-18 05:00:50 +01:00
91 lines
1.2 KiB
Go
91 lines
1.2 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/zrepl/yaml-config"
|
|
)
|
|
|
|
type A struct {
|
|
B *B `yaml:"b,optional,fromdefaults"`
|
|
A1 string `yaml:"a1,optional"`
|
|
}
|
|
|
|
type B struct {
|
|
C *C `yaml:"c,optional,fromdefaults"`
|
|
D string `yaml:"d,default=ddd"`
|
|
E string `yaml:"e,optional"`
|
|
}
|
|
|
|
type C struct {
|
|
Q string `yaml:"q,optional"`
|
|
R string `yaml:"r,default=r"`
|
|
}
|
|
|
|
func TestDepFromDefaults(t *testing.T) {
|
|
|
|
type testcase struct {
|
|
name string
|
|
yaml string
|
|
expect *A
|
|
}
|
|
|
|
tcs := []testcase{
|
|
{
|
|
name: "empty",
|
|
yaml: `{}`,
|
|
expect: &A{
|
|
B: &B{
|
|
C: &C{
|
|
R: "r",
|
|
},
|
|
D: "ddd",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "a1 set",
|
|
yaml: `{"a1":"blah"}`,
|
|
expect: &A{
|
|
A1: "blah",
|
|
B: &B{
|
|
C: &C{
|
|
R: "r",
|
|
},
|
|
D: "ddd",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "D set",
|
|
yaml: `
|
|
b:
|
|
d: 4d
|
|
`,
|
|
expect: &A{
|
|
B: &B{
|
|
D: "4d",
|
|
C: &C{
|
|
R: "r",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for tci := range tcs {
|
|
t.Run(fmt.Sprintf("%d-%s", tci, tcs[tci].name), func(t *testing.T) {
|
|
tc := tcs[tci]
|
|
|
|
var a A
|
|
err := yaml.UnmarshalStrict([]byte(tc.yaml), &a)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, tc.expect, &a)
|
|
})
|
|
}
|
|
|
|
}
|