Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2010-06-30 21:54:19 -0400
committerAlena Laskavaia2010-06-30 21:54:19 -0400
commit2d7b307308ea9e47edf033c5282592fe160693b2 (patch)
tree28eaf0a89398037e55db18b3abadff8595a38fc4
parenteea0205ab1eb8fa31cda0b4bf0f10212786d0e7d (diff)
downloadorg.eclipse.cdt-2d7b307308ea9e47edf033c5282592fe160693b2.tar.gz
org.eclipse.cdt-2d7b307308ea9e47edf033c5282592fe160693b2.tar.xz
org.eclipse.cdt-2d7b307308ea9e47edf033c5282592fe160693b2.zip
added framework for quick fix tests and example
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/META-INF/MANIFEST.MF8
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/AutomatedIntegrationSuite.java5
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CheckerTestCase.java2
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanTestCase.java24
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/TestUtils.java11
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixTestCase.java94
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/SuggestedParenthesisQuickFixTest.java74
7 files changed, 216 insertions, 2 deletions
diff --git a/codan/org.eclipse.cdt.codan.core.test/META-INF/MANIFEST.MF b/codan/org.eclipse.cdt.codan.core.test/META-INF/MANIFEST.MF
index e06510d06b..e968c30a4f 100644
--- a/codan/org.eclipse.cdt.codan.core.test/META-INF/MANIFEST.MF
+++ b/codan/org.eclipse.cdt.codan.core.test/META-INF/MANIFEST.MF
@@ -11,7 +11,13 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.cdt.core.tests,
org.eclipse.cdt.codan.core;bundle-version="1.0.0",
org.eclipse.cdt.codan.core.cxx;bundle-version="1.0.0",
- org.junit
+ org.eclipse.cdt.ui,
+ org.eclipse.jface;bundle-version="3.6.0",
+ org.eclipse.jface.text;bundle-version="3.6.0",
+ org.junit,
+ org.eclipse.cdt.codan.checkers.ui;bundle-version="1.0.0",
+ org.eclipse.cdt.codan.ui;bundle-version="1.1.0",
+ org.eclipse.ui.ide;bundle-version="3.6.0"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-Vendor: %Bundle-Vendor
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/AutomatedIntegrationSuite.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/AutomatedIntegrationSuite.java
index 89f37c93bb..8be78165a2 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/AutomatedIntegrationSuite.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/AutomatedIntegrationSuite.java
@@ -19,6 +19,7 @@ import org.eclipse.cdt.codan.core.internal.checkers.CatchByReferenceTest;
import org.eclipse.cdt.codan.core.internal.checkers.ReturnCheckerTest;
import org.eclipse.cdt.codan.core.internal.checkers.StatementHasNoEffectCheckerTest;
import org.eclipse.cdt.codan.core.internal.checkers.SuggestedParenthesisCheckerTest;
+import org.eclipse.cdt.codan.internal.checkers.ui.quickfix.SuggestedParenthesisQuickFixTest;
public class AutomatedIntegrationSuite extends TestSuite {
public AutomatedIntegrationSuite() {
@@ -38,12 +39,16 @@ public class AutomatedIntegrationSuite extends TestSuite {
public static Test suite() {
final AutomatedIntegrationSuite suite = new AutomatedIntegrationSuite();
+ // checkers
suite.addTestSuite(StatementHasNoEffectCheckerTest.class);
suite.addTestSuite(SuggestedParenthesisCheckerTest.class);
suite.addTestSuite(ReturnCheckerTest.class);
suite.addTestSuite(CatchByReferenceTest.class);
suite.addTestSuite(AssignmentInConditionCheckerTest.class);
+ // framework
suite.addTest(CodanFastTestSuite.suite());
+ // quick fixes
+ suite.addTestSuite(SuggestedParenthesisQuickFixTest.class);
return suite;
}
}
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CheckerTestCase.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CheckerTestCase.java
index f3241122e7..d9ecb70eab 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CheckerTestCase.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CheckerTestCase.java
@@ -29,7 +29,7 @@ import org.eclipse.core.runtime.NullProgressMonitor;
*
*/
public class CheckerTestCase extends CodanTestCase {
- private IMarker[] markers;
+ protected IMarker[] markers;
public IMarker checkErrorLine(int i) {
return checkErrorLine(currentFile, i);
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanTestCase.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanTestCase.java
index 2ca96c3b31..d16fc8c1a6 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanTestCase.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanTestCase.java
@@ -18,10 +18,13 @@ import java.util.ArrayList;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
@@ -30,6 +33,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
/**
* TODO: add description
@@ -39,6 +43,8 @@ public class CodanTestCase extends BaseTestCase {
protected File tmpDir;
protected ICProject cproject;
protected File currentFile;
+ protected ICElement currentCElem;
+ protected IFile currentIFile;
/**
*
@@ -183,6 +189,18 @@ public class CodanTestCase extends BaseTestCase {
}
public File loadcode(String code, boolean cpp) {
+ String fileKey = "@file:"; //$NON-NLS-1$
+ int indf = code.indexOf(fileKey);
+ if (indf >= 0) {
+ int sep = code.indexOf('\n');
+ if (sep != -1) {
+ String line = code.substring(0, sep);
+ code = code.substring(sep + 1);
+ String fileName = line.substring(indf + fileKey.length())
+ .trim();
+ return loadcode(code, new File(tmpDir, fileName));
+ }
+ }
String ext = cpp ? ".cpp" : ".c"; //$NON-NLS-1$ //$NON-NLS-2$
File testFile = null;
try {
@@ -211,10 +229,16 @@ public class CodanTestCase extends BaseTestCase {
// hmm
fail(e.getMessage());
}
+ currentCElem = cproject
+ .findElement(new Path(currentFile.toString()));
+ currentIFile = (IFile) currentCElem.getResource();
return testFile;
} catch (IOException e) {
fail("Cannot save test: " + testFile + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
return null;
+ } catch (CModelException e) {
+ fail("Cannot find file: " + testFile + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
+ return null;
}
}
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/TestUtils.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/TestUtils.java
index ce17018218..08ba45fd20 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/TestUtils.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/TestUtils.java
@@ -38,6 +38,17 @@ public class TestUtils {
return testFile;
}
+ public static String loadFile(InputStream st) throws IOException {
+ BufferedReader br = new BufferedReader(new InputStreamReader(st));
+ String buffer;
+ StringBuffer result = new StringBuffer();
+ while ((buffer = br.readLine()) != null) {
+ result.append(buffer);
+ }
+ st.close();
+ return result.toString();
+ }
+
/**
* @param clazz
* @return
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixTestCase.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixTestCase.java
new file mode 100644
index 0000000000..b7ead3f3f2
--- /dev/null
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixTestCase.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 QNX Software Systems
+ * 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:
+ * QNX Software Systems (Alena Laskavaia) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.internal.checkers.ui.quickfix;
+
+import java.io.IOException;
+
+import org.eclipse.cdt.codan.core.test.CheckerTestCase;
+import org.eclipse.cdt.codan.core.test.TestUtils;
+import org.eclipse.cdt.codan.ui.AbstractCodanCMarkerResolution;
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.internal.ui.util.EditorUtility;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * TODO: add description
+ */
+public abstract class QuickFixTestCase extends CheckerTestCase {
+ AbstractCodanCMarkerResolution quickFix;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ quickFix = createQuickFix();
+ }
+
+ /**
+ * @return
+ */
+ protected abstract AbstractCodanCMarkerResolution createQuickFix();
+
+ /**
+ * @param code
+ * @param string
+ * @return
+ */
+ protected ISelection textSelection(String code, String string) {
+ return new TextSelection(code.indexOf(string), string.length());
+ }
+
+ /**
+ * @return
+ * @throws CModelException
+ * @throws PartInitException
+ * @throws IOException
+ * @throws CoreException
+ */
+ public String runQuickFixOneFile() {
+ // need to load before running codan because otherwise marker is lost when doing quick fix 8[]
+ try {
+ EditorUtility.openInEditor(currentIFile);
+ runCodan();
+ doRunQuickFix();
+ String result = TestUtils.loadFile(currentIFile.getContents());
+ return result;
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ return null;
+ }
+ }
+
+ /**
+ *
+ */
+ public void doRunQuickFix() {
+ for (int i = 0; i < markers.length; i++) {
+ IMarker marker = markers[i];
+ quickFix.run(marker);
+ }
+ PlatformUI.getWorkbench().saveAllEditors(false);
+ }
+
+ /**
+ * @param result
+ * @param expected
+ */
+ public void assertContainedIn(String expected, String result) {
+ assertTrue(
+ "Text <" + expected + "> not found in <" + result + ">", result.contains(expected)); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+ }
+}
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/SuggestedParenthesisQuickFixTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/SuggestedParenthesisQuickFixTest.java
new file mode 100644
index 0000000000..0d47fe67ad
--- /dev/null
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/SuggestedParenthesisQuickFixTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 QNX Software Systems
+ * 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:
+ * QNX Software Systems (Alena Laskavaia) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.internal.checkers.ui.quickfix;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.eclipse.cdt.codan.core.test.TestUtils;
+import org.eclipse.cdt.codan.ui.AbstractCodanCMarkerResolution;
+import org.eclipse.cdt.internal.ui.util.EditorUtility;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Test for quick fix for suggested parenthesis
+ */
+public class SuggestedParenthesisQuickFixTest extends QuickFixTestCase {
+ @SuppressWarnings("restriction")
+ @Override
+ public AbstractCodanCMarkerResolution createQuickFix() {
+ return new SuggestedParenthesisQuickFix();
+ }
+
+ // main() {
+ // int a=1,b=3;
+ // if (b+a && a>b || b-a) b--; // error here
+ // }
+ public void testSimple() throws IOException, CoreException {
+ loadcode(getAboveComment());
+ String result = runQuickFixOneFile();
+ assertContainedIn("(b+a && a>b)", result); //$NON-NLS-1$
+ }
+
+ // @file:header.h
+ // int foo();
+ /* ---- */
+ // @file:main.c
+ // #include "header.h"
+ // main() {
+ // foo();
+ // }
+ /*
+ * this test is using two files, there was not actually bugs here so
+ * quick fix is not called
+ */
+ public void test2FilesExample() throws FileNotFoundException, IOException {
+ StringBuffer[] code = getContents(2);
+ File f1 = loadcode(code[0].toString());
+ File f2 = loadcode(code[1].toString());
+ // lets pretend marker is found in main.c but fixes go in both files,
+ // to check do something like this
+ try {
+ EditorUtility.openInEditor(f2);
+ runCodan();
+ doRunQuickFix();
+ String result_main = TestUtils.loadFile(new FileInputStream(f2));
+ String result_header = TestUtils.loadFile(new FileInputStream(f1));
+ assertContainedIn("foo", result_main); //$NON-NLS-1$
+ assertContainedIn("foo", result_header); //$NON-NLS-1$
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+}

Back to the top