/*******************************************************************************
* Copyright (c) 2011 Anton Gorenkov
* 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:
* Anton Gorenkov - initial implementation
*******************************************************************************/
package org.eclipse.cdt.codan.core.internal.checkers;
import org.eclipse.cdt.codan.core.test.CheckerTestCase;
import org.eclipse.cdt.codan.internal.checkers.AbstractClassInstantiationChecker;
/**
* Test for {@see AbstractClassInstantiationChecker} class
*
*/
public class AbstractClassInstantiationCheckerTest extends CheckerTestCase {
@Override
public boolean isCpp() {
return true;
}
@Override
public void setUp() throws Exception {
super.setUp();
enableProblems(AbstractClassInstantiationChecker.ER_ID);
}
// class C {
// virtual void f() {}
// };
// void scope () {
// C c; // No errors.
// }
public void testNotAbstractClassCreationOnStack() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// class C {
// virtual void f() {}
// };
// void scope () {
// C* c = new C(); // No errors.
// }
public void testNotAbstractClassCreationWithNew() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// class C {
// virtual void f() {}
// };
// void scope () {
// C::C(); // No errors.
// }
public void testNotAbstractClassCreationWithDirectConstructorCall() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// class C {
// virtual void f() = 0;
// };
// void scope () {
// C* c1; // No errors.
// C& c2; // No errors.
// }
public void testAbstractClassPointerOrReverenceDeclaration() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// class C {
// virtual void f() = 0;
// };
// typedef C typedefC;
// void scope () {
// C c; // 1 error for: C::f().
// typedefC tc; // 1 error for: C::f().
// }
public void testAbstractClassCreationOnStack() {
loadCodeAndRun(getAboveComment());
checkErrorLines(6, 7);
}
// class C {
// virtual void f() = 0;
// };
// typedef C typedefC;
// void scope () {
// C *c1, c2, &c3; // 1 error for: C::f().
// typedefC *tc1, tc2, &tc3; // 1 error for: C::f().
// }
public void testAbstractClassCreationOnStackWithRefAndPtr() {
loadCodeAndRun(getAboveComment());
checkErrorLines(6, 7);
}
// class C {
// virtual void f() = 0;
// };
// typedef C typedefC;
// void test ( C _c ) {} // 1 error for: C::f().
// void test2 ( typedefC _c ) {} // 1 error for: C::f().
// void test3 ( C _c, typedefC _c ) {} // 2 errors for: C::f(), C::f().
// void test4 ( C ) {} // 1 error for: C::f().
// void test5 ( C* _c ) {} // No errors.
// void test6 ( typedefC& _c ) {} // No errors.
public void testAbstractClassCreationAsFunctionParameter() {
loadCodeAndRun(getAboveComment());
checkErrorLines(5, 6, 7, 7, 8);
}
// class C {
// virtual void f() = 0;
// };
// template <typename C> // No errors.
// void test () {}
public void testAbstractClassCreationAsFunctionTemplateParameter() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// class C {
// virtual void f() = 0;
// };
// typedef C typedefC;
// void scope () {
// C* c1 = new C(); // 1 error for: C::f().
// C* c2 = new C[10]; // 1 error for: C::f().
// C* c3 = new typedefC(); // 1 error for: C::f().
// C* c4 = new typedefC; // 1 error for: C::f().
// C* c5 (new C()); // 1 error for: C::f().
// C* c6 (new typedefC()); // 1 error for: C::f().
// C* c7 = new typedefC[10]; // 1 error for: C::f().
// C** x1 = new C*(); // No errors.
// typedefC** x2 = new typedefC*(); // No errors.
// }
public void testAbstractClassCreationWithNew() {
loadCodeAndRun(getAboveComment());
checkErrorLines(6, 7, 8, 9, 10, 11, 12);
}
// class C {
// virtual void f() = 0;
// };
// typedef C typedefC;
// void scope () {
// C::C(); // 1 error for: C::f().
// typedefC::C(); // 1 error for: C::f().
// }
public void testAbstractClassCreationWithDirectConstructorCall() {
loadCodeAndRun(getAboveComment());
checkErrorLines(6, 7);
}
// namespace N {
// class C {
// virtual void f() = 0;
// };
// }
// void scope () {
// N::C* c = new N::C(); // 1 error for: N::C::f().
// }
public void testAbstractClassFromNamespace() {
loadCodeAndRun(getAboveComment());
checkErrorLines(7);
}
// class C {
// virtual void f() = 0;
// virtual int g() const = 0;
// };
// void scope () {
// C* c = new C(); // 2 errors for: C::f(), C::g().
// }
public void testAbstractClassWithAFewVirtualMethods() {
loadCodeAndRun(getAboveComment());
checkErrorLines(6, 6);
}
// class Base {
// virtual void f() = 0;
// };
// class Derived : public Base {
// };
// void scope () {
// Derived* d = new Derived(); // 1 error for: Base::f().
// }
public void testAbstractClassBecauseOfBaseClass() {
loadCodeAndRun(getAboveComment());
checkErrorLines(7);
}
// class Base {
// virtual void f() = 0;
// virtual int g() const = 0;
// };
// class Derived : public Base {
// virtual int g() const = 0;
// };
// void scope () {
// Derived* c = new Derived(); // 2 errors for: Base::f(), Derived::g().
// }
public void testAbstractClassWithVirtualRedefinition() {
loadCodeAndRun(getAboveComment());
checkErrorLines(9, 9);
}
// class C {
// virtual void f() = 0;
// };
// typedef C typedefC; // No errors.
public void testAbstractClassTypedef() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// class C {
// virtual void f() = 0;
// };
// extern C typedefC; // 1 error for: C::f().
public void testExternAbstractClassDeclaration() {
loadCodeAndRun(getAboveComment());
checkErrorLines(4);
}
// class A {
// public:
// virtual ~A() = 0;
// };
//
// class B : public A {
// public:
// virtual ~B() {}
// };
//
// B b;
public void testPureVirtualDestructorOverride_1() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// class A {
// public:
// virtual ~A() = 0;
// };
//
// class B : public A {
// };
//
// B b;
public void testPureVirtualDestructorOverride_2() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
}