1 /*
2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 import java.util.Collection;
25 import java.util.stream.Collectors;
26 
27 public enum  ClassType {
28     CLASS("class"),
29     INTERFACE("interface") {
30         @Override
methodToString(TestCase.TestMethodInfo method)31         public String methodToString(TestCase.TestMethodInfo method) {
32             String modifiers = method.mods.stream()
33                     .collect(Collectors.joining(" "));
34             boolean hasBody = modifiers.contains("static") || modifiers.contains("default");
35             String parameters = method.parameters.stream()
36                     .map(TestCase.TestMemberInfo::generateSource)
37                     .collect(Collectors.joining(", "));
38             return String.format("%s %s %s(%s) %s",
39                     method.indention() + modifiers,
40                     "int",
41                     method.getName(),
42                     parameters,
43                     hasBody ? "{return 0;}" : ";");
44         }
45     },
46     ANNOTATION("@interface") {
47         @Override
methodToString(TestCase.TestMethodInfo method)48         public String methodToString(TestCase.TestMethodInfo method) {
49             String modifiers = method.mods.stream()
50                     .collect(Collectors.joining(" "));
51             return String.format("%s %s %s() %s",
52                     method.indention() + modifiers,
53                     "int",
54                     method.getName(),
55                     ";");
56         }
57     },
58     ENUM("enum") {
59         @Override
fieldToString(TestCase.TestFieldInfo field)60         public String fieldToString(TestCase.TestFieldInfo field) {
61             return field.indention() + field.name;
62         }
63 
64         @Override
collectFields(Collection<TestCase.TestFieldInfo> fields)65         public String collectFields(Collection<TestCase.TestFieldInfo> fields) {
66             return fields.stream()
67                     .map(TestCase.TestMemberInfo::generateSource)
68                     .collect(Collectors.joining(",\n")) + ";\n";
69         }
70     };
71 
72     private final String classType;
73 
ClassType(String classType)74     ClassType(String classType) {
75         this.classType = classType;
76     }
77 
collectSrc(Collection<? extends TestCase.TestMemberInfo> members)78     private String collectSrc(Collection<? extends TestCase.TestMemberInfo> members) {
79         String src = members.stream()
80                 .map(TestCase.TestMemberInfo::generateSource)
81                 .collect(Collectors.joining("\n"));
82         return src.trim().isEmpty() ? "" : src + "\n\n";
83     }
84 
collectInnerClasses(Collection<TestCase.TestClassInfo> innerClasses)85     public String collectInnerClasses(Collection<TestCase.TestClassInfo> innerClasses) {
86         return collectSrc(innerClasses);
87     }
88 
collectFields(Collection<TestCase.TestFieldInfo> fields)89     public String collectFields(Collection<TestCase.TestFieldInfo> fields) {
90         return collectSrc(fields);
91     }
92 
collectMethods(Collection<TestCase.TestMethodInfo> methods)93     public String collectMethods(Collection<TestCase.TestMethodInfo> methods) {
94         return collectSrc(methods);
95     }
96 
methodToString(TestCase.TestMethodInfo method)97     public String methodToString(TestCase.TestMethodInfo method) {
98         String modifiers = method.mods.stream()
99                 .collect(Collectors.joining(" "));
100         String parameters = method.parameters.stream()
101                 .map(TestCase.TestMemberInfo::generateSource)
102                 .collect(Collectors.joining(", "));
103         String localClasses = collectInnerClasses(method.localClasses.values());
104         String methodBody = modifiers.contains("abstract") ? ";" :
105                 String.format("{%n%s%s%n%s}",
106                         localClasses,
107                         method.isConstructor
108                                 ? ""
109                                 : method.indention() + "return false;",
110                         method.indention());
111         return String.format("%s %s %s(%s) %s",
112                 method.indention() + modifiers,
113                 method.isConstructor ? "" : "boolean",
114                 method.getName(),
115                 parameters,
116                 methodBody);
117     }
118 
fieldToString(TestCase.TestFieldInfo field)119     public String fieldToString(TestCase.TestFieldInfo field) {
120         String modifiers = field.mods.stream()
121                 .collect(Collectors.joining(" "));
122         return String.format("%s int %s = 0;",
123                 field.indention() + modifiers,
124                 field.name);
125     }
126 
getDescription()127     public String getDescription() {
128         return classType;
129     }
130 }
131