From 4dc79e8bc201b605fab97ce8865bcf7dd5777b53 Mon Sep 17 00:00:00 2001 From: Michael L Smith Date: Sat, 20 Feb 2016 14:21:41 -0800 Subject: [PATCH] + Added an auto-incrementing Id to OSCADObjects --- .../OSCADSharp.UnitTests/OSCADObjectTests.cs | 41 +++++++++++++++++++ OSCADSharp/OSCADSharp/Ids.cs | 30 ++++++++++++++ OSCADSharp/OSCADSharp/OSCADObject.cs | 10 +++++ OSCADSharp/OSCADSharp/OSCADSharp.csproj | 1 + 4 files changed, 82 insertions(+) create mode 100644 OSCADSharp/OSCADSharp/Ids.cs diff --git a/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs b/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs index 4431ed4..ea28a74 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs +++ b/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs @@ -1,6 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OSCADSharp.Solids; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; @@ -79,5 +80,45 @@ namespace OSCADSharp.UnitTests Assert.IsFalse(sphere.GetType() == cube.GetType()); Assert.AreEqual(0, sphere.Children().Count()); } + + [TestMethod] + public void OSCADObject_IdsAreSequentialAndDistinct() + { + var obj1 = new Sphere(); + var obj2 = new Cube(); + var obj3 = new Sphere(); + + + Assert.IsTrue(obj1.Id < obj2.Id && obj2.Id < obj3.Id); + + Assert.IsTrue(obj1.Id + 1 == obj2.Id); + Assert.IsTrue(obj2.Id + 1 == obj3.Id); + } + + [TestMethod] + public void OSCADObject_ParallelObjectCreationDoesNotYieldDuplicateIds() + { + ConcurrentBag bag = new ConcurrentBag(); + + Parallel.For(0, 1000, (i) => { + bag.Add(new Sphere()); + }); + + var ids = bag.Select(obj => obj.Id).ToList(); + Assert.AreEqual(ids.Count, ids.Distinct().Count()); + } + + [TestMethod] + public void OSCADObject_EachOscadObjectChildHasDistinctId() + { + var obj = new Cube(5, 5, 10, true) + .Translate(0, 5, 10).Rotate(0, 90, 0) + .Translate(0, 0, 10).Scale(1, 1, 2); + + List ids = obj.Children().Select(child => child.Id).ToList(); + ids.Add(obj.Id); + + Assert.AreEqual(ids.Count, ids.Distinct().Count()); + } } } diff --git a/OSCADSharp/OSCADSharp/Ids.cs b/OSCADSharp/OSCADSharp/Ids.cs new file mode 100644 index 0000000..1659714 --- /dev/null +++ b/OSCADSharp/OSCADSharp/Ids.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OSCADSharp +{ + /// + /// Responsible for creating identifiers for objects + /// + internal static class Ids + { + private static uint globalId = 0; + private static object idLockObject = new object(); + + /// + /// Gets a unique auto-incrementing integer id + /// + /// + internal static uint Get() + { + lock (idLockObject) + { + globalId++; + return globalId; + } + } + } +} diff --git a/OSCADSharp/OSCADSharp/OSCADObject.cs b/OSCADSharp/OSCADSharp/OSCADObject.cs index 4908489..cdcd2e0 100644 --- a/OSCADSharp/OSCADSharp/OSCADObject.cs +++ b/OSCADSharp/OSCADSharp/OSCADObject.cs @@ -14,6 +14,16 @@ namespace OSCADSharp /// public abstract class OSCADObject { + #region Fields + private uint id = Ids.Get(); + + /// + /// The unique Id of the object + /// these values auto-increment + /// + public uint Id { get { return this.id; } } + #endregion + #region Transforms /// /// Applies Color and/or Opacity to this object diff --git a/OSCADSharp/OSCADSharp/OSCADSharp.csproj b/OSCADSharp/OSCADSharp/OSCADSharp.csproj index bb1cb0a..8722bbe 100644 --- a/OSCADSharp/OSCADSharp/OSCADSharp.csproj +++ b/OSCADSharp/OSCADSharp/OSCADSharp.csproj @@ -42,6 +42,7 @@ +