using HSchool.Server.Changelog; namespace HSchool.Server.Tests; public class BuildChangelogTests { private const string Head = "cccccccccccccccccccccccccccccccccccccccc"; private const string Mark = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; private const string Merge = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; private const string Unknown = "dddddddddddddddddddddddddddddddddddddddd"; private static readonly string Sample = string.Join('\n', Head, $"{Head}\u001f2026-01-03T12:00:00Z\u001fAdd changelog window", $"{Mark}\u001f2026-01-02T12:00:00Z\u001fMark phase 54 in progress.", $"{Merge}\u001f2026-01-01T12:00:00Z\u001fMerge branch 'phase/53-weather-commute'"); [Fact] public void VisibleSince_KnownSha_ReturnsOlderToNewerWithoutMarkPhase() { var changelog = BuildChangelog.Parse(Sample); var visible = changelog.VisibleSince(Merge); var commit = Assert.Single(visible); Assert.Equal(Head, commit.Sha); Assert.Equal("Add changelog window", commit.Subject); } [Fact] public void VisibleSince_MarkPhaseAnchor_StillReturnsLaterVisibleCommits() { var changelog = BuildChangelog.Parse(Sample); var visible = changelog.VisibleSince(Mark); var commit = Assert.Single(visible); Assert.Equal("Add changelog window", commit.Subject); } [Fact] public void VisibleSince_MissingUnknownOrCurrent_ReturnsEmpty() { var changelog = BuildChangelog.Parse(Sample); Assert.Empty(changelog.VisibleSince(null)); Assert.Empty(changelog.VisibleSince("")); Assert.Empty(changelog.VisibleSince(Unknown)); Assert.Empty(changelog.VisibleSince(Head)); Assert.Empty(changelog.VisibleSince(Head.ToUpperInvariant())); } [Fact] public void IsMarkPhase_MatchesStatusLineSubjects() { Assert.True(BuildChangelog.IsMarkPhase("Mark phase 54 in progress.")); Assert.True(BuildChangelog.IsMarkPhase("Mark phase 47 romance pack as complete.")); Assert.False(BuildChangelog.IsMarkPhase("Merge branch 'phase/54-whats-new'")); } }