public void PrimitiveCollectionPrototypes(bool possibleValues)
        {
            // Arrange
            var serialization = possibleValues
                ? new PossibleValuesSerialization(null, new ValueProviderExecutor(new ValueProviderExecutorSettings().AddDefaultValueProvider()))
                : (ICustomSerialization) new DefaultSerialization();

            // Act
            var encoded = EntryConvert.EncodeClass(typeof(ListDummy), serialization);

            // Assert
            var doubles = encoded.SubEntries[1];

            Assert.AreEqual(nameof(EntryValueType.Double), doubles.Value.Possible[0]);
            Assert.AreEqual(1, doubles.Prototypes.Count);
            if (possibleValues)
            {
                Assert.AreEqual(3, doubles.Prototypes[0].Value.Possible.Length);
            }
            else
            {
                Assert.IsNull(doubles.Prototypes[0].Value.Possible);
            }


            var enums = encoded.SubEntries[2];

            Assert.AreEqual(3, enums.Value.Possible.Length);
            Assert.AreEqual(3, enums.Prototypes.Count);
            for (int i = 0; i < 3; i++)
            {
                Assert.AreEqual(enums.Value.Possible[i], enums.Prototypes[i].Value.Current);
            }
        }
        public void MethodLocalization()
        {
            // Arrange
            var methodClass = new LocalizedMethodDummyClass();

            // Act
            Thread.CurrentThread.CurrentUICulture = _germanCulture;
            var entriesGerman = EntryConvert.EncodeMethods(methodClass).ToArray();

            Thread.CurrentThread.CurrentUICulture = _invariantCulture;
            var entriesInvariant = EntryConvert.EncodeMethods(methodClass).ToArray();

            // Assert
            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.InitiateWorldTermination), _germanCulture), entriesGerman[0].DisplayName);
            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.InitiateWorldTerminationDescription), _germanCulture), entriesGerman[0].Description);

            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.EvacuatePeopleParam), _germanCulture), entriesGerman[0].Parameters.SubEntries[0].DisplayName);
            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.EvacuatePeopleParamDescription), _germanCulture), entriesGerman[0].Parameters.SubEntries[0].Description);

            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.NameOfTerminatorParam), _germanCulture), entriesGerman[0].Parameters.SubEntries[1].DisplayName);
            Assert.IsNull(entriesGerman[0].Parameters.SubEntries[1].Description);

            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.InitiateWorldTermination), _invariantCulture), entriesInvariant[0].DisplayName);
            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.InitiateWorldTerminationDescription), _invariantCulture), entriesInvariant[0].Description);

            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.EvacuatePeopleParam), _invariantCulture), entriesInvariant[0].Parameters.SubEntries[0].DisplayName);
            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.EvacuatePeopleParamDescription), _invariantCulture), entriesInvariant[0].Parameters.SubEntries[0].Description);

            Assert.AreEqual(strings.ResourceManager.GetString(nameof(strings.NameOfTerminatorParam), _invariantCulture), entriesInvariant[0].Parameters.SubEntries[1].DisplayName);
            Assert.IsNull(entriesInvariant[0].Parameters.SubEntries[1].Description);
        }
        public IProductRecipe ConvertRecipeBack(RecipeModel recipe, IProductType productType)
        {
            IProductRecipe productRecipe;

            if (recipe.Id == 0)
            {
                var type = ReflectionTool.GetPublicClasses <IProductRecipe>(t => t.Name == recipe.Type).First();
                productRecipe = (IProductRecipe)Activator.CreateInstance(type);
            }
            else
            {
                productRecipe = RecipeManagement.Get(recipe.Id);
            }

            productRecipe.Name     = recipe.Name;
            productRecipe.Revision = recipe.Revision;
            productRecipe.State    = recipe.State;

            // Only load workplan if it changed
            var workplanRecipe = productRecipe as IWorkplanRecipe;

            if (workplanRecipe != null && workplanRecipe.Workplan?.Id != recipe.WorkplanId)
            {
                workplanRecipe.Workplan = WorkplanManagement.LoadWorkplan(recipe.WorkplanId);
            }

            if (productRecipe.Product == null)
            {
                productRecipe.Product = productType;
            }

            switch (recipe.Classification)
            {
            case RecipeClassificationModel.Unset:
                productRecipe.Classification = RecipeClassification.Unset;
                break;

            case RecipeClassificationModel.Default:
                productRecipe.Classification = RecipeClassification.Default;
                break;

            case RecipeClassificationModel.Alternative:
                productRecipe.Classification = RecipeClassification.Alternative;
                break;

            case RecipeClassificationModel.Intermediate:
                productRecipe.Classification = RecipeClassification.Intermediate;
                break;

            case RecipeClassificationModel.Part:
                productRecipe.Classification = RecipeClassification.Part;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            EntryConvert.UpdateInstance(productRecipe, recipe.Properties, RecipeSerialization);
            return(productRecipe);
        }
        public void PropertyLocalization()
        {
            var resourceManager  = new ResourceManager(typeof(strings));
            var germanCulture    = new CultureInfo("de");
            var invariantCulture = new CultureInfo("en");

            // Switch to german
            Thread.CurrentThread.CurrentUICulture = germanCulture;
            var expectedDisplayPropName        = resourceManager.GetString(nameof(strings.PropDisplayAttribute_Name), germanCulture);
            var expectedDisplayPropDescription = resourceManager.GetString(nameof(strings.PropDisplayAttribute_Description), germanCulture);
            var encoded = EntryConvert.EncodeClass(typeof(LocalizedClass));

            Assert.AreEqual(expectedDisplayPropName, encoded.SubEntries[0].DisplayName);
            Assert.AreEqual(expectedDisplayPropDescription, encoded.SubEntries[0].Description);
            Assert.AreEqual(LocalizedClass.PropDisplayNameAttributeDisplayName, encoded.SubEntries[1].DisplayName);

            // Switch to invariant
            Thread.CurrentThread.CurrentUICulture = invariantCulture;
            expectedDisplayPropName        = resourceManager.GetString(nameof(strings.PropDisplayAttribute_Name), invariantCulture);
            expectedDisplayPropDescription = resourceManager.GetString(nameof(strings.PropDisplayAttribute_Description), invariantCulture);
            encoded = EntryConvert.EncodeClass(typeof(LocalizedClass));

            Assert.AreEqual(expectedDisplayPropName, encoded.SubEntries[0].DisplayName);
            Assert.AreEqual(expectedDisplayPropDescription, encoded.SubEntries[0].Description);
            Assert.AreEqual(LocalizedClass.PropDisplayNameAttributeDisplayName, encoded.SubEntries[1].DisplayName);
        }
        public Entry InvokeMethod(string moduleName, MethodEntry method)
        {
            Entry result       = null;
            var   serverModule = GetModuleFromManager(moduleName);

            if (serverModule != null && method != null)
            {
                try
                {
                    result = EntryConvert.InvokeMethod(serverModule.Console, method,
                                                       CreateEditorSerializeSerialization(serverModule));
                }
                catch (Exception e)
                {
                    result = new Entry
                    {
                        Description = $"Error while invoking function: {method.DisplayName}",
                        DisplayName = "Error description",
                        Identifier  = "0",
                        Value       = new EntryValue {
                            Current = e.Message, Type = EntryValueType.String
                        }
                    };
                }
            }
            else
            {
                var ctx = WebOperationContext.Current;
                // ReSharper disable once PossibleNullReferenceException
                ctx.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
            }

            return(result);
        }
예제 #6
0
        public Config GetConfig(string moduleName)
        {
            Logger.Log(LogLevel.Info, "Converting config of plugin {0}", moduleName);
            try
            {
                var module        = GetModuleFromManager(moduleName);
                var serialization = CreateSerialization(module);

                var config      = GetConfig(module, false);
                var configModel = new Config
                {
                    Root = EntryConvert.EncodeObject(config, serialization)
                };
                return(configModel);
            }
            catch (Exception ex)
            {
                Logger.LogException(LogLevel.Warning, ex, "Failed to convert config of {0}", moduleName);
#if USE_WCF
                var ctx = WebOperationContext.Current;
                // ReSharper disable once PossibleNullReferenceException
                ctx.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
#else
                Response.StatusCode = (int)HttpStatusCode.InternalServerError;
#endif
                return(null);
            }
        }
예제 #7
0
        public void SetConfig(string moduleName, SaveConfigRequest request)
        {
            try
            {
                var module        = GetModuleFromManager(moduleName);
                var serialization = CreateSerialization(module);
                var config        = GetConfig(module, true);
                EntryConvert.UpdateInstance(config, request.Config.Root, serialization);
                ConfigManager.SaveConfiguration(config, request.UpdateMode == ConfigUpdateMode.UpdateLiveAndSave);

                if (request.UpdateMode == ConfigUpdateMode.SaveAndReincarnate)
                {
                    // This has to be done parallel so we can also reincarnate the Maintenance itself
                    ParallelOperations.ExecuteParallel(() => ModuleManager.ReincarnateModule(module));
                }
            }
            catch (Exception ex)
            {
                Logger.LogException(LogLevel.Warning, ex, "Failed to save config of {0}", moduleName);
#if USE_WCF
                var ctx = WebOperationContext.Current;
                // ReSharper disable once PossibleNullReferenceException
                ctx.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
#else
                Response.StatusCode = (int)HttpStatusCode.InternalServerError;
#endif
            }
        }
        private ReferenceTypeModel ConvertReferenceProperty(PropertyInfo property, IDictionary <string, List <Type> > overrides)
        {
            var referenceAttr = property.GetCustomAttribute <ResourceReferenceAttribute>();
            var displayName   = property.GetDisplayName();

            // Create reference model from property information and optional attribute
            var referenceModel = new ReferenceTypeModel
            {
                Name         = property.Name,
                DisplayName  = !string.IsNullOrEmpty(displayName) ? displayName : property.Name,
                Description  = property.GetDescription(),
                Role         = referenceAttr.Role,
                RelationType = referenceAttr.RelationType,
                IsRequired   = referenceAttr.IsRequired,
                IsCollection = typeof(IEnumerable <IResource>).IsAssignableFrom(property.PropertyType)
            };

            // Get type constraints
            Type targetType = property.PropertyType;

            if (referenceModel.IsCollection)
            {
                targetType = EntryConvert.ElementType(targetType);
            }
            var typeConstraints = MergeTypeConstraints(property, targetType, overrides);

            referenceModel.SupportedTypes = TypeController.SupportedTypes(typeConstraints).Select(t => t.Name).ToArray();

            return(referenceModel);
        }
        private void UpdateCollection(IList value, IEnumerable <PartModel> parts)
        {
            // Track which part links are still represented by the models
            var unused = new List <IProductPartLink>(value.OfType <IProductPartLink>());
            // Iterate over the part models
            // Create or update the part links
            var elemType = value.GetType().GetGenericArguments()[0];

            foreach (var partModel in parts)
            {
                var match = unused.Find(r => r.Id == partModel.Id);
                if (match == null)
                {
                    match = (IProductPartLink)Activator.CreateInstance(elemType);
                    value.Add(match);
                }
                else
                {
                    unused.Remove(match);
                }
                EntryConvert.UpdateInstance(match, partModel.Properties);
                match.Product = (ProductType)ProductManager.LoadType(partModel.Product.Id);
            }

            // Clear all values no longer present in the model
            foreach (var link in unused)
            {
                value.Remove(link);
            }
        }
        public void CreateInstanceWithArray()
        {
            // Arrange
            var type    = typeof(ArrayDummy);
            var encoded = EntryConvert.EncodeClass(type);

            var entry1 = encoded.SubEntries[0];
            var entry2 = encoded.SubEntries[1];

            for (var i = 1; i <= 5; i++)
            {
                var newInstance = entry1.Prototypes[0].Instantiate();
                newInstance.Value.Current = (1 + i).ToString();
                entry1.SubEntries.Add(newInstance);
            }

            for (var i = 1; i <= 5; i++)
            {
                var newInstance = entry2.Prototypes[0].Instantiate();
                newInstance.Value.Current = "Number: " + i;
                entry2.SubEntries.Add(newInstance);
            }

            // Act
            var dummy = EntryConvert.CreateInstance <ArrayDummy>(encoded);

            // Assert
            for (var i = 1; i <= 5; i++)
            {
                Assert.AreEqual(i + 1, dummy.Array[i - 1]);
                Assert.AreEqual("Number: " + i, dummy.Keys[i - 1]);
            }
        }
        public void FormatProviderTest(string cultureName)
        {
            // Arrange
            var formatProvider = new CultureInfo(cultureName);
            var serialization  = new DefaultSerialization {
                FormatProvider = formatProvider
            };

            var dummy = new DummyClass
            {
                Number      = 1001,
                SingleClass = new SubClass {
                    Foo = 1.1234f
                }
            };

            // Act
            var encoded      = EntryConvert.EncodeObject(dummy, serialization);
            var dummyDecoded = EntryConvert.CreateInstance <DummyClass>(encoded, serialization);

            // Assert
            Assert.AreEqual(1001.ToString(formatProvider), encoded.SubEntries[0].Value.Current);
            Assert.AreEqual(1.1234f.ToString(formatProvider), encoded.SubEntries[3].SubEntries[0].Value.Current);

            Assert.AreEqual(1001, dummyDecoded.Number);
            Assert.AreEqual(1.1234f, dummyDecoded.SingleClass.Foo);
        }
        public void AddItemToCollectionWhichIsArray()
        {
            //Arrange
            var dummy = new DummyClassIList();

            dummy.Number      = 10;
            dummy.Name        = "Thomas";
            dummy.SingleClass = null;
            dummy.SubArray    = new[] { new SubClass {
                                            Foo = (float)1.2, Enum = DummyEnum.ValueB
                                        } };
            dummy.SubList = new List <SubClass> {
                new SubClass {
                    Foo = (float)3.4, Enum = DummyEnum.ValueA
                }
            };
            dummy.SubEnumerable = new List <SubClass> {
                new SubClass {
                    Foo = (float)3.4, Enum = DummyEnum.ValueA
                }
            };
            dummy.SubDictionary = new Dictionary <int, SubClass>();
            dummy.SubIList      = new int[] { 1, 2, 3, 7 };

            var entry = EntryConvert.EncodeObject(dummy);
            var x     = entry.SubEntries.FirstOrDefault(e => e.Identifier == "SubIList");

            x.SubEntries.Add(x.Prototypes.First());

            //Act
            EntryConvert.UpdateInstance(dummy, entry);

            //Assert
            Assert.AreEqual(dummy.SubIList.Count, 5);
        }
        public void ConvertFromModelAndBackToModel()
        {
            // Arrange
            var dummyClass       = CreateDummyServer();
            var dummyClassClient = new EntryModelDummyClient();

            // Act
            var serverEntry = EntryConvert.EncodeObject(dummyClass, new DefaultSerialization {
                FormatProvider = new CultureInfo("en-us")
            });

            var clientConverter = EntryToModelConverter.Create <EntryModelDummyClient>(new CultureInfo("en-us"));

            clientConverter.FromModel(serverEntry, dummyClassClient);

            // Assert
            // Check server to client conversion
            Assert.AreEqual(73, dummyClassClient.Value);
            Assert.AreEqual(true, dummyClassClient.HasAnything);
            Assert.AreEqual("0.5", dummyClassClient.Class.Value);
            Assert.AreEqual("ValueB", dummyClassClient.Class.Enum);
            Assert.AreEqual(2, dummyClassClient.Collection.Count());
            Assert.AreEqual(2, dummyClassClient.Dictionary.Count <EntryModelSubClassDummyClient>());
            Assert.AreEqual("15.8", dummyClassClient.Dictionary["1"].Value);
            Assert.AreEqual("Unset", dummyClassClient.Dictionary["1"].Enum);
            Assert.AreEqual("435.2", dummyClassClient.Dictionary["2"].Value);
            Assert.AreEqual("ValueA", dummyClassClient.Dictionary["2"].Enum);

            // Arrange
            dummyClassClient.Value       = 174;
            dummyClassClient.HasAnything = false;
            dummyClassClient.Class.Value = "15.8";
            dummyClassClient.Class.Enum  = "ValueA";
            dummyClassClient.Collection.Remove(dummyClassClient.Collection.First());
            dummyClassClient.Collection.First().Value = "90";
            dummyClassClient.Collection.First().Enum  = "ValueA";
            dummyClassClient.Dictionary["1"].Value = "10076";
            dummyClassClient.Dictionary["1"].Enum  = "ValueB";
            dummyClassClient.Dictionary.Remove("2");

            // Act
            clientConverter.ToModel(dummyClassClient, serverEntry);

            EntryConvert.UpdateInstance(dummyClass, serverEntry, new DefaultSerialization {
                FormatProvider = new CultureInfo("en-us")
            });

            // Assert
            // Check client to server conversion
            Assert.AreEqual(174, dummyClass.Value);
            Assert.AreEqual(false, dummyClass.HasAnything);
            Assert.AreEqual(15.8f, dummyClass.Class.Value);
            Assert.AreEqual(DummyEnum.ValueA, dummyClass.Class.Enum);
            Assert.AreEqual(1, dummyClass.Collection.Count);
            Assert.AreEqual(90f, dummyClass.Collection.First().Value);
            Assert.AreEqual(DummyEnum.ValueA, dummyClass.Collection.First().Enum);
            Assert.AreEqual(1, dummyClass.Dictionary.Count);
            Assert.AreEqual(10076f, dummyClass.Dictionary[1].Value);
            Assert.AreEqual(DummyEnum.ValueB, dummyClass.Dictionary[1].Enum);
        }
        public void RemoveItemFromEntryDictionary()
        {
            // Arrange
            var dummyClass  = CreateDummyServer();
            var dummyClient = CreateDummyClient();

            // Act
            var serverEntry = EntryConvert.EncodeObject(dummyClass, new DefaultSerialization {
                FormatProvider = new CultureInfo("en-us")
            });

            dummyClient.Dictionary.Remove("2");

            var clientConverter = EntryToModelConverter.Create <EntryModelDummyClient>(new CultureInfo("en-us"));

            clientConverter.ToModel(dummyClient, serverEntry);

            // Assert
            Assert.AreEqual(1, dummyClient.Dictionary.Count());
            Assert.AreEqual("4.6", dummyClient.Dictionary["1"].Value);
            Assert.AreEqual("ValueA", dummyClient.Dictionary["1"].Enum);

            Assert.AreEqual(1, serverEntry.SubEntries[5].SubEntries.Count);
            Assert.AreEqual("4.6", serverEntry.SubEntries[5].SubEntries[0].SubEntries[0].Value.Current);
            Assert.AreEqual("ValueA", serverEntry.SubEntries[5].SubEntries[0].SubEntries[1].Value.Current);
        }
        public void AddItemToEntryCollection()
        {
            // Arrange
            var dummyClass  = CreateDummyServer();
            var dummyClient = CreateDummyClient();

            // Act
            var serverEntry = EntryConvert.EncodeObject(dummyClass, new DefaultSerialization {
                FormatProvider = new CultureInfo("en-us")
            });

            dummyClient.Collection.Add(typeof(EntryModelSubClassDummyClient).Name);

            var clientConverter = EntryToModelConverter.Create <EntryModelDummyClient>(new CultureInfo("en-us"));

            clientConverter.ToModel(dummyClient, serverEntry);

            // Assert
            Assert.AreEqual(3, dummyClient.Collection.Count());
            Assert.IsNull(dummyClient.Collection.Last().Value);
            Assert.IsNull(dummyClient.Collection.Last().Enum);

            Assert.AreEqual(3, serverEntry.SubEntries[4].SubEntries.Count);
            Assert.AreEqual(typeof(EntryModelSubClassDummyClient).Name, serverEntry.SubEntries[4].SubEntries[2].Value.Current);
        }
예제 #16
0
        /// <summary>
        /// Convert ResourceModel back to resource and/or update its properties
        /// </summary>
        public Resource FromModel(ResourceModel model, HashSet <Resource> resourcesToSave, Resource resource = null)
        {
            // Break recursion if we converted this instance already
            // Try to load by real id first
            if (_resourceCache.ContainsKey(model.Id))
            {
                return(_resourceCache[model.Id]);
            }
            // Otherwise by reference id
            if (model.Id == 0 && _resourceCache.ContainsKey(model.ReferenceId))
            {
                return(_resourceCache[model.ReferenceId]);
            }

            // Only fetch resource object if it was not given
            if (resource == null)
            {
                resource = model.Id == 0
                    ? _resourceGraph.Instantiate(model.Type)
                    : _resourceGraph.Get(model.Id);
            }

            // Write to cache because following calls might only have an empty reference
            if (model.Id == 0)
            {
                _resourceCache[model.ReferenceId] = resource;
            }
            else
            {
                _resourceCache[model.Id] = resource;
            }

            // Do not copy values from partially loaded models
            if (model.PartiallyLoaded)
            {
                return(resource);
            }

            // Add to list if object was created or modified
            if (model.Id == 0 || model.DifferentFrom(resource, _serialization))
            {
                resourcesToSave.Add(resource);
            }

            // Copy standard properties
            resource.Name        = model.Name;
            resource.Description = model.Description;

            // Copy extended properties
            EntryConvert.UpdateInstance(resource.Descriptor, model.Properties, _serialization);

            // Set all other references
            UpdateReferences(resource, resourcesToSave, model);

            return(resource);
        }
        private IProductType ConvertProductBack(ProductModel product)
        {
            // Fetch instance and copy base values
            ProductType converted;

            if (product.Id == 0)
            {
                converted = (ProductType)ProductManager.CreateType(product.Type);
            }
            else
            {
                converted = (ProductType)ProductManager.LoadType(product.Id);
            }

            converted.Identity = new ProductIdentity(product.Identifier, product.Revision);
            converted.Name     = product.Name;
            converted.State    = product.State;

            // Copy extended properties
            var properties = converted.GetType().GetProperties();

            EntryConvert.UpdateInstance(converted, product.Properties, ProductSerialization);

            ConvertFilesBack(converted, product, properties);

            // Save recipes
            var recipes = product.Recipes.Select(r => ConvertRecipeBack(r, converted)).ToList();

            RecipeManagement.Save(product.Id, recipes);

            // Convert parts
            foreach (var partConnector in product.Parts)
            {
                var prop  = properties.First(p => p.Name == partConnector.Name);
                var value = prop.GetValue(converted);
                if (partConnector.IsCollection)
                {
                    UpdateCollection((IList)value, partConnector.Parts);
                }
                else if (partConnector.Parts.Length == 1)
                {
                    if (value == null)
                    {
                        value = Activator.CreateInstance(prop.PropertyType);
                        prop.SetValue(converted, value);
                    }
                    UpdateReference((IProductPartLink)value, partConnector.Parts[0]);
                }
                else if (partConnector.Parts.Length == 0)
                {
                    prop.SetValue(converted, null);
                }
            }

            return(converted);
        }
예제 #18
0
 public ProductDefinitionModel ConvertProductType(Type productType)
 {
     return(new()
     {
         Name = productType.Name,
         DisplayName = productType.GetDisplayName() ?? productType.Name,
         BaseDefinition = productType.BaseType?.Name,
         Properties = EntryConvert.EncodeClass(productType, ProductSerialization)
     });
 }
        public void RemoveEntry(CollectionType type, int prefill, int[] removedIndexes)
        {
            // Arrange
            var obj     = Prebuild(type, prefill);
            var encoded = EntryConvert.EncodeObject(obj);

            // Act
            var colEntry = CollectionEntry(encoded.SubEntries, type);

            if (type == CollectionType.Dictionary)
            {
                colEntry.SubEntries.RemoveAll(e => removedIndexes.Contains(int.Parse(e.Identifier) - 1));
            }
            else
            {
                colEntry.SubEntries.RemoveAll(e => removedIndexes.Contains(int.Parse(e.Identifier)));
            }
            EntryConvert.UpdateInstance(obj, encoded);

            // Assert
            var collection = ExtractCollection(type, obj);
            var totalSize  = prefill - removedIndexes.Length;

            Assert.AreEqual(totalSize, collection.Count, "New size invalid");


            if (type == CollectionType.Dictionary)
            {
                var array = (collection as IEnumerable <KeyValuePair <int, SubClass> >).ToArray();
                for (var i = 0; i < prefill; i++)
                {
                    if (removedIndexes.Contains(i))
                    {
                        continue;
                    }

                    var match = array.FirstOrDefault(e => e.Key == i + 1);
                    Assert.NotNull(match);
                }
            }
            else
            {
                var array = (collection as IEnumerable <SubClass>).ToArray();
                for (var i = 0; i < prefill; i++)
                {
                    if (removedIndexes.Contains(i))
                    {
                        continue;
                    }

                    var match = array.FirstOrDefault(e => e.Foo == i + 1);
                    Assert.NotNull(match);
                }
            }
        }
        public void UpdateDictionary()
        {
            // Arrange
            var dummy = new DictionaryClass
            {
                SubDictionary = new Dictionary <string, int>
                {
                    { "077", 6 },
                    { "088", 9 }
                },
                EnumDictionary = new Dictionary <string, DummyEnum>
                {
                    { "011", DummyEnum.Unset },
                    { "022", DummyEnum.ValueB }
                }
            };

            var encoded = EntryConvert.EncodeObject(dummy);

            var entry1 = encoded.SubEntries[1];
            var entry2 = encoded.SubEntries[2];


            for (var i = 1; i <= 2; i++)
            {
                var newInstance = entry1.Prototypes[0].Instantiate();
                newInstance.Value.Current = (1 + i).ToString();
                newInstance.DisplayName   = "Key" + i;
                entry1.SubEntries.Add(newInstance);
            }

            entry1.SubEntries[0].Value.Current = "123";
            entry1.SubEntries[0].DisplayName   = "022";

            for (var i = 1; i <= 3; i++)
            {
                var newInstance = entry2.Prototypes[0].Instantiate();
                newInstance.Value.Current = ((DummyEnum)(i % 3)).ToString();
                newInstance.DisplayName   = "Key_0121" + i;
                entry2.SubEntries.Add(newInstance);
            }

            entry2.SubEntries[0].Value.Current = DummyEnum.ValueA.ToString();
            entry2.SubEntries[0].DisplayName   = "555";

            // Act
            EntryConvert.UpdateInstance(dummy, encoded);

            // Assert
            Assert.AreEqual(5, dummy.EnumDictionary.Count);
            Assert.AreEqual(4, dummy.SubDictionary.Count);
            Assert.AreEqual(123, dummy.SubDictionary["022"]);
            Assert.AreEqual(DummyEnum.ValueA, dummy.EnumDictionary["555"]);
        }
예제 #21
0
        /// <summary>
        /// Check if a property is a collection of primitives
        /// </summary>
        private static bool IsPrimitiveCollection(Type memberType)
        {
            if (!EntryConvert.IsCollection(memberType))
            {
                return(false);
            }

            var elementType = EntryConvert.ElementType(memberType);

            return(EntryConvert.ValueOrStringType(elementType));
        }
예제 #22
0
        public IProductRecipe ConvertRecipeBack(RecipeModel recipe, IProductRecipe productRecipe, IProductType productType)
        {
            productRecipe.Name     = recipe.Name;
            productRecipe.Revision = recipe.Revision;
            productRecipe.State    = recipe.State;

            // Only load workplan if it changed
            var workplanRecipe = productRecipe as IWorkplanRecipe;

            if (workplanRecipe != null && workplanRecipe.Workplan?.Id != recipe.WorkplanId)
            {
                workplanRecipe.Workplan = WorkplanManagement.LoadWorkplan(recipe.WorkplanId);
            }

            if (productRecipe.Product == null)
            {
                productRecipe.Product = productType;
            }

            EntryConvert.UpdateInstance(productRecipe, recipe.Properties, RecipeSerialization);

            // Do not update a clones classification
            if (productRecipe.Classification.HasFlag(RecipeClassification.Clone))
            {
                return(productRecipe);
            }

            switch (recipe.Classification)
            {
            case RecipeClassificationModel.Unset:
                productRecipe.Classification = RecipeClassification.Unset;
                break;

            case RecipeClassificationModel.Default:
                productRecipe.Classification = RecipeClassification.Default;
                break;

            case RecipeClassificationModel.Alternative:
                productRecipe.Classification = RecipeClassification.Alternative;
                break;

            case RecipeClassificationModel.Intermediate:
                productRecipe.Classification = RecipeClassification.Intermediate;
                break;

            case RecipeClassificationModel.Part:
                productRecipe.Classification = RecipeClassification.Part;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(productRecipe);
        }
        private IImportParameters ConvertParametersBack(string importerName, Entry currentParameters, bool updateFirst = false)
        {
            var importer   = Manager.Importers.First(i => i.Name == importerName);
            var parameters = (IImportParameters)EntryConvert.UpdateInstance(importer.Parameters, currentParameters);

            if (updateFirst)
            {
                parameters = importer.Update(parameters);
            }
            return(parameters);
        }
        public void UpdateEntries(CollectionType type)
        {
            // Arrange
            var obj     = Prebuild(type, 3);
            var encoded = EntryConvert.EncodeObject(obj);

            // Act
            var colEntry = CollectionEntry(encoded.SubEntries, type);

            if (type == CollectionType.Dictionary)
            {
                foreach (var entry in colEntry.SubEntries)
                {
                    //change "Key" + 10
                    entry.DisplayName = "1" + entry.SubEntries[0].Value.Current;
                    // change "Value"
                    entry.SubEntries[0].Value.Current = "1" + entry.SubEntries[0].Value.Current;
                    entry.SubEntries[1].Value.Current = entry.SubEntries[1].Value.Possible[2];
                }

                EntryConvert.UpdateInstance(obj, encoded);

                // Assert
                var collection = ExtractCollection(type, obj);

                for (var i = 0; i < collection.Count; i++)
                {
                    Assert.IsTrue(obj.SubDictionary.ContainsKey(11 + i));
                    Assert.AreEqual((float)11 + i, obj.SubDictionary[11 + i].Foo);
                    Assert.AreEqual(DummyEnum.ValueB, obj.SubDictionary[11 + i].Enum);
                }
            }
            else
            {
                foreach (var entry in colEntry.SubEntries)
                {
                    entry.SubEntries[0].Value.Current = "1" + entry.SubEntries[0].Value.Current;
                    entry.SubEntries[1].Value.Current = entry.SubEntries[1].Value.Possible[2];
                }
                EntryConvert.UpdateInstance(obj, encoded);

                // Assert
                var collection = ExtractCollection(type, obj);

                var array = (collection as IEnumerable <SubClass>).ToArray();

                for (var i = 0; i < collection.Count; i++)
                {
                    Assert.AreEqual((float)11 + i, array[i].Foo);
                    Assert.AreEqual(DummyEnum.ValueB, array[i].Enum);
                }
            }
        }
        public MethodEntry[] GetMethods(string moduleName)
        {
            var methods      = new MethodEntry[] {};
            var serverModule = GetModuleFromManager(moduleName);

            if (serverModule?.Console != null)
            {
                methods = EntryConvert.EncodeMethods(serverModule.Console, CreateEditorSerializeSerialization(serverModule)).ToArray();
            }

            return(methods);
        }
        public void SurviveGetterException()
        {
            // Arrange
            var dummy = new ExceptionDummy();

            // Act
            var encoded = EntryConvert.EncodeObject(dummy);

            // Assert
            Assert.NotNull(encoded);
            Assert.AreEqual(EntryValueType.Exception, encoded.SubEntries[0].Value.Type);
            Assert.NotNull(encoded.SubEntries[0].Value.Current);
        }
 public ActionResult <ProductCustomization> GetProductCustomization()
 {
     return(new ProductCustomization
     {
         ProductTypes = GetProductTypes(),
         RecipeTypes = GetRecipeTypes(),
         Importers = _productManagement.Importers.Select(i => new ProductImporter
         {
             Name = i.Key,
             Parameters = EntryConvert.EncodeObject(i.Value)
         }).ToArray()
     });
 }
        private object ConvertParametersBack(string importerName, Entry currentParameters)
        {
            var oldParameters = _productManagement.Importers.FirstOrDefault(i => i.Key == importerName).Value;

            if (oldParameters == null)
            {
                return(null);
            }

            var parameters = EntryConvert.UpdateInstance(oldParameters, currentParameters);

            return(parameters);
        }
        /// <summary>
        /// Get all reference overrides from a resources properties
        /// </summary>
        private static Dictionary <string, List <Type> > GetReferenceOverrides(IEnumerable <PropertyInfo> properties)
        {
            // TODO Type wrappers in AL5
            var referenceOverrides = (from prop in properties
                                      let overrideAtt = prop.GetCustomAttribute <ReferenceOverrideAttribute>()
                                                        where overrideAtt != null
                                                        let targetType = typeof(IEnumerable <IResource>).IsAssignableFrom(prop.PropertyType)
                                        ? EntryConvert.ElementType(prop.PropertyType) : prop.PropertyType
                                                                         group targetType by overrideAtt.Source into g
                                                                         select new { g.Key, overrides = g.ToList() }).ToDictionary(v => v.Key, v => v.overrides);

            return(referenceOverrides);
        }
        public void NonLocalized()
        {
            // Arrange
            var dummyClass = new DummyClass();

            // Act
            Thread.CurrentThread.CurrentUICulture = _germanCulture;
            var entriesGerman = EntryConvert.EncodeObject(dummyClass);

            // Assert
            Assert.AreEqual(nameof(DummyClass.SingleClassNonLocalized), entriesGerman.SubEntries[14].DisplayName);
            Assert.IsNull(entriesGerman.SubEntries[14].Description);
        }