package driver; import static driver.RequiresParserTests.Type.MACRO; import static driver.RequiresParserTests.Type.REGULAR; import static driver.RequiresParserTests.Type.STATIC; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static util.ListUtils.list; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import util.Result; import files.RelativeSourcePath; import files.Require; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.junit.runners.MethodSorters; import parser.Matcher; import source.Source; import source.SourceString; @RunWith(JUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class RequiresParserTests { enum Type { REGULAR, MACRO, STATIC } void verifyReq(Require req, Type type, List<String> classes, String member, String path) { assertTrue( req.isMacro() && type == MACRO || req.isRegular() && type == REGULAR || req.isStatic() && type == STATIC); assertTrue( // unique type (req.isMacro() ^ req.isRegular() ^ req.isStatic()) && !(req.isMacro() && req.isRegular())); assertEquals(classes, req.classes()); assertEquals(member, req.isMacro() ? req.macro() : req.member()); assertEquals(new RelativeSourcePath(Paths.get(path)), req.relativePath()); } String sourceString = "package pkg;" + "require pkg.File:Class;" + "require pkg.File:Class.*;" + "require pkg.File:Class.Nested;" + "require pkg.ClassAndFile;" + "require pkg.ClassAndFile::;" + "require pkg.ClassAndFile::*;" + "require pkg.ClassAndFile::Nested;" + "require static pkg.File:Class.*;" + "require static pkg.File:Class.staticMeth;" + "require static pkg.ClassAndFile::*;" + "require static pkg.ClassAndFile::staticMeth;" + "require macro pkg.File:*;" + "require macro pkg.File:Macro;" + "require macro pkg.MacroAndFile;" + "require macro pkg.MacroAndFile::;" + "import java.util.List;"; @Test public void aa_parseRequires() { Source source = new SourceString(sourceString); Matcher matcher = new Matcher(source); RequiresParser reqp = new RequiresParser(); List<Require> reqs = new ArrayList<>(); List<String> imps = new ArrayList<>(); Result<String> pkg = new Result<>(); reqp.parseRequires(matcher, pkg, reqs, imps); assertEquals("pkg", pkg.get()); assertEquals(15, reqs.size()); int i = 0; String m = "Macro"; String c = "Class"; String n = "Nested"; String cf = "ClassAndFile"; String mf = "MacroAndFile"; String sm = "staticMeth"; String fp = "pkg/File.java"; String fpm = "pkg/File.javam"; String cfp = "pkg/ClassAndFile.java"; String mfp = "pkg/MacroAndFile.javam"; verifyReq(reqs.get(i++), REGULAR, list(c), null, fp); verifyReq(reqs.get(i++), REGULAR, list(c, "*"), null, fp); verifyReq(reqs.get(i++), REGULAR, list(c, n), null, fp); verifyReq(reqs.get(i++), REGULAR, list(cf), null, cfp); verifyReq(reqs.get(i++), REGULAR, list(cf), null, cfp); verifyReq(reqs.get(i++), REGULAR, list(cf, "*"), null, cfp); verifyReq(reqs.get(i++), REGULAR, list(cf, n), null, cfp); verifyReq(reqs.get(i++), STATIC, list(c), "*", fp); verifyReq(reqs.get(i++), STATIC, list(c), sm, fp); verifyReq(reqs.get(i++), STATIC, list(cf), "*", cfp); verifyReq(reqs.get(i++), STATIC, list(cf), sm, cfp); verifyReq(reqs.get(i++), MACRO, null, "*", fpm); verifyReq(reqs.get(i++), MACRO, null, m, fpm); verifyReq(reqs.get(i++), MACRO, null, mf, mfp); verifyReq(reqs.get(i++), MACRO, null, mf, mfp); } @Test public void ab_processPackageImport() { } }