| /******************************************************************************* |
| * Copyright (c) 2013, 2016 Nathan Ridge. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Nathan Ridge - Initial implementation |
| *******************************************************************************/ |
| package org.eclipse.cdt.internal.index.tests; |
| |
| import org.eclipse.cdt.core.dom.ast.IField; |
| import org.eclipse.cdt.core.dom.ast.ITypedef; |
| import org.eclipse.cdt.core.testplugin.TestScannerProvider; |
| import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; |
| |
| import junit.framework.TestSuite; |
| |
| /** |
| * For testing resolution of bindings in C++ code with GNU extensions. |
| */ |
| public abstract class IndexGPPBindingResolutionTest extends IndexBindingResolutionTestBase { |
| |
| private static void gnuSetUp() { |
| TestScannerProvider.sDefinedSymbols.put("__GNUC__", Integer.toString(GCC_MAJOR_VERSION_FOR_TESTS)); |
| TestScannerProvider.sDefinedSymbols.put("__GNUC_MINOR__", Integer.toString(GCC_MINOR_VERSION_FOR_TESTS)); |
| } |
| |
| private static void gnuTearDown() { |
| TestScannerProvider.clear(); |
| } |
| |
| public class GPPReferencedProject extends ReferencedProject { |
| public GPPReferencedProject() { |
| super(true /* cpp */); |
| } |
| |
| @Override |
| public void setUp() throws Exception { |
| gnuSetUp(); |
| super.setUp(); |
| } |
| |
| @Override |
| public void tearDown() throws Exception { |
| super.tearDown(); |
| gnuTearDown(); |
| } |
| } |
| |
| public class GPPSinglePDOMTestStrategy extends SinglePDOMTestStrategy { |
| public GPPSinglePDOMTestStrategy() { |
| super(true /* cpp */); |
| } |
| |
| @Override |
| public void setUp() throws Exception { |
| gnuSetUp(); |
| super.setUp(); |
| } |
| |
| @Override |
| public void tearDown() throws Exception { |
| super.tearDown(); |
| gnuTearDown(); |
| } |
| } |
| |
| public static class SingleProjectTest extends IndexGPPBindingResolutionTest { |
| public SingleProjectTest() { |
| setStrategy(new GPPSinglePDOMTestStrategy()); |
| } |
| |
| public static TestSuite suite() { |
| return suite(SingleProjectTest.class); |
| } |
| } |
| |
| public static class ProjectWithDepProjTest extends IndexGPPBindingResolutionTest { |
| public ProjectWithDepProjTest() { |
| setStrategy(new GPPReferencedProject()); |
| } |
| |
| public static TestSuite suite() { |
| return suite(ProjectWithDepProjTest.class); |
| } |
| } |
| |
| public static void addTests(TestSuite suite) { |
| suite.addTest(SingleProjectTest.suite()); |
| suite.addTest(ProjectWithDepProjTest.suite()); |
| } |
| |
| // struct B { |
| // float f; |
| // }; |
| |
| // struct B b = { |
| // .f = 3.1 |
| // }; |
| public void testDesignatedInitializer() throws Exception { |
| IField f = getBindingFromASTName("f", 0); |
| } |
| |
| // template <typename T> |
| // struct underlying_type { |
| // typedef __underlying_type(T) type; |
| // }; |
| // |
| // enum class e_fixed_short1 : short; |
| // enum class e_fixed_short2 : short { a = 1, b = 2 }; |
| // |
| // enum class e_scoped { a = 1, b = 2 }; |
| // |
| // enum e_unsigned { a1 = 1, b1 = 2 }; |
| // enum e_int { a2 = -1, b2 = 1 }; |
| // enum e_ulong { a3 = 5000000000, b3 }; |
| // enum e_long { a4 = -5000000000, b4 = 5000000000 }; |
| |
| // typedef underlying_type<e_fixed_short1>::type short1_type; |
| // typedef underlying_type<e_fixed_short2>::type short2_type; |
| // |
| // typedef underlying_type<e_scoped>::type scoped_type; |
| // |
| // typedef underlying_type<e_unsigned>::type unsigned_type; |
| // typedef underlying_type<e_int>::type int_type; |
| // typedef underlying_type<e_ulong>::type ulong_type; |
| // typedef underlying_type<e_long>::type loong_type; |
| public void testUnderlyingTypeBuiltin_bug411196() throws Exception { |
| assertSameType((ITypedef) getBindingFromASTName("short1_type", 0), CPPBasicType.SHORT); |
| assertSameType((ITypedef) getBindingFromASTName("short2_type", 0), CPPBasicType.SHORT); |
| |
| assertSameType((ITypedef) getBindingFromASTName("scoped_type", 0), CPPBasicType.INT); |
| |
| assertSameType((ITypedef) getBindingFromASTName("unsigned_type", 0), CPPBasicType.UNSIGNED_INT); |
| assertSameType((ITypedef) getBindingFromASTName("int_type", 0), CPPBasicType.INT); |
| assertSameType((ITypedef) getBindingFromASTName("ulong_type", 0), CPPBasicType.UNSIGNED_LONG); |
| assertSameType((ITypedef) getBindingFromASTName("loong_type", 0), CPPBasicType.LONG); |
| } |
| } |