示例#1
0
        public void TestCollectionItemIdentifierWithDuplicates()
        {
            var container = new AssetPropertyGraphContainer(new AssetNodeContainer {
                NodeBuilder = { NodeFactory = new AssetNodeFactory() }
            });
            var asset = new Types.MyAsset2 {
                MyStrings = { "aaa", "bbb", "ccc" }
            };
            var ids = CollectionItemIdHelper.GetCollectionItemIds(asset.MyStrings);

            ids.Add(0, IdentifierGenerator.Get(100));
            ids.Add(1, IdentifierGenerator.Get(200));
            ids.Add(2, IdentifierGenerator.Get(100));
            var assetItem = new AssetItem("MyAsset", asset);

            Assert.Equal(IdentifierGenerator.Get(100), ids[0]);
            Assert.Equal(IdentifierGenerator.Get(200), ids[1]);
            Assert.Equal(IdentifierGenerator.Get(100), ids[2]);
            var graph = AssetQuantumRegistry.ConstructPropertyGraph(container, assetItem, null);

            Assert.IsAssignableFrom <AssetObjectNode>(graph.RootNode);
            Assert.True(CollectionItemIdHelper.TryGetCollectionItemIds(asset.MyStrings, out ids));
            Assert.Equal(3, ids.KeyCount);
            Assert.Equal(0, ids.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(100), ids[0]);
            Assert.Equal(IdentifierGenerator.Get(200), ids[1]);
            Assert.NotEqual(IdentifierGenerator.Get(100), ids[2]);
            Assert.NotEqual(IdentifierGenerator.Get(200), ids[2]);
        }
示例#2
0
        /// <inheritdoc/>
        protected override void TransformAfterDeserialization(IDictionary container, ITypeDescriptor targetDescriptor, object targetCollection, ICollection <ItemId> deletedItems = null)
        {
            var collectionDescriptor = (CollectionDescriptor)targetDescriptor;
            var type = typeof(CollectionWithItemIds <>).MakeGenericType(collectionDescriptor.ElementType);

            if (!type.IsInstanceOfType(container))
            {
                throw new InvalidOperationException("The given container does not match the expected type.");
            }
            var identifier = CollectionItemIdHelper.GetCollectionItemIds(targetCollection);

            identifier.Clear();
            var i          = 0;
            var enumerator = container.GetEnumerator();

            while (enumerator.MoveNext())
            {
                collectionDescriptor.Add(targetCollection, enumerator.Value);
                identifier.Add(i, (ItemId)enumerator.Key);
                ++i;
            }
            if (deletedItems != null)
            {
                foreach (var deletedItem in deletedItems)
                {
                    identifier.MarkAsDeleted(deletedItem);
                }
            }
        }
示例#3
0
        private bool ShouldGenerateItemIdCollection(object collection)
        {
            // Do not generate for value types (collections that are struct) or null
            if (collection?.GetType().IsValueType != false)
            {
                return(false);
            }

            // Do not generate if within a type that doesn't use identifiable collections
            if (inNonIdentifiableType > 0)
            {
                return(false);
            }

            // Do not generate if item id collection already exists
            if (CollectionItemIdHelper.HasCollectionItemIds(collection))
            {
                return(false);
            }

            // Do not generate if the collection has been flagged to not be identifiable
            if (nonIdentifiableCollection?.Contains(collection) == true)
            {
                return(false);
            }

            return(true);
        }
        private static void ClearNode(IUndoRedoService actionService, AssetViewModel asset, ItemToReload itemToReload)
        {
            // Get the node we want to change
            var index    = itemToReload.GraphPathIndex;
            var node     = itemToReload.GraphPath.GetNode();
            var oldValue = node.Retrieve(index);

            // Apply the change
            // TODO: Share this code with ContentValueChangeOperation?
            // TODO: How to better detect CollectionAdd vs ValueChange?
            ContentChangeType operationType;

            if (index != NodeIndex.Empty)
            {
                if (CollectionItemIdHelper.TryGetCollectionItemIds(node.Retrieve(), out CollectionItemIdentifiers ids))
                {
                    itemToReload.ItemId = ids[index.Value];
                }
                operationType = ContentChangeType.CollectionRemove;
                ((IObjectNode)node).Remove(oldValue, index);
            }
            else
            {
                operationType = ContentChangeType.ValueChange;
                ((IMemberNode)node).Update(null);
            }

            // Save the change on the stack
            var operation = new ContentValueChangeOperation(node, operationType, index, oldValue, null, Enumerable.Empty <IDirtiable>());

            actionService.PushOperation(operation);
            string operationName = $"Unload object {oldValue.GetType().Name} in asset {asset.Url}";

            actionService.SetName(operation, operationName);
        }
示例#5
0
        public override ObjectReference FindTargetReference(IGraphNode sourceNode, IGraphNode targetNode, ObjectReference sourceReference)
        {
            // Not identifiable - default applies
            if (sourceReference.Index.IsEmpty || sourceReference.ObjectValue == null)
            {
                return(base.FindTargetReference(sourceNode, targetNode, sourceReference));
            }

            // Special case for objects that are identifiable: the object must be linked to the base only if it has the same id
            var sourceAssetNode = (AssetObjectNode)sourceNode;
            var targetAssetNode = (AssetObjectNode)targetNode;

            if (!CollectionItemIdHelper.HasCollectionItemIds(sourceAssetNode.Retrieve()))
            {
                return(null);
            }

            // Enumerable reference: we look for an object with the same id
            var targetReference = targetAssetNode.ItemReferences;
            var sourceIds       = CollectionItemIdHelper.GetCollectionItemIds(sourceNode.Retrieve());
            var targetIds       = CollectionItemIdHelper.GetCollectionItemIds(targetNode.Retrieve());
            var itemId          = sourceIds[sourceReference.Index.Value];
            var targetKey       = targetIds.GetKey(itemId);

            foreach (var targetRef in targetReference)
            {
                if (Equals(targetRef.Index.Value, targetKey))
                {
                    return(targetRef);
                }
            }

            return(null);
        }
        private void AssetContentChanging(object sender, MemberNodeChangeEventArgs e)
        {
            var overrideValue = OverrideType.Base;
            var node          = (AssetMemberNode)e.Member;

            // For value change and remove, we store the current override state.
            if (e.ChangeType == ContentChangeType.ValueChange)
            {
                overrideValue = node.GetContentOverride();
            }
            else if (!node.IsNonIdentifiableCollectionContent)
            {
                overrideValue = node.GetItemOverride(e.Index);
                if (e.ChangeType == ContentChangeType.CollectionRemove)
                {
                    // For remove, we also collect the id of the item that will be removed, so we can pass it to the Changed event.
                    var itemId = ItemId.Empty;
                    CollectionItemIdentifiers ids;
                    if (CollectionItemIdHelper.TryGetCollectionItemIds(e.Member.Retrieve(), out ids))
                    {
                        ids.TryGet(e.Index.Value, out itemId);
                    }
                    removedItemIds[e.Member] = itemId;
                }
            }
            previousOverrides[e.Member] = overrideValue;
        }
