Normalize original resolution history evidence
This commit is contained in:
94
internal/engine/history_resolution_test.go
Normal file
94
internal/engine/history_resolution_test.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
)
|
||||
|
||||
func TestHistoryResolutionRetainsOriginalShapeAttributionBehindReplayGroup(t *testing.T) {
|
||||
before := &document.Node{Kind: document.Mapping, Mapping: []document.Entry{{
|
||||
Key: "0", Value: &document.Node{Kind: document.String, Text: "old"},
|
||||
}}}
|
||||
after := &document.Node{Kind: document.Sequence, Sequence: []*document.Node{{
|
||||
Kind: document.String, Text: "new", Sensitive: true,
|
||||
}}}
|
||||
baseline := &document.Node{Kind: document.Mapping, Mapping: []document.Entry{{
|
||||
Key: "settings", Value: before,
|
||||
}}}
|
||||
parentDependency := Keys("parent-dependency")
|
||||
childDependency := Keys("child-dependency")
|
||||
snapshots := []resolutionSnapshot{
|
||||
{
|
||||
change: Change{
|
||||
Path: Keys("settings"), Origin: Origin{Layer: LayerResolution, Operation: ChangeDerivedDefault},
|
||||
Reasons: []string{"parent normalization"}, Dependencies: []Path{parentDependency},
|
||||
},
|
||||
before: before, after: after,
|
||||
},
|
||||
{
|
||||
change: Change{
|
||||
Path: parseOverrideTestPath(t, "/settings/0"), Origin: Origin{Layer: LayerResolution, Operation: ChangeNormalization},
|
||||
Reasons: []string{"child normalization"}, Dependencies: []Path{childDependency},
|
||||
},
|
||||
before: before.Mapping[0].Value,
|
||||
after: after.Sequence[0],
|
||||
},
|
||||
}
|
||||
|
||||
builder := newHistoryBuilder()
|
||||
builder.observeBaseline(baseline)
|
||||
builder.setScratch(baseline)
|
||||
builder.observeResolutionEvidence(snapshots)
|
||||
model := builder.freeze()
|
||||
|
||||
if got := model.resolutionPayload.replayGroups; len(got) != 1 ||
|
||||
got[0].coveringRecordID != 0 || !reflect.DeepEqual(got[0].originalRecordIDs, []int{0, 1}) ||
|
||||
!reflect.DeepEqual(got[0].change.Reasons, []string{"parent normalization", "child normalization"}) ||
|
||||
!reflect.DeepEqual(got[0].change.Dependencies, []Path{parentDependency, childDependency}) ||
|
||||
got[0].change.Origin.Operation != ChangeNormalization {
|
||||
t.Fatalf("replay group lost original references or merged annotations: %#v", got)
|
||||
}
|
||||
if len(model.resolutionPayload.snapshots) != 2 ||
|
||||
model.resolutionPayload.snapshots[1].change.Reasons[0] != "child normalization" ||
|
||||
model.resolutionPayload.snapshots[1].change.Dependencies[0].String() != childDependency.String() ||
|
||||
model.resolutionPayload.snapshots[0].before != before || model.resolutionPayload.snapshots[1].after != after.Sequence[0] {
|
||||
t.Fatalf("original resolution records or their roots were not retained: %#v", model.resolutionPayload.snapshots)
|
||||
}
|
||||
|
||||
keyPath := Keys("settings", "0")
|
||||
keySelections := model.selectHistory(keyPath)
|
||||
if len(keySelections) != 3 || !keySelections[0].after || keySelections[1].phase != historyPhaseResolution ||
|
||||
!keySelections[1].before || keySelections[1].after || !keySelections[2].before || keySelections[2].after {
|
||||
t.Fatalf("mapping-key history did not retain its removed side: %#v", keySelections)
|
||||
}
|
||||
if got := keySelections[1].previous; len(got) != 1 || got[0].Layer != LayerDefault {
|
||||
t.Fatalf("removed key previous origin = %#v, want baseline origin", got)
|
||||
}
|
||||
|
||||
indexPath := Keys("settings").Index(0)
|
||||
indexSelections := model.selectHistory(indexPath)
|
||||
if len(indexSelections) != 2 || indexSelections[0].phase != historyPhaseResolution ||
|
||||
!indexSelections[0].after || indexSelections[0].before || !indexSelections[1].after || indexSelections[1].before {
|
||||
t.Fatalf("sequence-index history did not retain introduced sides: %#v", indexSelections)
|
||||
}
|
||||
if len(indexSelections[0].previous) != 0 {
|
||||
t.Fatalf("introduced index inherited a different key's previous origin: %#v", indexSelections[0].previous)
|
||||
}
|
||||
if got := indexSelections[1].attribution; got.origin.Operation != ChangeNormalization ||
|
||||
!reflect.DeepEqual(got.reasons, []string{"child normalization"}) ||
|
||||
!reflect.DeepEqual(got.dependencies, []Path{childDependency}) {
|
||||
t.Fatalf("covered original attribution = %#v", got)
|
||||
}
|
||||
|
||||
foundSensitive := false
|
||||
for _, observation := range model.observations {
|
||||
if observation.phase == historyPhaseResolution && sameConcreteHistoryPath(observation.path, indexPath) && observation.sensitive {
|
||||
foundSensitive = true
|
||||
}
|
||||
}
|
||||
if !foundSensitive {
|
||||
t.Fatal("original resolution subtree sensitivity was omitted from observations")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user