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, }; }