From 93a8981d0a5f0f6c25513382907e2695b8676b88 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 21 Mar 2026 15:19:27 -0400 Subject: [PATCH] feat: add Disable/Enable API to FillStrategyRegistry Adds methods to permanently disable/enable strategies by name. Disabled strategies remain registered but are excluded from the default pipeline. SetEnabled (used for remnant fills) takes precedence over the disabled set, so explicit overrides still work. Pipeline test now checks against active strategy count dynamically. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Strategies/FillStrategyRegistry.cs | 34 +++++++++++++++++-- .../Strategies/FillPipelineTests.cs | 5 +-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/OpenNest.Engine/Strategies/FillStrategyRegistry.cs b/OpenNest.Engine/Strategies/FillStrategyRegistry.cs index 581b4bf..1c1759b 100644 --- a/OpenNest.Engine/Strategies/FillStrategyRegistry.cs +++ b/OpenNest.Engine/Strategies/FillStrategyRegistry.cs @@ -12,6 +12,7 @@ namespace OpenNest.Engine.Strategies private static readonly List strategies = new(); private static List sorted; private static HashSet enabledFilter; + private static readonly HashSet disabled = new(StringComparer.OrdinalIgnoreCase); static FillStrategyRegistry() { @@ -19,9 +20,36 @@ namespace OpenNest.Engine.Strategies } public static IReadOnlyList Strategies => - sorted ??= (enabledFilter != null - ? strategies.Where(s => enabledFilter.Contains(s.Name)).OrderBy(s => s.Order).ToList() - : strategies.OrderBy(s => s.Order).ToList()); + sorted ??= FilterStrategies(); + + private static List FilterStrategies() + { + var source = enabledFilter != null + ? strategies.Where(s => enabledFilter.Contains(s.Name)) + : strategies.Where(s => !disabled.Contains(s.Name)); + return source.OrderBy(s => s.Order).ToList(); + } + + /// + /// Permanently disables strategies by name. They remain registered + /// but are excluded from the default pipeline. + /// + public static void Disable(params string[] names) + { + foreach (var name in names) + disabled.Add(name); + sorted = null; + } + + /// + /// Re-enables a previously disabled strategy. + /// + public static void Enable(params string[] names) + { + foreach (var name in names) + disabled.Remove(name); + sorted = null; + } /// /// Restricts the active strategies to only those whose names are listed. diff --git a/OpenNest.Tests/Strategies/FillPipelineTests.cs b/OpenNest.Tests/Strategies/FillPipelineTests.cs index 4fe34b1..6f6bb70 100644 --- a/OpenNest.Tests/Strategies/FillPipelineTests.cs +++ b/OpenNest.Tests/Strategies/FillPipelineTests.cs @@ -1,3 +1,4 @@ +using OpenNest.Engine.Strategies; using OpenNest.Geometry; namespace OpenNest.Tests.Strategies; @@ -24,8 +25,8 @@ public class FillPipelineTests engine.Fill(item, plate.WorkArea(), null, System.Threading.CancellationToken.None); - Assert.True(engine.PhaseResults.Count >= 6, - $"Expected phase results from all strategies, got {engine.PhaseResults.Count}"); + Assert.True(engine.PhaseResults.Count >= FillStrategyRegistry.Strategies.Count, + $"Expected phase results from all active strategies, got {engine.PhaseResults.Count}"); } [Fact]