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'