示例#7
0
        private void AssetContentChanging(object sender, ContentChangeEventArgs e)
        {
            var overrideValue = OverrideType.Base;
            var node          = (AssetNode)e.Content.OwnerNode;

            if (e.ChangeType == ContentChangeType.ValueChange || e.ChangeType == ContentChangeType.CollectionRemove)
            {
                // For value change and remove, we store the current override state.
                if (e.Index == Index.Empty)
                {
                    overrideValue = node.GetContentOverride();
                }
                else if (!node.IsNonIdentifiableCollectionContent)
                {
                    overrideValue = node.GetItemOverride(e.Index);
                }
            }
            if (e.ChangeType == ContentChangeType.CollectionRemove)
            {
                // For remove, we also collect the id of the item that will be removed, so we can pass it to the Changed event.
                var itemId = ItemId.Empty;
                CollectionItemIdentifiers ids;
                if (CollectionItemIdHelper.TryGetCollectionItemIds(e.Content.Retrieve(), out ids))
                {
                    ids.TryGet(e.Index.Value, out itemId);
                }
                removedItemIds[e.Content.OwnerNode] = itemId;
            }
            if (e.ChangeType == ContentChangeType.CollectionAdd && !node.IsNonIdentifiableCollectionContent)
            {
                // If the change is an add, we set the previous override as New so the Undo will try to remove the item instead of resetting to the base value
                previousOverrides[e.Content.OwnerNode] = OverrideType.New;
            }
            previousOverrides[e.Content.OwnerNode] = overrideValue;
        }
示例#8
0
        private void OnObjectDeserialized(int i, object newObject)
        {
            if (objectReferences != null && newObject != null)
            {
                var previousObject = objectReferences[i];

                //// If the object is an attached reference, there is no need to copy the shadow object
                //if (AttachedReferenceManager.GetAttachedReference(previousObject) != null)
                //{
                //    return;
                //}

                ShadowObject.Copy(previousObject, newObject);

                // NOTE: we don't use Add because of strings that might be duplicated
                clonedObjectMapping[previousObject] = newObject;

                if ((flags & AssetClonerFlags.RemoveItemIds) != AssetClonerFlags.RemoveItemIds)
                {
                    CollectionItemIdentifiers sourceIds;
                    if (CollectionItemIdHelper.TryGetCollectionItemIds(previousObject, out sourceIds))
                    {
                        var newIds = CollectionItemIdHelper.GetCollectionItemIds(newObject);
                        sourceIds.CloneInto(newIds, clonedObjectMapping);
                    }
                }
            }
        }
示例#9
0
        public void TestCloneCollectionIds()
        {
            var obj = new TestObjectWithCollection {
                Name = "Test", Items = { "aaa", "bbb" }
            };
            var ids = CollectionItemIdHelper.GetCollectionItemIds(obj.Items);

            ids.Add(0, new ItemId());
            ids.Add(1, new ItemId());
            ids.MarkAsDeleted(new ItemId());
            var clone = AssetCloner.Clone(obj);
            CollectionItemIdentifiers cloneIds;
            var idsExist = CollectionItemIdHelper.TryGetCollectionItemIds(clone.Items, out cloneIds);

            Assert.True(idsExist);
            Assert.AreEqual(ids.KeyCount, cloneIds.KeyCount);
            Assert.AreEqual(ids.DeletedCount, cloneIds.DeletedCount);
            Assert.AreEqual(ids[0], cloneIds[0]);
            Assert.AreEqual(ids[1], cloneIds[1]);
            Assert.AreEqual(ids.DeletedItems.Single(), cloneIds.DeletedItems.Single());

            clone    = AssetCloner.Clone(obj, AssetClonerFlags.RemoveItemIds);
            idsExist = CollectionItemIdHelper.TryGetCollectionItemIds(clone.Items, out cloneIds);
            Assert.False(idsExist);
        }
示例#10
0
        /// <inheritdoc/>
        protected override object TransformForSerialization(ITypeDescriptor descriptor, object collection)
        {
            var instance = CreatEmptyContainer(descriptor);
            CollectionItemIdentifiers identifier;

            if (!CollectionItemIdHelper.TryGetCollectionItemIds(collection, out identifier))
            {
                identifier = new CollectionItemIdentifiers();
            }
            var i = 0;

            foreach (var item in (IEnumerable)collection)
            {
                ItemId id;
                if (!identifier.TryGet(i, out id))
                {
                    id = ItemId.New();
                    identifier.Add(i, id);
                }
                instance.Add(id, item);
                ++i;
            }

            return(instance);
        }
