using ExperionCrawler.Core.Application.Feedforward; using ExperionCrawler.Infrastructure.Control; using Xunit; namespace ExperionCrawler.Tests; public class FeedforwardFrontTests { [Fact] public void Front_stable_within_band() { var ind = new FrontPositionIndicator(bandwidth: 0.3); for (int i = 0; i < 50; i++) ind.Update(100.0, tsSec: 2, refTauSec: 60, strongSignal: true); var (state, trim, grade) = ind.Update(100.1, 2, 60, true); Assert.Contains("정상", state); Assert.Null(trim); Assert.Equal(Confidence.B, grade); } [Fact] public void Front_rise_triggers_reflux_advice() { var ind = new FrontPositionIndicator(bandwidth: 0.3); for (int i = 0; i < 200; i++) ind.Update(100.0, tsSec: 2, refTauSec: 60, strongSignal: false); var (state, trim, grade) = ind.Update(105.0, 2, 60, false); Assert.Contains("상승", state); Assert.Equal("환류↑ 권장", trim); Assert.Equal(Confidence.C, grade); } [Fact] public void Front_fall_triggers_boilup_advice() { var ind = new FrontPositionIndicator(bandwidth: 0.3); for (int i = 0; i < 200; i++) ind.Update(100.0, tsSec: 2, refTauSec: 60, strongSignal: true); var (state, trim, _) = ind.Update(95.0, 2, 60, true); Assert.Contains("하강", state); Assert.Contains("boilup", trim); } }