示例#1
0
        public void ShouldThrowExceptionBecauseTheFirstTownInRouteIsNotTheLastTownInPath()
        {
            // Arrange
            var ab   = new Route("AB5");
            var xy   = new Route("XY7");
            var path = new TraveledPath(ab);

            // Act
            path.Append(xy);
        }
示例#2
0
        public void ShouldntThrowException()
        {
            // Arrange
            var route = new Route("AB5");

            // Act
            var traveledPath = new TraveledPath(route);

            new TraveledPath(traveledPath);
        }
        /// <summary>
        /// Travel through all possible paths in the graph.
        /// </summary>
        /// <param name="graph">Graph being traveled.</param>
        /// <param name="visited">Already visited paths.</param>
        /// <param name="destiny">Destiny town.</param>
        /// <param name="maxStops">Maximum number of stops allowed (optional).</param>
        /// <returns>All possible paths in the graph to the given destiny.</returns>
        private IEnumerable <TraveledPath> TravelPaths(
            Graph graph, IEnumerable <TraveledPath> visited, Town destiny, int?maxStops = null)
        {
            // Visits performed on this method call
            var currentVisit = new List <TraveledPath>();

            foreach (var path in visited)
            {
                // If we reached the maximum number of stops
                if (maxStops.HasValue && path.Stops >= maxStops.Value)
                {
                    continue;
                }

                // Current iteration town
                var town = path.LastTown;

                // Routes to current town neighbors
                var neighborRoutes = graph.GetRoutesToNeighbors(town);

                foreach (var neighborRoute in neighborRoutes)
                {
                    // The neighbor town
                    var neighborTown = neighborRoute.Towns.Item2;

                    // Flag indicating if destiny has been reached
                    var reachedDestiny = neighborTown == destiny;

                    // Flag indicating if the neighbor has already been visited
                    var newVisit = !path.Contains(neighborTown);

                    if (reachedDestiny || newVisit)
                    {
                        // Path with the current neighbor
                        var neighborPath = new TraveledPath(path).Append(neighborRoute);

                        // Traveling through neighbor's neighbors
                        var neighborVisits = new List <TraveledPath> {
                            neighborPath
                        };
                        var neighborPaths = TravelPaths(graph, neighborVisits, destiny, maxStops);

                        // Adding neighbor's visits to this method call current visits
                        currentVisit.AddRange(neighborPaths);

                        // Adding this visit to current visits if destiny has been reached
                        if (reachedDestiny)
                        {
                            currentVisit.Add(neighborPath);
                        }
                    }
                }
            }
            return(currentVisit);
        }
示例#4
0
        public void ShouldCheckEquality()
        {
            // Arrange
            var ab    = new Route("AB1");
            var bc    = new Route("BC2");
            var cd    = new Route("CD3");
            var path1 = new TraveledPath(ab).Append(bc).Append(cd);
            var path2 = new TraveledPath(ab).Append(bc).Append(cd);

            // Assert
            Assert.AreEqual(path1, path2);
        }
示例#5
0
        public void ShouldReturnQuantityOfStops()
        {
            // Arrange
            var ab   = new Route("AB1");
            var bc   = new Route("BC2");
            var cd   = new Route("CD3");
            var path = new TraveledPath(ab);

            // Act
            path.Append(bc).Append(cd);

            // Assert
            Assert.AreEqual(3, path.Stops);
        }
示例#6
0
        public void ShouldContainsTown()
        {
            // Arrange
            var ab   = new Route("AB1");
            var bc   = new Route("BC2");
            var cd   = new Route("CD3");
            var b    = new Town('B');
            var path = new TraveledPath(ab);

            // Act
            path.Append(bc).Append(cd);

            // Assert
            Assert.IsTrue(path.Contains(b));
        }
示例#7
0
        public void ShouldReturnLastTown()
        {
            // Arrange
            var ab   = new Route("AB1");
            var bc   = new Route("BC2");
            var cd   = new Route("CD3");
            var d    = new Town('D');
            var path = new TraveledPath(ab);

            // Act
            path.Append(bc).Append(cd);

            // Assert
            Assert.AreEqual(path.LastTown, d);
        }
示例#8
0
        public void ShouldFormatStringCorrectly()
        {
            // Arrange
            var ab   = new Route("AB1");
            var bc   = new Route("BC2");
            var cd   = new Route("CD3");
            var d    = new Town('D');
            var path = new TraveledPath(ab);

            // Act
            path.Append(bc).Append(cd);

            // Assert
            Assert.AreEqual("A-B-C-D (3 stops, distance 6)", path.ToString());
        }
        public IEnumerable <TraveledPath> Find(Graph graph, Town origin, Town destiny, int?maxStops = null)
        {
            // Listing one stop neighbors as visited (required to travel further)
            var visited = new List <TraveledPath>();

            foreach (var neighborRoute in graph.GetRoutesToNeighbors(origin))
            {
                var path = new TraveledPath(neighborRoute);
                visited.Add(path);
            }

            // Traveling
            var availableRoutes = TravelPaths(graph, visited, destiny, maxStops);

            // Sorting and returning
            return(from availableRoute in availableRoutes
                   orderby availableRoute.Stops, availableRoute.Distance
                   select availableRoute);
        }