View Javadoc
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") // used to initialize the formatter.
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     * Convert arrays to lists, leaving other types alone.
78     * @param value
79     * @return {@code value} if value is not an array, or the List equivalent of {@code value} if value is an array
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  }