parent
8a0c7279dc
commit
d7fae300b9
test/unit/CBot
|
@ -455,7 +455,8 @@ CBotClass* CBotClass::Compile1(CBotToken* &p, CBotCStack* pStack)
|
||||||
std::string name = p->GetString();
|
std::string name = p->GetString();
|
||||||
|
|
||||||
CBotClass* pOld = CBotClass::Find(name);
|
CBotClass* pOld = CBotClass::Find(name);
|
||||||
if ( pOld != nullptr && pOld->m_IsDef )
|
if ( (pOld != nullptr && pOld->m_IsDef) || /* public class exists in different program */
|
||||||
|
pStack->GetProgram()->ClassExists(name)) /* class exists in this program */
|
||||||
{
|
{
|
||||||
pStack->SetError( CBotErrRedefClass, p );
|
pStack->SetError( CBotErrRedefClass, p );
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -489,14 +490,13 @@ CBotClass* CBotClass::Compile1(CBotToken* &p, CBotCStack* pStack)
|
||||||
}
|
}
|
||||||
|
|
||||||
int level = 1;
|
int level = 1;
|
||||||
do // skip over the definition
|
while (level > 0 && p != nullptr)
|
||||||
{
|
{
|
||||||
int type = p->GetType();
|
int type = p->GetType();
|
||||||
p = p->GetNext();
|
p = p->GetNext();
|
||||||
if (type == ID_OPBLK) level++;
|
if (type == ID_OPBLK) level++;
|
||||||
if (type == ID_CLBLK) level--;
|
if (type == ID_CLBLK) level--;
|
||||||
}
|
}
|
||||||
while (level > 0 && p != nullptr);
|
|
||||||
|
|
||||||
if (level > 0) pStack->SetError(CBotErrCloseBlock, classe->m_pOpenblk);
|
if (level > 0) pStack->SetError(CBotErrCloseBlock, classe->m_pOpenblk);
|
||||||
|
|
||||||
|
|
|
@ -281,6 +281,16 @@ const std::list<CBotFunction*>& CBotProgram::GetFunctions()
|
||||||
return m_functions;
|
return m_functions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CBotProgram::ClassExists(std::string name)
|
||||||
|
{
|
||||||
|
for (CBotClass* p : m_classes)
|
||||||
|
{
|
||||||
|
if ( p->GetName() == name ) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
CBotTypResult cSizeOf( CBotVar* &pVar, void* pUser )
|
CBotTypResult cSizeOf( CBotVar* &pVar, void* pUser )
|
||||||
{
|
{
|
||||||
|
|
|
@ -333,6 +333,12 @@ public:
|
||||||
*/
|
*/
|
||||||
const std::list<CBotFunction*>& GetFunctions();
|
const std::list<CBotFunction*>& GetFunctions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if class with that name was created in this program
|
||||||
|
* \return True if class was defined in this program, otherwise, false
|
||||||
|
*/
|
||||||
|
bool ClassExists(std::string name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Returns static list of all registered external calls
|
* \brief Returns static list of all registered external calls
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -932,8 +932,19 @@ TEST_F(CBotUT, ClassMethodRedefined)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Not only doesn't work but segfaults
|
TEST_F(CBotUT, ClassRedefinedInDifferentPrograms)
|
||||||
TEST_F(CBotUT, DISABLED_ClassRedefined)
|
{
|
||||||
|
auto publicProgram = ExecuteTest(
|
||||||
|
"public class TestClass {}\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
ExecuteTest(
|
||||||
|
"public class TestClass {}\n",
|
||||||
|
CBotErrRedefClass
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CBotUT, ClassRedefinedInOneProgram)
|
||||||
{
|
{
|
||||||
ExecuteTest(
|
ExecuteTest(
|
||||||
"public class TestClass {}\n"
|
"public class TestClass {}\n"
|
||||||
|
@ -942,6 +953,15 @@ TEST_F(CBotUT, DISABLED_ClassRedefined)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(CBotUT, ClassMissingCloseBlock)
|
||||||
|
{
|
||||||
|
ExecuteTest(
|
||||||
|
"public class Something\n"
|
||||||
|
"{\n",
|
||||||
|
CBotErrCloseBlock
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: NOOOOOO!!! Nononononono :/
|
// TODO: NOOOOOO!!! Nononononono :/
|
||||||
TEST_F(CBotUT, DISABLED_PublicClasses)
|
TEST_F(CBotUT, DISABLED_PublicClasses)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue