public void ReplaceDeserializedObject(string id, object?oldObj, object?newObj)
        {
            if (object.ReferenceEquals(oldObj, newObj))
            {
                return;
            }

            if (id != Globals.NewObjectId)
            {
                // In certain cases (IObjectReference, SerializationSurrogate or DataContractSurrogate),
                // an object can be replaced with a different object once it is deserialized. If the
                // object happens to be referenced from within itself, that reference needs to be updated
                // with the new instance. BinaryFormatter supports this by fixing up such references later.
                // These XmlObjectSerializer implementations do not currently support fix-ups. Hence we
                // throw in such cases to allow us add fix-up support in the future if we need to.
                if (DeserializedObjects.IsObjectReferenced(id))
                {
                    string oldType = (oldObj != null) ? DataContract.GetClrTypeFullName(oldObj.GetType()) : SR.UnknownNullType;
                    string newType = (newObj != null) ? DataContract.GetClrTypeFullName(newObj.GetType()) : SR.UnknownNullType;
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.Format(SR.FactoryObjectContainsSelfReference, oldType, newType, id)));
                }
                DeserializedObjects.Remove(id);
                DeserializedObjects.Add(id, newObj);
            }
        }
示例#2
0
        public static void InitializeClass(TestContext context)
        {
            string    path          = @"../../Classes/Xml/TestXML/testMSystemDescription.xml";
            XDocument inventoryFile = XDocument.Load(path);

            v_TestDeserializedMSystemObjects = new DeserializedObjects(inventoryFile, path);
        }
 internal void AddNewObjectWithId(string id, object?obj)
 {
     if (id != Globals.NewObjectId)
     {
         DeserializedObjects.Add(id, obj);
     }
 }
        public void ReplaceDeserializedObject(string id, object?oldObj, object?newObj)
        {
            if (object.ReferenceEquals(oldObj, newObj))
            {
                return;
            }

            if (id != Globals.NewObjectId)
            {
                // In certain cases (IObjectReference, SerializationSurrogate or DataContractSurrogate),
                // an object can be replaced with a different object once it is deserialized. If the
                // object happens to be referenced from within itself, that reference needs to be updated
                // with the new instance. BinaryFormatter supports this by fixing up such references later.
                // These XmlObjectSerializer implementations do not currently support fix-ups. Hence we
                // throw in such cases to allow us add fix-up support in the future if we need to.
                if (DeserializedObjects.IsObjectReferenced(id))
                {
                    // https://github.com/dotnet/runtime/issues/41465 - oldObj or newObj may be null below - suppress compiler error by asserting non-null
                    Debug.Assert(oldObj != null && newObj != null);
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.Format(SR.FactoryObjectContainsSelfReference, DataContract.GetClrTypeFullName(oldObj.GetType()), DataContract.GetClrTypeFullName(newObj.GetType()), id)));
                }
                DeserializedObjects.Remove(id);
                DeserializedObjects.Add(id, newObj);
            }
        }
示例#5
0
 public void Initialize()
 {
     mSystemObjects               = new DeserializedObjects(mSystemDescription, _path);
     m_testMSystem                = new MSystem(mSystemObjects);
     m_tilesWorld                 = new TilesWorld(m_testMSystem);
     m_floatingObjWorld           = new FloatingObjectsWorld(m_testMSystem, m_tilesWorld);
     m_tilesWorld.FltObjectsWorld = m_floatingObjWorld;
 }
示例#6
0
        public static void InitializeClass(TestContext context)
        {
            string    path = @"../../Classes/Xml/TestXML/testMSystemDescription.xml";
            XDocument mSystemDescription = XDocument.Load(path);
            var       mSystemObjects     = new DeserializedObjects(mSystemDescription, path);

            _testMSystem = new MSystem(mSystemObjects);
        }
        internal object GetExistingObject(string id, Type?type, string?name, string?ns)
        {
            object?retObj = DeserializedObjects.GetObject(id);

            if (retObj == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.Format(SR.DeserializedObjectWithIdNotFound, id)));
            }
            return(retObj);
        }
