public void ShouldThrowExceptionBecauseTheFirstTownInRouteIsNotTheLastTownInPath() { // Arrange var ab = new Route("AB5"); var xy = new Route("XY7"); var path = new TraveledPath(ab); // Act path.Append(xy); }
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); }
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); }
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); }
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)); }
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); }
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); }