示例#11
0
        public void TestAddBaseRemoveDerivedAndAddInBaseWithSubDerived()
        {
            var asset = new Types.MyAsset2 {
                MyStrings = { "String1", "String2" }
            };
            var context = DeriveAssetTest <Types.MyAsset2, Types.MyAssetBasePropertyGraph> .DeriveAsset(asset);

            var baseIds                = CollectionItemIdHelper.GetCollectionItemIds(context.BaseAsset.MyStrings);
            var derivedIds             = CollectionItemIdHelper.GetCollectionItemIds(context.DerivedAsset.MyStrings);
            var subDerivedIds          = CollectionItemIdHelper.GetCollectionItemIds(context.SubDerivedAsset.MyStrings);
            var basePropertyNode       = context.BaseGraph.RootNode[nameof(Types.MyAsset2.MyStrings)];
            var derivedPropertyNode    = context.DerivedGraph.RootNode[nameof(Types.MyAsset2.MyStrings)];
            var subDerivedPropertyNode = context.SubDerivedGraph.RootNode[nameof(Types.MyAsset2.MyStrings)];

            // Delete an item from the derived and then update the same from the base
            basePropertyNode.Target.Add("String3");
            var derivedDeletedId = derivedIds[2];

            derivedPropertyNode.Target.Remove("String3", new NodeIndex(2));
            basePropertyNode.Target.Add("String4");
            Assert.Equal(4, context.BaseAsset.MyStrings.Count);
            Assert.Equal(3, context.DerivedAsset.MyStrings.Count);
            Assert.Equal(3, context.SubDerivedAsset.MyStrings.Count);
            Assert.Equal("String1", basePropertyNode.Retrieve(new NodeIndex(0)));
            Assert.Equal("String2", basePropertyNode.Retrieve(new NodeIndex(1)));
            Assert.Equal("String3", basePropertyNode.Retrieve(new NodeIndex(2)));
            Assert.Equal("String4", basePropertyNode.Retrieve(new NodeIndex(3)));
            Assert.Equal("String1", derivedPropertyNode.Retrieve(new NodeIndex(0)));
            Assert.Equal("String2", derivedPropertyNode.Retrieve(new NodeIndex(1)));
            Assert.Equal("String4", derivedPropertyNode.Retrieve(new NodeIndex(2)));
            Assert.Equal("String1", subDerivedPropertyNode.Retrieve(new NodeIndex(0)));
            Assert.Equal("String2", subDerivedPropertyNode.Retrieve(new NodeIndex(1)));
            Assert.Equal("String4", subDerivedPropertyNode.Retrieve(new NodeIndex(2)));
            Assert.Equal(OverrideType.Base, basePropertyNode.GetContentOverride());
            Assert.Equal(OverrideType.Base, basePropertyNode.Target.GetItemOverride(new NodeIndex(0)));
            Assert.Equal(OverrideType.Base, basePropertyNode.Target.GetItemOverride(new NodeIndex(1)));
            Assert.Equal(OverrideType.Base, basePropertyNode.Target.GetItemOverride(new NodeIndex(2)));
            Assert.Equal(OverrideType.Base, basePropertyNode.Target.GetItemOverride(new NodeIndex(3)));
            Assert.Equal(OverrideType.Base, derivedPropertyNode.GetContentOverride());
            Assert.Equal(OverrideType.Base, derivedPropertyNode.Target.GetItemOverride(new NodeIndex(0)));
            Assert.Equal(OverrideType.Base, derivedPropertyNode.Target.GetItemOverride(new NodeIndex(1)));
            Assert.Equal(OverrideType.Base, derivedPropertyNode.Target.GetItemOverride(new NodeIndex(2)));
            Assert.Equal(OverrideType.Base, subDerivedPropertyNode.GetContentOverride());
            Assert.Equal(OverrideType.Base, subDerivedPropertyNode.Target.GetItemOverride(new NodeIndex(0)));
            Assert.Equal(OverrideType.Base, subDerivedPropertyNode.Target.GetItemOverride(new NodeIndex(1)));
            Assert.Equal(OverrideType.Base, subDerivedPropertyNode.Target.GetItemOverride(new NodeIndex(2)));
            Assert.Equal(4, baseIds.KeyCount);
            Assert.Equal(0, baseIds.DeletedCount);
            Assert.Equal(3, derivedIds.KeyCount);
            Assert.Equal(1, derivedIds.DeletedCount);
            Assert.Equal(3, subDerivedIds.KeyCount);
            Assert.Equal(0, subDerivedIds.DeletedCount);
            Assert.Equal(baseIds[0], derivedIds[0]);
            Assert.Equal(baseIds[1], derivedIds[1]);
            Assert.Equal(baseIds[3], derivedIds[2]);
            Assert.Equal(derivedIds[0], subDerivedIds[0]);
            Assert.Equal(derivedIds[1], subDerivedIds[1]);
            Assert.Equal(derivedIds[2], subDerivedIds[2]);
            Assert.True(derivedIds.IsDeleted(derivedDeletedId));
        }
        /// <inheritdoc/>
        protected override object TransformForSerialization(ITypeDescriptor descriptor, object collection)
        {
            var dictionaryDescriptor = (DictionaryDescriptor)descriptor;
            var instance             = CreatEmptyContainer(descriptor);

            CollectionItemIdentifiers identifier;

            if (!CollectionItemIdHelper.TryGetCollectionItemIds(collection, out identifier))
            {
                identifier = new CollectionItemIdentifiers();
            }
            var keyWithIdType = typeof(KeyWithId <>).MakeGenericType(dictionaryDescriptor.KeyType);

            foreach (var item in dictionaryDescriptor.GetEnumerator(collection))
            {
                ItemId id;
                if (!identifier.TryGet(item.Key, out id))
                {
                    id = ItemId.New();
                    identifier.Add(item.Key, id);
                }
                var keyWithId = Activator.CreateInstance(keyWithIdType, id, item.Key);
                instance.Add(keyWithId, item.Value);
            }

            return(instance);
        }
示例#13
0
        public void TestDictionaryDeserialization()
        {
            ShadowObject.Enable = true;
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.Write(YamlDictionary);
            writer.Flush();
            stream.Position = 0;
            var instance = AssetYamlSerializer.Default.Deserialize(stream);

            Assert.NotNull(instance);
            Assert.Equal(typeof(ContainerDictionary), instance.GetType());
            var obj = (ContainerDictionary)instance;

            Assert.Equal("Root", obj.Name);
            Assert.Equal(2, obj.Strings.Count);
            Assert.Equal("aaa", obj.Strings[GuidGenerator.Get(200)]);
            Assert.Equal("bbb", obj.Strings[GuidGenerator.Get(100)]);
            Assert.Equal(2, obj.Objects.Count);
            Assert.Equal("obj1", obj.Objects["key3"].Name);
            Assert.Equal("obj2", obj.Objects["key4"].Name);
            var stringIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Strings);

            Assert.Equal(IdentifierGenerator.Get(2), stringIds[GuidGenerator.Get(200)]);
            Assert.Equal(IdentifierGenerator.Get(1), stringIds[GuidGenerator.Get(100)]);
            var objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Objects);

            Assert.Equal(IdentifierGenerator.Get(3), objectIds["key3"]);
            Assert.Equal(IdentifierGenerator.Get(4), objectIds["key4"]);
        }
示例#14
0
        public void TestDictionarySerializationWithDeleted()
        {
            ShadowObject.Enable = true;
            var obj = new ContainerDictionary("Root")
            {
                Strings = { { GuidGenerator.Get(200), "aaa" }, { GuidGenerator.Get(100), "bbb" } },
                Objects = { { "key3", new ContainerCollection("obj1") }, { "key4", new ContainerCollection("obj2") } },
            };

            var stringIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Strings);

            stringIds[GuidGenerator.Get(200)] = IdentifierGenerator.Get(8);
            stringIds[GuidGenerator.Get(100)] = IdentifierGenerator.Get(5);
            stringIds.MarkAsDeleted(IdentifierGenerator.Get(3));
            stringIds.MarkAsDeleted(IdentifierGenerator.Get(1));
            var objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Objects);

            objectIds["key3"] = IdentifierGenerator.Get(3);
            objectIds["key4"] = IdentifierGenerator.Get(4);
            objectIds.MarkAsDeleted(IdentifierGenerator.Get(1));
            objectIds.MarkAsDeleted(IdentifierGenerator.Get(6));
            var yaml = SerializeAsString(obj);

            Assert.Equal(YamlDictionaryWithDeleted, yaml);
        }
示例#15
0
        protected override void UpdateAssetFromSource(ModelAsset assetToMerge)
        {
            // Create a dictionary containing all new and old materials, favoring old ones to maintain existing references
            var dictionary = assetToMerge.Materials.ToDictionary(x => x.Name, x => x);

            Asset.Materials.ForEach(x => dictionary[x.Name] = x);

            // Create a dictionary mapping existing materials to their item id, to attempt to maintain existing ids and avoid unnecessary changes.
            var ids = CollectionItemIdHelper.GetCollectionItemIds(Asset.Materials).ToDictionary(x => Asset.Materials[(int)x.Key].Name, x => x.Value);

            // Remove currently existing materials, one by one because Quantum does not provide a Clear method.
            var materialsNode = AssetRootNode[nameof(ModelAsset.Materials)].Target;

            while (Asset.Materials.Count > 0)
            {
                materialsNode.Remove(Asset.Materials[0], new NodeIndex(0));
            }

            // Repopulate the list of materials
            for (var i = 0; i < assetToMerge.Materials.Count; ++i)
            {
                // Retrieve or create an id for the material
                ItemId id;
                if (!ids.TryGetValue(assetToMerge.Materials[i].Name, out id))
                {
                    id = ItemId.New();
                }

                // Use Restore to allow to set manually the id.
                materialsNode.Restore(dictionary[assetToMerge.Materials[i].Name], new NodeIndex(i), id);
            }
        }
