6a31bc3737
Completed DEBT-001 paydown (1pt) by making three pure-function methods static: - ScheduleOccurrencePlanner.GetNextDueAt (no instance state accessed) - PromotionGateEvaluator.Evaluate (evidence gate only, no mutations) - EvaluationWindowPlanner.Plan (deterministic date calculation) Changes: - Added `static` modifier to three domain methods - Updated call sites: ModelOperationsDispatcherJob, tests - Removed unnecessary DI registrations (ModelOperationsModule) - Eliminated instance creation overhead in tests Test Results: 40/40 PASS (17 ModelOps + 18 SignalEngine + 5 Architecture) Documentation: - Updated TECH_DEBT_REGISTER.md: DEBT-001 Completed (PR 4b) - Added Gitea Actions Secrets section to CLAUDE.md documenting: - KRX_API_KEY, OPENDART_API_KEY, KIS_API_KEY storage location - CI/CD usage pattern - Local dev guidance Per AGENTS.md v16.0: Code changes are performance improvements, not suppressions. Quarterly paydown: +1pt (target 4pts for 20% Q3 2026) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
21 lines
986 B
C#
21 lines
986 B
C#
using KArtSell.Modules.ModelOperations.Domain;
|
|
namespace KArtSell.ModelOperations.UnitTests;
|
|
public sealed class EvaluationWindowPlannerTests
|
|
{
|
|
[Fact] public void Uses_trading_sessions_not_calendar_days()
|
|
{
|
|
var due = EvaluationWindowPlanner.Plan("KRX", new DateOnly(2026, 8, 3), new WeekdayCalendar());
|
|
Assert.Equal(new[] { 1, 5, 20, 63, 126, 252 }, due.Select(x => x.WindowTradingDays));
|
|
Assert.All(due, x => Assert.DoesNotContain(x.DueSession.DayOfWeek, new[] { DayOfWeek.Saturday, DayOfWeek.Sunday }));
|
|
}
|
|
private sealed class WeekdayCalendar : ITradingSessionCalendar
|
|
{
|
|
public DateOnly AddTradingSessions(string calendarId, DateOnly startSession, int sessionCount)
|
|
{
|
|
var current = startSession; var count = 0;
|
|
while (count < sessionCount) { current = current.AddDays(1); if (current.DayOfWeek is not (DayOfWeek.Saturday or DayOfWeek.Sunday)) count++; }
|
|
return current;
|
|
}
|
|
}
|
|
}
|