public void TestClear()
        {
            SOComponent component = new SOComponent("0001");

            // Components should not be null
            Assert.NotNull(component.Parts);

            // Components should be empty on the start
            Assert.IsEmpty(component.SubComponents);
            Assert.IsEmpty(component.Parts);

            // Add a subcomponent to the component
            SOComponent subcomponent = new SOComponent("0001");
            component.AddSubComponent(subcomponent);

            // Components should no longer be empty
            Assert.IsNotEmpty(component.SubComponents);
            Assert.AreEqual(1, component.SubComponents.Length);
            Assert.IsInstanceOf(typeof(SOComponent), component.SubComponents[0]);
            Assert.AreEqual(subcomponent, component.SubComponents[0]);

            // Add a part to the component
            SOPart part = new SOPart("0001", new SOMaterial("steel"), 1, "kg");
            component.AddPart(part);

            // Parts should no longer be empty
            Assert.IsNotEmpty(component.Parts);
            Assert.AreEqual(1, component.Parts.Length);
            Assert.IsInstanceOf(typeof(SOPart), component.Parts[0]);
            Assert.AreEqual(part, component.Parts[0]);

            // Clear the component
            component.Clear();

            // Components should be empty
            Assert.IsEmpty(component.SubComponents);

            // Parts should be empty
            Assert.IsEmpty(component.Parts);
        }
        public void TestFlattenedComponents()
        {
            SODesignAlternative alternative = new SODesignAlternative("default");

            // Components should not be null
            Assert.NotNull(alternative.Components);

            // Components should be empty on the start
            Assert.IsEmpty(alternative.Components);

            // Add a component
            SOComponent component1 = new SOComponent("0001");
            SOComponent component2 = new SOComponent("0002");
            SOComponent component3 = new SOComponent("0003");
            SOComponent component4 = new SOComponent("0004");
            SOComponent component5 = new SOComponent("0005");
            alternative.AddComponent(component1);
            component1.AddSubComponent(component2);
            component2.AddSubComponent(component3);
            component1.AddSubComponent(component4);
            alternative.AddComponent(component5);

            // FlattenedComponents should contain a list of 5 components now
            Assert.IsNotEmpty(alternative.FlattenedComponents);
            Assert.AreEqual(5, alternative.FlattenedComponents.Length);
        }
        public void TestPassOnFlattenedSubComponents()
        {
            // set up
            SOComponent component0 = new SOComponent("0000");
            SOComponent component1 = new SOComponent("0001");
            SOComponent component2 = new SOComponent("0002");
            SOComponent component3 = new SOComponent("0003");
            SOComponent component4 = new SOComponent("0004");
            SOComponent component5 = new SOComponent("0005");
            component0.AddSubComponent(component1);
            component1.AddSubComponent(component2);
            component2.AddSubComponent(component3);
            component1.AddSubComponent(component4);
            component0.AddSubComponent(component5);

            // get the flattened list
            List<SOComponent> flattenedList = null;
            component0.PassOnFlattenedSubComponents(ref flattenedList);

            // flattened list should contain 5 items
            Assert.IsNotEmpty(flattenedList);
            Assert.AreEqual(5, flattenedList.Count);
        }
        public void TestSubComponents()
        {
            SOComponent component = new SOComponent("0001");

            // Components should not be null
            Assert.NotNull(component.SubComponents);

            // Components should be empty on the start
            Assert.IsEmpty(component.SubComponents);

            // Add a subcomponent to the component
            SOComponent subcomponent = new SOComponent("0001");
            component.AddSubComponent(subcomponent);

            // Components should no longer be empty
            Assert.IsNotEmpty(component.SubComponents);
            Assert.AreEqual(1, component.SubComponents.Length);
            Assert.IsInstanceOf(typeof(SOComponent), component.SubComponents[0]);
            Assert.AreEqual(subcomponent, component.SubComponents[0]);

            // Clear the subcomponents
            component.ClearSubComponents();

            // Components should be empty
            Assert.IsEmpty(component.SubComponents);
        }
        /// <summary>
        /// Overriding the RunDesigner method.
        /// This method will be run by the framework to make the design.
        /// </summary>
        public override void RunDesigner()
        {
            // It is important that you run the base designer
            base.RunDesigner();

            // Adding a structure and two beams with the designer
            SOComponent structure = new SOComponent("structure");
            this.CurrentDesignAlternative.AddComponent(structure);

            for (int i = 0; i < this.NumberOfFrames; i++)
            {
                // Set up the points
                SOPoint3d point1 = new SOPoint3d(basePoint.X + ((double)i * Spacing), basePoint.Y, basePoint.Z);
                SOPoint3d point2 = new SOPoint3d(basePoint.X + ((double)i * Spacing), basePoint.Y, basePoint.Z + Height);
                SOPoint3d point3 = new SOPoint3d(basePoint.X + ((double)i * Spacing), basePoint.Y + Span, basePoint.Z);
                SOPoint3d point4 = new SOPoint3d(basePoint.X + ((double)i * Spacing), basePoint.Y + Span, basePoint.Z + Height);

                // Adding a beam layer to the structure
                SOComponent beam = new SOComponent("beams");
                structure.AddSubComponent(beam);

                // Adding a beam to the beam layer
                beam.AddPart(new Beam_HE400A(point2, point4));

                // Adding a set of columns to the structure
                SOComponent columns = new SOComponent("columns");
                structure.AddSubComponent(columns);

                // Adding two columns to the column set
                columns.AddPart(new Beam_HE320A(point1, point2));
                columns.AddPart(new Beam_HE320A(point3, point4));

                this.points1.Add(point1);
                this.points2.Add(point2);
                this.points3.Add(point3);
                this.points4.Add(point4);
            }
        }