namespace Azaion.Missions.E2E.Reporting; /// /// One CSV row per test, matching the header documented in /// _docs/02_document/tests/environment.md ยง Reporting: /// TestId,TestName,Category,Traces,ExecutionTimeMs,Result,ErrorMessage. /// public sealed record ResultRow( string TestId, string TestName, string Category, string Traces, long ExecutionTimeMs, string Result, string? ErrorMessage) { public static string CsvHeader => "TestId,TestName,Category,Traces,ExecutionTimeMs,Result,ErrorMessage"; public string ToCsv() => string.Join(',', [ CsvEscape(TestId), CsvEscape(TestName), CsvEscape(Category), CsvEscape(Traces), ExecutionTimeMs.ToString(System.Globalization.CultureInfo.InvariantCulture), CsvEscape(Result), CsvEscape(StripFirstLine(ErrorMessage)) ]); private static string CsvEscape(string? value) { if (string.IsNullOrEmpty(value)) return ""; if (value.Contains(',') || value.Contains('"') || value.Contains('\n')) return $"\"{value.Replace("\"", "\"\"")}\""; return value; } private static string StripFirstLine(string? message) { if (string.IsNullOrEmpty(message)) return ""; var idx = message.IndexOf('\n'); return (idx < 0 ? message : message[..idx]).Replace("\r", "").Trim(); } }