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.mdsal.binding.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;
19 import org.junit.Test;
20 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
21 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
22 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
23 import org.opendaylight.mdsal.binding.model.api.Type;
25 public class BuilderGeneratorTest {
27 private static final String PROPERTIES_FIELD_NAME = "properties";
28 private static final String GEN_TO_STRING_FIRST_PART =
29 "@Override\npublic java.lang.String toString() {\n java.lang.String name = \"test [\";\n "
30 + "java.lang.StringBuilder builder = new java.lang.StringBuilder (name);";
31 private static final String GEN_TO_STRING_LAST_PART = "\n return builder.append(']').toString();\n}\n";
32 private static final String GEN_TO_STRING_AUGMENT_PART =
33 "\n builder.append(\"augmentation=\");\n builder.append(augmentation.values());";
34 private static final String APPEND_COMMA = "builder.append(\", \");";
35 private static final String APPEND_COMMA_AUGMENT = "final int builderLength = builder.length();\n"
36 + " final int builderAdditionalLength = builder.substring(name.length(), builderLength).length();\n"
37 + " if (builderAdditionalLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(\", \")) {\n"
38 + " " + APPEND_COMMA + "\n" + " }";
39 private static final String TEST = "test";
42 public void basicTest() {
43 assertEquals("", new BuilderGenerator().generate(mock(Type.class)));
47 public void builderTemplateGenerateToStringWithPropertyTest() {
48 final GeneratedType genType = mockGenType("get" + TEST);
50 assertEquals("@Override\n" +
51 "public java.lang.String toString() {\n" +
52 " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
53 " CodeHelpers.appendValue(helper, \"_test\", _test);\n" +
54 " return helper.toString();\n" +
55 "}\n", genToString(genType).toString());
59 public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception {
60 assertEquals("@Override\n" +
61 "public java.lang.String toString() {\n" +
62 " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
63 " return helper.toString();\n" +
64 "}\n", genToString(mockGenType(TEST)).toString());
68 public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception {
69 assertEquals("@Override\n" +
70 "public java.lang.String toString() {\n" +
71 " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
72 " CodeHelpers.appendValue(helper, \"_test1\", _test1);\n" +
73 " CodeHelpers.appendValue(helper, \"_test2\", _test2);\n" +
74 " return helper.toString();\n" +
75 "}\n", genToString(mockGenTypeMoreMeth("get" + TEST)).toString());
79 public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception {
80 assertEquals("@Override\n" +
81 "public java.lang.String toString() {\n" +
82 " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
83 " CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
84 " return helper.toString();\n" +
85 "}\n", genToString(mockAugment(mockGenType(TEST))).toString());
89 public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception {
90 assertEquals("@Override\n" +
91 "public java.lang.String toString() {\n" +
92 " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
93 " CodeHelpers.appendValue(helper, \"_test\", _test);\n" +
94 " CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
95 " return helper.toString();\n" +
96 "}\n", genToString(mockAugment(mockGenType("get" + TEST))).toString());
100 public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception {
101 assertEquals("@Override\n" +
102 "public java.lang.String toString() {\n" +
103 " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
104 " CodeHelpers.appendValue(helper, \"_test1\", _test1);\n" +
105 " CodeHelpers.appendValue(helper, \"_test2\", _test2);\n" +
106 " CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
107 " return helper.toString();\n" +
108 "}\n", genToString(mockAugment(mockGenTypeMoreMeth("get" + TEST))).toString());
111 private static GeneratedType 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();
120 private static GeneratedType mockGenTypeMoreMeth(final String methodeName) {
121 final GeneratedType genType = spy(GeneratedType.class);
122 doReturn(TEST).when(genType).getName();
123 doReturn(TEST).when(genType).getPackageName();
125 final List<MethodSignature> listMethodSign = new ArrayList<>();
126 for (int i = 0; i < 2; i++) {
127 final MethodSignature methSign = mockMethSign(methodeName + (i + 1));
128 listMethodSign.add(methSign);
130 doReturn(listMethodSign).when(genType).getMethodDefinitions();
132 final List<Type> impls = new ArrayList<>();
133 doReturn(impls).when(genType).getImplements();
137 @SuppressWarnings("unchecked")
138 private static CharSequence genToString(final GeneratedType genType) {
140 final BuilderTemplate bt = new BuilderTemplate(genType);
141 final Field propertiesField = bt.getClass().getDeclaredField(PROPERTIES_FIELD_NAME);
142 propertiesField.setAccessible(true);
143 return bt.generateToString((Collection<GeneratedProperty>) propertiesField.get(bt));
144 } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
145 throw new RuntimeException(e);
149 private static GeneratedType mockGenType(final String methodeName) {
150 final GeneratedType genType = spy(GeneratedType.class);
151 doReturn(TEST).when(genType).getName();
152 doReturn(TEST).when(genType).getPackageName();
154 final List<MethodSignature> listMethodSign = new ArrayList<>();
155 final MethodSignature methSign = mockMethSign(methodeName);
156 listMethodSign.add(methSign);
157 doReturn(listMethodSign).when(genType).getMethodDefinitions();
159 final List<Type> impls = new ArrayList<>();
160 doReturn(impls).when(genType).getImplements();
164 private static MethodSignature mockMethSign(final String methodeName) {
165 final MethodSignature methSign = mock(MethodSignature.class);
166 doReturn(methodeName).when(methSign).getName();
167 final Type methType = mock(Type.class);
168 doReturn(TEST).when(methType).getName();
169 doReturn(TEST).when(methType).getPackageName();
170 doReturn(methType).when(methSign).getReturnType();