aboutsummaryrefslogtreecommitdiffstats
path: root/ajdoc/src
diff options
context:
space:
mode:
authorAndy Clement <aclement@pivotal.io>2019-01-29 17:07:22 -0800
committerAndy Clement <aclement@pivotal.io>2019-01-29 17:07:22 -0800
commit89739bc1ff28a18fadcb27dba7fd26d27ea7b343 (patch)
tree165bc12fa79f098634d888b4068b8d203e377546 /ajdoc/src
parente8436048b1667bc2d1d7c9a48070fb73a281daf9 (diff)
downloadaspectj-89739bc1ff28a18fadcb27dba7fd26d27ea7b343.tar.gz
aspectj-89739bc1ff28a18fadcb27dba7fd26d27ea7b343.zip
mavenizing ajdoc - wip
Diffstat (limited to 'ajdoc/src')
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/CompilerWrapper.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/CompilerWrapper.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/Config.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/Config.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/DocException.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/DocException.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/HtmlDecorator.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/HtmlDecorator.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/JavadocRunner.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/JavadocRunner.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/Main.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/Main.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/StructureUtil.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/StructureUtil.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/StubFileGenerator.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/StubFileGenerator.java)0
-rw-r--r--ajdoc/src/main/java/org/aspectj/tools/ajdoc/Util.java (renamed from ajdoc/src/org/aspectj/tools/ajdoc/Util.java)0
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocModuleTests.java27
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocOutputChecker.java305
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTestCase.java315
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTests.java53
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/BugTests.java185
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/CoverageTestCase.java940
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/DeclareFormsTest.java569
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/EnumTest.java47
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/ExecutionTestCase.java37
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/FullyQualifiedArgumentTest.java45
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/ITDTest.java137
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/JDKVersionTest.java31
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/PatternsTestCase.java91
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/PointcutVisibilityTest.java96
-rw-r--r--ajdoc/src/test/java/org/aspectj/tools/ajdoc/SpacewarTestCase.java41
24 files changed, 2919 insertions, 0 deletions
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/CompilerWrapper.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/CompilerWrapper.java
index f27d3b166..f27d3b166 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/CompilerWrapper.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/CompilerWrapper.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/Config.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/Config.java
index 4a65f105f..4a65f105f 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/Config.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/Config.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/DocException.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/DocException.java
index 0c8bc3575..0c8bc3575 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/DocException.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/DocException.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/HtmlDecorator.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/HtmlDecorator.java
index ec492fce9..ec492fce9 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/HtmlDecorator.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/HtmlDecorator.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/JavadocRunner.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/JavadocRunner.java
index 64e53eead..64e53eead 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/JavadocRunner.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/JavadocRunner.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/Main.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/Main.java
index 2e622ba9c..2e622ba9c 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/Main.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/Main.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/StructureUtil.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/StructureUtil.java
index 3d866b625..3d866b625 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/StructureUtil.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/StructureUtil.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/StubFileGenerator.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/StubFileGenerator.java
index 6b5c816f7..6b5c816f7 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/StubFileGenerator.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/StubFileGenerator.java
diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/Util.java b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/Util.java
index c5eb5f921..c5eb5f921 100644
--- a/ajdoc/src/org/aspectj/tools/ajdoc/Util.java
+++ b/ajdoc/src/main/java/org/aspectj/tools/ajdoc/Util.java
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocModuleTests.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocModuleTests.java
new file mode 100644
index 000000000..19202e9e3
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocModuleTests.java
@@ -0,0 +1,27 @@
+package org.aspectj.tools.ajdoc;
+/* *******************************************************************
+ * Copyright (c) 2003 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+
+/**
+ * @author Mik Kersten
+ */
+public class AjdocModuleTests {
+ public static Test suite() {
+ TestSuite suite = new TestSuite(AjdocModuleTests.class.getName());
+ suite.addTest(AjdocTests.suite());
+ return suite;
+ }
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocOutputChecker.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocOutputChecker.java
new file mode 100644
index 000000000..485b5d80b
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocOutputChecker.java
@@ -0,0 +1,305 @@
+/********************************************************************
+ * Copyright (c) 2005 Contributors. All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ * Helen Hawkins - iniital version
+ *******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.aspectj.util.LangUtil;
+
+/**
+ * Helper class to check whether the ajdoc contains the expected
+ * information.
+ */
+public class AjdocOutputChecker {
+
+ /**
+ * Checks whether the given html file contains the required String.
+ *
+ * @param htmlFile
+ * @param requiredString
+ * @return true if the file contains the given string or
+ * false otherwise (or if the file is null or not an html file)
+ * @throws Exception
+ */
+ public static boolean containsString(File htmlFile,
+ String requiredString) throws Exception {
+ if ((htmlFile == null) || !htmlFile.getAbsolutePath().endsWith("html")) {
+ return false;
+ }
+ BufferedReader reader = new BufferedReader(new FileReader(htmlFile));
+ String line = reader.readLine();
+ while (line != null) {
+ if (line.indexOf(requiredString) != -1) {
+ reader.close();
+ return true;
+ }
+ line = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+
+ /**
+ * Returns those strings from the given array which aren't in the html file.
+ *
+ * @param htmlFile
+ * @param an array of requiredStrings
+ * @return a List of those strings not found
+ * @throws Exception
+ */
+ public static List<String> getMissingStringsInFile(File htmlFile, String[] requiredStrings) throws Exception {
+ List<String> missingStrings = new ArrayList<String>();
+ for (int i = 0; i < requiredStrings.length; i++) {
+ String string = requiredStrings[i];
+ if (!containsString(htmlFile, string)) {
+ missingStrings.add(string);
+ }
+ }
+ return missingStrings;
+ }
+
+ /**
+ * Checks whether the section of the html file contains the
+ * required String
+ *
+ * @param htmlFile
+ * @param requiredString
+ * @param sectionHeader
+ * @return true if the file contains the given string within the
+ * required section or false otherwise (or if the file is null or
+ * not an html file)
+ * @throws Exception
+ */
+ public static boolean containsStringWithinSection(File htmlFile,
+ String requiredString, String sectionHeader) throws Exception {
+ if ((htmlFile == null) || !htmlFile.getAbsolutePath().endsWith("html")) {
+ return false;
+ }
+ BufferedReader reader = new BufferedReader(new FileReader(htmlFile));
+ String line = reader.readLine();
+ while (line != null) {
+ if (line.indexOf(sectionHeader) != -1) {
+ String nextLine = reader.readLine();
+ while (nextLine != null &&
+ (nextLine.indexOf("========") == -1)) {
+ if (nextLine.indexOf(requiredString) != -1) {
+ reader.close();
+ return true;
+ }
+ nextLine = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+ line = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+
+ /**
+ * Returns those strings from the given array which aren't in the
+ * ajdoc html file
+ *
+ * @param htmlFile
+ * @param an array of requiredStrings
+ * @param sectionHeader
+ * @return List of those requiredStrings not found
+ * @throws Exception
+ */
+ public static List /*String*/ getMissingStringsInSection(File htmlFile,
+ String[] requiredStrings, String sectionHeader) throws Exception {
+ List missingStrings = new ArrayList();
+ for (int i = 0; i < requiredStrings.length; i++) {
+ String string = requiredStrings[i];
+ if (!containsStringWithinSection(htmlFile,string,sectionHeader)) {
+ missingStrings.add(string);
+ }
+ }
+ return missingStrings;
+ }
+
+ /**
+ * Returns whether the class data section has the expected
+ * relationship and target i.e. have the relationships been
+ * applied to the type.
+ *
+ * @param the ajdoc html file
+ * @param the detail sectionHeader, for example "DECLARE DETAIL SUMMARY"
+ * @param the source of the relationship, for example "Point()"
+ * @param the relationship, for example HtmlDecorator.HtmlRelationshipKind.MATCHED_BY
+ * @param the expected target, for example "HREF=\"../foo/Main.html#doIt()\""
+ * @return true if the section contains the expected source/relationship/target,
+ * false otherwise
+ */
+ public static boolean classDataSectionContainsRel(File htmlFile,
+ HtmlDecorator.HtmlRelationshipKind relationship,
+ String target) throws Exception {
+ if (((htmlFile == null) || !htmlFile.getAbsolutePath().endsWith("html"))) {
+ return false;
+ }
+ BufferedReader reader = new BufferedReader(new FileReader(htmlFile));
+ String line = reader.readLine();
+ while (line != null) {
+ if (line.indexOf("START OF CLASS DATA") != -1) {
+ // found the required class data section
+ String subLine = reader.readLine();
+ while(subLine != null
+ && (subLine.indexOf("========") == -1)){
+ int relIndex = subLine.indexOf(relationship.toString());
+ int targetIndex = subLine.indexOf(target);
+ if ((relIndex != -1) && (targetIndex != -1)) {
+ reader.close();
+ if (relIndex < targetIndex) {
+ return true;
+ }
+ return false;
+ }
+ subLine = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+ line = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+
+ /**
+ * Returns whether the supplied source has the expected
+ * relationship and target within the given detail section
+ *
+ * @param the ajdoc html file
+ * @param the detail sectionHeader, for example "DECLARE DETAIL SUMMARY"
+ * @param the source of the relationship, for example "Point()"
+ * @param the relationship, for example HtmlDecorator.HtmlRelationshipKind.MATCHED_BY
+ * @param the expected target, for example "HREF=\"../foo/Main.html#doIt()\""
+ * @return true if the section contains the expected source/relationship/target,
+ * false otherwise
+ */
+ public static boolean detailSectionContainsRel(File htmlFile,
+ String sectionHeader, String source,
+ HtmlDecorator.HtmlRelationshipKind relationship,
+ String target) throws Exception {
+ if (((htmlFile == null) || !htmlFile.getAbsolutePath().endsWith("html"))) {
+ return false;
+ }
+ if (sectionHeader.indexOf("DETAIL") == -1) {
+ return false;
+ }
+ BufferedReader reader = new BufferedReader(new FileReader(htmlFile));
+ String line = reader.readLine();
+ while (line != null) {
+ if (line.indexOf(sectionHeader) != -1) {
+ // found the required main section
+ String nextLine = reader.readLine();
+ while (nextLine != null && (nextLine.indexOf("========") == -1)) {
+ // On JDK11 it looks like <a id="doIt()"> on earlier JDKs it can look like <a name="doit">
+ if ((LangUtil.is11VMOrGreater() && nextLine.indexOf("ID=\""+source+"\"") != -1 || nextLine.indexOf("id=\""+source+"\"") != -1) ||
+ nextLine.indexOf("NAME=\""+source+"\"") != -1 || nextLine.indexOf("name=\""+source+"\"") != -1) {
+ // found the required subsection
+ String subLine = reader.readLine();
+ while(subLine != null
+ && (subLine.indexOf("========") == -1)
+ && (subLine.indexOf("NAME") == -1 && subLine.indexOf("name") == -1)) {
+ int relIndex = subLine.indexOf(relationship.toString());
+ int targetIndex = subLine.indexOf(target);
+ if ((relIndex != -1) && (targetIndex != -1)) {
+ reader.close();
+ if (relIndex < targetIndex) {
+ return true;
+ }
+ return false;
+ }
+ subLine = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+ nextLine = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+ line = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+
+ /**
+ * Returns whether the supplied source has the expected
+ * relationship and target within the given summary section
+ *
+ * @param the ajdoc html file
+ * @param the detail sectionHeader, for example "DECLARE SUMMARY"
+ * @param the source of the relationship, for example "Point()"
+ * @param the relationship, for example HtmlDecorator.HtmlRelationshipKind.MATCHED_BY
+ * @param the expected target, for example "HREF=\"../foo/Main.html#doIt()\""
+ * @return true if the section contains the expected source/relationship/target,
+ * false otherwise
+ */
+ public static boolean summarySectionContainsRel(
+ File htmlFile,
+ String sectionHeader,
+ String source,
+ HtmlDecorator.HtmlRelationshipKind relationship,
+ String target) throws Exception {
+ if (((htmlFile == null) || !htmlFile.getAbsolutePath().endsWith("html"))) {
+ return false;
+ }
+ if (sectionHeader.indexOf("SUMMARY") == -1) {
+ return false;
+ }
+ BufferedReader reader = new BufferedReader(new FileReader(htmlFile));
+ String line = reader.readLine();
+ while (line != null) {
+ if (line.indexOf(sectionHeader) != -1) {
+ // found the required main section
+ String nextLine = reader.readLine();
+ while (nextLine != null && (nextLine.indexOf("========") == -1)) {
+ if (nextLine.indexOf(source) != -1) {
+ // found the required subsection
+ String subLine = nextLine;
+ while(subLine != null
+ && (subLine.indexOf("========") == -1)
+ && (subLine.indexOf("<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">") == -1)) {
+ int relIndex = subLine.indexOf(relationship.toString());
+ int targetIndex = subLine.indexOf(target);
+ if ((relIndex != -1) && (targetIndex != -1)) {
+ reader.close();
+ if (relIndex < targetIndex) {
+ return true;
+ }
+ return false;
+ }
+ subLine = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+ nextLine = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+ line = reader.readLine();
+ }
+ reader.close();
+ return false;
+ }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTestCase.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTestCase.java
new file mode 100644
index 000000000..e3674086e
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTestCase.java
@@ -0,0 +1,315 @@
+/********************************************************************
+ * Copyright (c) 2005 Contributors. All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ * Helen Hawkins - iniital version
+ *******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.aspectj.tools.ajc.Ajc;
+import org.aspectj.util.LangUtil;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
+/**
+ * This class is the super class of all Ajdoc tests. It creates a sandbox directory and provides utility methods for copying over
+ * the test projects and running the ajdoc command
+ */
+public class AjdocTestCase extends TestCase {
+
+ public final static String testdataSrcDir = "../ajdoc/testdata";
+ protected static File sandboxDir;
+ private String docOutdir, projectDir;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ docOutdir = null;
+ projectDir = null;
+ // Create a sandbox in which to work
+ sandboxDir = Ajc.createEmptySandbox();
+ // create the ajdocworkdingdir in the sandbox
+ Main.setOutputWorkingDir(getWorkingDir().getAbsolutePath());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ // reset where ajdocworkingdir is created
+ Main.resetOutputWorkingDir();
+ }
+
+ /**
+ * Fill in the working directory with the project files and create a doc top level directory in which to generate the ajdoc
+ * output.
+ */
+ public void initialiseProject(String projectName) {
+ File projectSrc = new File(testdataSrcDir + File.separatorChar + projectName);
+ File destination = new File(getWorkingDir(), projectName);
+ if (!destination.exists()) {
+ destination.mkdir();
+ }
+ copy(projectSrc, destination);
+ projectDir = destination.getAbsolutePath();
+
+ File docDestination = new File(getWorkingDir().toString() + File.separatorChar + projectName, "doc");
+ if (!docDestination.exists()) {
+ docDestination.mkdir();
+ }
+ docOutdir = docDestination.getAbsolutePath();
+ }
+
+ /**
+ * @return the working directory
+ */
+ protected File getWorkingDir() {
+ return sandboxDir;
+ }
+
+ /**
+ * @return the absolute path of the project directory for example c:\temp\ajcSandbox\ajcTest15200.tmp\myProject
+ */
+ protected String getAbsoluteProjectDir() {
+ return projectDir;
+ }
+
+ /**
+ * @return the absolute path of the doc output directory for example c:\temp\ajcSandbox\ajcTest15200.tmp\myProject\doc
+ */
+ protected String getAbsolutePathOutdir() {
+ return docOutdir;
+ }
+
+ /**
+ * Copy the contents of some directory to another location - the copy is recursive.
+ */
+ private void copy(File from, File to) {
+ String contents[] = from.list();
+ if (contents == null)
+ return;
+ for (int i = 0; i < contents.length; i++) {
+ String string = contents[i];
+ File f = new File(from, string);
+ File t = new File(to, string);
+
+ if (f.isDirectory()) {
+ t.mkdir();
+ copy(f, t);
+ } else if (f.isFile()) {
+ try {
+ org.aspectj.util.FileUtil.copyFile(f, t);
+ } catch (IOException e) {
+ throw new AssertionFailedError("Unable to copy " + f + " to " + t);
+ }
+ }
+ }
+ }
+
+ /**
+ * Run the ajdoc command with the given visibility argument, the default source level and the given input files.
+ */
+ public void runAjdoc(String visibility, File[] inputFiles) {
+ if (!visibility.equals("public") && !visibility.equals("protected") && !visibility.equals("private")) {
+ fail("need to pass 'public','protected' or 'private' visibility to ajdoc");
+ }
+ if (inputFiles.length == 0) {
+ fail("need to pass some files into ajdoc");
+ }
+ String[] args = new String[5 + inputFiles.length];
+ args[0] = "-" + visibility;
+ args[1] = "-classpath";
+ args[2] = AjdocTests.ASPECTJRT_PATH.getPath();
+ args[3] = "-d";
+ args[4] = getAbsolutePathOutdir();
+ for (int i = 0; i < inputFiles.length; i++) {
+ args[5 + i] = inputFiles[i].getAbsolutePath();
+ }
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+ /**
+ * Run the ajdoc command with the default visibility and source level and the given input files.
+ */
+ public void runAjdoc(File[] inputFiles) {
+ if (inputFiles.length == 0) {
+ fail("need to pass some files into ajdoc");
+ }
+ String[] args = new String[4 + inputFiles.length];
+ args[0] = "-classpath";
+ args[1] = AjdocTests.ASPECTJRT_PATH.getPath();
+ args[2] = "-d";
+ args[3] = getAbsolutePathOutdir();
+ for (int i = 0; i < inputFiles.length; i++) {
+ args[4 + i] = inputFiles[i].getAbsolutePath();
+ }
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+ /**
+ * Run the ajdoc command with the default visibility and source level, the given input files and the given aspectj options
+ */
+ public void runAjdoc(File[] inputFiles, String sourceLevel, String[] ajOptions) {
+ if (inputFiles.length == 0) {
+ fail("need to pass some files into ajdoc");
+ }
+ if (!sourceLevel.equals("1.3") &&
+ !sourceLevel.equals("1.4") &&
+ !sourceLevel.equals("1.5") &&
+ !sourceLevel.equals("1.6") &&
+ !sourceLevel.equals("1.7") &&
+ !sourceLevel.equals("1.8") &&
+ !sourceLevel.equals("1.9") &&
+ !sourceLevel.equals("10")) {
+ fail("need to pass ajdoc '1.3' > '1.9' as the source level");
+ }
+ String[] args = new String[6 + inputFiles.length + ajOptions.length];
+ args[0] = "-source";
+ args[1] = sourceLevel;
+ args[2] = "-classpath";
+ args[3] = AjdocTests.ASPECTJRT_PATH.getPath();
+ args[4] = "-d";
+ args[5] = getAbsolutePathOutdir();
+ for (int i = 0; i < ajOptions.length; i++) {
+ args[6 + i] = ajOptions[i];
+ }
+ for (int i = 0; i < inputFiles.length; i++) {
+ args[6 + i + ajOptions.length] = inputFiles[i].getAbsolutePath();
+ }
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+ /**
+ * Run the ajdoc command with the given visibility argument, the given source level argument and the given input files.
+ */
+ public void runAjdoc(String visibility, String sourceLevel, File[] inputFiles) {
+ if (!visibility.equals("public") && !visibility.equals("protected") && !visibility.equals("private")) {
+ fail("need to pass 'public','protected' or 'private' visibility to ajdoc");
+ }
+ if (!sourceLevel.equals("1.3") &&
+ !sourceLevel.equals("1.4") &&
+ !sourceLevel.equals("1.5") &&
+ !sourceLevel.equals("1.6") &&
+ !sourceLevel.equals("1.7") &&
+ !sourceLevel.equals("1.8") &&
+ !sourceLevel.equals("1.9") &&
+ !sourceLevel.startsWith("9") &&
+ !sourceLevel.startsWith("10")) {
+ fail("need to pass suitable version to ajdoc as the source level");
+ }
+ if (inputFiles.length == 0) {
+ fail("need to pass some files into ajdoc");
+ }
+ for (int i = 0; i < inputFiles.length; i++) {
+ if (!inputFiles[i].exists()) {
+ fail(inputFiles[i].getAbsolutePath() + " does not exist");
+ }
+ }
+
+ String[] args = new String[7 + inputFiles.length];
+ args[0] = "-" + visibility;
+ args[1] = "-source";
+ args[2] = sourceLevel;
+ args[3] = "-classpath";
+ StringBuilder classpath = new StringBuilder();
+ if (LangUtil.is19VMOrGreater()) {
+ classpath.append(LangUtil.getJrtFsFilePath()).append(File.pathSeparator);
+ }
+ classpath.append(AjdocTests.ASPECTJRT_PATH.getPath());
+ args[4] = classpath.toString();
+ args[5] = "-d";
+ args[6] = getAbsolutePathOutdir();
+ // args[7] = "-Xset:minimalModel=false";
+ for (int i = 0; i < inputFiles.length; i++) {
+ args[7 + i] = inputFiles[i].getAbsolutePath();
+ }
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+ /**
+ * Run the ajdoc command with the given visibility argument, the default source level and the given input directories.
+ */
+ public void runAjdoc(String visibility, String[] directoryNames) {
+ if (!visibility.equals("public") && !visibility.equals("protected") && !visibility.equals("private")) {
+ fail("need to pass 'public','protected' or 'private' visibility to ajdoc");
+ }
+ if (directoryNames.length == 0) {
+ fail("need to pass some directories into ajdoc");
+ }
+ String[] args = new String[7 + directoryNames.length];
+ args[0] = "-" + visibility;
+ args[1] = "-classpath";
+ args[2] = AjdocTests.ASPECTJRT_PATH.getPath();
+ args[3] = "-d";
+ args[4] = getAbsolutePathOutdir();
+ args[5] = "-sourcepath";
+ args[6] = getAbsoluteProjectDir();
+ for (int i = 0; i < directoryNames.length; i++) {
+ args[7 + i] = directoryNames[i];
+ }
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+ /**
+ * Run the ajdoc command with the default visibility and source level and the given input directories.
+ */
+ public void runAjdoc(String[] directoryNames) {
+ if (directoryNames.length == 0) {
+ fail("need to pass some directories into ajdoc");
+ }
+ String[] args = new String[6 + directoryNames.length];
+ args[0] = "-classpath";
+ args[1] = AjdocTests.ASPECTJRT_PATH.getPath();
+ args[2] = "-d";
+ args[3] = getAbsolutePathOutdir();
+ args[4] = "-sourcepath";
+ args[5] = getAbsoluteProjectDir();
+ for (int i = 0; i < directoryNames.length; i++) {
+ args[6 + i] = directoryNames[i];
+ }
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+ /**
+ * Run the ajdoc command with the given visibility argument, the default source level and the given input directories.
+ */
+ public void runAjdoc(String visibility, String lstFile) {
+ if (!visibility.equals("public") && !visibility.equals("protected") && !visibility.equals("private")) {
+ fail("need to pass 'public','protected' or 'private' visibility to ajdoc");
+ }
+
+ String[] args = new String[8];
+ args[0] = "-" + visibility;
+ args[1] = "-classpath";
+ args[2] = AjdocTests.ASPECTJRT_PATH.getPath();
+ args[3] = "-d";
+ args[4] = getAbsolutePathOutdir();
+ args[5] = "-sourcepath";
+ args[6] = getAbsoluteProjectDir();
+ args[7] = "@" + getAbsoluteProjectDir() + File.separatorChar + lstFile;
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+ /**
+ * Run the ajdoc command with the given options
+ */
+ public void runAjdoc(List options) {
+ String[] args = new String[options.size()];
+ int i = 0;
+ for (Iterator iter = options.iterator(); iter.hasNext();) {
+ String element = (String) iter.next();
+ args[i] = element;
+ i++;
+ }
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTests.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTests.java
new file mode 100644
index 000000000..6debbe13b
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/AjdocTests.java
@@ -0,0 +1,53 @@
+/* *******************************************************************
+ * Copyright (c) 2005 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wes Isberg initial implementation
+ * ******************************************************************/
+
+
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+
+import org.aspectj.util.FileUtil;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class AjdocTests extends TestCase {
+
+ public static File ASPECTJRT_PATH;
+
+ static {
+ String[] paths = { "sp:aspectjrt.path", "sp:aspectjrt.jar",
+ "../lib/test/aspectjrt.jar", "../aj-build/jars/aspectj5rt-all.jar",
+ "../aj-build/jars/runtime.jar",
+ "../runtime/bin"};
+ ASPECTJRT_PATH = FileUtil.getBestFile(paths);
+ }
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite(AjdocTests.class.getName());
+ //$JUnit-BEGIN$
+ suite.addTestSuite(DeclareFormsTest.class);
+ suite.addTestSuite(SpacewarTestCase.class);
+ suite.addTestSuite(PatternsTestCase.class);
+ suite.addTestSuite(CoverageTestCase.class);
+ suite.addTestSuite(ITDTest.class);
+ suite.addTestSuite(FullyQualifiedArgumentTest.class);
+ suite.addTestSuite(EnumTest.class);
+ suite.addTestSuite(PointcutVisibilityTest.class);
+ suite.addTestSuite(ExecutionTestCase.class);
+ suite.addTestSuite(BugTests.class);
+ //$JUnit-END$
+ return suite;
+ }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/BugTests.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/BugTests.java
new file mode 100644
index 000000000..163774864
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/BugTests.java
@@ -0,0 +1,185 @@
+/********************************************************************
+ * Copyright (c) 2006 Contributors. All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ * Helen Hawkins - initial version
+ *******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BugTests extends AjdocTestCase {
+
+ public void testPr160302() throws Exception {
+ initialiseProject("pr160302");
+ File[] files = {new File(getAbsoluteProjectDir() + "/C.java")};
+ runAjdoc(files);
+ assertFalse("expected clean build of project but found that build aborted",Main.hasAborted());
+ File html = new File(getAbsolutePathOutdir() + File.separator + "C.html");
+ if (!html.exists()) {
+ fail("couldn't find " + getAbsolutePathOutdir() + File.separator + "C.html - were there javadoc/compilation errors?");
+ }
+ assertFalse("expected all decorating tags to be removed but found that they" +
+ " weren't",AjdocOutputChecker.containsString(html, Config.DECL_ID_STRING));
+ }
+
+ /**
+ * Passing the "-Xlint:error" option through to the compiler should
+ * cause the ajc build to fail because the advice did not match
+ */
+ public void testPr148906_1() {
+ initialiseProject("pr148906");
+ File[] files = {new File(getAbsoluteProjectDir() + "/AdviceDidNotMatch.aj")};
+ String[] ajOptions = {new String("-Xlint:error")};
+ runAjdoc(files,"1.5",ajOptions);
+ assertTrue("expected ajc to fail but it did not", Main.hasAborted());
+ assertEquals("expected ajc to fail with an adviceDidNotMatch error but it" +
+ " failed instead with " + Main.getErrors()[0].getMessage(),
+ "advice defined in AdviceDidNotMatch has not been applied [Xlint:adviceDidNotMatch]",
+ Main.getErrors()[0].getMessage());
+ }
+
+ /**
+ * Passing the "-Xlintfile" option through to the compiler should
+ * cause the ajc build to fail because the advice did not match
+ */
+ public void testPr148906_2() {
+ initialiseProject("pr148906");
+ File[] files = {new File(getAbsoluteProjectDir() + "/AdviceDidNotMatch.aj")};
+ String[] ajOptions = {new String("-Xlintfile"), new String(getAbsoluteProjectDir() + File.separator + "Xlint.properties")};
+ runAjdoc(files,"1.5",ajOptions);
+ assertTrue("expected ajc to fail but it did not", Main.hasAborted());
+ assertEquals("expected ajc to fail with an adviceDidNotMatch error but it" +
+ " failed instead with " + Main.getErrors()[0].getMessage(),
+ "advice defined in AdviceDidNotMatch has not been applied [Xlint:adviceDidNotMatch]",
+ Main.getErrors()[0].getMessage());
+ }
+
+ /**
+ * Passing the -aspectpath option though to the compiler should
+ * result in relationships being displayed
+ */
+ public void testPr148906_3() throws Exception {
+ initialiseProject("pr148906");
+ File[] files = {new File(getAbsoluteProjectDir() + "/C.java")};
+ String[] ajOptions = {new String("-aspectpath"), new String(getAbsoluteProjectDir() + File.separator + "simple.jar")};
+ runAjdoc(files,"1.6",ajOptions);
+ assertFalse("expected clean build of project but found that build aborted",Main.hasAborted());
+ File html = new File(getAbsolutePathOutdir() + File.separator + "C.html");
+ if (!html.exists()) {
+ fail("couldn't find " + getAbsolutePathOutdir() + File.separator + "C.html - were there javadoc/compilation errors?");
+ }
+ assertTrue("expected to find 'Advised by' in the html output but did " +
+ " not",AjdocOutputChecker.containsString(html,
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY.getName()));
+ }
+
+ /**
+ * Passing an option starting with "-" that doesn't require a second entry
+ * should mean everything is correctly given to the compiler. For example:
+ * '-outxml -aspectpath <file>" should mean both '-outxml' and the aspectpath
+ * options are given correctly.
+ */
+ public void testPr148906_4() throws Exception {
+ initialiseProject("pr148906");
+ File[] files = {new File(getAbsoluteProjectDir() + "/C.java")};
+ String[] ajOptions = {new String("-outxml"),new String("-aspectpath"), new String(getAbsoluteProjectDir() + File.separator + "simple.jar")};
+ runAjdoc(files,"1.6",ajOptions);
+ assertFalse("expected clean build of project but found that build aborted",Main.hasAborted());
+ File html = new File(getAbsolutePathOutdir() + File.separator + "C.html");
+ if (!html.exists()) {
+ fail("couldn't find " + getAbsolutePathOutdir() + File.separator + "C.html - were there javadoc/compilation errors?");
+ }
+ assertTrue("expected to find 'Advised by' in the html output but did " +
+ " not",AjdocOutputChecker.containsString(html,
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY.getName()));
+ File aopFile = new File(getAbsolutePathOutdir() + File.separator
+ + "META-INF" + File.separator + "aop-ajc.xml");
+ assertTrue("couldn't find " + getAbsolutePathOutdir() + File.separator
+ + "META-INF" + File.separator + "aop-ajc.xml" ,
+ aopFile.exists());
+ }
+
+ /**
+ * Passing bogus option to ajc
+ */
+ public void testPr148906_5() throws Exception {
+ initialiseProject("pr148906");
+ File[] files = {new File(getAbsoluteProjectDir() + "/C.java")};
+ String[] ajOptions = {new String("-bogus")};
+ runAjdoc(files,"1.5",ajOptions);
+ assertTrue("expected build of project to abort",Main.hasAborted());
+ }
+
+ /**
+ * Not passing any files to ajdoc should result in both the ajdoc
+ * and ajc usage messages
+ */
+ public void testPr148906_6() throws Exception {
+ initialiseProject("pr148906");
+ List options = new ArrayList();
+ options.add("-verbose");
+ runAjdoc(options);
+ assertTrue("expected the ajdoc usage message to be reported",Main.hasShownAjdocUsageMessage());
+ assertTrue("expected build of project to abort",Main.hasAborted());
+ }
+
+ /**
+ * javadoc comments should still appear even if preceded by
+ * 'normal' comments
+ */
+ public void testPr164356() throws Exception {
+ initialiseProject("pr164356");
+ File[] files = {new File(getAbsoluteProjectDir() + "/C.java")};
+ runAjdoc(files);
+ File htmlFile = new File(getAbsolutePathOutdir() + "/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() +
+ " (ajc aborted: " + Main.hasAborted() + ")");
+ }
+ String foo = "description of foo";
+ String bar = "description of bar";
+ String goo = "description of goo";
+ String bas = "description of bas";
+ assertTrue("expected method description 'description of foo' to appear" +
+ " in ajdoc output but it did not",
+ AjdocOutputChecker.containsString(htmlFile, foo));
+ assertTrue("expected method description 'description of bar' to " +
+ "appear in ajdoc output but it did not",
+ AjdocOutputChecker.containsString(htmlFile, bar));
+ assertFalse("didn't expect method description 'description of goo' to " +
+ "appear in ajdoc output but it did not",
+ AjdocOutputChecker.containsString(htmlFile, goo));
+ assertTrue("expected method description 'description of bas' to appear" +
+ " in ajdoc output but it did not",
+ AjdocOutputChecker.containsString(htmlFile, bas));
+ }
+
+ /**
+ * Comments for a constructor should be included in the ajdoc output
+ */
+ public void testPr164340() throws Exception {
+ initialiseProject("pr164340");
+ File[] files = {new File(getAbsoluteProjectDir() + "/C.java")};
+ runAjdoc(files);
+ File htmlFile = new File(getAbsolutePathOutdir() + "/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() +
+ " (ajc aborted: " + Main.hasAborted() + ")");
+ }
+ String methodDesc = "This is method foo";
+ String constDesc = "This is a constructor";
+ assertTrue("expected method description 'This is method foo' to appear" +
+ " in ajdoc output but it did not",
+ AjdocOutputChecker.containsString(htmlFile, methodDesc));
+ assertTrue("expected constructor description 'This is a constructor' to " +
+ "appear in ajdoc output but it did not",
+ AjdocOutputChecker.containsString(htmlFile, constDesc));
+ }
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/CoverageTestCase.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/CoverageTestCase.java
new file mode 100644
index 000000000..e73b94dae
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/CoverageTestCase.java
@@ -0,0 +1,940 @@
+/* *******************************************************************
+ * Copyright (c) 2003 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+ package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+import java.util.List;
+
+import org.aspectj.util.LangUtil;
+
+/**
+ * A long way to go until full coverage, but this is the place to add more.
+ *
+ * @author Mik Kersten
+ */
+public class CoverageTestCase extends AjdocTestCase {
+
+ protected File file0,file1,aspect1,file2,file3,file4,file5,file6,file7,file8,file9,file10;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ initialiseProject("coverage");
+ createFiles();
+ }
+
+ public void testOptions() {
+ String[] args = {
+ "-private",
+ "-encoding",
+ "EUCJIS",
+ "-docencoding",
+ "EUCJIS",
+ "-charset",
+ "UTF-8",
+ "-classpath",
+ AjdocTests.ASPECTJRT_PATH.getPath(),
+ "-d",
+ getAbsolutePathOutdir(),
+ file0.getAbsolutePath(),
+ };
+ org.aspectj.tools.ajdoc.Main.main(args);
+ assertTrue(true);
+ }
+
+ /**
+ * Test the "-public" argument
+ */
+ public void testCoveragePublicMode() throws Exception {
+ File[] files = {file3,file9};
+ runAjdoc("public","9",files);
+
+ // have passed the "public" modifier as well as
+ // one public and one package visible class. There
+ // should only be ajdoc for the public class
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/PkgVisibleClass.html");
+ assertFalse("ajdoc for PkgVisibleClass shouldn't exist because passed" +
+ " the 'public' flag to ajdoc",htmlFile.exists());
+
+ htmlFile = new File(getAbsolutePathOutdir() + "/foo/PlainJava.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ // check there's no private fields within the file, that
+ // the file contains the getI() method but doesn't contain
+ // the private ClassBar, Bazz and Jazz classes.
+ String[] strings = { "private", "getI()","ClassBar", "Bazz", "Jazz"};
+ List missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
+ assertEquals("There should be 4 missing strings",4,missing.size());
+ assertTrue(htmlFile.getName() + " should not contain the private modifier",missing.contains("private"));
+ assertTrue(htmlFile.getName() + " should not contain the private ClassBar class",missing.contains("ClassBar"));
+ assertTrue(htmlFile.getName() + " should not contain the private Bazz class",missing.contains("Bazz"));
+ assertTrue(htmlFile.getName() + " should not contain the private Jazz class",missing.contains("Jazz"));
+ }
+
+ /**
+ * Test that the ajdoc for an aspect has the title "Aspect"
+ */
+ public void testAJdocHasAspectTitle() throws Exception {
+ File[] files = {new File(getAbsoluteProjectDir() + "/pkg/A.aj")};
+ runAjdoc("private","1.6",files);
+ File htmlFile = new File(getAbsolutePathOutdir() + "/pkg/A.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()+ " - were there compilation errors?");
+ }
+ assertTrue(htmlFile.getAbsolutePath() + " should have Aspect A as it's title",
+ AjdocOutputChecker.containsString(htmlFile,"Aspect A"));
+ }
+
+ /**
+ * Test that the ajdoc for a class has the title "Class"
+ */
+ public void testAJdocHasClassTitle() throws Exception {
+ File[] files = {new File(getAbsoluteProjectDir() + "/pkg/C.java")};
+ runAjdoc("private","1.6",files);
+ File htmlFile = new File(getAbsolutePathOutdir() + "/pkg/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()+ " - were there compilation errors?");
+ }
+ assertTrue(htmlFile.getAbsolutePath() + " should have Class C as it's title",
+ AjdocOutputChecker.containsString(htmlFile,"Class C"));
+
+ }
+
+ /**
+ * Test that the ajdoc for an inner aspect is entitled "Aspect" rather
+ * than "Class", but that the enclosing class is still "Class"
+ */
+ public void testInnerAspect() throws Exception {
+ File[] files = {file1, file2};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/ClassA.InnerAspect.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ // ensure that the file is entitled "Aspect ClassA.InnerAspect" rather
+ // than "Class ClassA.InnerAspect"
+
+ String[] strings = null;
+ if (LangUtil.is18VMOrGreater()) {
+ strings = new String[] {
+ "Aspect ClassA.InnerAspect",
+ "<pre>static aspect <span class=\"typeNameLabel\">ClassA.InnerAspect</span>",
+ "Class ClassA.InnerAspect",
+ "<pre>static class <span class=\"typeNameLabel\">ClassA.InnerAspect</span>"};
+ }
+ else {
+ strings = new String[] {
+ "Aspect ClassA.InnerAspect",
+ "<PRE>static aspect <B>ClassA.InnerAspect</B><DT>extends java.lang.Object</DL>",
+ "Class ClassA.InnerAspect",
+ "<PRE>static class <B>ClassA.InnerAspect</B><DT>extends java.lang.Object</DL>"};
+ }
+ List<String> missingStrings = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
+ StringBuilder buf = new StringBuilder();
+ for (String str:missingStrings) {
+ buf.append(str).append("\n");
+ }
+ buf.append("HTMLFILE=\n").append(htmlFile).append("\n");
+ assertEquals("There should be 2 missing strings:\n"+buf.toString(), 2, missingStrings.size());
+ assertTrue(htmlFile.getName() + " should not have Class as it's title",
+ missingStrings.contains("Class ClassA.InnerAspect"));
+ if (LangUtil.is18VMOrGreater()) {
+ assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+ missingStrings.contains("<pre>static class <span class=\"typeNameLabel\">ClassA.InnerAspect</span>"));
+ }
+ else {
+ assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+ missingStrings.contains("<PRE>static class <B>ClassA.InnerAspect</B><DT>extends java.lang.Object</DL>"));
+ }
+
+ // get the html file for the enclosing class
+ File htmlFileClass = new File(getAbsolutePathOutdir() + "/foo/ClassA.html");
+ if (!htmlFileClass.exists()) {
+ fail("couldn't find " + htmlFileClass.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ // ensure that the file is entitled "Class ClassA" and
+ // has not been changed to "Aspect ClassA"
+ String[] classStrings = null;
+
+ if (LangUtil.is18VMOrGreater()) {
+ classStrings = new String[] {
+ "Class ClassA</h2>",
+ "public abstract class <span class=\"typeNameLabel\">ClassA</span>",
+ "Aspect ClassA</H2>",
+ "public abstract aspect <span class=\"typeNameLabel\">ClassA</span>"};
+ }
+ else {
+ classStrings = new String[] {
+ "Class ClassA</H2>",
+ "public abstract class <B>ClassA</B><DT>extends java.lang.Object<DT>",
+ "Aspect ClassA</H2>",
+ "public abstract aspect <B>ClassA</B><DT>extends java.lang.Object<DT>"};
+ }
+ List classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
+ assertEquals("There should be 2 missing strings:\n"+classMissing,2,classMissing.size());
+ assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",classMissing.contains("Aspect ClassA</H2>"));
+ if (LangUtil.is18VMOrGreater()) {
+ assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+ classMissing.contains("public abstract aspect <span class=\"typeNameLabel\">ClassA</span>"));
+ }
+ else {
+ assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+ classMissing.contains("public abstract aspect <B>ClassA</B><DT>extends java.lang.Object<DT>"));
+ }
+ }
+
+ /**
+ * Test that all the different types of advice appear
+ * with the named pointcut in it's description
+ */
+ public void testAdviceNamingCoverage() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/AdviceNamingCoverage.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ "after(): named..",
+ "afterReturning(int,int): namedWithArgs..",
+ "afterThrowing(): named..",
+ "before(): named..",
+ "around(int): namedWithOneArg..",
+ "before(int):",
+ "before(int): named()..",
+ "before():"};
+ List missing = AjdocOutputChecker.getMissingStringsInSection(
+ htmlFile, strings,"ADVICE DETAIL SUMMARY");
+ assertTrue(htmlFile.getName() + " should contain all advice in the Advice Detail section",missing.isEmpty());
+ missing = AjdocOutputChecker.getMissingStringsInSection(
+ htmlFile,strings,"ADVICE SUMMARY");
+ assertTrue(htmlFile.getName() + " should contain all advice in the Advice Summary section",missing.isEmpty());
+ }
+
+ /**
+ * Test that all the advises relationships appear in the
+ * Advice Detail and Advice Summary sections and that
+ * the links are correct
+ */
+ public void testAdvisesRelationshipCoverage() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/AdvisesRelationshipCoverage.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ "before(): methodExecutionP..",
+ "HREF=\"../foo/Point.html#setX(int)\"",
+ "before(): constructorExecutionP..",
+ "HREF=\"../foo/Point.html#Point()\"",
+ "before(): callMethodP..",
+ "HREF=\"../foo/Point.html#changeX(int)\"",
+ "before(): callConstructorP..",
+ "HREF=\"../foo/Point.html#doIt()\"",
+ "before(): getP..",
+ "HREF=\"../foo/Point.html#getX()\"",
+ "before(): setP..",
+ "HREF=\"../foo/Point.html\"><tt>foo.Point</tt></A>, <A HREF=\"../foo/Point.html#Point()\"><tt>foo.Point.Point</tt></A>, <A HREF=\"../foo/Point.html#setX(int)\"",
+ "before(): initializationP..",
+ "HREF=\"../foo/Point.html#Point()\"",
+ "before(): staticinitializationP..",
+ "HREF=\"../foo/Point.html\"",
+ "before(): handlerP..",
+ "HREF=\"../foo/Point.html#doIt()\""
+ };
+
+ for (int i = 0; i < strings.length - 1; i = i+2) {
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"ADVICE DETAIL SUMMARY",strings[i],
+ HtmlDecorator.HtmlRelationshipKind.ADVISES,
+ strings[i+1]);
+ assertTrue(strings[i] + " should advise " + strings[i+1] +
+ " in the Advice Detail section", b);
+ }
+
+ for (int i = 0; i < strings.length - 1; i = i+2) {
+ boolean b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"ADVICE SUMMARY",strings[i],
+ HtmlDecorator.HtmlRelationshipKind.ADVISES,
+ strings[i+1]);
+ assertTrue(strings[i] + " should advise " + strings[i+1] +
+ " in the Advice Summary section", b);
+ }
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a method execution pointcut
+ */
+ public void testAdvisedByMethodExecution() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ toName("setX(int)"),
+ "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): methodExecutionP..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Detail should have " + strings[0]+" advised by " + strings[1],b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Summary should have " + strings[0]+" advised by " + strings[1],b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a constructor execution pointcut
+ */
+ public void testAdvisedByConstructorExecution() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ LangUtil.is11VMOrGreater()?"&lt;init&gt;()":toName("Point()"),
+ "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): constructorExecutionP..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== CONSTRUCTOR DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Constructor Detail should have " + strings[0]+" advised by " + strings[1],b);
+
+ // Pre-JDK 11:
+ // This precedes the line containing strings[1]
+ // <td class="colOne"><code><span class="memberNameLink"><a href="../foo/Point.html#Point--">Point</a></span>()</code>
+ // On JDK 11:
+ // This precedes the line containing strings[1]
+ // <th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E()">Point</a></span>()</code></th>
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== CONSTRUCTOR SUMMARY",
+ LangUtil.is11VMOrGreater()?"#%3Cinit%3E()":toName("Point()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Constructor Summary should have " + strings[0]+" advised by " + strings[1],b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a method call pointcut
+ */
+ public void testAdvisedByMethodCall() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ toName("changeX(int)"),
+ "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): callMethodP..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Detail should have " + strings[0]+" advised by " + strings[1],b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Summary should have " + strings[0]+" advised by " + strings[1],b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a constructor call pointcut
+ */
+ public void testAdvisedByConstructorCall() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ toName("doIt()"),
+ "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): callConstructorP..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Detail should have " + strings[0]+" advised by " + strings[1],b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Summary should have " + strings[0]+" advised by " + strings[1],b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a get pointcut
+ */
+ public void testAdvisedByGet() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ toName("getX()"),
+ "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): getP..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Detail should have " + strings[0]+" advised by " + strings[1],b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Summary should have " + strings[0]+" advised by " + strings[1],b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a set pointcut
+ */
+ public void testAdvisedBySet() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String href = "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): setP..\"";
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName("setX(int)"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ href);
+ assertTrue("the Method Detail should have setX(int) advised by " + href,b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName("setX(int)"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ href);
+ assertTrue("the Method Summary should have setX(int) advised by " + href,b);
+
+ b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== CONSTRUCTOR DETAIL",
+ LangUtil.is11VMOrGreater()?"&lt;init&gt;()":toName("Point()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ href);
+ assertTrue("the Constructor Detail should have advised by " + href,b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== CONSTRUCTOR SUMMARY",
+ LangUtil.is11VMOrGreater()?"#%3Cinit%3E()":toName("Point()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ href);
+ assertTrue("the Constructor Summary should have advised by " + href,b);
+
+ b = AjdocOutputChecker.classDataSectionContainsRel(
+ htmlFile,
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ href);
+ assertTrue("The class data section should have 'advised by " + href + "'",b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with an initialization pointcut
+ */
+ public void testAdvisedByInitialization() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ LangUtil.is11VMOrGreater()?"&lt;init&gt;()":toName("Point()"),
+ "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): initializationP..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,
+ "=== CONSTRUCTOR DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Detail should have 'setX(int) advised by ... before()'",b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,
+ "=== CONSTRUCTOR SUMMARY",
+ LangUtil.is11VMOrGreater()?"#%3Cinit%3E()":strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Summary should have 'setX(int) advised by ... before()'",b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a staticinitialization pointcut
+ */
+ public void testAdvisedByStaticInitialization() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String href = "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): staticinitializationP..\"";
+ boolean b = AjdocOutputChecker.classDataSectionContainsRel(
+ htmlFile,
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ href);
+ assertTrue("The class data section should have 'advised by " + href + "'",b);
+ }
+
+ /**
+ * Test that the advised by relationship appears in the ajdoc when the
+ * advice is associated with a handler pointcut
+ */
+ public void testAdvisedByHandler() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ toName("doIt()"),
+ "HREF=\"../foo/AdvisesRelationshipCoverage.html#before(): handlerP..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Detail should have " + strings[0]+" advised by " + strings[1],b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Summary should have " + strings[0]+" advised by " + strings[1],b);
+ }
+
+ private String toName(String name) {
+ if (LangUtil.is18VMOrGreater() && !LangUtil.is11VMOrGreater()) {
+ name = name.replace('(','-');
+ name = name.replace(')','-');
+ }
+ return name;
+ }
+ /**
+ * Test that if have two before advice blocks from the same
+ * aspect affect the same method, then both appear in the ajdoc
+ */
+ public void testTwoBeforeAdvice() throws Exception {
+ File[] files = {new File(getAbsoluteProjectDir() + "/pkg/A2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/pkg/C2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ toName("amethod()"),
+ "HREF=\"../pkg/A2.html#before(): p..\"",
+ "HREF=\"../pkg/A2.html#before(): p2..\""};
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Detail should have " + strings[0]+" advised by " + strings[1],b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[1]);
+ assertTrue("the Method Summary should have " + strings[0]+" advised by " + strings[1],b);
+
+ b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[2]);
+ assertTrue("the Method Detail should have " + strings[0]+" advised by " + strings[2],b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ strings[0],
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ strings[2]);
+ assertTrue("the Method Summary should have " + strings[0]+" advised by " + strings[2],b);
+ }
+
+ /**
+ * Test that there are no spurious "advised by" entries
+ * against the aspect in the ajdoc
+ */
+ public void testNoSpuriousAdvisedByRels() throws Exception {
+ File[] files = {file4};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/AdvisesRelationshipCoverage.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ String href = "foo.Point.setX(int)";
+ boolean b = AjdocOutputChecker.classDataSectionContainsRel(
+ htmlFile,
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ href);
+ assertFalse("The class data section should not have 'advised by " + href + "'",b);
+
+ }
+
+ public void testCoverage() {
+ File[] files = {aspect1,file0,file1,file2,file3,file4,file5,file6,
+ file7,file8,file9,file10};
+ runAjdoc("private","1.6",files);
+ }
+
+ /**
+ * Test that nested aspects appear with "aspect" in their title
+ * when the ajdoc file is written slightly differently (when it's
+ * written for this apsect, it's different than for testInnerAspect())
+ */
+ public void testNestedAspect() throws Exception {
+ File[] files = {file9};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/PkgVisibleClass.NestedAspect.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ // ensure that the file is entitled "Aspect PkgVisibleClass.NestedAspect" rather
+ // than "Class PkgVisibleClass.NestedAspect"
+ String[] strings = null;
+ if (LangUtil.is18VMOrGreater()) {
+ strings = new String[] {
+ "Aspect PkgVisibleClass.NestedAspect",
+ "<pre>static aspect <span class=\"typeNameLabel\">PkgVisibleClass.NestedAspect</span>",
+ "Class PkgVisibleClass.NestedAspect",
+ "<pre>static class <span class=\"typeNameLabel\">PkgVisibleClass.NestedAspect</span>"};
+ }
+ else {
+ strings = new String[] {
+ "Aspect PkgVisibleClass.NestedAspect",
+ "<PRE>static aspect <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>",
+ "Class PkgVisibleClass.NestedAspect",
+ "<PRE>static class <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>"};
+ }
+ List<String> missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
+ assertEquals("There should be 2 missing strings",2,missing.size());
+ assertTrue(htmlFile.getName() + " should not have Class as it's title",missing.contains("Class PkgVisibleClass.NestedAspect"));
+ if (LangUtil.is18VMOrGreater()) {
+ assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+ missing.contains("<pre>static class <span class=\"typeNameLabel\">PkgVisibleClass.NestedAspect</span>"));
+ }
+ else {
+ assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+ missing.contains("<PRE>static class <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>"));
+ }
+ // get the html file for the enclosing class
+ File htmlFileClass = new File(getAbsolutePathOutdir() + "/PkgVisibleClass.html");
+ if (!htmlFileClass.exists()) {
+ fail("couldn't find " + htmlFileClass.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ // ensure that the file is entitled "Class PkgVisibleClass" and
+ // has not been changed to "Aspect PkgVisibleClass"
+ String[] classStrings = null;
+ if (LangUtil.is18VMOrGreater()) {
+ classStrings = new String[] {
+ "Class PkgVisibleClass</h2>",
+ "<pre>class <span class=\"typeNameLabel\">PkgVisibleClass</span>",
+ "Aspect PkgVisibleClass</h2>",
+ "<pre>aspect <span class=\"typeNameLabel\">PkgVisibleClass</span>"};
+ }
+ else {
+ classStrings = new String[] {
+ "Class PkgVisibleClass</H2>",
+ "class <B>PkgVisibleClass</B><DT>extends java.lang.Object</DL>",
+ "Aspect PkgVisibleClass</H2>",
+ "aspect <B>PkgVisibleClass</B><DT>extends java.lang.Object<DT>"};
+ }
+ List<String> classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
+ assertEquals("There should be 2 missing strings",2,classMissing.size());
+ if (LangUtil.is18VMOrGreater()) {
+ assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",
+ classMissing.contains("Aspect PkgVisibleClass</h2>"));
+ assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+ classMissing.contains("<pre>aspect <span class=\"typeNameLabel\">PkgVisibleClass</span>"));
+ }
+ else {
+ assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",classMissing.contains("Aspect PkgVisibleClass</H2>"));
+ assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",classMissing.contains("aspect <B>PkgVisibleClass</B><DT>extends java.lang.Object<DT>"));
+ }
+ }
+
+ /**
+ * Test that in the case when you have a nested aspect whose
+ * name is part of the enclosing class, for example a class called
+ * ClassWithNestedAspect has nested aspect called NestedAspect,
+ * that the titles for the ajdoc are correct.
+ */
+ public void testNestedAspectWithSimilarName() throws Exception {
+ File[] files = {new File(getAbsoluteProjectDir() + "/pkg/ClassWithNestedAspect.java")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/pkg/ClassWithNestedAspect.NestedAspect.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+ // ensure that the file is entitled "Aspect ClassWithNestedAspect.NestedAspect"
+ // rather than "Class ClassWithNestedAspect.NestedAspect"
+ String[] strings = null;
+ if (LangUtil.is18VMOrGreater()) {
+ strings = new String [] {
+ "Aspect ClassWithNestedAspect.NestedAspect",
+ "<pre>static aspect <span class=\"typeNameLabel\">ClassWithNestedAspect.NestedAspect</span>",
+ "Class ClassWithNestedAspect.NestedAspect",
+ "<pre>static class <span class=\"typeNameLabel\">ClassWithNestedAspect.NestedAspect</span>"};
+ }
+ else {
+ strings = new String [] {
+ "Aspect ClassWithNestedAspect.NestedAspect",
+ "<PRE>static a;spect <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>",
+ "Class ClassWithNestedAspect.NestedAspect",
+ "<PRE>static class <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>"};
+ }
+ List<String> missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
+ assertEquals("There should be 2 missing strings",2,missing.size());
+ assertTrue(htmlFile.getName() + " should not have Class as it's title",missing.contains("Class ClassWithNestedAspect.NestedAspect"));
+ if (LangUtil.is18VMOrGreater()) {
+ assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+ missing.contains("<pre>static class <span class=\"typeNameLabel\">ClassWithNestedAspect.NestedAspect</span>"));
+ }
+ else {
+ assertTrue(htmlFile.getName() + " should not have class in its subtitle",missing.contains("<PRE>static class <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>"));
+ }
+
+ // get the html file for the enclosing class
+ File htmlFileClass = new File(getAbsolutePathOutdir() + "/pkg/ClassWithNestedAspect.html");
+ if (htmlFileClass == null || !htmlFileClass.exists()) {
+ fail("couldn't find " + htmlFileClass.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ // ensure that the file is entitled "Class ClassWithNestedAspect" and
+ // has not been changed to "Aspect ClassWithNestedAspect"
+ String[] classStrings = null;
+ if (LangUtil.is18VMOrGreater()) {
+ classStrings = new String[] {
+ "Class ClassWithNestedAspect</h2>",
+ "public class <span class=\"typeNameLabel\">ClassWithNestedAspect</span>",
+ "Aspect ClassWithNestedAspect</h2>",
+ "public aspect <span class=\"typeNameLabel\">ClassWithNestedAspect</span>"};
+ }
+ else {
+ classStrings = new String[] {
+ "Class ClassWithNestedAspect</H2>",
+ "public class <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>",
+ "Aspect ClassWithNestedAspect</H2>",
+ "public aspect <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>"};
+ }
+ List<String> classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
+ assertEquals("There should be 2 missing strings",2,classMissing.size());
+ if (LangUtil.is18VMOrGreater()) {
+ assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",
+ classMissing.contains("Aspect ClassWithNestedAspect</h2>"));
+ assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+ classMissing.contains("public aspect <span class=\"typeNameLabel\">ClassWithNestedAspect</span>"));
+ }
+ else {
+ assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",
+ classMissing.contains("Aspect ClassWithNestedAspect</H2>"));
+ assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+ classMissing.contains("public aspect <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>"));
+ }
+ }
+
+ /**
+ * Test that everythings being decorated correctly within the ajdoc
+ * for the aspect when the aspect is a nested aspect
+ */
+ public void testAdviceInNestedAspect() throws Exception {
+ File[] files = {new File(getAbsoluteProjectDir() + "/pkg/ClassWithNestedAspect.java")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/pkg/ClassWithNestedAspect.NestedAspect.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"ADVICE DETAIL SUMMARY",
+ "before(): p..",
+ HtmlDecorator.HtmlRelationshipKind.ADVISES,
+ "HREF=\"../pkg/ClassWithNestedAspect.html#amethod()\"");
+ assertTrue("Should have 'before(): p.. advises HREF=\"../pkg/ClassWithNestedAspect.html#amethod()\"" +
+ "' in the Advice Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"ADVICE SUMMARY",
+ "before(): p..",
+ HtmlDecorator.HtmlRelationshipKind.ADVISES,
+ "HREF=\"../pkg/ClassWithNestedAspect.html#amethod()\"");
+ assertTrue("Should have 'before(): p.. advises HREF=\"../pkg/ClassWithNestedAspect.html#amethod()\"" +
+ "' in the Advice Summary section", b);
+
+ }
+
+ /**
+ * Test that everythings being decorated correctly within the ajdoc
+ * for the advised class when the aspect is a nested aspect
+ */
+ public void testAdvisedByInNestedAspect() throws Exception {
+ File[] files = {new File(getAbsoluteProjectDir() + "/pkg/ClassWithNestedAspect.java")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/pkg/ClassWithNestedAspect.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.containsString(htmlFile,"POINTCUT SUMMARY ");
+ assertFalse(htmlFile.getName() + " should not contain a pointcut summary section",b);
+ b = AjdocOutputChecker.containsString(htmlFile,"ADVICE SUMMARY ");
+ assertFalse(htmlFile.getName() + " should not contain an adivce summary section",b);
+ b = AjdocOutputChecker.containsString(htmlFile,"POINTCUT DETAIL ");
+ assertFalse(htmlFile.getName() + " should not contain a pointcut detail section",b);
+ b = AjdocOutputChecker.containsString(htmlFile,"ADVICE DETAIL ");
+ assertFalse(htmlFile.getName() + " should not contain an advice detail section",b);
+
+ b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ "HREF=\"../pkg/ClassWithNestedAspect.NestedAspect.html#before(): p..\"");
+ assertTrue("Should have 'amethod() advised by " +
+ "HREF=\"../pkg/ClassWithNestedAspect.NestedAspect.html#before(): p..\"" +
+ "' in the Method Detail section", b);
+
+ b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ "pkg.ClassWithNestedAspect.NestedAspect.NestedAspect.before(): p..");
+ assertFalse("Should not have the label " +
+ "pkg.ClassWithNestedAspect.NestedAspect.NestedAspect.before(): p.." +
+ " in the Method Detail section", b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ "HREF=\"../pkg/ClassWithNestedAspect.NestedAspect.html#before(): p..\"");
+ assertTrue("Should have 'amethod() advised by " +
+ "HREF=\"../pkg/ClassWithNestedAspect.NestedAspect.html#before(): p..\"" +
+ "' in the Method Summary section", b);
+
+ b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ "pkg.ClassWithNestedAspect.NestedAspect.NestedAspect.before(): p..");
+ assertFalse("Should not have the label " +
+ "pkg.ClassWithNestedAspect.NestedAspect.NestedAspect.before(): p.." +
+ " in the Method Summary section", b);
+
+ }
+
+ private void createFiles() {
+ file0 = new File(getAbsoluteProjectDir() + "/InDefaultPackage.java");
+ file1 = new File(getAbsoluteProjectDir() + "/foo/ClassA.java");
+ aspect1 = new File(getAbsoluteProjectDir() + "/foo/UseThisAspectForLinkCheck.aj");
+ file2 = new File(getAbsoluteProjectDir() + "/foo/InterfaceI.java");
+ file3 = new File(getAbsoluteProjectDir() + "/foo/PlainJava.java");
+ file4 = new File(getAbsoluteProjectDir() + "/foo/ModelCoverage.java");
+ file5 = new File(getAbsoluteProjectDir() + "/fluffy/Fluffy.java");
+ file6 = new File(getAbsoluteProjectDir() + "/fluffy/bunny/Bunny.java");
+ file7 = new File(getAbsoluteProjectDir() + "/fluffy/bunny/rocks/Rocks.java");
+ file8 = new File(getAbsoluteProjectDir() + "/fluffy/bunny/rocks/UseThisAspectForLinkCheckToo.java");
+ file9 = new File(getAbsoluteProjectDir() + "/foo/PkgVisibleClass.java");
+ file10 = new File(getAbsoluteProjectDir() + "/foo/NoMembers.java");
+ }
+
+// public void testPlainJava() {
+// String[] args = { "-d",
+// getAbsolutePathOutdir(),
+// file3.getAbsolutePath() };
+// org.aspectj.tools.ajdoc.Main.main(args);
+// }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/DeclareFormsTest.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/DeclareFormsTest.java
new file mode 100644
index 000000000..8dc4c24fe
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/DeclareFormsTest.java
@@ -0,0 +1,569 @@
+/* *******************************************************************
+ * Copyright (c) 2003 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+import java.util.List;
+
+import org.aspectj.util.LangUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class DeclareFormsTest extends AjdocTestCase {
+
+ private String declareError = "declare error: quot;Illegal construct..quot";
+ private String declareWarningQuotes = "declare warning: quot;Illegal call.quot;";
+ private String declareWarning = "declare warning: \"Illegal call.\"";
+ private String declareParentsImpl = "declare parents: implements Serializable";
+ private String declareSoft = "declare soft: foo.SizeException2";
+ private String declarePrecedence = "declare precedence: foo.DeclareCoverage2, foo.InterTypeDecCoverage2";
+
+ private String doItHref = "HREF=\"../foo/Main2.html#doIt()\"";
+ private String pointHref = "HREF=\"../foo/Point2.html\"";
+ private String cHref = "HREF=\"../foo/C.html\"";
+
+ private String doIt = "doIt()";
+
+
+ public void testCoverage() {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage.java")};
+ runAjdoc("private","1.6",files);
+ }
+
+ /**
+ * Test that the declare statements appear in the Declare Detail
+ * and Declare Summary sections of the ajdoc
+ */
+ public void testDeclareStatments() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/DeclareCoverage2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+ // check the contents of the declare detail summary
+ String[] strings = {
+ declareError,
+ declareWarning,
+ declareParentsImpl,
+ declareSoft,
+ declarePrecedence};
+
+ List missing = AjdocOutputChecker.getMissingStringsInSection(
+ htmlFile,strings,"DECLARE DETAIL SUMMARY");
+ assertTrue(htmlFile.getName() + " should contain all declare statements in " +
+ "the Declare Detail section",missing.isEmpty());
+
+ // check the contents of the declare summary - should contain
+ // the same strings
+ missing = AjdocOutputChecker.getMissingStringsInSection(
+ htmlFile,strings,"DECLARE SUMMARY");
+ assertTrue(htmlFile.getName() + " should contain all declare statements in " +
+ "the Declare Summary section",missing.isEmpty());
+ }
+
+ /**
+ * Declare warning's should have the 'matched by' relationship
+ * in the ajdoc for the declaring aspect
+ */
+ public void testDeclareWarning() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/DeclareCoverage2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"DECLARE DETAIL SUMMARY",
+ declareWarningQuotes,
+ HtmlDecorator.HtmlRelationshipKind.MATCHED_BY,
+ doItHref);
+ assertTrue("Should have '" + declareWarningQuotes + " matched by " + doItHref +
+ "' in the Declare Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"DECLARE SUMMARY",
+ declareWarningQuotes,
+ HtmlDecorator.HtmlRelationshipKind.MATCHED_BY,
+ doItHref);
+ assertTrue("Should have '" + declareWarningQuotes + " matched by " + doItHref +
+ "' in the Declare Summary section", b);
+ }
+
+ /**
+ * The target of a declare warning should have the 'matches
+ * declare' relationship in the ajdoc - test the case when
+ * the declare warning matches a call join point
+ */
+ public void testMatchesDeclareCall() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Main2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName(doIt),
+ HtmlDecorator.HtmlRelationshipKind.MATCHES_DECLARE,
+ declareWarningQuotes);
+ assertTrue("Should have '" + doIt + " matches declare " +
+ declareWarningQuotes + "' in the Declare Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName(doIt),
+ HtmlDecorator.HtmlRelationshipKind.MATCHES_DECLARE,
+ declareWarningQuotes);
+ assertTrue("Should have '" + doIt + " matches declare " +
+ declareWarningQuotes + "' in the Declare Summary section", b);
+ }
+
+ /**
+ * The target of a declare warning should have the 'matches
+ * declare' relationship in the ajdoc - test the case when
+ * the declare warning matches an execution join point
+ */
+ public void testMatchesDeclareExecution() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName("setX(int)"),
+// LangUtil.is18VMOrGreater()?"setX-int-":"setX(int)",
+ HtmlDecorator.HtmlRelationshipKind.MATCHES_DECLARE,
+ "declare warning: quot;blahquot;");
+ assertTrue("Should have 'setX(int) matches declare declare warning: quot;blahquot;" +
+ "' in the Method Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName("setX(int)"),
+// LangUtil.is18VMOrGreater()?"setX-int-":"setX(int)",
+ HtmlDecorator.HtmlRelationshipKind.MATCHES_DECLARE,
+ "declare warning: quot;blahquot;");
+ assertTrue("Should have 'setX(int) matches declare declare warning: quot;blahquot;" +
+ "' in the Method Summary section", b);
+ }
+
+ /**
+ * Declare parents's should have the 'declared on' relationship
+ * in the ajdoc for the declaring aspect
+ */
+ public void testDeclareParents() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/DeclareCoverage2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"DECLARE DETAIL SUMMARY",
+ declareParentsImpl,
+ HtmlDecorator.HtmlRelationshipKind.DECLARED_ON,
+ pointHref);
+ assertTrue("Should have ' " + declareParentsImpl + " declared on " +
+ pointHref + "' in the Declare Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"DECLARE SUMMARY",
+ declareParentsImpl,
+ HtmlDecorator.HtmlRelationshipKind.DECLARED_ON,
+ pointHref);
+ assertTrue("Should have ' " + declareParentsImpl + " declared on " +
+ pointHref + "' in the Declare Summary section", b);
+ }
+
+ /**
+ * The target of a declare parent should have the 'aspect
+ * declarations' relationship in the ajdoc
+ */
+ public void testAspectDeclarations() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Point2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+ boolean b = AjdocOutputChecker.classDataSectionContainsRel(
+ htmlFile,
+ HtmlDecorator.HtmlRelationshipKind.ASPECT_DECLARATIONS,
+ "declare parents: implements Serializable");
+ assertTrue("The class data section should have 'aspect declarations" +
+ " declare parents: implements Serializable'",b);
+
+ }
+
+ /**
+ * Declare soft's should have the 'softens' relationship
+ * in the ajdoc for the declaring aspect
+ */
+ public void testDeclareSoft() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/DeclareCoverage2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"DECLARE DETAIL SUMMARY",
+ declareSoft,
+ HtmlDecorator.HtmlRelationshipKind.SOFTENS,
+ doItHref);
+ assertTrue("Should have '" + declareSoft + " softens " + doItHref +
+ "' in the Declare Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"DECLARE SUMMARY",
+ declareSoft,
+ HtmlDecorator.HtmlRelationshipKind.SOFTENS,
+ doItHref);
+ assertTrue("Should have '" + declareSoft + " softens " + doItHref +
+ "' in the Declare Summary section", b);
+ }
+
+ /**
+ * The target of a declare soft should have the 'softened
+ * by' relationship in the ajdoc
+ */
+ public void testSoftenedBy() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareCoverage2.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Main2.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName(doIt),
+ HtmlDecorator.HtmlRelationshipKind.SOFTENED_BY,
+ declareSoft);
+ assertTrue("Should have '" + doIt + " softened by " + declareSoft +
+ "' in the Method Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName(doIt),
+ HtmlDecorator.HtmlRelationshipKind.SOFTENED_BY,
+ declareSoft);
+ assertTrue("Should have '" + doIt + " softened by " + declareSoft +
+ "' in the Method Summary section", b);
+ }
+
+ private String toName(String name) {
+ if (LangUtil.is18VMOrGreater() && !LangUtil.is11VMOrGreater()) {
+ name = name.replace('(','-');
+ name = name.replace(')','-');
+ }
+ return name;
+ }
+
+ /**
+ * Declare annotation should have the 'annotates' relationship
+ * in the ajdoc for the declaring aspect
+ */
+ public void testDeclareAnnotation() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareAtType.aj")};
+ runAjdoc("private","1.6",files);
+
+ // Aspect AnnotationTest should contain within it's declare
+ // detail and summary the declare annotation statement.
+ // Check for this....
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/DeclareAtType.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ // check there's no return type for the declare annotation
+ // statement in the declare summary section
+ String[] returnType = {"[]"};
+ List missing = AjdocOutputChecker.getMissingStringsInSection(
+ htmlFile,returnType,"DECLARE SUMMARY");
+ assertEquals("there should be no return type for declare annotation" +
+ " in the ajdoc",1,missing.size());
+ assertEquals("there shouldn't be the '[]' return type for declare annotation" +
+ " in the ajdoc","[]",missing.get(0));
+
+ // check that the 'annotates' relationship is there
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"DECLARE DETAIL SUMMARY",
+ "declare @type: foo.C : @MyAnnotation",
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATES,
+ cHref);
+ assertTrue("Should have 'declare @type: foo.C : @MyAnnotation annotates "
+ + cHref + "' in the Declare Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"DECLARE SUMMARY",
+ "declare @type: foo.C : @MyAnnotation",
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATES,
+ cHref);
+ assertTrue("Should have 'declare @type: foo.C : @MyAnnotation annotates "
+ + cHref + "' in the Declare Summary section", b);
+ }
+
+ /**
+ * The target of a declare method annotation should have the
+ * 'annotated by' relationship in the ajdoc within the method
+ * information
+ */
+ public void testMethodAnnotatedBy() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareAtMethod.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATED_BY,
+ "declare @method: public * foo.C.*(..) : @MyAnnotation");
+ assertTrue("Should have 'amethod() annotated by " +
+ "declare @method: public * foo.C.*(..) : @MyAnnotation" +
+ "' in the Method Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATED_BY,
+ "declare @method: public * foo.C.*(..) : @MyAnnotation");
+ assertTrue("Should have 'amethod() annotated by " +
+ "declare @method: public * foo.C.*(..) : @MyAnnotation" +
+ "' in the Method Summary section", b);
+ }
+
+ /**
+ * The target of a declare method annotation should have the
+ * 'annotated by' relationship in the ajdoc within the method
+ * information
+ */
+ public void testConstructorAnnotatedBy() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareAtConstructor.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== CONSTRUCTOR DETAIL",
+ LangUtil.is11VMOrGreater()?"&lt;init&gt;(java.lang.String)":toName("C(java.lang.String)"),
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATED_BY,
+ "declare @constructor: foo.C.new(..) : @MyAnnotation");
+ assertTrue("Should have '" + doIt + " annotated by " +
+ "declare @constructor: foo.C.new(..) : @MyAnnotation" +
+ "' in the Method Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== CONSTRUCTOR SUMMARY",
+ LangUtil.is11VMOrGreater()?"#%3Cinit%3E(java.lang.String)":toName("C(java.lang.String)"),
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATED_BY,
+ "declare @constructor: foo.C.new(..) : @MyAnnotation");
+ assertTrue("Should have '" + doIt + " annotated by " +
+ "declare @constructor: foo.C.new(..) : @MyAnnotation" +
+ "' in the Method Summary section", b);
+ }
+
+ /**
+ * The target of a declare method annotation should have the
+ * 'annotated by' relationship in the ajdoc within the method
+ * information
+ */
+ public void testFieldAnnotatedBy() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareAtField.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== FIELD DETAIL",
+ "x",
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATED_BY,
+ "declare @field: int foo.C.* : @MyAnnotation");
+ assertTrue("Should have '" + doIt + " annotated by " +
+ "declare @field: int foo.C.* : @MyAnnotation" +
+ "' in the Field Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== FIELD SUMMARY",
+ "x",
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATED_BY,
+ "declare @field: int foo.C.* : @MyAnnotation");
+ assertTrue("Should have '" + doIt + " annotated by " +
+ "declare @field: int foo.C.* : @MyAnnotation" +
+ "' in the Field Summary section", b);
+ }
+
+ /**
+ * The target of a declare method annotation should have the
+ * 'annotated by' relationship in the ajdoc within the method
+ * information
+ */
+ public void testTypeAnnotatedBy() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareAtType.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+ boolean b = AjdocOutputChecker.classDataSectionContainsRel(
+ htmlFile,
+ HtmlDecorator.HtmlRelationshipKind.ANNOTATED_BY,
+ "declare @type: foo.C : @MyAnnotation");
+ assertTrue("The class data section should have 'annotated by" +
+ " declare @type: foo.C : @MyAnnotation'",b);
+ }
+
+ /**
+ * Test that info for both "matches declare" and "advised by"
+ * appear in the ajdoc for a method when the method is affected
+ * by both.
+ */
+ public void testMatchesDeclareAndAdvisedBy() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "A.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/C.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.MATCHES_DECLARE,
+ "declare warning: quot;warningquot;");
+ assertTrue("Should have 'amethod() matches declare declare warning: " +
+ "quot;warningquot;' in the Method Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.MATCHES_DECLARE,
+ "declare warning: quot;warningquot;");
+ assertTrue("Should have 'amethod() matches declare declare warning: " +
+ "quot;warningquot;' in the Method Summary section", b);
+
+ b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"=== METHOD DETAIL",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ "before(): p..");
+ assertTrue("the Method Detail should have amethod() advised by before(): p..",b);
+
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"=== METHOD SUMMARY",
+ toName("amethod()"),
+ HtmlDecorator.HtmlRelationshipKind.ADVISED_BY,
+ "before(): p..");
+ assertTrue("the Method Summary should have amethod() advised by before(): p..",b);
+ }
+
+ /**
+ * Test that if there are two declare parents statements within
+ * an aspect, one which extends and one which implements, that the
+ * ajdoc shows the correct information
+ */
+ public void testTwoDeclareParents() throws Exception {
+ initialiseProject("declareForms");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "DeclareParents.aj")};
+ runAjdoc("private","1.6",files);
+
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/DeclareParents.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath()
+ + " - were there compilation errors?");
+ }
+
+ String[] strings = {
+ "declare parents: implements Serializable",
+ "HREF=\"../foo/Class1.html\"",
+ "declare parents: extends Observable",
+ "HREF=\"../foo/Class2.html\""};
+
+ // check that the correct declare statements are there
+ for (int i = 0; i < strings.length - 1; i = i+2) {
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"DECLARE DETAIL SUMMARY",strings[i],
+ HtmlDecorator.HtmlRelationshipKind.DECLARED_ON,
+ strings[i+1]);
+ assertTrue("Should have ' " + strings[i] + " declared on " + strings[i+1] +
+ "' in the Declare Detail section", b);
+ }
+
+ for (int i = 0; i < strings.length - 1; i = i+2) {
+ boolean b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlFile,"DECLARE SUMMARY",
+ strings[i],
+ HtmlDecorator.HtmlRelationshipKind.DECLARED_ON,
+ strings[i+1]);
+ assertTrue("Should have ' " + strings[i] + " declared on " + strings[i+1] +
+ "' in the Declare Summary section", b);
+ }
+
+ // check that we don't have declare statements for those that don't
+ // exist in the code
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlFile,"DECLARE DETAIL SUMMARY",strings[0],
+ HtmlDecorator.HtmlRelationshipKind.DECLARED_ON,
+ strings[3]);
+ assertFalse("Should not have ' " + strings[0] + " declared on " + strings[3] +
+ "' in the Declare Detail section", b);
+
+ }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/EnumTest.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/EnumTest.java
new file mode 100644
index 000000000..65ef3b3c9
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/EnumTest.java
@@ -0,0 +1,47 @@
+/********************************************************************
+ * Copyright (c) 2005 Contributors. All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ * Helen Hawkins - iniital version
+ *******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+
+
+public class EnumTest extends AjdocTestCase {
+
+ /**
+ * Test for pr122728 - no StringOutOfBoundsException
+ * when processing an Enum
+ */
+ public void testEnum() throws Exception {
+ initialiseProject("pr122728");
+ File[] files = {new File(getAbsoluteProjectDir() + "/src/pack/MyEnum.java")};
+ runAjdoc("private","1.5",files);
+ }
+
+ /**
+ * Test for pr122728 - no StringOutOfBoundsException
+ * when processing an Enum
+ */
+ public void testInlinedEnum() throws Exception {
+ initialiseProject("pr122728");
+ File[] files = {new File(getAbsoluteProjectDir() + "/src/pack/ClassWithInnerEnum.java")};
+ runAjdoc("private","1.5",files);
+ }
+
+ /**
+ * Test for pr122728 - no StringOutOfBoundsException
+ * when processing an Enum
+ */
+ public void testEnumWithMethods() throws Exception {
+ initialiseProject("pr122728");
+ File[] files = {new File(getAbsoluteProjectDir() + "/src/pack/EnumWithMethods.java")};
+ runAjdoc("private","1.5",files);
+ }
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/ExecutionTestCase.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/ExecutionTestCase.java
new file mode 100644
index 000000000..837d7ef8c
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/ExecutionTestCase.java
@@ -0,0 +1,37 @@
+/* *******************************************************************
+ * Copyright (c) 2003 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+
+import org.aspectj.bridge.Version;
+
+/**
+ * @author Mik Kersten
+ */
+public class ExecutionTestCase extends AjdocTestCase {
+
+ public void testVersionMatch() {
+ String ajdocVersion = Main.getVersion();
+ String compilerVersion = Version.text;
+ assertTrue("version check", ajdocVersion.endsWith(compilerVersion));
+ }
+
+ public void testFailingBuild() {
+ initialiseProject("failing-build");
+ File file1 = new File(getAbsoluteProjectDir() + File.separatorChar + "Fail.java");
+ String[] args = { file1.getAbsolutePath() };
+ org.aspectj.tools.ajdoc.Main.main(args);
+ assertTrue(Main.hasAborted());
+ }
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/FullyQualifiedArgumentTest.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/FullyQualifiedArgumentTest.java
new file mode 100644
index 000000000..2d97a82bf
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/FullyQualifiedArgumentTest.java
@@ -0,0 +1,45 @@
+/********************************************************************
+ * Copyright (c) 2005 Contributors. All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ * Helen Hawkins - iniital version
+ *******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+import java.util.List;
+
+public class FullyQualifiedArgumentTest extends AjdocTestCase {
+
+ /**
+ * Test for pr58520
+ */
+ public void testPr58520() throws Exception {
+ initialiseProject("pr119453");
+ File[] files = {
+ new File(getAbsoluteProjectDir() + File.separatorChar +"src/pack/C.java"),
+ new File(getAbsoluteProjectDir() + File.separatorChar + "src/pack/A.aj")};
+ runAjdoc("private",files);
+
+ // check the contents of A.html
+ File htmlA = new File(getAbsolutePathOutdir() + "/pack/A.html");
+ if (!htmlA.exists()) {
+ fail("couldn't find " + getAbsolutePathOutdir()
+ + "/pack/A.html - were there compilation errors?");
+ }
+
+ // check the contents of the declare detail summary
+ String[] stringsA = { "C.html#method3(java.lang.String)",
+ "C.html#method3(String)"};
+ List missing = AjdocOutputChecker.getMissingStringsInSection(
+ htmlA,stringsA,"ADVICE SUMMARY");
+ assertEquals("There should be one missing string",1,missing.size());
+ assertEquals("The fully qualified name should appear in the argument",
+ "C.html#method3(String)",missing.get(0));
+ }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/ITDTest.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/ITDTest.java
new file mode 100644
index 000000000..899782d88
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/ITDTest.java
@@ -0,0 +1,137 @@
+/********************************************************************
+ * Copyright (c) 2005 Contributors. All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ * Helen Hawkins - iniital version
+ *******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+import java.util.List;
+
+public class ITDTest extends AjdocTestCase {
+
+ /**
+ * Test for pr119453
+ */
+ public void testITDDeclaredOn() throws Exception {
+ initialiseProject("pr119453");
+ File[] files = {
+ new File(getAbsoluteProjectDir() + "/src/pack/C.java"),
+ new File(getAbsoluteProjectDir() + "/src/pack/A.aj")
+ };
+ runAjdoc("private",files);
+ File htmlA = new File(getAbsolutePathOutdir() + "/pack/A.html");
+ if (!htmlA.exists()) {
+ fail("couldn't find " + getAbsolutePathOutdir() + "/pack/A.html - were there compilation errors?");
+ }
+
+ // check field itd appears
+ boolean b = AjdocOutputChecker.detailSectionContainsRel(
+ htmlA,"DECLARE DETAIL SUMMARY",
+ "C.y",
+ HtmlDecorator.HtmlRelationshipKind.DECLARED_ON,
+ "HREF=\"../pack/C.html\"");
+ assertTrue("Should have 'C.y declared on HREF=\"../pack/C.html\"" +
+ "' in the Declare Detail section", b);
+ b = AjdocOutputChecker.summarySectionContainsRel(
+ htmlA,"DECLARE SUMMARY",
+ "C.y",
+ HtmlDecorator.HtmlRelationshipKind.DECLARED_ON,
+ "HREF=\"../pack/C.html\"");
+ assertTrue("Should have 'C.y declared on HREF=\"../pack/C.html\"" +
+ "' in the Declare Summary section", b);
+
+ // check the modifiers are correct in the declare detail summary
+ String[] stringsA = { "private&nbsp;int",
+ "public&nbsp;java.lang.String",
+ "<H3>C.y</H3>",
+ "public&nbsp;</TT><B>C.C",
+ "package&nbsp;void"};
+ List missing = AjdocOutputChecker.getMissingStringsInSection(htmlA,stringsA,"DECLARE DETAIL SUMMARY");
+ assertEquals("There should be one missing string ",1,missing.size());
+ assertEquals("the 'package' and 'void' modifiers shouldn't appear in the 'Declare Detail' section of the ajdoc",
+ "package&nbsp;void", missing.get(0));
+
+ // check the modifiers are correct in the declare summary
+ String[] stringsA2 = {"private", "int", "public", "String", "package&nbsp;void"};
+ missing = AjdocOutputChecker.getMissingStringsInSection(htmlA,stringsA2,"DECLARE SUMMARY");
+ assertEquals("There should be two missing strings ",2,missing.size());
+ assertTrue("the public modifier shouldn't appear in the 'Declare Summary' section of the ajdoc", missing.contains("public"));
+ assertTrue("the 'package' and 'void' modifiers shouldn't appear in the 'Declare Summary' section of the ajdoc", missing.contains("package&nbsp;void"));
+
+ }
+
+ /**
+ * Test for pr119453
+ */
+ public void testITDMatchesDeclare() throws Exception {
+ initialiseProject("pr119453");
+ File[] files = {
+ new File(getAbsoluteProjectDir() + "/src/pack/C.java"),
+ new File(getAbsoluteProjectDir() + "/src/pack/A.aj")
+ };
+ runAjdoc("private",files);
+
+ // Check the contents of C.html
+ File htmlC = new File(getAbsolutePathOutdir() + "/pack/C.html");
+ if (!htmlC.exists()) {
+ fail("couldn't find " + getAbsolutePathOutdir()
+ + "/pack/C.html - were there compilation errors?");
+ }
+
+ // check that the required sections exist
+ assertTrue(htmlC.getAbsolutePath() + " should contain an "
+ + "'INTER-TYPE METHOD SUMMARY' section",
+ AjdocOutputChecker.containsString(htmlC, "INTER-TYPE METHOD SUMMARY"));
+ assertTrue(htmlC.getAbsolutePath() + " should contain an "
+ + "'INTER-TYPE FIELD SUMMARY' section",
+ AjdocOutputChecker.containsString(htmlC, "INTER-TYPE FIELD SUMMARY"));
+ assertTrue(htmlC.getAbsolutePath() + " should contain an "
+ + "'INTER-TYPE CONSTRUCTOR SUMMARY' section",
+ AjdocOutputChecker.containsString(htmlC,"INTER-TYPE CONSTRUCTOR SUMMARY"));
+
+ // check the modifier information in the sections is correct
+ String[] stringsC = { "public", "String", "pack.A" };
+ List missing = AjdocOutputChecker.getMissingStringsInSection(htmlC,stringsC,"INTER-TYPE METHOD SUMMARY");
+ assertEquals("There should be one missing string",1,missing.size());
+ assertEquals("public itd methods should not have the 'public' modifier in the ajdoc",
+ "public",missing.get(0));
+
+ String[] stringsC2 = { "private" };
+ missing = AjdocOutputChecker.getMissingStringsInSection(htmlC,stringsC2,"INTER-TYPE FIELD SUMMARY");
+ assertTrue("the private modifier for itd methods should appear in the ajdoc ",missing.size() == 0);
+
+ }
+
+ /**
+ * Test that the ITD's do not appear in as 'aspect declarations' in the
+ * class data information.
+ */
+ public void testNoAspectDeclarations() throws Exception {
+ initialiseProject("pr119453");
+ File[] files = {
+ new File(getAbsoluteProjectDir() + "/src/pack/C.java"),
+ new File(getAbsoluteProjectDir() + "/src/pack/A.aj")
+ };
+ runAjdoc("private",files);
+
+ File htmlC = new File(getAbsolutePathOutdir() + "/pack/C.html");
+ if (htmlC == null || !htmlC.exists()) {
+ fail("couldn't find " + getAbsolutePathOutdir()
+ + "/pack/C.html - were there compilation errors?");
+ }
+
+ boolean b = AjdocOutputChecker.classDataSectionContainsRel(
+ htmlC,
+ HtmlDecorator.HtmlRelationshipKind.ASPECT_DECLARATIONS,
+ "pack.A.C.y");
+ assertFalse("The class data section should not have 'aspect declarations" +
+ " pack.A.C.y' since this is an ITD",b);
+ }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/JDKVersionTest.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/JDKVersionTest.java
new file mode 100644
index 000000000..33f0daecb
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/JDKVersionTest.java
@@ -0,0 +1,31 @@
+/* *******************************************************************
+ * Copyright (c) 2005 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+
+/**
+ * @author Mik Kersten
+ */
+public class JDKVersionTest extends AjdocTestCase {
+
+// public void testIsUsing1point4() {
+// String v = System.getProperty("java.class.version","44.0");
+// assertTrue(("49.0".compareTo(v) > 0) && ("48.0".compareTo(v) <= 0));
+// assertFalse(Util.isExecutingOnJava5());
+// }
+
+ public void testNothing() {}
+// public void testIsUsing1point5() {
+// assertTrue(Util.isExecutingOnJava5());
+// }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/PatternsTestCase.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/PatternsTestCase.java
new file mode 100644
index 000000000..61c0d67cd
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/PatternsTestCase.java
@@ -0,0 +1,91 @@
+/* *******************************************************************
+ * Copyright (c) 2003 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+
+/**
+ * A long way to go until full coverage, but this is the place to add more.
+ *
+ * @author Mik Kersten
+ */
+public class PatternsTestCase extends AjdocTestCase {
+
+ public void testSimpleExample() {
+
+// System.err.println(new File("testdata.figures-demo").exists());
+// File file1 = new File("testdata/patterns/allPatterns.lst");
+ File outdir = new File("testdata/patterns/doc");
+ File srcdir = new File("../../docs/sandbox/ubc-design-patterns/src");
+
+ String[] args = {
+// "-XajdocDebug",
+ "-classpath",
+ AjdocTests.ASPECTJRT_PATH.getPath(),
+ "-d",
+ outdir.getAbsolutePath(),
+ "-sourcepath",
+ srcdir.getAbsolutePath(),
+ "ca.ubc.cs.spl.aspectPatterns.patternLibrary",
+ "ca.ubc.cs.spl.aspectPatterns.examples.abstractFactory.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.abstractFactory.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.builder.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.builder.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.factoryMethod.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.factoryMethod.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.prototype.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.prototype.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.singleton.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.singleton.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.adapter.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.adapter.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.bridge.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.bridge.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.composite.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.composite.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.decorator.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.decorator.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.facade.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.facade.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.flyweight.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.flyweight.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.proxy.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.proxy.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.chainOfResponsibility.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.chainOfResponsibility.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.command.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.command.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.interpreter.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.interpreter.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.iterator.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.iterator.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.mediator.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.mediator.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.memento.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.memento.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.observer.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.state.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.state.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.strategy.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.strategy.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.templateMethod.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.templateMethod.aspectj",
+ "ca.ubc.cs.spl.aspectPatterns.examples.visitor.java",
+ "ca.ubc.cs.spl.aspectPatterns.examples.visitor.aspectj"
+ };
+
+ org.aspectj.tools.ajdoc.Main.main(args);
+ }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/PointcutVisibilityTest.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/PointcutVisibilityTest.java
new file mode 100644
index 000000000..b3544d563
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/PointcutVisibilityTest.java
@@ -0,0 +1,96 @@
+/* *******************************************************************
+ * Copyright (c) 2005 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * @author Mik Kersten
+ */
+public class PointcutVisibilityTest extends AjdocTestCase {
+
+ /**
+ * Test that passing the "public" argument only shows
+ * public pointcuts in the ajdoc
+ */
+ public void testCoveragePublicMode() throws Exception {
+ initialiseProject("bug82340");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "Pointcuts.java")};
+ runAjdoc("public",files);
+
+ // ajdoc for Pointcut.java should contain info about
+ // the public pointcuts but not the protected and
+ // private one (since "public" was an argument)
+ // Check that this is the case......
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Pointcuts.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+ // check the contents of the pointcut summary
+ String[] strings = { "privatePointcut","protectedPointcut","publicPointcut"};
+ List missing = AjdocOutputChecker.getMissingStringsInSection(htmlFile,strings,"POINTCUT SUMMARY");
+ assertEquals("There should be two missing strings",2,missing.size());
+ assertTrue("passing the 'public' argument means the private pointcut shouldn't appear in the ajdoc", missing.contains("privatePointcut"));
+ assertTrue("passing the 'public' argument means the protected pointcut shouldn't appear in the ajdoc", missing.contains("protectedPointcut"));
+ }
+
+ /**
+ * Test that passing the "protected" argument only shows
+ * public and protected pointcuts in the ajdoc
+ */
+ public void testCoverageProtectedMode() throws Exception {
+ initialiseProject("bug82340");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "Pointcuts.java")};
+ runAjdoc("protected",files);
+
+ // ajdoc for Pointcut.java should contain info about
+ // the public and protected pointcuts but not the
+ // private one (since "protected" was an argument)
+ // Check that this is the case......
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Pointcuts.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+ // check the contents of the pointcut summary
+ String[] strings = { "privatePointcut","protectedPointcut","publicPointcut"};
+ List missing = AjdocOutputChecker.getMissingStringsInSection(htmlFile,strings,"POINTCUT SUMMARY");
+ assertEquals("There should be one missing strings",1,missing.size());
+ assertEquals("passing the 'protected' argument means the private pointcut shouldn't appear in the ajdoc",
+ "privatePointcut", missing.get(0));
+ }
+
+ /**
+ * Test that passing the "private" argument shows all
+ * pointcuts (public, protected and private) in the ajdoc
+ */
+ public void testCoveragePrivateMode() throws Exception {
+ initialiseProject("bug82340");
+ File[] files = {new File(getAbsoluteProjectDir() + File.separatorChar + "Pointcuts.java")};
+ runAjdoc("private",files);
+
+ // ajdoc for Pointcut.java should contain info about
+ // the public, protected and private pointcuts
+ // (since "private" was an argument)
+ // Check that this is the case......
+ File htmlFile = new File(getAbsolutePathOutdir() + "/foo/Pointcuts.html");
+ if (!htmlFile.exists()) {
+ fail("couldn't find " + htmlFile.getAbsolutePath() + " - were there compilation errors?");
+ }
+ // check the contents of the pointcut summary
+ String[] strings = { "privatePointcut","protectedPointcut","publicPointcut"};
+ List missing = AjdocOutputChecker.getMissingStringsInSection(htmlFile,strings,"POINTCUT SUMMARY");
+ assertTrue("passing the 'private' modifier means that private, protected and public " +
+ "pointcuts should appear in the ajdoc",missing.isEmpty());
+ }
+
+}
diff --git a/ajdoc/src/test/java/org/aspectj/tools/ajdoc/SpacewarTestCase.java b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/SpacewarTestCase.java
new file mode 100644
index 000000000..53f7a5ef9
--- /dev/null
+++ b/ajdoc/src/test/java/org/aspectj/tools/ajdoc/SpacewarTestCase.java
@@ -0,0 +1,41 @@
+/* *******************************************************************
+ * Copyright (c) 2003 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mik Kersten initial implementation
+ * ******************************************************************/
+ package org.aspectj.tools.ajdoc;
+
+import java.io.File;
+
+
+/**
+ * @author Mik Kersten
+ */
+public class SpacewarTestCase extends AjdocTestCase {
+
+ private String[] dirs = {"spacewar","coordination"};
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ initialiseProject("spacewar");
+ }
+
+ public void testSimpleExample() {
+ runAjdoc(dirs);
+ }
+
+ public void testPublicModeExample() {
+ runAjdoc("public",dirs);
+ }
+
+ public void testPr134063() {
+ String lstFile = "spacewar" + File.separatorChar + "demo.lst";
+ runAjdoc("private",lstFile);
+ }
+}