diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b1d2a6c..ee6bbe59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,7 @@ set (LOOT_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/tests/fixtures.h" "${CMAKE_SOURCE_DIR}/src/tests/api/test_api.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/game/test_game.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/game/test_game_settings.h" + "${CMAKE_SOURCE_DIR}/src/tests/backend/game/test_load_order_handler.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/helpers/test_git_helper.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/helpers/test_helpers.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/helpers/test_language.h" diff --git a/src/tests/backend/game/test_load_order_handler.h b/src/tests/backend/game/test_load_order_handler.h new file mode 100644 index 00000000..ddf5850f --- /dev/null +++ b/src/tests/backend/game/test_load_order_handler.h @@ -0,0 +1,141 @@ +/* LOOT + +A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and +Fallout: New Vegas. + +Copyright (C) 2014-2015 WrinklyNinja + +This file is part of LOOT. + +LOOT is free software: you can redistribute +it and/or modify it under the terms of the GNU General Public License +as published by the Free Software Foundation, either version 3 of +the License, or (at your option) any later version. + +LOOT 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with LOOT. If not, see +. +*/ + +#ifndef LOOT_TEST_BACKEND_LOAD_ORDER_HANDLER +#define LOOT_TEST_BACKEND_LOAD_ORDER_HANDLER + +#include "backend/error.h" +#include "backend/game/load_order_handler.h" + +#include "tests/fixtures.h" + +class LoadOrderHandler : public SkyrimTest {}; + +TEST_F(LoadOrderHandler, Constructors) { + loot::LoadOrderHandler * loh = nullptr; + EXPECT_NO_THROW(loh = new loot::LoadOrderHandler); + EXPECT_NO_THROW(delete loh); +} + +TEST_F(LoadOrderHandler, Init) { + // Should throw for invalid game settings ID. + loot::LoadOrderHandler loh; + loot::GameSettings game(loot::GameSettings::autodetect); + EXPECT_THROW(loh.Init(game), loot::error); + EXPECT_THROW(loh.Init(game), loot::error); + EXPECT_THROW(loh.Init(game, localPath), loot::error); + EXPECT_THROW(loh.Init(game, localPath), loot::error); + + // Should throw an exception if no game path has been set. + game = loot::GameSettings(loot::GameSettings::tes5); + EXPECT_THROW(loh.Init(game), loot::error); + EXPECT_THROW(loh.Init(game), loot::error); + EXPECT_THROW(loh.Init(game, localPath), loot::error); + EXPECT_THROW(loh.Init(game, localPath), loot::error); + +#ifndef _WIN32 + // Should throw on Linux if no game local app data path is given. + game = loot::GameSettings(loot::GameSettings::tes5) + .SetGamePath(dataPath.parent_path()); + EXPECT_THROW(loh.Init(game), loot::error); +#endif + + game = loot::GameSettings(loot::GameSettings::tes5) + .SetGamePath(dataPath.parent_path()); + EXPECT_NO_THROW(loh.Init(game, localPath)); +} + +TEST_F(LoadOrderHandler, GetActivePlugins) { + loot::LoadOrderHandler loh; + loot::GameSettings game(loot::GameSettings::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(loh.Init(game, localPath)); + + std::unordered_set expected({ + "skyrim.esm", + "blank.esm" + }); + + EXPECT_EQ(expected, loh.GetActivePlugins()); +} + +TEST_F(LoadOrderHandler, GetLoadOrder) { + loot::LoadOrderHandler loh; + loot::GameSettings game(loot::GameSettings::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(loh.Init(game, localPath)); + + std::list expected({ + "Skyrim.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Master Dependent.esm", + "Blank - Different Master Dependent.esm", + "Blank.esp", + "Blank - Different.esp", + "Blank - Master Dependent.esp", + "Blank - Different Master Dependent.esp", + "Blank - Plugin Dependent.esp", + "Blank - Different Plugin Dependent.esp" + }); + + EXPECT_EQ(expected, loh.GetLoadOrder()); +} + +TEST_F(LoadOrderHandler, SetLoadOrder) { + loot::LoadOrderHandler loh; + loot::GameSettings game(loot::GameSettings::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(loh.Init(game, localPath)); + + std::list loadOrder({ + "Skyrim.esm", + "Blank.esm", + "Blank - Master Dependent.esm", + "Blank - Different.esm", + "Blank - Different Master Dependent.esm", + "Blank - Different.esp", + "Blank - Different Plugin Dependent.esp", + "Blank.esp", + "Blank - Master Dependent.esp", + "Blank - Different Master Dependent.esp", + "Blank - Plugin Dependent.esp", + }); + + EXPECT_NO_THROW(loh.SetLoadOrder(loadOrder)); + + std::list actual; + loot::ifstream in(localPath / "loadorder.txt"); + while (in) { + std::string line; + std::getline(in, line); + + if (!line.empty()) + actual.push_back(line); + } + + EXPECT_EQ(loadOrder, actual); +} + +#endif diff --git a/src/tests/main.cpp b/src/tests/main.cpp index 8dc21c59..ee09037b 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -30,6 +30,7 @@ #include "api/test_api.h" #include "backend/game/test_game.h" #include "backend/game/test_game_settings.h" +#include "backend/game/test_load_order_handler.h" #include "backend/metadata/test_file.h" #include "backend/metadata/test_formid.h" #include "backend/metadata/test_location.h"