using System;
public class TestCasts
{
private BaseClass baseClass = new BaseClass();
private DerivedClass derivedClass = new DerivedClass();
public TestCasts() {}
public int runTests()
{
if (TestSimpleCasts() < 0)
return -1;
if (TestSimpleInterfaceCasts() < 0)
return -2;
if (TestSimpleBoxingUnboxing() < 0)
return -3;
if (TestAdvancedBoxingUnboxing() < 0)
return -4;
return 0;
}
public int TestSimpleCasts()
{
int res = 0;
if (10 != baseClass.getNum(10))
res -= 1;
if (11 != derivedClass.getNum(10))
res -= 1;
//test allowed cast
try {
BaseClass castedDerivedClass = derivedClass;
if (castedDerivedClass.getNum(10) != 11)
res -= 1;
} catch (Exception) {
res -= 1;
}
//test not allowed cast
try {
DerivedClass castedBaseClass = (DerivedClass) baseClass;
res -= 1;
} catch (Exception) {
}
return res;
}
public int TestSimpleInterfaceCasts()
{
int res = 0;
//test not allowed cast
try {
INum num = (INum) baseClass;
res -= 1;
} catch (Exception) {
}
//test allowed cast
try {
INum num = derivedClass;
if (num.getNum() != 666)
res -= 1;
} catch (Exception) {
res -= 1;
}
return res;
}
public int TestSimpleBoxingUnboxing()
{
int res = 0;
int i = 100;
object box = i;
//boxing
if (box is int) {} else
res -= 1;
//unboxing
int j = (int) box;
if (100 != j)
res -= 1;
return res;
}
public int TestAdvancedBoxingUnboxing()
{
int res = 0;
//simple object test
//boxing
object box = baseClass;
if (box is BaseClass) {} else
res -= 1;
//unboxing
BaseClass newBaseClass = (BaseClass) box;
if (10 != newBaseClass.getNum(10))
res -= 1;
//advanced object test
//boxing
box = derivedClass;
if (box is DerivedClass) {} else
res -= 1;
if (box is BaseClass) {} else
res -= 1;
//unboxing
newBaseClass = (BaseClass) box;
if (11 != newBaseClass.getNum(10))
res -= 1;
DerivedClass newDerivedClass = (DerivedClass) box;
if (11 != newDerivedClass.getNum(10))
res -= 1;
return res;
}
}
//-----------------
//class definitions
//-----------------
public class BaseClass
{
public BaseClass()
{
}
public virtual int getNum(int num)
{
return num;
}
}
public class DerivedClass : BaseClass, INum
{
public DerivedClass()
{
}
// overridden method from base class
public override int getNum(int num)
{
return num + 1;
}
// method from interface
public int getNum()
{
return 666;
}
}
//---------------------
//interface definitions
//---------------------
public interface INum
{
int getNum();
}