254 lines
6.6 KiB
C
254 lines
6.6 KiB
C
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||
|
//
|
||
|
// This program is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU Affero General Public License as
|
||
|
// published by the Free Software Foundation, either version 3 of the
|
||
|
// License, or (at your option) any later version.
|
||
|
//
|
||
|
// This program is distributed in the hope that it will be useful,
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
// GNU Affero General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU Affero General Public License
|
||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
#ifndef UT_MISC_COMMAND
|
||
|
#define UT_MISC_COMMAND
|
||
|
|
||
|
#include <nel/misc/command.h>
|
||
|
|
||
|
vector<string> callList;
|
||
|
|
||
|
class TTest : public NLMISC::ICommandsHandler
|
||
|
{
|
||
|
protected:
|
||
|
std::string _Name;
|
||
|
public:
|
||
|
const std::string &getCommandHandlerName() const
|
||
|
{
|
||
|
return _Name;
|
||
|
}
|
||
|
|
||
|
void setName(const std::string &name)
|
||
|
{
|
||
|
nlassert(_Name.empty());
|
||
|
_Name = name;
|
||
|
|
||
|
registerCommandsHandler();
|
||
|
}
|
||
|
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_BEGIN(TTest)
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTest, theCommand1, "help", "args")
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTest, theCommand2, "other help", "other args")
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_END
|
||
|
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(theCommand1)
|
||
|
{
|
||
|
callList.push_back(_Name+".theCommand1");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(theCommand2)
|
||
|
{
|
||
|
callList.push_back(_Name+".theCommand2");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
class TTestDerived : public TTest
|
||
|
{
|
||
|
public:
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_EXTEND_BEGIN(TTestDerived, TTest)
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTestDerived, derivedCommand, "help", "args")
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTestDerived, commandToOverride, "help", "args")
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_END
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(derivedCommand)
|
||
|
{
|
||
|
callList.push_back(_Name+".derivedCommand");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(commandToOverride)
|
||
|
{
|
||
|
callList.push_back(_Name+".commandToOverride");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
class TTestDerived2 : public TTestDerived
|
||
|
{
|
||
|
public:
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_EXTEND_BEGIN(TTestDerived2, TTestDerived)
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTestDerived2, derivedCommand2, "help", "args")
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTestDerived2, commandToOverride, "help", "args")
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_END
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(derivedCommand2)
|
||
|
{
|
||
|
callList.push_back(_Name+".derivedCommand2");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(commandToOverride)
|
||
|
{
|
||
|
callList.push_back(_Name+".command Overidden");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
class TTestDerived3 : public TTestDerived2
|
||
|
{
|
||
|
// empty class
|
||
|
};
|
||
|
|
||
|
class TTestDerived4 : public TTestDerived3
|
||
|
{
|
||
|
public:
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_EXTEND_BEGIN(TTestDerived4, TTestDerived3)
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTestDerived4, derivedCommand4, "help", "args")
|
||
|
NLMISC_COMMAND_HANDLER_ADD(TTestDerived4, theCommand1, "help", "args")
|
||
|
NLMISC_COMMAND_HANDLER_TABLE_END
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(derivedCommand4)
|
||
|
{
|
||
|
callList.push_back(_Name+".derivedCommand4");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
NLMISC_CLASS_COMMAND_DECL(theCommand1)
|
||
|
{
|
||
|
callList.push_back(_Name+".recallBase");
|
||
|
NLMISC_CLASS_COMMAND_CALL_BASE(TTestDerived3, theCommand1);
|
||
|
return true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
class CUTMiscCommand : public Test::Suite
|
||
|
{
|
||
|
TTest *t1;
|
||
|
TTest *t2;
|
||
|
public:
|
||
|
CUTMiscCommand()
|
||
|
{
|
||
|
TEST_ADD(CUTMiscCommand::createOneInstance);
|
||
|
TEST_ADD(CUTMiscCommand::createAnotherInstance);
|
||
|
TEST_ADD(CUTMiscCommand::deleteOneInstance);
|
||
|
TEST_ADD(CUTMiscCommand::derivedClass);
|
||
|
TEST_ADD(CUTMiscCommand::derivedClassAndBaseCall);
|
||
|
}
|
||
|
|
||
|
void derivedClassAndBaseCall()
|
||
|
{
|
||
|
TTestDerived4 t4;
|
||
|
t4.setName("T4");
|
||
|
|
||
|
callList.clear();
|
||
|
|
||
|
NLMISC::ICommand::execute("T4.derivedCommand4", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 1);
|
||
|
TEST_ASSERT(callList[0] == "T4.derivedCommand4");
|
||
|
|
||
|
NLMISC::ICommand::execute("T4.theCommand1", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 3);
|
||
|
TEST_ASSERT(callList[1] == "T4.recallBase");
|
||
|
TEST_ASSERT(callList[2] == "T4.theCommand1");
|
||
|
}
|
||
|
|
||
|
void derivedClass()
|
||
|
{
|
||
|
TTestDerived t1;
|
||
|
t1.setName("T1");
|
||
|
TTestDerived2 t2;
|
||
|
t2.setName("T2");
|
||
|
|
||
|
callList.clear();
|
||
|
|
||
|
NLMISC::ICommand::execute("T1.theCommand1", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 1);
|
||
|
TEST_ASSERT(callList[0] == "T1.theCommand1");
|
||
|
|
||
|
NLMISC::ICommand::execute("T1.derivedCommand", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 2);
|
||
|
TEST_ASSERT(callList[1] == "T1.derivedCommand");
|
||
|
|
||
|
NLMISC::ICommand::execute("T1.commandToOverride", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 3);
|
||
|
TEST_ASSERT(callList[2] == "T1.commandToOverride");
|
||
|
|
||
|
|
||
|
NLMISC::ICommand::execute("T2.theCommand1", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 4);
|
||
|
TEST_ASSERT(callList[3] == "T2.theCommand1");
|
||
|
|
||
|
NLMISC::ICommand::execute("T2.derivedCommand", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 5);
|
||
|
TEST_ASSERT(callList[4] == "T2.derivedCommand");
|
||
|
|
||
|
NLMISC::ICommand::execute("T2.commandToOverride", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 6);
|
||
|
TEST_ASSERT(callList[5] == "T2.command Overidden");
|
||
|
}
|
||
|
|
||
|
|
||
|
void createOneInstance()
|
||
|
{
|
||
|
t1 = new TTest;
|
||
|
t1->setName("inst1");
|
||
|
|
||
|
TEST_ASSERT(callList.empty());
|
||
|
|
||
|
NLMISC::ICommand::execute("inst1.theCommand1", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 1);
|
||
|
TEST_ASSERT(callList[0] == "inst1.theCommand1");
|
||
|
|
||
|
NLMISC::ICommand::execute("inst1.theCommand2", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 2);
|
||
|
TEST_ASSERT(callList[0] == "inst1.theCommand1");
|
||
|
TEST_ASSERT(callList[1] == "inst1.theCommand2");
|
||
|
}
|
||
|
|
||
|
void createAnotherInstance()
|
||
|
{
|
||
|
t2 = new TTest;
|
||
|
t2->setName("inst2");
|
||
|
|
||
|
TEST_ASSERT(callList.size() == 2);
|
||
|
|
||
|
NLMISC::ICommand::execute("inst2.theCommand1", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 3);
|
||
|
TEST_ASSERT(callList[0] == "inst1.theCommand1");
|
||
|
TEST_ASSERT(callList[1] == "inst1.theCommand2");
|
||
|
TEST_ASSERT(callList[2] == "inst2.theCommand1");
|
||
|
|
||
|
NLMISC::ICommand::execute("inst2.theCommand2", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 4);
|
||
|
TEST_ASSERT(callList[0] == "inst1.theCommand1");
|
||
|
TEST_ASSERT(callList[1] == "inst1.theCommand2");
|
||
|
TEST_ASSERT(callList[2] == "inst2.theCommand1");
|
||
|
TEST_ASSERT(callList[3] == "inst2.theCommand2");
|
||
|
}
|
||
|
|
||
|
void deleteOneInstance()
|
||
|
{
|
||
|
delete t1;
|
||
|
|
||
|
NLMISC::ICommand::execute("inst1.theCommand2", *NLMISC::InfoLog);
|
||
|
TEST_ASSERT(callList.size() == 4);
|
||
|
TEST_ASSERT(callList[0] == "inst1.theCommand1");
|
||
|
TEST_ASSERT(callList[1] == "inst1.theCommand2");
|
||
|
TEST_ASSERT(callList[2] == "inst2.theCommand1");
|
||
|
TEST_ASSERT(callList[3] == "inst2.theCommand2");
|
||
|
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|