feat: created proper JSON deserializer and created test for JSON, which is still used for TDD

This commit is contained in:
Yannik Bretschneider 2021-05-11 06:14:18 +02:00
parent e3635851d2
commit 6947105077
2 changed files with 190 additions and 4 deletions

View File

@ -1,2 +1,68 @@
package uulm.teamname.marvelous.gamelibrary.json.ingame;public class EventDeserializer { package uulm.teamname.marvelous.gamelibrary.json.ingame;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import uulm.teamname.marvelous.gamelibrary.entities.Entity;
import uulm.teamname.marvelous.gamelibrary.entities.EntityID;
import uulm.teamname.marvelous.gamelibrary.events.Event;
import uulm.teamname.marvelous.gamelibrary.events.EventType;
import uulm.teamname.marvelous.gamelibrary.events.GamestateEvent;
import java.io.IOException;
public class EventDeserializer extends JsonDeserializer<Event> {
private final ObjectMapper mapper = new ObjectMapper();
@Override
public Event deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec codec = p.getCodec();
JsonNode node = codec.readTree(p);
JsonNode currentNode = null;
Event result = null;
EventType eventType = null;
if (!node.has("eventType")) {
throw new IOException("Event had wrong format: no EventType found");
} else {
eventType = EventType.valueOf(node.get("eventType").asText());
switch (eventType) {
case Ack:
case Nack:
case GamestateEvent:
result = new GamestateEvent();
result.type = eventType;
if ((currentNode = node.get("activeCharacter")) != null) {
((GamestateEvent) result).activeCharacter = mapper
.readValue(currentNode.toString(), EntityID.class);
}
if ((currentNode = node.get("turnOrder")) != null) {
((GamestateEvent) result).turnOrder = mapper
.readValue(currentNode.toString(), EntityID[].class);
}
// currentNode = node.get("entities");
// ((GameStateEvent) result).entities = currentNode == null
// ? null
// : mapper.readValue(currentNode.asText(), Entity[].class);
//
// currentNode = node.get("turnOrder");
// ((GameStateEvent) result).turnOrder = currentNode == null
// ? null
// : mapper.readValue(currentNode.asText(), EntityID[].class);
}
}
return result;
}
} }

View File

@ -1,5 +1,125 @@
import static org.mockito.Mockito.*; package uulm.teamname.marvelous.gamelibrary.json;
import static org.junit.jupiter.api.Assertions.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import uulm.teamname.marvelous.gamelibrary.entities.Entity;
import uulm.teamname.marvelous.gamelibrary.entities.EntityID;
import uulm.teamname.marvelous.gamelibrary.events.Event;
import uulm.teamname.marvelous.gamelibrary.events.EventBuilder;
import uulm.teamname.marvelous.gamelibrary.events.EventType;
import uulm.teamname.marvelous.gamelibrary.json.ingame.MessageStructure;
import java.util.HashMap;
class JSONTest { class JSONTest {
String messageStructureStart;
/** 0 is REQUESTS, 1 is EVENTS */
String[] messageStructureEnd;
/** Still need to add: messages, messageType */
MessageStructure target;
@BeforeEach
void setUp() {
messageStructureStart = """
{
"messages":[
""";
messageStructureEnd = new String[] {
"""
],
"messageType": "REQUESTS",
"customContentType": "TestCustomContent",
"customContent": {
"customKey" = "customResult",
"customNumber" = 15,
"customProperty" = true
}
""",
"""
],
"messageType": "EVENTS",
"customContentType": "TestCustomContent",
"customContent": {
"customKey": "customResult",
"customNumber": 15,
"customProperty": true
}
}
""",
};
target = new MessageStructure();
target.customContentType = "TestCustomContent";
target.customContent = new HashMap<String, Object>();
target.customContent.put("customKey", "customResult");
target.customContent.put("customNumber", 15);
target.customContent.put("customProperty", true);
}
@AfterEach
void tearDown() {
}
@Test
void parseNotificationEvents() {
Event[] targetEvents = {
new EventBuilder(EventType.Ack).buildGameStateEvent(),
new EventBuilder(EventType.Nack).buildGameStateEvent(),
};
String eventRepresentation = """
{"eventType": "Ack"},
{"eventType": "Nack"}
""";
String completeMessageStructure = messageStructureStart + eventRepresentation + messageStructureEnd[1];
target.messageType = MessageType.EVENTS;
target.messages = targetEvents;
assertThat(JSON.parse(completeMessageStructure)).isEqualTo(target);
}
@Test
void somewhatComplicatedInDevelopmentTest() {
String eventRepresentation = """
{
"eventType": "GamestateEvent",
"activeCharacter": {"entityID": "P2", "ID": 4},
"turnOrder": [
{"entityID": "P2", "ID": 4},
{"entityID": "P2", "ID": 2},
{"entityID": "P1", "ID": 3},
{"entityID": "NPC", "ID": 1},
{"entityID": "InfinityStones", "ID": 5},
{"entityID": "Rocks", "ID": 0}
]
}
""";
String completeMessageStructure = messageStructureStart + eventRepresentation + messageStructureEnd[1];
System.out.println(JSON.parse(completeMessageStructure));
}
@Test
void simpleInDevTest() throws JsonProcessingException {
String simpleEntity = """
{
"entityID": "P2",
"ID": 4
}
""";
System.out.println(new ObjectMapper().readValue(simpleEntity, EntityID.class));
}
@Test
void stringify() {
}
} }