1 package org.pojomatic.formatter;
2
3 import static org.testng.Assert.*;
4
5 import java.lang.reflect.Array;
6 import java.lang.reflect.Field;
7 import java.lang.reflect.Method;
8 import java.util.ArrayList;
9 import java.util.List;
10 import java.util.Objects;
11
12 import org.pojomatic.annotations.SkipArrayCheck;
13 import org.pojomatic.internal.Type;
14 import org.pojomatic.internal.TypeProviders;
15 import org.testng.annotations.BeforeClass;
16 import org.testng.annotations.Test;
17
18 public class DefaultEnhancedPropertyFormatterTest {
19
20 @SuppressWarnings("unused")
21 private Object unAnnotated;
22
23 @SkipArrayCheck
24 private Object skipArrayCheckAnnotated;
25
26 private Field unAnnotatedField, skipArrayCheckAnnotatedField;
27
28 @BeforeClass public void setUp() throws Exception {
29 unAnnotatedField = getClass().getDeclaredField("unAnnotated");
30 skipArrayCheckAnnotatedField = getClass().getDeclaredField("skipArrayCheckAnnotated");
31 }
32
33 @Test(dataProvider = "types", dataProviderClass = TypeProviders.class)
34 public void testSimpleAppendFormatted(Type type) throws Exception {
35 DefaultEnhancedPropertyFormatter formatter = new DefaultEnhancedPropertyFormatter();
36 Method appendFormatted =
37 formatter.getClass().getMethod("appendFormatted", new Class[] { StringBuilder.class, type.getClazz() });
38 for (Object value: type.getSampleValues()) {
39 StringBuilder builder = new StringBuilder();
40 appendFormatted.invoke(formatter, builder, value);
41 assertEquals(
42 builder.toString(),
43 type.toString(value),
44 "value: " + possibleArrayToList(value));
45 }
46 }
47
48 @Test(dataProvider = "arrayTypes", dataProviderClass = TypeProviders.class)
49 public void testArrayAsObjectToString(Type type, boolean skipArrayCheck) {
50 DefaultEnhancedPropertyFormatter simpleFormatter = new DefaultEnhancedPropertyFormatter();
51 for (Object value: type.getSampleValues()) {
52 testArrayAsObjectToStringForValue(type, skipArrayCheck, simpleFormatter,
53 value);
54 }
55 }
56
57 private void testArrayAsObjectToStringForValue(Type type,
58 boolean skipArrayCheck, DefaultEnhancedPropertyFormatter simpleFormatter,
59 Object value) {
60 StringBuilder builder = new StringBuilder();
61 simpleFormatter.initialize(skipArrayCheck ? skipArrayCheckAnnotatedField : unAnnotatedField);
62 if (skipArrayCheck) {
63 simpleFormatter.appendFormatted(builder, value);
64 }
65 else {
66 simpleFormatter.appendFormattedPossibleArray(builder, value);
67 }
68 if (! builder.toString().equals(skipArrayCheck ? Objects.toString(value) : type.deepToString(value)))
69 assertEquals(
70 builder.toString(),
71 skipArrayCheck ? Objects.toString(value) : type.deepToString(value),
72 "value: " + possibleArrayToList(value));
73 }
74
75
76
77
78
79
80
81 private Object possibleArrayToList(Object value) {
82 if (value == null || ! value.getClass().isArray()) {
83 return value;
84 }
85 List<Object> result = new ArrayList<>();
86 for (int i = 0; i < Array.getLength(value); i++) {
87 result.add(possibleArrayToList(Array.get(value, i)));
88 }
89 return result;
90 }
91 }