示例#8
0
        public void TestThatInventoryFileIsDeserializable()
        {
            //Key of this test is to use oficial published inventory file.
            //DO NOT USE TEST XMLs.
            string    path = @"..\..\..\Cytos_v2\Examples\MSystemDescription.xml";
            XDocument mSystemDescription = XDocument.Load(path);
            // ReSharper disable once UnusedVariable
            DeserializedObjects testDeserializedObjects = new DeserializedObjects(mSystemDescription, path);

            //No assert needed, tests only ability to deserialize invenoty file
        }
示例#9
0
 /// <summary>
 /// Simulation constructor.
 /// </summary>
 /// <param name="mSystemObjects">Deserialized M System objects.</param>
 /// <exception cref="ArgumentException">
 /// If M System objects objecst list is null.
 /// </exception>
 protected SimulationWorld(DeserializedObjects mSystemObjects)
 {
     if (mSystemObjects == null)
     {
         throw new ArgumentException("M System objects can't be null");
     }
     SimulationMSystem = new MSystem(mSystemObjects);
     TilesWorld        = new TilesWorld(SimulationMSystem);
     FltObjectsWorld   = new FloatingObjectsWorld(SimulationMSystem, TilesWorld);
     // The TilesWorld and FltObjectsWorld need to crossref.
     TilesWorld.FltObjectsWorld = FltObjectsWorld;
 }
        private object GetExistingObjectOrExtensionData(string id)
        {
            object?retObj = DeserializedObjects.GetObject(id);

            if (retObj == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                          XmlObjectSerializer.CreateSerializationException(SR.Format(SR.DeserializedObjectWithIdNotFound, id)));
            }

            return(retObj);
        }
示例#11
0
文件: Main.cs 项目: mmaverikk/Cytos
        /// <summary>
        /// --- Load example -> M System description - Click event ---
        /// Opens OpenFileDialog, M System description file and deserialize input.
        /// </summary>
        /// <param name="sender">Event sender.</param>
        /// <param name="e">Event parameter.</param>
        private void mSystemDescriptionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter      = "XML Files (.xml)|*.xml";
                openFileDialog.Multiselect = false;
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    //Check if selected file is really evolution file.
                    XDocument doc = XDocument.Load(openFileDialog.FileName);
                    if (doc.Element("root") == null)
                    {
                        throw new InvalidOperationException("Selected file is not an M System description file.");
                    }
                    v_MSystemObjectsPath = openFileDialog.FileName;

                    //XSD validation
                    if (v_ValidateUsingXSD)
                    {
                        string errorsAndWarnings;
                        if (!XmlValidator.Validate(v_MSystemObjectsPath, v_XSDPath, out errorsAndWarnings))
                        {
                            throw new ValidationFailed(errorsAndWarnings);
                        }
                    }

                    string errorMessage;
                    IDeserializedObjects deserializedObjects = Xmlizer.Deserialize(v_MSystemObjectsPath, out errorMessage);
                    if (deserializedObjects == null)
                    {
                        richTextBoxMSystem.Text = errorMessage;
                        return;
                    }
                    v_MSystemObjects = TypeUtil.Cast <DeserializedObjects>(deserializedObjects);
                    RestartSimulator();

                    richTextBoxMSystem.Text = v_Simulator.MSystemToString();
                    VisualizeLogging.LogMessageAndVisualize("Deserialization of M System description file was successful.");
                    VisualizeLogging.LogMessageAndVisualize(string.Format("File: {0}", openFileDialog.FileName));
                }
            }
            catch (Exception exception)
            {
                ExceptionWindow.Show(exception);
            }
        }
