From 1dddec8ba867bc31233ba194f0753ea35818cbfd Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 24 Jun 2020 09:26:11 -0400 Subject: [LANG-1542] ToStringBuilder.reflectionToString - Wrong JSON format when object has a List/Array of Enum. --- .../lang3/builder/JsonToStringStyleTest.java | 151 ++++++++++++++++++++- 1 file changed, 145 insertions(+), 6 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java index b0ad25462..ed7bf3418 100644 --- a/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java +++ b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java @@ -16,17 +16,20 @@ */ package org.apache.commons.lang3.builder; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import org.apache.commons.lang3.builder.ToStringStyleTest.Person; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.List; -import org.apache.commons.lang3.builder.ToStringStyleTest.Person; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Unit tests {@link org.apache.commons.lang3.builder.JsonToStringStyleTest}. @@ -181,6 +184,73 @@ public class JsonToStringStyleTest { .toString()); } + @Test + public void testList() { + Student student = new Student(); + ArrayList objects = new ArrayList<>(); + + objects.add(Hobby.BOOK); + objects.add(Hobby.SPORT); + objects.add(Hobby.MUSIC); + + student.setHobbies(objects); + + assertEquals(student.toString(), "{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}"); + student.setHobbies(new ArrayList<>()); + assertEquals(student.toString(), "{\"hobbies\":[]}"); + student.setHobbies(null); + assertEquals(student.toString(), "{\"hobbies\":null}"); + } + + @Test + public void testArrayEnum() { + Teacher teacher = new Teacher(); + Hobby[] hobbies = new Hobby[3]; + hobbies[0] = Hobby.BOOK; + hobbies[1] = Hobby.SPORT; + hobbies[2] = Hobby.MUSIC; + + teacher.setHobbies(hobbies); + + assertEquals(teacher.toString(), "{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}"); + teacher.setHobbies(new Hobby[0]); + assertEquals(teacher.toString(), "{\"hobbies\":[]}"); + teacher.setHobbies(null); + assertEquals(teacher.toString(), "{\"hobbies\":null}"); + } + + @Test + public void testCombineListAndEnum() { + Teacher teacher = new Teacher(); + + Hobby[] teacherHobbies = new Hobby[3]; + teacherHobbies[0] = Hobby.BOOK; + teacherHobbies[1] = Hobby.SPORT; + teacherHobbies[2] = Hobby.MUSIC; + + teacher.setHobbies(teacherHobbies); + + Student john = new Student(); + john.setHobbies(Arrays.asList(Hobby.BOOK, Hobby.MUSIC)); + + Student alice = new Student(); + alice.setHobbies(new ArrayList<>()); + + Student bob = new Student(); + bob.setHobbies(Collections.singletonList(Hobby.BOOK)); + + ArrayList students = new ArrayList<>(); + students.add(john); + students.add(alice); + students.add(bob); + + AcademyClass academyClass = new AcademyClass(); + academyClass.setStudents(students); + academyClass.setTeacher(teacher); + + assertEquals(academyClass.toString(), "{\"students\":[{\"hobbies\":[\"BOOK\",\"MUSIC\"]},{\"hobbies\":[]},{\"hobbies\":[\"BOOK\"]}],\"teacher\":{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}}"); + } + @Test public void testPerson() { final Person p = new Person(); @@ -477,4 +547,73 @@ public class JsonToStringStyleTest { */ Person person; } + + enum Hobby { + SPORT, + BOOK, + MUSIC + } + + enum EmptyEnum { + } + + static class Student { + List hobbies; + + public List getHobbies() { + return hobbies; + } + + public void setHobbies(List hobbies) { + this.hobbies = hobbies; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + } + + static class Teacher { + Hobby[] hobbies; + + public Hobby[] getHobbies() { + return hobbies; + } + + public void setHobbies(Hobby[] hobbies) { + this.hobbies = hobbies; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + } + + static class AcademyClass { + Teacher teacher; + List students; + + public void setTeacher(Teacher teacher) { + this.teacher = teacher; + } + + public void setStudents(List students) { + this.students = students; + } + + public Teacher getTeacher() { + return teacher; + } + + public List getStudents() { + return students; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + } } -- cgit v1.2.3