public void TestSimpleNestedPropertyChangeInBase() { var baseAsset = AssetHierarchyHelper.BuildAssetContainer(1, 2, 1, null, x => x.Parts[x.RootParts.Single().Id].Part.Object = new Types.SomeObject { Value = "BaseName" }); var derivedAsset = AssetHierarchyHelper.BuildAssetContainer(1, 2, 1, baseAsset.Container); var instances = baseAsset.Asset.CreatePartInstances(); var baseRootId = baseAsset.Asset.Hierarchy.RootParts.Single().Id; var derivedRootId = instances.RootParts.Single().Id; derivedAsset.Graph.AddPartToAsset(instances.Parts, instances.Parts[derivedRootId], null, 1); derivedAsset.Graph.RefreshBase(); Assert.Equal(2, derivedAsset.Asset.Hierarchy.RootParts.Count); Assert.Equal(baseRootId, derivedAsset.Asset.Hierarchy.Parts[derivedRootId].Base?.BasePartId); Assert.Equal("BaseName", derivedAsset.Asset.Hierarchy.Parts[derivedRootId].Part.Object.Value); var baseRootPartNode = (IAssetObjectNode)baseAsset.Graph.Container.NodeContainer.GetNode(baseAsset.Asset.Hierarchy.Parts[baseRootId].Part.Object); var derivedRootPartNode = (IAssetObjectNode)baseAsset.Graph.Container.NodeContainer.GetNode(derivedAsset.Asset.Hierarchy.Parts[derivedRootId].Part.Object); baseRootPartNode[nameof(Types.SomeObject.Value)].Update("NewBaseName"); Assert.Equal("NewBaseName", derivedAsset.Asset.Hierarchy.Parts[derivedRootId].Part.Object.Value); baseRootPartNode[nameof(Types.SomeObject.Value)].Update("NewBaseName2"); Assert.Equal("NewBaseName2", derivedAsset.Asset.Hierarchy.Parts[derivedRootId].Part.Object.Value); derivedRootPartNode[nameof(Types.SomeObject.Value)].Update("NewDerivedName"); Assert.True(derivedRootPartNode[nameof(Types.SomeObject.Value)].IsContentOverridden()); Assert.Equal("NewDerivedName", derivedAsset.Asset.Hierarchy.Parts[derivedRootId].Part.Object.Value); baseRootPartNode[nameof(Types.SomeObject.Value)].Update("NewBaseName3"); Assert.True(derivedRootPartNode[nameof(Types.SomeObject.Value)].IsContentOverridden()); Assert.Equal("NewDerivedName", derivedAsset.Asset.Hierarchy.Parts[derivedRootId].Part.Object.Value); }
public void TestCloneSubHierarchyInstanceWithRemoveOverrides() { var baseAsset = AssetHierarchyHelper.BuildAssetContainer(1, 2, 1, null, x => x.Parts[x.RootParts.Single().Id].Part.Name = "BaseName"); var container = baseAsset.Container.NodeContainer; var derivedAsset = AssetHierarchyHelper.BuildAssetContainer(1, 2, 1, baseAsset.Container); var instances = baseAsset.Asset.CreatePartInstances(); var derivedRootId = instances.RootParts.Single().Id; derivedAsset.Graph.AddPartToAsset(instances.Parts, instances.Parts[derivedRootId], derivedAsset.Asset.Hierarchy.RootParts.Single(), 1); derivedAsset.Graph.RefreshBase(); var partToChange = (AssetObjectNode)container.GetNode(instances.Parts.Single(x => x.Value.Part.Name == "BaseName").Value.Part); partToChange[nameof(Types.MyPart.Name)].Update("Overridden"); Debug.Write(AssetHierarchyHelper.PrintHierarchy(derivedAsset.Asset)); var originalRoot = derivedAsset.Asset.Hierarchy.RootParts.Single(); Dictionary <Guid, Guid> remapping; var clone = AssetCompositeHierarchyPropertyGraph <Types.MyPartDesign, Types.MyPart> .CloneSubHierarchies(container, derivedAsset.Asset, originalRoot.Id.Yield(), SubHierarchyCloneFlags.RemoveOverrides, out remapping); var cloneAsset = AssetHierarchyHelper.BuildAssetContainer(0, 0, 0, baseAsset.Container); var cloneRoot = clone.Parts[clone.RootParts.Single().Id]; cloneAsset.Graph.AddPartToAsset(clone.Parts, cloneRoot, null, 0); cloneAsset.Graph.RefreshBase(); Assert.Empty(remapping); Assert.Equal(4, clone.Parts.Count); Assert.Single(clone.RootParts); foreach (var rootPart in clone.RootParts) { Assert.Contains(rootPart, clone.Parts.Values.Select(x => x.Part)); } foreach (var part in clone.Parts.Values) { var matchingPart = derivedAsset.Asset.Hierarchy.Parts[part.Part.Id]; Assert.NotEqual(matchingPart, part); Assert.NotEqual(matchingPart.Part, part.Part); Assert.Equal(matchingPart.Part.Id, part.Part.Id); Assert.Equal(matchingPart.Part.Name, part.Part.Name); } Assert.Equal(originalRoot.Id, cloneRoot.Part.Id); Assert.NotEqual(originalRoot.Children[0], cloneRoot.Part.Children[0]); Assert.NotEqual(originalRoot.Children[1], cloneRoot.Part.Children[1]); Assert.Equal(originalRoot.Children[0].Id, cloneRoot.Part.Children[0].Id); Assert.Equal(originalRoot.Children[1].Id, cloneRoot.Part.Children[1].Id); Assert.NotEqual(originalRoot.Children[0].Parent, cloneRoot.Part.Children[0].Parent); Assert.NotEqual(originalRoot.Children[1].Parent, cloneRoot.Part.Children[1].Parent); Assert.Equal(cloneRoot.Part, cloneRoot.Part.Children[0].Parent); Assert.Equal(cloneRoot.Part, cloneRoot.Part.Children[1].Parent); var clonedChangedPart = (AssetObjectNode)container.GetNode(clone.Parts.Single(x => x.Value.Part.Id == (Guid)partToChange[nameof(IIdentifiable.Id)].Retrieve()).Value.Part); // Note: currently, using RemoveOverrides does not clear the base (it just clears the overrides), so we should expect to still have the base linked. // This behavior could be changed in the future Assert.False(clonedChangedPart[nameof(Types.MyPart.Name)].IsContentOverridden()); Assert.True(clonedChangedPart[nameof(Types.MyPart.Name)].IsContentInherited()); Assert.Equal("Overridden", clonedChangedPart[nameof(Types.MyPart.Name)].Retrieve()); Assert.Equal(partToChange[nameof(Types.MyPart.Name)].BaseNode, clonedChangedPart[nameof(Types.MyPart.Name)].BaseNode); }