示例#12
0
        /// <summary>
        /// P system constructor used during simulation.
        /// </summary>
        /// <param name="mSystemObjects">Deserialized M System objects.</param>
        /// <exception cref="ArgumentException">
        /// If M System objects objecst list is null.
        /// </exception>
        public MSystem(DeserializedObjects mSystemObjects)
        {
            if (mSystemObjects == null)
            {
                throw new ArgumentException("M System objects can't be null.");
            }
            // New copies of seed tiles must be created here!
            SeedTiles            = mSystemObjects.SeedTiles.Select(tile => new TileInSpace((Tile)tile, tile.Position, tile.Quaternion)).ToList();
            GlueRadius           = mSystemObjects.GlueRadius;
            TilingRandomMovement = mSystemObjects.TilingRandomMovement;
            Tau                 = mSystemObjects.Tau;
            Nu0                 = mSystemObjects.Nu0;
            PushingCoef         = mSystemObjects.PushingCoef;
            RandomizeConnectors = mSystemObjects.RandomizeConnectors;

            FloatingObjects = new ReadOnlyDictionary <string, FloatingObject>(mSystemObjects.FloatingObjects);
            if (FloatingObjects.Any())
            {
                Mobility = FloatingObjects.Values.Max(obj => obj.Mobility);
            }
            RefillEnvironment = mSystemObjects.RefillEnvironment;
            v_Proteins        = new ReadOnlyDictionary <string, Protein>(mSystemObjects.Proteins);
            Tiles             = new ReadOnlyDictionary <string, Tile>(mSystemObjects.Tiles);
            GlueRelation      = mSystemObjects.GluePRelation;
            v_EvolutionRules  = mSystemObjects.EvolutionRules;

            //======================================================================
            MetabolicRules = new Dictionary <string, IReadOnlyList <EvoMetabolicRule> >();
            foreach (string proteinName in v_Proteins.Keys)
            {
                MetabolicRules[proteinName] = v_EvolutionRules.OfType <EvoMetabolicRule>().Where(rule => proteinName == rule.RProtein.Name).ToList();
            }

            //======================================================================
            CreationRules = new Dictionary <Glue, IReadOnlyList <EvoNonMetabolicRule> >();
            foreach (Glue glue in mSystemObjects.Glues.Values)
            {
                var creationRules = v_EvolutionRules.OfType <EvoNonMetabolicRule>().Where(rule => rule.Type == EvolutionRule.RuleType.Create).ToList();
                CreationRulesPriorities = new SortedSet <int>(creationRules.Select(rule => rule.Priority));
                CreationRules[glue]     = creationRules.Where(rule => rule.RightSideObjects.OfType <Tile>().Single()
                                                              .Connectors.Any(connector => GlueRelation.ContainsKey(Tuple.Create(glue, connector.Glue))))
                                          .ToList();
            }

            //======================================================================
            InsertionRules = new Dictionary <Glue, Dictionary <Glue, IReadOnlyList <EvoNonMetabolicRule> > >();
            foreach (Glue glue1 in mSystemObjects.Glues.Values)
            {
                foreach (Glue glue2 in mSystemObjects.Glues.Values)
                {
                    var insRules = v_EvolutionRules.OfType <EvoNonMetabolicRule>()
                                   .Where(rule => (rule.Type == EvolutionRule.RuleType.Insert) &&
                                          IsInsertable(rule.RightSideObjects.OfType <Tile>().Single(), glue1, glue2))
                                   .ToList();
                    if (insRules.Any())
                    {
                        AddRulesToDictionary(InsertionRules, glue1, glue2, insRules);
                        AddRulesToDictionary(InsertionRules, glue2, glue1, insRules);
                    }
                }
            }

            //======================================================================
            DestructionRules = new Dictionary <string, IReadOnlyList <EvoNonMetabolicRule> >();
            foreach (string tileName in Tiles.Keys)
            {
                DestructionRules[tileName] = v_EvolutionRules.OfType <EvoNonMetabolicRule>().Where(rule => (rule.Type == EvolutionRule.RuleType.Destroy) &&
                                                                                                   rule.LeftSideObjects.OfType <Tile>().Single().Name == tileName).ToList();
            }

            //======================================================================
            DivisionRules = new Dictionary <Glue, Dictionary <Glue, IReadOnlyList <EvoNonMetabolicRule> > >();
            foreach (Glue glue1 in mSystemObjects.Glues.Values)
            {
                foreach (Glue glue2 in mSystemObjects.Glues.Values)
                {
                    var divRules = v_EvolutionRules.OfType <EvoNonMetabolicRule>()
                                   .Where(rule => (rule.Type == EvolutionRule.RuleType.Divide) &&
                                          glue1 == (Glue)rule.RightSideObjects[0] &&
                                          glue2 == (Glue)rule.RightSideObjects[1])
                                   .ToList();
                    if (divRules.Any())
                    {
                        AddRulesToDictionary(DivisionRules, glue1, glue2, divRules);
                        AddRulesToDictionary(DivisionRules, glue2, glue1, divRules);
                    }
                }
            }
        }
