#include #include #include "util/Exception.h" #include "core/Core.h" #include "core/CoreIncludes.h" #include "core/module/PluginReference.h" #include "core/commandline/CommandLineParser.h" #include "core/command/ConsoleCommand.h" #include "core/command/ConsoleCommandManager.h" #include "Testclass.h" #include "Testsingleton.h" namespace orxonox { namespace { // Fixture class PluginTest : public ::testing::Test { public: static void SetUpTestCase() { new Core("--noIOConsole"); } static void TearDownTestCase() { delete &Core::getInstance(); } }; } PluginReference* loadPlugin() { return new PluginReference("testplugin"); } TEST_F(PluginTest, CanLoadPlugin) { PluginReference* plugin = loadPlugin(); delete plugin; } /////////////////////////////////////////// /////////////// Identifier //////////////// /////////////////////////////////////////// Identifier* getIdentifier() { return ClassByString("Testclass"); } TEST_F(PluginTest, LoadsIdentifier) { EXPECT_TRUE(getIdentifier() == NULL); PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getIdentifier() != NULL); delete plugin; } TEST_F(PluginTest, UnloadsIdentifier) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getIdentifier() != NULL); delete plugin; EXPECT_TRUE(getIdentifier() == NULL); } TEST_F(PluginTest, ReloadsIdentifier) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getIdentifier() != NULL); delete plugin; EXPECT_TRUE(getIdentifier() == NULL); plugin = loadPlugin(); EXPECT_TRUE(getIdentifier() != NULL); delete plugin; } TEST_F(PluginTest, CanCreateObjectFromIdentifier) { PluginReference* plugin = loadPlugin(); Identifier* identifier = getIdentifier(); ASSERT_TRUE(identifier != NULL); Identifiable* object = identifier->fabricate(NULL); ASSERT_TRUE(object != NULL); Testclass* testclass = orxonox_cast(object); ASSERT_TRUE(testclass != NULL); EXPECT_EQ(666, testclass->getValue()); delete plugin; } /////////////////////////////////////////// //////////////// Singleton //////////////// /////////////////////////////////////////// // Cannot directly use Testsingleton::getInstance() because we don't link the test to the plugin. // Also cannot directly use ObjectList because the Identifier is not known before the plugin is loaded. Testsingleton* getSingleton() { std::vector singletons; for (ObjectList::iterator it = ObjectList::begin(); it; ++it) { Testsingleton* singleton = dynamic_cast(*it); if (singleton) singletons.push_back(singleton); } switch (singletons.size()) { case 0: return NULL; case 1: return singletons[0]; default: throw std::exception(); // unexpected number of singletons found } } TEST_F(PluginTest, LoadsSingleton) { EXPECT_TRUE(getSingleton() == NULL); PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getSingleton() != NULL); delete plugin; } TEST_F(PluginTest, UnloadsSingleton) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getSingleton() != NULL); delete plugin; EXPECT_TRUE(getSingleton() == NULL); } TEST_F(PluginTest, ReloadsSingleton) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getSingleton() != NULL); delete plugin; EXPECT_TRUE(getSingleton() == NULL); plugin = loadPlugin(); EXPECT_TRUE(getSingleton() != NULL); delete plugin; } TEST_F(PluginTest, CanCallFunctionOnSingleton) { PluginReference* plugin = loadPlugin(); Testsingleton* singleton = getSingleton(); ASSERT_TRUE(singleton != NULL); EXPECT_EQ(999, singleton->getValue()); delete plugin; } /////////////////////////////////////////// ////////// Command Line Argument ////////// /////////////////////////////////////////// bool hasCommandLineArgument() { try { CommandLineParser::getValue("testvalue"); return true; } catch (const ArgumentException&) { return false; } } TEST_F(PluginTest, LoadsCommandLineArgument) { EXPECT_FALSE(hasCommandLineArgument()); PluginReference* plugin = loadPlugin(); EXPECT_TRUE(hasCommandLineArgument()); delete plugin; } TEST_F(PluginTest, UnloadsCommandLineArgument) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(hasCommandLineArgument()); delete plugin; EXPECT_FALSE(hasCommandLineArgument()); } TEST_F(PluginTest, ReloadsCommandLineArgument) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(hasCommandLineArgument()); delete plugin; EXPECT_FALSE(hasCommandLineArgument()); plugin = loadPlugin(); EXPECT_TRUE(hasCommandLineArgument()); delete plugin; } TEST_F(PluginTest, CommandLineArgumentHasCorrectValue) { PluginReference* plugin = loadPlugin(); ASSERT_TRUE(hasCommandLineArgument()); EXPECT_EQ(333, CommandLineParser::getValue("testvalue").get()); delete plugin; } /////////////////////////////////////////// ///////////// Console Command ///////////// /////////////////////////////////////////// ConsoleCommand* getConsoleCommand() { return ConsoleCommandManager::getInstance().getCommand("testcommand"); } TEST_F(PluginTest, LoadsConsoleCommand) { EXPECT_TRUE(getConsoleCommand() == NULL); PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getConsoleCommand() != NULL); delete plugin; } TEST_F(PluginTest, UnloadsConsoleCommand) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getConsoleCommand() != NULL); delete plugin; EXPECT_TRUE(getConsoleCommand() == NULL); } TEST_F(PluginTest, ReloadsConsoleCommand) { PluginReference* plugin = loadPlugin(); EXPECT_TRUE(getConsoleCommand() != NULL); delete plugin; EXPECT_TRUE(getConsoleCommand() == NULL); plugin = loadPlugin(); EXPECT_TRUE(getConsoleCommand() != NULL); delete plugin; } TEST_F(PluginTest, CanCallConsoleCommand) { PluginReference* plugin = loadPlugin(); ConsoleCommand* command = getConsoleCommand(); ASSERT_TRUE(command != NULL); EXPECT_EQ(999, (*command->getExecutor())(333, 666).get()); delete plugin; } }