diff --git a/contributions/javaGsonObjectsJava10/.gitignore b/contributions/javaGsonObjectsJava10/.gitignore
new file mode 100644
index 00000000..3a0d41b3
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/.gitignore
@@ -0,0 +1,9 @@
+*.class
+.gradle/
+.settings/
+.classpath
+.project
+bin/
+build/
+libs/
+outputs/
\ No newline at end of file
diff --git a/contributions/javaGsonObjectsJava10/README.md b/contributions/javaGsonObjectsJava10/README.md
new file mode 100644
index 00000000..7110b255
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/README.md
@@ -0,0 +1,128 @@
+This is an implementation of the 101companies System.
+
+== Headline ==
+Working on [[Language:JSON|]] with Google [[Technology:Gson|Gson API]], mapping Json to a direct object representation
+
+== Characteristics ==
+This contribution modernizes the [[Contribution:javaGsonObjects]] (which is a simple company structure, displaying the serialization process using [[Language:JSON]] for storing the company structure and Gson API for parsing, unparsing and manipulating it the JSON.), by utilizing new features, introduced up to Java10, such as [[Concept:Lambda abstraction]] and [[Concept:Streaming]].
+
+== Illustration ==
+To Parse a JSON File you can either use "parseFromFile(String path)" or "parseFromFile(File file)"
+The former is only a wrapper method for the latter, so we'll be taking a look at the "parseFromFile(File file)" method.
+
+ /**
+ * Method to parse a JSON file to a Company
+ *
+ * @param file Path for JSON file
+ * @return a Company representing the JSON file
+ * @throws IOException
+ * @throws FileNotFoundException
+ */
+ public static Company parseFromFile(File file) throws FileNotFoundException, IOException {
+ Gson gson = new Gson();
+ try (JsonReader read = new JsonReader(new FileReader(file))) {
+ return gson.fromJson(read, Company.class);
+ }
+ }
+
+Given a JSON file, the method will create a Gson object and attempt to read the file using a JsonReader.
+Should the file not be found, the method will throw a FileNotFoundException.
+Were there problems reading the File, then an IOException will be thrown.
+The method will proceed to the last instuction if the file was read without any problems.
+gson.fromJson(read, Company.class);
+Here, the "fromJson" method of the gson object, is parsing the read JSON data into an object of type Company.
+Alternatively, you can call the "parse(String jsonString)" method directly, if you have already read the JSON file into a string.
+
+ /**
+ * Method to parse a JSON String to a Company
+ *
+ * @param jsonString String containing JSON
+ * @return a Company representing the JSON from the jsonString
+ */
+ public static Company parse(String jsonString) {
+ Gson gson = new Gson();
+ return gson.fromJson(jsonString, Company.class);
+ }
+
+
+The Unparsing methods are very similar to the parsing ones.
+Like in the Parsing class, we defined a wrapper function for the parameter path.
+The "unparseToFile(Company company, File file)" method looks as follows:
+
+ /**
+ * Method to parse a Company to a JSON File
+ *
+ * @param company Company to be parsed to a JSON File
+ * @param file Destination File for the JSON File
+ * @throws IOException
+ */
+ public static void unparseToFile(Company company, File file) throws IOException {
+ GsonBuilder builder = new GsonBuilder();
+ builder.setPrettyPrinting();
+ Gson gson = builder.create();
+ try (FileWriter writer = new FileWriter(file)) {
+ gson.toJson(company, writer);
+ }
+ }
+
+Let us take a closer look into it's inner workings.
+The line...
+ GsonBuilder builder = new GsonBuilder();
+...leaves us with a GsonBuilder object, which will serve the purpose of creating the gson object we'll be using to create and write the JSON file with.
+We then proceed in creating a FileWriter object via a try-with-resources statement.
+
+ try (FileWriter writer = new FileWriter(file)) {
+ gson.toJson(c, writer);
+ }
+
+The FileWriter is then used by the gson object to write the JSON representation of the company into the file given by the user.
+
+The string representation of a company object in the JSON format can be obtained directly, without being written to a file, by the "unparse(Company company)" method.
+
+ /**
+ * Method to parse a Company to a JSON String
+ *
+ * @param company Company to be parsed to a JSON File
+ * @return a String representing the JSON File of the company
+ */
+ public static String unparse(Company company) {
+ GsonBuilder builder = new GsonBuilder();
+ builder.setPrettyPrinting();
+ Gson gson = builder.create();
+ return gson.toJson(company);
+ }
+
+
+== Relationships ==
+[[Contribution:javaGsonObjects] is the base for this contribution.
+[[Contribution:javaGson]] is using the same Api and Features with a different JSON mapping.
+
+== Architecture ==
+The contribution follows a standardized structure:
+* inputs contains input files for tests
+* src/main/java contains the following packages:
+** org.softlang.company.model for implementations of [[Feature:Hierarchical company]].
+** org.softlang.company.features for implementations of [[Namespace:Feature]].
+* src/test/java contains the following packages:
+** org.softlang.company.tests for [[Technology:JUnit]] test cases for [[Namespace:Feature]]s.
+
+== Usage ==
+This contribution uses [[Technology:Gradle]] for building. [[Technology:Eclipse]] is supported.
+See: https://github.com/101companies/101simplejava/blob/master/README.md
+
+== Metadata ==
+* [[developedBy::Contributor:mpaul138]]
+* [[implements::Feature:Hierarchical company]]
+* [[implements::Feature:Unparsing]]
+* [[implements::Feature:Parsing]]
+* [[implements::Feature:Total]]
+* [[implements::Feature:Cut]]
+* [[implements::Feature:Mapping]]
+* [[implements::Feature:Serialization]]
+* [[memberOf::Theme:Java mapping]]
+* [[uses::Language:JSON]]
+* [[uses::Language:Plain Text]]
+* [[uses::Language:Java]]
+* [[uses::Technology:Gson]]
+* [[uses::Technology:JUnit]]
+* [[uses::Technology:Gradle]]
diff --git a/contributions/javaGsonObjectsJava10/build.gradle b/contributions/javaGsonObjectsJava10/build.gradle
new file mode 100644
index 00000000..8a3071b6
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/build.gradle
@@ -0,0 +1,26 @@
+apply plugin: 'java'
+apply plugin: 'eclipse'
+
+group = 'org.softlang.company'
+sourceCompatibility = JavaVersion.VERSION_1_10
+targetCompatibility = JavaVersion.VERSION_1_10
+version = '1.0.0'
+
+// Implementation specifics
+// This implementation uses JUnit for testing
+dependencies {
+ compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
+ testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.3.1'
+ testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.3.1'
+}
+// Additional cleanup for outputs
+clean {
+ dependsOn cleanEclipse
+ doFirst {
+ delete 'outputs'
+ }
+}
+// JUnit 5 support
+test {
+ useJUnitPlatform()
+}
diff --git a/contributions/javaGsonObjectsJava10/inputs/sampleCompany.json b/contributions/javaGsonObjectsJava10/inputs/sampleCompany.json
new file mode 100644
index 00000000..1f20f45f
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/inputs/sampleCompany.json
@@ -0,0 +1,41 @@
+{
+ "name": "Acme Corporation",
+ "departments": [
+ {
+ "name": "Research",
+ "manager": {
+ "name": "Fred",
+ "salary": 88888.0
+ }
+ },
+ {
+ "name": "Development",
+ "manager": {
+ "name": "Marie",
+ "salary": 77777.0
+ },
+ "departments": [
+ {
+ "name": "Dev1",
+ "manager": {
+ "name": "Bob",
+ "salary": 77776.0
+ }
+ },
+ {
+ "name": "Dev2",
+ "manager": {
+ "name": "Alice",
+ "salary": 77775.0
+ },
+ "employees": [
+ {
+ "name": "Ralf",
+ "salary": 4711.0
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Cut.java b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Cut.java
new file mode 100644
index 00000000..2884ff07
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Cut.java
@@ -0,0 +1,42 @@
+package org.softlang.company.features;
+
+import java.util.Optional;
+
+import org.softlang.company.model.Company;
+import org.softlang.company.model.Department;
+import org.softlang.company.model.Employee;
+
+public class Cut {
+
+ /**
+ * Method to cut salaries in half
+ *
+ * @param company Company to cut salaries from
+ */
+ public static void cut(Company company) {
+ Optional.ofNullable(company).map(Company::getDepartments)
+ .ifPresent(departments -> departments.forEach(Cut::cut));
+ }
+
+ /**
+ * Helper method for cut
+ *
+ * @param department Department to cut salaries from
+ */
+ private static void cut(Department department) {
+ Optional.ofNullable(department.getManager()).ifPresent(Cut::cut);
+
+ Optional.ofNullable(department.getEmployees()).ifPresent(employees -> employees.forEach(Cut::cut));
+
+ Optional.ofNullable(department.getDepartments()).ifPresent(departments -> departments.forEach(Cut::cut));
+ }
+
+ /**
+ * Helper method for cut
+ *
+ * @param employee Employee to cut salary from
+ */
+ private static void cut(Employee employee) {
+ employee.setSalary(employee.getSalary() / 2);
+ }
+}
diff --git a/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Parsing.java b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Parsing.java
new file mode 100644
index 00000000..7ad794be
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Parsing.java
@@ -0,0 +1,52 @@
+package org.softlang.company.features;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+import org.softlang.company.model.Company;
+
+import com.google.gson.Gson;
+import com.google.gson.stream.JsonReader;
+
+public class Parsing {
+
+ /**
+ * Method to parse a JSON file to a Company
+ *
+ * @param path Path to the JSON file
+ * @return a Company representing the JSON file
+ * @throws IOException
+ * @throws FileNotFoundException
+ */
+ public static Company parseFromFile(String path) throws FileNotFoundException, IOException {
+ return parseFromFile(new File(path));
+ }
+
+ /**
+ * Method to parse a JSON file to a Company
+ *
+ * @param file Path for JSON file
+ * @return a Company representing the JSON file
+ * @throws IOException
+ * @throws FileNotFoundException
+ */
+ public static Company parseFromFile(File file) throws FileNotFoundException, IOException {
+ Gson gson = new Gson();
+ try (JsonReader read = new JsonReader(new FileReader(file))) {
+ return gson.fromJson(read, Company.class);
+ }
+ }
+
+ /**
+ * Method to parse a JSON String to a Company
+ *
+ * @param jsonString String containing JSON
+ * @return a Company representing the JSON from the jsonString
+ */
+ public static Company parse(String jsonString) {
+ Gson gson = new Gson();
+ return gson.fromJson(jsonString, Company.class);
+ }
+}
diff --git a/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Total.java b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Total.java
new file mode 100644
index 00000000..8d65b1ed
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Total.java
@@ -0,0 +1,37 @@
+package org.softlang.company.features;
+
+import java.util.Optional;
+
+import org.softlang.company.model.Company;
+import org.softlang.company.model.Department;
+import org.softlang.company.model.Employee;
+
+public class Total {
+
+ /**
+ * Method to get the total of all salaries
+ *
+ * @param company Company to compute total for
+ * @return total of Company company
+ */
+ public static double total(Company company) {
+ return Optional.ofNullable(company).map(Company::getDepartments)
+ .map(departments -> departments.stream().mapToDouble(Total::total).sum()).orElse(0.0);
+ }
+
+ /**
+ * Helper Method to get the total of all salaries in a Department
+ *
+ * @param department Department to compute the total for
+ * @return total of all salaries in Department department
+ */
+ private static double total(Department d) {
+ double sum = Optional.ofNullable(d.getManager()).map(Employee::getSalary).orElse(0.0);
+
+ sum += Optional.ofNullable(d.getEmployees())
+ .map(employees -> employees.stream().mapToDouble(Employee::getSalary).sum()).orElse(0.0);
+
+ return sum + Optional.ofNullable(d.getDepartments())
+ .map(departments -> departments.stream().mapToDouble(Total::total).sum()).orElse(0.0);
+ }
+}
diff --git a/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Unparsing.java b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Unparsing.java
new file mode 100644
index 00000000..8ceff7a9
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/features/Unparsing.java
@@ -0,0 +1,54 @@
+package org.softlang.company.features;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import org.softlang.company.model.Company;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class Unparsing {
+
+ /**
+ * Method to parse a Company to a JSON File
+ *
+ * @param company Company to be parsed to a JSON File
+ * @param path Destination Path for the JSON File
+ * @throws IOException
+ */
+ public static void unparseToFile(Company comapny, String path) throws IOException {
+ unparseToFile(comapny, new File(path));
+ }
+
+ /**
+ * Method to parse a Company to a JSON File
+ *
+ * @param company Company to be parsed to a JSON File
+ * @param file Destination File for the JSON File
+ * @throws IOException
+ */
+ public static void unparseToFile(Company company, File file) throws IOException {
+ GsonBuilder builder = new GsonBuilder();
+ builder.setPrettyPrinting();
+ Gson gson = builder.create();
+ try (FileWriter writer = new FileWriter(file)) {
+ gson.toJson(company, writer);
+ }
+ }
+
+ /**
+ * Method to parse a Company to a JSON String
+ *
+ * @param company Company to be parsed to a JSON File
+ * @return a String representing the JSON File of the company
+ */
+ public static String unparse(Company company) {
+ GsonBuilder builder = new GsonBuilder();
+ builder.setPrettyPrinting();
+ Gson gson = builder.create();
+ return gson.toJson(company);
+ }
+
+}
diff --git a/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Company.java b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Company.java
new file mode 100644
index 00000000..c8478399
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Company.java
@@ -0,0 +1,51 @@
+package org.softlang.company.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+public class Company {
+ private String name;
+ private List departments = new ArrayList();
+
+ public Company(String name) {
+ super();
+ this.name = name;
+
+ }
+
+ public Company(String name, List departments) {
+ super();
+ this.name = name;
+ this.departments = departments;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getDepartments() {
+ return departments;
+ }
+
+ public void addDepartment(Department d) {
+ this.departments.add(d);
+ }
+
+ @Override
+ public String toString() {
+ String result = "Company " + this.name + ":\nDepartments:\n";
+ return result + Optional.ofNullable(this.departments)
+ .map(departs -> departs.stream()
+ .map(Department::getName)
+ .collect(Collectors.joining("\n"))
+ )
+ .orElse("");
+ }
+
+}
diff --git a/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Department.java b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Department.java
new file mode 100644
index 00000000..be039380
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Department.java
@@ -0,0 +1,70 @@
+package org.softlang.company.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+public class Department {
+ private String name;
+ private Employee manager;
+ private List departments = new ArrayList();
+ private List employees = new ArrayList();
+
+ public Department(String name, Employee manager) {
+ super();
+ this.name = name;
+ this.manager = manager;
+ }
+
+ public Department(String name, Employee manager,
+ List subDepartments) {
+ super();
+ this.name = name;
+ this.manager = manager;
+ this.departments = subDepartments;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Employee getManager() {
+ return manager;
+ }
+
+ public void setManager(Employee manager) {
+ this.manager = manager;
+ }
+
+ public List getDepartments() {
+ return departments;
+ }
+
+ public List getEmployees() {
+ return employees;
+ }
+
+ public void addEmployee(Employee e) {
+ this.employees.add(e);
+ }
+
+ public void addSubDepartment(Department d) {
+ this.departments.add(d);
+ }
+
+ @Override
+ public String toString() {
+ String result = "Department " + this.name + ": \nManager: "
+ + this.manager.getName() + "\nEmployees:";
+ return result + Optional.ofNullable(this.employees)
+ .map(empls -> empls.stream()
+ .map(Employee::getName)
+ .collect(Collectors.joining("\n"))
+ ).orElse("");
+ }
+}
diff --git a/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Employee.java b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Employee.java
new file mode 100644
index 00000000..585a2829
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/main/java/org/softlang/company/model/Employee.java
@@ -0,0 +1,44 @@
+package org.softlang.company.model;
+
+public class Employee {
+ private String name;
+ private String address;
+ private double salary;
+
+ public Employee(String name, String address, double salary) {
+ super();
+ this.name = name;
+ this.address = address;
+ this.salary = salary;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+
+ @Override
+ public String toString() {
+ return "Person:\nName " + this.name + ": \nAddress: " + this.address + "\nSalary: " + this.salary;
+ }
+
+}
diff --git a/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestCut.java b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestCut.java
new file mode 100644
index 00000000..d1a1b300
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestCut.java
@@ -0,0 +1,66 @@
+package org.softlang.company.tests;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.jupiter.api.Test;
+import org.softlang.company.features.Cut;
+import org.softlang.company.features.Parsing;
+import org.softlang.company.features.Total;
+import org.softlang.company.model.Company;
+import org.softlang.company.model.Department;
+import org.softlang.company.model.Employee;
+
+public class TestCut {
+
+ @Test
+ public void testCut() {
+ Company company;
+ try {
+ company = Parsing.parseFromFile("inputs" + File.separator + "sampleCompany.json");
+ } catch (IOException e) {
+ fail();
+ return;
+ }
+ double total = Total.total(company);
+ Cut.cut(company);
+ assertEquals(total / 2, Total.total(company));
+ }
+
+ @Test
+ public void testCutEmptyCompany() {
+ Company emptyCompany = new Company("Empty");
+ Cut.cut(emptyCompany);
+ assertEquals(0, Total.total(emptyCompany));
+ }
+
+ @Test
+ public void testCutNull() {
+ Cut.cut(null);
+ }
+
+ @Test
+ public void testCutWithNullDepartments() {
+ Company nullDepartCompany = new Company("Empty", null);
+ Cut.cut(nullDepartCompany);
+ }
+
+ @Test
+ public void testCutWithNullManager() {
+ Company company = new Company("Test");
+ company.addDepartment(new Department("Testing", null));
+ Cut.cut(company);
+ }
+
+ @Test
+ public void testCutWithNullSubdepartments() {
+ Company company = new Company("Test");
+ Department department = new Department("Testing", new Employee("Test Manager", "testing street", 2), null);
+ company.addDepartment(department);
+ Cut.cut(company);
+ assertEquals(1, Total.total(company));
+ }
+}
diff --git a/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestParsing.java b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestParsing.java
new file mode 100644
index 00000000..f8706144
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestParsing.java
@@ -0,0 +1,52 @@
+package org.softlang.company.tests;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.junit.jupiter.api.Test;
+import org.softlang.company.features.Parsing;
+import org.softlang.company.model.Company;
+
+public class TestParsing {
+
+ @Test
+ public void testParseFromFile() {
+ Company company;
+ try {
+ company = Parsing.parseFromFile("inputs" + File.separator + "sampleCompany.json");
+ } catch (IOException e) {
+ fail();
+ return;
+ }
+
+ assertNotNull(company);
+ }
+
+ @Test
+ public void testParseFromFileNonExisting() {
+ assertThrows(FileNotFoundException.class, () -> Parsing.parseFromFile(""));
+ }
+
+ @Test
+ public void testParseEmpty() {
+ Company company = Parsing.parse("{}");
+ assertNotNull(company);
+ assertNull(company.getName());
+ assertNull(company.getDepartments());
+ }
+
+ @Test
+ public void testParseWithName() {
+ Company company = Parsing.parse("{name=\"Test\"}");
+ assertNotNull(company);
+ assertEquals("Test", company.getName());
+ assertNull(company.getDepartments());
+ }
+}
diff --git a/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestTotal.java b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestTotal.java
new file mode 100644
index 00000000..55096172
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestTotal.java
@@ -0,0 +1,61 @@
+package org.softlang.company.tests;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.jupiter.api.Test;
+import org.softlang.company.features.Parsing;
+import org.softlang.company.features.Total;
+import org.softlang.company.model.Company;
+import org.softlang.company.model.Department;
+import org.softlang.company.model.Employee;
+
+public class TestTotal {
+
+ @Test
+ public void testTotal() {
+ Company company;
+ try {
+ company = Parsing.parseFromFile("inputs" + File.separator + "sampleCompany.json");
+ } catch (IOException e) {
+ fail();
+ return;
+ }
+ assertEquals(326927.0, Total.total(company));
+ }
+
+ @Test
+ public void testTotalEmptyCompany() {
+ Company emptyCompany = new Company("Empty");
+ assertEquals(0, Total.total(emptyCompany));
+ }
+
+ @Test
+ public void testCutNull() {
+ assertEquals(0, Total.total(null));
+ }
+
+ @Test
+ public void testCutWithNullDepartments() {
+ Company nullDepartCompany = new Company("Empty", null);
+ assertEquals(0, Total.total(nullDepartCompany));
+ }
+
+ @Test
+ public void testCutWithNullManager() {
+ Company company = new Company("Test");
+ company.addDepartment(new Department("Testing", null));
+ assertEquals(0, Total.total(company));
+ }
+
+ @Test
+ public void testCutWithNullSubdepartments() {
+ Company company = new Company("Test");
+ Department department = new Department("Testing", new Employee("Test Manager", "testing street", 2), null);
+ company.addDepartment(department);
+ assertEquals(2, Total.total(company));
+ }
+}
diff --git a/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestUnparsing.java b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestUnparsing.java
new file mode 100644
index 00000000..55b92c22
--- /dev/null
+++ b/contributions/javaGsonObjectsJava10/src/test/java/org/softlang/company/tests/TestUnparsing.java
@@ -0,0 +1,73 @@
+package org.softlang.company.tests;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.softlang.company.features.Parsing;
+import org.softlang.company.features.Unparsing;
+import org.softlang.company.model.Company;
+
+public class TestUnparsing {
+
+ private static String jsonIn;
+ private final Path outputFilePath = Paths.get("outputs" + File.separator + "sampleCompany.json");
+
+ @BeforeAll
+ public static void setup() {
+ try (Stream stream = Files.lines(Paths.get("inputs" + File.separator + "sampleCompany.json"))) {
+ jsonIn = stream.collect(Collectors.joining("\n"));
+ } catch (IOException e) {
+ fail(e);
+ return;
+ }
+ }
+
+ @Test
+ public void testUnparse() {
+ Company company = Parsing.parse(jsonIn);
+ assertEquals(jsonIn, Unparsing.unparse(company));
+ }
+
+ @Test
+ public void testUnparseNull() {
+ assertEquals("null", Unparsing.unparse(null));
+ }
+
+ @Test
+ public void testUnparseEmptyCompany() {
+ assertEquals("{}", Unparsing.unparse(new Company(null, null)));
+ }
+
+ @Test
+ public void testUnparseToFile() {
+ Company company = Parsing.parse(jsonIn);
+ File outputDir = new File("outputs");
+ outputDir.mkdir();
+
+ try {
+ Unparsing.unparseToFile(company, outputFilePath.toFile());
+ } catch (IOException e) {
+ fail(e);
+ }
+
+ String jsonOut;
+ try (Stream stream = Files.lines(outputFilePath)) {
+ jsonOut = stream.collect(Collectors.joining("\n"));
+ } catch (IOException e) {
+ fail(e);
+ return;
+ }
+
+ assertEquals(jsonIn, jsonOut);
+ }
+}
diff --git a/contributions/settings.gradle b/contributions/settings.gradle
index b78bc2ee..07d1d68a 100644
--- a/contributions/settings.gradle
+++ b/contributions/settings.gradle
@@ -19,6 +19,7 @@ include 'javaComposition'
include 'javaExorcism'
include 'javaGson'
include 'javaGsonObjects'
+include 'javaGsonObjectsJava10'
include 'javaInheritance'
include 'javaJacksonDataBinding'
include 'javaJacksonStreaming'