summaryrefslogtreecommitdiff
path: root/backend/src
diff options
context:
space:
mode:
Diffstat (limited to 'backend/src')
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/game/boards/Board.java9
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/game/data/GameDefinitionLoader.java3
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializer.java75
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializer.java78
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/game/effects/ProductionIncrease.java13
-rw-r--r--backend/src/main/resources/org/luxons/sevenwonders/game/data/cards.json4
-rw-r--r--backend/src/main/resources/org/luxons/sevenwonders/game/data/wonders.json6
-rw-r--r--backend/src/test/java/org/luxons/sevenwonders/game/boards/BoardTest.java1
-rw-r--r--backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializerTest.java77
-rw-r--r--backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializerTest.java198
-rw-r--r--backend/src/test/java/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.java24
11 files changed, 383 insertions, 105 deletions
diff --git a/backend/src/main/java/org/luxons/sevenwonders/game/boards/Board.java b/backend/src/main/java/org/luxons/sevenwonders/game/boards/Board.java
index ab557d38..6ba776c7 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/game/boards/Board.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/game/boards/Board.java
@@ -29,6 +29,8 @@ public class Board {
private final Production production = new Production();
+ private final Production publicProduction = new Production();
+
private final Science science = new Science();
private final TradingRules tradingRules;
@@ -53,6 +55,7 @@ public class Board {
this.military = new Military(settings);
this.pointsPer3Gold = settings.getPointsPer3Gold();
this.production.addFixedResource(wonder.getInitialResource(), 1);
+ this.publicProduction.addFixedResource(wonder.getInitialResource(), 1);
}
public Wonder getWonder() {
@@ -71,7 +74,7 @@ public class Board {
playedCards.add(card);
}
- public int getNbCardsOfColor(List<Color> colorFilter) {
+ int getNbCardsOfColor(List<Color> colorFilter) {
return (int) playedCards.stream().filter(c -> colorFilter.contains(c.getColor())).count();
}
@@ -83,6 +86,10 @@ public class Board {
return production;
}
+ public Production getPublicProduction() {
+ return publicProduction;
+ }
+
public TradingRules getTradingRules() {
return tradingRules;
}
diff --git a/backend/src/main/java/org/luxons/sevenwonders/game/data/GameDefinitionLoader.java b/backend/src/main/java/org/luxons/sevenwonders/game/data/GameDefinitionLoader.java
index 30457d86..f0da6d63 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/game/data/GameDefinitionLoader.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/game/data/GameDefinitionLoader.java
@@ -11,6 +11,7 @@ import org.luxons.sevenwonders.game.data.definitions.DecksDefinition;
import org.luxons.sevenwonders.game.data.definitions.WonderDefinition;
import org.luxons.sevenwonders.game.data.serializers.NumericEffectSerializer;
import org.luxons.sevenwonders.game.data.serializers.ProductionIncreaseSerializer;
+import org.luxons.sevenwonders.game.data.serializers.ProductionSerializer;
import org.luxons.sevenwonders.game.data.serializers.ResourceTypeSerializer;
import org.luxons.sevenwonders.game.data.serializers.ResourceTypesSerializer;
import org.luxons.sevenwonders.game.data.serializers.ResourcesSerializer;
@@ -20,6 +21,7 @@ import org.luxons.sevenwonders.game.effects.MilitaryReinforcements;
import org.luxons.sevenwonders.game.effects.ProductionIncrease;
import org.luxons.sevenwonders.game.effects.RawPointsIncrease;
import org.luxons.sevenwonders.game.effects.ScienceProgress;
+import org.luxons.sevenwonders.game.resources.Production;
import org.luxons.sevenwonders.game.resources.ResourceType;
import org.luxons.sevenwonders.game.resources.Resources;
import org.springframework.stereotype.Component;
@@ -74,6 +76,7 @@ public class GameDefinitionLoader {
.registerTypeAdapter(Resources.class, new ResourcesSerializer())
.registerTypeAdapter(ResourceType.class, new ResourceTypeSerializer())
.registerTypeAdapter(resourceTypeList, new ResourceTypesSerializer())
+ .registerTypeAdapter(Production.class, new ProductionSerializer())
.registerTypeAdapter(ProductionIncrease.class, new ProductionIncreaseSerializer())
.registerTypeAdapter(MilitaryReinforcements.class, new NumericEffectSerializer())
.registerTypeAdapter(RawPointsIncrease.class, new NumericEffectSerializer())
diff --git a/backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializer.java b/backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializer.java
index 6c70a44d..b1467900 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializer.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializer.java
@@ -1,84 +1,55 @@
package org.luxons.sevenwonders.game.data.serializers;
import java.lang.reflect.Type;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
import org.luxons.sevenwonders.game.effects.ProductionIncrease;
import org.luxons.sevenwonders.game.resources.Production;
-import org.luxons.sevenwonders.game.resources.ResourceType;
-import org.luxons.sevenwonders.game.resources.Resources;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
-import com.google.gson.JsonNull;
import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
-public class ProductionIncreaseSerializer implements JsonSerializer<ProductionIncrease>,
- JsonDeserializer<ProductionIncrease> {
+public class ProductionIncreaseSerializer
+ implements JsonSerializer<ProductionIncrease>, JsonDeserializer<ProductionIncrease> {
@Override
public JsonElement serialize(ProductionIncrease productionIncrease, Type typeOfSrc,
- JsonSerializationContext context) {
+ JsonSerializationContext context) {
Production production = productionIncrease.getProduction();
- Resources fixedResources = production.getFixedResources();
- List<Set<ResourceType>> choices = production.getAlternativeResources();
- if (fixedResources.isEmpty()) {
- return serializeAsChoice(choices, context);
- } else if (choices.isEmpty()) {
- return serializeAsResources(fixedResources, context);
- } else {
- throw new IllegalArgumentException("Cannot serialize a production with mixed fixed resources and choices");
+ JsonElement json = context.serialize(production);
+ if (!json.isJsonNull() && !productionIncrease.isSellable()) {
+ return new JsonPrimitive(wrapInBrackets(json.getAsString()));
}
+ return json;
}
- private JsonElement serializeAsResources(Resources fixedResources, JsonSerializationContext context) {
- return context.serialize(fixedResources);
- }
-
- private JsonElement serializeAsChoice(List<Set<ResourceType>> choices, JsonSerializationContext context) {
- if (choices.isEmpty()) {
- return JsonNull.INSTANCE;
- }
- if (choices.size() > 1) {
- throw new IllegalArgumentException("Cannot serialize a production with more than one choice");
- }
- String str = choices.get(0).stream()
- .map(ResourceType::getSymbol)
- .map(Object::toString)
- .collect(Collectors.joining("/"));
- return context.serialize(str);
+ private String wrapInBrackets(String str) {
+ return '(' + str + ')';
}
@Override
- public ProductionIncrease deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws
- JsonParseException {
- String s = json.getAsString();
+ public ProductionIncrease deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
ProductionIncrease productionIncrease = new ProductionIncrease();
- Production production = new Production();
- if (s.contains("/")) {
- production.addChoice(createChoice(s));
- } else {
- Resources fixedResources = context.deserialize(json, Resources.class);
- production.addAll(fixedResources);
+
+ String resourcesStr = json.getAsString();
+ boolean isSellable = !resourcesStr.startsWith("(");
+ if (!isSellable) {
+ resourcesStr = unwrapBrackets(resourcesStr);
+ json = new JsonPrimitive(resourcesStr);
}
+ productionIncrease.setSellable(isSellable);
+
+ Production production = context.deserialize(json, Production.class);
productionIncrease.setProduction(production);
return productionIncrease;
}
- private ResourceType[] createChoice(String choiceStr) {
- String[] symbols = choiceStr.split("/");
- ResourceType[] choice = new ResourceType[symbols.length];
- for (int i = 0; i < symbols.length; i++) {
- if (symbols[i].length() != 1) {
- throw new IllegalArgumentException("Choice elements must be resource types, got " + symbols[i]);
- }
- choice[i] = ResourceType.fromSymbol(symbols[i].charAt(0));
- }
- return choice;
+ private static String unwrapBrackets(String str) {
+ return str.substring(1, str.length() - 1);
}
}
diff --git a/backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializer.java b/backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializer.java
new file mode 100644
index 00000000..eead39c3
--- /dev/null
+++ b/backend/src/main/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializer.java
@@ -0,0 +1,78 @@
+package org.luxons.sevenwonders.game.data.serializers;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.luxons.sevenwonders.game.resources.Production;
+import org.luxons.sevenwonders.game.resources.ResourceType;
+import org.luxons.sevenwonders.game.resources.Resources;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+public class ProductionSerializer implements JsonSerializer<Production>, JsonDeserializer<Production> {
+
+ @Override
+ public JsonElement serialize(Production production, Type typeOfSrc, JsonSerializationContext context) {
+ Resources fixedResources = production.getFixedResources();
+ List<Set<ResourceType>> choices = production.getAlternativeResources();
+ if (fixedResources.isEmpty()) {
+ return serializeAsChoice(choices, context);
+ } else if (choices.isEmpty()) {
+ return serializeAsResources(fixedResources, context);
+ } else {
+ throw new IllegalArgumentException("Cannot serialize a production with mixed fixed resources and choices");
+ }
+ }
+
+ private static JsonElement serializeAsChoice(List<Set<ResourceType>> choices, JsonSerializationContext context) {
+ if (choices.isEmpty()) {
+ return JsonNull.INSTANCE;
+ }
+ if (choices.size() > 1) {
+ throw new IllegalArgumentException("Cannot serialize a production with more than one choice");
+ }
+ String str = choices.get(0).stream()
+ .map(ResourceType::getSymbol)
+ .map(Object::toString)
+ .collect(Collectors.joining("/"));
+ return context.serialize(str);
+ }
+
+ private static JsonElement serializeAsResources(Resources fixedResources, JsonSerializationContext context) {
+ return context.serialize(fixedResources);
+ }
+
+ @Override
+ public Production deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws
+ JsonParseException {
+ String resourcesStr = json.getAsString();
+ Production production = new Production();
+ if (resourcesStr.contains("/")) {
+ production.addChoice(createChoice(resourcesStr));
+ } else {
+ Resources fixedResources = context.deserialize(json, Resources.class);
+ production.addAll(fixedResources);
+ }
+ return production;
+ }
+
+ private ResourceType[] createChoice(String choiceStr) {
+ String[] symbols = choiceStr.split("/");
+ ResourceType[] choice = new ResourceType[symbols.length];
+ for (int i = 0; i < symbols.length; i++) {
+ if (symbols[i].length() != 1) {
+ throw new IllegalArgumentException("Choice elements must be resource types, got " + symbols[i]);
+ }
+ choice[i] = ResourceType.fromSymbol(symbols[i].charAt(0));
+ }
+ return choice;
+ }
+}
diff --git a/backend/src/main/java/org/luxons/sevenwonders/game/effects/ProductionIncrease.java b/backend/src/main/java/org/luxons/sevenwonders/game/effects/ProductionIncrease.java
index 9724dfcd..30bcc625 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/game/effects/ProductionIncrease.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/game/effects/ProductionIncrease.java
@@ -9,6 +9,8 @@ public class ProductionIncrease extends InstantOwnBoardEffect {
private Production production = new Production();
+ private boolean sellable = true;
+
public Production getProduction() {
return production;
}
@@ -17,9 +19,20 @@ public class ProductionIncrease extends InstantOwnBoardEffect {
this.production = production;
}
+ public boolean isSellable() {
+ return sellable;
+ }
+
+ public void setSellable(boolean sellable) {
+ this.sellable = sellable;
+ }
+
@Override
public void apply(Board board) {
board.getProduction().addAll(production);
+ if (sellable) {
+ board.getPublicProduction().addAll(production);
+ }
}
@Override
diff --git a/backend/src/main/resources/org/luxons/sevenwonders/game/data/cards.json b/backend/src/main/resources/org/luxons/sevenwonders/game/data/cards.json
index bf48e95a..83777d9e 100644
--- a/backend/src/main/resources/org/luxons/sevenwonders/game/data/cards.json
+++ b/backend/src/main/resources/org/luxons/sevenwonders/game/data/cards.json
@@ -733,7 +733,7 @@
"name": "Caravansery",
"color": "YELLOW",
"effect": {
- "production": "W/S/O/C"
+ "production": "(W/S/O/C)"
},
"requirements": {
"gold": 0,
@@ -756,7 +756,7 @@
"name": "Forum",
"color": "YELLOW",
"effect": {
- "production": "G/P/L"
+ "production": "(G/P/L)"
},
"requirements": {
"gold": 0,
diff --git a/backend/src/main/resources/org/luxons/sevenwonders/game/data/wonders.json b/backend/src/main/resources/org/luxons/sevenwonders/game/data/wonders.json
index 9b4d0587..5beceadd 100644
--- a/backend/src/main/resources/org/luxons/sevenwonders/game/data/wonders.json
+++ b/backend/src/main/resources/org/luxons/sevenwonders/game/data/wonders.json
@@ -20,7 +20,7 @@
"resources": "OO"
},
"effects": {
- "production": "W/S/O/C"
+ "production": "(W/S/O/C)"
}
},
{
@@ -44,7 +44,7 @@
"resources": "CC"
},
"effects": {
- "production": "W/S/O/C"
+ "production": "(W/S/O/C)"
}
},
{
@@ -53,7 +53,7 @@
"resources": "WW"
},
"effects": {
- "production": "G/P/L"
+ "production": "(G/P/L)"
}
},
{
diff --git a/backend/src/test/java/org/luxons/sevenwonders/game/boards/BoardTest.java b/backend/src/test/java/org/luxons/sevenwonders/game/boards/BoardTest.java
index f9117146..5756b36a 100644
--- a/backend/src/test/java/org/luxons/sevenwonders/game/boards/BoardTest.java
+++ b/backend/src/test/java/org/luxons/sevenwonders/game/boards/BoardTest.java
@@ -62,6 +62,7 @@ public class BoardTest {
Board board = new Board(TestUtils.createWonder(type), null, new Settings(5));
Resources resources = TestUtils.createResources(type);
assertTrue(board.getProduction().contains(resources));
+ assertTrue(board.getPublicProduction().contains(resources));
}
@Theory
diff --git a/backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializerTest.java b/backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializerTest.java
index 17940361..f4b41628 100644
--- a/backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializerTest.java
+++ b/backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionIncreaseSerializerTest.java
@@ -26,11 +26,12 @@ public class ProductionIncreaseSerializerTest {
gson = new GsonBuilder().registerTypeAdapter(Resources.class, new ResourcesSerializer())
.registerTypeAdapter(ResourceType.class, new ResourceTypeSerializer())
.registerTypeAdapter(resourceTypeList, new ResourceTypesSerializer())
+ .registerTypeAdapter(Production.class, new ProductionSerializer())
.registerTypeAdapter(ProductionIncrease.class, new ProductionIncreaseSerializer())
.create();
}
- private static ProductionIncrease create(int wood, int stone, int clay) {
+ private static ProductionIncrease create(boolean sellable, int wood, int stone, int clay) {
Production production = new Production();
if (wood > 0) {
production.addFixedResource(ResourceType.WOOD, wood);
@@ -43,14 +44,16 @@ public class ProductionIncreaseSerializerTest {
}
ProductionIncrease prodIncrease = new ProductionIncrease();
prodIncrease.setProduction(production);
+ prodIncrease.setSellable(sellable);
return prodIncrease;
}
- private static ProductionIncrease createChoice(ResourceType... types) {
+ private static ProductionIncrease createChoice(boolean sellable, ResourceType... types) {
Production production = new Production();
production.addChoice(types);
ProductionIncrease prodIncrease = new ProductionIncrease();
prodIncrease.setProduction(production);
+ prodIncrease.setSellable(sellable);
return prodIncrease;
}
@@ -67,62 +70,62 @@ public class ProductionIncreaseSerializerTest {
@Test
public void serialize_singleType() {
- ProductionIncrease prodIncrease = create(1, 0, 0);
+ ProductionIncrease prodIncrease = create(true, 1, 0, 0);
assertEquals("\"W\"", gson.toJson(prodIncrease, ProductionIncrease.class));
}
@Test
- public void serialize_multipleTimesSameType() {
- ProductionIncrease prodIncrease = create(3, 0, 0);
- assertEquals("\"WWW\"", gson.toJson(prodIncrease, ProductionIncrease.class));
- }
-
- @Test
public void serialize_mixedTypes() {
- ProductionIncrease prodIncrease = create(1, 1, 1);
+ ProductionIncrease prodIncrease = create(true, 1, 1, 1);
assertEquals("\"WSC\"", gson.toJson(prodIncrease, ProductionIncrease.class));
}
@Test
- public void serialize_mixedTypesMultiple() {
- ProductionIncrease prodIncrease = create(2, 1, 2);
- assertEquals("\"WWSCC\"", gson.toJson(prodIncrease, ProductionIncrease.class));
+ public void serialize_mixedTypes_notSellable() {
+ ProductionIncrease prodIncrease = create(false, 1, 1, 1);
+ assertEquals("\"(WSC)\"", gson.toJson(prodIncrease, ProductionIncrease.class));
}
@Test
public void serialize_choice2() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY);
+ ProductionIncrease prodIncrease = createChoice(true, ResourceType.WOOD, ResourceType.CLAY);
assertEquals("\"W/C\"", gson.toJson(prodIncrease, ProductionIncrease.class));
}
@Test
public void serialize_choice3() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.WOOD, ResourceType.ORE, ResourceType.CLAY);
+ ProductionIncrease prodIncrease = createChoice(true, ResourceType.WOOD, ResourceType.ORE, ResourceType.CLAY);
assertEquals("\"W/O/C\"", gson.toJson(prodIncrease, ProductionIncrease.class));
}
@Test
+ public void serialize_choice3_notSellable() {
+ ProductionIncrease prodIncrease = createChoice(false, ResourceType.WOOD, ResourceType.ORE, ResourceType.CLAY);
+ assertEquals("\"(W/O/C)\"", gson.toJson(prodIncrease, ProductionIncrease.class));
+ }
+
+ @Test
public void serialize_choice2_unordered() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.CLAY, ResourceType.WOOD);
+ ProductionIncrease prodIncrease = createChoice(true, ResourceType.CLAY, ResourceType.WOOD);
assertEquals("\"W/C\"", gson.toJson(prodIncrease, ProductionIncrease.class));
}
@Test
public void serialize_choice3_unordered() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY, ResourceType.ORE);
+ ProductionIncrease prodIncrease = createChoice(true, ResourceType.WOOD, ResourceType.CLAY, ResourceType.ORE);
assertEquals("\"W/O/C\"", gson.toJson(prodIncrease, ProductionIncrease.class));
}
@Test(expected = IllegalArgumentException.class)
public void serialize_failIfMultipleChoices() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY);
+ ProductionIncrease prodIncrease = createChoice(true, ResourceType.WOOD, ResourceType.CLAY);
prodIncrease.getProduction().addChoice(ResourceType.ORE, ResourceType.GLASS);
gson.toJson(prodIncrease, ProductionIncrease.class);
}
@Test(expected = IllegalArgumentException.class)
public void serialize_failIfMixedFixedAndChoices() {
- ProductionIncrease prodIncrease = create(1, 0, 0);
+ ProductionIncrease prodIncrease = create(true, 1, 0, 0);
prodIncrease.getProduction().addChoice(ResourceType.WOOD, ResourceType.CLAY);
gson.toJson(prodIncrease, ProductionIncrease.class);
}
@@ -150,50 +153,32 @@ public class ProductionIncreaseSerializerTest {
@Test
public void deserialize_singleType() {
- ProductionIncrease prodIncrease = create(1, 0, 0);
+ ProductionIncrease prodIncrease = create(true, 1, 0, 0);
assertEquals(prodIncrease, gson.fromJson("\"W\"", ProductionIncrease.class));
}
@Test
- public void deserialize_multipleTimesSameType() {
- ProductionIncrease prodIncrease = create(3, 0, 0);
- assertEquals(prodIncrease, gson.fromJson("\"WWW\"", ProductionIncrease.class));
+ public void deserialize_multipleTimesSameType_notSellable() {
+ ProductionIncrease prodIncrease = create(false, 3, 0, 0);
+ assertEquals(prodIncrease, gson.fromJson("\"(WWW)\"", ProductionIncrease.class));
}
@Test
public void deserialize_mixedTypes() {
- ProductionIncrease prodIncrease = create(1, 1, 1);
+ ProductionIncrease prodIncrease = create(true, 1, 1, 1);
assertEquals(prodIncrease, gson.fromJson("\"WCS\"", ProductionIncrease.class));
}
@Test
- public void deserialize_mixedTypes_unordered() {
- ProductionIncrease prodIncrease = create(1, 3, 2);
- assertEquals(prodIncrease, gson.fromJson("\"SCWCSS\"", ProductionIncrease.class));
- }
-
- @Test
public void deserialize_choice2() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY);
- assertEquals(prodIncrease, gson.fromJson("\"W/C\"", ProductionIncrease.class));
- }
-
- @Test
- public void deserialize_choice3() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.WOOD, ResourceType.ORE, ResourceType.CLAY);
- assertEquals(prodIncrease, gson.fromJson("\"W/O/C\"", ProductionIncrease.class));
- }
-
- @Test
- public void deserialize_choice2_unordered() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.CLAY, ResourceType.WOOD);
+ ProductionIncrease prodIncrease = createChoice(true, ResourceType.WOOD, ResourceType.CLAY);
assertEquals(prodIncrease, gson.fromJson("\"W/C\"", ProductionIncrease.class));
}
@Test
- public void deserialize_choice3_unordered() {
- ProductionIncrease prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY, ResourceType.ORE);
- assertEquals(prodIncrease, gson.fromJson("\"W/O/C\"", ProductionIncrease.class));
+ public void deserialize_choice3_notSellable() {
+ ProductionIncrease prodIncrease = createChoice(false, ResourceType.WOOD, ResourceType.ORE, ResourceType.CLAY);
+ assertEquals(prodIncrease, gson.fromJson("\"(W/O/C)\"", ProductionIncrease.class));
}
@Test(expected = IllegalArgumentException.class)
diff --git a/backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializerTest.java b/backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializerTest.java
new file mode 100644
index 00000000..34a06ce4
--- /dev/null
+++ b/backend/src/test/java/org/luxons/sevenwonders/game/data/serializers/ProductionSerializerTest.java
@@ -0,0 +1,198 @@
+package org.luxons.sevenwonders.game.data.serializers;
+
+import java.lang.reflect.Type;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.luxons.sevenwonders.game.resources.Production;
+import org.luxons.sevenwonders.game.resources.ResourceType;
+import org.luxons.sevenwonders.game.resources.Resources;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import static org.junit.Assert.*;
+
+public class ProductionSerializerTest {
+
+ private Gson gson;
+
+ @Before
+ public void setUp() {
+ Type resourceTypeList = new TypeToken<List<ResourceType>>() {}.getType();
+ gson = new GsonBuilder().registerTypeAdapter(Resources.class, new ResourcesSerializer())
+ .registerTypeAdapter(ResourceType.class, new ResourceTypeSerializer())
+ .registerTypeAdapter(resourceTypeList, new ResourceTypesSerializer())
+ .registerTypeAdapter(Production.class, new ProductionSerializer())
+ .create();
+ }
+
+ private static Production create(int wood, int stone, int clay) {
+ Production production = new Production();
+ if (wood > 0) {
+ production.addFixedResource(ResourceType.WOOD, wood);
+ }
+ if (stone > 0) {
+ production.addFixedResource(ResourceType.STONE, stone);
+ }
+ if (clay > 0) {
+ production.addFixedResource(ResourceType.CLAY, clay);
+ }
+ return production;
+ }
+
+ private static Production createChoice(ResourceType... types) {
+ Production production = new Production();
+ production.addChoice(types);
+ return production;
+ }
+
+ @Test
+ public void serialize_nullAsNull() {
+ assertEquals("null", gson.toJson(null, Production.class));
+ }
+
+ @Test
+ public void serialize_emptyProdIncreaseAsNull() {
+ Production prodIncrease = new Production();
+ assertEquals("null", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_singleType() {
+ Production prodIncrease = create(1, 0, 0);
+ assertEquals("\"W\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_multipleTimesSameType() {
+ Production prodIncrease = create(3, 0, 0);
+ assertEquals("\"WWW\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_mixedTypes() {
+ Production prodIncrease = create(1, 1, 1);
+ assertEquals("\"WSC\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_mixedTypesMultiple() {
+ Production prodIncrease = create(2, 1, 2);
+ assertEquals("\"WWSCC\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_choice2() {
+ Production prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY);
+ assertEquals("\"W/C\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_choice3() {
+ Production prodIncrease = createChoice(ResourceType.WOOD, ResourceType.ORE, ResourceType.CLAY);
+ assertEquals("\"W/O/C\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_choice2_unordered() {
+ Production prodIncrease = createChoice(ResourceType.CLAY, ResourceType.WOOD);
+ assertEquals("\"W/C\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test
+ public void serialize_choice3_unordered() {
+ Production prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY, ResourceType.ORE);
+ assertEquals("\"W/O/C\"", gson.toJson(prodIncrease, Production.class));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void serialize_failIfMultipleChoices() {
+ Production production = createChoice(ResourceType.WOOD, ResourceType.CLAY);
+ production.addChoice(ResourceType.ORE, ResourceType.GLASS);
+ gson.toJson(production, Production.class);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void serialize_failIfMixedFixedAndChoices() {
+ Production production = create(1, 0, 0);
+ production.addChoice(ResourceType.WOOD, ResourceType.CLAY);
+ gson.toJson(production, Production.class);
+ }
+
+ @Test
+ public void deserialize_nullFromNull() {
+ assertNull(gson.fromJson("null", Production.class));
+ }
+
+ @Test
+ public void deserialize_emptyList() {
+ Production prodIncrease = new Production();
+ assertEquals(prodIncrease, gson.fromJson("\"\"", Production.class));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void deserialize_failOnGarbageString() {
+ gson.fromJson("\"this is garbage\"", Production.class);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void deserialize_failOnGarbageStringWithSlashes() {
+ gson.fromJson("\"this/is/garbage\"", Production.class);
+ }
+
+ @Test
+ public void deserialize_singleType() {
+ Production prodIncrease = create(1, 0, 0);
+ assertEquals(prodIncrease, gson.fromJson("\"W\"", Production.class));
+ }
+
+ @Test
+ public void deserialize_multipleTimesSameType() {
+ Production prodIncrease = create(3, 0, 0);
+ assertEquals(prodIncrease, gson.fromJson("\"WWW\"", Production.class));
+ }
+
+ @Test
+ public void deserialize_mixedTypes() {
+ Production prodIncrease = create(1, 1, 1);
+ assertEquals(prodIncrease, gson.fromJson("\"WCS\"", Production.class));
+ }
+
+ @Test
+ public void deserialize_mixedTypes_unordered() {
+ Production prodIncrease = create(1, 3, 2);
+ assertEquals(prodIncrease, gson.fromJson("\"SCWCSS\"", Production.class));
+ }
+
+ @Test
+ public void deserialize_choice2() {
+ Production prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY);
+ assertEquals(prodIncrease, gson.fromJson("\"W/C\"", Production.class));
+ }
+
+ @Test
+ public void deserialize_choice3() {
+ Production prodIncrease = createChoice(ResourceType.WOOD, ResourceType.ORE, ResourceType.CLAY);
+ assertEquals(prodIncrease, gson.fromJson("\"W/O/C\"", Production.class));
+ }
+
+ @Test
+ public void deserialize_choice2_unordered() {
+ Production prodIncrease = createChoice(ResourceType.CLAY, ResourceType.WOOD);
+ assertEquals(prodIncrease, gson.fromJson("\"W/C\"", Production.class));
+ }
+
+ @Test
+ public void deserialize_choice3_unordered() {
+ Production prodIncrease = createChoice(ResourceType.WOOD, ResourceType.CLAY, ResourceType.ORE);
+ assertEquals(prodIncrease, gson.fromJson("\"W/O/C\"", Production.class));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void deserialize_failOnMultipleResourcesInChoice() {
+ gson.fromJson("\"W/SS/C\"", Production.class);
+ }
+
+} \ No newline at end of file
diff --git a/backend/src/test/java/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.java b/backend/src/test/java/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.java
index 6031e112..d19f6288 100644
--- a/backend/src/test/java/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.java
+++ b/backend/src/test/java/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.java
@@ -28,17 +28,39 @@ public class ProductionIncreaseTest {
}
@Theory
- public void apply_boardContainsAddedResourceType(ResourceType initialType, ResourceType addedType, ResourceType extraType) {
+ public void apply_boardContainsAddedResourceType(ResourceType initialType, ResourceType addedType,
+ ResourceType extraType) {
Board board = TestUtils.createBoard(initialType);
ProductionIncrease effect = createProductionIncrease(addedType);
+ effect.setSellable(false);
effect.apply(board);
Resources resources = TestUtils.createResources(initialType, addedType);
assertTrue(board.getProduction().contains(resources));
+ assertFalse(board.getPublicProduction().contains(resources));
Resources moreResources = TestUtils.createResources(initialType, addedType, extraType);
assertFalse(board.getProduction().contains(moreResources));
+ assertFalse(board.getPublicProduction().contains(moreResources));
+ }
+
+ @Theory
+ public void apply_boardContainsAddedResourceType_sellable(ResourceType initialType, ResourceType addedType,
+ ResourceType extraType) {
+ Board board = TestUtils.createBoard(initialType);
+ ProductionIncrease effect = createProductionIncrease(addedType);
+ effect.setSellable(true);
+
+ effect.apply(board);
+
+ Resources resources = TestUtils.createResources(initialType, addedType);
+ assertTrue(board.getProduction().contains(resources));
+ assertTrue(board.getPublicProduction().contains(resources));
+
+ Resources moreResources = TestUtils.createResources(initialType, addedType, extraType);
+ assertFalse(board.getProduction().contains(moreResources));
+ assertFalse(board.getPublicProduction().contains(moreResources));
}
@Theory
bgstack15