示例#16
0
        public void TestCollectionSerializationWithDeleted()
        {
            ShadowObject.Enable = true;
            var obj = new ContainerCollection("Root")
            {
                Strings = { "aaa", "bbb" },
                Objects = { new ContainerCollection("obj1"), new ContainerCollection("obj2") }
            };

            var stringIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Strings);

            stringIds[0] = IdentifierGenerator.Get(8);
            stringIds[1] = IdentifierGenerator.Get(5);
            stringIds.MarkAsDeleted(IdentifierGenerator.Get(3));
            stringIds.MarkAsDeleted(IdentifierGenerator.Get(1));
            var objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Objects);

            objectIds[0] = IdentifierGenerator.Get(3);
            objectIds[1] = IdentifierGenerator.Get(4);
            objectIds.MarkAsDeleted(IdentifierGenerator.Get(1));
            objectIds.MarkAsDeleted(IdentifierGenerator.Get(6));
            var yaml = SerializeAsString(obj);

            Assert.Equal(YamlCollectionWithDeleted, yaml);
        }
示例#17
0
        public void TestSimpleSerialization()
        {
            var asset = new MyAsset {
                Strings = { "aa", "bb" }
            };
            var asset1Ids = CollectionItemIdHelper.GetCollectionItemIds(asset.Strings);

            asset1Ids.Add(0, new ItemId(MakeArray(1)));
            asset1Ids.Add(1, new ItemId(MakeArray(2)));
            var serializer = new YamlAssetSerializer();
            var stream     = new MemoryStream();

            serializer.Save(stream, asset);
            stream.Position = 0;
            var sr   = new StreamReader(stream);
            var yaml = sr.ReadToEnd();

            stream.Position = 0;
            bool aliasOccurred;
            Dictionary <YamlAssetPath, OverrideType> overrides;
            var loadedAsset = (MyAsset)serializer.Load(stream, null, null, out aliasOccurred, out overrides);
            var asset2Ids   = CollectionItemIdHelper.GetCollectionItemIds(loadedAsset.Strings);

            Assert.AreEqual(2, asset2Ids.Count);
            Assert.AreEqual(asset1Ids[0], asset2Ids[0]);
            Assert.AreEqual(asset1Ids[1], asset2Ids[1]);
        }
        /// <inheritdoc />
        public override bool ProcessDeserializedData(AssetPropertyGraphContainer graphContainer, object targetRootObject, Type targetMemberType, ref object data, bool isRootDataObjectReference, AssetId?sourceId, YamlAssetMetadata <OverrideType> overrides, YamlAssetPath basePath)
        {
            if (targetRootObject == null)
            {
                throw new ArgumentNullException(nameof(targetRootObject));
            }
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            var collectionDescriptor = (CollectionDescriptor)TypeDescriptorFactory.Default.Find(targetRootObject.GetType());

            var collection = data as IList <AssetItem>;

            if (collection == null)
            {
                collection = (IList <AssetItem>)Activator.CreateInstance(collectionDescriptor.Type, true);
                collectionDescriptor.Add(collection, data);
            }

            for (var i = 0; i < collection.Count; i++)
            {
                var assetItem = collection[i];
                // If the asset already exists, clone it with new identifiers
                if (session.GetAssetById(assetItem.Id) != null)
                {
                    // Create a derived asset and restore archetype to handle asset-specific cloning process.
                    Dictionary <Guid, Guid> idRemapping;
                    var clone = AssetCloner.Clone(assetItem.Asset, AssetClonerFlags.GenerateNewIdsForIdentifiableObjects, out idRemapping);

                    var assetType = assetItem.Asset.GetType();
                    if (assetType.HasInterface(typeof(AssetCompositeHierarchy <,>)))
                    {
                        try
                        {
                            // TODO: Find a way to fallback to the asset or generalize for all asset composite
                            dynamic assetComposite = clone;
                            // Remap indices of parts in Hierarchy.Part
                            var path = basePath.Clone();
                            path.PushItemId(CollectionItemIdHelper.GetCollectionItemIds(collection)[i]);
                            AssetCloningHelper.RemapIdentifiablePaths(overrides, idRemapping, path);
                            AssetPartsAnalysis.GenerateNewBaseInstanceIds(assetComposite.Hierarchy);
                        }
                        catch (RuntimeBinderException e)
                        {
                            e.Ignore();
                        }
                    }
                    // FIXME: rework this
                    var postProcessor = session.ServiceProvider.Get <ICopyPasteService>().PostProcessors.FirstOrDefault(p => p.Accept(assetType));
                    postProcessor?.PostPasteDeserialization(clone);
                    collection[i] = new AssetItem(assetItem.Location, clone);
                }
            }

            // Get the fixed-up value
            data = collection;
            return(true);
        }
