mirror of
https://github.com/zrepl/zrepl.git
synced 2024-11-28 11:25:20 +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)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
}
|