45 import toolbox.JavacTask; 46 import toolbox.Task; 47 import toolbox.ToolBox; 48 49 public class ModuleSourcePathTest extends ModuleTestBase { 50 51 public static final char PATH_SEP = File.pathSeparatorChar; 52 53 public static void main(String... args) throws Exception { 54 ModuleSourcePathTest t = new ModuleSourcePathTest(); 55 t.runTests(); 56 } 57 58 @Test 59 public void testSourcePathConflict(Path base) throws Exception { 60 Path sp = base.resolve("src"); 61 Path msp = base.resolve("srcmodules"); 62 63 String log = new JavacTask(tb, Task.Mode.CMDLINE) 64 .options("-XDrawDiagnostics", 65 "-sourcepath", sp.toString().replace('/', File.separatorChar), 66 "-modulesourcepath", msp.toString().replace('/', File.separatorChar), 67 "dummyClass") 68 .run(Task.Expect.FAIL) 69 .writeAll() 70 .getOutput(Task.OutputKind.DIRECT); 71 72 if (!log.contains("cannot specify both -sourcepath and -modulesourcepath")) 73 throw new Exception("expected diagnostic not found"); 74 } 75 76 @Test 77 public void testUnnormalizedPath1(Path base) throws Exception { 78 Path src = base.resolve("src"); 79 Path src_m1 = src.resolve("m1"); 80 tb.writeJavaFiles(src_m1, "module m1 { }"); 81 Path modules = base.resolve("modules"); 82 Files.createDirectories(modules); 83 84 new JavacTask(tb, Task.Mode.CMDLINE) 85 .options("-XDrawDiagnostics", 86 "-modulesourcepath", src.toString()) 87 .outdir(modules) 88 .files(prefixAll(findJavaFiles(src), Paths.get("./"))) 89 .run() 90 .writeAll(); 91 } 92 93 @Test 94 public void testUnnormalizedPath2(Path base) throws Exception { 95 Path src = base.resolve("src"); 96 Path src_m1 = src.resolve("m1"); 97 tb.writeJavaFiles(src_m1, "module m1 { }"); 98 Path modules = base.resolve("modules"); 99 Files.createDirectories(modules); 100 101 new JavacTask(tb, Task.Mode.CMDLINE) 102 .options("-XDrawDiagnostics", 103 "-modulesourcepath", "./" + src) 104 .outdir(modules) 105 .files(findJavaFiles(src)) 106 .run() 107 .writeAll(); 108 } 109 110 private Path[] prefixAll(Path[] paths, Path prefix) { 111 return Stream.of(paths) 112 .map(prefix::resolve) 113 .collect(Collectors.toList()) 114 .toArray(new Path[paths.length]); 115 } 116 117 @Test 118 public void regularBraces(Path base) throws Exception { 119 generateModules(base, "src1", "src2/inner_dir"); 120 121 final Path modules = base.resolve("modules"); 122 tb.createDirectories(modules); 123 124 new JavacTask(tb, Task.Mode.CMDLINE) 125 .options("-XDrawDiagnostics", 126 "-modulesourcepath", base + "/{src1,src2/inner_dir}") 127 .files(base.resolve("src1/m0/pkg0/A.java"), base.resolve("src2/inner_dir/m1/pkg1/A.java")) 128 .outdir(modules) 129 .run() 130 .writeAll(); 131 132 checkFiles(modules.resolve("m0/pkg0/A.class"), 133 modules.resolve("m1/pkg1/A.class"), 134 modules.resolve("m0/module-info.class"), 135 modules.resolve("m1/module-info.class")); 136 } 137 138 @Test 139 public void mismatchedBraces(Path base) throws Exception { 140 final List<String> sourcePaths = Arrays.asList( 141 "{", 142 "}", 143 "}{", 144 "./}", 145 ".././{./", 146 "src{}}", 147 "{{}{}}{}}", 148 "src/{a,b}/{", 149 "src/{a,{,{}}", 150 "{.,..{}/src", 151 "*}{", 152 "{}*}" 153 ); 154 for (String sourcepath : sourcePaths) { 155 String log = new JavacTask(tb, Task.Mode.CMDLINE) 156 .options("-XDrawDiagnostics", 157 "-modulesourcepath", sourcepath.replace('/', File.separatorChar)) 158 .run(Task.Expect.FAIL) 159 .writeAll() 160 .getOutput(Task.OutputKind.DIRECT); 161 162 if (!log.contains("- compiler.err.illegal.argument.for.option: -modulesourcepath, mismatched braces")) 163 throw new Exception("expected output for path [" + sourcepath + "] not found"); 164 } 165 } 166 167 @Test 168 public void deepBraces(Path base) throws Exception { 169 String[] modulePaths = {"src/src1", 170 "src/src2", 171 "src/src3", 172 "src/srcB/src1", 173 "src/srcB/src2/srcXX", 174 "src/srcB/src2/srcXY", 175 "src/srcC/src1", 176 "src/srcC/src2/srcXX", 177 "src/srcC/src2/srcXY"}; 178 generateModules(base, modulePaths); 179 180 final Path modules = base.resolve("modules"); 181 tb.createDirectories(modules); 182 183 new JavacTask(tb, Task.Mode.CMDLINE) 184 .options("-XDrawDiagnostics", 185 "-modulesourcepath", 186 base + "/{src/{{src1,src2,src3},{srcB,srcC}/{src1,src2/srcX{X,Y}/}},.}" 187 .replace('/', File.separatorChar)) 188 .files(findJavaFiles(base.resolve(modulePaths[modulePaths.length - 1]))) 189 .outdir(modules) 190 .run() 191 .writeAll(); 192 193 for (int i = 0; i < modulePaths.length; i++) { 194 checkFiles(modules.resolve("m" + i + "/module-info.class")); 195 } 196 checkFiles(modules.resolve("m8/pkg8/A.class")); 197 } 198 199 @Test 200 public void fileInPath(Path base) throws Exception { 201 Path src = base.resolve("src"); 202 tb.writeJavaFiles(src.resolve("kettle$"), "module kettle$ { }", "package electric; class Heater { }"); 203 tb.writeFile(base.resolve("dummy.txt"), ""); 204 205 final Path modules = base.resolve("modules"); 206 tb.createDirectories(modules); 207 208 new JavacTask(tb, Task.Mode.CMDLINE) 209 .options("-XDrawDiagnostics", 210 "-modulesourcepath", base + "/{dummy.txt,src}") 211 .files(src.resolve("kettle$/electric/Heater.java")) 212 .outdir(modules) 213 .run() 214 .writeAll(); 215 216 checkFiles(modules.resolve("kettle$/electric/Heater.class")); 217 checkFiles(modules.resolve("kettle$/module-info.class")); 218 } 219 220 @Test 221 public void noAlternative(Path base) throws Exception { 222 Path src = base.resolve("src"); 223 tb.writeJavaFiles(src.resolve("kettle$"), "module kettle$ { }", "package electric; class Heater { }"); 224 225 final Path modules = base.resolve("modules"); 226 tb.createDirectories(modules); 227 228 new JavacTask(tb, Task.Mode.CMDLINE) 229 .options("-XDrawDiagnostics", 230 "-modulesourcepath", base + "/{src}") 231 .files(src.resolve("kettle$/electric/Heater.java")) 232 .outdir(modules) 233 .run() 234 .writeAll(); 235 236 checkFiles(modules.resolve("kettle$/electric/Heater.class")); 237 checkFiles(modules.resolve("kettle$/module-info.class")); 238 } 239 240 @Test 241 public void noChoice(Path base) throws Exception { 242 tb.writeJavaFiles(base.resolve("kettle$"), "module kettle$ { }", "package electric; class Heater { }"); 243 244 final Path modules = base.resolve("modules"); 245 tb.createDirectories(modules); 246 247 new JavacTask(tb, Task.Mode.CMDLINE) 248 .options("-XDrawDiagnostics", 249 "-modulesourcepath", base + "/{}") 250 .files(base.resolve("kettle$/electric/Heater.java")) 251 .outdir(modules) 252 .run() 253 .writeAll(); 254 255 checkFiles(modules.resolve("kettle$/electric/Heater.class")); 256 checkFiles(modules.resolve("kettle$/module-info.class")); 257 } 258 259 @Test 260 public void nestedModules(Path src) throws Exception { 261 Path carModule = src.resolve("car"); 262 tb.writeJavaFiles(carModule, "module car { }", "package light; class Headlight { }"); 263 tb.writeJavaFiles(carModule.resolve("engine"), "module engine { }", "package flat; class Piston { }"); 264 265 final Path modules = src.resolve("modules"); 266 tb.createDirectories(modules); 267 268 new JavacTask(tb, Task.Mode.CMDLINE) 269 .options("-XDrawDiagnostics", 270 "-modulesourcepath", "{" + src + "," + src + "/car}") 271 .files(findJavaFiles(src)) 272 .outdir(modules) 273 .run() 274 .writeAll(); 275 checkFiles(modules.resolve("car/light/Headlight.class")); 276 checkFiles(modules.resolve("engine/flat/Piston.class")); 277 } 278 279 @Test 280 public void relativePaths(Path base) throws Exception { 281 Path src = base.resolve("src"); 282 tb.writeJavaFiles(src.resolve("kettle"), "module kettle { }", "package electric; class Heater { }"); 283 284 final Path modules = base.resolve("modules"); 285 tb.createDirectories(modules); 286 287 new JavacTask(tb, Task.Mode.CMDLINE) 288 .options("-XDrawDiagnostics", 289 "-modulesourcepath", base + "/src/./../src") 290 .files(src.resolve("kettle/electric/Heater.java")) 291 .outdir(modules) 292 .run() 293 .writeAll(); 294 checkFiles(modules.resolve("kettle/electric/Heater.class")); 295 checkFiles(modules.resolve("kettle/module-info.class")); 296 } 297 298 @Test 299 public void duplicatePaths(Path base) throws Exception { 300 Path src = base.resolve("src"); 301 tb.writeJavaFiles(src.resolve("m1"), "module m1 { }", "package a; class A { }"); 302 303 final Path modules = base.resolve("modules"); 304 tb.createDirectories(modules); 305 306 new JavacTask(tb, Task.Mode.CMDLINE) 307 .options("-XDrawDiagnostics", 308 "-modulesourcepath", base + "/{src,src,src}") 309 .files(src.resolve("m1/a/A.java")) 310 .outdir(modules) 311 .run() 312 .writeAll(); 313 314 checkFiles(modules.resolve("m1/module-info.class")); 315 } 316 317 @Test 318 public void notExistentPaths(Path base) throws Exception { 319 tb.writeJavaFiles(base.resolve("m1"), "module m1 { requires m0; }", "package a; class A { }"); 320 321 final Path modules = base.resolve("modules"); 322 tb.createDirectories(modules); 323 324 String log = new JavacTask(tb, Task.Mode.CMDLINE) 325 .options("-XDrawDiagnostics", 326 "-modulesourcepath", base + "/not_exist" + PATH_SEP + base + "/{not_exist,}") 327 .files(base.resolve("m1/a/A.java")) 328 .outdir(modules) 329 .run(Task.Expect.FAIL) 330 .writeAll() 331 .getOutput(Task.OutputKind.DIRECT); 332 if (!log.contains("compiler.err.module.not.found: m0")) 333 throw new Exception("expected output for not existent module source path not found"); 334 } 335 336 @Test 337 public void notExistentPathShouldBeSkipped(Path base) throws Exception { 338 tb.writeJavaFiles(base.resolve("m1"), "module m1 { }", "package a; class A { }"); 339 340 final Path modules = base.resolve("modules"); 341 tb.createDirectories(modules); 342 343 new JavacTask(tb, Task.Mode.CMDLINE) 344 .options("-XDrawDiagnostics", 345 "-modulesourcepath", base + "{/not_exist,/}") 346 .files(base.resolve("m1/a/A.java")) 347 .outdir(modules) 348 .run() 349 .writeAll(); 350 351 checkFiles(modules.resolve("m1/module-info.class")); 352 } 353 354 @Test 355 public void commas(Path base) throws Exception { 356 Path src = base.resolve("src"); 357 tb.writeJavaFiles(src.resolve("m1"), "module m1 { }", "package a; class A { }"); 358 359 final Path modules = base.resolve("modules"); 360 tb.createDirectories(modules); 361 362 new JavacTask(tb, Task.Mode.CMDLINE) 363 .options("-XDrawDiagnostics", 364 "-modulesourcepath", base + "/{,{,,,,src,,,}}") 365 .files(src.resolve("m1/a/A.java")) 366 .outdir(modules) 367 .run() 368 .writeAll(); 369 370 checkFiles(modules.resolve("m1/module-info.class")); 371 } 372 373 @Test 374 public void asterisk(Path base) throws Exception { 375 tb.writeJavaFiles(base.resolve("kettle").resolve("classes"), "module kettle { }", 376 "package electric; class Heater { }"); 377 378 final Path modules = base.resolve("modules"); 379 tb.createDirectories(modules); 380 381 new JavacTask(tb, Task.Mode.CMDLINE) 382 .options("-XDrawDiagnostics", 383 "-modulesourcepath", base + "/*/classes/") 384 .files(base.resolve("kettle/classes/electric/Heater.java")) 385 .outdir(modules) 386 .run() 387 .writeAll(); 388 389 checkFiles(modules.resolve("kettle/electric/Heater.class")); 390 checkFiles(modules.resolve("kettle/module-info.class")); 391 } 392 393 @Test 394 public void asteriskInDifferentSets(Path base) throws Exception { 395 Path src = base.resolve("src"); 396 final Path module = src.resolve("kettle"); 397 tb.writeJavaFiles(module.resolve("classes"), "module kettle { }", "package electric; class Heater { }"); 398 tb.writeJavaFiles(module.resolve("gensrc"), "package model; class Java { }"); 399 tb.writeJavaFiles(module.resolve("special/classes"), "package gas; class Heater { }"); 400 401 final Path modules = base.resolve("modules"); 402 tb.createDirectories(modules); 403 404 new JavacTask(tb, Task.Mode.CMDLINE) 405 .options("-XDrawDiagnostics", 406 "-modulesourcepath", src + "{/*/gensrc/,/*/classes/}" + PATH_SEP 407 + src + "/*/special/classes") 408 .files(findJavaFiles(src)) 409 .outdir(modules) 410 .run() 411 .writeAll(); 412 413 checkFiles(modules.resolve("kettle/electric/Heater.class")); 414 checkFiles(modules.resolve("kettle/gas/Heater.class")); 415 checkFiles(modules.resolve("kettle/model/Java.class")); 416 checkFiles(modules.resolve("kettle/module-info.class")); 417 } 418 419 @Test 420 public void asteriskIllegalUse(Path base) throws Exception { 421 final List<String> sourcePaths = Arrays.asList( 422 "*", 423 "**", 424 "***", 425 "*.*", 426 ".*", 427 "*.", 428 "src/*/*/", 429 "{*,*}", 430 "src/module*/" 431 ); 432 for (String sourcepath : sourcePaths) { 433 String log = new JavacTask(tb, Task.Mode.CMDLINE) 434 .options("-XDrawDiagnostics", 435 "-modulesourcepath", sourcepath.replace('/', File.separatorChar)) 436 .run(Task.Expect.FAIL) 437 .writeAll() 438 .getOutput(Task.OutputKind.DIRECT); 439 440 if (!log.contains("- compiler.err.illegal.argument.for.option: -modulesourcepath, illegal use of *")) 441 throw new Exception("expected output for path [" + sourcepath + "] not found"); 442 } 443 } 444 445 private void generateModules(Path base, String... paths) throws IOException { 446 for (int i = 0; i < paths.length; i++) { 447 String moduleName = "m" + i; 448 String dependency = i > 0 ? "requires m" + (i - 1) + ";" : ""; 449 tb.writeJavaFiles(base.resolve(paths[i]).resolve(moduleName), 450 "module " + moduleName + " { " + dependency + " }", 451 "package pkg" + i + "; class A { }"); 452 } 453 } 454 455 private void checkFiles(Path... files) throws Exception { 456 for (Path file : files) { 457 if (!Files.exists(file)) { 458 throw new Exception("File not exists: " + file); 459 } 460 } | 45 import toolbox.JavacTask; 46 import toolbox.Task; 47 import toolbox.ToolBox; 48 49 public class ModuleSourcePathTest extends ModuleTestBase { 50 51 public static final char PATH_SEP = File.pathSeparatorChar; 52 53 public static void main(String... args) throws Exception { 54 ModuleSourcePathTest t = new ModuleSourcePathTest(); 55 t.runTests(); 56 } 57 58 @Test 59 public void testSourcePathConflict(Path base) throws Exception { 60 Path sp = base.resolve("src"); 61 Path msp = base.resolve("srcmodules"); 62 63 String log = new JavacTask(tb, Task.Mode.CMDLINE) 64 .options("-XDrawDiagnostics", 65 "--source-path", sp.toString().replace('/', File.separatorChar), 66 "--module-source-path", msp.toString().replace('/', File.separatorChar), 67 "dummyClass") 68 .run(Task.Expect.FAIL) 69 .writeAll() 70 .getOutput(Task.OutputKind.DIRECT); 71 72 if (!log.contains("cannot specify both --source-path and --module-source-path")) 73 throw new Exception("expected diagnostic not found"); 74 } 75 76 @Test 77 public void testUnnormalizedPath1(Path base) throws Exception { 78 Path src = base.resolve("src"); 79 Path src_m1 = src.resolve("m1"); 80 tb.writeJavaFiles(src_m1, "module m1 { }"); 81 Path modules = base.resolve("modules"); 82 Files.createDirectories(modules); 83 84 new JavacTask(tb, Task.Mode.CMDLINE) 85 .options("-XDrawDiagnostics", 86 "--module-source-path", src.toString()) 87 .outdir(modules) 88 .files(prefixAll(findJavaFiles(src), Paths.get("./"))) 89 .run() 90 .writeAll(); 91 } 92 93 @Test 94 public void testUnnormalizedPath2(Path base) throws Exception { 95 Path src = base.resolve("src"); 96 Path src_m1 = src.resolve("m1"); 97 tb.writeJavaFiles(src_m1, "module m1 { }"); 98 Path modules = base.resolve("modules"); 99 Files.createDirectories(modules); 100 101 new JavacTask(tb, Task.Mode.CMDLINE) 102 .options("-XDrawDiagnostics", 103 "--module-source-path", "./" + src) 104 .outdir(modules) 105 .files(findJavaFiles(src)) 106 .run() 107 .writeAll(); 108 } 109 110 private Path[] prefixAll(Path[] paths, Path prefix) { 111 return Stream.of(paths) 112 .map(prefix::resolve) 113 .collect(Collectors.toList()) 114 .toArray(new Path[paths.length]); 115 } 116 117 @Test 118 public void regularBraces(Path base) throws Exception { 119 generateModules(base, "src1", "src2/inner_dir"); 120 121 final Path modules = base.resolve("modules"); 122 tb.createDirectories(modules); 123 124 new JavacTask(tb, Task.Mode.CMDLINE) 125 .options("-XDrawDiagnostics", 126 "--module-source-path", base + "/{src1,src2/inner_dir}") 127 .files(base.resolve("src1/m0/pkg0/A.java"), base.resolve("src2/inner_dir/m1/pkg1/A.java")) 128 .outdir(modules) 129 .run() 130 .writeAll(); 131 132 checkFiles(modules.resolve("m0/pkg0/A.class"), 133 modules.resolve("m1/pkg1/A.class"), 134 modules.resolve("m0/module-info.class"), 135 modules.resolve("m1/module-info.class")); 136 } 137 138 @Test 139 public void mismatchedBraces(Path base) throws Exception { 140 final List<String> sourcePaths = Arrays.asList( 141 "{", 142 "}", 143 "}{", 144 "./}", 145 ".././{./", 146 "src{}}", 147 "{{}{}}{}}", 148 "src/{a,b}/{", 149 "src/{a,{,{}}", 150 "{.,..{}/src", 151 "*}{", 152 "{}*}" 153 ); 154 for (String sourcepath : sourcePaths) { 155 String log = new JavacTask(tb, Task.Mode.CMDLINE) 156 .options("-XDrawDiagnostics", 157 "--module-source-path", sourcepath.replace('/', File.separatorChar)) 158 .run(Task.Expect.FAIL) 159 .writeAll() 160 .getOutput(Task.OutputKind.DIRECT); 161 162 if (!log.contains("- compiler.err.illegal.argument.for.option: --module-source-path, mismatched braces")) 163 throw new Exception("expected output for path [" + sourcepath + "] not found"); 164 } 165 } 166 167 @Test 168 public void deepBraces(Path base) throws Exception { 169 String[] modulePaths = {"src/src1", 170 "src/src2", 171 "src/src3", 172 "src/srcB/src1", 173 "src/srcB/src2/srcXX", 174 "src/srcB/src2/srcXY", 175 "src/srcC/src1", 176 "src/srcC/src2/srcXX", 177 "src/srcC/src2/srcXY"}; 178 generateModules(base, modulePaths); 179 180 final Path modules = base.resolve("modules"); 181 tb.createDirectories(modules); 182 183 new JavacTask(tb, Task.Mode.CMDLINE) 184 .options("-XDrawDiagnostics", 185 "--module-source-path", 186 base + "/{src/{{src1,src2,src3},{srcB,srcC}/{src1,src2/srcX{X,Y}/}},.}" 187 .replace('/', File.separatorChar)) 188 .files(findJavaFiles(base.resolve(modulePaths[modulePaths.length - 1]))) 189 .outdir(modules) 190 .run() 191 .writeAll(); 192 193 for (int i = 0; i < modulePaths.length; i++) { 194 checkFiles(modules.resolve("m" + i + "/module-info.class")); 195 } 196 checkFiles(modules.resolve("m8/pkg8/A.class")); 197 } 198 199 @Test 200 public void fileInPath(Path base) throws Exception { 201 Path src = base.resolve("src"); 202 tb.writeJavaFiles(src.resolve("kettle$"), "module kettle$ { }", "package electric; class Heater { }"); 203 tb.writeFile(base.resolve("dummy.txt"), ""); 204 205 final Path modules = base.resolve("modules"); 206 tb.createDirectories(modules); 207 208 new JavacTask(tb, Task.Mode.CMDLINE) 209 .options("-XDrawDiagnostics", 210 "--module-source-path", base + "/{dummy.txt,src}") 211 .files(src.resolve("kettle$/electric/Heater.java")) 212 .outdir(modules) 213 .run() 214 .writeAll(); 215 216 checkFiles(modules.resolve("kettle$/electric/Heater.class")); 217 checkFiles(modules.resolve("kettle$/module-info.class")); 218 } 219 220 @Test 221 public void noAlternative(Path base) throws Exception { 222 Path src = base.resolve("src"); 223 tb.writeJavaFiles(src.resolve("kettle$"), "module kettle$ { }", "package electric; class Heater { }"); 224 225 final Path modules = base.resolve("modules"); 226 tb.createDirectories(modules); 227 228 new JavacTask(tb, Task.Mode.CMDLINE) 229 .options("-XDrawDiagnostics", 230 "--module-source-path", base + "/{src}") 231 .files(src.resolve("kettle$/electric/Heater.java")) 232 .outdir(modules) 233 .run() 234 .writeAll(); 235 236 checkFiles(modules.resolve("kettle$/electric/Heater.class")); 237 checkFiles(modules.resolve("kettle$/module-info.class")); 238 } 239 240 @Test 241 public void noChoice(Path base) throws Exception { 242 tb.writeJavaFiles(base.resolve("kettle$"), "module kettle$ { }", "package electric; class Heater { }"); 243 244 final Path modules = base.resolve("modules"); 245 tb.createDirectories(modules); 246 247 new JavacTask(tb, Task.Mode.CMDLINE) 248 .options("-XDrawDiagnostics", 249 "--module-source-path", base + "/{}") 250 .files(base.resolve("kettle$/electric/Heater.java")) 251 .outdir(modules) 252 .run() 253 .writeAll(); 254 255 checkFiles(modules.resolve("kettle$/electric/Heater.class")); 256 checkFiles(modules.resolve("kettle$/module-info.class")); 257 } 258 259 @Test 260 public void nestedModules(Path src) throws Exception { 261 Path carModule = src.resolve("car"); 262 tb.writeJavaFiles(carModule, "module car { }", "package light; class Headlight { }"); 263 tb.writeJavaFiles(carModule.resolve("engine"), "module engine { }", "package flat; class Piston { }"); 264 265 final Path modules = src.resolve("modules"); 266 tb.createDirectories(modules); 267 268 new JavacTask(tb, Task.Mode.CMDLINE) 269 .options("-XDrawDiagnostics", 270 "--module-source-path", "{" + src + "," + src + "/car}") 271 .files(findJavaFiles(src)) 272 .outdir(modules) 273 .run() 274 .writeAll(); 275 checkFiles(modules.resolve("car/light/Headlight.class")); 276 checkFiles(modules.resolve("engine/flat/Piston.class")); 277 } 278 279 @Test 280 public void relativePaths(Path base) throws Exception { 281 Path src = base.resolve("src"); 282 tb.writeJavaFiles(src.resolve("kettle"), "module kettle { }", "package electric; class Heater { }"); 283 284 final Path modules = base.resolve("modules"); 285 tb.createDirectories(modules); 286 287 new JavacTask(tb, Task.Mode.CMDLINE) 288 .options("-XDrawDiagnostics", 289 "--module-source-path", base + "/src/./../src") 290 .files(src.resolve("kettle/electric/Heater.java")) 291 .outdir(modules) 292 .run() 293 .writeAll(); 294 checkFiles(modules.resolve("kettle/electric/Heater.class")); 295 checkFiles(modules.resolve("kettle/module-info.class")); 296 } 297 298 @Test 299 public void duplicatePaths(Path base) throws Exception { 300 Path src = base.resolve("src"); 301 tb.writeJavaFiles(src.resolve("m1"), "module m1 { }", "package a; class A { }"); 302 303 final Path modules = base.resolve("modules"); 304 tb.createDirectories(modules); 305 306 new JavacTask(tb, Task.Mode.CMDLINE) 307 .options("-XDrawDiagnostics", 308 "--module-source-path", base + "/{src,src,src}") 309 .files(src.resolve("m1/a/A.java")) 310 .outdir(modules) 311 .run() 312 .writeAll(); 313 314 checkFiles(modules.resolve("m1/module-info.class")); 315 } 316 317 @Test 318 public void notExistentPaths(Path base) throws Exception { 319 tb.writeJavaFiles(base.resolve("m1"), "module m1 { requires m0; }", "package a; class A { }"); 320 321 final Path modules = base.resolve("modules"); 322 tb.createDirectories(modules); 323 324 String log = new JavacTask(tb, Task.Mode.CMDLINE) 325 .options("-XDrawDiagnostics", 326 "--module-source-path", base + "/not_exist" + PATH_SEP + base + "/{not_exist,}") 327 .files(base.resolve("m1/a/A.java")) 328 .outdir(modules) 329 .run(Task.Expect.FAIL) 330 .writeAll() 331 .getOutput(Task.OutputKind.DIRECT); 332 if (!log.contains("compiler.err.module.not.found: m0")) 333 throw new Exception("expected output for not existent module source path not found"); 334 } 335 336 @Test 337 public void notExistentPathShouldBeSkipped(Path base) throws Exception { 338 tb.writeJavaFiles(base.resolve("m1"), "module m1 { }", "package a; class A { }"); 339 340 final Path modules = base.resolve("modules"); 341 tb.createDirectories(modules); 342 343 new JavacTask(tb, Task.Mode.CMDLINE) 344 .options("-XDrawDiagnostics", 345 "--module-source-path", base + "{/not_exist,/}") 346 .files(base.resolve("m1/a/A.java")) 347 .outdir(modules) 348 .run() 349 .writeAll(); 350 351 checkFiles(modules.resolve("m1/module-info.class")); 352 } 353 354 @Test 355 public void commas(Path base) throws Exception { 356 Path src = base.resolve("src"); 357 tb.writeJavaFiles(src.resolve("m1"), "module m1 { }", "package a; class A { }"); 358 359 final Path modules = base.resolve("modules"); 360 tb.createDirectories(modules); 361 362 new JavacTask(tb, Task.Mode.CMDLINE) 363 .options("-XDrawDiagnostics", 364 "--module-source-path", base + "/{,{,,,,src,,,}}") 365 .files(src.resolve("m1/a/A.java")) 366 .outdir(modules) 367 .run() 368 .writeAll(); 369 370 checkFiles(modules.resolve("m1/module-info.class")); 371 } 372 373 @Test 374 public void asterisk(Path base) throws Exception { 375 tb.writeJavaFiles(base.resolve("kettle").resolve("classes"), "module kettle { }", 376 "package electric; class Heater { }"); 377 378 final Path modules = base.resolve("modules"); 379 tb.createDirectories(modules); 380 381 new JavacTask(tb, Task.Mode.CMDLINE) 382 .options("-XDrawDiagnostics", 383 "--module-source-path", base + "/*/classes/") 384 .files(base.resolve("kettle/classes/electric/Heater.java")) 385 .outdir(modules) 386 .run() 387 .writeAll(); 388 389 checkFiles(modules.resolve("kettle/electric/Heater.class")); 390 checkFiles(modules.resolve("kettle/module-info.class")); 391 } 392 393 @Test 394 public void asteriskInDifferentSets(Path base) throws Exception { 395 Path src = base.resolve("src"); 396 final Path module = src.resolve("kettle"); 397 tb.writeJavaFiles(module.resolve("classes"), "module kettle { }", "package electric; class Heater { }"); 398 tb.writeJavaFiles(module.resolve("gensrc"), "package model; class Java { }"); 399 tb.writeJavaFiles(module.resolve("special/classes"), "package gas; class Heater { }"); 400 401 final Path modules = base.resolve("modules"); 402 tb.createDirectories(modules); 403 404 new JavacTask(tb, Task.Mode.CMDLINE) 405 .options("-XDrawDiagnostics", 406 "--module-source-path", src + "{/*/gensrc/,/*/classes/}" + PATH_SEP 407 + src + "/*/special/classes") 408 .files(findJavaFiles(src)) 409 .outdir(modules) 410 .run() 411 .writeAll(); 412 413 checkFiles(modules.resolve("kettle/electric/Heater.class")); 414 checkFiles(modules.resolve("kettle/gas/Heater.class")); 415 checkFiles(modules.resolve("kettle/model/Java.class")); 416 checkFiles(modules.resolve("kettle/module-info.class")); 417 } 418 419 @Test 420 public void asteriskIllegalUse(Path base) throws Exception { 421 final List<String> sourcePaths = Arrays.asList( 422 "*", 423 "**", 424 "***", 425 "*.*", 426 ".*", 427 "*.", 428 "src/*/*/", 429 "{*,*}", 430 "src/module*/" 431 ); 432 for (String sourcepath : sourcePaths) { 433 String log = new JavacTask(tb, Task.Mode.CMDLINE) 434 .options("-XDrawDiagnostics", 435 "--module-source-path", sourcepath.replace('/', File.separatorChar)) 436 .run(Task.Expect.FAIL) 437 .writeAll() 438 .getOutput(Task.OutputKind.DIRECT); 439 440 if (!log.contains("- compiler.err.illegal.argument.for.option: --module-source-path, illegal use of *")) 441 throw new Exception("expected output for path [" + sourcepath + "] not found"); 442 } 443 } 444 445 private void generateModules(Path base, String... paths) throws IOException { 446 for (int i = 0; i < paths.length; i++) { 447 String moduleName = "m" + i; 448 String dependency = i > 0 ? "requires m" + (i - 1) + ";" : ""; 449 tb.writeJavaFiles(base.resolve(paths[i]).resolve(moduleName), 450 "module " + moduleName + " { " + dependency + " }", 451 "package pkg" + i + "; class A { }"); 452 } 453 } 454 455 private void checkFiles(Path... files) throws Exception { 456 for (Path file : files) { 457 if (!Files.exists(file)) { 458 throw new Exception("File not exists: " + file); 459 } 460 } |