示例#19
0
        protected override ObjectReference FindTargetReference(IGraphNode sourceNode, IGraphNode targetNode, ObjectReference sourceReference)
        {
            if (sourceReference.Index.IsEmpty)
            {
                return(targetNode.Content.Reference as ObjectReference);
            }

            // Special case for objects that are identifiable: the object must be linked to the base only if it has the same id
            if (sourceReference.ObjectValue != null)
            {
                if (sourceReference.Index.IsEmpty)
                {
                    return(targetNode.Content.Reference.AsObject);
                }

                var sourceAssetNode = (AssetNode)sourceNode;
                if (sourceAssetNode.IsNonIdentifiableCollectionContent)
                {
                    return(null);
                }

                // Enumerable reference: we look for an object with the same id
                var targetReference = targetNode.Content.Reference.AsEnumerable;
                var sourceIds       = CollectionItemIdHelper.GetCollectionItemIds(sourceNode.Content.Retrieve());
                var targetIds       = CollectionItemIdHelper.GetCollectionItemIds(targetNode.Content.Retrieve());
                var itemId          = sourceIds[sourceReference.Index.Value];
                var targetKey       = targetIds.GetKey(itemId);
                return(targetReference.FirstOrDefault(x => Equals(x.Index.Value, targetKey)));
            }

            // Not identifiable - default applies
            return(base.FindTargetReference(sourceNode, targetNode, sourceReference));
        }
        public void TestCollectionRemovedItemFromBase()
        {
            const string baseYaml    = @"!SiliconStudio.Assets.Quantum.Tests.Types+MyAsset2,SiliconStudio.Assets.Quantum.Tests
Id: 10000000-0000-0000-0000-000000000000
Tags: []
Struct:
    MyStrings: {}
MyStrings:
    0a0000000a0000000a0000000a000000: String1
    14000000140000001400000014000000: String3
";
            const string derivedYaml = @"!SiliconStudio.Assets.Quantum.Tests.Types+MyAsset2,SiliconStudio.Assets.Quantum.Tests
Id: 20000000-0000-0000-0000-000000000000
Archetype: 10000000-0000-0000-0000-000000000000:MyAsset
Tags: []
Struct:
    MyStrings: {}
MyStrings:
    0a0000000a0000000a0000000a000000: String1
    24000000240000002400000024000000: String2
    14000000140000001400000014000000: String3
";
            var          context     = DeriveAssetTest <Types.MyAsset2> .LoadFromYaml(baseYaml, derivedYaml);

            var baseIds    = CollectionItemIdHelper.GetCollectionItemIds(context.BaseAsset.MyStrings);
            var derivedIds = CollectionItemIdHelper.GetCollectionItemIds(context.DerivedAsset.MyStrings);

            Assert.AreEqual(2, context.BaseAsset.MyStrings.Count);
            Assert.AreEqual("String1", context.BaseAsset.MyStrings[0]);
            Assert.AreEqual("String3", context.BaseAsset.MyStrings[1]);
            Assert.AreEqual(3, context.DerivedAsset.MyStrings.Count);
            Assert.AreEqual("String1", context.DerivedAsset.MyStrings[0]);
            Assert.AreEqual("String2", context.DerivedAsset.MyStrings[1]);
            Assert.AreEqual("String3", context.DerivedAsset.MyStrings[2]);
            Assert.AreEqual(2, baseIds.KeyCount);
            Assert.AreEqual(0, baseIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), baseIds[0]);
            Assert.AreEqual(IdentifierGenerator.Get(20), baseIds[1]);
            Assert.AreEqual(3, derivedIds.KeyCount);
            Assert.AreEqual(0, derivedIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), derivedIds[0]);
            Assert.AreEqual(IdentifierGenerator.Get(36), derivedIds[1]);
            Assert.AreEqual(IdentifierGenerator.Get(20), derivedIds[2]);
            context.DerivedGraph.ReconcileWithBase();
            Assert.AreEqual(2, context.BaseAsset.MyStrings.Count);
            Assert.AreEqual("String1", context.BaseAsset.MyStrings[0]);
            Assert.AreEqual("String3", context.BaseAsset.MyStrings[1]);
            Assert.AreEqual(2, context.DerivedAsset.MyStrings.Count);
            Assert.AreEqual("String1", context.DerivedAsset.MyStrings[0]);
            Assert.AreEqual("String3", context.DerivedAsset.MyStrings[1]);
            Assert.AreEqual(2, baseIds.KeyCount);
            Assert.AreEqual(0, baseIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), baseIds[0]);
            Assert.AreEqual(IdentifierGenerator.Get(20), baseIds[1]);
            Assert.AreEqual(2, derivedIds.KeyCount);
            Assert.AreEqual(0, derivedIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), derivedIds[0]);
            Assert.AreEqual(IdentifierGenerator.Get(20), derivedIds[1]);
        }
示例#21
0
        public void TestSimpleCollectionAddMultipleAndCheckOrder()
        {
            var asset = new Types.MyAsset2 {
                MyStrings = { "String1", "String2", "String3", "String4" }
            };
            var context = DeriveAssetTest <Types.MyAsset2> .DeriveAsset(asset);

            var baseIds             = CollectionItemIdHelper.GetCollectionItemIds(context.BaseAsset.MyStrings);
            var derivedIds          = CollectionItemIdHelper.GetCollectionItemIds(context.DerivedAsset.MyStrings);
            var basePropertyNode    = (AssetNode)((IGraphNode)context.BaseGraph.RootNode).TryGetChild(nameof(Types.MyAsset2.MyStrings));
            var derivedPropertyNode = (AssetNode)((IGraphNode)context.DerivedGraph.RootNode).TryGetChild(nameof(Types.MyAsset2.MyStrings));

            derivedPropertyNode.Content.Add("String3.5", new Index(3));
            derivedPropertyNode.Content.Add("String1.5", new Index(1));
            Assert.AreEqual(6, context.DerivedAsset.MyStrings.Count);
            AssertCollection(derivedPropertyNode.Content, "String1", "String1.5", "String2", "String3", "String3.5", "String4");

            basePropertyNode.Content.Add("String0.1", new Index(0));
            Assert.AreEqual(5, context.BaseAsset.MyStrings.Count);
            AssertCollection(basePropertyNode.Content, "String0.1", "String1", "String2", "String3", "String4");
            Assert.AreEqual(7, context.DerivedAsset.MyStrings.Count);
            AssertCollection(derivedPropertyNode.Content, "String0.1", "String1", "String1.5", "String2", "String3", "String3.5", "String4");

            basePropertyNode.Content.Add("String1.1", new Index(2));
            Assert.AreEqual(6, context.BaseAsset.MyStrings.Count);
            AssertCollection(basePropertyNode.Content, "String0.1", "String1", "String1.1", "String2", "String3", "String4");
            Assert.AreEqual(8, context.DerivedAsset.MyStrings.Count);
            AssertCollection(derivedPropertyNode.Content, "String0.1", "String1", "String1.1", "String1.5", "String2", "String3", "String3.5", "String4");

            basePropertyNode.Content.Add("String2.1", new Index(4));
            Assert.AreEqual(7, context.BaseAsset.MyStrings.Count);
            AssertCollection(basePropertyNode.Content, "String0.1", "String1", "String1.1", "String2", "String2.1", "String3", "String4");
            Assert.AreEqual(9, context.DerivedAsset.MyStrings.Count);
            AssertCollection(derivedPropertyNode.Content, "String0.1", "String1", "String1.1", "String1.5", "String2", "String2.1", "String3", "String3.5", "String4");

            basePropertyNode.Content.Add("String3.1", new Index(6));
            Assert.AreEqual(8, context.BaseAsset.MyStrings.Count);
            AssertCollection(basePropertyNode.Content, "String0.1", "String1", "String1.1", "String2", "String2.1", "String3", "String3.1", "String4");
            Assert.AreEqual(10, context.DerivedAsset.MyStrings.Count);
            AssertCollection(derivedPropertyNode.Content, "String0.1", "String1", "String1.1", "String1.5", "String2", "String2.1", "String3", "String3.1", "String3.5", "String4");

            basePropertyNode.Content.Add("String4.1", new Index(8));
            Assert.AreEqual(9, context.BaseAsset.MyStrings.Count);
            AssertCollection(basePropertyNode.Content, "String0.1", "String1", "String1.1", "String2", "String2.1", "String3", "String3.1", "String4", "String4.1");
            Assert.AreEqual(11, context.DerivedAsset.MyStrings.Count);
            AssertCollection(derivedPropertyNode.Content, "String0.1", "String1", "String1.1", "String1.5", "String2", "String2.1", "String3", "String3.1", "String3.5", "String4", "String4.1");

            Assert.AreEqual(9, baseIds.Count);
            Assert.AreEqual(11, derivedIds.Count);
            Assert.AreEqual(baseIds[0], derivedIds[0]);
            Assert.AreEqual(baseIds[1], derivedIds[1]);
            Assert.AreEqual(baseIds[2], derivedIds[2]);
            Assert.AreEqual(baseIds[3], derivedIds[4]);
            Assert.AreEqual(baseIds[4], derivedIds[5]);
            Assert.AreEqual(baseIds[5], derivedIds[6]);
            Assert.AreEqual(baseIds[6], derivedIds[7]);
            Assert.AreEqual(baseIds[7], derivedIds[9]);
            Assert.AreEqual(baseIds[8], derivedIds[10]);
        }
        public void TestDictionaryAddedKeyInBase()
        {
            const string baseYaml    = @"!SiliconStudio.Assets.Quantum.Tests.Types+MyAsset3,SiliconStudio.Assets.Quantum.Tests
Id: 10000000-0000-0000-0000-000000000000
Tags: []
MyDictionary:
    0a0000000a0000000a0000000a000000~Key1: String1
    15000000150000001500000015000000~Key2.5: String2.5
    14000000140000001400000014000000~Key2: String2
";
            const string derivedYaml = @"!SiliconStudio.Assets.Quantum.Tests.Types+MyAsset3,SiliconStudio.Assets.Quantum.Tests
Id: 20000000-0000-0000-0000-000000000000
Archetype: 10000000-0000-0000-0000-000000000000:MyAsset
Tags: []
MyDictionary:
    0a0000000a0000000a0000000a000000~Key1: String1
    14000000140000001400000014000000~Key2: String2
";
            var          context     = DeriveAssetTest <Types.MyAsset3> .LoadFromYaml(baseYaml, derivedYaml);

            var baseIds    = CollectionItemIdHelper.GetCollectionItemIds(context.BaseAsset.MyDictionary);
            var derivedIds = CollectionItemIdHelper.GetCollectionItemIds(context.DerivedAsset.MyDictionary);

            Assert.AreEqual(3, context.BaseAsset.MyDictionary.Count);
            Assert.AreEqual("String1", context.BaseAsset.MyDictionary["Key1"]);
            Assert.AreEqual("String2.5", context.BaseAsset.MyDictionary["Key2.5"]);
            Assert.AreEqual("String2", context.BaseAsset.MyDictionary["Key2"]);
            Assert.AreEqual(2, context.DerivedAsset.MyDictionary.Count);
            Assert.AreEqual("String1", context.DerivedAsset.MyDictionary["Key1"]);
            Assert.AreEqual("String2", context.DerivedAsset.MyDictionary["Key2"]);
            Assert.AreEqual(3, baseIds.KeyCount);
            Assert.AreEqual(0, baseIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), baseIds["Key1"]);
            Assert.AreEqual(IdentifierGenerator.Get(21), baseIds["Key2.5"]);
            Assert.AreEqual(IdentifierGenerator.Get(20), baseIds["Key2"]);
            Assert.AreEqual(2, derivedIds.KeyCount);
            Assert.AreEqual(0, derivedIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), derivedIds["Key1"]);
            Assert.AreEqual(IdentifierGenerator.Get(20), derivedIds["Key2"]);
            context.DerivedGraph.ReconcileWithBase();
            Assert.AreEqual(3, context.BaseAsset.MyDictionary.Count);
            Assert.AreEqual("String1", context.BaseAsset.MyDictionary["Key1"]);
            Assert.AreEqual("String2.5", context.BaseAsset.MyDictionary["Key2.5"]);
            Assert.AreEqual("String2", context.BaseAsset.MyDictionary["Key2"]);
            Assert.AreEqual(3, context.DerivedAsset.MyDictionary.Count);
            Assert.AreEqual("String1", context.DerivedAsset.MyDictionary["Key1"]);
            Assert.AreEqual("String2.5", context.DerivedAsset.MyDictionary["Key2.5"]);
            Assert.AreEqual("String2", context.DerivedAsset.MyDictionary["Key2"]);
            Assert.AreEqual(3, baseIds.KeyCount);
            Assert.AreEqual(0, baseIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), baseIds["Key1"]);
            Assert.AreEqual(IdentifierGenerator.Get(21), baseIds["Key2.5"]);
            Assert.AreEqual(IdentifierGenerator.Get(20), baseIds["Key2"]);
            Assert.AreEqual(3, derivedIds.KeyCount);
            Assert.AreEqual(0, derivedIds.DeletedCount);
            Assert.AreEqual(IdentifierGenerator.Get(10), derivedIds["Key1"]);
            Assert.AreEqual(IdentifierGenerator.Get(21), derivedIds["Key2.5"]);
            Assert.AreEqual(IdentifierGenerator.Get(20), derivedIds["Key2"]);
        }
