diff options
author | Andrew Ferguson | 2007-03-29 16:44:32 +0000 |
---|---|---|
committer | Andrew Ferguson | 2007-03-29 16:44:32 +0000 |
commit | 35ca14c0472da095411c69f91c3f9e07c9d9dc91 (patch) | |
tree | e4a50b85d4c615cc019dfbd0f6152a2f45c82307 | |
parent | 7b9a5bdfa384bc3a610ce382759aa3784d0646d0 (diff) | |
download | org.eclipse.cdt-35ca14c0472da095411c69f91c3f9e07c9d9dc91.tar.gz org.eclipse.cdt-35ca14c0472da095411c69f91c3f9e07c9d9dc91.tar.xz org.eclipse.cdt-35ca14c0472da095411c69f91c3f9e07c9d9dc91.zip |
add some initial class template unit tests
-rw-r--r-- | core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPClassTemplateTests.java | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPClassTemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPClassTemplateTests.java new file mode 100644 index 00000000000..dcf1c4edacd --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPClassTemplateTests.java @@ -0,0 +1,269 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems 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: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.pdom.tests; + +import java.util.Arrays; + +import junit.framework.Test; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.IPDOMManager; +import org.eclipse.cdt.core.dom.ast.IBasicType; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.core.testplugin.CProjectHelper; +import org.eclipse.cdt.core.testplugin.CTestPlugin; +import org.eclipse.cdt.core.testplugin.util.TestSourceReader; +import org.eclipse.cdt.internal.core.CCoreInternals; +import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; +import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Path; + +/** + * Tests PDOM class template related bindings + */ +public class CPPClassTemplateTests extends PDOMTestBase { + protected PDOM pdom; + protected ICProject cproject; + + public static Test suite() { + return suite(CPPClassTemplateTests.class); + } + + public void setUp() throws Exception { + cproject= CProjectHelper.createCCProject("classTemplateTests"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); + } + + protected void setUpSpecifics(int sections) throws Exception { + StringBuffer[] contents= TestSourceReader.getContentsForTest( + CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections); + for(int i=0; i<contents.length; i++) { + IFile file= TestSourceReader.createFile(cproject.getProject(), new Path("refs.cpp"), contents[i].toString()); + } + IndexerPreferences.set(cproject.getProject(), IndexerPreferences.KEY_INDEX_ALL_FILES, "true"); + IndexerPreferences.set(cproject.getProject(), IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_FAST_INDEXER); + CCorePlugin.getIndexManager().reindex(cproject); + assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); + pdom= (PDOM) CCoreInternals.getPDOMManager().getPDOM(cproject); + } + + protected void tearDown() throws Exception { + if(pdom!=null) { + pdom.releaseWriteLock(); + } + cproject.getProject().delete(true, NPM); + } + + /*************************************************************************/ + + // template<typename C> + // class D { + // public: + // int foo(C c) {return 1}; + // }; + public void testSimpleDefinition() throws Exception { + setUpSpecifics(1); + assertDeclarationCount(pdom, "D", 1); + IIndexFragmentBinding[] b= pdom.findBindings(new char[][] {{'D'}}, IndexFilter.ALL, NPM); + assertEquals(1, b.length); + assertTrue(b[0] instanceof ICPPClassTemplate); + ICPPClassTemplate ct= (ICPPClassTemplate) b[0]; + ICPPTemplateParameter[] tp= ct.getTemplateParameters(); + assertEquals(1, tp.length); + assertTrue(tp[0] instanceof ICPPTemplateTypeParameter); + ICPPTemplateTypeParameter ctp= (ICPPTemplateTypeParameter) tp[0]; + assertNull(ctp.getDefault()); + assertEquals(0, ct.getPartialSpecializations().length); + } + + // template<class C=char> /* typename and class are equivalent in template parameter context */ + // class D { + // public: + // int foo(C c) {return 1}; + // }; + public void testDefinition() throws Exception { + setUpSpecifics(1); + assertDeclarationCount(pdom, "D", 1); + IIndexFragmentBinding[] b= pdom.findBindings(new char[][] {{'D'}}, IndexFilter.ALL, NPM); + assertEquals(1, b.length); + assertTrue(b[0] instanceof ICPPClassTemplate); + ICPPClassTemplate ct= (ICPPClassTemplate) b[0]; + ICPPTemplateParameter[] tp= ct.getTemplateParameters(); + assertEquals(1, tp.length); + assertTrue(tp[0] instanceof ICPPTemplateTypeParameter); + assertEquals("C", tp[0].getName()); + assertEquals(new String[] {"D","C"}, tp[0].getQualifiedName()); + assertEquals(new char[][] {{'D'},{'C'}}, tp[0].getQualifiedNameCharArray()); + ICPPTemplateTypeParameter ctp= (ICPPTemplateTypeParameter) tp[0]; + IType def= ctp.getDefault(); + assertTrue(def instanceof IBasicType); + assertEquals(0, ct.getPartialSpecializations().length); + } + + // class TA {}; + // class TC {}; + // + // template<typename A= TA, typename B, typename C=TC> + // class E { + // public: + // int foo(C c, B b, A a) {return 1}; + // }; + public void testDefinition2() throws Exception { + setUpSpecifics(1); + assertDeclarationCount(pdom, "E", 1); + IIndexFragmentBinding[] b= pdom.findBindings(new char[][] {{'E'}}, IndexFilter.ALL, NPM); + assertEquals(1, b.length); + assertTrue(b[0] instanceof ICPPClassTemplate); + ICPPClassTemplate ct= (ICPPClassTemplate) b[0]; + ICPPTemplateParameter[] tp= ct.getTemplateParameters(); + assertEquals(3, tp.length); + + assertTrue(tp[0] instanceof ICPPTemplateTypeParameter); + assertEquals("A", tp[0].getName()); + assertEquals(new String[] {"E","A"}, tp[0].getQualifiedName()); + assertEquals(new char[][] {{'E'},{'A'}}, tp[0].getQualifiedNameCharArray()); + ICPPTemplateTypeParameter ctpa= (ICPPTemplateTypeParameter) tp[0]; + IType defa= ctpa.getDefault(); + assertTrue(defa instanceof ICPPClassType); + ICPPClassType ctdefa= (ICPPClassType) defa; + assertEquals(new char[][] {{'T','A'}}, ctdefa.getQualifiedNameCharArray()); + + assertTrue(tp[1] instanceof ICPPTemplateTypeParameter); + assertEquals("B", tp[1].getName()); + assertEquals(new String[] {"E","B"}, tp[1].getQualifiedName()); + assertEquals(new char[][] {{'E'},{'B'}}, tp[1].getQualifiedNameCharArray()); + ICPPTemplateTypeParameter ctpb= (ICPPTemplateTypeParameter) tp[1]; + IType defb= ctpb.getDefault(); + assertNull(defb); + + assertTrue(tp[2] instanceof ICPPTemplateTypeParameter); + assertEquals("C", tp[2].getName()); + assertEquals(new String[] {"E","C"}, tp[2].getQualifiedName()); + assertEquals(new char[][] {{'E'},{'C'}}, tp[2].getQualifiedNameCharArray()); + ICPPTemplateTypeParameter ctpc= (ICPPTemplateTypeParameter) tp[2]; + IType defc= ctpc.getDefault(); + assertTrue(defc instanceof ICPPClassType); + ICPPClassType ctdefc= (ICPPClassType) defc; + assertEquals(new char[][] {{'T','C'}}, ctdefc.getQualifiedNameCharArray()); + + assertEquals(0, ct.getPartialSpecializations().length); + } + + + // template<typename C> + // class D { + // public: + // int foo(C c) {return 1}; + // }; + // + // class N {}; + // + // template<> + // class D<N> { + // public: + // int foo(N n) {return 2;} + // }; + // + // D<N> dn; + // D<int> dint; + public void testExplicitInstantiation() throws Exception { + setUpSpecifics(1); + + { + // template + IIndexFragmentBinding[] b= pdom.findBindings(new char[][] {{'D'}}, IndexFilter.ALL, NPM); + assertEquals(2, b.length); + assertTrue(!(b[0] instanceof ICPPClassTemplate) || !(b[1] instanceof ICPPClassTemplate)); + int i= b[0] instanceof ICPPClassTemplate ? 0 : 1; + + assertInstance(b[i], ICPPClassTemplate.class); + ICPPClassTemplate ct= (ICPPClassTemplate) b[i]; + ICPPTemplateParameter[] tp= ct.getTemplateParameters(); + assertEquals(1, tp.length); + assertInstance(tp[i], ICPPTemplateTypeParameter.class); + ICPPTemplateTypeParameter ctp= (ICPPTemplateTypeParameter) tp[i]; + assertNull(ctp.getDefault()); + } + + { + assertDeclarationCount(pdom, "dn", 1); + IIndexFragmentBinding[] b= pdom.findBindings(new char[][] {"dn".toCharArray()}, IndexFilter.ALL, NPM); + assertEquals(1, b.length); + assertInstance(b[0], ICPPVariable.class); + ICPPVariable var= (ICPPVariable) b[0]; + assertInstance(var.getType(), ICPPClassType.class); + assertInstance(var.getType(), ICPPSpecialization.class); + ICPPSpecialization cp= (ICPPSpecialization) var.getType(); + ObjectMap m= cp.getArgumentMap(); + assertEquals(1, m.size()); + Object key= m.keyAt(0), val= m.get(key); + assertInstance(key, ICPPTemplateTypeParameter.class); + assertInstance(val, ICPPClassType.class); + assertEquals(new String[] {"D","C"}, ((ICPPTemplateTypeParameter)key).getQualifiedName()); + assertEquals(new String[] {"N"}, ((ICPPClassType)val).getQualifiedName()); + } + + { + assertDeclarationCount(pdom, "dint", 1); + IIndexFragmentBinding[] b= pdom.findBindings(new char[][] {"dint".toCharArray()}, IndexFilter.ALL, NPM); + assertEquals(1, b.length); + assertTrue(b[0] instanceof ICPPVariable); + ICPPVariable var= (ICPPVariable) b[0]; + assertInstance(var.getType(), ICPPClassType.class); + assertInstance(var.getType(), ICPPSpecialization.class); + ICPPSpecialization cp= (ICPPSpecialization) var.getType(); + ObjectMap m= cp.getArgumentMap(); + assertEquals(1, m.size()); + Object key= m.keyAt(0), val= m.get(key); + assertInstance(key, ICPPTemplateTypeParameter.class); + assertInstance(val, IBasicType.class); + assertEquals(new String[] {"D","C"}, ((ICPPTemplateTypeParameter)key).getQualifiedName()); + assertEquals(IBasicType.t_int, ((IBasicType)val).getType()); + + } + } + + protected void assertInstance(Object o, Class c) { + assertNotNull(o); + assertTrue("Expected "+c.getName()+" but got "+o.getClass().getName(), c.isInstance(o)); + } + + protected void assertEquals(char[] c1, char[] c2) { + assertTrue(Arrays.equals(c1, c2)); + } + + protected void assertEquals(String[] s1, String[] s2) { + assertTrue(Arrays.equals(s1, s2)); + } + + protected void assertEquals(char[][] c1, char[][] c2) { + if(c1==null || c2==null) { + assertTrue(c1==c2); + return; + } + + assertEquals(c1.length, c2.length); + for(int i=0; i<c1.length; i++) { + assertEquals(c1[i], c2[i]); + } + } +} |