示例#13
0
 //Initialize object/s before each test is run. It will be called for each test.
 public void Initialize()
 {
     _testDeserializedMSystemObjects = new DeserializedObjects(_mSystemDescription, _path);
     _testMSystem   = new MSystem(_testDeserializedMSystemObjects);
     _testSimulator = new SimulatorFacade(_testDeserializedMSystemObjects);
 }
示例#14
0
 internal SimulatorFacade(DeserializedObjects mSystemObjects) :
     base(mSystemObjects, false)
 {
 }
示例#15
0
        public void TestDeserializationCreatesObjectWithCorrectValues()
        {
            //NOTE: We cannot test equivalence of objects as objects contains readonly parameters, which are never equal.
            //Due to this limitation we test only values of parameters.

            string              path = @"../../Classes/Xml/TestXML/testMSystemDescription.xml";
            XDocument           mSystemDescription      = XDocument.Load(path);
            DeserializedObjects testDeserializedObjects = new DeserializedObjects(mSystemDescription, path);

            //Floating objects
            Dictionary <string, FloatingObject> floatingObjects = testDeserializedObjects.FloatingObjects;

            Assert.AreEqual(3, floatingObjects.Count);
            Assert.AreEqual("a", floatingObjects["a"].Name);
            Assert.AreEqual(0, floatingObjects["a"].Concentration);
            Assert.AreEqual(2, floatingObjects["a"].Mobility);

            Assert.AreEqual("b", floatingObjects["b"].Name);
            Assert.AreEqual(2, floatingObjects["b"].Concentration);
            Assert.AreEqual(3, floatingObjects["b"].Mobility);

            //Proteins
            Dictionary <string, Protein> proteins = testDeserializedObjects.Proteins;

            Assert.AreEqual(2, proteins.Count);

            Assert.AreEqual("p1", proteins["p1"].Name);
            Assert.AreEqual("p2", proteins["p2"].Name);

            //Glues
            Dictionary <string, Glue> glues = testDeserializedObjects.Glues;

            Assert.AreEqual(3, glues.Count);

            Assert.AreEqual("pa", glues["pa"].Name);
            Assert.AreEqual("pb", glues["pb"].Name);
            Assert.AreEqual("px", glues["px"].Name);

            //Tiles
            Dictionary <string, Tile> tiles = testDeserializedObjects.Tiles;

            Assert.AreEqual(3, tiles.Count);

            Tile tileQ1 = tiles["q1"];

            //Connectors
            var connectors = tileQ1.Connectors;

            Assert.AreEqual(6, connectors.Count);

            var connectorC1 = connectors[0];

            Assert.AreEqual("c1", connectorC1.Name);
            Assert.AreEqual(Tile.SideType.undef, connectorC1.Side);
            Assert.AreEqual(glues["pa"], connectorC1.Glue);
            Assert.AreEqual(Angle.FromRadians(2.034443935795703), connectorC1.Angle);
            Assert.AreEqual(2, connectorC1.Positions.Count);
            Assert.AreEqual(new Point3D(0, 10, 0), connectorC1.Positions[0]);
            double posY = 10 * Math.Cos((1) * 2 * Math.PI / 5);
            double posX = 10 * Math.Sin((1) * 2 * Math.PI / 5);

            Assert.AreEqual(new Point3D(posX, posY, 0), connectorC1.Positions[1]);

            //Surface glue
            Glue surfaceGLuePx = tileQ1.SurfaceGlue;

            Assert.AreEqual("px", surfaceGLuePx.Name);

            //Proteins
            Assert.AreEqual(4, tileQ1.Proteins.Count);
            Assert.AreEqual("p1", tileQ1.Proteins[0].Name);
            Assert.AreEqual("p1", tileQ1.Proteins[1].Name);
            Assert.AreEqual("p2", tileQ1.Proteins[2].Name);
            Assert.AreEqual("p2", tileQ1.Proteins[3].Name);
            foreach (var protein in tileQ1.Proteins)
            {
                Assert.AreEqual(Point3D.Origin, protein.Position);
            }

            Assert.AreEqual(Color.DeepSkyBlue, tileQ1.Color);


            Tile tileS1 = tiles["s1"];

            Assert.AreEqual(2, tileS1.Connectors.Count);
            Assert.AreEqual(1, tileS1.Proteins.Count);

            //Initial objects
            List <TileInSpace> seedTiles = testDeserializedObjects.SeedTiles;

            Assert.AreEqual(3, seedTiles.Count);
            var seedTileQ1 = seedTiles[0];

            Assert.AreEqual("q1", seedTileQ1.Name);
            Assert.AreEqual(new Point3D(0, 0, 0), seedTileQ1.Position.Round());
            Assert.AreEqual(new EulerAngles(default(Angle), default(Angle), default(Angle)), seedTileQ1.Quaternion.ToEulerAngles());

            //Others
            Assert.AreEqual(0.1, testDeserializedObjects.GlueRadius);

            //Glue tuples
            GlueRelation glueTuples = testDeserializedObjects.GluePRelation;

            Assert.AreEqual(3, glueTuples.Count);

            Tuple <Glue, Glue> glueTuplePaPb = glueTuples.Keys.ElementAt(0);

            Assert.AreEqual("pa", glueTuplePaPb.Item1.Name);
            Assert.AreEqual("pb", glueTuplePaPb.Item2.Name);
            Assert.AreEqual(1, glueTuples.Values.ElementAt(0).ToDictionary()["a"]);

            Tuple <Glue, Glue> glueTuplePaPa = glueTuples.Keys.ElementAt(1);

            Assert.AreEqual("pa", glueTuplePaPa.Item1.Name);
            Assert.AreEqual("pa", glueTuplePaPa.Item2.Name);
            Assert.AreEqual(1, glueTuples.Values.ElementAt(1).ToDictionary().Count);

            Tuple <Glue, Glue> glueTuplePbPb = glueTuples.Keys.ElementAt(2);

            Assert.AreEqual("pb", glueTuplePbPb.Item1.Name);
            Assert.AreEqual("pb", glueTuplePbPb.Item2.Name);
            Assert.AreEqual(0, glueTuples.Values.ElementAt(2).ToDictionary().Count);

            //Evo rules
            List <EvolutionRule> evoRules = testDeserializedObjects.EvolutionRules;

            Assert.AreEqual(4, evoRules.Count);

            EvoMetabolicRule metabolicRule = TypeUtil.Cast <EvoMetabolicRule>(evoRules[0]);

            Assert.AreEqual(0, metabolicRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Metabolic, metabolicRule.Type);
            Assert.AreEqual(EvoMetabolicRule.MetabolicRuleType.Symport, metabolicRule.SubType);
            Assert.AreEqual(2, metabolicRule.LeftSideObjects.Count);
            Assert.AreEqual("a", metabolicRule.LeftSideObjects[0].Name);
            Assert.AreEqual("p1", metabolicRule.LeftSideObjects[1].Name);
            Assert.AreEqual(2, metabolicRule.RightSideObjects.Count);
            Assert.AreEqual("p1", metabolicRule.RightSideObjects[0].Name);
            Assert.AreEqual("a", metabolicRule.RightSideObjects[1].Name);
            Assert.AreEqual(0, metabolicRule.MLeftInNames.Count);
            Assert.AreEqual(1, metabolicRule.MLeftOutNames.Count);
            Assert.AreEqual(1, metabolicRule.MLeftOutNames.ToDictionary()["a"]);
            Assert.AreEqual(1, metabolicRule.MRightInNames.Count);
            Assert.AreEqual(1, metabolicRule.MRightInNames.ToDictionary()["a"]);
            Assert.AreEqual(0, metabolicRule.MRightOutNames.Count);
            Assert.AreEqual("p1", metabolicRule.RProtein.Name);

            EvoNonMetabolicRule createRule = TypeUtil.Cast <EvoNonMetabolicRule>(evoRules[1]);

            Assert.AreEqual(1, createRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Create, createRule.Type);
            Assert.AreEqual(3, createRule.LeftSideObjects.Count);
            Assert.AreEqual("a", createRule.LeftSideObjects[0].Name);
            Assert.AreEqual("a", createRule.LeftSideObjects[1].Name);
            Assert.AreEqual("a", createRule.LeftSideObjects[2].Name);
            Assert.AreEqual(1, createRule.RightSideObjects.Count);
            Assert.AreEqual("q1", createRule.RightSideObjects[0].Name);
            Assert.AreEqual(3, createRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(3, createRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(0, createRule.MRightSideFloatingNames.Count);

            EvoNonMetabolicRule divideRule = TypeUtil.Cast <EvoNonMetabolicRule>(evoRules[2]);

            Assert.AreEqual(1, divideRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Divide, divideRule.Type);
            Assert.AreEqual(4, divideRule.LeftSideObjects.Count);
            Assert.AreEqual("pa", divideRule.LeftSideObjects[0].Name);
            Assert.AreEqual("pa", divideRule.LeftSideObjects[1].Name);
            Assert.AreEqual("a", divideRule.LeftSideObjects[2].Name);
            Assert.AreEqual("a", divideRule.LeftSideObjects[3].Name);
            Assert.AreEqual(2, divideRule.RightSideObjects.Count);
            Assert.AreEqual("pa", divideRule.RightSideObjects[0].Name);
            Assert.AreEqual("pa", divideRule.RightSideObjects[1].Name);
            Assert.AreEqual(2, divideRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(2, divideRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(0, divideRule.MRightSideFloatingNames.Count);

            EvoNonMetabolicRule destroyRule = TypeUtil.Cast <EvoNonMetabolicRule>(evoRules[3]);

            Assert.AreEqual(1, destroyRule.Priority);
            Assert.AreEqual(EvolutionRule.RuleType.Destroy, destroyRule.Type);
            Assert.AreEqual(3, destroyRule.LeftSideObjects.Count);
            Assert.AreEqual("a", destroyRule.LeftSideObjects[0].Name);
            Assert.AreEqual("a", destroyRule.LeftSideObjects[1].Name);
            Assert.AreEqual("s1", destroyRule.LeftSideObjects[2].Name);
            Assert.AreEqual(2, destroyRule.RightSideObjects.Count);
            Assert.AreEqual("c", destroyRule.RightSideObjects[0].Name);
            Assert.AreEqual("c", destroyRule.RightSideObjects[1].Name);
            Assert.AreEqual(2, destroyRule.MLeftSideFloatingNames.Count);
            Assert.AreEqual(2, destroyRule.MLeftSideFloatingNames.ToDictionary()["a"]);
            Assert.AreEqual(2, destroyRule.MRightSideFloatingNames.Count);
            Assert.AreEqual(2, destroyRule.MRightSideFloatingNames.ToDictionary()["c"]);
        }