diff --git a/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs b/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs new file mode 100644 index 0000000..1bf396b --- /dev/null +++ b/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs @@ -0,0 +1,46 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OSCADSharp.Solids; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OSCADSharp.UnitTests +{ + [TestClass] + public class OSCADObjectTests + { + [TestMethod] + public void OSCADObject_ChildrenForSimpleStructureYieldsAllChildren() + { + var cube = new Cube(); + var translatedCube = cube.Translate(1, 2, 5); + + //Should contain both translation and Cube + var coloredTranslatedCube = translatedCube.Color("Red"); + List expectedChildren = new List() { cube, translatedCube }; + + var children = coloredTranslatedCube.Children(); + + Assert.IsTrue(children.Contains(cube)); + Assert.IsTrue(children.Contains(translatedCube)); + Assert.IsFalse(children.Contains(coloredTranslatedCube)); + } + + [TestMethod] + public void OSCADObject_ClonesContainChildren() + { + var text = new Text3D("Hi").Rotate(90, 0, 0); + + var clone = text.Clone(); + + //Clone has a child, and it should be the same thing + Assert.IsTrue(clone.Children().Count() == 1); + Assert.IsTrue(clone.Children().FirstOrDefault().GetType() == text.Children().FirstOrDefault().GetType()); + + //But the child should be a different instance + Assert.IsFalse(clone.Children().FirstOrDefault() == text.Children().FirstOrDefault()); + } + } +} diff --git a/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj b/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj index 3dfa9e2..bbd7d8c 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj +++ b/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj @@ -53,6 +53,7 @@ + diff --git a/OSCADSharp/OSCADSharp/OSCADObject.cs b/OSCADSharp/OSCADSharp/OSCADObject.cs index 8358768..04f9097 100644 --- a/OSCADSharp/OSCADSharp/OSCADObject.cs +++ b/OSCADSharp/OSCADSharp/OSCADObject.cs @@ -203,5 +203,32 @@ namespace OSCADSharp { return this.ToString() == other.ToString(); } + + + protected List children = new List(); + /// + /// Returns all children of this OSCADObject + /// + /// + public IEnumerable Children() + { + Stack toTraverse = new Stack(this.children); + List allChildren = new List(); + OSCADObject child = null; + + while(toTraverse.Count > 0) + { + child = toTraverse.Pop(); + allChildren.Add(child); + + foreach (var subChild in child.Children()) + { + toTraverse.Push(subChild); + } + } + + return allChildren; + } + } } diff --git a/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs b/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs index 8ae220f..d9c77cc 100644 --- a/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs +++ b/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs @@ -14,12 +14,11 @@ namespace OSCADSharp.Scripting internal class BlockStatementObject : OSCADObject { private string outerStatement; - private IEnumerable children; internal BlockStatementObject(string outerStatement, IEnumerable children) { this.outerStatement = outerStatement; - this.children = children; + this.children = children.ToList(); } public override string ToString() diff --git a/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs b/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs index b097b33..7b45b64 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs @@ -30,6 +30,8 @@ namespace OSCADSharp.Transforms this.obj = obj; this.ColorName = color; this.Opacity = opacity; + + this.children.Add(obj); } public override string ToString() @@ -41,7 +43,7 @@ namespace OSCADSharp.Transforms public override OSCADObject Clone() { - return new ColoredObject(this.obj, this.ColorName, this.Opacity); + return new ColoredObject(this.obj.Clone(), this.ColorName, this.Opacity); } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/LinearExtrudedObject.cs b/OSCADSharp/OSCADSharp/Transforms/LinearExtrudedObject.cs index dbb8605..1fab32f 100644 --- a/OSCADSharp/OSCADSharp/Transforms/LinearExtrudedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/LinearExtrudedObject.cs @@ -32,12 +32,14 @@ namespace OSCADSharp.Transforms { this.obj = obj; this.Height = height; + + this.children.Add(obj); } public override OSCADObject Clone() { - return new LinearExtrudedObject(this.obj, this.Height); + return new LinearExtrudedObject(this.obj.Clone(), this.Height); } public override string ToString() diff --git a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs index 587506f..51b33d3 100644 --- a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs @@ -29,6 +29,8 @@ namespace OSCADSharp.Transforms { this.obj = obj; this.Normal = normal; + + this.children.Add(obj); } public override string ToString() @@ -40,7 +42,7 @@ namespace OSCADSharp.Transforms public override OSCADObject Clone() { - return new MirroredObject(this.obj, this.Normal); + return new MirroredObject(this.obj.Clone(), this.Normal); } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs index 73db2b4..d134630 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs @@ -27,6 +27,8 @@ namespace OSCADSharp.Transforms { this.obj = obj; this.Size = size; + + this.children.Add(obj); } public override string ToString() @@ -39,7 +41,7 @@ namespace OSCADSharp.Transforms public override OSCADObject Clone() { - return new ResizedObject(this.obj, this.Size); + return new ResizedObject(this.obj.Clone(), this.Size); } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs index c87b849..6ec35ae 100644 --- a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs @@ -27,6 +27,8 @@ namespace OSCADSharp.Transforms { this.obj = obj; this.Angle = angle; + + this.children.Add(obj); } public override string ToString() @@ -39,7 +41,7 @@ namespace OSCADSharp.Transforms public override OSCADObject Clone() { - return new RotatedObject(this.obj, this.Angle); + return new RotatedObject(this.obj.Clone(), this.Angle); } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs index 43b941a..27a7640 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs @@ -27,6 +27,8 @@ namespace OSCADSharp.Transforms { this.obj = obj; this.ScaleFactor = scale; + + this.children.Add(obj); } public override string ToString() @@ -39,7 +41,7 @@ namespace OSCADSharp.Transforms public override OSCADObject Clone() { - return new ScaledObject(this.obj, this.ScaleFactor); + return new ScaledObject(this.obj.Clone(), this.ScaleFactor); } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs index b3fb4f1..a5bf4fa 100644 --- a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs @@ -24,6 +24,8 @@ namespace OSCADSharp.Transforms { this.obj = obj; this.Vector = vector; + + this.children.Add(obj); } public override string ToString() @@ -36,7 +38,7 @@ namespace OSCADSharp.Transforms public override OSCADObject Clone() { - return new TranslatedObject(this.obj, this.Vector); + return new TranslatedObject(this.obj.Clone(), this.Vector); } } }