public void SaveCanalConfiguration(Canal canal, string saveLocation)
        {
            if (!Directory.Exists(saveLocation))
            {
                Directory.CreateDirectory(saveLocation);
            }

            string        xml;
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(CanalConfiguration));

            CanalConfigurationConverter converter = new CanalConfigurationConverter();

            CanalConfiguration canalConfiguration = converter.ConvertBack(canal);

            using (var sww = new StringWriter())
            {
                using (XmlWriter writer = XmlWriter.Create(sww))
                {
                    xmlSerializer.Serialize(writer, canalConfiguration);
                    xml = sww.ToString(); // Your XML
                }

                File.WriteAllText(Path.Combine(saveLocation, "CanalConfiguration.xml"), xml);
            }
        }
        private Canal GetAndValidateCanalConfiguration(CanalConfiguration configuration)
        {
            if (string.IsNullOrEmpty(configuration.ConfigId))
            {
                throw new ArgumentNullException(nameof(configuration.ConfigId), "The config Id must have a name");
            }

            if (configuration.Arrows == null ||
                configuration.Arrows.Count == 0 ||
                configuration.Nodes == null ||
                configuration.Nodes.Count == 0)
            {
                throw new ArgumentException($"{typeof(CanalConfiguration).Name} must have arrows and nodes!");
            }

            if (configuration.Arrows.Any(ar => string.IsNullOrEmpty(ar.FromNodeId) ||
                                         string.IsNullOrEmpty(ar.ToNodeId) ||
                                         !configuration.Nodes.Select(nd => nd.NodeId).Contains(ar.FromNodeId) ||
                                         !configuration.Nodes.Select(nd => nd.NodeId).Contains(ar.ToNodeId)))
            {
                throw new ArgumentException($"{typeof(CanalConfiguration).Name} must have nodes configured for all arrows!");
            }

            return(new Canal());
        }
        public void SaveAndLoadConfiguration()
        {
            //  Arrange
            CanalManager canalManager = new CanalManager();

            ConfigurationManager.AppSettings[ServerConfigConsts.RelativeModelsLocation] = "ScienceAndMaths";
            CanalConfigurationLoader loader = new CanalConfigurationLoader();

            loader.CanalManager = canalManager;

            Canal canal = new Canal
            {
                Id = "TestConfig"
            };

            canal.CanelEdges.Add(new CanalEdge()
            {
                Id         = "SourceCanal",
                WaterLevel = 2.9
            });

            canal.CanelEdges.Add(new CanalEdge()
            {
                Id = "EndCanal"
            });

            CanalStretch canalStretch = new CanalStretch("stretch1", 602, 20.32, new RectangularSection(5, 0.028, 0));

            canalStretch.FromNode = canal.CanelEdges.First();
            canalStretch.ToNode   = canal.CanelEdges.Last();

            canal.CanalStretches.Add(canalStretch);

            CanalConfiguration canalConfiguration = new CanalConfiguration();

            canalConfiguration.ConfigId = "TestConfig";

            loader.SaveCanalConfiguration(canal);

            loader.LoadCanalConfiguration();

            Assert.IsNotNull(canalManager.Canal);

            Assert.AreEqual(2, canalManager.Canal.CanelEdges.Count);
            Assert.AreEqual(1, canalManager.Canal.CanalStretches.Count);
        }
        public void TrapezoidSerializingTest()
        {
            //  Arrange
            XmlSerializer      xmlSerializer      = new XmlSerializer(typeof(CanalConfiguration));
            CanalConfiguration canalConfiguration = new CanalConfiguration();

            canalConfiguration.ConfigId = "TestConfig";

            CanalNode initNode = new CanalNode()
            {
                NodeId = "InitNode"
            };
            CanalNode endNode = new CanalNode()
            {
                NodeId = "EndNode"
            };
            CanalArrow arrow = new CanalArrow()
            {
                ArrowId    = "TestArrow",
                Length     = 500.0,
                FromNodeId = initNode.NodeId,
                ToNodeId   = endNode.NodeId
            };

            arrow.CanalSection = new TrapezoidalSectionConfiguration()
            {
                Roughness = 0.028,
                Slope     = 0.001,
                Width     = 5.0,
                Incline   = 0.5
            };
            canalConfiguration.Arrows = new List <CanalArrow>()
            {
                arrow
            };
            canalConfiguration.Nodes = new List <CanalNode>()
            {
                initNode, endNode
            };
            var xml = "";

            //  Act
            using (var sww = new StringWriter())
            {
                using (XmlWriter writer = XmlWriter.Create(sww))
                {
                    xmlSerializer.Serialize(writer, canalConfiguration);
                    xml = sww.ToString(); // Your XML
                }
            }

            //  Assert
            Assert.IsTrue(xml != null);
            CanalConfiguration deserializedConfiguration = null;

            using (StringReader sr = new StringReader(xml))
            {
                deserializedConfiguration = (CanalConfiguration)xmlSerializer.Deserialize(sr);
            }

            Assert.IsTrue(deserializedConfiguration != null);
            Assert.AreEqual(2, deserializedConfiguration.Nodes.Count);
            Assert.AreEqual(1, deserializedConfiguration.Arrows.Count);

            CanalConfigurationConverter converter = new CanalConfigurationConverter();

            var data = converter.Convert(deserializedConfiguration);

            Assert.IsTrue(data != null);
            Assert.AreEqual(2, data.CanelEdges.Count);
            Assert.AreEqual(1, data.CanalStretches.Count);

            canalConfiguration = converter.ConvertBack(data);

            Assert.IsTrue(canalConfiguration != null);
            Assert.AreEqual(2, canalConfiguration.Nodes.Count);
            Assert.AreEqual(1, canalConfiguration.Arrows.Count);
        }
        public void RectangularWithSluidgeGateCompositeSerializingTest()
        {
            //  Arrange
            XmlSerializer      xmlSerializer      = new XmlSerializer(typeof(CanalConfiguration));
            CanalConfiguration canalConfiguration = new CanalConfiguration();

            canalConfiguration.ConfigId = "TestConfig";

            SluiceGateNode initNode = new SluiceGateNode()
            {
                NodeId = "InitNode",
                ContractionCoefficient = 0.8,
                GateOpening            = 0.125,
                RetainedWaterLevel     = 2,
                GateWidth = 2
            };

            CanalNode middleNode = new CanalNode()
            {
                NodeId = "MiddleNode"
            };

            CanalNode endNode = new CanalNode()
            {
                NodeId = "EndNode"
            };
            CanalArrow arrow1 = new CanalArrow()
            {
                ArrowId    = "TestArrow1",
                Length     = 600.0,
                FromNodeId = initNode.NodeId,
                ToNodeId   = middleNode.NodeId
            };

            arrow1.CanalSection = new RectangularSectionConfiguration()
            {
                Roughness = 0.014,
                Slope     = 0.0004,
                Width     = 2.0
            };

            CanalArrow arrow2 = new CanalArrow()
            {
                ArrowId    = "TestArrow2",
                Length     = 600.0,
                FromNodeId = middleNode.NodeId,
                ToNodeId   = endNode.NodeId
            };

            arrow2.CanalSection = new RectangularSectionConfiguration()
            {
                Roughness = 0.014,
                Slope     = 0.0045,
                Width     = 2.0
            };

            canalConfiguration.Arrows = new List <CanalArrow>()
            {
                arrow1, arrow2
            };
            canalConfiguration.Nodes = new List <CanalNode>()
            {
                initNode, middleNode, endNode
            };
            var xml = "";

            //  Act
            using (var sww = new StringWriter())
            {
                using (XmlWriter writer = XmlWriter.Create(sww))
                {
                    xmlSerializer.Serialize(writer, canalConfiguration);
                    xml = sww.ToString(); // Your XML
                }
            }

            //  Assert
            Assert.IsTrue(xml != null);

            CanalConfiguration deserializedConfiguration = null;

            using (StringReader sr = new StringReader(xml))
            {
                deserializedConfiguration = (CanalConfiguration)xmlSerializer.Deserialize(sr);
            }

            Assert.IsTrue(deserializedConfiguration != null);
            Assert.AreEqual(3, deserializedConfiguration.Nodes.Count);
            Assert.AreEqual(2, deserializedConfiguration.Arrows.Count);

            CanalConfigurationConverter converter = new CanalConfigurationConverter();

            var data = converter.Convert(deserializedConfiguration);

            Assert.IsTrue(data != null);
            Assert.AreEqual(3, data.CanelEdges.Count);
            Assert.AreEqual(2, data.CanalStretches.Count);

            canalConfiguration = converter.ConvertBack(data);

            Assert.IsTrue(canalConfiguration != null);
            Assert.AreEqual(3, canalConfiguration.Nodes.Count);
            Assert.AreEqual(2, canalConfiguration.Arrows.Count);
        }