142 lines
4.6 KiB
C#
142 lines
4.6 KiB
C#
using NUnit.Framework;
|
|
using VMdemo.Core;
|
|
using VMdemo.Simulation;
|
|
|
|
namespace VMdemo.Tests.EditMode
|
|
{
|
|
public class Step1CoreModelTests
|
|
{
|
|
[Test]
|
|
public void TryValidateAndBuildDerived_ValidConfig_ReturnsExpectedDerivedValues()
|
|
{
|
|
var config = new SimulationConfig
|
|
{
|
|
vaBits = 24,
|
|
pageSizeKB = 4,
|
|
physicalMemoryMB = 64,
|
|
tlbEntries = 16,
|
|
accessCount = 1000,
|
|
pageFaultPenalty = 100
|
|
};
|
|
|
|
var ok = ConfigValidator.TryValidateAndBuildDerived(config, out var derived, out var error);
|
|
|
|
Assert.IsTrue(ok, error);
|
|
Assert.That(error, Is.Empty);
|
|
Assert.That(derived.PageSizeBytes, Is.EqualTo(4096UL));
|
|
Assert.That(derived.PhysicalMemoryBytes, Is.EqualTo(67108864UL));
|
|
Assert.That(derived.OffsetBits, Is.EqualTo(12));
|
|
Assert.That(derived.VpnBits, Is.EqualTo(12));
|
|
Assert.That(derived.FrameCount, Is.EqualTo(16384UL));
|
|
}
|
|
|
|
[Test]
|
|
public void TryValidate_InvalidVaBits_FailsWithReadableMessage()
|
|
{
|
|
var config = new SimulationConfig
|
|
{
|
|
vaBits = 12,
|
|
pageSizeKB = 4,
|
|
physicalMemoryMB = 64,
|
|
tlbEntries = 16,
|
|
accessCount = 10,
|
|
pageFaultPenalty = 100
|
|
};
|
|
|
|
var ok = ConfigValidator.TryValidate(config, out var error);
|
|
|
|
Assert.IsFalse(ok);
|
|
Assert.That(error, Does.Contain("vaBits"));
|
|
}
|
|
|
|
[Test]
|
|
public void TryValidate_PageSizeNotPowerOfTwo_FailsWithReadableMessage()
|
|
{
|
|
var config = new SimulationConfig
|
|
{
|
|
vaBits = 16,
|
|
pageSizeKB = 6,
|
|
physicalMemoryMB = 64,
|
|
tlbEntries = 16,
|
|
accessCount = 10,
|
|
pageFaultPenalty = 100
|
|
};
|
|
|
|
var ok = ConfigValidator.TryValidate(config, out var error);
|
|
|
|
Assert.IsFalse(ok);
|
|
Assert.That(error, Does.Contain("pageSizeKB"));
|
|
}
|
|
|
|
[Test]
|
|
public void TryValidate_OffsetBitsGreaterOrEqualVaBits_Fails()
|
|
{
|
|
var config = new SimulationConfig
|
|
{
|
|
vaBits = 8,
|
|
pageSizeKB = 1,
|
|
physicalMemoryMB = 8,
|
|
tlbEntries = 16,
|
|
accessCount = 10,
|
|
pageFaultPenalty = 100
|
|
};
|
|
|
|
var ok = ConfigValidator.TryValidate(config, out var error);
|
|
|
|
Assert.IsFalse(ok);
|
|
Assert.That(error, Does.Contain("offsetBits"));
|
|
}
|
|
|
|
[Test]
|
|
public void TryValidate_FrameCountLessThanOne_Fails()
|
|
{
|
|
var config = new SimulationConfig
|
|
{
|
|
vaBits = 16,
|
|
pageSizeKB = 2048,
|
|
physicalMemoryMB = 1,
|
|
tlbEntries = 16,
|
|
accessCount = 10,
|
|
pageFaultPenalty = 100
|
|
};
|
|
|
|
var ok = ConfigValidator.TryValidate(config, out var error);
|
|
|
|
Assert.IsFalse(ok);
|
|
Assert.That(error, Does.Contain("frameCount"));
|
|
}
|
|
|
|
[Test]
|
|
public void SimulationState_Reset_ClearsAllStepState()
|
|
{
|
|
var state = new SimulationState
|
|
{
|
|
CurrentRound = 7,
|
|
CurrentVirtualAddress = 123456UL,
|
|
CurrentAddressParts = new AddressParts(10UL, 20UL, 3UL, 7UL),
|
|
IsPageFault = true,
|
|
IsTlbHit = true,
|
|
IsPageTableHit = true,
|
|
CurrentCost = 999
|
|
};
|
|
|
|
state.Reset();
|
|
|
|
Assert.That(state.CurrentRound, Is.EqualTo(0));
|
|
Assert.That(state.CurrentStep, Is.EqualTo(TranslationStep.GenerateVA));
|
|
Assert.That(state.CurrentVirtualAddress, Is.EqualTo(0UL));
|
|
Assert.That(state.CurrentAddressParts.Vpn, Is.EqualTo(0UL));
|
|
Assert.That(state.CurrentAddressParts.Offset, Is.EqualTo(0UL));
|
|
Assert.That(state.CurrentAddressParts.L1Index, Is.EqualTo(0UL));
|
|
Assert.That(state.CurrentAddressParts.L2Index, Is.EqualTo(0UL));
|
|
Assert.That(state.CurrentPhysicalAddress, Is.EqualTo(0UL));
|
|
Assert.That(state.CurrentPfn, Is.EqualTo(0UL));
|
|
Assert.IsFalse(state.HasCurrentPfn);
|
|
Assert.IsFalse(state.IsPageFault);
|
|
Assert.IsFalse(state.IsTlbHit);
|
|
Assert.IsFalse(state.IsPageTableHit);
|
|
Assert.That(state.CurrentCost, Is.EqualTo(0));
|
|
}
|
|
}
|
|
}
|