示例#23
0
        public static YamlAssetPath FromMemberPath([NotNull] MemberPath path, object root)
        {
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }
            var result = new YamlAssetPath();
            var clone  = new MemberPath();

            foreach (var item in path.Decompose())
            {
                if (item.MemberDescriptor != null)
                {
                    clone.Push(item.MemberDescriptor);
                    var member = item.MemberDescriptor.Name;
                    result.PushMember(member);
                }
                else
                {
                    object index = null;
                    if (item is MemberPath.ArrayPathItem arrayItem)
                    {
                        clone.Push(arrayItem.Descriptor, arrayItem.Index);
                        index = arrayItem.Index;
                    }
                    else if (item is MemberPath.CollectionPathItem collectionItem)
                    {
                        clone.Push(collectionItem.Descriptor, collectionItem.Index);
                        index = collectionItem.Index;
                    }
                    else if (item is MemberPath.DictionaryPathItem dictionaryItem)
                    {
                        clone.Push(dictionaryItem.Descriptor, dictionaryItem.Key);
                        index = dictionaryItem.Key;
                    }
                    else if (item is MemberPath.SetPathItem setItem)
                    {
                        clone.Push(setItem.Descriptor, setItem.Index);
                        index = setItem.Index;
                    }
                    if (!CollectionItemIdHelper.TryGetCollectionItemIds(clone.GetValue(root), out CollectionItemIdentifiers ids))
                    {
                        result.PushIndex(index);
                    }
                    else
                    {
                        var id = ids[index];
                        // Create a new id if we don't have any so far
                        if (id == ItemId.Empty)
                        {
                            id = ItemId.New();
                        }
                        result.PushItemId(id);
                    }
                }
            }
            return(result);
        }
