public MicrowaveStateEnum GetNextState(MicrowaveStateEnum currentState, bool startPressed)
        {
            switch (currentState)
            {
            case MicrowaveStateEnum.CLOSED:
                if (_hardware.DoorOpen)
                {
                    return(MicrowaveStateEnum.OPENED);
                }
                if (startPressed == true)
                {
                    return(MicrowaveStateEnum.HEATING);
                }
                return(MicrowaveStateEnum.CLOSED);

            case MicrowaveStateEnum.OPENED:
                if (!_hardware.DoorOpen)
                {
                    return(MicrowaveStateEnum.CLOSED);
                }
                return(MicrowaveStateEnum.OPENED);

            case MicrowaveStateEnum.HEATING:
                if (_hardware.DoorOpen)
                {
                    return(MicrowaveStateEnum.OPENED);
                }
                if (!_timer.IsRunning)
                {
                    return(MicrowaveStateEnum.CLOSED);
                }
                return(MicrowaveStateEnum.HEATING);
            }
            throw new UnhandledStateException("Unexpected state: " + currentState);
        }
        public MicrowaveController(IMicrowaveOvenHW hardware, ITimer timer, MicrowaveStateEnum initialState = MicrowaveStateEnum.CLOSED)
        {
            if (hardware == null || timer == null)
            {
                throw new Exception("Provide hardware and timer");
            }

            _hardware = hardware;
            _hardware.StartButtonPressed += StartButtonPressed;
            _hardware.DoorOpenChanged    += DoorOpenedChanged;

            _timer           = timer;
            _timer.Finished += TimerStopped;

            MicrowaveState = initialState;
        }