Skip to content

Commit 9bc31d4

Browse files
committed
Connection graph serialization tests.
1 parent bce9877 commit 9bc31d4

File tree

4 files changed

+109
-20
lines changed

4 files changed

+109
-20
lines changed

src/main/java/com/robotgryphon/compactmachines/data/graph/CompactMachineConnectionGraph.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.robotgryphon.compactmachines.data.graph;
22

3+
import com.google.common.collect.ImmutableList;
34
import com.google.common.graph.ElementOrder;
45
import com.google.common.graph.GraphBuilder;
56
import com.google.common.graph.MutableGraph;
@@ -22,18 +23,8 @@ public class CompactMachineConnectionGraph {
2223
private final Map<Integer, CompactMachineNode> machines;
2324
private final Map<ChunkPos, CompactMachineRoomNode> rooms;
2425

25-
private static final Codec<CompactMachineConnectionInfo> CONNECTION_INFO_CODEC = RecordCodecBuilder.create(i -> i.group(
26-
CodecExtensions.CHUNKPOS_CODEC
27-
.fieldOf("machine")
28-
.forGetter(CompactMachineConnectionInfo::room),
29-
30-
Codec.INT.listOf()
31-
.fieldOf("connections")
32-
.forGetter(CompactMachineConnectionInfo::machines)
33-
).apply(i, CompactMachineConnectionInfo::new));
34-
3526
public static final Codec<CompactMachineConnectionGraph> CODEC = RecordCodecBuilder.create(i -> i.group(
36-
CONNECTION_INFO_CODEC.listOf()
27+
CompactMachineConnectionInfo.CODEC.listOf()
3728
.fieldOf("connections")
3829
.forGetter(CompactMachineConnectionGraph::buildConnections)
3930
).apply(i, CompactMachineConnectionGraph::new));
@@ -63,7 +54,14 @@ private CompactMachineConnectionGraph(List<CompactMachineConnectionInfo> connect
6354
}
6455

6556
private List<CompactMachineConnectionInfo> buildConnections() {
66-
return Collections.emptyList();
57+
List<CompactMachineConnectionInfo> result = new ArrayList<>();
58+
this.rooms.forEach((chunk, node) -> {
59+
Collection<Integer> machines = this.getMachinesFor(chunk);
60+
CompactMachineConnectionInfo roomInfo = new CompactMachineConnectionInfo(chunk, machines);
61+
result.add(roomInfo);
62+
});
63+
64+
return result;
6765
}
6866

6967
public void addMachine(int machine) {
@@ -134,9 +132,19 @@ private static class CompactMachineConnectionInfo {
134132
private final ChunkPos roomChunk;
135133
private final List<Integer> connectedMachines;
136134

137-
public CompactMachineConnectionInfo(ChunkPos roomChunk, List<Integer> connections) {
135+
public static final Codec<CompactMachineConnectionInfo> CODEC = RecordCodecBuilder.create(i -> i.group(
136+
CodecExtensions.CHUNKPOS_CODEC
137+
.fieldOf("machine")
138+
.forGetter(CompactMachineConnectionInfo::room),
139+
140+
Codec.INT.listOf()
141+
.fieldOf("connections")
142+
.forGetter(CompactMachineConnectionInfo::machines)
143+
).apply(i, CompactMachineConnectionInfo::new));
144+
145+
public CompactMachineConnectionInfo(ChunkPos roomChunk, Collection<Integer> connections) {
138146
this.roomChunk = roomChunk;
139-
this.connectedMachines = connections;
147+
this.connectedMachines = ImmutableList.copyOf(connections);
140148
}
141149

142150
public ChunkPos room() {

src/main/java/com/robotgryphon/compactmachines/data/persistent/MachineConnections.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.robotgryphon.compactmachines.data.persistent;
22

3+
import com.mojang.serialization.DataResult;
34
import com.robotgryphon.compactmachines.CompactMachines;
45
import com.robotgryphon.compactmachines.core.Registration;
56
import com.robotgryphon.compactmachines.data.graph.CompactMachineConnectionGraph;
67
import net.minecraft.nbt.CompoundNBT;
8+
import net.minecraft.nbt.INBT;
9+
import net.minecraft.nbt.NBTDynamicOps;
710
import net.minecraft.server.MinecraftServer;
811
import net.minecraft.world.server.ServerWorld;
912
import net.minecraft.world.storage.DimensionSavedDataManager;
@@ -32,11 +35,27 @@ public static MachineConnections instance(MinecraftServer server) {
3235

3336
@Override
3437
public void load(CompoundNBT nbt) {
38+
if (nbt.contains("graph")) {
39+
CompoundNBT graphNbt = nbt.getCompound("graph");
40+
DataResult<CompactMachineConnectionGraph> graphParseResult = CompactMachineConnectionGraph.CODEC.parse(NBTDynamicOps.INSTANCE, graphNbt);
3541

42+
graphParseResult
43+
.resultOrPartial(CompactMachines.LOGGER::error)
44+
.ifPresent(g -> this.graph = g);
45+
}
3646
}
3747

3848
@Override
3949
public CompoundNBT save(CompoundNBT nbt) {
50+
if(graph != null) {
51+
DataResult<INBT> dataResult = CompactMachineConnectionGraph.CODEC.encodeStart(NBTDynamicOps.INSTANCE, graph);
52+
dataResult
53+
.resultOrPartial(CompactMachines.LOGGER::error)
54+
.ifPresent(gNbt -> {
55+
nbt.put("graph", gNbt);
56+
});
57+
}
58+
4059
return nbt;
4160
}
4261
}

src/test/java/com/robotgryphon/compactmachines/tests/GraphTests.java

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
11
package com.robotgryphon.compactmachines.tests;
22

33
import com.google.common.graph.Graph;
4+
import com.mojang.serialization.DataResult;
5+
import com.robotgryphon.compactmachines.data.codec.CodecExtensions;
46
import com.robotgryphon.compactmachines.data.graph.CompactMachineConnectionGraph;
57
import com.robotgryphon.compactmachines.data.graph.CompactMachineNode;
68
import com.robotgryphon.compactmachines.data.graph.CompactMachineRoomNode;
79
import com.robotgryphon.compactmachines.data.graph.IMachineGraphNode;
10+
import com.robotgryphon.compactmachines.tests.util.FileHelper;
11+
import net.minecraft.nbt.*;
812
import net.minecraft.util.math.ChunkPos;
13+
import net.minecraftforge.common.util.Constants;
914
import org.junit.jupiter.api.Assertions;
1015
import org.junit.jupiter.api.DisplayName;
1116
import org.junit.jupiter.api.Test;
1217

18+
import java.io.File;
19+
import java.io.IOException;
1320
import java.util.Collection;
1421
import java.util.Optional;
1522

1623
@DisplayName("Machine Graph Tests")
1724
public class GraphTests {
1825

26+
private CompactMachineConnectionGraph generateGraphWithSingleRoom() {
27+
CompactMachineConnectionGraph g = new CompactMachineConnectionGraph();
28+
29+
g.addMachine(0);
30+
g.addRoom(new ChunkPos(0, 0));
31+
32+
g.connectMachineToRoom(0, new ChunkPos(0, 0));
33+
return g;
34+
}
35+
1936
@Test
2037
@DisplayName("Can Create Basic Graph")
2138
void basicGraph() {
@@ -45,12 +62,7 @@ void canCreateGraphWithLinkedMachine() {
4562
int machine = 0;
4663
ChunkPos room = new ChunkPos(0, 0);
4764

48-
CompactMachineConnectionGraph g = new CompactMachineConnectionGraph();
49-
50-
g.addMachine(0);
51-
g.addRoom(new ChunkPos(0, 0));
52-
53-
g.connectMachineToRoom(0, new ChunkPos(0, 0));
65+
CompactMachineConnectionGraph g = generateGraphWithSingleRoom();
5466

5567
Optional<ChunkPos> connectedRoom = g.getConnectedRoom(machine);
5668
Assertions.assertTrue(connectedRoom.isPresent());
@@ -100,6 +112,52 @@ void canCreateRoomWithMultipleLinkedMachines() {
100112
Assertions.assertTrue(linkedMachines.contains(MACHINE_2));
101113
}
102114

115+
@Test
116+
@DisplayName("Correctly serializes to NBT")
117+
void canSerialize() {
118+
CompactMachineConnectionGraph graph = generateGraphWithSingleRoom();
119+
120+
DataResult<INBT> nbtResult = CompactMachineConnectionGraph.CODEC.encodeStart(NBTDynamicOps.INSTANCE, graph);
121+
122+
nbtResult.resultOrPartial(Assertions::fail)
123+
.ifPresent(nbt -> {
124+
Assertions.assertTrue(nbt instanceof CompoundNBT);
125+
126+
// try {
127+
// File file = FileHelper.RESOURCES_DIR.resolve("graph.dat").toFile();
128+
// file.delete();
129+
// CompressedStreamTools.writeCompressed((CompoundNBT) nbt, file);
130+
// } catch (IOException e) {
131+
// e.printStackTrace();
132+
// }
133+
134+
CompoundNBT c = (CompoundNBT) nbt;
135+
Assertions.assertFalse(c.isEmpty());
136+
137+
Assertions.assertTrue(c.contains("connections"));
138+
139+
ListNBT connections = c.getList("connections", Constants.NBT.TAG_COMPOUND);
140+
Assertions.assertEquals(1, connections.size(), "Expected one connection from a machine to a single room.");
141+
142+
CompoundNBT conn1 = connections.getCompound(0);
143+
Assertions.assertNotNull(conn1);
144+
145+
Assertions.assertTrue(conn1.contains("machine"));
146+
Assertions.assertTrue(conn1.contains("connections"));
147+
148+
CompoundNBT machineChunk = conn1.getCompound("machine");
149+
DataResult<ChunkPos> chunkRes = CodecExtensions.CHUNKPOS_CODEC.parse(NBTDynamicOps.INSTANCE, machineChunk);
150+
chunkRes.resultOrPartial(Assertions::fail)
151+
.ifPresent(chunk -> {
152+
Assertions.assertEquals(new ChunkPos(0, 0), chunk);
153+
});
154+
155+
ListNBT connList = conn1.getList("connections", Constants.NBT.TAG_INT);
156+
Assertions.assertNotNull(connList);
157+
Assertions.assertEquals(1, connList.size());
158+
Assertions.assertEquals(0, connList.getInt(0));
159+
});
160+
}
103161
// private void generateData(MutableGraph<IGraphNode> g, HashMap<String, IGraphNode> lookup) {
104162
// Random r = new Random();
105163
// MachineExternalLocation[] values = MachineExternalLocation.values();

src/test/java/com/robotgryphon/compactmachines/tests/util/FileHelper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@
55
import net.minecraft.nbt.CompoundNBT;
66
import net.minecraft.nbt.CompressedStreamTools;
77

8+
import javax.annotation.Nullable;
89
import java.io.IOException;
910
import java.io.InputStream;
1011
import java.io.InputStreamReader;
1112
import java.net.URL;
13+
import java.nio.file.Path;
14+
import java.nio.file.Paths;
1215

1316
public class FileHelper {
1417
public static final FileHelper INSTANCE = new FileHelper();
18+
public static Path RESOURCES_DIR = Paths.get("src","test","resources");
1519

1620
private FileHelper() {
1721
}

0 commit comments

Comments
 (0)