/
equal.go
66 lines (59 loc) · 1.82 KB
/
equal.go
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
package yamltest
import (
"fmt"
"slices"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v3"
"github.com/crhntr/yamlutil/yamlnode"
)
// AssertEqual asserts that two yaml.Node trees are equal.
// It follows aliases.
func AssertEqual(t *testing.T, a, b *yaml.Node) {
t.Helper()
assertEqual(t, a, b, "")
}
func assertEqual(t require.TestingT, a, b *yaml.Node, p string) {
if a.Kind == yaml.AliasNode {
assertEqual(t, a.Alias, b, p)
return
}
if b.Kind == yaml.AliasNode {
assertEqual(t, a, b.Alias, p)
return
}
require.Equalf(t, a.Kind, b.Kind, "kind mismatch at %s", p)
switch a.Kind {
case yaml.DocumentNode:
assertEqual(t, a.Content[0], b.Content[0], "")
case yaml.MappingNode:
aKeys := yamlnode.ValuesStrings(yamlnode.Keys(a))
bKeys := yamlnode.ValuesStrings(yamlnode.Keys(b))
assert.Equal(t, aKeys, bKeys, p)
keys := append(aKeys[:len(aKeys):len(aKeys)], bKeys...)
slices.Sort(keys)
for _, key := range slices.Compact(keys) {
aValue, aFound := yamlnode.LookupKey(a, key)
assert.Truef(t, aFound, "a missing key %q in %s", key, p)
bValue, bFound := yamlnode.LookupKey(b, key)
assert.Truef(t, bFound, "b missing key %q in %s", key, p)
if aFound && bFound {
assertEqual(t, aValue, bValue, fmt.Sprintf("%s.[%q]", p, key))
}
}
case yaml.SequenceNode:
require.Equal(t, len(a.Content), len(b.Content), "mismatched sequence lengths at %s", p)
for i := 0; i < len(a.Content); i++ {
assertEqual(t, a.Content[i], b.Content[i], fmt.Sprintf("%s[%d]", p, i))
}
case yaml.ScalarNode:
assert.Equalf(t, a.Value, b.Value, "mismatched value at %s", p)
assert.Equalf(t, a.Tag, b.Tag, "mismatched tag at %s", p)
case 0:
assert.Zero(t, *a)
assert.Zero(t, *b)
default:
panic(fmt.Sprintf("un-supported node type %d at %s", a.Kind, p))
}
}