| 59 | }; |
| 60 | |
| 61 | bool TestVirtualMethod() |
| 62 | { |
| 63 | RET_ON_MAX_PORT |
| 64 | |
| 65 | bool fail = false; |
| 66 | int r; |
| 67 | |
| 68 | { |
| 69 | asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); |
| 70 | |
| 71 | r = engine->RegisterObjectType("class1", 0, asOBJ_REF | asOBJ_NOHANDLE); |
| 72 | r = engine->RegisterObjectMethod("class1", "void CallMe()", asMETHOD(CBase, CallMe), asCALL_THISCALL); |
| 73 | |
| 74 | // We must register the property as a pointer to the base class since |
| 75 | // all registered methods are taken from the base class. This is |
| 76 | // especially important when there is multiple or virtual inheritance |
| 77 | r = engine->RegisterGlobalProperty("class1 b", &b); |
| 78 | r = engine->RegisterGlobalProperty("class1 d", (CBase*)&d); |
| 79 | |
| 80 | COutStream out; |
| 81 | engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); |
| 82 | ExecuteString(engine, "b.CallMe(); d.CallMe();"); |
| 83 | |
| 84 | if( output1 != "CBase: CBase::CallMe()\nCDerived: CDerived::CallMe()\n" ) |
| 85 | { |
| 86 | PRINTF("%s: Virtual method calls failed.\n%s", TESTNAME, output1.c_str()); |
| 87 | TEST_FAILED; |
| 88 | } |
| 89 | |
| 90 | engine->Release(); |
| 91 | } |
| 92 | |
| 93 | { |
| 94 | asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); |
| 95 | |
| 96 | r = engine->RegisterObjectType("ref1", 0, asOBJ_REF); assert( r >= 0 ); |
| 97 | r = engine->RegisterObjectBehaviour("ref1", asBEHAVE_FACTORY, "ref1 @f()", asFUNCTION(CRefDerived1::Factory), asCALL_CDECL); assert( r >= 0 ); |
| 98 | r = engine->RegisterObjectBehaviour("ref1", asBEHAVE_ADDREF, "void f()", asMETHOD(CRefDerived1, AddRef), asCALL_THISCALL); assert( r >= 0 ); |
| 99 | r = engine->RegisterObjectBehaviour("ref1", asBEHAVE_RELEASE, "void f()", asMETHOD(CRefDerived1, Release), asCALL_THISCALL); assert( r >= 0 ); |
| 100 | |
| 101 | r = ExecuteString(engine, "ref1 r;"); |
| 102 | if( r != asEXECUTION_FINISHED ) |
| 103 | TEST_FAILED; |
| 104 | |
| 105 | engine->Release(); |
| 106 | } |
| 107 | |
| 108 | return fail; |
| 109 | } |
no test coverage detected