1
1
package com .antkorwin .betterstrings ;
2
2
3
- import java .io .ByteArrayOutputStream ;
4
- import java .io .IOException ;
5
- import java .io .OutputStream ;
6
- import java .lang .reflect .Method ;
7
- import java .net .URI ;
8
- import java .util .ArrayList ;
9
- import java .util .Arrays ;
10
- import java .util .Iterator ;
11
- import java .util .List ;
12
- import javax .tools .FileObject ;
13
- import javax .tools .ForwardingJavaFileManager ;
14
- import javax .tools .JavaCompiler ;
15
- import javax .tools .JavaFileManager ;
16
- import javax .tools .JavaFileObject ;
17
- import javax .tools .SimpleJavaFileObject ;
18
- import javax .tools .ToolProvider ;
19
-
3
+ import com .jupitertools .compiletest .CompileTest ;
4
+ import org .intellij .lang .annotations .Language ;
20
5
import org .junit .jupiter .api .Test ;
21
6
22
7
import static org .assertj .core .api .Assertions .assertThat ;
25
10
class BetterStringsProcessorTest {
26
11
27
12
@ Test
28
- void name () throws Exception {
13
+ void compileTest () {
29
14
30
- String program =
31
- "public class Test { " +
32
- "public static String hello(){ " +
33
- "String x = \" Ho!\" ; " +
34
- "return \" Hey-${x}\" ;" +
35
- "}" +
36
- " }" ;
15
+ @ Language ("Java" ) String classCode = "public class Test { " +
16
+ " public static String hello(){ " +
17
+ " String x = \" Ho!\" ; " +
18
+ " return \" Hey-${x}\" ;" +
19
+ " }" +
20
+ "}" ;
37
21
38
- ClassLoader classLoader = getCompiledClassLoader ("Test" , program );
39
- Class <?> testClass = classLoader .loadClass ("Test" );
40
- Method method = testClass .getMethod ("hello" , null );
41
- String result = (String ) method .invoke (null );
22
+ Object result = new CompileTest ().classCode ("Test" , classCode )
23
+ .processor (new BetterStringsProcessor ())
24
+ .compile ()
25
+ .loadClass ("Test" )
26
+ .invokeStatic ("hello" );
42
27
43
28
assertThat (result ).isEqualTo ("Hey-Ho!" );
44
29
}
45
-
46
- private ClassLoader getCompiledClassLoader (String className , String program ) {
47
-
48
- JavaCompiler compiler = ToolProvider .getSystemJavaCompiler ();
49
- JavaFileObject compilationUnit = new StringJavaFileObject (className , program );
50
-
51
- SimpleJavaFileManager fileManager =
52
- new SimpleJavaFileManager (compiler .getStandardFileManager (null ,
53
- null ,
54
- null ));
55
-
56
- JavaCompiler .CompilationTask compilationTask =
57
- compiler .getTask (null ,
58
- fileManager ,
59
- null ,
60
- null ,
61
- null ,
62
- Arrays .asList (compilationUnit ));
63
-
64
- compilationTask .setProcessors (Arrays .asList (new BetterStringsProcessor ()));
65
- compilationTask .call ();
66
-
67
- return new CompiledClassLoader (fileManager .getGeneratedOutputFiles ());
68
- }
69
-
70
- private static class StringJavaFileObject extends SimpleJavaFileObject {
71
- private final String code ;
72
-
73
- public StringJavaFileObject (String name , String code ) {
74
- super (URI .create ("string:///" + name .replace ('.' , '/' ) + Kind .SOURCE .extension ),
75
- Kind .SOURCE );
76
- this .code = code ;
77
- }
78
-
79
- @ Override
80
- public CharSequence getCharContent (boolean ignoreEncodingErrors ) throws IOException {
81
- return code ;
82
- }
83
- }
84
-
85
- private static class CompiledClassLoader extends ClassLoader {
86
- private final List <ClassJavaFileObject > files ;
87
-
88
- private CompiledClassLoader (List <ClassJavaFileObject > files ) {
89
- this .files = files ;
90
- }
91
-
92
- @ Override
93
- protected Class <?> findClass (String name ) throws ClassNotFoundException {
94
- Iterator <ClassJavaFileObject > itr = files .iterator ();
95
- while (itr .hasNext ()) {
96
- ClassJavaFileObject file = itr .next ();
97
- if (file .getClassName ().equals (name )) {
98
- itr .remove ();
99
- byte [] bytes = file .getBytes ();
100
- return super .defineClass (name , bytes , 0 , bytes .length );
101
- }
102
- }
103
- return super .findClass (name );
104
- }
105
- }
106
-
107
- private static class ClassJavaFileObject extends SimpleJavaFileObject {
108
- private final ByteArrayOutputStream outputStream ;
109
- private final String className ;
110
-
111
- protected ClassJavaFileObject (String className , Kind kind ) {
112
- super (URI .create ("mem:///" + className .replace ('.' , '/' ) + kind .extension ), kind );
113
- this .className = className ;
114
- outputStream = new ByteArrayOutputStream ();
115
- }
116
-
117
- @ Override
118
- public OutputStream openOutputStream () throws IOException {
119
- return outputStream ;
120
- }
121
-
122
- public byte [] getBytes () {
123
- return outputStream .toByteArray ();
124
- }
125
-
126
- public String getClassName () {
127
- return className ;
128
- }
129
- }
130
-
131
- private static class SimpleJavaFileManager extends ForwardingJavaFileManager {
132
- private final List <ClassJavaFileObject > outputFiles ;
133
-
134
- protected SimpleJavaFileManager (JavaFileManager fileManager ) {
135
- super (fileManager );
136
- outputFiles = new ArrayList <>();
137
- }
138
-
139
- @ Override
140
- public JavaFileObject getJavaFileForOutput (Location location ,
141
- String className ,
142
- JavaFileObject .Kind kind ,
143
- FileObject sibling ) throws IOException {
144
- ClassJavaFileObject file = new ClassJavaFileObject (className , kind );
145
- outputFiles .add (file );
146
- return file ;
147
- }
148
-
149
- public List <ClassJavaFileObject > getGeneratedOutputFiles () {
150
- return outputFiles ;
151
- }
152
- }
153
30
}
0 commit comments