diff --git a/.vscode/java.code-snippets b/.vscode/java.code-snippets
new file mode 100644
index 0000000..0031f52
--- /dev/null
+++ b/.vscode/java.code-snippets
@@ -0,0 +1,65 @@
+{
+ "Serializer": {
+ "prefix": ["srz", "sz"],
+ "description": "Boilerplate for a jackson serializer",
+ "body": [
+ "import java.io.IOException;",
+ "",
+ "import com.fasterxml.jackson.core.JsonGenerator;",
+ "import com.fasterxml.jackson.databind.SerializerProvider;",
+ "import com.fasterxml.jackson.databind.ser.std.StdSerializer;",
+ "",
+ "public class ${1:Item}Serializer extends StdSerializer<${1:Item}> {",
+ " public ${1:Item}Serializer() {",
+ " this(null);",
+ " }",
+ "",
+ " public ${1:Item}Serializer(Class<${1:Item}> t) {",
+ " super(t);",
+ " }",
+ "",
+ " @Override",
+ " public void serialize(${1:Item} ${2:item}, JsonGenerator jgenerator, SerializerProvider provider) throws IOException {",
+ " $0",
+ " }",
+ "}"
+ ]
+ },
+ "Deserializer": {
+ "prefix": ["dsz"],
+ "description": "Boilerplate for a jackson deserializer",
+ "body": [
+ "import java.io.IOException;",
+ "",
+ "import com.fasterxml.jackson.core.JacksonException;",
+ "import com.fasterxml.jackson.core.JsonParser;",
+ "import com.fasterxml.jackson.databind.DeserializationContext;",
+ "import com.fasterxml.jackson.databind.deser.std.StdDeserializer;",
+ "",
+ "public class ${1:Item}Deserializer extends StdDeserializer<${1:Item}> {",
+ " public ${1:Item}Deserializer() {",
+ " this(null);",
+ " }",
+ "",
+ " public ${1:Item}Deserializer(Class<${1:Item}> t) {",
+ " super(t);",
+ " }",
+ "",
+ " @Override",
+ " public ${1:Item} deserialize(JsonParser jparser, DeserializationContext context) throws IOException, JacksonException {",
+ " $0",
+ " }",
+ "}"
+ ]
+ },
+ "Test": {
+ "prefix": ["tst"],
+ "description": "Boilerplate for a standard test",
+ "body": [
+ "@Test",
+ "public void test$1() {",
+ " $0",
+ "}"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/flashy/core/pom.xml b/flashy/core/pom.xml
index 70f7ff7..ccddca8 100644
--- a/flashy/core/pom.xml
+++ b/flashy/core/pom.xml
@@ -10,4 +10,14 @@
core
Core
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.13.0-rc2
+
+
+
\ No newline at end of file
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/CardContent.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/CardContent.java
new file mode 100644
index 0000000..32dac8f
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/CardContent.java
@@ -0,0 +1,30 @@
+package it1901.groups_2021.gr2141.core.models;
+
+import java.util.List;
+
+public class CardContent {
+ private List lines;
+
+ public CardContent(List lines) {
+ if (lines == null || lines.size() == 0)
+ throw new IllegalArgumentException("Lines can not be null/empty");
+
+ this.lines = lines;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof CardContent))
+ return false;
+
+ return this.getLines().equals(((CardContent) obj).getLines());
+ }
+
+ public boolean isEmpty() {
+ return lines.isEmpty();
+ }
+
+ public List getLines() {
+ return lines;
+ }
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/CardDeck.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/CardDeck.java
new file mode 100644
index 0000000..a7bf22b
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/CardDeck.java
@@ -0,0 +1,77 @@
+package it1901.groups_2021.gr2141.core.models;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+public class CardDeck {
+ private List flashcards;
+ private List> onChangedListeners;
+
+ public CardDeck() {
+ this.flashcards = new ArrayList<>();
+ }
+
+ public CardDeck(List flashcards) {
+ if (flashcards == null)
+ throw new IllegalArgumentException("Flashcards can not be null");
+
+ this.flashcards = flashcards;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof CardDeck))
+ return false;
+
+ return this.getFlashcards().equals(((CardDeck) obj).getFlashcards());
+ }
+
+ public List getFlashcards() {
+ return flashcards;
+ }
+
+ public int getNumberOfCards() {
+ return flashcards.size();
+ }
+
+ public void onChanged(Consumer function) {
+ if (function == null)
+ throw new IllegalArgumentException("Function can not be null");
+
+ this.onChangedListeners.add(function);
+ }
+
+ private void updateListeners() {
+ onChangedListeners.forEach((f) -> f.accept(this));
+ }
+
+ public void add(Flashcard card) {
+ if (card == null)
+ throw new IllegalArgumentException("Flashcard can not be null");
+
+ flashcards.add(card);
+ updateListeners();
+ }
+
+ public void update(int index, Flashcard card) {
+ if (card == null)
+ throw new IllegalArgumentException("Flashcard can not be null");
+
+ if (index < 0 || index > flashcards.size())
+ throw new IllegalArgumentException("Can not update card at index: " + index);
+
+ flashcards.remove(index);
+ flashcards.add(index, card);
+ updateListeners();
+ }
+
+ public void remove(int index) {
+ if (index < 0 || index > flashcards.size())
+ throw new IllegalArgumentException("Can not remove card at index: " + index);
+
+ flashcards.remove(index);
+ updateListeners();
+ }
+
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/Flashcard.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/Flashcard.java
new file mode 100644
index 0000000..0a2c885
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/Flashcard.java
@@ -0,0 +1,43 @@
+package it1901.groups_2021.gr2141.core.models;
+
+public class Flashcard {
+ private CardContent front;
+ private CardContent back;
+
+ public Flashcard(CardContent front, CardContent back) {
+ if (front == null || back == null)
+ throw new IllegalArgumentException("Card Content can not be null");
+ this.front = front;
+ this.back = back;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Flashcard))
+ return false;
+
+ Flashcard card2 = (Flashcard) obj;
+ return this.getFront().equals(card2.getFront()) && this.getBack().equals(card2.getBack());
+ }
+
+ public CardContent getFront() {
+ return front;
+ }
+
+ public CardContent getBack() {
+ return back;
+ }
+
+ public void setFront(CardContent front) {
+ if (front.isEmpty())
+ throw new IllegalArgumentException("Card Content can not be empty");
+ this.front = front;
+ }
+
+ public void setBack(CardContent back) {
+ if (back.isEmpty())
+ throw new IllegalArgumentException("Card Content can not be empty");
+ this.back = back;
+ }
+
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardContentDeserializer.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardContentDeserializer.java
new file mode 100644
index 0000000..da2b1b7
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardContentDeserializer.java
@@ -0,0 +1,39 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import it1901.groups_2021.gr2141.core.models.CardContent;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+public class CardContentDeserializer extends StdDeserializer {
+ public CardContentDeserializer() {
+ this(null);
+ }
+
+ public CardContentDeserializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public CardContent deserialize(JsonParser jparser, DeserializationContext context)
+ throws IOException, JacksonException {
+ JsonNode node = jparser.getCodec().readTree(jparser);
+ return deserialize(node);
+ }
+
+ CardContent deserialize(JsonNode node) {
+ List lines = new ArrayList<>();
+
+ for (JsonNode n : node.get("lines"))
+ lines.add(n.asText());
+
+ return new CardContent(lines);
+ }
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardContentSerializer.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardContentSerializer.java
new file mode 100644
index 0000000..f19a2f8
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardContentSerializer.java
@@ -0,0 +1,32 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import it1901.groups_2021.gr2141.core.models.CardContent;
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class CardContentSerializer extends StdSerializer {
+ public CardContentSerializer() {
+ this(null);
+ }
+
+ public CardContentSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(CardContent cardContent, JsonGenerator jgenerator, SerializerProvider provider)
+ throws IOException {
+ jgenerator.writeStartObject();
+ jgenerator.writeFieldName("lines");
+
+ jgenerator.writeStartArray();
+ for (String line : cardContent.getLines())
+ jgenerator.writeString(line);
+ jgenerator.writeEndArray();
+
+ jgenerator.writeEndObject();
+ }
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardDeckDeserializer.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardDeckDeserializer.java
new file mode 100644
index 0000000..92746e9
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardDeckDeserializer.java
@@ -0,0 +1,42 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import it1901.groups_2021.gr2141.core.models.CardDeck;
+import it1901.groups_2021.gr2141.core.models.Flashcard;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+public class CardDeckDeserializer extends StdDeserializer {
+
+ private FlashcardDeserializer flashcardDeserializer = new FlashcardDeserializer();
+
+ public CardDeckDeserializer() {
+ this(null);
+ }
+
+ public CardDeckDeserializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public CardDeck deserialize(JsonParser jparser, DeserializationContext context) throws IOException, JacksonException {
+ JsonNode node = jparser.getCodec().readTree(jparser);
+ return deserialize(node);
+ }
+
+ CardDeck deserialize(JsonNode node) {
+ List cards = new ArrayList<>();
+
+ for (JsonNode n : node.get("flashcards"))
+ cards.add(flashcardDeserializer.deserialize(n));
+
+ return new CardDeck(cards);
+ }
+}
\ No newline at end of file
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardDeckSerializer.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardDeckSerializer.java
new file mode 100644
index 0000000..d26d1ab
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/CardDeckSerializer.java
@@ -0,0 +1,30 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import it1901.groups_2021.gr2141.core.models.CardDeck;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class CardDeckSerializer extends StdSerializer {
+ public CardDeckSerializer() {
+ this(null);
+ }
+
+ public CardDeckSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(CardDeck cardDeck, JsonGenerator jgenerator, SerializerProvider provider) throws IOException {
+ jgenerator.writeStartObject();
+ jgenerator.writeFieldName("flashcards");
+ jgenerator.writeStartArray();
+ for (var flashcard : cardDeck.getFlashcards())
+ jgenerator.writeObject(flashcard);
+ jgenerator.writeEndArray();
+ jgenerator.writeEndObject();
+ }
+}
\ No newline at end of file
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/FlashcardDeserializer.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/FlashcardDeserializer.java
new file mode 100644
index 0000000..3310bf3
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/FlashcardDeserializer.java
@@ -0,0 +1,40 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import it1901.groups_2021.gr2141.core.models.Flashcard;
+import it1901.groups_2021.gr2141.core.models.CardContent;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+public class FlashcardDeserializer extends StdDeserializer {
+
+ private CardContentDeserializer cardContentDeserializer = new CardContentDeserializer();
+
+ public FlashcardDeserializer() {
+ this(null);
+ }
+
+ public FlashcardDeserializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public Flashcard deserialize(JsonParser jparser, DeserializationContext context) throws IOException, JacksonException {
+ JsonNode node = jparser.getCodec().readTree(jparser);
+
+ return deserialize(node);
+ }
+
+ Flashcard deserialize(JsonNode node) {
+ CardContent front = cardContentDeserializer.deserialize(node.get("front"));
+ CardContent back = cardContentDeserializer.deserialize(node.get("back"));
+
+ return new Flashcard(front, back);
+ }
+
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/FlashcardSerializer.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/FlashcardSerializer.java
new file mode 100644
index 0000000..d331304
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/FlashcardSerializer.java
@@ -0,0 +1,29 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import it1901.groups_2021.gr2141.core.models.Flashcard;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class FlashcardSerializer extends StdSerializer {
+ public FlashcardSerializer() {
+ this(null);
+ }
+
+ public FlashcardSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(Flashcard flashcard, JsonGenerator jgenerator, SerializerProvider provider) throws IOException {
+ jgenerator.writeStartObject();
+ jgenerator.writeFieldName("front");
+ jgenerator.writeObject(flashcard.getFront());
+ jgenerator.writeFieldName("back");
+ jgenerator.writeObject(flashcard.getBack());
+ jgenerator.writeEndObject();
+ }
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/ModelSerializingModule.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/ModelSerializingModule.java
new file mode 100644
index 0000000..cfb7cc6
--- /dev/null
+++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/ModelSerializingModule.java
@@ -0,0 +1,23 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+import it1901.groups_2021.gr2141.core.models.CardContent;
+import it1901.groups_2021.gr2141.core.models.CardDeck;
+import it1901.groups_2021.gr2141.core.models.Flashcard;
+
+public class ModelSerializingModule extends SimpleModule {
+
+ private static final String NAME = "FlashcardModule";
+
+ public ModelSerializingModule() {
+ super(NAME, Version.unknownVersion());
+ addSerializer(CardContent.class, new CardContentSerializer());
+ addSerializer(Flashcard.class, new FlashcardSerializer());
+ addSerializer(CardDeck.class, new CardDeckSerializer());
+ addDeserializer(CardContent.class, new CardContentDeserializer());
+ addDeserializer(Flashcard.class, new FlashcardDeserializer());
+ addDeserializer(CardDeck.class, new CardDeckDeserializer());
+ }
+}
diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/json/.gitkeep b/flashy/core/src/main/java/it1901/groups_2021/gr2141/json/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/CardContentTest.java b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/CardContentTest.java
new file mode 100644
index 0000000..67d28d5
--- /dev/null
+++ b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/CardContentTest.java
@@ -0,0 +1,45 @@
+package it1901.groups_2021.gr2141.core.models;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class CardContentTest {
+
+ private List exampleLines;
+
+ @BeforeEach
+ public void setUpExampleData() {
+ exampleLines = List.of("asdf", "fdsa", "asdf");
+ }
+
+ @Test
+ public void testNullInput() {
+ assertThrows(IllegalArgumentException.class, () -> new CardContent(null));
+ }
+
+ @Test
+ public void testEmptyListInput() {
+ assertThrows(IllegalArgumentException.class, () -> new CardContent(List.of()));
+ }
+
+ @Test
+ public void testRealInput() {
+ CardContent content = new CardContent(exampleLines);
+ assertEquals(exampleLines, content.getLines());
+ }
+
+ @Test
+ public void testEquality() {
+ CardContent cc1 = new CardContent(exampleLines);
+ CardContent cc2 = new CardContent(exampleLines);
+
+ assertNotEquals(cc1.hashCode(), cc2.hashCode());
+ assertEquals(cc1, cc2);
+ }
+}
diff --git a/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/CardDeckTest.java b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/CardDeckTest.java
new file mode 100644
index 0000000..8adaae5
--- /dev/null
+++ b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/CardDeckTest.java
@@ -0,0 +1,48 @@
+package it1901.groups_2021.gr2141.core.models;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class CardDeckTest {
+
+ List exampleFlashcardList;
+
+ @BeforeEach
+ public void setUpExampleData() {
+ Flashcard card1 = new Flashcard(new CardContent(List.of("1", "2")), new CardContent(List.of("3")));
+ Flashcard card2 = new Flashcard(new CardContent(List.of("why")), new CardContent(List.of("por qué")));
+ exampleFlashcardList = List.of(card1, card2);
+ }
+
+ @Test
+ public void testNullInput() {
+ assertThrows(IllegalArgumentException.class, () -> new CardDeck(null));
+ }
+
+ @Test
+ public void testEmptyListInput() {
+ var cardDeck = new CardDeck(List.of());
+ assertEquals(0, cardDeck.getNumberOfCards());
+ }
+
+ @Test
+ public void testRealInput() {
+ CardDeck cardDeck = new CardDeck(exampleFlashcardList);
+ assertEquals(exampleFlashcardList, cardDeck.getFlashcards());
+ }
+
+ @Test
+ public void testEquality() {
+ var cardDeck1 = new CardDeck(exampleFlashcardList);
+ var cardDeck2 = new CardDeck(exampleFlashcardList);
+
+ assertNotEquals(cardDeck1.hashCode(), cardDeck2.hashCode());
+ assertEquals(cardDeck1, cardDeck2);
+ }
+}
diff --git a/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/FlashcardTest.java b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/FlashcardTest.java
new file mode 100644
index 0000000..8e8df81
--- /dev/null
+++ b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/FlashcardTest.java
@@ -0,0 +1,46 @@
+package it1901.groups_2021.gr2141.core.models;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class FlashcardTest {
+
+ CardContent exampleCardContent1;
+ CardContent exampleCardContent2;
+
+ @BeforeEach
+ public void setUpExampleData() {
+ exampleCardContent1 = new CardContent(List.of("1"));
+ exampleCardContent2 = new CardContent(List.of("2", "3"));
+ }
+
+ @Test
+ public void testNullInput() {
+ assertThrows(IllegalArgumentException.class, () -> new Flashcard(null, null));
+ assertThrows(IllegalArgumentException.class, () -> new Flashcard(null, exampleCardContent1));
+ assertThrows(IllegalArgumentException.class, () -> new Flashcard(exampleCardContent1, null));
+ }
+
+ @Test
+ public void testRealInput() {
+ Flashcard card = new Flashcard(exampleCardContent1, exampleCardContent2);
+ assertEquals(card.getFront(), exampleCardContent1);
+ assertEquals(card.getBack(), exampleCardContent2);
+ }
+
+ @Test
+ public void testEquality() {
+ Flashcard card1 = new Flashcard(exampleCardContent1, exampleCardContent2);
+ Flashcard card2 = new Flashcard(exampleCardContent1, exampleCardContent2);
+
+ assertNotEquals(card1.hashCode(), card2.hashCode());
+ assertEquals(card1, card2);
+ }
+
+}
diff --git a/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/serializers/SerializerTest.java b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/serializers/SerializerTest.java
new file mode 100644
index 0000000..0161e86
--- /dev/null
+++ b/flashy/core/src/test/java/it1901/groups_2021/gr2141/core/models/serializers/SerializerTest.java
@@ -0,0 +1,75 @@
+package it1901.groups_2021.gr2141.core.models.serializers;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.List;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import it1901.groups_2021.gr2141.core.models.CardContent;
+import it1901.groups_2021.gr2141.core.models.CardDeck;
+import it1901.groups_2021.gr2141.core.models.Flashcard;
+
+public class SerializerTest {
+
+ private static ObjectMapper mapper;
+ private CardDeck exampleCardDeck;
+ private String exampleSerializedCardDeck;
+
+ @BeforeAll
+ public static void setUpMapper() {
+ mapper = new ObjectMapper();
+ mapper.registerModule(new ModelSerializingModule());
+ }
+
+ @BeforeEach
+ public void setUpExampleData() {
+ var front = new CardContent(List.of("A cow"));
+ var back = new CardContent(List.of("Nǎiniú", "奶牛"));
+ var card = new Flashcard(front, back);
+ exampleCardDeck = new CardDeck(List.of(card));
+ exampleSerializedCardDeck = "{\"flashcards\":[{\"front\":{\"lines\":[\"A cow\"]},\"back\":{\"lines\":[\"Nǎiniú\",\"奶牛\"]}}]}";
+ }
+
+ @Test
+ public void testSerializeExampleObject() {
+ String serializedCardDeck = null;
+ try {
+ serializedCardDeck = mapper.writeValueAsString(exampleCardDeck);
+ } catch (JsonProcessingException e) {
+ fail(e);
+ }
+ assertEquals(exampleSerializedCardDeck, serializedCardDeck);
+ }
+
+ @Test
+ public void testDeserializeExampleObject() {
+ CardDeck cardDeck = null;
+ try {
+ cardDeck = mapper.readValue(exampleSerializedCardDeck, CardDeck.class);
+ } catch (JsonProcessingException e) {
+ fail(e);
+ }
+ assertEquals(exampleCardDeck, cardDeck);
+
+ }
+
+ @Test
+ public void testSerializeDeserializeEquals() {
+ CardDeck cardDeck2 = null;
+ try {
+ String deserializedCardDeck = mapper.writeValueAsString(exampleCardDeck);
+ cardDeck2 = mapper.readValue(deserializedCardDeck, CardDeck.class);
+ } catch (JsonProcessingException e) {
+ fail(e);
+ }
+ assertEquals(exampleCardDeck, cardDeck2);
+ }
+
+}