public void TestMultiplePrefabsMixedInheritance() { PrefabAssetMerge.Debug = true; // The purpose of this test is to check that modifying a prefab base is correctly propagated through all // derived prefabs. We use the following scenario: // a1: base asset) // a2: inherit from a1 by composition with 2 instances (baseParts: a1, 2 instances) // a3: direct inheritance from a2 (base: a2) // This scenario doesn't happen in practice, as we have restricted only to inheritance by composition for prefabs // but we verify that the code is actually working for this scenario var package = new Package(); var assetItems = package.Assets; // Before Adding Package // a1: a2: (baseParts: a1, 2 instances) a3: (base: a2) // | ea | ea1 (base: ea) | ea1' (base: ea1) // | eb | eb1 (base: eb) | eb1' (base: eb1) // | ea2 (base: ea) | ea2' (base: ea2) // | eb2 (base: eb) | eb2' (base: eb2) // After adding the package to the session // We add one entity to the base a1 // a1: a2: (baseParts: a1, 2 instances) a3: (base: a2) // | ea | ea1 (base: ea) | ea1' (base: ea1) // | eb | eb1 (base: eb) | eb1' (base: eb1) // | ec | ec1 (base: ec) | ec1' (base: ec1) // | ea2 (base: ea) | ea2' (base: ea2) // | eb2 (base: eb) | eb2' (base: eb2) // | ec2 (base: ec) | ec2' (base: ec2) var a1 = new PrefabAsset(); var ea = new Entity("ea"); var eb = new Entity("eb"); a1.Hierarchy.Entities.Add(ea); a1.Hierarchy.Entities.Add(eb); a1.Hierarchy.RootEntities.Add(ea.Id); a1.Hierarchy.RootEntities.Add(eb.Id); assetItems.Add(new AssetItem("a1", a1)); var a2 = new PrefabAsset(); var aPartInstance1 = a1.CreatePrefabInstance(a2, "a1"); var aPartInstance2 = a1.CreatePrefabInstance(a2, "a1"); a2.Hierarchy.Entities.AddRange(aPartInstance1.Entities); a2.Hierarchy.Entities.AddRange(aPartInstance2.Entities); a2.Hierarchy.RootEntities.AddRange(aPartInstance1.RootEntities); a2.Hierarchy.RootEntities.AddRange(aPartInstance2.RootEntities); assetItems.Add(new AssetItem("a2", a2)); // Modify a1 to add entity ec var ec = new Entity("ec"); a1.Hierarchy.Entities.Add(ec); a1.Hierarchy.RootEntities.Add(ec.Id); var a3 = (PrefabAsset)a2.CreateChildAsset("a2"); assetItems.Add(new AssetItem("a3", a3)); // Create a session with this project using (var session = new PackageSession()) { var logger = new LoggerResult(); session.AddExistingPackage(package, logger); Assert.False(logger.HasErrors); Assert.AreEqual(6, a2.Hierarchy.RootEntities.Count); Assert.True(a2.Hierarchy.Entities.All(it => it.Design.BaseId.HasValue && it.Design.BasePartInstanceId.HasValue)); Assert.AreEqual(6, a3.Hierarchy.RootEntities.Count); Assert.True(a3.Hierarchy.Entities.All(it => !it.Design.BasePartInstanceId.HasValue)); Assert.True(a3.Hierarchy.Entities.All(it => it.Design.BaseId.HasValue && a2.Hierarchy.Entities.ContainsKey(it.Design.BaseId.Value))); } }
public void TestCascadedInheritance() { // Test with: // a1: an asset with 2 entities // a2: an asset using a1 by composition with 2 instances // a3: an asset based on a2 // // Add one entity to a1. Check that a2 and a3 will get correctly the entities replicated // Before Merge // a1: a2: (baseParts: a1, 2 instances) a3: (base: a2) // | ea | ea1 (base: ea) | ea1' (base: ea1) // | eb | eb1 (base: eb) | eb1' (base: eb1) // | ea2 (base: ea) | ea2' (base: ea2) // | eb2 (base: eb) | eb2' (base: eb2) // After Merge // We add one entity to the base a1 // a1: a2: (baseParts: a1, 2 instances) a3: (base: a2) // | ea | ea1 (base: ea) | ea1' (base: ea1) // | eb | eb1 (base: eb) | eb1' (base: eb1) // | ec | ec1 (base: ec) | ec1' (base: ec1) // | ea2 (base: ea) | ea2' (base: ea2) // | eb2 (base: eb) | eb2' (base: eb2) // | ec2 (base: ec) | ec2' (base: ec2) var a1 = new PrefabAsset(); var ea = new Entity("ea"); var eb = new Entity("eb"); a1.Hierarchy.Entities.Add(ea); a1.Hierarchy.Entities.Add(eb); a1.Hierarchy.RootEntities.Add(ea.Id); a1.Hierarchy.RootEntities.Add(eb.Id); var a2 = new PrefabAsset(); var aPartInstance1 = a1.CreatePrefabInstance(a2, "a1"); var aPartInstance2 = a1.CreatePrefabInstance(a2, "a1"); a2.Hierarchy.Entities.AddRange(aPartInstance1.Entities); a2.Hierarchy.Entities.AddRange(aPartInstance2.Entities); a2.Hierarchy.RootEntities.AddRange(aPartInstance1.RootEntities); a2.Hierarchy.RootEntities.AddRange(aPartInstance2.RootEntities); // Modify a1 to add entity ec var ec = new Entity("ec"); a1.Hierarchy.Entities.Add(ec); a1.Hierarchy.RootEntities.Add(ec.Id); var a3 = (PrefabAsset)a2.CreateChildAsset("a2"); // Merge a2 var result2 = a2.Merge(null, null, new List<AssetBase>() { new AssetBase("a1", (Asset)AssetCloner.Clone(a1)) }); Assert.False(result2.HasErrors); Assert.AreEqual(6, a2.Hierarchy.RootEntities.Count); Assert.True(a2.Hierarchy.Entities.All(it => it.Design.BaseId.HasValue && it.Design.BasePartInstanceId.HasValue)); // Merge a3 var result3 = a3.Merge((Asset)AssetCloner.Clone(a3.Base.Asset), (Asset)AssetCloner.Clone(a2), null); Assert.False(result3.HasErrors); Assert.AreEqual(6, a3.Hierarchy.RootEntities.Count); Assert.True(a3.Hierarchy.Entities.All(it => !it.Design.BasePartInstanceId.HasValue)); Assert.True(a3.Hierarchy.Entities.All(it => it.Design.BaseId.HasValue && a2.Hierarchy.Entities.ContainsKey(it.Design.BaseId.Value))); }