示例#24
0
        public AssetNode ResolveObjectPath(YamlAssetPath path, out Index index, out bool overrideOnKey)
        {
            var currentNode = this;

            index         = Index.Empty;
            overrideOnKey = false;
            for (var i = 0; i < path.Items.Count; i++)
            {
                var item = path.Items[i];
                switch (item.Type)
                {
                case YamlAssetPath.ItemType.Member:
                    index         = Index.Empty;
                    overrideOnKey = false;
                    if (currentNode.Content.IsReference)
                    {
                        currentNode = (AssetNode)((IGraphNode)currentNode).Target;
                    }
                    string name = item.AsMember();
                    currentNode = (AssetNode)((IGraphNode)currentNode).TryGetChild(name);
                    break;

                case YamlAssetPath.ItemType.Index:
                    index         = new Index(item.Value);
                    overrideOnKey = true;
                    if (currentNode.Content.IsReference && i < path.Items.Count - 1)
                    {
                        Index index1 = new Index(item.Value);
                        currentNode = (AssetNode)((IGraphNode)currentNode).IndexedTarget(index1);
                    }
                    break;

                case YamlAssetPath.ItemType.ItemId:
                    var ids = CollectionItemIdHelper.GetCollectionItemIds(currentNode.Content.Retrieve());
                    var key = ids.GetKey(item.AsItemId());
                    index         = new Index(key);
                    overrideOnKey = false;
                    if (currentNode.Content.IsReference && i < path.Items.Count - 1)
                    {
                        Index index1 = new Index(key);
                        currentNode = (AssetNode)((IGraphNode)currentNode).IndexedTarget(index1);
                    }
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                // Something wrong happen, the node is unreachable.
                if (currentNode == null)
                {
                    return(null);
                }
            }

            return(currentNode);
        }
示例#25
0
        public void TestCollectionMismatchItem()
        {
            const string baseYaml    = @"!Stride.Core.Assets.Quantum.Tests.Helpers.Types+MyAsset2,Stride.Core.Assets.Quantum.Tests
Id: 10000000-0000-0000-0000-000000000000
Tags: []
Struct:
    MyStrings: {}
MyStrings:
    0a0000000a0000000a0000000a000000: String1
    14000000140000001400000014000000: String2
";
            const string derivedYaml = @"!Stride.Core.Assets.Quantum.Tests.Helpers.Types+MyAsset2,Stride.Core.Assets.Quantum.Tests
Id: 20000000-0000-0000-0000-000000000000
Archetype: 10000000-0000-0000-0000-000000000000:MyAsset
Tags: []
Struct:
    MyStrings: {}
MyStrings:
    0a0000000a0000000a0000000a000000*: MyDerivedString
    14000000140000001400000014000000: MyBaseString
";
            var          context     = DeriveAssetTest <Types.MyAsset2, Types.MyAssetBasePropertyGraph> .LoadFromYaml(baseYaml, derivedYaml);

            var baseIds    = CollectionItemIdHelper.GetCollectionItemIds(context.BaseAsset.MyStrings);
            var derivedIds = CollectionItemIdHelper.GetCollectionItemIds(context.DerivedAsset.MyStrings);

            Assert.Equal(2, context.BaseAsset.MyStrings.Count);
            Assert.Equal("String1", context.BaseAsset.MyStrings[0]);
            Assert.Equal("String2", context.BaseAsset.MyStrings[1]);
            Assert.Equal(2, context.DerivedAsset.MyStrings.Count);
            Assert.Equal("MyDerivedString", context.DerivedAsset.MyStrings[0]);
            Assert.Equal("MyBaseString", context.DerivedAsset.MyStrings[1]);
            Assert.Equal(2, baseIds.KeyCount);
            Assert.Equal(0, baseIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), baseIds[0]);
            Assert.Equal(IdentifierGenerator.Get(20), baseIds[1]);
            Assert.Equal(2, derivedIds.KeyCount);
            Assert.Equal(0, derivedIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), derivedIds[0]);
            Assert.Equal(IdentifierGenerator.Get(20), derivedIds[1]);
            context.DerivedGraph.ReconcileWithBase();
            Assert.Equal(2, context.BaseAsset.MyStrings.Count);
            Assert.Equal("String1", context.BaseAsset.MyStrings[0]);
            Assert.Equal("String2", context.BaseAsset.MyStrings[1]);
            Assert.Equal(2, context.DerivedAsset.MyStrings.Count);
            Assert.Equal("MyDerivedString", context.DerivedAsset.MyStrings[0]);
            Assert.Equal("String2", context.DerivedAsset.MyStrings[1]);
            Assert.Equal(2, baseIds.KeyCount);
            Assert.Equal(0, baseIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), baseIds[0]);
            Assert.Equal(IdentifierGenerator.Get(20), baseIds[1]);
            Assert.Equal(2, derivedIds.KeyCount);
            Assert.Equal(0, derivedIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), derivedIds[0]);
            Assert.Equal(IdentifierGenerator.Get(20), derivedIds[1]);
        }
示例#26
0
        public void TestDictionaryNonIdentifiableItemsDeserialization()
        {
            ShadowObject.Enable = true;
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.Write(YamlDictionaryNonIdentifiable);
            writer.Flush();
            stream.Position = 0;
            var instance = AssetYamlSerializer.Default.Deserialize(stream);

            Assert.NotNull(instance);
            Assert.Equal(typeof(ContainerNonIdentifiableDictionary), instance.GetType());
            var obj = (ContainerNonIdentifiableDictionary)instance;

            Assert.Equal("Root", obj.Name);
            Assert.Equal(2, obj.Objects.Count);
            Assert.Equal("aaa", obj.Objects["AAA"].Name);
            Assert.Equal(2, obj.Objects["AAA"].Strings.Count);
            Assert.Equal("bbb", obj.Objects["AAA"].Strings[0]);
            Assert.Equal("ccc", obj.Objects["AAA"].Strings[1]);
            Assert.Equal("ddd", obj.Objects["BBB"].Name);
            Assert.Equal(2, obj.Objects["BBB"].Strings.Count);
            Assert.Equal("eee", obj.Objects["BBB"].Strings[0]);
            Assert.Equal("fff", obj.Objects["BBB"].Strings[1]);
            var objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Objects);

            Assert.Equal(IdentifierGenerator.Get(2), objectIds["AAA"]);
            Assert.Equal(IdentifierGenerator.Get(1), objectIds["BBB"]);
            objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Objects["AAA"].Strings);
            Assert.Equal(IdentifierGenerator.Get(5), objectIds[0]);
            Assert.Equal(IdentifierGenerator.Get(6), objectIds[1]);
            objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Objects["BBB"].Strings);
            Assert.Equal(IdentifierGenerator.Get(7), objectIds[0]);
            Assert.Equal(IdentifierGenerator.Get(8), objectIds[1]);

            Assert.Equal(2, obj.NonIdentifiableObjects.Count);
            Assert.Equal("ggg", obj.NonIdentifiableObjects["CCC"].Name);
            Assert.Equal(2, obj.NonIdentifiableObjects["CCC"].Strings.Count);
            Assert.Equal("hhh", obj.NonIdentifiableObjects["CCC"].Strings[0]);
            Assert.Equal("iii", obj.NonIdentifiableObjects["CCC"].Strings[1]);
            Assert.Equal("jjj", obj.NonIdentifiableObjects["DDD"].Name);
            Assert.Equal(2, obj.NonIdentifiableObjects["DDD"].Strings.Count);
            Assert.Equal("kkk", obj.NonIdentifiableObjects["DDD"].Strings[0]);
            Assert.Equal("lll", obj.NonIdentifiableObjects["DDD"].Strings[1]);
            Assert.False(CollectionItemIdHelper.TryGetCollectionItemIds(obj.NonIdentifiableObjects, out objectIds));
            objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.NonIdentifiableObjects);
            Assert.Equal(0, objectIds.KeyCount);
            Assert.Equal(0, objectIds.DeletedCount);
            objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.NonIdentifiableObjects["CCC"].Strings);
            Assert.Equal(IdentifierGenerator.Get(9), objectIds[0]);
            Assert.Equal(IdentifierGenerator.Get(10), objectIds[1]);
            objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.NonIdentifiableObjects["DDD"].Strings);
            Assert.Equal(IdentifierGenerator.Get(11), objectIds[0]);
            Assert.Equal(IdentifierGenerator.Get(12), objectIds[1]);
        }
