mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-09 18:56:02 +02:00
Tests for headers included in multiple variants.
This commit is contained in:
parent
5558865a53
commit
aa09934d72
4 changed files with 275 additions and 21 deletions
|
@ -9,10 +9,13 @@
|
||||||
* Andrew Ferguson (Symbian) - Initial implementation
|
* Andrew Ferguson (Symbian) - Initial implementation
|
||||||
* IBM Corporation
|
* IBM Corporation
|
||||||
* Markus Schorn (Wind River Systems)
|
* Markus Schorn (Wind River Systems)
|
||||||
|
* Sergey Prigogin (Google)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.index.tests;
|
package org.eclipse.cdt.internal.index.tests;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMManager;
|
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||||
|
@ -81,15 +84,20 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IASTName findName(String section, int len) {
|
protected IASTName findName(String section, int len) {
|
||||||
IASTTranslationUnit ast = strategy.getAst();
|
for (int i = 0; i < strategy.getAstCount(); i++) {
|
||||||
|
IASTTranslationUnit ast = strategy.getAst(i);
|
||||||
final IASTNodeSelector nodeSelector = ast.getNodeSelector(null);
|
final IASTNodeSelector nodeSelector = ast.getNodeSelector(null);
|
||||||
final int offset = strategy.getTestData()[1].indexOf(section);
|
final int offset = strategy.getAstSource(i).indexOf(section);
|
||||||
|
if (offset >= 0) {
|
||||||
IASTName name= nodeSelector.findName(offset, len);
|
IASTName name= nodeSelector.findName(offset, len);
|
||||||
if (name == null)
|
if (name == null)
|
||||||
name= nodeSelector.findImplicitName(offset, len);
|
name= nodeSelector.findImplicitName(offset, len);
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to get an IBinding from the initial specified number of characters
|
* Attempts to get an IBinding from the initial specified number of characters
|
||||||
|
@ -210,7 +218,9 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
IIndex getIndex();
|
IIndex getIndex();
|
||||||
void setUp() throws Exception;
|
void setUp() throws Exception;
|
||||||
void tearDown() throws Exception;
|
void tearDown() throws Exception;
|
||||||
public IASTTranslationUnit getAst();
|
public int getAstCount();
|
||||||
|
public IASTTranslationUnit getAst(int index);
|
||||||
|
public StringBuilder getAstSource(int index);
|
||||||
public StringBuilder[] getTestData();
|
public StringBuilder[] getTestData();
|
||||||
public ICProject getCProject();
|
public ICProject getCProject();
|
||||||
public boolean isCompositeIndex();
|
public boolean isCompositeIndex();
|
||||||
|
@ -258,10 +268,22 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
return testData;
|
return testData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IASTTranslationUnit getAst() {
|
public int getAstCount() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTTranslationUnit getAst(int index) {
|
||||||
|
if (index != 0)
|
||||||
|
throw new IllegalArgumentException();
|
||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StringBuilder getAstSource(int index) {
|
||||||
|
if (index != 0)
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
return testData[1];
|
||||||
|
}
|
||||||
|
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
cproject = cpp ? CProjectHelper.createCCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER)
|
cproject = cpp ? CProjectHelper.createCCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER)
|
||||||
: CProjectHelper.createCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);
|
: CProjectHelper.createCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);
|
||||||
|
@ -304,7 +326,6 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class SinglePDOMTestStrategy implements ITestStrategy {
|
class SinglePDOMTestStrategy implements ITestStrategy {
|
||||||
private IIndex index;
|
private IIndex index;
|
||||||
private ICProject cproject;
|
private ICProject cproject;
|
||||||
|
@ -324,10 +345,22 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
return testData;
|
return testData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IASTTranslationUnit getAst() {
|
public int getAstCount() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTTranslationUnit getAst(int index) {
|
||||||
|
if (index != 0)
|
||||||
|
throw new IllegalArgumentException();
|
||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StringBuilder getAstSource(int index) {
|
||||||
|
if (index != 0)
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
return testData[1];
|
||||||
|
}
|
||||||
|
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
cproject = cpp ? CProjectHelper.createCCProject(getName()+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER)
|
cproject = cpp ? CProjectHelper.createCCProject(getName()+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER)
|
||||||
: CProjectHelper.createCProject(getName()+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);
|
: CProjectHelper.createCProject(getName()+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);
|
||||||
|
@ -370,6 +403,108 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This strategy allows tests to create an arbitrary number of header and source files
|
||||||
|
* and to obtain ASTs of any subset of the created files.
|
||||||
|
*
|
||||||
|
* The first line of each comment section preceding the test contains the name of the file
|
||||||
|
* to put the contents of the section to. To request the AST of a file, put an asterisk after
|
||||||
|
* the file name.
|
||||||
|
*/
|
||||||
|
class SinglePDOMTestNamedFilesStrategy implements ITestStrategy {
|
||||||
|
private IIndex index;
|
||||||
|
private ICProject cproject;
|
||||||
|
private StringBuilder[] testData;
|
||||||
|
private final List<StringBuilder> astSources;
|
||||||
|
private final List<IASTTranslationUnit> asts;
|
||||||
|
private final boolean cpp;
|
||||||
|
|
||||||
|
public SinglePDOMTestNamedFilesStrategy(boolean cpp) {
|
||||||
|
this.cpp = cpp;
|
||||||
|
astSources = new ArrayList<StringBuilder>();
|
||||||
|
asts = new ArrayList<IASTTranslationUnit>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICProject getCProject() {
|
||||||
|
return cproject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringBuilder[] getTestData() {
|
||||||
|
return testData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAstCount() {
|
||||||
|
return asts.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTTranslationUnit getAst(int index) {
|
||||||
|
return asts.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringBuilder getAstSource(int index) {
|
||||||
|
return astSources.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
cproject = cpp ? CProjectHelper.createCCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER)
|
||||||
|
: CProjectHelper.createCProject(getName() + System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);
|
||||||
|
Bundle b = CTestPlugin.getDefault().getBundle();
|
||||||
|
testData = TestSourceReader.getContentsForTest(b, "parser", IndexBindingResolutionTestBase.this.getClass(), getName(), 0);
|
||||||
|
|
||||||
|
List<IFile> astFiles = new ArrayList<IFile>();
|
||||||
|
for (int i = 0; i < testData.length; i++) {
|
||||||
|
StringBuilder contents = testData[i];
|
||||||
|
int endOfLine = contents.indexOf("\n");
|
||||||
|
if (endOfLine >= 0)
|
||||||
|
endOfLine++;
|
||||||
|
else
|
||||||
|
endOfLine = contents.length();
|
||||||
|
String filename = contents.substring(0, endOfLine).trim();
|
||||||
|
contents.delete(0, endOfLine); // Remove first line from the file contents
|
||||||
|
boolean astRequested = filename.endsWith("*");
|
||||||
|
if (astRequested) {
|
||||||
|
filename = filename.substring(0, filename.length() - 1).trim();
|
||||||
|
}
|
||||||
|
IFile file = TestSourceReader.createFile(cproject.getProject(), new Path(filename), contents.toString());
|
||||||
|
if (astRequested || (i == testData.length - 1 && astFiles.isEmpty())) {
|
||||||
|
astSources.add(contents);
|
||||||
|
astFiles.add(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CCorePlugin.getIndexManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER);
|
||||||
|
assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor()));
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("Project PDOM: "+getName());
|
||||||
|
((PDOM) CCoreInternals.getPDOMManager().getPDOM(cproject)).accept(new PDOMPrettyPrinter());
|
||||||
|
}
|
||||||
|
|
||||||
|
index= CCorePlugin.getIndexManager().getIndex(cproject);
|
||||||
|
|
||||||
|
index.acquireReadLock();
|
||||||
|
for (IFile file : astFiles) {
|
||||||
|
asts.add(TestSourceReader.createIndexBasedAST(index, cproject, file));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
if (index != null) {
|
||||||
|
index.releaseReadLock();
|
||||||
|
}
|
||||||
|
if (cproject != null) {
|
||||||
|
cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IIndex getIndex() {
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCompositeIndex() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ReferencedProject implements ITestStrategy {
|
class ReferencedProject implements ITestStrategy {
|
||||||
private IIndex index;
|
private IIndex index;
|
||||||
private ICProject cproject, referenced;
|
private ICProject cproject, referenced;
|
||||||
|
@ -445,10 +580,22 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
return referenced;
|
return referenced;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IASTTranslationUnit getAst() {
|
public int getAstCount() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTTranslationUnit getAst(int index) {
|
||||||
|
if (index != 0)
|
||||||
|
throw new IllegalArgumentException();
|
||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StringBuilder getAstSource(int index) {
|
||||||
|
if (index != 0)
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
return testData[1];
|
||||||
|
}
|
||||||
|
|
||||||
public IIndex getIndex() {
|
public IIndex getIndex() {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Google, Inc and others.
|
||||||
|
* 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:
|
||||||
|
* Sergey Prigogin (Google) - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.index.tests;
|
||||||
|
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for header files included in multiple variants.
|
||||||
|
*/
|
||||||
|
public class IndexMultiVariantHeaderTest extends IndexBindingResolutionTestBase {
|
||||||
|
|
||||||
|
public IndexMultiVariantHeaderTest() {
|
||||||
|
setStrategy(new SinglePDOMTestNamedFilesStrategy(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TestSuite suite() {
|
||||||
|
return suite(IndexMultiVariantHeaderTest.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test.h
|
||||||
|
// #ifdef func
|
||||||
|
// #undef func
|
||||||
|
// #endif
|
||||||
|
//
|
||||||
|
// #define func(x) foo ## x
|
||||||
|
|
||||||
|
// test.c *
|
||||||
|
// #include "test.h"
|
||||||
|
//
|
||||||
|
// void func(1)() {}
|
||||||
|
//
|
||||||
|
// #undef func
|
||||||
|
// #define func(x) bar ## x
|
||||||
|
//
|
||||||
|
// void func(2)() {}
|
||||||
|
//
|
||||||
|
// #include "test.h"
|
||||||
|
// void func(3)() {}
|
||||||
|
public void testExampleFromBug197989_Comment0() throws Exception {
|
||||||
|
IFunction f1 = getBindingFromASTName("func(1)", 7, IFunction.class);
|
||||||
|
assertEquals("foo1", f1.getName());
|
||||||
|
IFunction f2 = getBindingFromASTName("func(2)", 7, IFunction.class);
|
||||||
|
assertEquals("bar2", f2.getName());
|
||||||
|
IFunction f3 = getBindingFromASTName("func(3)", 7, IFunction.class);
|
||||||
|
assertEquals("foo3", f3.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// stddef.h
|
||||||
|
// #if !defined(_STDDEF_H) || defined(__need_NULL)
|
||||||
|
//
|
||||||
|
// #if !defined(__need_NULL)
|
||||||
|
// #define _STDDEF_H
|
||||||
|
// #endif /* !defined(__need_NULL) */
|
||||||
|
//
|
||||||
|
// #if defined(_STDDEF_H) || defined(__need_NULL)
|
||||||
|
// #define NULL 0
|
||||||
|
// #endif /* defined(_STDDEF_H) || defined(__need_NULL) */
|
||||||
|
// #undef __need_NULL
|
||||||
|
//
|
||||||
|
// #if defined(_STDDEF_H)
|
||||||
|
// typedef unsigned int size_t;
|
||||||
|
// #endif /* defined(_STDDEF_H) */
|
||||||
|
//
|
||||||
|
// #endif /* !defined(_STDDEF_H) || defined(__need_NULL) */
|
||||||
|
|
||||||
|
// a.h
|
||||||
|
// #ifndef A_H_
|
||||||
|
// #define A_H_
|
||||||
|
// #include "stddef.h"
|
||||||
|
// #endif /* A_H_ */
|
||||||
|
|
||||||
|
// a.cpp *
|
||||||
|
// #define __need_NULL
|
||||||
|
// #include "stddef.h"
|
||||||
|
// void f1(char* p) {}
|
||||||
|
// void test() {
|
||||||
|
// f1(NULL);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// b.cpp
|
||||||
|
// #include "stddef.h"
|
||||||
|
// #include "a.h"
|
||||||
|
|
||||||
|
// c.cpp *
|
||||||
|
// #include "a.h"
|
||||||
|
// void f2(char* p, size_t t) {}
|
||||||
|
// void test() {
|
||||||
|
// f2(NULL, 1);
|
||||||
|
// }
|
||||||
|
public void testExampleFromBug197989_Comment73() throws Exception {
|
||||||
|
getBindingFromASTName("f1(NULL)", 2, ICPPFunction.class);
|
||||||
|
getBindingFromASTName("f2(NULL, 1)", 2, ICPPFunction.class);
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,7 @@ public class IndexTests extends TestSuite {
|
||||||
suite.addTest(IndexNamesTests.suite());
|
suite.addTest(IndexNamesTests.suite());
|
||||||
suite.addTest(TeamSharedIndexTest.suite());
|
suite.addTest(TeamSharedIndexTest.suite());
|
||||||
suite.addTest(IndexProviderManagerTest.suite());
|
suite.addTest(IndexProviderManagerTest.suite());
|
||||||
|
suite.addTest(IndexMultiVariantHeaderTest.suite());
|
||||||
|
|
||||||
IndexCPPBindingResolutionBugs.addTests(suite);
|
IndexCPPBindingResolutionBugs.addTests(suite);
|
||||||
IndexCPPBindingResolutionTest.addTests(suite);
|
IndexCPPBindingResolutionTest.addTests(suite);
|
||||||
|
|
|
@ -63,7 +63,8 @@ public class TestSourceReader {
|
||||||
* @param srcRoot the directory inside the bundle containing the packages
|
* @param srcRoot the directory inside the bundle containing the packages
|
||||||
* @param clazz the name of the class containing the test
|
* @param clazz the name of the class containing the test
|
||||||
* @param testName the name of the test
|
* @param testName the name of the test
|
||||||
* @param sections the number of comment sections preceding the named test to return
|
* @param sections the number of comment sections preceding the named test to return. Pass zero
|
||||||
|
* to get all available sections.
|
||||||
* @return an array of StringBuilder objects for each comment section found preceding the named
|
* @return an array of StringBuilder objects for each comment section found preceding the named
|
||||||
* test in the source code.
|
* test in the source code.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
|
@ -100,7 +101,7 @@ public class TestSourceReader {
|
||||||
} else {
|
} else {
|
||||||
if (content.length() > 0) {
|
if (content.length() > 0) {
|
||||||
contents.add(content);
|
contents.add(content);
|
||||||
if (contents.size() == sections + 1)
|
if (sections > 0 && contents.size() == sections + 1)
|
||||||
contents.remove(0);
|
contents.remove(0);
|
||||||
content = new StringBuilder();
|
content = new StringBuilder();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue