public void TestCloneSubHierarchyWithInternalReference() { var graph = AssetHierarchyHelper.BuildAssetAndGraph(2, 2, 2, x => x.Parts[GuidGenerator.Get(5)].Part.MyReference = x.Parts[GuidGenerator.Get(6)].Part); Debug.Write(AssetHierarchyHelper.PrintHierarchy(graph.Asset)); var originalRoot = graph.Asset.Hierarchy.Parts[graph.Asset.Hierarchy.RootParts[1].Id]; Dictionary <Guid, Guid> remapping; var clone = AssetCompositeHierarchyPropertyGraph <Types.MyPartDesign, Types.MyPart> .CloneSubHierarchies(graph.Container.NodeContainer, graph.Asset, originalRoot.Part.Id.Yield(), SubHierarchyCloneFlags.None, out remapping); var cloneRoot = clone.Parts[clone.RootParts.Single().Id]; Assert.Empty(remapping); Assert.Equal(3, 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 = graph.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.Part.Id, cloneRoot.Part.Id); Assert.NotEqual(originalRoot.Part.Children[0], cloneRoot.Part.Children[0]); Assert.NotEqual(originalRoot.Part.Children[1], cloneRoot.Part.Children[1]); Assert.Equal(originalRoot.Part.Children[0].Id, cloneRoot.Part.Children[0].Id); Assert.Equal(originalRoot.Part.Children[1].Id, cloneRoot.Part.Children[1].Id); Assert.NotEqual(originalRoot.Part.Children[0].Parent, cloneRoot.Part.Children[0].Parent); Assert.NotEqual(originalRoot.Part.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); Assert.Equal(cloneRoot.Part.Children[1], cloneRoot.Part.Children[0].MyReference); }