示例#27
0
        public void TestDictionaryRemovedItemFromBase()
        {
            const string baseYaml    = @"!Stride.Core.Assets.Quantum.Tests.Helpers.Types+MyAsset3,Stride.Core.Assets.Quantum.Tests
Id: 10000000-0000-0000-0000-000000000000
Tags: []
MyDictionary:
    0a0000000a0000000a0000000a000000~Key1: String1
    14000000140000001400000014000000~Key3: String3
";
            const string derivedYaml = @"!Stride.Core.Assets.Quantum.Tests.Helpers.Types+MyAsset3,Stride.Core.Assets.Quantum.Tests
Id: 20000000-0000-0000-0000-000000000000
Archetype: 10000000-0000-0000-0000-000000000000:MyAsset
Tags: []
MyDictionary:
    0a0000000a0000000a0000000a000000~Key1: String1
    24000000240000002400000024000000~Key2: String2
    14000000140000001400000014000000~Key3: String3
";
            var          context     = DeriveAssetTest <Types.MyAsset3, Types.MyAssetBasePropertyGraph> .LoadFromYaml(baseYaml, derivedYaml);

            var baseIds    = CollectionItemIdHelper.GetCollectionItemIds(context.BaseAsset.MyDictionary);
            var derivedIds = CollectionItemIdHelper.GetCollectionItemIds(context.DerivedAsset.MyDictionary);

            Assert.Equal(2, context.BaseAsset.MyDictionary.Count);
            Assert.Equal("String1", context.BaseAsset.MyDictionary["Key1"]);
            Assert.Equal("String3", context.BaseAsset.MyDictionary["Key3"]);
            Assert.Equal(3, context.DerivedAsset.MyDictionary.Count);
            Assert.Equal("String1", context.DerivedAsset.MyDictionary["Key1"]);
            Assert.Equal("String2", context.DerivedAsset.MyDictionary["Key2"]);
            Assert.Equal("String3", context.DerivedAsset.MyDictionary["Key3"]);
            Assert.Equal(2, baseIds.KeyCount);
            Assert.Equal(0, baseIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), baseIds["Key1"]);
            Assert.Equal(IdentifierGenerator.Get(20), baseIds["Key3"]);
            Assert.Equal(3, derivedIds.KeyCount);
            Assert.Equal(0, derivedIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), derivedIds["Key1"]);
            Assert.Equal(IdentifierGenerator.Get(36), derivedIds["Key2"]);
            Assert.Equal(IdentifierGenerator.Get(20), derivedIds["Key3"]);
            context.DerivedGraph.ReconcileWithBase();
            Assert.Equal(2, context.BaseAsset.MyDictionary.Count);
            Assert.Equal("String1", context.BaseAsset.MyDictionary["Key1"]);
            Assert.Equal("String3", context.BaseAsset.MyDictionary["Key3"]);
            Assert.Equal(2, context.DerivedAsset.MyDictionary.Count);
            Assert.Equal("String1", context.DerivedAsset.MyDictionary["Key1"]);
            Assert.Equal("String3", context.DerivedAsset.MyDictionary["Key3"]);
            Assert.Equal(2, baseIds.KeyCount);
            Assert.Equal(0, baseIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), baseIds["Key1"]);
            Assert.Equal(IdentifierGenerator.Get(20), baseIds["Key3"]);
            Assert.Equal(2, derivedIds.KeyCount);
            Assert.Equal(0, derivedIds.DeletedCount);
            Assert.Equal(IdentifierGenerator.Get(10), derivedIds["Key1"]);
            Assert.Equal(IdentifierGenerator.Get(20), derivedIds["Key3"]);
        }
示例#28
0
 public override void VisitDictionary(object dictionary, DictionaryDescriptor descriptor)
 {
     if (ShouldGenerateItemIdCollection(dictionary))
     {
         var itemIds = CollectionItemIdHelper.GetCollectionItemIds(dictionary);
         foreach (var element in descriptor.GetEnumerator(dictionary))
         {
             itemIds.Add(element.Key, ItemId.New());
         }
     }
 }
示例#29
0
        public void TestDictionaryDeserializationOldWay()
        {
            ShadowObject.Enable = true;
            var yaml = @"!SiliconStudio.Assets.Tests.Yaml.TestCollectionIdsSerialization+ContainerDictionary,SiliconStudio.Assets.Tests
Name: Root
Strings:
    000000c8-00c8-0000-c800-0000c8000000: aaa
    00000064-0064-0000-6400-000064000000: bbb
Objects:
    key3:
        ~Id: 00000003-0003-0000-0300-000003000000
        Name: obj1
        Strings: {}
        Objects: {}
    key4:
        ~Id: 00000004-0004-0000-0400-000004000000
        Name: obj2
        Strings: {}
        Objects: {}
";

            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.Write(yaml);
            writer.Flush();
            stream.Position = 0;
            var instance = AssetYamlSerializer.Default.Deserialize(stream);

            Assert.NotNull(instance);
            Assert.AreEqual(typeof(ContainerDictionary), instance.GetType());
            var obj = (ContainerDictionary)instance;

            Assert.AreEqual("Root", obj.Name);
            Assert.AreEqual(2, obj.Strings.Count);
            Assert.AreEqual("aaa", obj.Strings[GuidGenerator.Get(200)]);
            Assert.AreEqual("bbb", obj.Strings[GuidGenerator.Get(100)]);
            Assert.AreEqual(2, obj.Objects.Count);
            Assert.AreEqual("obj1", obj.Objects["key3"].Name);
            Assert.AreEqual("obj2", obj.Objects["key4"].Name);
            var stringIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Strings);
            var objectIds = CollectionItemIdHelper.GetCollectionItemIds(obj.Objects);

            Assert.AreEqual(2, stringIds.KeyCount);
            Assert.AreEqual(0, stringIds.DeletedCount);
            Assert.IsTrue(stringIds.ContainsKey(GuidGenerator.Get(200)));
            Assert.IsTrue(stringIds.ContainsKey(GuidGenerator.Get(100)));
            Assert.AreEqual(2, objectIds.KeyCount);
            Assert.AreEqual(0, objectIds.DeletedCount);
            Assert.IsTrue(objectIds.ContainsKey("key3"));
            Assert.IsTrue(objectIds.ContainsKey("key4"));
            Assert.AreEqual(IdentifierGenerator.Get(3), objectIds["key3"]);
            Assert.AreEqual(IdentifierGenerator.Get(4), objectIds["key4"]);
        }
示例#30
0
 public override void VisitArray(Array array, ArrayDescriptor descriptor)
 {
     if (ShouldGenerateItemIdCollection(array))
     {
         var itemIds = CollectionItemIdHelper.GetCollectionItemIds(array);
         for (var i = 0; i < array.Length; ++i)
         {
             itemIds.Add(i, ItemId.New());
         }
     }
     base.VisitArray(array, descriptor);
 }