using System; using System.IO; using Xunit; namespace GitConverter.TestsApp.ConsoleApp { /// /// Comprehensive exit code validation tests. /// Verifies all four exit code paths defined in Program.ExitCode enum. /// [Collection("Logging")] public class ExitCodeTests : IDisposable { private readonly TextWriter _originalOut; private readonly TextWriter _originalErr; private readonly StringWriter _outWriter; private readonly StringWriter _errWriter; private readonly string _tempRoot; public ExitCodeTests() { _originalOut = Console.Out; _originalErr = Console.Error; _outWriter = new StringWriter(); _errWriter = new StringWriter(); Console.SetOut(_outWriter); Console.SetError(_errWriter); _tempRoot = Path.Combine(Path.GetTempPath(), "GitConverter.ExitCodeTests", Guid.NewGuid().ToString("N")); Directory.CreateDirectory(_tempRoot); } public void Dispose() { Console.SetOut(_originalOut); Console.SetError(_originalErr); _outWriter.Dispose(); _errWriter.Dispose(); try { if (Directory.Exists(_tempRoot)) Directory.Delete(_tempRoot, true); } catch { } } [Fact(DisplayName = "Successful conversion returns exit code 0")] public void Run_SuccessfulConversion_ReturnsZero() { var dummyInput = Path.Combine(_tempRoot, "success.csv"); File.WriteAllText(dummyInput, "x,y\n1,2\n3,4"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", dummyInput, "Csv", outDir, tempDir, "unused" }; var exit = GitConverter.ConsoleApp.Program.Run(args); if (exit == 0) { Assert.Equal(0, exit); } else { var output = _outWriter.ToString() + _errWriter.ToString(); Assert.True(false, $"Expected exit 0 for valid CSV conversion but got {exit}. Output: {output}"); } } [Fact(DisplayName = "Missing input file returns non-zero exit code")] public void Run_MissingInputFile_ReturnsError() { var nonexistentInput = Path.Combine(_tempRoot, "doesnotexist.csv"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", nonexistentInput, "Csv", outDir, tempDir, "unused" }; var exit = GitConverter.ConsoleApp.Program.Run(args); Assert.True(exit == 1 || exit == 2, $"Expected exit 1 or 2 for missing file, got {exit}"); } [Fact(DisplayName = "Invalid target format returns app error (1)")] public void Run_InvalidTargetFormat_ReturnsAppError() { var dummyInput = Path.Combine(_tempRoot, "dummy.csv"); File.WriteAllText(dummyInput, "x,y\n1,2"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", dummyInput, "InvalidFormatThatDoesNotExist", outDir, tempDir, "unused" }; var exit = GitConverter.ConsoleApp.Program.Run(args); Assert.Equal(1, exit); } [Fact(DisplayName = "Help commands return app error (1)")] public void Run_HelpCommands_ReturnAppError() { var exitHelp = GitConverter.ConsoleApp.Program.Run(new[] { "help" }); var exitDashHelp = GitConverter.ConsoleApp.Program.Run(new[] { "--help" }); var exitFormats = GitConverter.ConsoleApp.Program.Run(new[] { "--help-formats" }); Assert.Equal(1, exitHelp); Assert.Equal(1, exitDashHelp); Assert.Equal(1, exitFormats); } [Fact(DisplayName = "Insufficient arguments returns app error (1)")] public void Run_InsufficientArgs_ReturnsAppError() { var args = new[] { "gis_convert" }; var exit = GitConverter.ConsoleApp.Program.Run(args); Assert.Equal(1, exit); } } }