public ConnectivityMap GenerateConnectivityMapNoCycles(int numberNodes, double branchingRatio) { var map = new ConnectivityMap(); var terminalNodes = new HashSet<int> { 0, 1 }; var nextNodeIndex = 2; map.AddRoomConnection(0, 1); while(nextNodeIndex < numberNodes) { var randomChance = rand.NextDouble(); int sourceVertex; if(randomChance < branchingRatio) { sourceVertex = rand.Next(nextNodeIndex); } else { sourceVertex = terminalNodes.RandomElementUsing(rand); } map.AddRoomConnection(sourceVertex, nextNodeIndex); terminalNodes.Remove(sourceVertex); terminalNodes.Add(nextNodeIndex); nextNodeIndex++; } return map; }
public void AddingSameEdgeTwiceDoesntMakeTwoEdges() { ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(1, 2); Assert.AreEqual(1, newMap.RoomConnectionGraph.EdgeCount); }
public void MapCycleReducerMapsContainsAMappingForEachEdgeInReducedMap() { //Build a graph with one nested cycles ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); //Exterior connections newMap.AddRoomConnection(5, 6); newMap.AddRoomConnection(4, 7); newMap.AddRoomConnection(4, 8); newMap.AddRoomConnection(3, 9); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); Assert.AreEqual(6, cycleReducer.edgeMappingNoCycleToFullMap.Count()); }
public void DoesNotContainEdgeNotInMap() { //Build a simple graph ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); newMap.AddRoomConnection(3, 4); newMap.GetEdgeBetweenRooms(2, 4); }
public void CyclesOnSeparateLevelsCanBeReturned() { var builder = new MapInfoBuilder(); var l1ConnectivityMap = new ConnectivityMap(); //Cycle in level 1 l1ConnectivityMap.AddRoomConnection(1, 2); l1ConnectivityMap.AddRoomConnection(2, 3); l1ConnectivityMap.AddRoomConnection(3, 1); var l1RoomList = new List<TemplatePositioned>(); var room1 = new TemplatePositioned(1, 1, 0, null, 1); l1RoomList.Add(room1); l1RoomList.Add(new TemplatePositioned(1, 1, 0, null, 2)); l1RoomList.Add(new TemplatePositioned(1, 1, 0, null, 3)); var l2ConnectivityMap = new ConnectivityMap(); //Cycle in level 2 l2ConnectivityMap.AddRoomConnection(5, 6); l2ConnectivityMap.AddRoomConnection(6, 7); l2ConnectivityMap.AddRoomConnection(7, 5); var l2RoomList = new List<TemplatePositioned>(); var room5 = new TemplatePositioned(1, 1, 0, null, 5); l2RoomList.Add(room5); l2RoomList.Add(new TemplatePositioned(1, 1, 0, null, 6)); l2RoomList.Add(new TemplatePositioned(1, 1, 0, null, 7)); builder.AddConstructedLevel(0, l1ConnectivityMap, l1RoomList, new Dictionary<Connection, Point>(), 1); builder.AddConstructedLevel(1, l2ConnectivityMap, l2RoomList, new Dictionary<Connection, Point>(), new Connection(3, 5)); var mapInfo = new MapInfo(builder); var cyclesOnLevel0 = mapInfo.GetCyclesOnLevel(0).ToList(); Assert.AreEqual(1, cyclesOnLevel0.Count()); CollectionAssert.AreEquivalent(cyclesOnLevel0[0], new List<Connection>{ new Connection(1, 2), new Connection(2, 3), new Connection(3, 1) }); var cyclesOnLevel1 = mapInfo.GetCyclesOnLevel(1).ToList(); Assert.AreEqual(1, cyclesOnLevel1.Count()); CollectionAssert.AreEquivalent(cyclesOnLevel1[0], new List<Connection>{ new Connection(5, 6), new Connection(6, 7), new Connection(7, 5) }); }
public void ContainEdgeInMap() { //Build a simple graph ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); var edge = newMap.GetEdgeBetweenRooms(1, 2); Assert.AreEqual(edge.Source, 1); Assert.AreEqual(edge.Target, 2); }
public void ConnectionCanBeAddedFromAnotherMap() { ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); ConnectivityMap newMap2 = new ConnectivityMap(); newMap2.AddRoomConnection(3, 4); newMap2.AddRoomConnection(4, 5); newMap.AddAllConnections(newMap2); CollectionAssert.AreEquivalent(new List<Connection>(new Connection[] { new Connection(1, 2), new Connection(2, 3), new Connection(3, 4), new Connection(4, 5)}), newMap.GetAllConnections().ToList()); }
public void DeadEndNodesAreFoundInSinglePathGraphs() { ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); var mapNoCycles = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var mapH = new MapHeuristics(mapNoCycles, 1); var expectedConnections = new Dictionary<int, List<Connection>> { {0, new List<Connection>(new Connection[]{ new Connection(1, 2), new Connection(2, 3)})} }; var terminalConnectionsFound = mapH.GetTerminalBranchConnections(); //TODO: We have slightly pathological behaviour that all non-terminal node connections //will be double counted in the CollectionAssert.AreEquivalent(expectedConnections[0], terminalConnectionsFound[0]); CollectionAssert.AreEquivalent(expectedConnections.Keys, terminalConnectionsFound.Keys); }
private ConnectivityMap BuildStandardTestMap() { ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Branch newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); //Cycle newMap.AddRoomConnection(2, 8); newMap.AddRoomConnection(2, 7); newMap.AddRoomConnection(8, 9); newMap.AddRoomConnection(7, 9); //Post-cycle newMap.AddRoomConnection(9, 10); newMap.AddRoomConnection(10, 11); newMap.AddRoomConnection(11, 12); newMap.AddRoomConnection(11, 13); //2-way branches newMap.AddRoomConnection(13, 14); newMap.AddRoomConnection(13, 15); //Save to disk GraphvizExport.OutputUndirectedGraph(newMap.RoomConnectionGraph, "standard-test-map"); return newMap; }
public void EdgeTraversingCycleIsInMapAfterCycleReduction() { //Build a graph with one nested cycle ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); Assert.IsTrue(cycleReducer.IsEdgeInRoomsNoCycles(3, 6)); }
public void EdgeBetweenNonCycleAndCycleMapsToBottleneckEdge() { //Build a graph with one nested cycle ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); //In the reduced graph, we have the edge between the first node of the cycle and the next node //In the full graph, we have the bottleneck edge between the cycle and the next node Assert.AreEqual(cycleReducer.edgeMappingNoCycleToFullMap[new Connection(3, 6)], new Connection(5, 6)); }
public void MapCycleReducerMapsNonReducedNodeBackToThemselves() { //Build a graph with one nested cycles ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var roomMapping = cycleReducer.roomMappingNoCycleToFullMap; //Confirm that all the first node in the cycle maps back to all the collapsed nodes CollectionAssert.AreEquivalent(new List<int>(new int[] { 1 }), roomMapping[1]); CollectionAssert.AreEquivalent(new List<int>(new int[] { 2 }), roomMapping[2]); CollectionAssert.AreEquivalent(new List<int>(new int[] { 6 }), roomMapping[6]); }
public void MapCycleReducerMapsReducedCycleNodeBackToOriginalNodes() { //Build a graph with one nested cycles ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var roomMapping = cycleReducer.roomMappingNoCycleToFullMap; //Confirm that all the first node in the cycle maps back to all the collapsed nodes CollectionAssert.AreEquivalent(new List<int>{ 3, 4, 5 }, roomMapping[3]); }
public void MapCycleReducerRemovesMultipleCyclesInInputMap() { //Build a graph with one two nested cycles ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); //Cycle newMap.AddRoomConnection(6, 7); newMap.AddRoomConnection(7, 8); newMap.AddRoomConnection(8, 9); newMap.AddRoomConnection(9, 10); newMap.AddRoomConnection(10, 11); newMap.AddRoomConnection(11, 6); newMap.AddRoomConnection(9, 6); newMap.AddRoomConnection(11, 12); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var roomMapping = cycleReducer.roomMappingFullToNoCycleMap; //Confirm that all the first cycle nodes are mapped to the first node in the cycle Assert.AreEqual(3, roomMapping[3]); Assert.AreEqual(3, roomMapping[4]); Assert.AreEqual(3, roomMapping[5]); //Confirm that all the second cycle nodes are mapped to the first node in the second cycle Assert.AreEqual(6, roomMapping[6]); Assert.AreEqual(6, roomMapping[7]); Assert.AreEqual(6, roomMapping[8]); Assert.AreEqual(6, roomMapping[9]); Assert.AreEqual(6, roomMapping[10]); Assert.AreEqual(6, roomMapping[11]); }
public void CluesCanBePlacedInRoomIfOnlyOneRoomPossible() { ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); var mapNoCycles = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var mapMST = new MapMST(mapNoCycles.mapNoCycles.Edges); var manager = new DoorAndClueManager(mapNoCycles, 1); Assert.IsNotNull(manager.PlaceDoorAndClue(new DoorRequirements(new Connection(1, 2), "lock0"), 1)); }
public void MapsFromDifferentLevelsCanBeConnected() { var mapInfo = new MapInfoBuilder(); var l1ConnectivityMap = new ConnectivityMap(); l1ConnectivityMap.AddRoomConnection(1, 2); l1ConnectivityMap.AddRoomConnection(2, 3); var l2ConnectivityMap = new ConnectivityMap(); l2ConnectivityMap.AddRoomConnection(5, 6); l2ConnectivityMap.AddRoomConnection(6, 7); mapInfo.AddConstructedLevel(0, l1ConnectivityMap, new List<TemplatePositioned>(), new Dictionary<Connection, Point>(), 0); mapInfo.AddConstructedLevel(1, l2ConnectivityMap, new List<TemplatePositioned>(), new Dictionary<Connection, Point>(), new Connection(3, 5)); ConnectivityMap fullMap = mapInfo.FullConnectivityMap; CollectionAssert.AreEquivalent(new List<Connection>(new Connection[] { new Connection(1, 2), new Connection(2, 3), new Connection(3, 5), new Connection(5, 6), new Connection(6, 7)}), fullMap.GetAllConnections().ToList()); }
public void MapCycleReducerRemovesOneCycleInInputMap() { //Build a graph with one nested cycle ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var roomMapping = cycleReducer.roomMappingFullToNoCycleMap; //Confirm that all the cycle nodes are mapped to the first node Assert.AreEqual(roomMapping[3], 3); Assert.AreEqual(roomMapping[4], 3); Assert.AreEqual(roomMapping[5], 3); }
private MapInfoBuilder GetStandardMapInfoBuilder() { var builder = new MapInfoBuilder(); var l1ConnectivityMap = new ConnectivityMap(); l1ConnectivityMap.AddRoomConnection(1, 2); l1ConnectivityMap.AddRoomConnection(2, 3); var l1RoomList = new List<TemplatePositioned>(); var room1 = new TemplatePositioned(1, 1, 0, null, 1); l1RoomList.Add(room1); l1RoomList.Add(new TemplatePositioned(1, 1, 0, null, 2)); l1RoomList.Add(new TemplatePositioned(1, 1, 0, null, 3)); var l2ConnectivityMap = new ConnectivityMap(); l2ConnectivityMap.AddRoomConnection(5, 6); l2ConnectivityMap.AddRoomConnection(6, 7); var l2RoomList = new List<TemplatePositioned>(); var room5 = new TemplatePositioned(1, 1, 0, null, 5); l2RoomList.Add(room5); l2RoomList.Add(new TemplatePositioned(1, 1, 0, null, 6)); l2RoomList.Add(new TemplatePositioned(1, 1, 0, null, 7)); var l1DoorDict = new Dictionary<Connection, Point>(); l1DoorDict.Add(new Connection(2, 3), new Point(5,5)); var l2DoorDict = new Dictionary<Connection, Point>(); l2DoorDict.Add(new Connection(5, 6), new Point(8, 8)); builder.AddConstructedLevel(0, l1ConnectivityMap, l1RoomList, l1DoorDict, 1); builder.AddConstructedLevel(1, l2ConnectivityMap, l2RoomList, l2DoorDict, new Connection(3, 5)); return builder; }
public void RoomsCanBeRetrievedByIndex() { var newTemplate = new TemplatePositioned(9, 9, 0, null, 100); var mapInfoBuilder = new MapInfoBuilder(); var templateList = new List<TemplatePositioned>(); templateList.Add(newTemplate); var map = new ConnectivityMap(); map.AddRoomConnection(new Connection(100, 101)); mapInfoBuilder.AddConstructedLevel(0, map, templateList, new Dictionary<Connection, Point>(), 100); var mapInfo = new MapInfo(mapInfoBuilder); Assert.AreEqual(new Point(9,9), mapInfo.GetRoom(100).Location); }
public void MapWithTwoNestedCyclesGivesCorrectTwoCyclesInAllCycles() { //Build a graph with one nested cycle ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle 1 newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 4); newMap.AddRoomConnection(4, 3); //Nested cycle newMap.AddRoomConnection(4, 6); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); //Relying on the fact that the DFS hits 3,5 first var allCycles = cycleReducer.AllCycles; var expectedCycles = new List<List<Connection>> { new List<Connection> { new Connection(3,5), new Connection(5,4), new Connection(4,3) }, new List<Connection> { new Connection(4,6), new Connection(6,5), new Connection(5,4) } }; Assert.AreEqual(2, allCycles.Count); CollectionAssert.AreEquivalent(expectedCycles[0], allCycles[0]); CollectionAssert.AreEquivalent(expectedCycles[1], allCycles[1]); }
public void MapCycleReducerMapsExterorEdgesOfCycleToOriginalConnections() { //Build a graph with one nested cycles ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); //Exterior connections newMap.AddRoomConnection(5, 6); newMap.AddRoomConnection(4, 7); newMap.AddRoomConnection(4, 8); newMap.AddRoomConnection(3, 9); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var edgeMapping = cycleReducer.edgeMappingNoCycleToFullMap; //Exterior connections from start node Assert.AreEqual(new Connection(2, 3), edgeMapping[new Connection(2, 3)].Ordered); Assert.AreEqual(new Connection(3, 9), edgeMapping[new Connection(3, 9)].Ordered); //Exterior connections from collasped nodes Assert.AreEqual(new Connection(4, 7), edgeMapping[new Connection(3, 7)].Ordered); Assert.AreEqual(new Connection(4, 8), edgeMapping[new Connection(3, 8)].Ordered); Assert.AreEqual(new Connection(5, 6), edgeMapping[new Connection(3, 6)].Ordered); }
public void MapWithTwoNonConnectedCyclesGivesTwoCyclesInAllCycles() { //Build a graph with one nested cycle ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle 1 newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 4); newMap.AddRoomConnection(4, 3); newMap.AddRoomConnection(5, 6); //Cycle 2 newMap.AddRoomConnection(6, 7); newMap.AddRoomConnection(7, 8); newMap.AddRoomConnection(8, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var allCycles = cycleReducer.AllCycles; Assert.AreEqual(2, allCycles.Count); }
public void SingleCycleInMapCanBeRetrievedWhenCycleSpecifiedInADifferentOrder() { //Build a graph with one nested cycle ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 4); newMap.AddRoomConnection(4, 3); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var allCycles = cycleReducer.AllCycles; var expectedCycles = new List<List<Connection>> { new List<Connection> { new Connection(3,5), new Connection(5,4), new Connection(4,3) }}; //Can't know whether the list will be returned in 'clockwise' or 'anticlockwise' ordering Assert.AreEqual(allCycles.Count, expectedCycles.Count); CollectionAssert.AreEquivalent(allCycles[0], expectedCycles[0]); }
private MapInfoBuilder GetStandardMapInfoBuilderForTemplates() { var builder = new MapInfoBuilder(); var l1ConnectivityMap = new ConnectivityMap(); l1ConnectivityMap.AddRoomConnection(1, 2); l1ConnectivityMap.AddRoomConnection(2, 3); var corridor1 = new RoomTemplateTerrain[1,3]; var corridor2 = new RoomTemplateTerrain[3, 1]; var room1 = new RoomTemplateTerrain[4, 4]; var l1RoomList = new List<TemplatePositioned>(); l1RoomList.Add(new TemplatePositioned(1, 1, 0, new RoomTemplate(corridor1), 0)); l1RoomList.Add(new TemplatePositioned(1, 1, 0, new RoomTemplate(corridor2), 1)); l1RoomList.Add(new TemplatePositioned(1, 1, 0, new RoomTemplate(room1), 2)); var l1DoorDict = new Dictionary<Connection, Point>(); l1DoorDict.Add(new Connection(2, 3), new Point(5, 5)); builder.AddConstructedLevel(0, l1ConnectivityMap, l1RoomList, l1DoorDict, 1); return builder; }
public void MapCycleReducerMapsContainsCorrectMappingForUnchangedEdgesInReducedMap() { //Build a graph with one nested cycles ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); //Exterior connections newMap.AddRoomConnection(5, 6); newMap.AddRoomConnection(6, 7); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); var edgeMapping = cycleReducer.edgeMappingNoCycleToFullMap; Assert.AreEqual(new Connection(1, 2), edgeMapping[new Connection(1, 2)].Ordered); Assert.AreEqual(new Connection(2, 3), edgeMapping[new Connection(2, 3)].Ordered); Assert.AreEqual(new Connection(6, 7), edgeMapping[new Connection(6, 7)].Ordered); }
public void RemovedEdgeNotFoundInMapCycleReducer() { //Build a graph with one nested cycle ConnectivityMap newMap = new ConnectivityMap(); newMap.AddRoomConnection(1, 2); newMap.AddRoomConnection(2, 3); //Cycle newMap.AddRoomConnection(3, 4); newMap.AddRoomConnection(4, 5); newMap.AddRoomConnection(3, 5); newMap.AddRoomConnection(5, 6); MapCycleReducer cycleReducer = new MapCycleReducer(newMap.RoomConnectionGraph.Edges); cycleReducer.GetEdgeBetweenRoomsNoCycles(4, 5); }