using Microsoft.VisualStudio.TestTools.UnitTesting; using NavisworksTransport.Core; using NavisworksTransport.Utils.CoordinateSystem; using System.Numerics; namespace NavisworksTransport.UnitTests.CoordinateSystem { [TestClass] public class CanonicalRailOffsetResolverTests { [TestMethod] public void OverRail_ShouldOffsetTrackedCenterAlongNormalByHalfHeight() { PathRoute route = new PathRoute { PathType = PathType.Rail, RailMountMode = RailMountMode.OverRail, RailPathDefinitionMode = RailPathDefinitionMode.RailCenterLine }; RailLocalFrame frame = new RailLocalFrame(Vector3.UnitX, Vector3.UnitY, Vector3.UnitZ); Vector3 trackedCenter = CanonicalRailOffsetResolver.ResolveTrackedCenter( route, Vector3.Zero, frame, 4.0); AssertVector(trackedCenter, 0.0, 0.0, 2.0); } [TestMethod] public void UnderRail_ShouldOffsetTrackedCenterOppositeToNormalByHalfHeight() { PathRoute route = new PathRoute { PathType = PathType.Rail, RailMountMode = RailMountMode.UnderRail, RailPathDefinitionMode = RailPathDefinitionMode.RailCenterLine }; RailLocalFrame frame = new RailLocalFrame(Vector3.UnitX, Vector3.UnitY, Vector3.UnitZ); Vector3 trackedCenter = CanonicalRailOffsetResolver.ResolveTrackedCenter( route, Vector3.Zero, frame, 4.0); AssertVector(trackedCenter, 0.0, 0.0, -2.0); } [TestMethod] public void SlopedNormal_ShouldMoveTrackedCenterAlongRailNormalInsteadOfWorldUp() { PathRoute route = new PathRoute { PathType = PathType.Rail, RailMountMode = RailMountMode.OverRail, RailPathDefinitionMode = RailPathDefinitionMode.RailCenterLine }; Vector3 normal = Vector3.Normalize(new Vector3(0f, 1f, 1f)); RailLocalFrame frame = new RailLocalFrame(Vector3.UnitX, Vector3.UnitY, normal); Vector3 trackedCenter = CanonicalRailOffsetResolver.ResolveTrackedCenter( route, new Vector3(10f, 20f, 30f), frame, 4.0); Vector3 expected = new Vector3(10f, 20f, 30f) + normal * 2f; AssertVector(trackedCenter, expected.X, expected.Y, expected.Z); } [TestMethod] public void AnchorSemantic_ShouldOnlyUseHalfHeightOffset_WhenReferencePointIsAlreadyAnchor() { PathRoute route = new PathRoute { PathType = PathType.Rail, RailMountMode = RailMountMode.OverRail, RailPathDefinitionMode = RailPathDefinitionMode.RailCenterLine }; RailLocalFrame frame = new RailLocalFrame(Vector3.UnitX, Vector3.UnitY, Vector3.UnitZ); Vector3 trackedCenter = CanonicalRailOffsetResolver.ResolveTrackedCenter( route, Vector3.Zero, frame, 4.0); AssertVector(trackedCenter, 0.0, 0.0, 2.0); } private static void AssertVector(Vector3 actual, double x, double y, double z) { Assert.AreEqual(x, actual.X, 1e-6); Assert.AreEqual(y, actual.Y, 1e-6); Assert.AreEqual(z, actual.Z, 1e-6); } } }