namespace Gpulse.WCT.DataAnalyzer.Tests;
///
/// 构造 CLI 测试用的日志 fixture 文件。文件名符合 FileNameParser 约定的
/// `TX面板-TX硬件-TX软件-RX类型-测试目的-日期-序号` 格式。
///
public static class TestFixtures
{
public const string PlossFileName = "singleMold-v1.0-hex2_1-iPhone15-ploss_test-20260710-1.log";
public const string QfodFileName = "singleMold-v1.0-hex2_1-iPhone15-qfod_test-20260710-1.log";
///
/// 两行 Ploss 记录(header + FOD 16 字段)。
/// 默认值让恒等式成立(Field5 - Field4 - PowLoss - ploss == DeltaP)且余量 > 2000。
///
///
/// 当不为 null 时,覆写 Field1,按十六进制字面量写入日志(如 "0C" = 十进制 12),
/// 用于验证解析器对 Field1 十六进制格式的支持。
///
public sealed record PlossTwoLineRow(
int PowLoss = 2200,
int DeltaP = 2500,
int Field1 = 1,
string? Field1AsHex = null,
int Field2 = 0,
int Field3 = 0,
int Field4 = 800, // RX power
int Field5 = 6000, // TX power
int Field6 = 0,
int Field7 = 0,
int Field8 = 0,
int Field9 = 500, // ploss
int Field10 = 3000, // threshold
int Field11 = 0,
int Field12 = 0, // FOD 标志
int Field13 = 0,
int Field14 = 0,
int Field15 = 0,
int Field16 = 0);
/// 写两行格式 Ploss 日志文件。
public static string WritePlossLog(string dir, string fileName, params PlossTwoLineRow[] rows)
{
var path = Path.Combine(dir, fileName);
var lines = new List(rows.Length * 2);
foreach (var r in rows)
{
lines.Add($"pow_loss = {r.PowLoss}, delta_p = {r.DeltaP}");
var field1 = r.Field1AsHex ?? r.Field1.ToString();
lines.Add(
$"FOD-> {field1} {r.Field2} {r.Field3} {r.Field4} {r.Field5} {r.Field6} " +
$"{r.Field7} {r.Field8} {r.Field9} {r.Field10} {r.Field11} {r.Field12} " +
$"{r.Field13} {r.Field14} {r.Field15} {r.Field16}");
}
File.WriteAllLines(path, lines);
return path;
}
/// 写旧单行格式 Ploss 日志(14 字段),仅指定 ploss/threshold/FOD 三个关键字段。
/// 每行 FOD 记录关键字段(ploss/threshold/FOD)
/// 若非 null 则覆盖首字段为十六进制字面量(否则固定为 "1")。
public static string WriteLegacyPlossLog(
string dir,
string fileName,
(int Ploss, int Threshold, int Fod)[] rows,
string? field1Hex = null)
{
var path = Path.Combine(dir, fileName);
var head = field1Hex ?? "1";
var lines = rows
.Select(r => $"FOD-> {head} 0 0 0 0 0 0 0 {r.Ploss} {r.Threshold} 0 {r.Fod} 0 0")
.ToArray();
File.WriteAllLines(path, lines);
return path;
}
/// 写 Qfod 日志文件,每行 DeltaQ 一个。
public static string WriteQfodLog(string dir, string fileName, params int[] deltaQs)
{
var path = Path.Combine(dir, fileName);
var lines = deltaQs
.Select((d, i) =>
{
var charger = i % 2;
var coil = i % 3;
var currentQ = 40 + d;
return $"{charger}#:Q {coil}->{d} {currentQ}.0 20.0 0 0";
})
.ToArray();
File.WriteAllLines(path, lines);
return path;
}
}