using SQLInsight.Core.Data;
using SQLInsight.Core.Instances;
using SQLInsight.Rules.Engine;
namespace SQLInsight.Rules.Tests;
internal static class TestInstances
{
public static readonly DateTimeOffset Now = new(2026, 9, 29, 12, 0, 0, TimeSpan.Zero);
public static RuleContext Context(string version, DateTimeOffset? now = null, EngineEdition edition = EngineEdition.Standard)
{
var info = new InstanceInfo
{
ServerName = "test",
Version = SqlServerVersion.Parse(version),
ProductLevel = "RTM",
Edition = "Standard Edition",
EngineEdition = edition,
};
return new RuleContext(info, InstanceCapabilities.From(info), now ?? Now);
}
/// SQL Server 2022 with the given data collected.
public static RuleContext With(params object[] data) => WithVersion("16.0.4135.4", data);
public static RuleContext WithVersion(string version, params object[] data)
{
var context = Context(version);
foreach (var item in data)
{
context.Data.Set(item.GetType(), item);
}
return context;
}
public static ConfigurationSnapshot Config(params (string Name, long Value)[] options) => new()
{
CapturedAt = Now,
Options = options.Select(o => new ConfigurationOption(o.Name, o.Value, o.Value)).ToList(),
};
public static ServerSnapshot Server(int cpus = 8, long memoryMb = 65536, int numa = 1) => new()
{
CapturedAt = Now,
SqlServerStartTime = Now.UtcDateTime.AddDays(-10),
LogicalCpuCount = cpus,
VisibleOnlineSchedulers = cpus,
NumaNodeCount = numa,
PhysicalMemoryMb = memoryMb,
};
public static DatabaseInfo Database(string name = "Sales", Func? change = null)
{
var db = new DatabaseInfo
{
Name = name,
DatabaseId = 5,
State = "ONLINE",
RecoveryModel = "FULL",
CompatibilityLevel = 160,
PageVerify = "CHECKSUM",
CreateDate = Now.UtcDateTime.AddYears(-1),
LastFullBackup = Now.UtcDateTime.AddDays(-1),
LastLogBackup = Now.UtcDateTime.AddMinutes(-15),
LastGoodCheckDb = Now.UtcDateTime.AddDays(-2),
VirtualLogFileCount = 50,
};
return change is null ? db : change(db);
}
public static DatabaseSnapshot DatabaseList(params DatabaseInfo[] databases) => new() { CapturedAt = Now, Databases = databases };
public static CumulativeSample Waits(TimeSpan interval, params WaitStat[] waits)
{
var snapshot = new WaitStatsSnapshot { CapturedAt = Now, SqlServerStartTime = Now.UtcDateTime.AddDays(-1), Waits = waits };
return new(snapshot, new WaitStatsDelta { From = Now - interval, To = Now, Waits = waits });
}
public static CumulativeSample Io(params FileIoStat[] files)
{
var snapshot = new FileIoSnapshot { CapturedAt = Now, SqlServerStartTime = Now.UtcDateTime.AddDays(-1), Files = files };
return new(snapshot, new FileIoDelta { From = Now.AddMinutes(-5), To = Now, Files = files });
}
public static FileIoStat File(string type, long reads = 0, long readStallMs = 0, long writes = 0, long writeStallMs = 0) => new()
{
DatabaseName = "Sales",
FileId = type == "LOG" ? 2 : 1,
FileType = type,
PhysicalName = type == "LOG" ? "L:\\Sales_log.ldf" : "D:\\Sales.mdf",
Reads = reads,
BytesRead = reads * 8192,
ReadStallMs = readStallMs,
Writes = writes,
BytesWritten = writes * 8192,
WriteStallMs = writeStallMs,
};
}