namespace LivingVillage.Kernel.Tests open System open System.Diagnostics open Microsoft.VisualStudio.TestTools.UnitTesting open LivingVillage.Headless [] type PerformanceTests () = let testConfiguration = { PerformanceProbe.defaultConfiguration with WarmupTicks = 32 MeasureTicks = 256 Repetitions = 1 } [] member _.FixedSeedAndInputSequenceProduceTheSameWorldDigest () = let first = PerformanceProbe.runSteps testConfiguration let second = PerformanceProbe.runSteps testConfiguration Assert.AreEqual( int64 (testConfiguration.WarmupTicks + testConfiguration.MeasureTicks), first.Tick) Assert.AreEqual(testConfiguration.NpcCount, first.Npcs.Length) Assert.AreEqual(PerformanceProbe.worldDigest first, PerformanceProbe.worldDigest second) [] member _.MeasurementReportsConfiguredTicksAndRuntimeCounters () = let sample = PerformanceProbe.measure testConfiguration Assert.AreEqual(testConfiguration.MeasureTicks, sample.MeasureTicks) Assert.AreEqual(int64 (testConfiguration.WarmupTicks + testConfiguration.MeasureTicks), sample.FinalTick) Assert.AreEqual(Stopwatch.Frequency, sample.StopwatchFrequency) Assert.IsTrue(sample.ElapsedStopwatchTicks > 0L) Assert.IsTrue(sample.AllocatedBytes >= 0L) Assert.IsTrue(sample.Gen0Collections >= 0L) Assert.IsTrue(sample.Gen1Collections >= 0L) Assert.IsTrue(sample.Gen2Collections >= 0L) let formatted = PerformanceProbe.formatSample sample Assert.IsTrue(formatted.Contains("ticks_per_second=")) Assert.IsTrue(formatted.Contains("allocated_bytes=")) Assert.IsTrue(formatted.Contains("gen0=")) [] member _.InvalidConfigurationReportsAUsefulFailure () = let invalid = { testConfiguration with NpcCount = 0 } match PerformanceProbe.validateConfiguration invalid with | Ok () -> Assert.Fail("zero NPC configuration must be rejected") | Error message -> Assert.IsTrue(message.Contains("NpcCount"))