| /******************************************************************************* |
| * Copyright (c) 2006, 2008 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.c99.C99Language; |
| 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, getC99Language(), 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 getC99Language() { |
| return C99Language.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()); |
| } |
| } |