Gamelib/src/test/java/uulm/teamname/marvelous/gamelibrary/json/JSONTest.java

1306 lines
46 KiB
Java

package uulm.teamname.marvelous.gamelibrary.json;
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.Disabled;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import uulm.teamname.marvelous.gamelibrary.IntVector2;
import uulm.teamname.marvelous.gamelibrary.config.*;
import uulm.teamname.marvelous.gamelibrary.entities.*;
import uulm.teamname.marvelous.gamelibrary.entities.Character;
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.events.GamestateEvent;
import uulm.teamname.marvelous.gamelibrary.messages.AssignmentEnum;
import uulm.teamname.marvelous.gamelibrary.messages.BasicMessage;
import uulm.teamname.marvelous.gamelibrary.messages.ErrorMessage;
import uulm.teamname.marvelous.gamelibrary.messages.RoleEnum;
import uulm.teamname.marvelous.gamelibrary.messages.client.*;
import uulm.teamname.marvelous.gamelibrary.messages.server.*;
import uulm.teamname.marvelous.gamelibrary.requests.Request;
import uulm.teamname.marvelous.gamelibrary.requests.RequestBuilder;
import uulm.teamname.marvelous.gamelibrary.requests.RequestType;
import java.util.*;
class JSONTest {
JSON json;
CharacterConfig characterConfig;
HashMap<String, CharacterProperties> propertiesMap;
// TODO: add proper CharacterConfig, otherwise Character events won't be deserializable
@BeforeEach
void setUp() {
characterConfig = mock(CharacterConfig.class);
propertiesMap = new HashMap<>();
when(characterConfig.getMap()).thenReturn(propertiesMap);
json = new JSON(characterConfig);
}
// What follows is code mostly copied from the Message(De)SerializationTests. This is technically not DRY,
// but I claim that under AHA this is fine.
// =============================================================================
// >>>>>>> Deserialization tests <<<<<<<
// =============================================================================
@Test
void characterSelectionDeserializationParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"CHARACTER_SELECTION",
"characters":[false,true,false,true,false,true,false,true,false,true,false,true]
}
""".replace("\n", "");
var message = new CharacterSelectionMessage();
// message.messageType = MessageType.CHARACTER_SELECTION;
message.characters = new Boolean[] {false,true,false,true,false,true,false,true,false,true,false,true};
assertThat((CharacterSelectionMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void confirmSelectionParseParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"CONFIRM_SELECTION",
"selectionComplete":true
}
""";
var message = new ConfirmSelectionMessage();
// message.messageType = MessageType.CONFIRM_SELECTION;
message.selectionComplete = true;
assertThat((ConfirmSelectionMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void errorParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"ERROR",
"message": "error error",
"type":0
}
""";
var message = new ErrorMessage();
// message.messageType = MessageType.ERROR;
message.message = "error error";
message.type = 0;
assertThat((ErrorMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void gameAssignmentParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GAME_ASSIGNMENT",
"gameID":"6a39c3cf-26d8-409e-a309-45590f38ec4f",
"characterSelection":[
{
"characterID": 1,
"name": "Rocket Raccoon",
"HP": 100,
"MP": 2,
"AP": 2,
"meleeDamage": 10,
"rangeCombatDamage": 30,
"rangeCombatReach": 5
},
{
"characterID": 2,
"name": "Quicksilver",
"HP": 100,
"MP": 6,
"AP": 1,
"meleeDamage": 10,
"rangeCombatDamage": 10,
"rangeCombatReach": 3
},
{
"characterID": 3,
"name": "Hulk",
"HP": 100,
"MP": 2,
"AP": 2,
"meleeDamage": 10,
"rangeCombatDamage": 30,
"rangeCombatReach": 5
}
]
}
""";
var racoon = new CharacterProperties();
racoon.characterID = 1;
racoon.name = "Rocket Raccoon";
racoon.HP = 100;
racoon.MP = 2;
racoon.AP = 2;
racoon.meleeDamage = 10;
racoon.rangedDamage = 30;
racoon.attackRange = 5;
var quicksilver = new CharacterProperties();
quicksilver.characterID = 2;
quicksilver.name = "Quicksilver";
quicksilver.HP = 100;
quicksilver.MP = 6;
quicksilver.AP = 1;
quicksilver.meleeDamage = 10;
quicksilver.rangedDamage = 10;
quicksilver.attackRange = 3;
var hulk = new CharacterProperties();
hulk.characterID = 3;
hulk.name = "Hulk";
hulk.HP = 100;
hulk.MP = 2;
hulk.AP = 2;
hulk.meleeDamage = 10;
hulk.rangedDamage = 30;
hulk.attackRange = 5;
var message = new GameAssignmentMessage();
// message.messageType = MessageType.GAME_ASSIGNMENT;
message.gameID = "6a39c3cf-26d8-409e-a309-45590f38ec4f";
message.characterSelection = new CharacterProperties[] {racoon, quicksilver, hulk};
assertThat((GameAssignmentMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void gameStructureParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GAME_STRUCTURE",
"assignment": "PlayerOne",
"playerOneName": "Gandalf",
"playerTwoName": "Bilbo",
"playerOneCharacters":[
{
"characterID": 1,
"name": "Rocket Raccoon",
"HP": 100,
"MP": 2,
"AP": 2,
"meleeDamage": 10,
"rangeCombatDamage": 30,
"rangeCombatReach": 5
},
{
"characterID": 2,
"name": "Quicksilver",
"HP": 100,
"MP": 6,
"AP": 1,
"meleeDamage": 10,
"rangeCombatDamage": 10,
"rangeCombatReach": 3
},
{
"characterID": 3,
"name": "Hulk",
"HP": 100,
"MP": 2,
"AP": 2,
"meleeDamage": 10,
"rangeCombatDamage": 30,
"rangeCombatReach": 5
}
],
"playerTwoCharacters":[
{
"characterID": 19,
"name": "Loki",
"HP": 100,
"MP": 6,
"AP": 1,
"meleeDamage": 10,
"rangeCombatDamage": 10,
"rangeCombatReach": 3
},
{
"characterID": 20,
"name": "Silver Surfer",
"HP": 100,
"MP": 6,
"AP": 1,
"meleeDamage": 10,
"rangeCombatDamage": 10,
"rangeCombatReach": 3
}
],
"scenarioconfig": {
"scenario":[
["GRASS","GRASS", "GRASS", "GRASS", "GRASS", "GRASS", "GRASS"],
["GRASS","GRASS", "GRASS", "ROCK", "GRASS", "GRASS", "GRASS"],
["GRASS","GRASS", "GRASS", "ROCK", "GRASS", "GRASS", "GRASS"],
["GRASS","GRASS", "GRASS", "ROCK", "GRASS", "GRASS", "GRASS"],
["GRASS","GRASS", "ROCK", "ROCK", "ROCK", "GRASS", "GRASS"],
["GRASS","ROCK", "ROCK", "ROCK", "ROCK", "ROCK", "GRASS"]
],
"author": "jakobmh",
"name": "asgard"
},
"matchconfig": {
"maxRounds": 30,
"maxRoundTime": 300,
"maxGameTime": 1800,
"maxAnimationTime": 50
}
}
""";
var racoon = new CharacterProperties();
racoon.characterID = 1;
racoon.name = "Rocket Raccoon";
racoon.HP = 100;
racoon.MP = 2;
racoon.AP = 2;
racoon.meleeDamage = 10;
racoon.rangedDamage = 30;
racoon.attackRange = 5;
var quicksilver = new CharacterProperties();
quicksilver.characterID = 2;
quicksilver.name = "Quicksilver";
quicksilver.HP = 100;
quicksilver.MP = 6;
quicksilver.AP = 1;
quicksilver.meleeDamage = 10;
quicksilver.rangedDamage = 10;
quicksilver.attackRange = 3;
var hulk = new CharacterProperties();
hulk.characterID = 3;
hulk.name = "Hulk";
hulk.HP = 100;
hulk.MP = 2;
hulk.AP = 2;
hulk.meleeDamage = 10;
hulk.rangedDamage = 30;
hulk.attackRange = 5;
var loki = new CharacterProperties();
loki.characterID = 19;
loki.name = "Loki";
loki.HP = 100;
loki.MP = 6;
loki.AP = 1;
loki.meleeDamage = 10;
loki.rangedDamage = 10;
loki.attackRange = 3;
var silversurfer = new CharacterProperties();
silversurfer.characterID = 20;
silversurfer.name = "Silver Surfer";
silversurfer.HP = 100;
silversurfer.MP = 6;
silversurfer.AP = 1;
silversurfer.meleeDamage = 10;
silversurfer.rangedDamage = 10;
silversurfer.attackRange = 3;
var scenarioConfig = new ScenarioConfig();
scenarioConfig.scenario = new FieldType[][] {
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.GRASS}
};
scenarioConfig.author = "jakobmh";
scenarioConfig.name = "asgard";
var matchconfig = new PartyConfig();
matchconfig.maxRounds = 30;
matchconfig.maxRoundTime = 300;
matchconfig.maxGameTime = 1800;
matchconfig.maxAnimationTime = 50;
var message = new GameStructureMessage();
// message.messageType = MessageType.GAME_STRUCTURE;
message.assignment = AssignmentEnum.PlayerOne;
message.playerOneName = "Gandalf";
message.playerTwoName = "Bilbo";
message.playerOneCharacters = new CharacterProperties[] {racoon, quicksilver, hulk};
message.playerTwoCharacters = new CharacterProperties[] {loki, silversurfer};
message.scenarioconfig = scenarioConfig;
message.matchconfig = matchconfig;
assertThat((GameStructureMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void generalAssignmentParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GENERAL_ASSIGNMENT",
"gameID":"6a39c3cf-26d8-409e-a309-45590f38ec4f"
}
""";
var message = new GeneralAssignmentMessage();
// message.messageType = MessageType.GENERAL_ASSIGNMENT;
message.gameID = "6a39c3cf-26d8-409e-a309-45590f38ec4f";
assertThat((GeneralAssignmentMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void goodbyeClientParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GOODBYE_CLIENT",
"message":"und schüss"
}
""";
var message = new GoodbyeClientMessage();
message.message = "und schüss";
assertThat((GoodbyeClientMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void helloClientParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"HELLO_CLIENT",
"runningGame":false
}
""";
var message = new HelloClientMessage();
message.runningGame = false;
assertThat((HelloClientMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void helloServerParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType": "HELLO_SERVER",
"name":"mynamehere",
"deviceID":"8f966f5a-9b62-456c-b4a3-50c90c75789c"
}
""";
var message = new HelloServerMessage();
message.name = "mynamehere";
message.deviceID = "8f966f5a-9b62-456c-b4a3-50c90c75789c";
assertThat((HelloServerMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void playerReadyParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"PLAYER_READY",
"startGame":false,
"role":"PLAYER"
}
""";
var message = new PlayerReadyMessage();
message.startGame = false;
message.role = RoleEnum.PLAYER;
assertThat((PlayerReadyMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void reconnectParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"RECONNECT",
"reconnect":false
}
""";
var message = new ReconnectMessage();
message.reconnect = false;
assertThat((ReconnectMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void eventParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"EVENTS",
"messages":[
{
"eventType": "MeleeAttackEvent",
"originEntity": {"entityID": "P1", "ID": 3},
"targetEntity": {"entityID": "P2", "ID": 4},
"originField": [3, 7],
"targetField": [3, 6]
},
{
"eventType": "MoveEvent",
"originEntity": {"entityID": "P1", "ID": 3},
"originField": [3, 7],
"targetField": [3, 6]
}
],
"customContentType":"SomeAwesomeCustomContent",
"customContent":{
"customKey":"someFancyValue",
"customInteger":5,
"customTruth":false
}
}
""";
var meleeAttackEvent = new EventBuilder(EventType.MeleeAttackEvent)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withTargetEntity(new EntityID(EntityType.P2, 4))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.buildCharacterEvent();
var moveEvent = new EventBuilder(EventType.MoveEvent)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.buildCharacterEvent();
var message = new EventMessage();
message.messages = new Event[] {meleeAttackEvent, moveEvent};
message.customContentType = "SomeAwesomeCustomContent";
message.customContent = new HashMap<>();
message.customContent.put("customKey", "someFancyValue");
message.customContent.put("customInteger", 5);
message.customContent.put("customTruth", false);
assertThat((EventMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void eventWithCharactersThatNeedConfigParseTest() throws JsonProcessingException {
var alphaConfig = new CharacterProperties();
alphaConfig.attackRange = 45;
alphaConfig.rangedDamage = 65;
alphaConfig.meleeDamage = 12;
propertiesMap.put("Alpha", alphaConfig);
var characterAlpha = new Character(
new EntityID(EntityType.P1, 4),
new IntVector2(5, 3),
"Alpha",
210,
9,
3,
45, // still -1 because no gameConfig object available
65,
12);
characterAlpha.inventory.addStone(StoneType.valueOf(1));
characterAlpha.inventory.addStone(StoneType.valueOf(4));
characterAlpha.setPosition(new IntVector2(4, 2));
var steelWallConfig = new CharacterProperties();
steelWallConfig.attackRange = 23;
steelWallConfig.rangedDamage = 34;
steelWallConfig.meleeDamage = 45;
propertiesMap.put("Steel Wall", steelWallConfig);
var characterSteelWall = new Character(
new EntityID(EntityType.P1, 4),
new IntVector2(255, 0),
"Steel Wall",
123,
2,
21,
23,
34,
45);
characterSteelWall.setPosition(new IntVector2(6, 7));
var infinityStone = new InfinityStone(
new EntityID(EntityType.InfinityStones, 3),
new IntVector2(52, 13),
StoneType.valueOf(3));
infinityStone.setPosition(new IntVector2(7, 22));
var rock = new Rock(
new EntityID(EntityType.Rocks, 15),
new IntVector2(51, 31),
195);
rock.setPosition(new IntVector2(4, 285));
var gamestate = new GamestateEvent();
gamestate.type = EventType.GamestateEvent;
gamestate.entities = new Entity[] {
characterAlpha,
characterSteelWall,
infinityStone,
rock
};
gamestate.mapSize = new IntVector2(15, 300);
gamestate.activeCharacter = new EntityID(EntityType.P2, 3);
gamestate.stoneCooldowns = new Integer[] {1, 1, 3, 1, 4, 2};
gamestate.turnOrder = new EntityID[] {
new EntityID(EntityType.P1, 5),
new EntityID(EntityType.P1, 4),
new EntityID(EntityType.P1, 3),
new EntityID(EntityType.P1, 2),
new EntityID(EntityType.P1, 1),
new EntityID(EntityType.P1, 0),
new EntityID(EntityType.P2, 0),
new EntityID(EntityType.P2, 1),
new EntityID(EntityType.P2, 2),
new EntityID(EntityType.P2, 3),
new EntityID(EntityType.P2, 4),
new EntityID(EntityType.P2, 5),
};
gamestate.winCondition = true;
var jsonRepresentingMessage = """
{
"messageType":"EVENTS",
"messages":[
{
"eventType":"Ack"
},
{
"eventType": "GamestateEvent",
"entities": [
{
"entityType": "Character",
"name": "Alpha",
"PID": 1,
"ID": 4,
"HP": 210,
"MP": 9,
"AP": 3,
"stones": [1, 4],
"position": [4, 2]
},
{
"entityType": "Character",
"name": "Steel Wall",
"PID": 1,
"ID": 4,
"HP": 123,
"MP": 2,
"AP": 21,
"stones": [],
"position": [6, 7]
},
{
"entityType": "InfinityStone",
"ID": 3,
"position": [7, 22]
},
{
"entityType": "Rock",
"ID": 15,
"HP": 195,
"position": [4, 285]
}
],
"turnOrder": [
{"entityID": "P1", "ID": 5},
{"entityID": "P1", "ID": 4},
{"entityID": "P1", "ID": 3},
{"entityID": "P1", "ID": 2},
{"entityID": "P1", "ID": 1},
{"entityID": "P1", "ID": 0},
{"entityID": "P2", "ID": 0},
{"entityID": "P2", "ID": 1},
{"entityID": "P2", "ID": 2},
{"entityID": "P2", "ID": 3},
{"entityID": "P2", "ID": 4},
{"entityID": "P2", "ID": 5}
],
"mapSize": [15, 300],
"activeCharacter": {"entityID": "P2", "ID": 3},
"stoneCooldowns": [1, 1, 3, 1, 4, 2],
"winCondition": true
}
]
}
""";
var message = new EventMessage();
message.messages = new Event[] {new EventBuilder(EventType.Ack).buildGameStateEvent(), gamestate};
assertThat(json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
@Test
void requestParseTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"REQUESTS",
"messages":[
{
"requestType": "MeleeAttackRequest",
"originEntity": {"entityID": "P1", "ID": 3},
"targetEntity": {"entityID": "P2", "ID": 4},
"originField": [3, 7],
"targetField": [3, 6],
"value":14
},
{
"requestType": "MoveRequest",
"originEntity": {"entityID": "P1", "ID": 3},
"originField": [3, 7],
"targetField": [3, 6]
}
],
"customContentType":"SomeAwesomeCustomContent",
"customContent":{
"customKey":"someFancyValue",
"customInteger":5,
"customTruth":false
}
}
""";
var meleeAttackRequest = new RequestBuilder(RequestType.MeleeAttackRequest)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withTargetEntity(new EntityID(EntityType.P2, 4))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.withValue(14)
.buildCharacterRequest();
var moveRequest = new RequestBuilder(RequestType.MoveRequest)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.buildCharacterRequest();
var message = new RequestMessage();
message.messages = new Request[] {meleeAttackRequest, moveRequest};
message.customContentType = "SomeAwesomeCustomContent";
message.customContent = new HashMap<>();
message.customContent.put("customKey", "someFancyValue");
message.customContent.put("customInteger", 5);
message.customContent.put("customTruth", false);
assertThat((RequestMessage) json.parse(jsonRepresentingMessage).get())
.isEqualTo(message);
}
// =============================================================================
// >>>>>>> Serialization tests <<<<<<<
// =============================================================================
@Test
void characterSelectionStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"CHARACTER_SELECTION",
"characters":[false,true,false,true,false,true,false,true,false,true,false,true]
}
""".replace("\n", "");
var message = new CharacterSelectionMessage();
// message.messageType = MessageType.CHARACTER_SELECTION;
message.characters = new Boolean[] {false,true,false,true,false,true,false,true,false,true,false,true};
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void confirmSelectionStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"CONFIRM_SELECTION",
"selectionComplete":true
}
""".replace("\n", "");
var message = new ConfirmSelectionMessage();
// message.messageType = MessageType.CONFIRM_SELECTION;
message.selectionComplete = true;
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void errorStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"ERROR",
"message":"error error",
"type":0
}
""".replace("\n", "");
var message = new ErrorMessage();
// message.messageType = MessageType.ERROR;
message.message = "error error";
message.type = 0;
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void gameAssignmentStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GAME_ASSIGNMENT",
"gameID":"6a39c3cf-26d8-409e-a309-45590f38ec4f",
"characterSelection":[
{
"characterID":1,
"name":"Rocket Raccoon",
"HP":100,
"MP":2,
"AP":2,
"meleeDamage":10,
"rangeCombatDamage":30,
"rangeCombatReach":5
},
{
"characterID":2,
"name":"Quicksilver",
"HP":100,
"MP":6,
"AP":1,
"meleeDamage":10,
"rangeCombatDamage":10,
"rangeCombatReach":3
},
{
"characterID":3,
"name":"Hulk",
"HP":100,
"MP":2,
"AP":2,
"meleeDamage":10,
"rangeCombatDamage":30,
"rangeCombatReach":5
}
]
}
""".replace("\n", "");
var racoon = new CharacterProperties();
racoon.characterID = 1;
racoon.name = "Rocket Raccoon";
racoon.HP = 100;
racoon.MP = 2;
racoon.AP = 2;
racoon.meleeDamage = 10;
racoon.rangedDamage = 30;
racoon.attackRange = 5;
var quicksilver = new CharacterProperties();
quicksilver.characterID = 2;
quicksilver.name = "Quicksilver";
quicksilver.HP = 100;
quicksilver.MP = 6;
quicksilver.AP = 1;
quicksilver.meleeDamage = 10;
quicksilver.rangedDamage = 10;
quicksilver.attackRange = 3;
var hulk = new CharacterProperties();
hulk.characterID = 3;
hulk.name = "Hulk";
hulk.HP = 100;
hulk.MP = 2;
hulk.AP = 2;
hulk.meleeDamage = 10;
hulk.rangedDamage = 30;
hulk.attackRange = 5;
var message = new GameAssignmentMessage();
// message.messageType = MessageType.GAME_ASSIGNMENT;
message.gameID = "6a39c3cf-26d8-409e-a309-45590f38ec4f";
message.characterSelection = new CharacterProperties[] {racoon, quicksilver, hulk};
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void testGameStructure() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GAME_STRUCTURE",
"assignment":"PlayerOne",
"playerOneName":"Gandalf",
"playerTwoName":"Bilbo",
"playerOneCharacters":[
{
"characterID":1,
"name":"Rocket Raccoon",
"HP":100,
"MP":2,
"AP":2,
"meleeDamage":10,
"rangeCombatDamage":30,
"rangeCombatReach":5
},
{
"characterID":2,
"name":"Quicksilver",
"HP":100,
"MP":6,
"AP":1,
"meleeDamage":10,
"rangeCombatDamage":10,
"rangeCombatReach":3
},
{
"characterID":3,
"name":"Hulk",
"HP":100,
"MP":2,
"AP":2,
"meleeDamage":10,
"rangeCombatDamage":30,
"rangeCombatReach":5
}
],
"playerTwoCharacters":[
{
"characterID":19,
"name":"Loki",
"HP":100,
"MP":6,
"AP":1,
"meleeDamage":10,
"rangeCombatDamage":10,
"rangeCombatReach":3
},
{
"characterID":20,
"name":"Silver Surfer",
"HP":100,
"MP":6,
"AP":1,
"meleeDamage":10,
"rangeCombatDamage":10,
"rangeCombatReach":3
}
],
"scenarioconfig":{
"scenario":[
["GRASS","GRASS","GRASS","GRASS","GRASS","GRASS","GRASS"],
["GRASS","GRASS","GRASS","ROCK","GRASS","GRASS","GRASS"],
["GRASS","GRASS","GRASS","ROCK","GRASS","GRASS","GRASS"],
["GRASS","GRASS","GRASS","ROCK","GRASS","GRASS","GRASS"],
["GRASS","GRASS","ROCK","ROCK","ROCK","GRASS","GRASS"],
["GRASS","ROCK","ROCK","ROCK","ROCK","ROCK","GRASS"]
],
"author":"jakobmh",
"name":"asgard"
},
"matchconfig":{
"maxRounds":30,
"maxRoundTime":300,
"maxGameTime":1800,
"maxAnimationTime":50,
"spaceStoneCD":0,
"mindStoneCD":0,
"realityStoneCD":0,
"powerStoneCD":0,
"timeStoneCD":0,
"soulStoneCD":0,
"mindStoneDMG":0,
"maxPauseTime":0,
"maxResponseTime":0
}
}
""".replace("\n", "");
var racoon = new CharacterProperties();
racoon.characterID = 1;
racoon.name = "Rocket Raccoon";
racoon.HP = 100;
racoon.MP = 2;
racoon.AP = 2;
racoon.meleeDamage = 10;
racoon.rangedDamage = 30;
racoon.attackRange = 5;
var quicksilver = new CharacterProperties();
quicksilver.characterID = 2;
quicksilver.name = "Quicksilver";
quicksilver.HP = 100;
quicksilver.MP = 6;
quicksilver.AP = 1;
quicksilver.meleeDamage = 10;
quicksilver.rangedDamage = 10;
quicksilver.attackRange = 3;
var hulk = new CharacterProperties();
hulk.characterID = 3;
hulk.name = "Hulk";
hulk.HP = 100;
hulk.MP = 2;
hulk.AP = 2;
hulk.meleeDamage = 10;
hulk.rangedDamage = 30;
hulk.attackRange = 5;
var loki = new CharacterProperties();
loki.characterID = 19;
loki.name = "Loki";
loki.HP = 100;
loki.MP = 6;
loki.AP = 1;
loki.meleeDamage = 10;
loki.rangedDamage = 10;
loki.attackRange = 3;
var silversurfer = new CharacterProperties();
silversurfer.characterID = 20;
silversurfer.name = "Silver Surfer";
silversurfer.HP = 100;
silversurfer.MP = 6;
silversurfer.AP = 1;
silversurfer.meleeDamage = 10;
silversurfer.rangedDamage = 10;
silversurfer.attackRange = 3;
var scenarioConfig = new ScenarioConfig();
scenarioConfig.scenario = new FieldType[][] {
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.GRASS, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.GRASS, FieldType.GRASS} ,
{FieldType.GRASS, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.ROCK, FieldType.GRASS}
};
scenarioConfig.author = "jakobmh";
scenarioConfig.name = "asgard";
var matchconfig = new PartyConfig();
matchconfig.maxRounds = 30;
matchconfig.maxRoundTime = 300;
matchconfig.maxGameTime = 1800;
matchconfig.maxAnimationTime = 50;
var message = new GameStructureMessage();
// message.messageType = MessageType.GAME_STRUCTURE;
message.assignment = AssignmentEnum.PlayerOne;
message.playerOneName = "Gandalf";
message.playerTwoName = "Bilbo";
message.playerOneCharacters = new CharacterProperties[] {racoon, quicksilver, hulk};
message.playerTwoCharacters = new CharacterProperties[] {loki, silversurfer};
message.scenarioconfig = scenarioConfig;
message.matchconfig = matchconfig;
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void generalAssignmentStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GENERAL_ASSIGNMENT",
"gameID":"6a39c3cf-26d8-409e-a309-45590f38ec4f"
}
""".replace("\n", "");
var message = new GeneralAssignmentMessage();
// message.messageType = MessageType.GENERAL_ASSIGNMENT;
message.gameID = "6a39c3cf-26d8-409e-a309-45590f38ec4f";
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void goodbyeClientStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"GOODBYE_CLIENT",
"message":"und schüss"
}
""".replace("\n", "");
var message = new GoodbyeClientMessage();
message.message = "und schüss";
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void helloClientStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"HELLO_CLIENT",
"runningGame":false
}
""".replace("\n", "");
var message = new HelloClientMessage();
message.runningGame = false;
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void helloServerStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"HELLO_SERVER",
"name":"mynamehere",
"deviceID":"8f966f5a-9b62-456c-b4a3-50c90c75789c"
}
""".replace("\n", "");
var message = new HelloServerMessage();
message.name = "mynamehere";
message.deviceID = "8f966f5a-9b62-456c-b4a3-50c90c75789c";
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void playerReadyStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"PLAYER_READY",
"startGame":false,
"role":"PLAYER"
}
""".replace("\n", "");
var message = new PlayerReadyMessage();
message.startGame = false;
message.role = RoleEnum.PLAYER;
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void reconnectStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"RECONNECT",
"reconnect":false
}
""".replace("\n", "");
var message = new ReconnectMessage();
message.reconnect = false;
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void eventStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"EVENTS",
"messages":[
{
"eventType":"MeleeAttackEvent",
"originEntity":{"entityID":"P1","ID":3},
"targetEntity":{"entityID":"P2","ID":4},
"originField":[3,7],
"targetField":[3,6]
},
{
"eventType":"MoveEvent",
"originEntity":{"entityID":"P1","ID":3},
"originField":[3,7],
"targetField":[3,6]
}
],
"customContentType":"SomeAwesomeCustomContent",
"customContent":{
"customKey":"someFancyValue",
"customInteger":5,
"customTruth":false
}
}
""".replace("\n", "");
var meleeAttackEvent = new EventBuilder(EventType.MeleeAttackEvent)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withTargetEntity(new EntityID(EntityType.P2, 4))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.buildCharacterEvent();
var moveEvent = new EventBuilder(EventType.MoveEvent)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.buildCharacterEvent();
var message = new EventMessage();
message.messages = new Event[] {meleeAttackEvent, moveEvent};
message.customContentType = "SomeAwesomeCustomContent";
message.customContent = new HashMap<>();
message.customContent.put("customKey", "someFancyValue");
message.customContent.put("customInteger", 5);
message.customContent.put("customTruth", false);
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
@Test
void requestStringifyTest() throws JsonProcessingException {
var jsonRepresentingMessage = """
{
"messageType":"REQUESTS",
"messages":[
{
"requestType":"MeleeAttackRequest",
"originEntity":{"entityID":"P1","ID":3},
"targetEntity":{"entityID":"P2","ID":4},
"originField":[3,7],
"targetField":[3,6],
"value":14
},
{
"requestType":"MoveRequest",
"originEntity":{"entityID":"P1","ID":3},
"originField":[3,7],
"targetField":[3,6]
}
],
"customContentType":"SomeAwesomeCustomContent",
"customContent":{
"customKey":"someFancyValue",
"customInteger":5,
"customTruth":false
}
}
""".replace("\n", "");
var meleeAttackRequest = new RequestBuilder(RequestType.MeleeAttackRequest)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withTargetEntity(new EntityID(EntityType.P2, 4))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.withValue(14)
.buildCharacterRequest();
var moveRequest = new RequestBuilder(RequestType.MoveRequest)
.withOriginEntity(new EntityID(EntityType.P1, 3))
.withOriginField(new IntVector2(3, 7))
.withTargetField(new IntVector2(3, 6))
.buildCharacterRequest();
var message = new RequestMessage();
message.messages = new Request[] {meleeAttackRequest, moveRequest};
message.customContentType = "SomeAwesomeCustomContent";
message.customContent = new HashMap<>();
message.customContent.put("customKey", "someFancyValue");
message.customContent.put("customInteger", 5);
message.customContent.put("customTruth", false);
assertThat(json.stringify(message).get())
.isEqualTo(jsonRepresentingMessage);
}
}