public void ShouldGuardPeripheralReads([Range(1, 4)] int cpuCount) { using(var machine = new Machine()) { var sysbus = machine.SystemBus; cpuCount.Times(() => sysbus.Register(new ActivelyAskingCPU(machine, 0), new CPURegistrationPoint())); var peripheral = new ActivelyAskedPeripheral(); sysbus.Register(peripheral, 0.To(1000)); machine.Start(); Thread.Sleep(1000); machine.Pause(); Assert.IsFalse(peripheral.Failed, "Peripheral was concurrently accessed from multiple CPUs."); } }
public void ShouldBeDescending() { using(var machine = new Machine()) { var timer = new LimitTimer(machine, 100, 100000, Direction.Descending, true); var manualClockSource = new ManualClockSource(); machine.SetClockSource(manualClockSource); machine.Start(); var oldValue = timer.Limit; for(var i = 0; i < 100; i++) { manualClockSource.AdvanceBySeconds(1); var value = timer.Value; Assert.Less(value, oldValue, "Timer is not monotonic."); oldValue = value; } machine.Pause(); } }
public void ShouldNotExceedLimitAscending() { var limit = 100; using(var machine = new Machine()) { var timer = new LimitTimer(machine, 1, limit, Direction.Ascending, true); var manualClockSource = new ManualClockSource(); machine.SetClockSource(manualClockSource); machine.Start(); manualClockSource.AdvanceBySeconds(limit - 1); for(var i = 0; i < 3; ++i) { var value = timer.Value; Assert.LessOrEqual(value, limit, "Timer exceeded given limit."); Assert.GreaterOrEqual(value, 0, "Timer returned negative value."); manualClockSource.AdvanceBySeconds(1); } Thread.Sleep(7); machine.Pause(); } }
public void ShouldPauseAndResumeOnlyOnce() { using(var machine = new Machine()) { var sb = machine.SystemBus; var mock = new Mock<IHasOwnLife>(); sb.Register(mock.As<IDoubleWordPeripheral>().Object, 0.To(100)); sb.Register(new Mock<ICPU>().Object, new CPURegistrationPoint()); machine.Start(); PauseResumeRetries.Times(machine.Pause); mock.Verify(x => x.Pause(), Times.Once()); PauseResumeRetries.Times(machine.Start); mock.Verify(x => x.Resume(), Times.Once()); } }
public void ShouldFireAlarmWhenInterruptsAreEnabled() { using(var machine = new Machine()) { var timer = new LimitTimer(machine, 1, 10, Direction.Descending, true); var manualClockSource = new ManualClockSource(); machine.SetClockSource(manualClockSource); timer.EventEnabled = true; var ticked = false; timer.LimitReached += () => ticked = true; machine.Start(); // var val =timer.Value; manualClockSource.AdvanceBySeconds(110); Assert.IsTrue(ticked); } }
public void ShouldSwitchDirectionProperly() { using(var machine = new Machine()) { var timer = new LimitTimer(machine, 100, 100000, Direction.Ascending, true); var manualClockSource = new ManualClockSource(); machine.SetClockSource(manualClockSource); timer.EventEnabled = true; var ticked = false; timer.LimitReached += () => ticked = true; machine.Start(); manualClockSource.AdvanceBySeconds(2); timer.Direction = Direction.Descending; // and then change the direction manualClockSource.AdvanceBySeconds(2); Assert.IsTrue(ticked); } }