using Explorer.Application; using Explorer.Domain; namespace Explorer.Application.Tests; public class GitListingOverlayTests { [Fact] public void Clean_tracked_file_is_blank() { var status = Status("1 .M N... 100644 100644 100644 a a src/App.cs"); Assert.Equal("", GitListingOverlay.ForItem(@"C:\src\README.md", false, @"C:\src", status)); } [Fact] public void File_shows_modified_unstaged_and_staged() { var status = Status(""" 1 .M N... 100644 100644 100644 a a src/App.cs 1 M. N... 100644 100644 100644 b b README.md 1 MM N... 100644 100644 100644 c c src/Both.cs ? notes.md """); Assert.Equal("Modified", GitListingOverlay.ForItem(@"C:\src\src\App.cs", false, @"C:\src", status)); Assert.Equal("Staged", GitListingOverlay.ForItem(@"C:\src\README.md", false, @"C:\src", status)); Assert.Equal("Staged · Modified", GitListingOverlay.ForItem(@"C:\src\src\Both.cs", false, @"C:\src", status)); Assert.Equal("Untracked", GitListingOverlay.ForItem(@"C:\src\notes.md", false, @"C:\src", status)); } [Fact] public void Folder_summarizes_dirty_children() { var status = Status(""" 1 .M N... 100644 100644 100644 a a src/App.cs ? bin/out.dll """); Assert.Equal("Modified", GitListingOverlay.ForItem(@"C:\src\src", true, @"C:\src", status)); Assert.Equal("Untracked", GitListingOverlay.ForItem(@"C:\src\bin", true, @"C:\src", status)); Assert.Equal("", GitListingOverlay.ForItem(@"C:\src\docs", true, @"C:\src", status)); } [Fact] public void Nested_repo_uses_compact_badge() { var status = Status("1 .M N... 100644 100644 100644 a a App.cs"); Assert.Equal("main · 1 modified", GitListingOverlay.ForNestedRepo(status)); } [Fact] public void Outside_the_repo_is_blank() { var status = Status("1 .M N... 100644 100644 100644 a a App.cs"); Assert.Equal("", GitListingOverlay.ForItem(@"D:\other\App.cs", false, @"C:\src", status)); } private static GitStatus Status(string body) => GitPorcelainParser.Parse("# branch.head main\n" + body, @"C:\src") ?? throw new InvalidOperationException("parse"); }