diff options
Diffstat (limited to 'lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java')
-rw-r--r-- | lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java | 415 |
1 files changed, 415 insertions, 0 deletions
diff --git a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java new file mode 100644 index 00000000000..373d3c2a213 --- /dev/null +++ b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java @@ -0,0 +1,415 @@ +/******************************************************************************* + * Copyright (c) 2006, 2009 IBM Corporation 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.lrparser.tests; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IEnumerator; +import org.eclipse.cdt.core.dom.ast.IField; +import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.IVariable; +import org.eclipse.cdt.core.dom.lrparser.gnu.GCCLanguage; +import org.eclipse.cdt.core.model.ILanguage; + + +/** + * Reuse the completion parse tests from the old parser for now. + */ +@SuppressWarnings("nls") +public class LRCompletionParseTest extends TestCase { + + public static TestSuite suite() { + return new TestSuite(LRCompletionParseTest.class); + } + + + public LRCompletionParseTest() { } + public LRCompletionParseTest(String name) { super(name); } + + + protected IASTCompletionNode parse(String code, int offset) throws Exception { + return ParseHelper.getCompletionNode(code, getCLanguage(), offset); + } + + + private static final Comparator<IBinding> BINDING_COMPARATOR = new Comparator<IBinding>() { + public int compare(IBinding b1, IBinding b2) { + return b1.getName().compareTo(b2.getName()); + } + }; + + + public static IBinding[] getBindings(IASTName[] names) { + List<IBinding> bindings = new ArrayList<IBinding>(); + + for(IASTName name : names) { + if(name.getTranslationUnit() == null) + continue; + + for(IBinding binding : name.getCompletionContext().findBindings(name, true)) + bindings.add(binding); + } + + Collections.sort(bindings, BINDING_COMPARATOR); + return bindings.toArray(new IBinding[bindings.size()]); + } + + + protected ILanguage getCLanguage() { + return GCCLanguage.getDefault(); + } + + + // First steal tests from CompletionParseTest + + + public void testCompletionStructField() throws Exception { + String code = + "int aVar; " + + "struct D{ " + + " int aField1; " + + " int aField2; " + + "}; " + + "void foo(){" + + " struct D d; " + + " d.a " + + "}\n"; + + int index = code.indexOf( "d.a" ); + + IASTCompletionNode node = parse( code, index + 3 ); + assertNotNull( node ); + + String prefix = node.getPrefix(); + assertNotNull( prefix ); + assertEquals( prefix, "a" ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(2, bindings.length); + assertEquals("aField1", ((IField)bindings[0]).getName()); + assertEquals("aField2", ((IField)bindings[1]).getName()); + } + + public void testCompletionStructFieldPointer() throws Exception { + String code = + "struct Cube { " + + " int nLen; " + + " int nWidth; " + + " int nHeight; " + + "}; " + + "int volume( struct Cube * pCube ) { " + + " pCube->SP "; + + IASTCompletionNode node = parse( code, code.indexOf("SP")); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(3, bindings.length); + assertEquals("nHeight", ((IField)bindings[0]).getName()); + assertEquals("nLen", ((IField)bindings[1]).getName()); + assertEquals("nWidth", ((IField)bindings[2]).getName()); + } + + + public void testCompletionParametersAsLocalVariables() throws Exception{ + String code = + "int foo( int aParameter ){" + + " int aLocal;" + + " if( aLocal != 0 ){" + + " int aBlockLocal;" + + " a \n"; + + int index = code.indexOf( " a " ); + + IASTCompletionNode node = parse( code, index + 2 ); + assertNotNull( node ); + + assertEquals("a", node.getPrefix()); //$NON-NLS-1$ + + IASTName[] names = node.getNames(); + assertEquals(2, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(3, bindings.length); + assertEquals("aBlockLocal", ((IVariable)bindings[0]).getName()); + assertEquals("aLocal", ((IVariable)bindings[1]).getName()); + assertEquals("aParameter", ((IVariable)bindings[2]).getName()); + } + + + public void testCompletionTypedef() throws Exception { + String code = + "typedef int Int; " + + "InSP"; + + int index = code.indexOf( "SP" ); + + IASTCompletionNode node = parse( code, index ); + assertNotNull(node); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + assertEquals("In", node.getPrefix()); + + IBinding[] bindings = getBindings(names); + + assertEquals(1, bindings.length); + assertEquals("Int", ((ITypedef)bindings[0]).getName()); + } + + public void testCompletion() throws Exception { + String code = + "#define GL_T 0x2001\n" + + "#define GL_TRUE 0x1\n" + + "typedef unsigned char GLboolean;\n" + + "static GLboolean should_rotate = GL_T"; + + int index = code.indexOf("= GL_T"); + + IASTCompletionNode node = parse( code, index + 6); + assertNotNull(node); + + assertEquals("GL_T", node.getPrefix()); //$NON-NLS-1$ + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + } + + public void testCompletionInTypeDef() throws Exception { + String code = + "struct A { int name; }; \n" + + "typedef struct A * PA; \n" + + "int main() { \n" + + " PA a; \n" + + " a->SP \n" + + "} \n"; + + int index = code.indexOf("SP"); //$NON-NLS-1$ + + IASTCompletionNode node = parse( code, index ); + assertNotNull( node ); + + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(1, bindings.length); + assertEquals("name", ((IField)bindings[0]).getName()); + } + + + public void _testCompletionFunctionCall() throws Exception { + String code = + "struct A { \n" + + " int f2; \n" + + " int f4; \n" + + "}; \n" + + "const A * foo(){} \n" + + "void main( ) \n" + + "{ \n" + + " foo()->SP \n"; + + int index = code.indexOf( "SP" ); + + IASTCompletionNode node = parse( code, index ); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(2, bindings.length); + assertEquals("f2", ((IField)bindings[0]).getName()); + assertEquals("f4", ((IField)bindings[1]).getName()); + } + + + public void _testCompletionSizeof() throws Exception { + String code = + "int f() {\n" + + "short blah;\n" + + "int x = sizeof(bl"; + + int index = code.indexOf( "of(bl" ); + + IASTCompletionNode node = parse( code, index + 5); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(1, bindings.length); + assertEquals("blah", ((IVariable)bindings[0]).getName()); + } + + + public void testCompletionForLoop() throws Exception { + String code = + "int f() {\n" + + " int biSizeImage = 5;\n" + + "for (int i = 0; i < bi "; + + int index = code.indexOf("< bi"); + + IASTCompletionNode node = parse( code, index + 4); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(1, bindings.length); + assertEquals("biSizeImage", ((IVariable)bindings[0]).getName()); + } + + + + public void testCompletionStructPointer() throws Exception { + String code = + " struct Temp { char * total; };" + + " int f(struct Temp * t) {" + + " t->t[5] = t->"; + + int index = code.indexOf("= t->"); + + IASTCompletionNode node = parse( code, index + 5); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(1, bindings.length); + assertEquals("total", ((IVariable)bindings[0]).getName()); + } + + + public void testCompletionEnum() throws Exception { + String code = + "typedef int DWORD;\n" + + "typedef char BYTE;\n" + + "#define MAKEFOURCC(ch0, ch1, ch2, ch3) \\\n" + + "((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \\\n" + + "((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))\n" + + "enum e {\n" + + "blah1 = 5,\n" + + "blah2 = MAKEFOURCC('a', 'b', 'c', 'd'),\n" + + "blah3\n" + + "};\n" + + "e mye = bl\n"; + + int index = code.indexOf("= bl"); + + IASTCompletionNode node = parse( code, index + 4); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(3, bindings.length); + assertEquals("blah1", ((IEnumerator)bindings[0]).getName()); + assertEquals("blah2", ((IEnumerator)bindings[1]).getName()); + assertEquals("blah3", ((IEnumerator)bindings[2]).getName()); + } + + + public void testCompletionStructArray() throws Exception { + String code = + "struct packet { int a; int b; };\n" + + "struct packet buffer[5];\n" + + "int main(int argc, char **argv) {\n" + + " buffer[2]."; + + int index = code.indexOf("[2]."); + + IASTCompletionNode node = parse( code, index + 4); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + IBinding[] bindings = getBindings(names); + + assertEquals(2, bindings.length); + assertEquals("a", ((IField)bindings[0]).getName()); + assertEquals("b", ((IField)bindings[1]).getName()); + } + + + public void testCompletionPreprocessorDirective() throws Exception { + IASTCompletionNode node = parse("#", 1); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + + //assertEquals("#", node.getPrefix()); + } + + public void testCompletionPreprocessorMacro() throws Exception { + String code = + "#define AMACRO 99 \n" + + "int main() { \n" + + " int AVAR; \n" + + " int x = A \n"; + + int index = code.indexOf("= A"); + + IASTCompletionNode node = parse( code, index + 3); + assertNotNull( node ); + + IASTName[] names = node.getNames(); + assertEquals(1, names.length); + assertEquals("A", node.getPrefix()); + } + + + public void testCompletionInsidePreprocessorDirective() throws Exception { + String code = + "#define MAC1 99 \n" + + "#define MAC2 99 \n" + + "#ifdef MA"; + + int index = code.length(); + + IASTCompletionNode node = parse( code, index ); + assertNotNull( node ); + + assertEquals("MA", node.getPrefix()); + } +} |