using System; using System.IO; using System.Linq; using System.Text.Json; using Xunit; namespace GitConverter.TestsApp.ConsoleApp { /// /// Tests that validate output file correctness, not just existence. /// Ensures converted files are valid and contain expected data. /// [Collection("Logging")] public class OutputValidationTests : IDisposable { private readonly TextWriter _originalOut; private readonly TextWriter _originalErr; private readonly StringWriter _outWriter; private readonly StringWriter _errWriter; private readonly string _tempRoot; public OutputValidationTests() { _originalOut = Console.Out; _originalErr = Console.Error; _outWriter = new StringWriter(); _errWriter = new StringWriter(); Console.SetOut(_outWriter); Console.SetError(_errWriter); _tempRoot = Path.Combine(Path.GetTempPath(), "GitConverter.ValidationTests", 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 = "CSV to GeoJSON produces valid JSON")] public void Run_CsvToGeoJson_ProducesValidJson() { var csvInput = Path.Combine(_tempRoot, "points.csv"); File.WriteAllText(csvInput, "lon,lat,name\n-122.4,37.8,\"San Francisco\"\n-118.2,34.0,\"Los Angeles\""); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", csvInput, "GeoJson", outDir, tempDir, "unused" }; var exit = GitConverter.ConsoleApp.Program.Run(args); if (exit != 0) { var output = _outWriter.ToString() + _errWriter.ToString(); Assert.True(false, $"Conversion failed: {output}"); } var outputFiles = Directory.GetFiles(outDir, "*.json", SearchOption.AllDirectories); Assert.NotEmpty(outputFiles); foreach (var file in outputFiles) { var json = File.ReadAllText(file); try { var doc = JsonDocument.Parse(json); Assert.True(doc.RootElement.TryGetProperty("type", out var typeElement)); var type = typeElement.GetString(); Assert.True(type == "FeatureCollection" || type == "Feature", $"Expected GeoJSON type, got {type}"); } catch (JsonException ex) { Assert.True(false, $"Output file {file} is not valid JSON: {ex.Message}"); } } } [Fact(DisplayName = "Output files are not empty")] public void Run_Conversion_OutputFilesNotEmpty() { var csvInput = Path.Combine(_tempRoot, "data.csv"); File.WriteAllText(csvInput, "a,b,c\n1,2,3\n4,5,6"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", csvInput, "Csv", outDir, tempDir, "unused" }; var exit = GitConverter.ConsoleApp.Program.Run(args); if (exit == 0) { var files = Directory.GetFiles(outDir, "*", SearchOption.AllDirectories); Assert.NotEmpty(files); foreach (var file in files) { var info = new FileInfo(file); Assert.True(info.Length > 0, $"Output file {file} is empty"); } } } [Fact(DisplayName = "Unicode filenames are handled correctly")] public void Run_UnicodeFilename_HandledCorrectly() { var unicodeFilename = "שכבות_מידע.csv"; var csvInput = Path.Combine(_tempRoot, unicodeFilename); File.WriteAllText(csvInput, "x,y\n1,2\n3,4"); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", csvInput, "Csv", outDir, tempDir, "unused" }; _outWriter.GetStringBuilder().Clear(); _errWriter.GetStringBuilder().Clear(); var exit = GitConverter.ConsoleApp.Program.Run(args); var output = _outWriter.ToString() + _errWriter.ToString(); Assert.DoesNotContain("encoding", output.ToLowerInvariant()); Assert.DoesNotContain("invalid", output.ToLowerInvariant()); } [Fact(DisplayName = "Conversion preserves data integrity")] public void Run_CsvConversion_PreservesData() { var csvInput = Path.Combine(_tempRoot, "preserve.csv"); var expectedData = "id,value\n1,test\n2,data"; File.WriteAllText(csvInput, expectedData); var outDir = Path.Combine(_tempRoot, "out"); var tempDir = Path.Combine(_tempRoot, "temp"); var args = new[] { "gis_convert", csvInput, "Csv", outDir, tempDir, "unused" }; var exit = GitConverter.ConsoleApp.Program.Run(args); if (exit == 0) { var outputFiles = Directory.GetFiles(outDir, "*.csv", SearchOption.AllDirectories); Assert.NotEmpty(outputFiles); foreach (var file in outputFiles) { var content = File.ReadAllText(file); Assert.Contains("id", content); Assert.Contains("value", content); } } } } }