public async void Navigate_Should_Call_IMazeSpawner_Spawn()
        {
            var start       = new Coordinates(1, 2);
            var destination = new Coordinates(3, 4);
            var floorPlan   = new char[0][];
            var map         = new Map(floorPlan);

            _queen.ScanMap(start, destination, map);

            var crawler = Substitute.For <IMazeCrawler>();

            crawler.Navigate().Returns(new NavigationDetails());

            MazeCrawlerContext context = null;

            _spawner.Spawn(Arg.Do <MazeCrawlerContext>(c => context = c)).Returns(crawler);

            await _queen.Navigate();

            _spawner.Received(1).Spawn(Arg.Any <MazeCrawlerContext>());
            context.Start.Should().Be(start);
            context.Destination.Should().Be(destination);
            context.NavigationMode.Should().Be(CrawlerNavigationMode.Scout);
            context.Coordinator.Should().Be(_queen);
        }
        public async Task <NavigationDetails> Navigate()
        {
            var map     = MaskMap();
            var context = new MazeCrawlerContext
            {
                Start          = _start,
                Destination    = _destination,
                NavigationMap  = map,
                NavigationMode = CrawlerNavigationMode.Scout,
                Coordinator    = this
            };

            var crawler  = _spawner.Spawn(context);
            var response = await crawler.Navigate();

            if (response.Arrived)
            {
                response.PathTaken = MapHelper.SimplifyPath(response.PathTaken);
            }
            return(response);
        }