2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.sal.java.api.generator;
10 import static org.junit.Assert.assertEquals;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.spy;
15 import java.lang.reflect.Field;
16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.List;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty;
22 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;
23 import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature;
24 import org.opendaylight.yangtools.sal.binding.model.api.Type;
26 @SuppressWarnings("deprecation")
27 public class BuilderGeneratorTest {
29 private static final String PROPERTIES_FIELD_NAME = "properties";
30 private static final String GEN_TO_STRING_FIRST_PART =
31 "@Override\npublic java.lang.String toString() {\n java.lang.String name = \"test [\";\n "
32 + "java.lang.StringBuilder builder = new java.lang.StringBuilder (name);";
33 private static final String GEN_TO_STRING_LAST_PART = "\n return builder.append(']').toString();\n}\n";
34 private static final String GEN_TO_STRING_AUGMENT_PART =
35 "\n builder.append(\"augmentation=\");\n builder.append(augmentation.values());";
36 private static final String APPEND_COMMA = "builder.append(\", \");";
37 private static final String APPEND_COMMA_AUGMENT = "final int builderLength = builder.length();\n"
38 + " final int builderAdditionalLength = builder.substring(name.length(), builderLength).length();\n"
39 + " if (builderAdditionalLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(\", \")) {\n"
40 + " " + APPEND_COMMA + "\n" + " }";
41 private static final String TEST = "test";
44 public void basicTest() throws Exception {
45 assertEquals("", new BuilderGenerator().generate(mock(Type.class)));
49 public void builderTemplateGenerateToStringWithPropertyTest() throws Exception {
50 final GeneratedType genType = mockGenType("get" + TEST);
51 final String generateToString = genToString(genType).toString();
52 final String expected = GEN_TO_STRING_FIRST_PART
53 + "\n if (_test != null) {\n builder.append(\"_test=\");\n builder.append(_test);\n }"
54 + GEN_TO_STRING_LAST_PART;
55 assertEquals(expected, generateToString);
59 public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception {
60 final GeneratedType genType = mockGenType(TEST);
61 final String generateToString = genToString(genType).toString();
62 final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_LAST_PART;
63 assertEquals(expected, generateToString);
67 public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception {
68 final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
69 final String generateToString = genToString(genType).toString();
70 final String expected = GEN_TO_STRING_FIRST_PART
71 + "\n if (_test1 != null) {\n builder.append(\"_test1=\");\n builder.append(_test1);"
72 + "\n " + APPEND_COMMA + "\n }"
73 + "\n if (_test2 != null) {\n builder.append(\"_test2=\");\n builder.append(_test2);\n }"
74 + GEN_TO_STRING_LAST_PART;
75 assertEquals(expected, generateToString);
79 public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception {
80 final GeneratedType genType = mockGenType(TEST);
82 final String generateToString = genToString(genType).toString();
83 final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
84 assertEquals(expected, generateToString);
88 public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception {
89 final GeneratedType genType = mockGenType("get" + TEST);
91 final String generateToString = genToString(genType).toString();
92 final String expected = GEN_TO_STRING_FIRST_PART
93 + "\n if (_test != null) {\n builder.append(\"_test=\");\n builder.append(_test);\n }"
94 + "\n " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
95 assertEquals(expected, generateToString);
99 public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception {
100 final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
101 mockAugment(genType);
102 final String generateToString = genToString(genType).toString();
103 final String expected = GEN_TO_STRING_FIRST_PART
104 + "\n if (_test1 != null) {\n builder.append(\"_test1=\");\n builder.append(_test1);\n "
105 + APPEND_COMMA + "\n }"
106 + "\n if (_test2 != null) {\n builder.append(\"_test2=\");\n builder.append(_test2);\n }"
107 + "\n " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
108 assertEquals(expected, generateToString);
111 private void mockAugment(final GeneratedType genType) {
112 final List<Type> impls = new ArrayList<>();
113 final Type impl = mock(Type.class);
114 doReturn("org.opendaylight.yangtools.yang.binding.Augmentable").when(impl).getFullyQualifiedName();
116 doReturn(impls).when(genType).getImplements();
119 private GeneratedType mockGenTypeMoreMeth(final String methodeName) {
120 final GeneratedType genType = spy(GeneratedType.class);
121 doReturn(TEST).when(genType).getName();
122 doReturn(TEST).when(genType).getPackageName();
124 final List<MethodSignature> listMethodSign = new ArrayList<>();
125 for (int i = 0; i < 2; i++) {
126 final MethodSignature methSign = mockMethSign(methodeName + (i + 1));
127 listMethodSign.add(methSign);
129 doReturn(listMethodSign).when(genType).getMethodDefinitions();
131 final List<Type> impls = new ArrayList<>();
132 doReturn(impls).when(genType).getImplements();
136 @SuppressWarnings("unchecked")
137 private CharSequence genToString(final GeneratedType genType)
138 throws NoSuchFieldException, IllegalAccessException {
139 final BuilderTemplate bt = new BuilderTemplate(genType);
140 final Field propertiesField = bt.getClass().getDeclaredField(PROPERTIES_FIELD_NAME);
141 propertiesField.setAccessible(true);
142 return bt.generateToString((Collection<GeneratedProperty>) propertiesField.get(bt));
145 private GeneratedType mockGenType(final String methodeName) {
146 final GeneratedType genType = spy(GeneratedType.class);
147 doReturn(TEST).when(genType).getName();
148 doReturn(TEST).when(genType).getPackageName();
150 final List<MethodSignature> listMethodSign = new ArrayList<>();
151 final MethodSignature methSign = mockMethSign(methodeName);
152 listMethodSign.add(methSign);
153 doReturn(listMethodSign).when(genType).getMethodDefinitions();
155 final List<Type> impls = new ArrayList<>();
156 doReturn(impls).when(genType).getImplements();
160 private MethodSignature mockMethSign(final String methodeName) {
161 final MethodSignature methSign = mock(MethodSignature.class);
162 doReturn(methodeName).when(methSign).getName();
163 final Type methType = mock(Type.class);
164 doReturn(TEST).when(methType).getName();
165 doReturn(TEST).when(methType).getPackageName();
166 doReturn(methType).when(methSign).getReturnType();