public async Task StartDoesNotInitializeVmAfterStop()
        {
            // --- Arrange
            var mc = GetMachineController();

            mc.StartVm(new ExecuteCycleOptions(EmulationMode.UntilFrameEnds));
            await mc.StarterTask;
            var before = mc.SpectrumVm;

            mc.StopVm();
            await mc.CompletionTask;

            VmState oldState = 0;
            VmState newState = 0;
            var     msgCount = 0;

            mc.VmStateChanged += (sender, args) =>
            {
                if (++msgCount == 1)
                {
                    oldState = args.OldState;
                    newState = args.NewState;
                }
            };

            // --- Act
            mc.StartVm(new ExecuteCycleOptions(EmulationMode.UntilFrameEnds));
            await mc.StarterTask;

            // --- Assert
            before.ShouldNotBeNull();
            mc.SpectrumVm.ShouldBeSameAs(before);
            oldState.ShouldBe(VmState.Stopped);
            newState.ShouldBe(VmState.BeforeRun);
        }
        public async Task StartVmSignsBeforeRunningState()
        {
            // --- Arrange
            var     mc       = GetMachineController();
            VmState oldState = 0;
            VmState newState = 0;
            var     msgCount = 0;

            mc.VmStateChanged += (sender, args) =>
            {
                if (++msgCount == 2)
                {
                    oldState = args.OldState;
                    newState = args.NewState;
                }
            };

            // --- Act
            mc.StartVm(new ExecuteCycleOptions(EmulationMode.UntilFrameEnds));
            await mc.StarterTask;

            // --- Assert
            oldState.ShouldBe(VmState.BuildingMachine);
            newState.ShouldBe(VmState.BeforeRun);
            mc.IsFirstStart.ShouldBeTrue();
        }
        public async Task StopVmSignsReachesStoppedState()
        {
            // --- Arrange
            var mc     = GetMachineController();
            var before = mc.SpectrumVm;

            mc.StartVm(new ExecuteCycleOptions(EmulationMode.UntilFrameEnds));
            await mc.StarterTask;

            VmState oldState = 0;
            VmState newState = 0;
            var     msgCount = 0;

            mc.VmStateChanged += (sender, args) =>
            {
                if (++msgCount == 2)
                {
                    oldState = args.OldState;
                    newState = args.NewState;
                }
            };

            // --- Act
            mc.StopVm();
            await mc.CompletionTask;

            // --- Assert
            before.ShouldBeNull();
            mc.SpectrumVm.ShouldNotBeNull();
            mc.IsFirstStart.ShouldBeTrue();
            oldState.ShouldBe(VmState.Stopping);
            newState.ShouldBe(VmState.Stopped);
        }