/*
* superclass.cpp
*
* Created on: 11 oct. 2013
* Author: Loic Oudot
*/
#include
#include
#include "java4cpp/java_classes.h"
#include "testsunit.h"
#include "superclass.h"
using namespace java4cpp::demos;
// SFINAE to detect presence of method baseMethod in a class
template
class has_baseMethod
{
struct Fallback { int baseMethod; };
struct Derived : T, Fallback { };
template struct Check;
typedef char ArrayOfOne[1];
typedef char ArrayOfTwo[2];
template
static ArrayOfOne & func(Check *);
template
static ArrayOfTwo & func(...);
public:
typedef has_baseMethod type;
static const bool value = sizeof(func(0)) == 2;
};
void allSuperclass()
{
std::cout << "================================" << std::endl;
std::cout << "Superclass" << std::endl;
std::cout << "================================" << std::endl;
superclass();
casting();
}
void superclass()
{
std::cout << "superclass: ";
assertThat(Baseclass().baseMethod()).isEqualTo(1);
assertThat(Baseclass().overridenMethod()).isEqualTo(2);
assertThat(Superclass().baseMethod()).isEqualTo(1);
assertThat(Superclass().overridenMethod()).isEqualTo(3);
assertThat(Superclass::WithSuperclass().baseMethod()).isEqualTo(1);
assertThat(Superclass::WithSuperclass().overridenMethod()).isEqualTo(4);
assertThat(Superclass::WithoutSuperclass().overridenMethod()).isEqualTo(5);
assertThat(has_baseMethod<:withsuperclass>::value).isTrue();
assertThat(has_baseMethod<:withoutsuperclass>::value).isFalse();
std::cout << "ok" << std::endl;
}
void casting()
{
std::cout << "casting: ";
Baseclass baseclass;
assertThat(dynamic_cast(&baseclass)).isNotNull();
Superclass superclass;
assertThat(dynamic_cast(&superclass)).isNotNull();
Superclass::WithSuperclass withSuperclass;
assertThat(dynamic_cast(&withSuperclass)).isNotNull();
Superclass::WithoutSuperclass withoutSuperclass;
assertThat(dynamic_cast(&withoutSuperclass)).isNull();
std::cout << "ok" << std::endl;
}