feat: implemented EntityDeserializer and EntityDeserializerTest

This commit is contained in:
Yannik Bretschneider 2021-05-11 23:11:17 +02:00
parent f7b1514491
commit 868df160bb
2 changed files with 228 additions and 20 deletions

View File

@ -10,7 +10,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import uulm.teamname.marvelous.gamelibrary.IntVector2;
import uulm.teamname.marvelous.gamelibrary.entities.*;
import uulm.teamname.marvelous.gamelibrary.entities.Character;
import uulm.teamname.marvelous.gamelibrary.json.JSON;
import java.io.IOException;
@ -18,7 +17,7 @@ public class EntityDeserializer extends JsonDeserializer<Entity> {
private enum DeserializedEntityType {
Character,
Stone,
InfinityStone,
Rock
}
@ -49,8 +48,12 @@ public class EntityDeserializer extends JsonDeserializer<Entity> {
-1,
-1
);
for (var i: mapper.readValue(node.get("stones").toString(), Integer[].class)) {
((Character) result).inventory.addStone(StoneType.valueOf(i));
}
}
case Stone -> {
case InfinityStone -> {
result = new InfinityStone(
new EntityID(EntityType.InfinityStones, node.get("ID").asInt()),
mapper.readValue(node.get("position").toString(), IntVector2.class),

View File

@ -3,17 +3,17 @@ package uulm.teamname.marvelous.gamelibrary.json.ingame;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
import uulm.teamname.marvelous.gamelibrary.IntVector2;
import uulm.teamname.marvelous.gamelibrary.entities.*;
import uulm.teamname.marvelous.gamelibrary.entities.Character;
import uulm.teamname.marvelous.gamelibrary.entities.Entity;
import uulm.teamname.marvelous.gamelibrary.entities.EntityID;
import uulm.teamname.marvelous.gamelibrary.entities.EntityType;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ThreadLocalRandom;
class EntityDeserializerTest {
@ -38,19 +38,224 @@ class EntityDeserializerTest {
-1
);
character.inventory.addStone(StoneType.MindStone);
character.inventory.addStone(StoneType.SoulStone);
var jsonRepresentingCharacter = """
{
"entityType": "Character",
"name": "God",
"PID": 1,
"ID": 3,
"HP": 255,
"MP": 65535,
"AP": 4,
"position": [4, 2]
}
""";
assertThat(mapper.readValue(jsonRepresentingCharacter, Entity.class))
{
"entityType": "Character",
"name": "God",
"PID": 1,
"ID": 3,
"HP": 255,
"MP": 65535,
"AP": 4,
"stones": [1, 5],
"position": [4, 2]
}
""";
assertThat((Character) mapper.readValue(jsonRepresentingCharacter, Entity.class))
.isEqualTo(character);
}
@Test
void simpleInfinityStoneTest() throws JsonProcessingException {
var infinityStone = new InfinityStone(
new EntityID(EntityType.InfinityStones, 2),
new IntVector2(98765, 43210),
StoneType.RealityStone
);
var jsonRepresentingInfinityStone = """
{
"entityType": "InfinityStone",
"ID": 2,
"position": [98765, 43210]
}
""";
assertThat((InfinityStone) mapper.readValue(jsonRepresentingInfinityStone, Entity.class))
.isEqualTo(infinityStone);
}
@Test
void simpleRockTest() throws JsonProcessingException {
var rock = new Rock(
new EntityID(EntityType.Rocks, 324985),
new IntVector2(12357, 1371113),
86420
);
var jsonRepresentingRock = """
{
"entityType": "Rock",
"ID": 324985,
"HP": 86420,
"position": [12357, 1371113]
}
""";
assertThat((Rock) mapper.readValue(jsonRepresentingRock, Rock.class))
.isEqualTo(rock);
}
/**
* Random tests to see if the deserialization actually works
*/
@Test
void randomTests() throws JsonProcessingException {
// Get the randoms
Iterator<Integer> randomIntegers = ThreadLocalRandom.current().ints().iterator();
int repetitions = 1000;
// Initialize as StringBuilder for performance
StringBuilder characterName = new StringBuilder();
for (int i = 0; i < repetitions; i++) {
// Get a random character name based on weird strings
int nameLength = Math.abs(randomIntegers.next() % 12);
for (int j = 0; j < (nameLength) + 3; j++) {
// append char between A and Z, and make lowercase 50% of the time
characterName.append((char) (
(65 + Math.abs(randomIntegers.next() % 26))
+ 32 * Math.abs(randomIntegers.next() % 2)
));
}
// Generate a random character
Character character = new Character(
new EntityID(
randomIntegers.next() % 2 == 0 ? EntityType.P1 : EntityType.P2,
Math.abs(randomIntegers.next() % 6)),
new IntVector2(Math.abs(randomIntegers.next()), Math.abs(randomIntegers.next())),
characterName.toString(),
Math.abs(randomIntegers.next()),
Math.abs(randomIntegers.next()),
Math.abs(randomIntegers.next()),
-1,
-1,
-1
);
// give the character 0 to 5 infinity stones randomly
int characterInfinityStoneCount = Math.abs(randomIntegers.next()) % 6;
HashSet<Integer> usedStones = new HashSet<>(14);
for (int j = 0; j < characterInfinityStoneCount; j++) {
int currentStone;
do {
currentStone = Math.abs(randomIntegers.next() % 6);
} while (!usedStones.add(currentStone));
character.inventory.addStone(StoneType.valueOf(currentStone));
}
// create a string representing the character's current inventory state
String characterInventoryStringRepresentation = "";
for (Iterator<StoneType> it = character.inventory.iterator(); it.hasNext(); ) {
characterInventoryStringRepresentation += it.next().getID() + (it.hasNext() ? ", " : "");
}
// create the actual JSON representation of the character
String jsonRepresentingCharacter = """
{
"entityType": "Character",
"name": "%s",
"PID": %s,
"ID": %d,
"HP": %d,
"MP": %d,
"AP": %d,
"stones": [%s],
"position": [%d, %d]
}
""".formatted( // formatting the string with all required values
character.name,
character.id.type.toString().charAt(1), // Take the second char from P1 and P2
character.id.id,
character.hp.getValue(),
character.mp.getValue(),
character.ap.getValue(),
characterInventoryStringRepresentation,
character.getPosition().getX(),
character.getPosition().getY()
);
// === RANDOM INFINITY STONE ===
int infinityStoneID = Math.abs(randomIntegers.next() % 6); // get the InfinityStoneID here for Enum conversion
InfinityStone stone = new InfinityStone(
new EntityID(
EntityType.InfinityStones,
infinityStoneID),
new IntVector2(Math.abs(randomIntegers.next()), Math.abs(randomIntegers.next())),
StoneType.valueOf(infinityStoneID)
);
// create the JSON representation of the InfinityStone
String jsonRepresentingStone = """
{
"entityType": "InfinityStone",
"ID": %d,
"position": [%d, %d]
}
""".formatted( // formatting the string with the required values. Less this time, luckily
stone.id.id,
stone.getPosition().getX(),
stone.getPosition().getY()
);
// === RANDOM ROCK ===
Rock rock = new Rock(
new EntityID(
EntityType.Rocks,
Math.abs(randomIntegers.next())),
new IntVector2(Math.abs(randomIntegers.next()), Math.abs(randomIntegers.next())),
Math.abs(randomIntegers.next())
);
// create the JSON representing Rock
String jsonRepresentingRock = """
{
"entityType": "Rock",
"ID": %d,
"HP": %d,
"position": [%d, %d]
}
""".formatted(// formatting the string with the required arguments
rock.id.id,
rock.getHp(),
rock.getPosition().getX(),
rock.getPosition().getY()
);
// System.out.println(character);
// System.out.println(jsonRepresentingCharacter);
// System.out.println(stone);
// System.out.println(jsonRepresentingStone);
// System.out.println(rock);
// System.out.println(jsonRepresentingRock);
// // Assertions
assertThat((Character) (mapper.readValue(jsonRepresentingCharacter, Entity.class)))
.isEqualTo(character);
assertThat((InfinityStone) (mapper.readValue(jsonRepresentingStone, Entity.class)))
.isEqualTo(stone);
assertThat((Rock) (mapper.readValue(jsonRepresentingRock, Entity.class)))
.isEqualTo(rock);
characterName.setLength(0); // empty the StringBuilder
}
}
}