private Dictionary <Coords, PathData> GetReachableSpots(Coords start) { var toReturn = new Dictionary <Coords, PathData>(); // Let's not worry about optimization yet. The simple solution might be good enough. var reached = new Dictionary <string, PathData>(); var pathData = new PathData(); reached.Add(start.ToString(), pathData); pathData.Push(Direction.Up); GetReachableSpotsRecursive(start.Up(), (PathData)pathData.Clone(), reached); pathData.Pop(); pathData.Push(Direction.Left); GetReachableSpotsRecursive(start.Left(), (PathData)pathData.Clone(), reached); pathData.Pop(); pathData.Push(Direction.Right); GetReachableSpotsRecursive(start.Right(), (PathData)pathData.Clone(), reached); pathData.Pop(); pathData.Push(Direction.Down); GetReachableSpotsRecursive(start.Down(), (PathData)pathData.Clone(), reached); pathData.Pop(); foreach (var key in reached.Keys) { var keySplit = key.Split(','); toReturn.Add(new Coords { Row = int.Parse(keySplit[0]), Col = int.Parse(keySplit[1]) }, reached[key]); } return(toReturn); }
public void Cloned_path_data_should_not_be_same_item() { var path = new PathData(page, item); var clone = path.Clone(); clone.ShouldNotBeSameAs(path); clone.QueryParameters.ShouldNotBeSameAs(path.QueryParameters); }
private void GetReachableSpotsRecursive(Coords start, PathData pathSoFar, Dictionary <string, PathData> reached) { // If this is already in the dictionary, jump out. if (reached.Keys.Contains(start.ToString())) { if (reached[start.ToString()].CompareTo(pathSoFar) < 0) { return; } else { reached.Remove(start.ToString()); } } reached.Add(start.ToString(), (PathData)pathSoFar.Clone()); // If we're not on a space, jump out. if (GetSpot(start) != Spot.Space) { return; } pathSoFar.Push(Direction.Up); GetReachableSpotsRecursive(start.Up(), (PathData)pathSoFar.Clone(), reached); pathSoFar.Pop(); pathSoFar.Push(Direction.Left); GetReachableSpotsRecursive(start.Left(), (PathData)pathSoFar.Clone(), reached); pathSoFar.Pop(); pathSoFar.Push(Direction.Right); GetReachableSpotsRecursive(start.Right(), (PathData)pathSoFar.Clone(), reached); pathSoFar.Pop(); pathSoFar.Push(Direction.Down); GetReachableSpotsRecursive(start.Down(), (PathData)pathSoFar.Clone(), reached); pathSoFar.Pop(); }
public void Cloned_path_data_has_same_values() { var path = new PathData(page, item) { Action = "hello", Argument = "world", Ignore = true, IsCacheable = false, IsPubliclyAvailable = true, IsRewritable = false, TemplateUrl = "asdf" }; var clone = path.Clone(); path.Action.ShouldBe(clone.Action); path.Argument.ShouldBe(clone.Argument); path.CurrentItem.ShouldBe(clone.CurrentItem); path.CurrentPage.ShouldBe(clone.CurrentPage); path.ID.ShouldBe(clone.ID); path.Ignore.ShouldBe(clone.Ignore); path.IsCacheable.ShouldBe(clone.IsCacheable); path.IsPubliclyAvailable.ShouldBe(clone.IsPubliclyAvailable); path.IsRewritable.ShouldBe(clone.IsRewritable); path.PageID.ShouldBe(clone.PageID); path.Path.ShouldBe(clone.Path); path.QueryParameters.Count.ShouldBe(clone.QueryParameters.Count); path.StopID.ShouldBe(clone.StopID); path.StopItem.ShouldBe(clone.StopItem); path.TemplateUrl.ShouldBe(clone.TemplateUrl); }