/// <summary>
        /// Back off algorithm
        /// </summary>
        public CleaningRobotActionResult Algorithm()
        {
            // Sequence 1
            _commandQueue.Clear();
            _commandQueue.Enqueue(_turnRightCommand);
            _commandQueue.Enqueue(_advanceCommand);
            CleaningRobotActionResult result = ProcessCommandQueue();

            // Sequence 2
            if (result == CleaningRobotActionResult.Obstacle)
            {
                _commandQueue.Clear();
                _commandQueue.Enqueue(_turnLeftCommand);
                _commandQueue.Enqueue(_backCommand);
                _commandQueue.Enqueue(_turnRightCommand);
                _commandQueue.Enqueue(_advanceCommand);
                result = ProcessCommandQueue();
            }

            // Sequence 3
            if (result == CleaningRobotActionResult.Obstacle)
            {
                _commandQueue.Clear();
                _commandQueue.Enqueue(_turnLeftCommand);
                _commandQueue.Enqueue(_turnLeftCommand);
                _commandQueue.Enqueue(_advanceCommand);
                result = ProcessCommandQueue();
            }

            // Sequence 4
            if (result == CleaningRobotActionResult.Obstacle)
            {
                _commandQueue.Clear();
                _commandQueue.Enqueue(_turnRightCommand);
                _commandQueue.Enqueue(_backCommand);
                _commandQueue.Enqueue(_turnRightCommand);
                _commandQueue.Enqueue(_advanceCommand);
                result = ProcessCommandQueue();
            }

            // Sequence 5
            if (result == CleaningRobotActionResult.Obstacle)
            {
                _commandQueue.Clear();
                _commandQueue.Enqueue(_turnLeftCommand);
                _commandQueue.Enqueue(_turnLeftCommand);
                _commandQueue.Enqueue(_advanceCommand);
                result = ProcessCommandQueue();
            }

            return(result);
        }
        /// <summary>
        /// Run controller
        /// </summary>
        public void Run()
        {
            CleaningRobotActionResult result = _givenStrategy.Algorithm();

            while (result == CleaningRobotActionResult.Obstacle)
            {
                result = _backOffStrategy.Algorithm();
                if (result != CleaningRobotActionResult.BatteryDrained)
                {
                    result = _givenStrategy.Algorithm();
                }
            }
        }
        // Processing command queue
        private CleaningRobotActionResult ProcessCommandQueue()
        {
            CleaningRobotActionResult result = CleaningRobotActionResult.Success;

            while (_commandQueue.Count > 0)
            {
                ICleaningRobotCommand command = _commandQueue.Dequeue();
                result = command.Run();
                if (result != CleaningRobotActionResult.Success)
                {
                    break;
                }
            }

            return(result);
        }