forked from teamnwah/openmw-tes3coop
Tests: add dialogue_merging_test (requires some data files)
parent
d0d8c2eded
commit
38c155c579
@ -0,0 +1,172 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <boost/filesystem/fstream.hpp>
|
||||
|
||||
#include <components/files/configurationmanager.hpp>
|
||||
#include <components/esm/esmreader.hpp>
|
||||
#include <components/loadinglistener/loadinglistener.hpp>
|
||||
|
||||
#include "apps/openmw/mwworld/esmstore.hpp"
|
||||
|
||||
/// Base class for tests of ESMStore that rely on external content files to produce the test data
|
||||
struct ContentFileTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
readContentFiles();
|
||||
|
||||
// load the content files
|
||||
std::vector<ESM::ESMReader> readerList;
|
||||
readerList.resize(mContentFiles.size());
|
||||
|
||||
int index=0;
|
||||
for (std::vector<boost::filesystem::path>::const_iterator it = mContentFiles.begin(); it != mContentFiles.end(); ++it)
|
||||
{
|
||||
ESM::ESMReader lEsm;
|
||||
lEsm.setEncoder(NULL);
|
||||
lEsm.setIndex(index);
|
||||
lEsm.setGlobalReaderList(&readerList);
|
||||
lEsm.open(it->string());
|
||||
readerList[index] = lEsm;
|
||||
std::auto_ptr<Loading::Listener> listener;
|
||||
listener.reset(new Loading::Listener);
|
||||
mEsmStore.load(readerList[index], listener.get());
|
||||
|
||||
++index;
|
||||
}
|
||||
|
||||
mEsmStore.setUp();
|
||||
}
|
||||
|
||||
virtual void TearDown()
|
||||
{
|
||||
}
|
||||
|
||||
// read absolute path to content files from openmw.cfg
|
||||
void readContentFiles()
|
||||
{
|
||||
boost::program_options::variables_map variables;
|
||||
|
||||
boost::program_options::options_description desc("Allowed options");
|
||||
desc.add_options()
|
||||
("data", boost::program_options::value<Files::PathContainer>()->default_value(Files::PathContainer(), "data")->multitoken()->composing())
|
||||
("content", boost::program_options::value<std::vector<std::string> >()->default_value(std::vector<std::string>(), "")
|
||||
->multitoken(), "content file(s): esm/esp, or omwgame/omwaddon")
|
||||
("data-local", boost::program_options::value<std::string>()->default_value(""));
|
||||
|
||||
boost::program_options::notify(variables);
|
||||
|
||||
mConfigurationManager.readConfiguration(variables, desc, true);
|
||||
|
||||
Files::PathContainer dataDirs, dataLocal;
|
||||
if (!variables["data"].empty()) {
|
||||
dataDirs = Files::PathContainer(variables["data"].as<Files::PathContainer>());
|
||||
}
|
||||
|
||||
std::string local = variables["data-local"].as<std::string>();
|
||||
if (!local.empty()) {
|
||||
dataLocal.push_back(Files::PathContainer::value_type(local));
|
||||
}
|
||||
|
||||
mConfigurationManager.processPaths (dataDirs);
|
||||
mConfigurationManager.processPaths (dataLocal, true);
|
||||
|
||||
if (!dataLocal.empty())
|
||||
dataDirs.insert (dataDirs.end(), dataLocal.begin(), dataLocal.end());
|
||||
|
||||
Files::Collections collections (dataDirs, true);
|
||||
|
||||
std::vector<std::string> contentFiles = variables["content"].as<std::vector<std::string> >();
|
||||
for (std::vector<std::string>::iterator it = contentFiles.begin(); it != contentFiles.end(); ++it)
|
||||
mContentFiles.push_back(collections.getPath(*it));
|
||||
}
|
||||
|
||||
protected:
|
||||
Files::ConfigurationManager mConfigurationManager;
|
||||
MWWorld::ESMStore mEsmStore;
|
||||
std::vector<boost::filesystem::path> mContentFiles;
|
||||
};
|
||||
|
||||
/// Print results of the dialogue merging process, i.e. the resulting linked list.
|
||||
TEST_F(ContentFileTest, dialogue_merging_test)
|
||||
{
|
||||
if (mContentFiles.empty())
|
||||
{
|
||||
std::cout << "No content files found, skipping test" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string file = "test_dialogue_merging.txt";
|
||||
|
||||
boost::filesystem::ofstream stream;
|
||||
stream.open(file);
|
||||
|
||||
const MWWorld::Store<ESM::Dialogue>& dialStore = mEsmStore.get<ESM::Dialogue>();
|
||||
for (MWWorld::Store<ESM::Dialogue>::iterator it = dialStore.begin(); it != dialStore.end(); ++it)
|
||||
{
|
||||
const ESM::Dialogue& dial = *it;
|
||||
stream << "Dialogue: " << dial.mId << std::endl;
|
||||
|
||||
for (ESM::Dialogue::InfoContainer::const_iterator infoIt = dial.mInfo.begin(); infoIt != dial.mInfo.end(); ++infoIt)
|
||||
{
|
||||
const ESM::DialInfo& info = *infoIt;
|
||||
stream << info.mId << std::endl;
|
||||
}
|
||||
stream << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "dialogue_merging_test successful, results printed to " << file << std::endl;
|
||||
}
|
||||
|
||||
/*
|
||||
TEST_F(ContentFileTest, diagnostics)
|
||||
{
|
||||
if (mContentFiles.empty())
|
||||
{
|
||||
std::cout << "No content files found, skipping test" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO:
|
||||
/// Print results of autocalculated NPC spell lists. Also serves as test for attribute/skill autocalculation which the spell autocalculation heavily relies on
|
||||
/// - even rounding errors can completely change the resulting spell lists.
|
||||
/*
|
||||
TEST_F(ContentFileTest, autocalc_test)
|
||||
{
|
||||
if (mContentFiles.empty())
|
||||
{
|
||||
std::cout << "No content files found, skipping test" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
/// Base class for tests of ESMStore that do not rely on external content files
|
||||
struct StoreTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
MWWorld::ESMStore mEsmStore;
|
||||
};
|
||||
|
||||
/// Tests deletion of records.
|
||||
TEST_F(StoreTest, delete_test)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// Tests overwriting of records.
|
||||
TEST_F(StoreTest, overwrite_test)
|
||||
{
|
||||
|
||||
}
|
||||
*/
|
Loading…
Reference in New Issue