From c1e21abd45714a8da9d4ffdd296a1d44d7534c6f Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Mon, 16 Mar 2026 00:36:41 -0400 Subject: [PATCH] feat: add PartSequencerFactory Co-Authored-By: Claude Sonnet 4.6 --- .../Sequencing/PartSequencerFactory.cs | 23 ++++++++++++++ .../Sequencing/PartSequencerFactoryTests.cs | 30 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 OpenNest.Engine/Sequencing/PartSequencerFactory.cs create mode 100644 OpenNest.Tests/Sequencing/PartSequencerFactoryTests.cs diff --git a/OpenNest.Engine/Sequencing/PartSequencerFactory.cs b/OpenNest.Engine/Sequencing/PartSequencerFactory.cs new file mode 100644 index 0000000..0e29d1e --- /dev/null +++ b/OpenNest.Engine/Sequencing/PartSequencerFactory.cs @@ -0,0 +1,23 @@ +using System; +using OpenNest.CNC.CuttingStrategy; + +namespace OpenNest.Engine.Sequencing +{ + public static class PartSequencerFactory + { + public static IPartSequencer Create(SequenceParameters parameters) + { + return parameters.Method switch + { + SequenceMethod.RightSide => new RightSideSequencer(), + SequenceMethod.LeftSide => new LeftSideSequencer(), + SequenceMethod.BottomSide => new BottomSideSequencer(), + SequenceMethod.EdgeStart => new EdgeStartSequencer(), + SequenceMethod.LeastCode => new LeastCodeSequencer(), + SequenceMethod.Advanced => new AdvancedSequencer(parameters), + _ => throw new NotSupportedException( + $"Sequence method '{parameters.Method}' is not supported.") + }; + } + } +} diff --git a/OpenNest.Tests/Sequencing/PartSequencerFactoryTests.cs b/OpenNest.Tests/Sequencing/PartSequencerFactoryTests.cs new file mode 100644 index 0000000..1c6a22e --- /dev/null +++ b/OpenNest.Tests/Sequencing/PartSequencerFactoryTests.cs @@ -0,0 +1,30 @@ +using System; +using OpenNest.CNC.CuttingStrategy; +using OpenNest.Engine.Sequencing; +using Xunit; + +namespace OpenNest.Tests.Sequencing; + +public class PartSequencerFactoryTests +{ + [Theory] + [InlineData(SequenceMethod.RightSide, typeof(RightSideSequencer))] + [InlineData(SequenceMethod.LeftSide, typeof(LeftSideSequencer))] + [InlineData(SequenceMethod.BottomSide, typeof(BottomSideSequencer))] + [InlineData(SequenceMethod.EdgeStart, typeof(EdgeStartSequencer))] + [InlineData(SequenceMethod.LeastCode, typeof(LeastCodeSequencer))] + [InlineData(SequenceMethod.Advanced, typeof(AdvancedSequencer))] + public void Create_ReturnsCorrectType(SequenceMethod method, Type expectedType) + { + var parameters = new SequenceParameters { Method = method }; + var sequencer = PartSequencerFactory.Create(parameters); + Assert.IsType(expectedType, sequencer); + } + + [Fact] + public void Create_RightSideAlt_Throws() + { + var parameters = new SequenceParameters { Method = SequenceMethod.RightSideAlt }; + Assert.Throws(() => PartSequencerFactory.Create(parameters)); + } +}