diff --git a/src/tests/api/test_api.h b/src/tests/api/test_api.h index c58060f5..2c464f76 100644 --- a/src/tests/api/test_api.h +++ b/src/tests/api/test_api.h @@ -30,600 +30,605 @@ along with LOOT. If not, see #include -TEST(GetVersion, HandlesNullInput) { - unsigned int vMajor, vMinor, vPatch; - EXPECT_EQ(loot_error_invalid_args, loot_get_version(&vMajor, NULL, NULL)); - EXPECT_EQ(loot_error_invalid_args, loot_get_version(NULL, &vMinor, NULL)); - EXPECT_EQ(loot_error_invalid_args, loot_get_version(NULL, NULL, &vPatch)); - EXPECT_EQ(loot_error_invalid_args, loot_get_version(NULL, NULL, NULL)); -} +namespace loot { + namespace test { + TEST(GetVersion, HandlesNullInput) { + unsigned int vMajor, vMinor, vPatch; + EXPECT_EQ(loot_error_invalid_args, loot_get_version(&vMajor, NULL, NULL)); + EXPECT_EQ(loot_error_invalid_args, loot_get_version(NULL, &vMinor, NULL)); + EXPECT_EQ(loot_error_invalid_args, loot_get_version(NULL, NULL, &vPatch)); + EXPECT_EQ(loot_error_invalid_args, loot_get_version(NULL, NULL, NULL)); + } -TEST(GetVersion, HandlesValidInput) { - unsigned int vMajor, vMinor, vPatch; - EXPECT_EQ(loot_ok, loot_get_version(&vMajor, &vMinor, &vPatch)); -} + TEST(GetVersion, HandlesValidInput) { + unsigned int vMajor, vMinor, vPatch; + EXPECT_EQ(loot_ok, loot_get_version(&vMajor, &vMinor, &vPatch)); + } -TEST(GetBuildID, HandlesNullInput) { - EXPECT_EQ(loot_error_invalid_args, loot_get_build_id(NULL)); -} + TEST(GetBuildID, HandlesNullInput) { + EXPECT_EQ(loot_error_invalid_args, loot_get_build_id(NULL)); + } -TEST(GetBuildID, HandlesValidInput) { - const char * revision; - EXPECT_EQ(loot_ok, loot_get_build_id(&revision)); - EXPECT_STRNE(NULL, revision); - EXPECT_STRNE("@GIT_COMMIT_STRING@", revision); // The CMake placeholder. -} + TEST(GetBuildID, HandlesValidInput) { + const char * revision; + EXPECT_EQ(loot_ok, loot_get_build_id(&revision)); + EXPECT_STRNE(NULL, revision); + EXPECT_STRNE("@GIT_COMMIT_STRING@", revision); // The CMake placeholder. + } -TEST(IsCompatible, shouldReturnTrueWithEqualMajorAndMinorVersionsAndUnequalPatchVersion) { - unsigned int vMajor, vMinor, vPatch; - EXPECT_EQ(loot_ok, loot_get_version(&vMajor, &vMinor, &vPatch)); + TEST(IsCompatible, shouldReturnTrueWithEqualMajorAndMinorVersionsAndUnequalPatchVersion) { + unsigned int vMajor, vMinor, vPatch; + EXPECT_EQ(loot_ok, loot_get_version(&vMajor, &vMinor, &vPatch)); - EXPECT_TRUE(loot_is_compatible(vMajor, vMinor, vPatch + 1)); -} + EXPECT_TRUE(loot_is_compatible(vMajor, vMinor, vPatch + 1)); + } -TEST(IsCompatible, shouldReturnFalseWithEqualMajorVersionAndUnequalMinorAndPatchVersions) { - unsigned int vMajor, vMinor, vPatch; - EXPECT_EQ(loot_ok, loot_get_version(&vMajor, &vMinor, &vPatch)); + TEST(IsCompatible, shouldReturnFalseWithEqualMajorVersionAndUnequalMinorAndPatchVersions) { + unsigned int vMajor, vMinor, vPatch; + EXPECT_EQ(loot_ok, loot_get_version(&vMajor, &vMinor, &vPatch)); - EXPECT_FALSE(loot_is_compatible(vMajor, vMinor + 1, vPatch + 1)); -} + EXPECT_FALSE(loot_is_compatible(vMajor, vMinor + 1, vPatch + 1)); + } -TEST(GetErrorMessage, HandlesInputCorrectly) { - EXPECT_EQ(loot_error_invalid_args, loot_get_error_message(NULL)); + TEST(GetErrorMessage, HandlesInputCorrectly) { + EXPECT_EQ(loot_error_invalid_args, loot_get_error_message(NULL)); - const char * error; - EXPECT_EQ(loot_ok, loot_get_error_message(&error)); - ASSERT_STREQ("Null message pointer passed.", error); -} + const char * error; + EXPECT_EQ(loot_ok, loot_get_error_message(&error)); + ASSERT_STREQ("Null message pointer passed.", error); + } -TEST_F(OblivionTest, CreateDbHandlesValidInputs) { - EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), localPath.string().c_str())); - ASSERT_NO_THROW(loot_destroy_db(db)); - db = nullptr; + TEST_F(OblivionTest, CreateDbHandlesValidInputs) { + EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + ASSERT_NO_THROW(loot_destroy_db(db)); + db = nullptr; - // Also test absolute paths. - boost::filesystem::path game = boost::filesystem::current_path() / dataPath.parent_path(); - boost::filesystem::path local = boost::filesystem::current_path() / localPath; - EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, game.string().c_str(), local.string().c_str())); -} + // Also test absolute paths. + boost::filesystem::path game = boost::filesystem::current_path() / dataPath.parent_path(); + boost::filesystem::path local = boost::filesystem::current_path() / localPath; + EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, game.string().c_str(), local.string().c_str())); + } -TEST_F(OblivionTest, CreateDbHandlesInvalidHandleInput) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(NULL, loot_game_tes4, dataPath.parent_path().string().c_str(), localPath.string().c_str())); -} + TEST_F(OblivionTest, CreateDbHandlesInvalidHandleInput) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(NULL, loot_game_tes4, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + } -TEST_F(OblivionTest, CreateDbHandlesInvalidGameType) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, UINT_MAX, dataPath.parent_path().string().c_str(), localPath.string().c_str())); -} + TEST_F(OblivionTest, CreateDbHandlesInvalidGameType) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, UINT_MAX, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + } -TEST_F(OblivionTest, CreateDbHandlesInvalidGamePathInput) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes4, missingPath.string().c_str(), localPath.string().c_str())); -} + TEST_F(OblivionTest, CreateDbHandlesInvalidGamePathInput) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes4, missingPath.string().c_str(), localPath.string().c_str())); + } -TEST_F(OblivionTest, CreateDbHandlesInvalidLocalPathInput) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), missingPath.string().c_str())); -} + TEST_F(OblivionTest, CreateDbHandlesInvalidLocalPathInput) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), missingPath.string().c_str())); + } #ifdef _WIN32 -TEST_F(OblivionTest, CreateDbHandlesNullLocalPath) { - EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), NULL)); -} + TEST_F(OblivionTest, CreateDbHandlesNullLocalPath) { + EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), NULL)); + } #endif -TEST_F(SkyrimTest, CreateDbHandlesValidInputs) { - EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), localPath.string().c_str())); - ASSERT_NO_THROW(loot_destroy_db(db)); - db = nullptr; + TEST_F(SkyrimTest, CreateDbHandlesValidInputs) { + EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + ASSERT_NO_THROW(loot_destroy_db(db)); + db = nullptr; - // Also test absolute paths. - boost::filesystem::path game = boost::filesystem::current_path() / dataPath.parent_path(); - boost::filesystem::path local = boost::filesystem::current_path() / localPath; - EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, game.string().c_str(), local.string().c_str())); -} + // Also test absolute paths. + boost::filesystem::path game = boost::filesystem::current_path() / dataPath.parent_path(); + boost::filesystem::path local = boost::filesystem::current_path() / localPath; + EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, game.string().c_str(), local.string().c_str())); + } -TEST_F(SkyrimTest, CreateDbHandlesInvalidHandleInput) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(NULL, loot_game_tes5, dataPath.parent_path().string().c_str(), localPath.string().c_str())); -} + TEST_F(SkyrimTest, CreateDbHandlesInvalidHandleInput) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(NULL, loot_game_tes5, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + } -TEST_F(SkyrimTest, CreateDbHandlesInvalidGameType) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, UINT_MAX, dataPath.parent_path().string().c_str(), localPath.string().c_str())); -} + TEST_F(SkyrimTest, CreateDbHandlesInvalidGameType) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, UINT_MAX, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + } -TEST_F(SkyrimTest, CreateDbHandlesInvalidGamePathInput) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes5, missingPath.string().c_str(), localPath.string().c_str())); -} + TEST_F(SkyrimTest, CreateDbHandlesInvalidGamePathInput) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes5, missingPath.string().c_str(), localPath.string().c_str())); + } -TEST_F(SkyrimTest, CreateDbHandlesInvalidLocalPathInput) { - EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), missingPath.string().c_str())); -} + TEST_F(SkyrimTest, CreateDbHandlesInvalidLocalPathInput) { + EXPECT_EQ(loot_error_invalid_args, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), missingPath.string().c_str())); + } #ifdef _WIN32 -TEST_F(SkyrimTest, CreateDbHandlesNullLocalPath) { - EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), NULL)); -} + TEST_F(SkyrimTest, CreateDbHandlesNullLocalPath) { + EXPECT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), NULL)); + } #endif -TEST(GameHandleDestroyTest, HandledNullInput) { - ASSERT_NO_THROW(loot_destroy_db(NULL)); -} + TEST(GameHandleDestroyTest, HandledNullInput) { + ASSERT_NO_THROW(loot_destroy_db(NULL)); + } -TEST_F(OblivionAPIOperationsTest, UpdateMasterlist) { - bool updated; - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(NULL, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, NULL, "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), NULL, "master", &updated)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", NULL, &updated)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", NULL)); + TEST_F(OblivionAPIOperationsTest, UpdateMasterlist) { + bool updated; + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(NULL, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, NULL, "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), NULL, "master", &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", NULL, &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", NULL)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, ";//\?", "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, "", "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_EQ(loot_error_git_error, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/oblivion-does-not-exist.git", "master", &updated)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "", "master", &updated)); - EXPECT_EQ(loot_error_git_error, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "missing-branch", &updated)); - EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "", &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, ";//\?", "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, "", "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_EQ(loot_error_git_error, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/oblivion-does-not-exist.git", "master", &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "", "master", &updated)); + EXPECT_EQ(loot_error_git_error, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "missing-branch", &updated)); + EXPECT_EQ(loot_error_invalid_args, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "", &updated)); - // Test actual masterlist update. - EXPECT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_TRUE(updated); + // Test actual masterlist update. + EXPECT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_TRUE(updated); - // Test with an up-to-date masterlist. - EXPECT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_FALSE(updated); -} + // Test with an up-to-date masterlist. + EXPECT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_FALSE(updated); + } -TEST_F(OblivionAPIOperationsTest, GetMasterlistRevision) { - const char * revisionID; - const char * revisionDate; - bool isModified; - EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(NULL, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, NULL, false, &revisionID, &revisionDate, &isModified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, NULL, &revisionDate, &isModified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, NULL, &isModified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, NULL)); + TEST_F(OblivionAPIOperationsTest, GetMasterlistRevision) { + const char * revisionID; + const char * revisionDate; + bool isModified; + EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(NULL, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, NULL, false, &revisionID, &revisionDate, &isModified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, NULL, &revisionDate, &isModified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, NULL, &isModified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, NULL)); - // Test with no masterlist. - EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); - EXPECT_EQ(NULL, revisionID); - EXPECT_EQ(NULL, revisionDate); - EXPECT_FALSE(isModified); + // Test with no masterlist. + EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); + EXPECT_EQ(NULL, revisionID); + EXPECT_EQ(NULL, revisionDate); + EXPECT_FALSE(isModified); - // Test with a generated (non-revision-control) masterlist. - ASSERT_NO_THROW(GenerateMasterlist()); - EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); - EXPECT_EQ(NULL, revisionID); - EXPECT_EQ(NULL, revisionDate); - EXPECT_FALSE(isModified); + // Test with a generated (non-revision-control) masterlist. + ASSERT_NO_THROW(GenerateMasterlist()); + EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); + EXPECT_EQ(NULL, revisionID); + EXPECT_EQ(NULL, revisionDate); + EXPECT_FALSE(isModified); - // Update the masterlist and test. - bool updated; - ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - ASSERT_TRUE(updated); - EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); - EXPECT_STRNE(NULL, revisionID); - EXPECT_EQ(40, strlen(revisionID)); - EXPECT_STRNE(NULL, revisionDate); - EXPECT_EQ(10, strlen(revisionDate)); - EXPECT_FALSE(isModified); + // Update the masterlist and test. + bool updated; + ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + ASSERT_TRUE(updated); + EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); + EXPECT_STRNE(NULL, revisionID); + EXPECT_EQ(40, strlen(revisionID)); + EXPECT_STRNE(NULL, revisionDate); + EXPECT_EQ(10, strlen(revisionDate)); + EXPECT_FALSE(isModified); - // Test with a short revision string. - EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), true, &revisionID, &revisionDate, &isModified)); - EXPECT_STRNE(NULL, revisionID); - EXPECT_GE(size_t(40), strlen(revisionID)); - EXPECT_LE(size_t(7), strlen(revisionID)); - EXPECT_STRNE(NULL, revisionDate); - EXPECT_EQ(10, strlen(revisionDate)); - EXPECT_FALSE(isModified); + // Test with a short revision string. + EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), true, &revisionID, &revisionDate, &isModified)); + EXPECT_STRNE(NULL, revisionID); + EXPECT_GE(size_t(40), strlen(revisionID)); + EXPECT_LE(size_t(7), strlen(revisionID)); + EXPECT_STRNE(NULL, revisionDate); + EXPECT_EQ(10, strlen(revisionDate)); + EXPECT_FALSE(isModified); - // Overwrite the masterlist with a generated one. - ASSERT_NO_THROW(GenerateMasterlist()); - EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); - EXPECT_STRNE(NULL, revisionID); - EXPECT_EQ(40, strlen(revisionID)); - EXPECT_STRNE(NULL, revisionDate); - EXPECT_EQ(10, strlen(revisionDate)); - EXPECT_TRUE(isModified); -} + // Overwrite the masterlist with a generated one. + ASSERT_NO_THROW(GenerateMasterlist()); + EXPECT_EQ(loot_ok, loot_get_masterlist_revision(db, masterlistPath.string().c_str(), false, &revisionID, &revisionDate, &isModified)); + EXPECT_STRNE(NULL, revisionID); + EXPECT_EQ(40, strlen(revisionID)); + EXPECT_STRNE(NULL, revisionDate); + EXPECT_EQ(10, strlen(revisionDate)); + EXPECT_TRUE(isModified); + } -TEST_F(OblivionAPIOperationsTest, LoadLists) { - EXPECT_EQ(loot_error_invalid_args, loot_load_lists(NULL, masterlistPath.string().c_str(), NULL)); - EXPECT_EQ(loot_error_invalid_args, loot_load_lists(db, NULL, NULL)); + TEST_F(OblivionAPIOperationsTest, LoadLists) { + EXPECT_EQ(loot_error_invalid_args, loot_load_lists(NULL, masterlistPath.string().c_str(), NULL)); + EXPECT_EQ(loot_error_invalid_args, loot_load_lists(db, NULL, NULL)); - EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - bool updated; - ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); + EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + bool updated; + ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); - ASSERT_NO_THROW(boost::filesystem::copy(masterlistPath, userlistPath)); - EXPECT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); -} + ASSERT_NO_THROW(boost::filesystem::copy(masterlistPath, userlistPath)); + EXPECT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); + } -TEST_F(SkyrimAPIOperationsTest, LoadLists) { - EXPECT_EQ(loot_error_invalid_args, loot_load_lists(NULL, masterlistPath.string().c_str(), NULL)); - EXPECT_EQ(loot_error_invalid_args, loot_load_lists(db, NULL, NULL)); + TEST_F(SkyrimAPIOperationsTest, LoadLists) { + EXPECT_EQ(loot_error_invalid_args, loot_load_lists(NULL, masterlistPath.string().c_str(), NULL)); + EXPECT_EQ(loot_error_invalid_args, loot_load_lists(db, NULL, NULL)); - EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - bool updated; - ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); + EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + bool updated; + ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_EQ(loot_error_path_not_found, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); - ASSERT_NO_THROW(boost::filesystem::copy(masterlistPath, userlistPath)); - EXPECT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); -} + ASSERT_NO_THROW(boost::filesystem::copy(masterlistPath, userlistPath)); + EXPECT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); + } -TEST_F(OblivionAPIOperationsTest, EvalLists) { - // No lists loaded. - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); + TEST_F(OblivionAPIOperationsTest, EvalLists) { + // No lists loaded. + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); - // Invalid args. - EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(NULL, loot_lang_any)); - EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(db, UINT_MAX)); + // Invalid args. + EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(NULL, loot_lang_any)); + EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(db, UINT_MAX)); - // Now test different languages with a list loaded. - bool updated; - ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); -} + // Now test different languages with a list loaded. + bool updated; + ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); + } -TEST_F(SkyrimAPIOperationsTest, EvalLists) { - // No lists loaded. - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); + TEST_F(SkyrimAPIOperationsTest, EvalLists) { + // No lists loaded. + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); - // Invalid args. - EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(NULL, loot_lang_any)); - EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(db, UINT_MAX)); + // Invalid args. + EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(NULL, loot_lang_any)); + EXPECT_EQ(loot_error_invalid_args, loot_eval_lists(db, UINT_MAX)); - // Now test different languages with a list loaded. - bool updated; - ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); - EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); -} + // Now test different languages with a list loaded. + bool updated; + ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_any)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_english)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_spanish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_russian)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_french)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_chinese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_polish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_brazilian_portuguese)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_finnish)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_german)); + EXPECT_EQ(loot_ok, loot_eval_lists(db, loot_lang_danish)); + } -TEST_F(OblivionAPIOperationsTest, SortPlugins) { - const char * const * sortedPlugins; - size_t numPlugins; - EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(NULL, &sortedPlugins, &numPlugins)); - EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, NULL, &numPlugins)); - EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, &sortedPlugins, NULL)); + TEST_F(OblivionAPIOperationsTest, SortPlugins) { + const char * const * sortedPlugins; + size_t numPlugins; + EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(NULL, &sortedPlugins, &numPlugins)); + EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, NULL, &numPlugins)); + EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, &sortedPlugins, NULL)); - EXPECT_EQ(loot_ok, loot_sort_plugins(db, &sortedPlugins, &numPlugins)); + EXPECT_EQ(loot_ok, loot_sort_plugins(db, &sortedPlugins, &numPlugins)); - // Expected order was obtained from running the API function once. - std::list expectedOrder = { - "Oblivion.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", - }; - std::list actualOrder; - for (size_t i = 0; i < numPlugins; ++i) { - actualOrder.push_back(sortedPlugins[i]); + // Expected order was obtained from running the API function once. + std::list expectedOrder = { + "Oblivion.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", + }; + std::list actualOrder; + for (size_t i = 0; i < numPlugins; ++i) { + actualOrder.push_back(sortedPlugins[i]); + } + EXPECT_EQ(11, numPlugins); + EXPECT_EQ(expectedOrder, actualOrder); + } + + TEST_F(SkyrimAPIOperationsTest, SortPlugins) { + const char * const * sortedPlugins; + size_t numPlugins; + EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(NULL, &sortedPlugins, &numPlugins)); + EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, NULL, &numPlugins)); + EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, &sortedPlugins, NULL)); + + EXPECT_EQ(loot_ok, loot_sort_plugins(db, &sortedPlugins, &numPlugins)); + + // Expected order was obtained from running the API function once. + std::list expectedOrder = { + "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", + }; + std::list actualOrder; + for (size_t i = 0; i < numPlugins; ++i) { + actualOrder.push_back(sortedPlugins[i]); + } + EXPECT_EQ(11, numPlugins); + EXPECT_EQ(expectedOrder, actualOrder); + } + + TEST_F(OblivionAPIOperationsTest, ApplyLoadOrder) { + const char * loadOrder[11] = { + "Oblivion.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Different Master Dependent.esm", + "Blank - Master Dependent.esm", + "Blank.esp", + "Blank - Different.esp", + "Blank - Different Master Dependent.esp", + "Blank - Different Plugin Dependent.esp", + "Blank - Master Dependent.esp", + "Blank - Plugin Dependent.esp", + }; + size_t numPlugins = 11; + EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(NULL, loadOrder, numPlugins)); + EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(db, NULL, numPlugins)); + + EXPECT_EQ(loot_ok, loot_apply_load_order(db, loadOrder, numPlugins)); + } + + TEST_F(SkyrimAPIOperationsTest, ApplyLoadOrder) { + const char * loadOrder[11] = { + "Skyrim.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Different Master Dependent.esm", + "Blank - Master Dependent.esm", + "Blank.esp", + "Blank - Different.esp", + "Blank - Different Master Dependent.esp", + "Blank - Different Plugin Dependent.esp", + "Blank - Master Dependent.esp", + "Blank - Plugin Dependent.esp", + }; + size_t numPlugins = 11; + EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(NULL, loadOrder, numPlugins)); + EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(db, NULL, numPlugins)); + + EXPECT_EQ(loot_ok, loot_apply_load_order(db, loadOrder, numPlugins)); + } + + TEST_F(OblivionAPIOperationsTest, GetTagMap) { + const char * const * tagMap; + size_t numTags; + EXPECT_EQ(loot_error_invalid_args, loot_get_tag_map(NULL, &tagMap, &numTags)); + EXPECT_EQ(loot_error_invalid_args, loot_get_tag_map(db, NULL, &numTags)); + EXPECT_EQ(loot_error_invalid_args, loot_get_tag_map(db, &tagMap, NULL)); + + // Get tag map with no masterlist loaded: should have no tags. + EXPECT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); + EXPECT_EQ(0, numTags); + EXPECT_EQ(NULL, tagMap); + + // Get a masterlist, then get tags from it. + ASSERT_NO_THROW(GenerateMasterlist()); + ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + EXPECT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); + ASSERT_EQ(22, numTags); + EXPECT_STREQ("Actors.ACBS", tagMap[0]); + EXPECT_STREQ("Actors.AIData", tagMap[1]); + EXPECT_STREQ("Actors.AIPackages", tagMap[2]); + EXPECT_STREQ("Actors.CombatStyle", tagMap[3]); + EXPECT_STREQ("Actors.DeathItem", tagMap[4]); + EXPECT_STREQ("Actors.Stats", tagMap[5]); + EXPECT_STREQ("C.Climate", tagMap[6]); + EXPECT_STREQ("C.Light", tagMap[7]); + EXPECT_STREQ("C.Music", tagMap[8]); + EXPECT_STREQ("C.Name", tagMap[9]); + EXPECT_STREQ("C.Owner", tagMap[10]); + EXPECT_STREQ("C.Water", tagMap[11]); + EXPECT_STREQ("Creatures.Blood", tagMap[12]); + EXPECT_STREQ("Delev", tagMap[13]); + EXPECT_STREQ("Factions", tagMap[14]); + EXPECT_STREQ("Invent", tagMap[15]); + EXPECT_STREQ("NPC.Class", tagMap[16]); + EXPECT_STREQ("Names", tagMap[17]); + EXPECT_STREQ("Relations", tagMap[18]); + EXPECT_STREQ("Relev", tagMap[19]); + EXPECT_STREQ("Scripts", tagMap[20]); + EXPECT_STREQ("Stats", tagMap[21]); + } + + TEST_F(OblivionAPIOperationsTest, GetPluginTags) { + const unsigned int * added; + const unsigned int * removed; + size_t numAdded, numRemoved; + bool modified; + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(NULL, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, NULL, &added, &numAdded, &removed, &numRemoved, &modified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", NULL, &numAdded, &removed, &numRemoved, &modified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, NULL, &removed, &numRemoved, &modified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, NULL, &numRemoved, &modified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, NULL, &modified)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, NULL)); + + // Get tags before getting a tag map. + EXPECT_EQ(loot_error_no_tag_map, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); + + // Load tag map. + const char * const * tagMap; + size_t numTags; + ASSERT_NO_THROW(GenerateMasterlist()); + ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + ASSERT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); + + // Get tags for a plugin without any. + EXPECT_EQ(loot_ok, loot_get_plugin_tags(db, "Blank.esp", &added, &numAdded, &removed, &numRemoved, &modified)); + EXPECT_EQ(0, numAdded); + EXPECT_EQ(NULL, added); + EXPECT_EQ(0, numRemoved); + EXPECT_EQ(NULL, removed); + EXPECT_FALSE(modified); + + // Get tags for a plugin with some. + EXPECT_EQ(loot_ok, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); + ASSERT_EQ(21, numAdded); + for (size_t i = 0; i < 11; ++i) { + EXPECT_EQ(i, added[i]); + } + for (size_t i = 11; i < 21; ++i) { + EXPECT_EQ(i + 1, added[i]); + } + + ASSERT_EQ(1, numRemoved); + EXPECT_EQ(11, removed[0]); + EXPECT_FALSE(modified); + + // Now load the masterlist as the userlist too, and check the modified flag. + ASSERT_NO_THROW(boost::filesystem::copy_file(masterlistPath, userlistPath)); + ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); + ASSERT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); + + EXPECT_EQ(loot_ok, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); + ASSERT_EQ(21, numAdded); + for (size_t i = 0; i < 11; ++i) { + EXPECT_EQ(i, added[i]); + } + for (size_t i = 11; i < 21; ++i) { + EXPECT_EQ(i + 1, added[i]); + } + EXPECT_EQ(0, added[0]); + ASSERT_EQ(1, numRemoved); + EXPECT_EQ(11, removed[0]); + EXPECT_TRUE(modified); + } + + TEST_F(OblivionAPIOperationsTest, GetPluginMessages) { + const loot_message * messages; + size_t numMessages; + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(NULL, "EnhancedWeatherSIOnly.esm", &messages, &numMessages)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(db, NULL, &messages, &numMessages)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(db, "EnhancedWeatherSIOnly.esm", NULL, &numMessages)); + EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(db, "EnhancedWeatherSIOnly.esm", &messages, NULL)); + + // Fetch and load the metadata. + ASSERT_NO_THROW(GenerateMasterlist()); + ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + + // Test for plugin with no messages. + EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "Silgrad_Tower.esm", &messages, &numMessages)); + EXPECT_EQ(0, numMessages); + EXPECT_EQ(NULL, messages); + + // Test for plugin with one note. + EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "No Lights Flicker.esm", &messages, &numMessages)); + EXPECT_EQ(1, numMessages); + EXPECT_EQ(loot_message_say, messages[0].type); + EXPECT_STREQ("Use Wrye Bash Bashed Patch tweak instead.", messages[0].message); + + // Test for plugin with one warning. + EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "bookplacing.esm", &messages, &numMessages)); + EXPECT_EQ(1, numMessages); + EXPECT_EQ(loot_message_warn, messages[0].type); + EXPECT_STREQ("Check you are using v2+. If not, Update. v1 has a severe bug with the Mystic Emporium disappearing.", messages[0].message); + + // Test for plugin with one error. + EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "EnhancedWeatherSIOnly.esm", &messages, &numMessages)); + EXPECT_EQ(1, numMessages); + EXPECT_EQ(loot_message_error, messages[0].type); + EXPECT_STREQ("Obsolete. Remove this and install Enhanced Weather.", messages[0].message); + + // Test for plugin with more than one message. + EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "nVidia Black Screen Fix.esp", &messages, &numMessages)); + EXPECT_EQ(2, numMessages); + EXPECT_EQ(loot_message_say, messages[0].type); + EXPECT_STREQ("Use Wrye Bash Bashed Patch tweak instead.", messages[0].message); + EXPECT_EQ(loot_message_say, messages[1].type); + EXPECT_STREQ("Alternatively, remove this and use UOP v3.0.1+ instead.", messages[1].message); + } + + TEST_F(OblivionAPIOperationsTest, GetDirtyInfo) { + unsigned int needsCleaning; + EXPECT_EQ(loot_error_invalid_args, loot_get_dirty_info(NULL, "Oblivion.esm", &needsCleaning)); + EXPECT_EQ(loot_error_invalid_args, loot_get_dirty_info(db, NULL, &needsCleaning)); + EXPECT_EQ(loot_error_invalid_args, loot_get_dirty_info(db, "Oblivion.esm", NULL)); + + // Fetch and load the metadata. + ASSERT_NO_THROW(GenerateMasterlist()); + ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + + // A plugin with no metadata. + EXPECT_EQ(loot_ok, loot_get_dirty_info(db, "Oblivion.esm", &needsCleaning)); + EXPECT_EQ(loot_needs_cleaning_unknown, needsCleaning); + + // A plugin with dirty metadata. + EXPECT_EQ(loot_ok, loot_get_dirty_info(db, "Hammerfell.esm", &needsCleaning)); + EXPECT_EQ(loot_needs_cleaning_yes, needsCleaning); + + // A plugin with a standard "Do not clean" message. + EXPECT_EQ(loot_ok, loot_get_dirty_info(db, "Unofficial Oblivion Patch.esp", &needsCleaning)); + EXPECT_EQ(loot_needs_cleaning_no, needsCleaning); + } + + TEST_F(OblivionAPIOperationsTest, WriteMinimalList) { + std::string outputFile = (localPath / "minimal.yml").string(); + EXPECT_EQ(loot_error_invalid_args, loot_write_minimal_list(NULL, outputFile.c_str(), false)); + EXPECT_EQ(loot_error_invalid_args, loot_write_minimal_list(db, NULL, false)); + EXPECT_EQ(loot_error_file_write_fail, loot_write_minimal_list(db, "/:?*", false)); + + ASSERT_FALSE(boost::filesystem::exists(outputFile)); + EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), false)); + EXPECT_TRUE(boost::filesystem::exists(outputFile)); + EXPECT_EQ(loot_error_file_write_fail, loot_write_minimal_list(db, outputFile.c_str(), false)); + + EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), true)); + ASSERT_NO_THROW(boost::filesystem::remove(outputFile)); + EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), true)); + EXPECT_TRUE(boost::filesystem::exists(outputFile)); + ASSERT_NO_THROW(boost::filesystem::remove(outputFile)); + + // Check that Bash Tag removals get outputted correctly. + bool updated; + ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); + EXPECT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); + EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), false)); + + boost::filesystem::ifstream in(outputFile); + std::string line; + while (std::getline(in, line)) { + EXPECT_FALSE(boost::contains(line, "- \"-\"")); + } + in.close(); + ASSERT_NO_THROW(boost::filesystem::remove(outputFile)); + } } - EXPECT_EQ(11, numPlugins); - EXPECT_EQ(expectedOrder, actualOrder); } -TEST_F(SkyrimAPIOperationsTest, SortPlugins) { - const char * const * sortedPlugins; - size_t numPlugins; - EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(NULL, &sortedPlugins, &numPlugins)); - EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, NULL, &numPlugins)); - EXPECT_EQ(loot_error_invalid_args, loot_sort_plugins(db, &sortedPlugins, NULL)); - - EXPECT_EQ(loot_ok, loot_sort_plugins(db, &sortedPlugins, &numPlugins)); - - // Expected order was obtained from running the API function once. - std::list expectedOrder = { - "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", - }; - std::list actualOrder; - for (size_t i = 0; i < numPlugins; ++i) { - actualOrder.push_back(sortedPlugins[i]); - } - EXPECT_EQ(11, numPlugins); - EXPECT_EQ(expectedOrder, actualOrder); -} - -TEST_F(OblivionAPIOperationsTest, ApplyLoadOrder) { - const char * loadOrder[11] = { - "Oblivion.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Different Master Dependent.esm", - "Blank - Master Dependent.esm", - "Blank.esp", - "Blank - Different.esp", - "Blank - Different Master Dependent.esp", - "Blank - Different Plugin Dependent.esp", - "Blank - Master Dependent.esp", - "Blank - Plugin Dependent.esp", - }; - size_t numPlugins = 11; - EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(NULL, loadOrder, numPlugins)); - EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(db, NULL, numPlugins)); - - EXPECT_EQ(loot_ok, loot_apply_load_order(db, loadOrder, numPlugins)); -} - -TEST_F(SkyrimAPIOperationsTest, ApplyLoadOrder) { - const char * loadOrder[11] = { - "Skyrim.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Different Master Dependent.esm", - "Blank - Master Dependent.esm", - "Blank.esp", - "Blank - Different.esp", - "Blank - Different Master Dependent.esp", - "Blank - Different Plugin Dependent.esp", - "Blank - Master Dependent.esp", - "Blank - Plugin Dependent.esp", - }; - size_t numPlugins = 11; - EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(NULL, loadOrder, numPlugins)); - EXPECT_EQ(loot_error_invalid_args, loot_apply_load_order(db, NULL, numPlugins)); - - EXPECT_EQ(loot_ok, loot_apply_load_order(db, loadOrder, numPlugins)); -} - -TEST_F(OblivionAPIOperationsTest, GetTagMap) { - const char * const * tagMap; - size_t numTags; - EXPECT_EQ(loot_error_invalid_args, loot_get_tag_map(NULL, &tagMap, &numTags)); - EXPECT_EQ(loot_error_invalid_args, loot_get_tag_map(db, NULL, &numTags)); - EXPECT_EQ(loot_error_invalid_args, loot_get_tag_map(db, &tagMap, NULL)); - - // Get tag map with no masterlist loaded: should have no tags. - EXPECT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); - EXPECT_EQ(0, numTags); - EXPECT_EQ(NULL, tagMap); - - // Get a masterlist, then get tags from it. - ASSERT_NO_THROW(GenerateMasterlist()); - ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - EXPECT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); - ASSERT_EQ(22, numTags); - EXPECT_STREQ("Actors.ACBS", tagMap[0]); - EXPECT_STREQ("Actors.AIData", tagMap[1]); - EXPECT_STREQ("Actors.AIPackages", tagMap[2]); - EXPECT_STREQ("Actors.CombatStyle", tagMap[3]); - EXPECT_STREQ("Actors.DeathItem", tagMap[4]); - EXPECT_STREQ("Actors.Stats", tagMap[5]); - EXPECT_STREQ("C.Climate", tagMap[6]); - EXPECT_STREQ("C.Light", tagMap[7]); - EXPECT_STREQ("C.Music", tagMap[8]); - EXPECT_STREQ("C.Name", tagMap[9]); - EXPECT_STREQ("C.Owner", tagMap[10]); - EXPECT_STREQ("C.Water", tagMap[11]); - EXPECT_STREQ("Creatures.Blood", tagMap[12]); - EXPECT_STREQ("Delev", tagMap[13]); - EXPECT_STREQ("Factions", tagMap[14]); - EXPECT_STREQ("Invent", tagMap[15]); - EXPECT_STREQ("NPC.Class", tagMap[16]); - EXPECT_STREQ("Names", tagMap[17]); - EXPECT_STREQ("Relations", tagMap[18]); - EXPECT_STREQ("Relev", tagMap[19]); - EXPECT_STREQ("Scripts", tagMap[20]); - EXPECT_STREQ("Stats", tagMap[21]); -} - -TEST_F(OblivionAPIOperationsTest, GetPluginTags) { - const unsigned int * added; - const unsigned int * removed; - size_t numAdded, numRemoved; - bool modified; - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(NULL, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, NULL, &added, &numAdded, &removed, &numRemoved, &modified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", NULL, &numAdded, &removed, &numRemoved, &modified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, NULL, &removed, &numRemoved, &modified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, NULL, &numRemoved, &modified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, NULL, &modified)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, NULL)); - - // Get tags before getting a tag map. - EXPECT_EQ(loot_error_no_tag_map, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); - - // Load tag map. - const char * const * tagMap; - size_t numTags; - ASSERT_NO_THROW(GenerateMasterlist()); - ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - ASSERT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); - - // Get tags for a plugin without any. - EXPECT_EQ(loot_ok, loot_get_plugin_tags(db, "Blank.esp", &added, &numAdded, &removed, &numRemoved, &modified)); - EXPECT_EQ(0, numAdded); - EXPECT_EQ(NULL, added); - EXPECT_EQ(0, numRemoved); - EXPECT_EQ(NULL, removed); - EXPECT_FALSE(modified); - - // Get tags for a plugin with some. - EXPECT_EQ(loot_ok, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); - ASSERT_EQ(21, numAdded); - for (size_t i = 0; i < 11; ++i) { - EXPECT_EQ(i, added[i]); - } - for (size_t i = 11; i < 21; ++i) { - EXPECT_EQ(i + 1, added[i]); - } - - ASSERT_EQ(1, numRemoved); - EXPECT_EQ(11, removed[0]); - EXPECT_FALSE(modified); - - // Now load the masterlist as the userlist too, and check the modified flag. - ASSERT_NO_THROW(boost::filesystem::copy_file(masterlistPath, userlistPath)); - ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), userlistPath.string().c_str())); - ASSERT_EQ(loot_ok, loot_get_tag_map(db, &tagMap, &numTags)); - - EXPECT_EQ(loot_ok, loot_get_plugin_tags(db, "Unofficial Oblivion Patch.esp", &added, &numAdded, &removed, &numRemoved, &modified)); - ASSERT_EQ(21, numAdded); - for (size_t i = 0; i < 11; ++i) { - EXPECT_EQ(i, added[i]); - } - for (size_t i = 11; i < 21; ++i) { - EXPECT_EQ(i + 1, added[i]); - } - EXPECT_EQ(0, added[0]); - ASSERT_EQ(1, numRemoved); - EXPECT_EQ(11, removed[0]); - EXPECT_TRUE(modified); -} - -TEST_F(OblivionAPIOperationsTest, GetPluginMessages) { - const loot_message * messages; - size_t numMessages; - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(NULL, "EnhancedWeatherSIOnly.esm", &messages, &numMessages)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(db, NULL, &messages, &numMessages)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(db, "EnhancedWeatherSIOnly.esm", NULL, &numMessages)); - EXPECT_EQ(loot_error_invalid_args, loot_get_plugin_messages(db, "EnhancedWeatherSIOnly.esm", &messages, NULL)); - - // Fetch and load the metadata. - ASSERT_NO_THROW(GenerateMasterlist()); - ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - - // Test for plugin with no messages. - EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "Silgrad_Tower.esm", &messages, &numMessages)); - EXPECT_EQ(0, numMessages); - EXPECT_EQ(NULL, messages); - - // Test for plugin with one note. - EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "No Lights Flicker.esm", &messages, &numMessages)); - EXPECT_EQ(1, numMessages); - EXPECT_EQ(loot_message_say, messages[0].type); - EXPECT_STREQ("Use Wrye Bash Bashed Patch tweak instead.", messages[0].message); - - // Test for plugin with one warning. - EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "bookplacing.esm", &messages, &numMessages)); - EXPECT_EQ(1, numMessages); - EXPECT_EQ(loot_message_warn, messages[0].type); - EXPECT_STREQ("Check you are using v2+. If not, Update. v1 has a severe bug with the Mystic Emporium disappearing.", messages[0].message); - - // Test for plugin with one error. - EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "EnhancedWeatherSIOnly.esm", &messages, &numMessages)); - EXPECT_EQ(1, numMessages); - EXPECT_EQ(loot_message_error, messages[0].type); - EXPECT_STREQ("Obsolete. Remove this and install Enhanced Weather.", messages[0].message); - - // Test for plugin with more than one message. - EXPECT_EQ(loot_ok, loot_get_plugin_messages(db, "nVidia Black Screen Fix.esp", &messages, &numMessages)); - EXPECT_EQ(2, numMessages); - EXPECT_EQ(loot_message_say, messages[0].type); - EXPECT_STREQ("Use Wrye Bash Bashed Patch tweak instead.", messages[0].message); - EXPECT_EQ(loot_message_say, messages[1].type); - EXPECT_STREQ("Alternatively, remove this and use UOP v3.0.1+ instead.", messages[1].message); -} - -TEST_F(OblivionAPIOperationsTest, GetDirtyInfo) { - unsigned int needsCleaning; - EXPECT_EQ(loot_error_invalid_args, loot_get_dirty_info(NULL, "Oblivion.esm", &needsCleaning)); - EXPECT_EQ(loot_error_invalid_args, loot_get_dirty_info(db, NULL, &needsCleaning)); - EXPECT_EQ(loot_error_invalid_args, loot_get_dirty_info(db, "Oblivion.esm", NULL)); - - // Fetch and load the metadata. - ASSERT_NO_THROW(GenerateMasterlist()); - ASSERT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - - // A plugin with no metadata. - EXPECT_EQ(loot_ok, loot_get_dirty_info(db, "Oblivion.esm", &needsCleaning)); - EXPECT_EQ(loot_needs_cleaning_unknown, needsCleaning); - - // A plugin with dirty metadata. - EXPECT_EQ(loot_ok, loot_get_dirty_info(db, "Hammerfell.esm", &needsCleaning)); - EXPECT_EQ(loot_needs_cleaning_yes, needsCleaning); - - // A plugin with a standard "Do not clean" message. - EXPECT_EQ(loot_ok, loot_get_dirty_info(db, "Unofficial Oblivion Patch.esp", &needsCleaning)); - EXPECT_EQ(loot_needs_cleaning_no, needsCleaning); -} - -TEST_F(OblivionAPIOperationsTest, WriteMinimalList) { - std::string outputFile = (localPath / "minimal.yml").string(); - EXPECT_EQ(loot_error_invalid_args, loot_write_minimal_list(NULL, outputFile.c_str(), false)); - EXPECT_EQ(loot_error_invalid_args, loot_write_minimal_list(db, NULL, false)); - EXPECT_EQ(loot_error_file_write_fail, loot_write_minimal_list(db, "/:?*", false)); - - ASSERT_FALSE(boost::filesystem::exists(outputFile)); - EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), false)); - EXPECT_TRUE(boost::filesystem::exists(outputFile)); - EXPECT_EQ(loot_error_file_write_fail, loot_write_minimal_list(db, outputFile.c_str(), false)); - - EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), true)); - ASSERT_NO_THROW(boost::filesystem::remove(outputFile)); - EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), true)); - EXPECT_TRUE(boost::filesystem::exists(outputFile)); - ASSERT_NO_THROW(boost::filesystem::remove(outputFile)); - - // Check that Bash Tag removals get outputted correctly. - bool updated; - ASSERT_EQ(loot_ok, loot_update_masterlist(db, masterlistPath.string().c_str(), "https://github.com/loot/testing-metadata.git", "master", &updated)); - EXPECT_EQ(loot_ok, loot_load_lists(db, masterlistPath.string().c_str(), NULL)); - EXPECT_EQ(loot_ok, loot_write_minimal_list(db, outputFile.c_str(), false)); - - boost::filesystem::ifstream in(outputFile); - std::string line; - while (std::getline(in, line)) { - EXPECT_FALSE(boost::contains(line, "- \"-\"")); - } - in.close(); - ASSERT_NO_THROW(boost::filesystem::remove(outputFile)); -} #endif diff --git a/src/tests/backend/game/test_game.h b/src/tests/backend/game/test_game.h index 0bd22283..23d41620 100644 --- a/src/tests/backend/game/test_game.h +++ b/src/tests/backend/game/test_game.h @@ -31,628 +31,632 @@ along with LOOT. If not, see #include "tests/fixtures.h" -class Game : public SkyrimTest {}; +namespace loot { + namespace test { + class GameTest : public SkyrimTest {}; -TEST_F(Game, Constructors) { - // The constructors should just passthrough to the GameSettings - // members, so just check that is happening. - loot::Game game; - loot::GameSettings settings; + TEST_F(GameTest, Constructors) { + // The constructors should just passthrough to the GameSettings + // members, so just check that is happening. + Game game; + GameSettings settings; - EXPECT_EQ(loot::Game::autodetect, game.Id()); - EXPECT_EQ(settings.Name(), game.Name()); - EXPECT_EQ(settings.FolderName(), game.FolderName()); - EXPECT_EQ(settings.Master(), game.Master()); - EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); - EXPECT_EQ(settings.RepoURL(), game.RepoURL()); - EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); + EXPECT_EQ(Game::autodetect, game.Id()); + EXPECT_EQ(settings.Name(), game.Name()); + EXPECT_EQ(settings.FolderName(), game.FolderName()); + EXPECT_EQ(settings.Master(), game.Master()); + EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); + EXPECT_EQ(settings.RepoURL(), game.RepoURL()); + EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); - EXPECT_EQ(settings.GamePath(), game.GamePath()); - EXPECT_EQ(settings.DataPath(), game.DataPath()); - EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); - EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); + EXPECT_EQ(settings.GamePath(), game.GamePath()); + EXPECT_EQ(settings.DataPath(), game.DataPath()); + EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); + EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); - EXPECT_FALSE(game.ArePluginsFullyLoaded()); + EXPECT_FALSE(game.ArePluginsFullyLoaded()); - game = loot::Game(loot::Game::tes5); - settings = loot::GameSettings(loot::GameSettings::tes5); + game = Game(Game::tes5); + settings = GameSettings(GameSettings::tes5); - EXPECT_EQ(loot::Game::tes5, game.Id()); - EXPECT_EQ(settings.Name(), game.Name()); - EXPECT_EQ(settings.FolderName(), game.FolderName()); - EXPECT_EQ(settings.Master(), game.Master()); - EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); - EXPECT_EQ(settings.RepoURL(), game.RepoURL()); - EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); + EXPECT_EQ(Game::tes5, game.Id()); + EXPECT_EQ(settings.Name(), game.Name()); + EXPECT_EQ(settings.FolderName(), game.FolderName()); + EXPECT_EQ(settings.Master(), game.Master()); + EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); + EXPECT_EQ(settings.RepoURL(), game.RepoURL()); + EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); - EXPECT_EQ(settings.GamePath(), game.GamePath()); - EXPECT_EQ(settings.DataPath(), game.DataPath()); - EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); - EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); + EXPECT_EQ(settings.GamePath(), game.GamePath()); + EXPECT_EQ(settings.DataPath(), game.DataPath()); + EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); + EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); - EXPECT_FALSE(game.ArePluginsFullyLoaded()); + EXPECT_FALSE(game.ArePluginsFullyLoaded()); - game = loot::Game(loot::Game::tes5, "folder"); - settings = loot::GameSettings(loot::GameSettings::tes5, "folder"); + game = Game(Game::tes5, "folder"); + settings = GameSettings(GameSettings::tes5, "folder"); - EXPECT_EQ(loot::Game::tes5, game.Id()); - EXPECT_EQ(settings.Name(), game.Name()); - EXPECT_EQ(settings.FolderName(), game.FolderName()); - EXPECT_EQ(settings.Master(), game.Master()); - EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); - EXPECT_EQ(settings.RepoURL(), game.RepoURL()); - EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); + EXPECT_EQ(Game::tes5, game.Id()); + EXPECT_EQ(settings.Name(), game.Name()); + EXPECT_EQ(settings.FolderName(), game.FolderName()); + EXPECT_EQ(settings.Master(), game.Master()); + EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); + EXPECT_EQ(settings.RepoURL(), game.RepoURL()); + EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); - EXPECT_EQ(settings.GamePath(), game.GamePath()); - EXPECT_EQ(settings.DataPath(), game.DataPath()); - EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); - EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); + EXPECT_EQ(settings.GamePath(), game.GamePath()); + EXPECT_EQ(settings.DataPath(), game.DataPath()); + EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); + EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); - EXPECT_FALSE(game.ArePluginsFullyLoaded()); + EXPECT_FALSE(game.ArePluginsFullyLoaded()); - game = loot::Game(settings); + game = Game(settings); - EXPECT_EQ(loot::Game::tes5, game.Id()); - EXPECT_EQ(settings.Name(), game.Name()); - EXPECT_EQ(settings.FolderName(), game.FolderName()); - EXPECT_EQ(settings.Master(), game.Master()); - EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); - EXPECT_EQ(settings.RepoURL(), game.RepoURL()); - EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); + EXPECT_EQ(Game::tes5, game.Id()); + EXPECT_EQ(settings.Name(), game.Name()); + EXPECT_EQ(settings.FolderName(), game.FolderName()); + EXPECT_EQ(settings.Master(), game.Master()); + EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); + EXPECT_EQ(settings.RepoURL(), game.RepoURL()); + EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); - EXPECT_EQ(settings.GamePath(), game.GamePath()); - EXPECT_EQ(settings.DataPath(), game.DataPath()); - EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); - EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); + EXPECT_EQ(settings.GamePath(), game.GamePath()); + EXPECT_EQ(settings.DataPath(), game.DataPath()); + EXPECT_EQ(settings.MasterlistPath(), game.MasterlistPath()); + EXPECT_EQ(settings.UserlistPath(), game.UserlistPath()); - EXPECT_FALSE(game.ArePluginsFullyLoaded()); -} + EXPECT_FALSE(game.ArePluginsFullyLoaded()); + } -TEST_F(Game, Init) { - // Should throw for invalid ID. - loot::Game game; - EXPECT_THROW(game.Init(false), loot::error); - EXPECT_THROW(game.Init(true), loot::error); - EXPECT_THROW(game.Init(false, localPath), loot::error); - EXPECT_THROW(game.Init(true, localPath), loot::error); + TEST_F(GameTest, Init) { + // Should throw for invalid ID. + Game game; + EXPECT_THROW(game.Init(false), error); + EXPECT_THROW(game.Init(true), error); + EXPECT_THROW(game.Init(false, localPath), error); + EXPECT_THROW(game.Init(true, localPath), error); #ifndef _WIN32 // No point testing installation detection on Windows, because it will // find real installs, and the multi-game fixtures are set up so that they // won't get auto-detected. Test for failure on Linux though. - game = loot::Game(loot::Game::tes5); - EXPECT_THROW(game.Init(false), loot::error); - EXPECT_THROW(game.Init(true), loot::error); - EXPECT_THROW(game.Init(false, localPath), loot::error); - EXPECT_THROW(game.Init(true, localPath), loot::error); + game = Game(Game::tes5); + EXPECT_THROW(game.Init(false), error); + EXPECT_THROW(game.Init(true), error); + EXPECT_THROW(game.Init(false, localPath), error); + EXPECT_THROW(game.Init(true, localPath), error); - // No point testing LOOT folder creation on Windows, because there may be - // a real LOOT install. - // Not supplying a game local path on Linux should throw an exception. - game = loot::Game(loot::Game::tes5).SetGamePath(dataPath.parent_path()); - ASSERT_FALSE(boost::filesystem::exists(loot::g_path_local / game.FolderName())); - EXPECT_THROW(game.Init(false), loot::error); - EXPECT_FALSE(boost::filesystem::exists(loot::g_path_local / game.FolderName())); + // No point testing LOOT folder creation on Windows, because there may be + // a real LOOT install. + // Not supplying a game local path on Linux should throw an exception. + game = Game(Game::tes5).SetGamePath(dataPath.parent_path()); + ASSERT_FALSE(boost::filesystem::exists(g_path_local / game.FolderName())); + EXPECT_THROW(game.Init(false), error); + EXPECT_FALSE(boost::filesystem::exists(g_path_local / game.FolderName())); - game = loot::Game(loot::Game::tes5).SetGamePath(dataPath.parent_path()); - EXPECT_NO_THROW(game.Init(false, localPath)); - EXPECT_FALSE(boost::filesystem::exists(loot::g_path_local / game.FolderName())); - EXPECT_TRUE(game.IsPluginActive("Skyrim.esm")); - EXPECT_TRUE(game.IsPluginActive("skyrim.esm")); - EXPECT_TRUE(game.IsPluginActive("Blank.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different Master Dependent.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esp")); - EXPECT_TRUE(game.IsPluginActive("Blank - Different Master Dependent.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Plugin Dependent.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different Plugin Dependent.esp")); + game = Game(Game::tes5).SetGamePath(dataPath.parent_path()); + EXPECT_NO_THROW(game.Init(false, localPath)); + EXPECT_FALSE(boost::filesystem::exists(g_path_local / game.FolderName())); + EXPECT_TRUE(game.IsPluginActive("Skyrim.esm")); + EXPECT_TRUE(game.IsPluginActive("skyrim.esm")); + EXPECT_TRUE(game.IsPluginActive("Blank.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different Master Dependent.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esp")); + EXPECT_TRUE(game.IsPluginActive("Blank - Different Master Dependent.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Plugin Dependent.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different Plugin Dependent.esp")); - game = loot::Game(loot::Game::tes5).SetGamePath(dataPath.parent_path()); - EXPECT_NO_THROW(game.Init(true, localPath)); - EXPECT_TRUE(boost::filesystem::exists(loot::g_path_local / game.FolderName())); - EXPECT_TRUE(game.IsPluginActive("Skyrim.esm")); - EXPECT_TRUE(game.IsPluginActive("skyrim.esm")); - EXPECT_TRUE(game.IsPluginActive("Blank.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different Master Dependent.esm")); - EXPECT_FALSE(game.IsPluginActive("Blank.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esp")); - EXPECT_TRUE(game.IsPluginActive("Blank - Different Master Dependent.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Plugin Dependent.esp")); - EXPECT_FALSE(game.IsPluginActive("Blank - Different Plugin Dependent.esp")); + game = Game(Game::tes5).SetGamePath(dataPath.parent_path()); + EXPECT_NO_THROW(game.Init(true, localPath)); + EXPECT_TRUE(boost::filesystem::exists(g_path_local / game.FolderName())); + EXPECT_TRUE(game.IsPluginActive("Skyrim.esm")); + EXPECT_TRUE(game.IsPluginActive("skyrim.esm")); + EXPECT_TRUE(game.IsPluginActive("Blank.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different Master Dependent.esm")); + EXPECT_FALSE(game.IsPluginActive("Blank.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Master Dependent.esp")); + EXPECT_TRUE(game.IsPluginActive("Blank - Different Master Dependent.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Plugin Dependent.esp")); + EXPECT_FALSE(game.IsPluginActive("Blank - Different Plugin Dependent.esp")); #else - game = loot::Game(loot::Game::tes5).SetGamePath(dataPath.parent_path()); - EXPECT_NO_THROW(game.Init(false)); + game = Game(Game::tes5).SetGamePath(dataPath.parent_path()); + EXPECT_NO_THROW(game.Init(false)); - game = loot::Game(loot::Game::tes5).SetGamePath(dataPath.parent_path()); - EXPECT_NO_THROW(game.Init(false, localPath)); + game = Game(Game::tes5).SetGamePath(dataPath.parent_path()); + EXPECT_NO_THROW(game.Init(false, localPath)); #endif -} + } -TEST_F(Game, RedatePlugins) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); + TEST_F(GameTest, RedatePlugins) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); - // Throw because game hasn't been initialised yet. - EXPECT_THROW(game.RedatePlugins(), loot::error); + // Throw because game hasn't been initialised yet. + EXPECT_THROW(game.RedatePlugins(), error); - game.Init(false, localPath); + game.Init(false, localPath); - std::vector loadOrder({ - "Skyrim.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Master Dependent.esm.ghost", - "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", - }); + std::vector loadOrder({ + "Skyrim.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Master Dependent.esm.ghost", + "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", + }); - time_t time = boost::filesystem::last_write_time(dataPath / "Skyrim.esm"); - // First set reverse timestamps to be sure. - for (size_t i = 1; i < loadOrder.size(); ++i) { - boost::filesystem::last_write_time(dataPath / loadOrder[i], time - i * 60); - ASSERT_EQ(time - i * 60, boost::filesystem::last_write_time(dataPath / loadOrder[i])); - } - EXPECT_NO_THROW(game.RedatePlugins()); - EXPECT_EQ(time, boost::filesystem::last_write_time(dataPath / "Skyrim.esm")); - for (size_t i = 1; i < loadOrder.size(); ++i) { - ASSERT_EQ(time + i * 60, boost::filesystem::last_write_time(dataPath / loadOrder[i])); + time_t time = boost::filesystem::last_write_time(dataPath / "Skyrim.esm"); + // First set reverse timestamps to be sure. + for (size_t i = 1; i < loadOrder.size(); ++i) { + boost::filesystem::last_write_time(dataPath / loadOrder[i], time - i * 60); + ASSERT_EQ(time - i * 60, boost::filesystem::last_write_time(dataPath / loadOrder[i])); + } + EXPECT_NO_THROW(game.RedatePlugins()); + EXPECT_EQ(time, boost::filesystem::last_write_time(dataPath / "Skyrim.esm")); + for (size_t i = 1; i < loadOrder.size(); ++i) { + ASSERT_EQ(time + i * 60, boost::filesystem::last_write_time(dataPath / loadOrder[i])); + } + } + + TEST_F(GameTest, LoadPlugins) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + EXPECT_NO_THROW(game.LoadPlugins(false)); + EXPECT_EQ(11, game.GetPlugins().size()); + + // Check that all the plugins' data have loaded correctly. + ASSERT_NO_THROW(game.GetPlugin("Skyrim.esm")); + Plugin plugin = game.GetPlugin("Skyrim.esm"); + EXPECT_EQ("Skyrim.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Skyrim.esm", std::vector(), 0xCF0), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF1), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF2), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF3), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF4), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF5), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF6), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF7), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF8), + libespm::FormId("Skyrim.esm", std::vector(), 0xCF9), + }), plugin.getFormIds()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("v5.0", plugin.getDescription()); + EXPECT_EQ(0x187BE342, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank.esm")); + plugin = game.GetPlugin("blank.esm"); + EXPECT_EQ("Blank.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esm", std::vector(), 0xCF0), + libespm::FormId("Blank.esm", std::vector(), 0xCF1), + libespm::FormId("Blank.esm", std::vector(), 0xCF2), + libespm::FormId("Blank.esm", std::vector(), 0xCF3), + libespm::FormId("Blank.esm", std::vector(), 0xCF4), + libespm::FormId("Blank.esm", std::vector(), 0xCF5), + libespm::FormId("Blank.esm", std::vector(), 0xCF6), + libespm::FormId("Blank.esm", std::vector(), 0xCF7), + libespm::FormId("Blank.esm", std::vector(), 0xCF8), + libespm::FormId("Blank.esm", std::vector(), 0xCF9), + }), plugin.getFormIds()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("v5.0", plugin.getDescription()); + EXPECT_EQ(0x187BE342, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("Blank - Different.esm")); + plugin = game.GetPlugin("Blank - Different.esm"); + EXPECT_EQ("Blank - Different.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank - Different.esm", std::vector(), 0xCEF), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF0), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF1), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF2), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF3), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF4), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF5), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF6), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF7), + }), plugin.getFormIds()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0x64B9F757, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esm")); + plugin = game.GetPlugin("blank - master dependent.esm"); + EXPECT_EQ("Blank - Master Dependent.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esm", std::vector(), 0xCF0), + libespm::FormId("Blank.esm", std::vector(), 0xCF1), + libespm::FormId("Blank.esm", std::vector(), 0xCF2), + libespm::FormId("Blank.esm", std::vector(), 0xCF3), + libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCEA), + libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCEB), + libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCEC), + libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCED), + }), plugin.getFormIds()); + EXPECT_EQ(std::vector({ + "Blank.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0xB2D4119E, plugin.Crc()); + EXPECT_EQ(4, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esm")); + plugin = game.GetPlugin("blank - different master dependent.esm"); + EXPECT_EQ("Blank - Different Master Dependent.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank - Different.esm", std::vector(), 0xCEF), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF0), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF1), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF2), + libespm::FormId("Blank - Different Master Dependent.esm", std::vector(), 0xCE9), + libespm::FormId("Blank - Different Master Dependent.esm", std::vector(), 0xCEA), + libespm::FormId("Blank - Different Master Dependent.esm", std::vector(), 0xCEB), + }), plugin.getFormIds()); + EXPECT_EQ(std::vector({ + "Blank - Different.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0xAADF6710, plugin.Crc()); + EXPECT_EQ(4, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank.esp")); + plugin = game.GetPlugin("blank.esp"); + EXPECT_EQ("Blank.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esp", std::vector(), 0xCEC), + libespm::FormId("Blank.esp", std::vector(), 0xCED), + libespm::FormId("Blank.esp", std::vector(), 0xCEE), + libespm::FormId("Blank.esp", std::vector(), 0xCEF), + libespm::FormId("Blank.esp", std::vector(), 0xCF0), + libespm::FormId("Blank.esp", std::vector(), 0xCF1), + }), plugin.getFormIds()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("\xE2\x82\xAC\xC6\x92\xC5\xA0", plugin.getDescription()); + EXPECT_EQ(0x24F0E2A1, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different.esp")); + plugin = game.GetPlugin("blank - different.esp"); + EXPECT_EQ("Blank - Different.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank - Different.esp", std::vector(), 0xCEB), + libespm::FormId("Blank - Different.esp", std::vector(), 0xCEC), + libespm::FormId("Blank - Different.esp", std::vector(), 0xCED), + libespm::FormId("Blank - Different.esp", std::vector(), 0xCEE), + libespm::FormId("Blank - Different.esp", std::vector(), 0xCEF), + }), plugin.getFormIds()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0xD4C9B7AE, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esp")); + plugin = game.GetPlugin("blank - master dependent.esp"); + EXPECT_EQ("Blank - Master Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esm", std::vector(), 0xCF0), + libespm::FormId("Blank.esm", std::vector(), 0xCF1), + libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCE9), + libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCEA), + }), plugin.getFormIds()); + EXPECT_EQ(std::vector({ + "Blank.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0x832152DC, plugin.Crc()); + EXPECT_EQ(2, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esp")); + plugin = game.GetPlugin("blank - different master dependent.esp"); + EXPECT_EQ("Blank - Different Master Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank - Different.esm", std::vector(), 0xCEF), + libespm::FormId("Blank - Different.esm", std::vector(), 0xCF0), + libespm::FormId("Blank - Different Master Dependent.esp", std::vector(), 0xCE7), + }), plugin.getFormIds()); + EXPECT_EQ(std::vector({ + "Blank - Different.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0x3AD17683, plugin.Crc()); + EXPECT_EQ(2, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - plugin dependent.esp")); + plugin = game.GetPlugin("blank - plugin dependent.esp"); + EXPECT_EQ("Blank - Plugin Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esp", std::vector(), 0xCEC), + libespm::FormId("Blank - Plugin Dependent.esp", std::vector(), 0xCE7), + }), plugin.getFormIds()); + EXPECT_EQ(std::vector({ + "Blank.esp" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0x28EF26DB, plugin.Crc()); + EXPECT_EQ(1, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different plugin dependent.esp")); + plugin = game.GetPlugin("blank - different plugin dependent.esp"); + EXPECT_EQ("Blank - Different Plugin Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank - Different.esp", std::vector(), 0xCEB), + }), plugin.getFormIds()); + EXPECT_EQ(std::vector({ + "Blank - Different.esp" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0xEB47BE63, plugin.Crc()); + EXPECT_EQ(1, plugin.NumOverrideFormIDs()); + } + + TEST_F(GameTest, LoadPlugins_HeadersOnly) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + EXPECT_NO_THROW(game.LoadPlugins(true)); + EXPECT_EQ(11, game.GetPlugins().size()); + + // Check that all the plugins' data have loaded correctly. + ASSERT_NO_THROW(game.GetPlugin("Skyrim.esm")); + Plugin plugin = game.GetPlugin("Skyrim.esm"); + EXPECT_EQ("Skyrim.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("v5.0", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank.esm")); + plugin = game.GetPlugin("blank.esm"); + EXPECT_EQ("Blank.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("v5.0", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("Blank - Different.esm")); + plugin = game.GetPlugin("Blank - Different.esm"); + EXPECT_EQ("Blank - Different.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esm")); + plugin = game.GetPlugin("blank - master dependent.esm"); + EXPECT_EQ("Blank - Master Dependent.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_EQ(std::vector({ + "Blank.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esm")); + plugin = game.GetPlugin("blank - different master dependent.esm"); + EXPECT_EQ("Blank - Different Master Dependent.esm", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_EQ(std::vector({ + "Blank - Different.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank.esp")); + plugin = game.GetPlugin("blank.esp"); + EXPECT_EQ("Blank.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("\xE2\x82\xAC\xC6\x92\xC5\xA0", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different.esp")); + plugin = game.GetPlugin("blank - different.esp"); + EXPECT_EQ("Blank - Different.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esp")); + plugin = game.GetPlugin("blank - master dependent.esp"); + EXPECT_EQ("Blank - Master Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_EQ(std::vector({ + "Blank.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esp")); + plugin = game.GetPlugin("blank - different master dependent.esp"); + EXPECT_EQ("Blank - Different Master Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_EQ(std::vector({ + "Blank - Different.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - plugin dependent.esp")); + plugin = game.GetPlugin("blank - plugin dependent.esp"); + EXPECT_EQ("Blank - Plugin Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_EQ(std::vector({ + "Blank.esp" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + + ASSERT_NO_THROW(game.GetPlugin("blank - different plugin dependent.esp")); + plugin = game.GetPlugin("blank - different plugin dependent.esp"); + EXPECT_EQ("Blank - Different Plugin Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_EQ(std::vector({ + "Blank - Different.esp" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + EXPECT_EQ(0, plugin.NumOverrideFormIDs()); + } + + TEST_F(GameTest, ArePluginsFullyLoaded) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + EXPECT_FALSE(game.ArePluginsFullyLoaded()); + + ASSERT_NO_THROW(game.LoadPlugins(false)); + EXPECT_TRUE(game.ArePluginsFullyLoaded()); + } + + TEST_F(GameTest, shouldThrowIfCheckingIfPluginThatIsntLoadedIsActiveAndGameHasNotBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + EXPECT_ANY_THROW(game.IsPluginActive("Blank.esm")); + } + + TEST_F(GameTest, shouldShowBlankEsmAsActiveIfItHasNotBeenLoadedAndTheGameHasBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + EXPECT_TRUE(game.IsPluginActive("Blank.esm")); + } + + TEST_F(GameTest, shouldShowBlankEspAsInctiveIfItHasNotBeenLoadedAndTheGameHasBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + EXPECT_FALSE(game.IsPluginActive("Blank.esp")); + } + + TEST_F(GameTest, shouldShowBlankEsmAsInactiveIfItsHeaderHasBeenLoadedAndGameHasNotBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + EXPECT_FALSE(game.IsPluginActive("Blank.esm")); + } + + TEST_F(GameTest, shouldShowBlankEspAsActiveIfItsHeaderHasBeenLoadedAndGameHasNotBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + EXPECT_FALSE(game.IsPluginActive("Blank.esp")); + } + + TEST_F(GameTest, shouldShowBlankEsmAsActiveIfItsHeaderHasBeenLoadedAndTheGameHasBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + EXPECT_TRUE(game.IsPluginActive("Blank.esm")); + } + + TEST_F(GameTest, shouldShowBlankEspAsActiveIfItsHeaderHasBeenLoadedAndTheGameHasBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + EXPECT_FALSE(game.IsPluginActive("Blank.esp")); + } + + TEST_F(GameTest, shouldShowBlankEsmAsActiveIfItHasBeenFullyLoadedAndTheGameHasBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(false)); + + EXPECT_TRUE(game.IsPluginActive("Blank.esm")); + } + + TEST_F(GameTest, shouldShowBlankEspAsActiveIfItHasBeenFullyLoadedAndTheGameHasBeenInitialised) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(false)); + + EXPECT_FALSE(game.IsPluginActive("Blank.esp")); + } } } -TEST_F(Game, LoadPlugins) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - EXPECT_NO_THROW(game.LoadPlugins(false)); - EXPECT_EQ(11, game.GetPlugins().size()); - - // Check that all the plugins' data have loaded correctly. - ASSERT_NO_THROW(game.GetPlugin("Skyrim.esm")); - loot::Plugin plugin = game.GetPlugin("Skyrim.esm"); - EXPECT_EQ("Skyrim.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Skyrim.esm", std::vector(), 0xCF0), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF1), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF2), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF3), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF4), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF5), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF6), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF7), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF8), - libespm::FormId("Skyrim.esm", std::vector(), 0xCF9), - }), plugin.getFormIds()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("v5.0", plugin.getDescription()); - EXPECT_EQ(0x187BE342, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank.esm")); - plugin = game.GetPlugin("blank.esm"); - EXPECT_EQ("Blank.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esm", std::vector(), 0xCF0), - libespm::FormId("Blank.esm", std::vector(), 0xCF1), - libespm::FormId("Blank.esm", std::vector(), 0xCF2), - libespm::FormId("Blank.esm", std::vector(), 0xCF3), - libespm::FormId("Blank.esm", std::vector(), 0xCF4), - libespm::FormId("Blank.esm", std::vector(), 0xCF5), - libespm::FormId("Blank.esm", std::vector(), 0xCF6), - libespm::FormId("Blank.esm", std::vector(), 0xCF7), - libespm::FormId("Blank.esm", std::vector(), 0xCF8), - libespm::FormId("Blank.esm", std::vector(), 0xCF9), - }), plugin.getFormIds()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("v5.0", plugin.getDescription()); - EXPECT_EQ(0x187BE342, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("Blank - Different.esm")); - plugin = game.GetPlugin("Blank - Different.esm"); - EXPECT_EQ("Blank - Different.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank - Different.esm", std::vector(), 0xCEF), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF0), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF1), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF2), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF3), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF4), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF5), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF6), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF7), - }), plugin.getFormIds()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0x64B9F757, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esm")); - plugin = game.GetPlugin("blank - master dependent.esm"); - EXPECT_EQ("Blank - Master Dependent.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esm", std::vector(), 0xCF0), - libespm::FormId("Blank.esm", std::vector(), 0xCF1), - libespm::FormId("Blank.esm", std::vector(), 0xCF2), - libespm::FormId("Blank.esm", std::vector(), 0xCF3), - libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCEA), - libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCEB), - libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCEC), - libespm::FormId("Blank - Master Dependent.esm", std::vector(), 0xCED), - }), plugin.getFormIds()); - EXPECT_EQ(std::vector({ - "Blank.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0xB2D4119E, plugin.Crc()); - EXPECT_EQ(4, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esm")); - plugin = game.GetPlugin("blank - different master dependent.esm"); - EXPECT_EQ("Blank - Different Master Dependent.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank - Different.esm", std::vector(), 0xCEF), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF0), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF1), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF2), - libespm::FormId("Blank - Different Master Dependent.esm", std::vector(), 0xCE9), - libespm::FormId("Blank - Different Master Dependent.esm", std::vector(), 0xCEA), - libespm::FormId("Blank - Different Master Dependent.esm", std::vector(), 0xCEB), - }), plugin.getFormIds()); - EXPECT_EQ(std::vector({ - "Blank - Different.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0xAADF6710, plugin.Crc()); - EXPECT_EQ(4, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank.esp")); - plugin = game.GetPlugin("blank.esp"); - EXPECT_EQ("Blank.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esp", std::vector(), 0xCEC), - libespm::FormId("Blank.esp", std::vector(), 0xCED), - libespm::FormId("Blank.esp", std::vector(), 0xCEE), - libespm::FormId("Blank.esp", std::vector(), 0xCEF), - libespm::FormId("Blank.esp", std::vector(), 0xCF0), - libespm::FormId("Blank.esp", std::vector(), 0xCF1), - }), plugin.getFormIds()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("\xE2\x82\xAC\xC6\x92\xC5\xA0", plugin.getDescription()); - EXPECT_EQ(0x24F0E2A1, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different.esp")); - plugin = game.GetPlugin("blank - different.esp"); - EXPECT_EQ("Blank - Different.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank - Different.esp", std::vector(), 0xCEB), - libespm::FormId("Blank - Different.esp", std::vector(), 0xCEC), - libespm::FormId("Blank - Different.esp", std::vector(), 0xCED), - libespm::FormId("Blank - Different.esp", std::vector(), 0xCEE), - libespm::FormId("Blank - Different.esp", std::vector(), 0xCEF), - }), plugin.getFormIds()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0xD4C9B7AE, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esp")); - plugin = game.GetPlugin("blank - master dependent.esp"); - EXPECT_EQ("Blank - Master Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esm", std::vector(), 0xCF0), - libespm::FormId("Blank.esm", std::vector(), 0xCF1), - libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCE9), - libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCEA), - }), plugin.getFormIds()); - EXPECT_EQ(std::vector({ - "Blank.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0x832152DC, plugin.Crc()); - EXPECT_EQ(2, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esp")); - plugin = game.GetPlugin("blank - different master dependent.esp"); - EXPECT_EQ("Blank - Different Master Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank - Different.esm", std::vector(), 0xCEF), - libespm::FormId("Blank - Different.esm", std::vector(), 0xCF0), - libespm::FormId("Blank - Different Master Dependent.esp", std::vector(), 0xCE7), - }), plugin.getFormIds()); - EXPECT_EQ(std::vector({ - "Blank - Different.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0x3AD17683, plugin.Crc()); - EXPECT_EQ(2, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - plugin dependent.esp")); - plugin = game.GetPlugin("blank - plugin dependent.esp"); - EXPECT_EQ("Blank - Plugin Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esp", std::vector(), 0xCEC), - libespm::FormId("Blank - Plugin Dependent.esp", std::vector(), 0xCE7), - }), plugin.getFormIds()); - EXPECT_EQ(std::vector({ - "Blank.esp" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0x28EF26DB, plugin.Crc()); - EXPECT_EQ(1, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different plugin dependent.esp")); - plugin = game.GetPlugin("blank - different plugin dependent.esp"); - EXPECT_EQ("Blank - Different Plugin Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank - Different.esp", std::vector(), 0xCEB), - }), plugin.getFormIds()); - EXPECT_EQ(std::vector({ - "Blank - Different.esp" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0xEB47BE63, plugin.Crc()); - EXPECT_EQ(1, plugin.NumOverrideFormIDs()); -} - -TEST_F(Game, LoadPlugins_HeadersOnly) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - EXPECT_NO_THROW(game.LoadPlugins(true)); - EXPECT_EQ(11, game.GetPlugins().size()); - - // Check that all the plugins' data have loaded correctly. - ASSERT_NO_THROW(game.GetPlugin("Skyrim.esm")); - loot::Plugin plugin = game.GetPlugin("Skyrim.esm"); - EXPECT_EQ("Skyrim.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("v5.0", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank.esm")); - plugin = game.GetPlugin("blank.esm"); - EXPECT_EQ("Blank.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("v5.0", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("Blank - Different.esm")); - plugin = game.GetPlugin("Blank - Different.esm"); - EXPECT_EQ("Blank - Different.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esm")); - plugin = game.GetPlugin("blank - master dependent.esm"); - EXPECT_EQ("Blank - Master Dependent.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_EQ(std::vector({ - "Blank.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esm")); - plugin = game.GetPlugin("blank - different master dependent.esm"); - EXPECT_EQ("Blank - Different Master Dependent.esm", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_EQ(std::vector({ - "Blank - Different.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank.esp")); - plugin = game.GetPlugin("blank.esp"); - EXPECT_EQ("Blank.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("\xE2\x82\xAC\xC6\x92\xC5\xA0", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different.esp")); - plugin = game.GetPlugin("blank - different.esp"); - EXPECT_EQ("Blank - Different.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - master dependent.esp")); - plugin = game.GetPlugin("blank - master dependent.esp"); - EXPECT_EQ("Blank - Master Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_EQ(std::vector({ - "Blank.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different master dependent.esp")); - plugin = game.GetPlugin("blank - different master dependent.esp"); - EXPECT_EQ("Blank - Different Master Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_EQ(std::vector({ - "Blank - Different.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - plugin dependent.esp")); - plugin = game.GetPlugin("blank - plugin dependent.esp"); - EXPECT_EQ("Blank - Plugin Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_EQ(std::vector({ - "Blank.esp" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); - - ASSERT_NO_THROW(game.GetPlugin("blank - different plugin dependent.esp")); - plugin = game.GetPlugin("blank - different plugin dependent.esp"); - EXPECT_EQ("Blank - Different Plugin Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_EQ(std::vector({ - "Blank - Different.esp" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - EXPECT_EQ(0, plugin.NumOverrideFormIDs()); -} - -TEST_F(Game, ArePluginsFullyLoaded) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - EXPECT_FALSE(game.ArePluginsFullyLoaded()); - - ASSERT_NO_THROW(game.LoadPlugins(false)); - EXPECT_TRUE(game.ArePluginsFullyLoaded()); -} - -TEST_F(Game, shouldThrowIfCheckingIfPluginThatIsntLoadedIsActiveAndGameHasNotBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - EXPECT_ANY_THROW(game.IsPluginActive("Blank.esm")); -} - -TEST_F(Game, shouldShowBlankEsmAsActiveIfItHasNotBeenLoadedAndTheGameHasBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - EXPECT_TRUE(game.IsPluginActive("Blank.esm")); -} - -TEST_F(Game, shouldShowBlankEspAsInctiveIfItHasNotBeenLoadedAndTheGameHasBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - EXPECT_FALSE(game.IsPluginActive("Blank.esp")); -} - -TEST_F(Game, shouldShowBlankEsmAsInactiveIfItsHeaderHasBeenLoadedAndGameHasNotBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - EXPECT_FALSE(game.IsPluginActive("Blank.esm")); -} - -TEST_F(Game, shouldShowBlankEspAsActiveIfItsHeaderHasBeenLoadedAndGameHasNotBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - EXPECT_FALSE(game.IsPluginActive("Blank.esp")); -} - -TEST_F(Game, shouldShowBlankEsmAsActiveIfItsHeaderHasBeenLoadedAndTheGameHasBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - EXPECT_TRUE(game.IsPluginActive("Blank.esm")); -} - -TEST_F(Game, shouldShowBlankEspAsActiveIfItsHeaderHasBeenLoadedAndTheGameHasBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - EXPECT_FALSE(game.IsPluginActive("Blank.esp")); -} - -TEST_F(Game, shouldShowBlankEsmAsActiveIfItHasBeenFullyLoadedAndTheGameHasBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(false)); - - EXPECT_TRUE(game.IsPluginActive("Blank.esm")); -} - -TEST_F(Game, shouldShowBlankEspAsActiveIfItHasBeenFullyLoadedAndTheGameHasBeenInitialised) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(false)); - - EXPECT_FALSE(game.IsPluginActive("Blank.esp")); -} - #endif diff --git a/src/tests/backend/game/test_game_cache.h b/src/tests/backend/game/test_game_cache.h index 6a6f734d..aa718c68 100644 --- a/src/tests/backend/game/test_game_cache.h +++ b/src/tests/backend/game/test_game_cache.h @@ -31,120 +31,120 @@ along with LOOT. If not, see namespace loot { namespace test { - class GameCache : public SkyrimTest { + class GameCacheTest : public SkyrimTest { protected: - loot::GameCache cache; + GameCache cache; }; - TEST_F(GameCache, copyConstructorShouldCopyCachedData) { - loot::Game game(loot::Game::tes5); + TEST_F(GameCacheTest, copyConstructorShouldCopyCachedData) { + Game game(Game::tes5); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); cache.CacheCondition("True Condition", true); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", true)); + cache.AddPlugin(Plugin(game, "Blank.esm", true)); Message expectedMessage(Message::say, "1"); cache.AppendMessage(expectedMessage); cache.SetLoadOrderSorted(true); - loot::GameCache otherCache(cache); + GameCache otherCache(cache); EXPECT_EQ(std::make_pair(true, true), otherCache.GetCachedCondition("true Condition")); EXPECT_EQ("Blank.esm", otherCache.GetPlugin("Blank.esm").Name()); ASSERT_EQ(1, otherCache.GetMessages().size()); EXPECT_EQ(expectedMessage, otherCache.GetMessages()[0]); } - TEST_F(GameCache, assignmentOperatorShouldCopyCachedData) { - loot::Game game(loot::Game::tes5); + TEST_F(GameCacheTest, assignmentOperatorShouldCopyCachedData) { + Game game(Game::tes5); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); cache.CacheCondition("True Condition", true); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", true)); + cache.AddPlugin(Plugin(game, "Blank.esm", true)); Message expectedMessage(Message::say, "1"); cache.AppendMessage(expectedMessage); cache.SetLoadOrderSorted(true); - loot::GameCache otherCache = cache; + GameCache otherCache = cache; EXPECT_EQ(std::make_pair(true, true), otherCache.GetCachedCondition("true Condition")); EXPECT_EQ("Blank.esm", otherCache.GetPlugin("Blank.esm").Name()); ASSERT_EQ(1, otherCache.GetMessages().size()); EXPECT_EQ(expectedMessage, otherCache.GetMessages()[0]); } - TEST_F(GameCache, gettingATrueConditionShouldReturnATrueTruePair) { + TEST_F(GameCacheTest, gettingATrueConditionShouldReturnATrueTruePair) { EXPECT_NO_THROW(cache.CacheCondition("True Condition", true)); EXPECT_EQ(std::make_pair(true, true), cache.GetCachedCondition("true Condition")); } - TEST_F(GameCache, gettingAFalseConditionShouldReturnAFalseTruePair) { + TEST_F(GameCacheTest, gettingAFalseConditionShouldReturnAFalseTruePair) { EXPECT_NO_THROW(cache.CacheCondition("False Condition", false)); EXPECT_EQ(std::make_pair(false, true), cache.GetCachedCondition("false Condition")); } - TEST_F(GameCache, gettingANonCachedConditionShouldReturnAFalseFalsePair) { + TEST_F(GameCacheTest, gettingANonCachedConditionShouldReturnAFalseFalsePair) { EXPECT_EQ(std::make_pair(false, false), cache.GetCachedCondition("true missing Condition")); } - TEST_F(GameCache, addingAPluginThatDoesNotExistShouldSucceed) { - loot::Game game(loot::Game::tes5); + TEST_F(GameCacheTest, addingAPluginThatDoesNotExistShouldSucceed) { + Game game(Game::tes5); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", true)); + cache.AddPlugin(Plugin(game, "Blank.esm", true)); EXPECT_EQ("Blank.esm", cache.GetPlugin("Blank.esm").Name()); } - TEST_F(GameCache, addingAPluginThatIsAlreadyCachedShouldOverwriteExistingEntry) { - loot::Game game(loot::Game::tes5); + TEST_F(GameCacheTest, addingAPluginThatIsAlreadyCachedShouldOverwriteExistingEntry) { + Game game(Game::tes5); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", true)); + cache.AddPlugin(Plugin(game, "Blank.esm", true)); EXPECT_EQ(0, cache.GetPlugin("Blank.esm").Crc()); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", false)); + cache.AddPlugin(Plugin(game, "Blank.esm", false)); EXPECT_EQ(0x187BE342, cache.GetPlugin("Blank.esm").Crc()); } - TEST_F(GameCache, gettingAPluginThatIsNotCachedShouldThrow) { + TEST_F(GameCacheTest, gettingAPluginThatIsNotCachedShouldThrow) { EXPECT_ANY_THROW(cache.GetPlugin("Blank.esm")); } - TEST_F(GameCache, gettingAPluginShouldBeCaseInsensitive) { - loot::Game game(loot::Game::tes5); + TEST_F(GameCacheTest, gettingAPluginShouldBeCaseInsensitive) { + Game game(Game::tes5); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", true)); + cache.AddPlugin(Plugin(game, "Blank.esm", true)); EXPECT_EQ("Blank.esm", cache.GetPlugin("blanK.esm").Name()); } - TEST_F(GameCache, gettingPluginsShouldReturnAnEmptySetIfNoPluginsHaveBeenCached) { + TEST_F(GameCacheTest, gettingPluginsShouldReturnAnEmptySetIfNoPluginsHaveBeenCached) { EXPECT_TRUE(cache.GetPlugins().empty()); } - TEST_F(GameCache, gettingPluginsShouldReturnASetOfCachedPluginsIfPluginsHaveBeenCached) { - loot::Game game(loot::Game::tes5); + TEST_F(GameCacheTest, gettingPluginsShouldReturnASetOfCachedPluginsIfPluginsHaveBeenCached) { + Game game(Game::tes5); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", true)); - cache.AddPlugin(loot::Plugin(game, "Blank - Master Dependent.esp", true)); + cache.AddPlugin(Plugin(game, "Blank.esm", true)); + cache.AddPlugin(Plugin(game, "Blank - Master Dependent.esp", true)); - EXPECT_EQ(std::set({ - loot::Plugin(game, "Blank.esm", true), - loot::Plugin(game, "Blank - Master Dependent.esp", true), + EXPECT_EQ(std::set({ + Plugin(game, "Blank.esm", true), + Plugin(game, "Blank - Master Dependent.esp", true), }), cache.GetPlugins()); } - TEST_F(GameCache, clearingCachedConditionsShouldNotThrowIfNoConditionsAreCached) { + TEST_F(GameCacheTest, clearingCachedConditionsShouldNotThrowIfNoConditionsAreCached) { EXPECT_NO_THROW(cache.ClearCachedConditions()); } - TEST_F(GameCache, clearingCachedConditionsShouldClearAnyCachedConditions) { + TEST_F(GameCacheTest, clearingCachedConditionsShouldClearAnyCachedConditions) { EXPECT_NO_THROW(cache.CacheCondition("True Condition", true)); EXPECT_NO_THROW(cache.ClearCachedConditions()); @@ -152,32 +152,32 @@ namespace loot { EXPECT_EQ(std::make_pair(false, false), cache.GetCachedCondition("true Condition")); } - TEST_F(GameCache, clearingCachedPluginsShouldNotThrowIfNoPluginsAreCached) { + TEST_F(GameCacheTest, clearingCachedPluginsShouldNotThrowIfNoPluginsAreCached) { EXPECT_NO_THROW(cache.ClearCachedPlugins()); } - TEST_F(GameCache, clearingCachedPluginsShouldClearAnyCachedPlugins) { - loot::Game game(loot::Game::tes5); + TEST_F(GameCacheTest, clearingCachedPluginsShouldClearAnyCachedPlugins) { + Game game(Game::tes5); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); - cache.AddPlugin(loot::Plugin(game, "Blank.esm", true)); + cache.AddPlugin(Plugin(game, "Blank.esm", true)); cache.ClearCachedPlugins(); EXPECT_TRUE(cache.GetPlugins().empty()); } - TEST_F(GameCache, aMessageShouldBeCachedByDefault) { + TEST_F(GameCacheTest, aMessageShouldBeCachedByDefault) { ASSERT_EQ(1, cache.GetMessages().size()); } - TEST_F(GameCache, settingLoadOrderSortedToTrueShouldSupressDefaultCachedMessage) { + TEST_F(GameCacheTest, settingLoadOrderSortedToTrueShouldSupressDefaultCachedMessage) { cache.SetLoadOrderSorted(true); ASSERT_TRUE(cache.GetMessages().empty()); } - TEST_F(GameCache, settingLoadOrderSortedToFalseShouldReverseTheDefaultCachedMessageSuppression) { + TEST_F(GameCacheTest, settingLoadOrderSortedToFalseShouldReverseTheDefaultCachedMessageSuppression) { auto expectedMessages = cache.GetMessages(); cache.SetLoadOrderSorted(true); cache.SetLoadOrderSorted(false); @@ -185,7 +185,7 @@ namespace loot { ASSERT_EQ(expectedMessages, cache.GetMessages()); } - TEST_F(GameCache, appendingMessagesShouldStoreThemInTheGivenOrder) { + TEST_F(GameCacheTest, appendingMessagesShouldStoreThemInTheGivenOrder) { std::vector messages({ Message(Message::say, "1"), Message(Message::error, "2"), @@ -198,7 +198,7 @@ namespace loot { EXPECT_EQ(messages[1], cache.GetMessages()[1]); } - TEST_F(GameCache, clearingMessagesShouldRemoveAllAppendedMessages) { + TEST_F(GameCacheTest, clearingMessagesShouldRemoveAllAppendedMessages) { std::vector messages({ Message(Message::say, "1"), Message(Message::error, "2"), diff --git a/src/tests/backend/game/test_game_settings.h b/src/tests/backend/game/test_game_settings.h index e6f95691..6b90b3bc 100644 --- a/src/tests/backend/game/test_game_settings.h +++ b/src/tests/backend/game/test_game_settings.h @@ -29,226 +29,230 @@ along with LOOT. If not, see #include "backend/game/game_settings.h" #include "tests/fixtures.h" -class GameSettings : public SkyrimTest {}; +namespace loot { + namespace test { + class GameSettingsTest : public SkyrimTest {}; -TEST_F(GameSettings, ConstructorsAndDataAccess) { - loot::GameSettings game; + TEST_F(GameSettingsTest, ConstructorsAndDataAccess) { + GameSettings game; - EXPECT_EQ(loot::GameSettings::autodetect, game.Id()); - EXPECT_EQ("", game.Name()); - EXPECT_EQ("", game.FolderName()); - EXPECT_EQ("", game.Master()); - EXPECT_EQ("", game.RegistryKey()); - EXPECT_EQ("", game.RepoURL()); - EXPECT_EQ("", game.RepoBranch()); + EXPECT_EQ(GameSettings::autodetect, game.Id()); + EXPECT_EQ("", game.Name()); + EXPECT_EQ("", game.FolderName()); + EXPECT_EQ("", game.Master()); + EXPECT_EQ("", game.RegistryKey()); + EXPECT_EQ("", game.RepoURL()); + EXPECT_EQ("", game.RepoBranch()); - EXPECT_EQ("", game.GamePath()); - EXPECT_EQ("", game.DataPath()); - EXPECT_EQ("", game.MasterlistPath()); - EXPECT_EQ("", game.UserlistPath()); + EXPECT_EQ("", game.GamePath()); + EXPECT_EQ("", game.DataPath()); + EXPECT_EQ("", game.MasterlistPath()); + EXPECT_EQ("", game.UserlistPath()); - game = loot::GameSettings(loot::GameSettings::tes5); + game = GameSettings(GameSettings::tes5); - EXPECT_EQ(loot::GameSettings::tes5, game.Id()); - EXPECT_EQ("TES V: Skyrim", game.Name()); - EXPECT_EQ("Skyrim", game.FolderName()); - EXPECT_EQ("Skyrim.esm", game.Master()); - EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", game.RegistryKey()); - EXPECT_EQ("https://github.com/loot/skyrim.git", game.RepoURL()); - // Repo branch changes between LOOT versions, so don't check an exact value. - EXPECT_NE("", game.RepoBranch()); + EXPECT_EQ(GameSettings::tes5, game.Id()); + EXPECT_EQ("TES V: Skyrim", game.Name()); + EXPECT_EQ("Skyrim", game.FolderName()); + EXPECT_EQ("Skyrim.esm", game.Master()); + EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", game.RegistryKey()); + EXPECT_EQ("https://github.com/loot/skyrim.git", game.RepoURL()); + // Repo branch changes between LOOT versions, so don't check an exact value. + EXPECT_NE("", game.RepoBranch()); - EXPECT_EQ("", game.GamePath()); - EXPECT_EQ("", game.DataPath()); - EXPECT_EQ(loot::g_path_local / "Skyrim" / "masterlist.yaml", game.MasterlistPath()); - EXPECT_EQ(loot::g_path_local / "Skyrim" / "userlist.yaml", game.UserlistPath()); + EXPECT_EQ("", game.GamePath()); + EXPECT_EQ("", game.DataPath()); + EXPECT_EQ(g_path_local / "Skyrim" / "masterlist.yaml", game.MasterlistPath()); + EXPECT_EQ(g_path_local / "Skyrim" / "userlist.yaml", game.UserlistPath()); - game = loot::GameSettings(loot::GameSettings::tes5, "folder"); + game = GameSettings(GameSettings::tes5, "folder"); - EXPECT_EQ(loot::GameSettings::tes5, game.Id()); - EXPECT_EQ("TES V: Skyrim", game.Name()); - EXPECT_EQ("folder", game.FolderName()); - EXPECT_EQ("Skyrim.esm", game.Master()); - EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", game.RegistryKey()); - EXPECT_EQ("https://github.com/loot/skyrim.git", game.RepoURL()); - // Repo branch changes between LOOT versions, so don't check an exact value. - EXPECT_NE("", game.RepoBranch()); + EXPECT_EQ(GameSettings::tes5, game.Id()); + EXPECT_EQ("TES V: Skyrim", game.Name()); + EXPECT_EQ("folder", game.FolderName()); + EXPECT_EQ("Skyrim.esm", game.Master()); + EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", game.RegistryKey()); + EXPECT_EQ("https://github.com/loot/skyrim.git", game.RepoURL()); + // Repo branch changes between LOOT versions, so don't check an exact value. + EXPECT_NE("", game.RepoBranch()); - EXPECT_EQ("", game.GamePath()); - EXPECT_EQ("", game.DataPath()); - EXPECT_EQ(loot::g_path_local / "folder" / "masterlist.yaml", game.MasterlistPath()); - EXPECT_EQ(loot::g_path_local / "folder" / "userlist.yaml", game.UserlistPath()); -} + EXPECT_EQ("", game.GamePath()); + EXPECT_EQ("", game.DataPath()); + EXPECT_EQ(g_path_local / "folder" / "masterlist.yaml", game.MasterlistPath()); + EXPECT_EQ(g_path_local / "folder" / "userlist.yaml", game.UserlistPath()); + } -TEST_F(GameSettings, IsInstalled) { - loot::GameSettings game; - EXPECT_FALSE(game.IsInstalled()); + TEST_F(GameSettingsTest, IsInstalled) { + GameSettings game; + EXPECT_FALSE(game.IsInstalled()); - game = loot::GameSettings(loot::GameSettings::tes5); - game.SetGamePath(dataPath.parent_path()); - EXPECT_TRUE(game.IsInstalled()); - EXPECT_EQ(dataPath.parent_path(), game.GamePath()); + game = GameSettings(GameSettings::tes5); + game.SetGamePath(dataPath.parent_path()); + EXPECT_TRUE(game.IsInstalled()); + EXPECT_EQ(dataPath.parent_path(), game.GamePath()); - game = loot::GameSettings(loot::GameSettings::fo3); - EXPECT_FALSE(game.IsInstalled()); -} + game = GameSettings(GameSettings::fo3); + EXPECT_FALSE(game.IsInstalled()); + } -TEST_F(GameSettings, EqualityOperators) { - loot::GameSettings game1, game2; - EXPECT_TRUE(game1 == game2); + TEST_F(GameSettingsTest, EqualityOperators) { + GameSettings game1, game2; + EXPECT_TRUE(game1 == game2); - game1 = loot::GameSettings(loot::GameSettings::tes5); - game2 = loot::GameSettings(loot::GameSettings::tes5); - EXPECT_TRUE(game1 == game2); + game1 = GameSettings(GameSettings::tes5); + game2 = GameSettings(GameSettings::tes5); + EXPECT_TRUE(game1 == game2); - game1 = loot::GameSettings(loot::GameSettings::tes5, "game1") - .SetMaster("master1") - .SetRegistryKey("key1") - .SetRepoURL("url1") - .SetRepoBranch("branch1") - .SetGamePath("path1"); - game2 = loot::GameSettings(loot::GameSettings::tes5, "game2") - .SetMaster("master2") - .SetRegistryKey("key2") - .SetRepoURL("url2") - .SetRepoBranch("branch2") - .SetGamePath("path2"); - EXPECT_TRUE(game1 == game2); + game1 = GameSettings(GameSettings::tes5, "game1") + .SetMaster("master1") + .SetRegistryKey("key1") + .SetRepoURL("url1") + .SetRepoBranch("branch1") + .SetGamePath("path1"); + game2 = GameSettings(GameSettings::tes5, "game2") + .SetMaster("master2") + .SetRegistryKey("key2") + .SetRepoURL("url2") + .SetRepoBranch("branch2") + .SetGamePath("path2"); + EXPECT_TRUE(game1 == game2); - game1 = loot::GameSettings(loot::GameSettings::tes4) - .SetName("name"); - game2 = loot::GameSettings(loot::GameSettings::tes5) - .SetName("name"); - EXPECT_TRUE(game1 == game2); + game1 = GameSettings(GameSettings::tes4) + .SetName("name"); + game2 = GameSettings(GameSettings::tes5) + .SetName("name"); + EXPECT_TRUE(game1 == game2); - game1 = loot::GameSettings(loot::GameSettings::tes4); - game2 = loot::GameSettings(loot::GameSettings::tes5); - EXPECT_FALSE(game1 == game2); -} + game1 = GameSettings(GameSettings::tes4); + game2 = GameSettings(GameSettings::tes5); + EXPECT_FALSE(game1 == game2); + } -TEST_F(GameSettings, SetName) { - loot::GameSettings game; - game.SetName("name"); - EXPECT_EQ("name", game.Name()); -} + TEST_F(GameSettingsTest, SetName) { + GameSettings game; + game.SetName("name"); + EXPECT_EQ("name", game.Name()); + } -TEST_F(GameSettings, SetMaster) { - loot::GameSettings game; - game.SetMaster("master"); - EXPECT_EQ("master", game.Master()); -} + TEST_F(GameSettingsTest, SetMaster) { + GameSettings game; + game.SetMaster("master"); + EXPECT_EQ("master", game.Master()); + } -TEST_F(GameSettings, SetRegistryKey) { - loot::GameSettings game; - game.SetRegistryKey("key"); - EXPECT_EQ("key", game.RegistryKey()); -} + TEST_F(GameSettingsTest, SetRegistryKey) { + GameSettings game; + game.SetRegistryKey("key"); + EXPECT_EQ("key", game.RegistryKey()); + } -TEST_F(GameSettings, SetRepoURL) { - loot::GameSettings game; - game.SetRepoURL("url"); - EXPECT_EQ("url", game.RepoURL()); -} + TEST_F(GameSettingsTest, SetRepoURL) { + GameSettings game; + game.SetRepoURL("url"); + EXPECT_EQ("url", game.RepoURL()); + } -TEST_F(GameSettings, SetRepoBranch) { - loot::GameSettings game; - game.SetRepoBranch("branch"); - EXPECT_EQ("branch", game.RepoBranch()); -} + TEST_F(GameSettingsTest, SetRepoBranch) { + GameSettings game; + game.SetRepoBranch("branch"); + EXPECT_EQ("branch", game.RepoBranch()); + } -TEST_F(GameSettings, SetGamePath) { - loot::GameSettings game; - game.SetGamePath("path"); - EXPECT_EQ("path", game.GamePath().string()); - EXPECT_EQ(boost::filesystem::path("path") / "Data", game.DataPath()); -} + TEST_F(GameSettingsTest, SetGamePath) { + GameSettings game; + game.SetGamePath("path"); + EXPECT_EQ("path", game.GamePath().string()); + EXPECT_EQ(boost::filesystem::path("path") / "Data", game.DataPath()); + } -TEST_F(GameSettings, YamlEmitter) { - loot::GameSettings game(loot::GameSettings::tes5, "folder1"); - game.SetName("name1") - .SetMaster("master1") - .SetRegistryKey("key1") - .SetRepoURL("url1") - .SetRepoBranch("branch1") - .SetGamePath("path1"); + TEST_F(GameSettingsTest, YamlEmitter) { + GameSettings game(GameSettings::tes5, "folder1"); + game.SetName("name1") + .SetMaster("master1") + .SetRegistryKey("key1") + .SetRepoURL("url1") + .SetRepoBranch("branch1") + .SetGamePath("path1"); - YAML::Emitter e; - e << game; - EXPECT_STREQ("type: 'Skyrim'\n" - "folder: 'folder1'\n" - "name: 'name1'\n" - "master: 'master1'\n" - "repo: 'url1'\n" - "branch: 'branch1'\n" - "path: 'path1'\n" - "registry: 'key1'", e.c_str()); -} + YAML::Emitter e; + e << game; + EXPECT_STREQ("type: 'Skyrim'\n" + "folder: 'folder1'\n" + "name: 'name1'\n" + "master: 'master1'\n" + "repo: 'url1'\n" + "branch: 'branch1'\n" + "path: 'path1'\n" + "registry: 'key1'", e.c_str()); + } -TEST_F(GameSettings, YamlEncode) { - loot::GameSettings game(loot::GameSettings::tes5, "folder1"); - game.SetName("name1") - .SetMaster("master1") - .SetRegistryKey("key1") - .SetRepoURL("url1") - .SetRepoBranch("branch1") - .SetGamePath("path1"); + TEST_F(GameSettingsTest, YamlEncode) { + GameSettings game(GameSettings::tes5, "folder1"); + game.SetName("name1") + .SetMaster("master1") + .SetRegistryKey("key1") + .SetRepoURL("url1") + .SetRepoBranch("branch1") + .SetGamePath("path1"); - YAML::Node node; - node = game; - EXPECT_EQ("Skyrim", node["type"].as()); - EXPECT_EQ("folder1", node["folder"].as()); - EXPECT_EQ("name1", node["name"].as()); - EXPECT_EQ("master1", node["master"].as()); - EXPECT_EQ("url1", node["repo"].as()); - EXPECT_EQ("branch1", node["branch"].as()); - EXPECT_EQ("path1", node["path"].as()); - EXPECT_EQ("key1", node["registry"].as()); -} + YAML::Node node; + node = game; + EXPECT_EQ("Skyrim", node["type"].as()); + EXPECT_EQ("folder1", node["folder"].as()); + EXPECT_EQ("name1", node["name"].as()); + EXPECT_EQ("master1", node["master"].as()); + EXPECT_EQ("url1", node["repo"].as()); + EXPECT_EQ("branch1", node["branch"].as()); + EXPECT_EQ("path1", node["path"].as()); + EXPECT_EQ("key1", node["registry"].as()); + } -TEST_F(GameSettings, YamlDecode) { - YAML::Node node = YAML::Load("type: 'Skyrim'\n" - "folder: 'folder1'\n" - "name: 'name1'\n" - "master: 'master1'\n" - "repo: 'url1'\n" - "branch: 'branch1'\n" - "path: 'path1'\n" - "registry: 'key1'"); + TEST_F(GameSettingsTest, YamlDecode) { + YAML::Node node = YAML::Load("type: 'Skyrim'\n" + "folder: 'folder1'\n" + "name: 'name1'\n" + "master: 'master1'\n" + "repo: 'url1'\n" + "branch: 'branch1'\n" + "path: 'path1'\n" + "registry: 'key1'"); - loot::GameSettings game = node.as(); - EXPECT_EQ(loot::GameSettings::tes5, game.Id()); - EXPECT_EQ("name1", game.Name()); - EXPECT_EQ("folder1", game.FolderName()); - EXPECT_EQ("master1", game.Master()); - EXPECT_EQ("key1", game.RegistryKey()); - EXPECT_EQ("url1", game.RepoURL()); - EXPECT_EQ("branch1", game.RepoBranch()); - EXPECT_EQ("path1", game.GamePath()); + GameSettings game = node.as(); + EXPECT_EQ(GameSettings::tes5, game.Id()); + EXPECT_EQ("name1", game.Name()); + EXPECT_EQ("folder1", game.FolderName()); + EXPECT_EQ("master1", game.Master()); + EXPECT_EQ("key1", game.RegistryKey()); + EXPECT_EQ("url1", game.RepoURL()); + EXPECT_EQ("branch1", game.RepoBranch()); + EXPECT_EQ("path1", game.GamePath()); - node = YAML::Load("type: 'Invalid'\n"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("type: 'Invalid'\n"); + EXPECT_ANY_THROW(node.as()); - node = YAML::Load("scalar"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("scalar"); + EXPECT_ANY_THROW(node.as()); - node = YAML::Load("[0, 1, 2]"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("[0, 1, 2]"); + EXPECT_ANY_THROW(node.as()); - // Test inheritance of unspecified settings. - node = YAML::Load("type: 'Skyrim'\n" - "folder: 'folder1'\n" - "master: 'master1'\n" - "repo: 'url1'\n" - "branch: 'branch1'\n"); + // Test inheritance of unspecified settings. + node = YAML::Load("type: 'Skyrim'\n" + "folder: 'folder1'\n" + "master: 'master1'\n" + "repo: 'url1'\n" + "branch: 'branch1'\n"); - game = node.as(); - EXPECT_EQ(loot::GameSettings::tes5, game.Id()); - EXPECT_EQ("TES V: Skyrim", game.Name()); - EXPECT_EQ("folder1", game.FolderName()); - EXPECT_EQ("master1", game.Master()); - EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", game.RegistryKey()); - EXPECT_EQ("url1", game.RepoURL()); - EXPECT_EQ("branch1", game.RepoBranch()); - EXPECT_EQ("", game.GamePath()); + game = node.as(); + EXPECT_EQ(GameSettings::tes5, game.Id()); + EXPECT_EQ("TES V: Skyrim", game.Name()); + EXPECT_EQ("folder1", game.FolderName()); + EXPECT_EQ("master1", game.Master()); + EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", game.RegistryKey()); + EXPECT_EQ("url1", game.RepoURL()); + EXPECT_EQ("branch1", game.RepoBranch()); + EXPECT_EQ("", game.GamePath()); + } + } } #endif diff --git a/src/tests/backend/game/test_load_order_handler.h b/src/tests/backend/game/test_load_order_handler.h index 0e076195..41f07aaf 100644 --- a/src/tests/backend/game/test_load_order_handler.h +++ b/src/tests/backend/game/test_load_order_handler.h @@ -30,113 +30,117 @@ along with LOOT. If not, see #include "tests/fixtures.h" -class LoadOrderHandler : public SkyrimTest {}; +namespace loot { + namespace test { + class LoadOrderHandlerTest : public SkyrimTest {}; -TEST_F(LoadOrderHandler, Constructors) { - loot::LoadOrderHandler * loh = nullptr; - EXPECT_NO_THROW(loh = new loot::LoadOrderHandler); - EXPECT_NO_THROW(delete loh); -} + TEST_F(LoadOrderHandlerTest, Constructors) { + LoadOrderHandler * loh = nullptr; + EXPECT_NO_THROW(loh = new 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); + TEST_F(LoadOrderHandlerTest, Init) { + // Should throw for invalid game settings ID. + LoadOrderHandler loh; + GameSettings game(GameSettings::autodetect); + EXPECT_THROW(loh.Init(game), error); + EXPECT_THROW(loh.Init(game), error); + EXPECT_THROW(loh.Init(game, localPath), error); + EXPECT_THROW(loh.Init(game, localPath), 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); + // Should throw an exception if no game path has been set. + game = GameSettings(GameSettings::tes5); + EXPECT_THROW(loh.Init(game), error); + EXPECT_THROW(loh.Init(game), error); + EXPECT_THROW(loh.Init(game, localPath), error); + EXPECT_THROW(loh.Init(game, localPath), 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); + game = GameSettings(GameSettings::tes5) + .SetGamePath(dataPath.parent_path()); + EXPECT_THROW(loh.Init(game), error); #endif - game = loot::GameSettings(loot::GameSettings::tes5) - .SetGamePath(dataPath.parent_path()); - EXPECT_NO_THROW(loh.Init(game, localPath)); -} + game = GameSettings(GameSettings::tes5) + .SetGamePath(dataPath.parent_path()); + EXPECT_NO_THROW(loh.Init(game, localPath)); + } -TEST_F(LoadOrderHandler, IsPluginActive) { - loot::LoadOrderHandler loh; - loot::GameSettings game(loot::GameSettings::tes5); - game.SetGamePath(dataPath.parent_path()); + TEST_F(LoadOrderHandlerTest, IsPluginActive) { + LoadOrderHandler loh; + GameSettings game(GameSettings::tes5); + game.SetGamePath(dataPath.parent_path()); - EXPECT_THROW(loh.IsPluginActive("Skyrim.esm"), loot::error); + EXPECT_THROW(loh.IsPluginActive("Skyrim.esm"), error); - ASSERT_NO_THROW(loh.Init(game, localPath)); + ASSERT_NO_THROW(loh.Init(game, localPath)); - EXPECT_TRUE(loh.IsPluginActive("Skyrim.esm")); - EXPECT_TRUE(loh.IsPluginActive("Blank.esm")); - EXPECT_TRUE(loh.IsPluginActive("Blank - Different Master Dependent.esp")); - EXPECT_FALSE(loh.IsPluginActive("Blank.esp")); -} + EXPECT_TRUE(loh.IsPluginActive("Skyrim.esm")); + EXPECT_TRUE(loh.IsPluginActive("Blank.esm")); + EXPECT_TRUE(loh.IsPluginActive("Blank - Different Master Dependent.esp")); + EXPECT_FALSE(loh.IsPluginActive("Blank.esp")); + } -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)); + TEST_F(LoadOrderHandlerTest, GetLoadOrder) { + LoadOrderHandler loh; + GameSettings game(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" - }); + 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()); -} + 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)); + TEST_F(LoadOrderHandlerTest, SetLoadOrder) { + LoadOrderHandler loh; + GameSettings game(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", - }); + 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)); + EXPECT_NO_THROW(loh.SetLoadOrder(loadOrder)); - std::list actual; - boost::filesystem::ifstream in(localPath / "loadorder.txt"); - while (in) { - std::string line; - std::getline(in, line); + std::list actual; + boost::filesystem::ifstream in(localPath / "loadorder.txt"); + while (in) { + std::string line; + std::getline(in, line); - if (!line.empty()) - actual.push_back(line); + if (!line.empty()) + actual.push_back(line); + } + + EXPECT_EQ(loadOrder, actual); + } } - - EXPECT_EQ(loadOrder, actual); } #endif diff --git a/src/tests/backend/helpers/test_git_helper.h b/src/tests/backend/helpers/test_git_helper.h index e680ae33..aee0a226 100644 --- a/src/tests/backend/helpers/test_git_helper.h +++ b/src/tests/backend/helpers/test_git_helper.h @@ -29,107 +29,109 @@ along with LOOT. If not, see #include "backend/helpers/git_helper.h" #include "tests/fixtures.h" -using loot::GitHelper; - +namespace loot { + namespace test { #ifdef _WIN32 -boost::filesystem::path parentRepoRoot = boost::filesystem::current_path().parent_path().parent_path(); + boost::filesystem::path parentRepoRoot = boost::filesystem::current_path().parent_path().parent_path(); #else -boost::filesystem::path parentRepoRoot = boost::filesystem::current_path().parent_path(); + boost::filesystem::path parentRepoRoot = boost::filesystem::current_path().parent_path(); #endif -TEST(GitHelper, ConstructorAndDestructor) { - GitHelper * git = new GitHelper(); - EXPECT_EQ(nullptr, git->repo); + TEST(GitHelper, ConstructorAndDestructor) { + GitHelper * git = new GitHelper(); + EXPECT_EQ(nullptr, git->repo); - EXPECT_EQ(2, git_libgit2_init()); - delete git; - EXPECT_EQ(0, git_libgit2_shutdown()); -} + EXPECT_EQ(2, git_libgit2_init()); + delete git; + EXPECT_EQ(0, git_libgit2_shutdown()); + } -TEST(GitHelper, Call) { - GitHelper git; - EXPECT_NO_THROW(git.Call(0)); - EXPECT_THROW(git.Call(1), loot::error); - EXPECT_THROW(git.Call(-1), loot::error); -} + TEST(GitHelper, Call) { + GitHelper git; + EXPECT_NO_THROW(git.Call(0)); + EXPECT_THROW(git.Call(1), error); + EXPECT_THROW(git.Call(-1), error); + } -TEST(GitHelper, SetErrorMessage) { - GitHelper git; - git.SetErrorMessage("test message"); + TEST(GitHelper, SetErrorMessage) { + GitHelper git; + git.SetErrorMessage("test message"); - try { - git.Call(1); - ADD_FAILURE() << "An exception should have been thrown."; + try { + git.Call(1); + ADD_FAILURE() << "An exception should have been thrown."; + } + catch (error& e) { + EXPECT_NE(nullptr, strstr(e.what(), "test message")); + } + } + + TEST(GitHelper, Free) { + // Initialise buffer member, it's simplest to test with. + GitHelper git; + git_buf_set(&git.buf, "foo", 4); + EXPECT_NE(nullptr, git.buf.ptr); + EXPECT_EQ(4, git.buf.size); + + git.Free(); + EXPECT_EQ(nullptr, git.buf.ptr); + EXPECT_EQ(0, git.buf.size); + } + + TEST(GitHelper, IsRepository) { + GitHelper git; + + ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot)); + EXPECT_TRUE(git.IsRepository(parentRepoRoot)); + EXPECT_FALSE(git.IsRepository(boost::filesystem::current_path())); + } + + class IsFileDifferentTest : public ::testing::Test { + inline virtual void SetUp() { + GitHelper git; + ASSERT_TRUE(git.IsRepository(parentRepoRoot)); + ASSERT_FALSE(git.IsRepository(boost::filesystem::current_path())); + + ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "README.md")); + + // Create a backup of CONTRIBUTING.md. + ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md")); + ASSERT_FALSE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md.copy")); + ASSERT_NO_THROW(boost::filesystem::copy(parentRepoRoot / "CONTRIBUTING.md", parentRepoRoot / "CONTRIBUTING.md.copy")); + ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md.copy")); + + // Edit CONTRIBUTING.md + boost::filesystem::ofstream out(parentRepoRoot / "CONTRIBUTING.md"); + out.close(); + } + + inline virtual void TearDown() { + // Restore original CONTRIBUTING.md + ASSERT_NO_THROW(boost::filesystem::remove(parentRepoRoot / "CONTRIBUTING.md")); + ASSERT_NO_THROW(boost::filesystem::rename(parentRepoRoot / "CONTRIBUTING.md.copy", parentRepoRoot / "CONTRIBUTING.md")); + ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md")); + ASSERT_FALSE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md.copy")); + } + }; + + TEST_F(IsFileDifferentTest, InvalidRepository) { + EXPECT_THROW(IsFileDifferent(boost::filesystem::current_path(), "README.md"), error); + } + + TEST_F(IsFileDifferentTest, SameFile) { + EXPECT_FALSE(IsFileDifferent(parentRepoRoot, "README.md")); + } + + TEST_F(IsFileDifferentTest, NewFile) { + // New files not in the index are not tracked by Git, so aren't considered + // different. + EXPECT_FALSE(IsFileDifferent(parentRepoRoot, "CONTRIBUTING.md.copy")); + } + + TEST_F(IsFileDifferentTest, DifferentFile) { + EXPECT_TRUE(IsFileDifferent(parentRepoRoot, "CONTRIBUTING.md")); + } } - catch (loot::error& e) { - EXPECT_NE(nullptr, strstr(e.what(), "test message")); - } -} - -TEST(GitHelper, Free) { - // Initialise buffer member, it's simplest to test with. - GitHelper git; - git_buf_set(&git.buf, "foo", 4); - EXPECT_NE(nullptr, git.buf.ptr); - EXPECT_EQ(4, git.buf.size); - - git.Free(); - EXPECT_EQ(nullptr, git.buf.ptr); - EXPECT_EQ(0, git.buf.size); -} - -TEST(GitHelper, IsRepository) { - GitHelper git; - - ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot)); - EXPECT_TRUE(git.IsRepository(parentRepoRoot)); - EXPECT_FALSE(git.IsRepository(boost::filesystem::current_path())); -} - -class IsFileDifferent : public ::testing::Test { - inline virtual void SetUp() { - GitHelper git; - ASSERT_TRUE(git.IsRepository(parentRepoRoot)); - ASSERT_FALSE(git.IsRepository(boost::filesystem::current_path())); - - ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "README.md")); - - // Create a backup of CONTRIBUTING.md. - ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md")); - ASSERT_FALSE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md.copy")); - ASSERT_NO_THROW(boost::filesystem::copy(parentRepoRoot / "CONTRIBUTING.md", parentRepoRoot / "CONTRIBUTING.md.copy")); - ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md.copy")); - - // Edit CONTRIBUTING.md - boost::filesystem::ofstream out(parentRepoRoot / "CONTRIBUTING.md"); - out.close(); - } - - inline virtual void TearDown() { - // Restore original CONTRIBUTING.md - ASSERT_NO_THROW(boost::filesystem::remove(parentRepoRoot / "CONTRIBUTING.md")); - ASSERT_NO_THROW(boost::filesystem::rename(parentRepoRoot / "CONTRIBUTING.md.copy", parentRepoRoot / "CONTRIBUTING.md")); - ASSERT_TRUE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md")); - ASSERT_FALSE(boost::filesystem::exists(parentRepoRoot / "CONTRIBUTING.md.copy")); - } -}; - -TEST_F(IsFileDifferent, InvalidRepository) { - EXPECT_THROW(loot::IsFileDifferent(boost::filesystem::current_path(), "README.md"), loot::error); -} - -TEST_F(IsFileDifferent, SameFile) { - EXPECT_FALSE(loot::IsFileDifferent(parentRepoRoot, "README.md")); -} - -TEST_F(IsFileDifferent, NewFile) { - // New files not in the index are not tracked by Git, so aren't considered - // different. - EXPECT_FALSE(loot::IsFileDifferent(parentRepoRoot, "CONTRIBUTING.md.copy")); -} - -TEST_F(IsFileDifferent, DifferentFile) { - EXPECT_TRUE(loot::IsFileDifferent(parentRepoRoot, "CONTRIBUTING.md")); } #endif diff --git a/src/tests/backend/helpers/test_helpers.h b/src/tests/backend/helpers/test_helpers.h index ee917d8d..cceea1cc 100644 --- a/src/tests/backend/helpers/test_helpers.h +++ b/src/tests/backend/helpers/test_helpers.h @@ -29,19 +29,23 @@ along with LOOT. If not, see #include "backend/error.h" #include "tests/fixtures.h" -class GetCrc32 : public SkyrimTest {}; +namespace loot { + namespace test { + class GetCrc32Test : public SkyrimTest {}; -TEST_F(GetCrc32, MissingFile) { - EXPECT_THROW(loot::GetCrc32(dataPath / "Blank.missing.esp"), loot::error); -} + TEST_F(GetCrc32Test, MissingFile) { + EXPECT_THROW(GetCrc32(dataPath / "Blank.missing.esp"), error); + } -TEST_F(GetCrc32, ValidFile) { - EXPECT_EQ(0x24F0E2A1, loot::GetCrc32(dataPath / "Blank.esp")); -} + TEST_F(GetCrc32Test, ValidFile) { + EXPECT_EQ(0x24F0E2A1, GetCrc32(dataPath / "Blank.esp")); + } -TEST(IntToHexString, PositiveAndZeroValues) { - EXPECT_EQ("14", loot::IntToHexString(20)); - EXPECT_EQ("0", loot::IntToHexString(0)); + TEST(IntToHexString, PositiveAndZeroValues) { + EXPECT_EQ("14", IntToHexString(20)); + EXPECT_EQ("0", IntToHexString(0)); + } + } } #endif diff --git a/src/tests/backend/helpers/test_language.h b/src/tests/backend/helpers/test_language.h index 681a4eee..3a2f2f49 100644 --- a/src/tests/backend/helpers/test_language.h +++ b/src/tests/backend/helpers/test_language.h @@ -28,61 +28,63 @@ along with LOOT. If not, see #include "backend/helpers/language.h" #include "tests/fixtures.h" -using loot::Language; +namespace loot { + namespace test { + TEST(Language, ConstructorsAndDataAccess) { + // Test English code and locale. + Language lang(Language::english); + EXPECT_EQ(Language::english, lang.Code()); + EXPECT_EQ("English", lang.Name()); + EXPECT_EQ("en", lang.Locale()); -TEST(Language, ConstructorsAndDataAccess) { - // Test English code and locale. - Language lang(Language::english); - EXPECT_EQ(Language::english, lang.Code()); - EXPECT_EQ("English", lang.Name()); - EXPECT_EQ("en", lang.Locale()); + lang = Language("en"); + EXPECT_EQ(Language::english, lang.Code()); + EXPECT_EQ("English", lang.Name()); + EXPECT_EQ("en", lang.Locale()); - lang = Language("en"); - EXPECT_EQ(Language::english, lang.Code()); - EXPECT_EQ("English", lang.Name()); - EXPECT_EQ("en", lang.Locale()); + // Test code and locale for a couple of other languages, in case English + // is wrongly being used for everything. No point testing all languages, + // because that would just be copying the class code. + lang = Language(Language::polish); + EXPECT_EQ(Language::polish, lang.Code()); + EXPECT_EQ("Polski", lang.Name()); + EXPECT_EQ("pl", lang.Locale()); - // Test code and locale for a couple of other languages, in case English - // is wrongly being used for everything. No point testing all languages, - // because that would just be copying the class code. - lang = Language(Language::polish); - EXPECT_EQ(Language::polish, lang.Code()); - EXPECT_EQ("Polski", lang.Name()); - EXPECT_EQ("pl", lang.Locale()); + lang = Language("de"); + EXPECT_EQ(Language::german, lang.Code()); + EXPECT_EQ("Deutsch", lang.Name()); + EXPECT_EQ("de", lang.Locale()); - lang = Language("de"); - EXPECT_EQ(Language::german, lang.Code()); - EXPECT_EQ("Deutsch", lang.Name()); - EXPECT_EQ("de", lang.Locale()); + // Test that invalid values get treated as English. + lang = Language(1000); + EXPECT_EQ(Language::english, lang.Code()); + EXPECT_EQ("English", lang.Name()); + EXPECT_EQ("en", lang.Locale()); - // Test that invalid values get treated as English. - lang = Language(1000); - EXPECT_EQ(Language::english, lang.Code()); - EXPECT_EQ("English", lang.Name()); - EXPECT_EQ("en", lang.Locale()); + lang = Language("foo"); + EXPECT_EQ(Language::english, lang.Code()); + EXPECT_EQ("English", lang.Name()); + EXPECT_EQ("en", lang.Locale()); + } - lang = Language("foo"); - EXPECT_EQ(Language::english, lang.Code()); - EXPECT_EQ("English", lang.Name()); - EXPECT_EQ("en", lang.Locale()); -} - -TEST(Language, Codes) { - // Check that all the expected codes are given. - std::vector codes = { - Language::english, - Language::spanish, - Language::russian, - Language::french, - Language::chinese, - Language::polish, - Language::brazilian_portuguese, - Language::finnish, - Language::german, - Language::danish, - Language::korean - }; - EXPECT_EQ(Language::Codes, codes); + TEST(Language, Codes) { + // Check that all the expected codes are given. + std::vector codes = { + Language::english, + Language::spanish, + Language::russian, + Language::french, + Language::chinese, + Language::polish, + Language::brazilian_portuguese, + Language::finnish, + Language::german, + Language::danish, + Language::korean + }; + EXPECT_EQ(Language::Codes, codes); + } + } } #endif diff --git a/src/tests/backend/helpers/test_yaml_set_helpers.h b/src/tests/backend/helpers/test_yaml_set_helpers.h index a863c3b0..296b3577 100644 --- a/src/tests/backend/helpers/test_yaml_set_helpers.h +++ b/src/tests/backend/helpers/test_yaml_set_helpers.h @@ -28,92 +28,96 @@ along with LOOT. If not, see #include "backend/helpers/yaml_set_helpers.h" #include "tests/fixtures.h" -TEST(set, YamlEncode) { - YAML::Node node; - std::set stringSet({"a", "b", "c"}); - node = stringSet; - EXPECT_EQ("a", node[0].as()); - EXPECT_EQ("b", node[1].as()); - EXPECT_EQ("c", node[2].as()); -} +namespace loot { + namespace test { + TEST(set, YamlEncode) { + YAML::Node node; + std::set stringSet({"a", "b", "c"}); + node = stringSet; + EXPECT_EQ("a", node[0].as()); + EXPECT_EQ("b", node[1].as()); + EXPECT_EQ("c", node[2].as()); + } -TEST(set, YamlDecode) { - YAML::Node node; - std::set stringSet; + TEST(set, YamlDecode) { + YAML::Node node; + std::set stringSet; - node = YAML::Load("[a, b, c]"); - stringSet = node.as>(); - EXPECT_EQ(stringSet.begin(), stringSet.find("a")); - EXPECT_EQ(++stringSet.begin(), stringSet.find("b")); - EXPECT_EQ(--stringSet.end(), stringSet.find("c")); + node = YAML::Load("[a, b, c]"); + stringSet = node.as>(); + EXPECT_EQ(stringSet.begin(), stringSet.find("a")); + EXPECT_EQ(++stringSet.begin(), stringSet.find("b")); + EXPECT_EQ(--stringSet.end(), stringSet.find("c")); - node = YAML::Load("[a, b, c, c]"); - EXPECT_ANY_THROW(node.as>()); -} + node = YAML::Load("[a, b, c, c]"); + EXPECT_ANY_THROW(node.as>()); + } -TEST(set, YamlEmitter) { - std::set stringSet({"a", "b", "c"}); - YAML::Emitter e1; - e1 << stringSet; - EXPECT_STREQ("- a\n- b\n- c", e1.c_str()); -} + TEST(set, YamlEmitter) { + std::set stringSet({"a", "b", "c"}); + YAML::Emitter e1; + e1 << stringSet; + EXPECT_STREQ("- a\n- b\n- c", e1.c_str()); + } -bool nodeContains(const std::string& value, const YAML::Node& node) { - for (const auto& element : node) { - if (element.as() == value) - return true; + bool nodeContains(const std::string& value, const YAML::Node& node) { + for (const auto& element : node) { + if (element.as() == value) + return true; + } + return false; + } + + TEST(unordered_set, YamlEncode) { + YAML::Node node; + std::unordered_set stringSet({"a", "b", "c"}); + node = stringSet; + // Check that the values are all present in the node. + EXPECT_PRED2(nodeContains, "a", node); + EXPECT_PRED2(nodeContains, "b", node); + EXPECT_PRED2(nodeContains, "c", node); + } + + TEST(unordered_set, YAMLDecode) { + YAML::Node node; + std::unordered_set stringSet; + + node = YAML::Load("[a, b, c]"); + stringSet = node.as>(); + EXPECT_EQ(1, stringSet.count("a")); + EXPECT_EQ(1, stringSet.count("b")); + EXPECT_EQ(1, stringSet.count("c")); + + node = YAML::Load("[a, b, c, c]"); + EXPECT_ANY_THROW(node.as>()); + } + + bool sequenceOf(const char val1, + const char val2, + const char val3, + const std::string& seq) { + if (seq.substr(0, 2) != "- " + || seq.substr(3, 3) != "\n- " + || seq.substr(7, 3) != "\n- ") + return false; + + std::list values({val1, val2, val3}); + std::list found({seq[2], seq[6], seq[10]}); + + values.sort(); + found.sort(); + + return values == found; + } + + TEST(unordered_set, YamlEmitter) { + std::unordered_set stringSet({"a", "b", "c"}); + YAML::Emitter e1; + e1 << stringSet; + ASSERT_EQ(11, e1.size()); + EXPECT_PRED4(sequenceOf, 'a', 'b', 'c', e1.c_str()); + } } - return false; -} - -TEST(unordered_set, YamlEncode) { - YAML::Node node; - std::unordered_set stringSet({"a", "b", "c"}); - node = stringSet; - // Check that the values are all present in the node. - EXPECT_PRED2(nodeContains, "a", node); - EXPECT_PRED2(nodeContains, "b", node); - EXPECT_PRED2(nodeContains, "c", node); -} - -TEST(unordered_set, YAMLDecode) { - YAML::Node node; - std::unordered_set stringSet; - - node = YAML::Load("[a, b, c]"); - stringSet = node.as>(); - EXPECT_EQ(1, stringSet.count("a")); - EXPECT_EQ(1, stringSet.count("b")); - EXPECT_EQ(1, stringSet.count("c")); - - node = YAML::Load("[a, b, c, c]"); - EXPECT_ANY_THROW(node.as>()); -} - -bool sequenceOf(const char val1, - const char val2, - const char val3, - const std::string& seq) { - if (seq.substr(0, 2) != "- " - || seq.substr(3, 3) != "\n- " - || seq.substr(7, 3) != "\n- ") - return false; - - std::list values({val1, val2, val3}); - std::list found({seq[2], seq[6], seq[10]}); - - values.sort(); - found.sort(); - - return values == found; -} - -TEST(unordered_set, YamlEmitter) { - std::unordered_set stringSet({"a", "b", "c"}); - YAML::Emitter e1; - e1 << stringSet; - ASSERT_EQ(11, e1.size()); - EXPECT_PRED4(sequenceOf, 'a', 'b', 'c', e1.c_str()); } #endif diff --git a/src/tests/backend/metadata/test_condition_grammar.h b/src/tests/backend/metadata/test_condition_grammar.h index 876eaab4..61031f61 100644 --- a/src/tests/backend/metadata/test_condition_grammar.h +++ b/src/tests/backend/metadata/test_condition_grammar.h @@ -29,632 +29,636 @@ along with LOOT. If not, see #include "backend/metadata/condition_grammar.h" #include "tests/fixtures.h" -class ConditionGrammar : public SkyrimTest {}; +namespace loot { + namespace test { + class ConditionGrammarTest : public SkyrimTest {}; -typedef loot::ConditionGrammar Grammar; + typedef ConditionGrammar Grammar; -TEST_F(ConditionGrammar, Constructor) { - EXPECT_NO_THROW(Grammar cg(nullptr)); + TEST_F(ConditionGrammarTest, Constructor) { + EXPECT_NO_THROW(Grammar cg(nullptr)); - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); - EXPECT_NO_THROW(Grammar cg(&game)); -} + EXPECT_NO_THROW(Grammar cg(&game)); + } -TEST_F(ConditionGrammar, InvalidSyntax) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); + TEST_F(ConditionGrammarTest, InvalidSyntax) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("file(foo)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval), error); + } - std::string condition("file(foo)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); + TEST_F(ConditionGrammarTest, EmptyCondition) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); - EXPECT_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval), loot::error); -} - -TEST_F(ConditionGrammar, EmptyCondition) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition(""); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval), loot::error); -} - -TEST_F(ConditionGrammar, FileConditionTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"Blank.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, FileConditionFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"Blank.missing.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, UnsafePath) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"../../Blank.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval), loot::error); -} - -TEST_F(ConditionGrammar, RegexConditionTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("regex(\"Blank.+\\.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, RegexConditionFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("regex(\"Blank\\.m.+\\.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, RegexCondition_Subfolder) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("regex(\"resource\\\\detail\\\\resource\\.txt\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, ManyConditionTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("many(\"Blank.+\\.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, ManyConditionFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("many(\"Blank\\.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, ChecksumConditionTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("checksum(\"Blank.esp\", 24F0E2A1)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, ChecksumConditionFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("checksum(\"Blank.esp\", DEADBEEF)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionEqualTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"5.0\", ==)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionEqualFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"6.0\", ==)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionNotEqualTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"6.0\", !=)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionNotEqualFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"5.0\", !=)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionLessThanTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"6.0\", <)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionLessThanFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"5.0\", <)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionGreaterThanTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"4.0\", >)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionGreaterThanFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"5.0\", >)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionLETrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"5.0\", <=)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionLEFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"4.0\", <=)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionGETrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"5.0\", >=)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, VersionConditionGEFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.LoadPlugins(true)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("version(\"Blank.esm\", \"6.0\", >=)"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, ActiveConditionTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("active(\"Blank.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, ActiveConditionFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("active(\"Blank.esp\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, NegatorTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = false; - bool r = false; - Grammar cg(&game); - - std::string condition("not file(\"Blank.missing.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, NegatorFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("not file(\"Blank.esm\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, CompoundAndTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"Blank.esm\") and file(\"Blank.esp\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, CompoundAndFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"Blank.esm\") and file(\"Blank.missing.esp\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, CompoundOrTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"Blank.missing.esm\") or file(\"Blank.esp\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); -} - -TEST_F(ConditionGrammar, CompoundOrFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"Blank.missing.esm\") or file(\"Blank.missing.esp\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_FALSE(eval); -} - -TEST_F(ConditionGrammar, OrderOfEvaluation) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - - boost::spirit::qi::space_type skipper; - bool eval = true; - bool r = false; - Grammar cg(&game); - - std::string condition("file(\"Blank.esm\") and ( not file(\"Blank.esm\") or file(\"Blank.esp\") ) or file(\"Blank.missing.esp\")"); - std::string::const_iterator begin = condition.begin(); - std::string::const_iterator end = condition.end(); - - EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); - EXPECT_TRUE(r); - EXPECT_TRUE(eval); + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition(""); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval), error); + } + + TEST_F(ConditionGrammarTest, FileConditionTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"Blank.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, FileConditionFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"Blank.missing.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, UnsafePath) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"../../Blank.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval), error); + } + + TEST_F(ConditionGrammarTest, RegexConditionTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("regex(\"Blank.+\\.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, RegexConditionFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("regex(\"Blank\\.m.+\\.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, RegexCondition_Subfolder) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("regex(\"resource\\\\detail\\\\resource\\.txt\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, ManyConditionTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("many(\"Blank.+\\.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, ManyConditionFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("many(\"Blank\\.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, ChecksumConditionTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("checksum(\"Blank.esp\", 24F0E2A1)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, ChecksumConditionFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("checksum(\"Blank.esp\", DEADBEEF)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionEqualTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"5.0\", ==)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionEqualFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"6.0\", ==)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionNotEqualTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"6.0\", !=)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionNotEqualFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"5.0\", !=)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionLessThanTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"6.0\", <)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionLessThanFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"5.0\", <)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionGreaterThanTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"4.0\", >)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionGreaterThanFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"5.0\", >)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionLETrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"5.0\", <=)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionLEFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"4.0\", <=)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionGETrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"5.0\", >=)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, VersionConditionGEFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.LoadPlugins(true)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("version(\"Blank.esm\", \"6.0\", >=)"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, ActiveConditionTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("active(\"Blank.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, ActiveConditionFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("active(\"Blank.esp\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, NegatorTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = false; + bool r = false; + Grammar cg(&game); + + std::string condition("not file(\"Blank.missing.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, NegatorFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("not file(\"Blank.esm\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, CompoundAndTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"Blank.esm\") and file(\"Blank.esp\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, CompoundAndFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"Blank.esm\") and file(\"Blank.missing.esp\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, CompoundOrTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"Blank.missing.esm\") or file(\"Blank.esp\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + + TEST_F(ConditionGrammarTest, CompoundOrFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"Blank.missing.esm\") or file(\"Blank.missing.esp\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_FALSE(eval); + } + + TEST_F(ConditionGrammarTest, OrderOfEvaluation) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + + boost::spirit::qi::space_type skipper; + bool eval = true; + bool r = false; + Grammar cg(&game); + + std::string condition("file(\"Blank.esm\") and ( not file(\"Blank.esm\") or file(\"Blank.esp\") ) or file(\"Blank.missing.esp\")"); + std::string::const_iterator begin = condition.begin(); + std::string::const_iterator end = condition.end(); + + EXPECT_NO_THROW(r = boost::spirit::qi::phrase_parse(begin, end, cg, skipper, eval)); + EXPECT_TRUE(r); + EXPECT_TRUE(eval); + } + } } #endif diff --git a/src/tests/backend/metadata/test_conditional_metadata.h b/src/tests/backend/metadata/test_conditional_metadata.h index 2d9ad8ce..e3c9b317 100644 --- a/src/tests/backend/metadata/test_conditional_metadata.h +++ b/src/tests/backend/metadata/test_conditional_metadata.h @@ -29,58 +29,62 @@ along with LOOT. If not, see #include "backend/metadata/conditional_metadata.h" #include "tests/fixtures.h" -class ConditionalMetadata : public SkyrimTest {}; +namespace loot { + namespace test { + class ConditionalMetadataTest : public SkyrimTest {}; -TEST_F(ConditionalMetadata, ConstructorAndDataAccess) { - loot::ConditionalMetadata cm; - EXPECT_EQ("", cm.Condition()); + TEST_F(ConditionalMetadataTest, ConstructorAndDataAccess) { + ConditionalMetadata cm; + EXPECT_EQ("", cm.Condition()); - cm = loot::ConditionalMetadata("condition"); - EXPECT_EQ("condition", cm.Condition()); -} + cm = ConditionalMetadata("condition"); + EXPECT_EQ("condition", cm.Condition()); + } -TEST_F(ConditionalMetadata, IsConditional) { - loot::ConditionalMetadata cm; - EXPECT_FALSE(cm.IsConditional()); + TEST_F(ConditionalMetadataTest, IsConditional) { + ConditionalMetadata cm; + EXPECT_FALSE(cm.IsConditional()); - cm = loot::ConditionalMetadata("condition"); - EXPECT_TRUE(cm.IsConditional()); -} + cm = ConditionalMetadata("condition"); + EXPECT_TRUE(cm.IsConditional()); + } -TEST_F(ConditionalMetadata, EvalCondition) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); + TEST_F(ConditionalMetadataTest, EvalCondition) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); - loot::ConditionalMetadata cm; - EXPECT_TRUE(cm.EvalCondition(game)); + ConditionalMetadata cm; + EXPECT_TRUE(cm.EvalCondition(game)); - cm = loot::ConditionalMetadata("condition"); - EXPECT_THROW(cm.EvalCondition(game), loot::error); + cm = ConditionalMetadata("condition"); + EXPECT_THROW(cm.EvalCondition(game), error); - cm = loot::ConditionalMetadata("file(\"Blank.esm\")"); - EXPECT_TRUE(cm.EvalCondition(game)); + cm = ConditionalMetadata("file(\"Blank.esm\")"); + EXPECT_TRUE(cm.EvalCondition(game)); - cm = loot::ConditionalMetadata("file(\"Blank.missing.esm\")"); - EXPECT_FALSE(cm.EvalCondition(game)); -} + cm = ConditionalMetadata("file(\"Blank.missing.esm\")"); + EXPECT_FALSE(cm.EvalCondition(game)); + } -TEST_F(ConditionalMetadata, ParseCondition) { - loot::ConditionalMetadata cm; - EXPECT_NO_THROW(cm.ParseCondition()); + TEST_F(ConditionalMetadataTest, ParseCondition) { + ConditionalMetadata cm; + EXPECT_NO_THROW(cm.ParseCondition()); - cm = loot::ConditionalMetadata("condition"); - EXPECT_THROW(cm.ParseCondition(), loot::error); + cm = ConditionalMetadata("condition"); + EXPECT_THROW(cm.ParseCondition(), error); - // Check that invalid regex also throws. - cm = loot::ConditionalMetadata("regex(\"RagnvaldBook(Farengar(+Ragnvald)?)?\\.esp\")"); - EXPECT_THROW(cm.ParseCondition(), loot::error); + // Check that invalid regex also throws. + cm = ConditionalMetadata("regex(\"RagnvaldBook(Farengar(+Ragnvald)?)?\\.esp\")"); + EXPECT_THROW(cm.ParseCondition(), error); - cm = loot::ConditionalMetadata("file(\"Blank.esm\")"); - EXPECT_NO_THROW(cm.ParseCondition()); + cm = ConditionalMetadata("file(\"Blank.esm\")"); + EXPECT_NO_THROW(cm.ParseCondition()); - cm = loot::ConditionalMetadata("file(\"Blank.missing.esm\")"); - EXPECT_NO_THROW(cm.ParseCondition()); + cm = ConditionalMetadata("file(\"Blank.missing.esm\")"); + EXPECT_NO_THROW(cm.ParseCondition()); + } + } } #endif diff --git a/src/tests/backend/metadata/test_file.h b/src/tests/backend/metadata/test_file.h index 65ede729..d9addd36 100644 --- a/src/tests/backend/metadata/test_file.h +++ b/src/tests/backend/metadata/test_file.h @@ -28,151 +28,153 @@ along with LOOT. If not, see #include "backend/metadata/file.h" #include "tests/fixtures.h" -using loot::File; +namespace loot { + namespace test { + TEST(File, ConstructorsAndDataAccess) { + File file; + EXPECT_EQ("", file.Name()); + EXPECT_EQ("", file.DisplayName()); + EXPECT_EQ("", file.Condition()); -TEST(File, ConstructorsAndDataAccess) { - File file; - EXPECT_EQ("", file.Name()); - EXPECT_EQ("", file.DisplayName()); - EXPECT_EQ("", file.Condition()); + file = File("name"); + EXPECT_EQ("name", file.Name()); + EXPECT_EQ("name", file.DisplayName()); + EXPECT_EQ("", file.Condition()); - file = File("name"); - EXPECT_EQ("name", file.Name()); - EXPECT_EQ("name", file.DisplayName()); - EXPECT_EQ("", file.Condition()); + file = File("name", "display"); + EXPECT_EQ("name", file.Name()); + EXPECT_EQ("display", file.DisplayName()); + EXPECT_EQ("", file.Condition()); - file = File("name", "display"); - EXPECT_EQ("name", file.Name()); - EXPECT_EQ("display", file.DisplayName()); - EXPECT_EQ("", file.Condition()); + // Not a valid condition, but not evaluating it in this test. + file = File("name", "display", "condition"); + EXPECT_EQ("name", file.Name()); + EXPECT_EQ("display", file.DisplayName()); + EXPECT_EQ("condition", file.Condition()); + } - // Not a valid condition, but not evaluating it in this test. - file = File("name", "display", "condition"); - EXPECT_EQ("name", file.Name()); - EXPECT_EQ("display", file.DisplayName()); - EXPECT_EQ("condition", file.Condition()); -} + TEST(File, EqualityOperator) { + File file1, file2; + EXPECT_TRUE(file1 == file2); -TEST(File, EqualityOperator) { - File file1, file2; - EXPECT_TRUE(file1 == file2); + // Not valid conditions, but not evaluating them in this test. + file1 = File("name", "display1", "condition1"); + file2 = File("name", "display2", "condition2"); + EXPECT_TRUE(file1 == file2); - // Not valid conditions, but not evaluating them in this test. - file1 = File("name", "display1", "condition1"); - file2 = File("name", "display2", "condition2"); - EXPECT_TRUE(file1 == file2); + file1 = File("name1"); + file2 = File("name2"); + EXPECT_FALSE(file1 == file2); + } - file1 = File("name1"); - file2 = File("name2"); - EXPECT_FALSE(file1 == file2); -} + TEST(File, LessThanOperator) { + File file1, file2; + EXPECT_FALSE(file1 < file2); + EXPECT_FALSE(file2 < file1); -TEST(File, LessThanOperator) { - File file1, file2; - EXPECT_FALSE(file1 < file2); - EXPECT_FALSE(file2 < file1); + file1 = File("name", "display1", "condition1"); + file2 = File("name", "display2", "condition2"); + EXPECT_FALSE(file1 < file2); + EXPECT_FALSE(file2 < file1); - file1 = File("name", "display1", "condition1"); - file2 = File("name", "display2", "condition2"); - EXPECT_FALSE(file1 < file2); - EXPECT_FALSE(file2 < file1); + file1 = File("name1"); + file2 = File("name2"); + EXPECT_TRUE(file1 < file2); + EXPECT_FALSE(file2 < file1); + } - file1 = File("name1"); - file2 = File("name2"); - EXPECT_TRUE(file1 < file2); - EXPECT_FALSE(file2 < file1); -} + TEST(File, YamlEmitter) { + File file("name1", "display1", "condition1"); -TEST(File, YamlEmitter) { - File file("name1", "display1", "condition1"); + YAML::Emitter e1; + e1 << file; + EXPECT_STREQ("name: 'name1'\ncondition: 'condition1'\ndisplay: 'display1'", e1.c_str()); - YAML::Emitter e1; - e1 << file; - EXPECT_STREQ("name: 'name1'\ncondition: 'condition1'\ndisplay: 'display1'", e1.c_str()); + file = File("name1"); + YAML::Emitter e2; + e2 << file; + EXPECT_STREQ("'name1'", e2.c_str()); - file = File("name1"); - YAML::Emitter e2; - e2 << file; - EXPECT_STREQ("'name1'", e2.c_str()); + file = File("name1", "", "condition1"); + YAML::Emitter e3; + e3 << file; + EXPECT_STREQ("name: 'name1'\ncondition: 'condition1'", e3.c_str()); - file = File("name1", "", "condition1"); - YAML::Emitter e3; - e3 << file; - EXPECT_STREQ("name: 'name1'\ncondition: 'condition1'", e3.c_str()); + file = File("name1", "display1"); + YAML::Emitter e4; + e4 << file; + EXPECT_STREQ("name: 'name1'\ndisplay: 'display1'", e4.c_str()); - file = File("name1", "display1"); - YAML::Emitter e4; - e4 << file; - EXPECT_STREQ("name: 'name1'\ndisplay: 'display1'", e4.c_str()); + file = File("name1", "name1"); + YAML::Emitter e5; + e5 << file; + EXPECT_STREQ("'name1'", e5.c_str()); - file = File("name1", "name1"); - YAML::Emitter e5; - e5 << file; - EXPECT_STREQ("'name1'", e5.c_str()); + file = File("name1", "name1", "condition1"); + YAML::Emitter e6; + e6 << file; + EXPECT_STREQ("name: 'name1'\ncondition: 'condition1'", e6.c_str()); + } - file = File("name1", "name1", "condition1"); - YAML::Emitter e6; - e6 << file; - EXPECT_STREQ("name: 'name1'\ncondition: 'condition1'", e6.c_str()); -} + TEST(File, YamlEncode) { + File file("name1", "display1", "condition1"); + YAML::Node node; + node = file; + EXPECT_EQ("name1", node["name"].as()); + EXPECT_EQ("display1", node["display"].as()); + EXPECT_EQ("condition1", node["condition"].as()); -TEST(File, YamlEncode) { - File file("name1", "display1", "condition1"); - YAML::Node node; - node = file; - EXPECT_EQ("name1", node["name"].as()); - EXPECT_EQ("display1", node["display"].as()); - EXPECT_EQ("condition1", node["condition"].as()); + file = File("name1"); + node = file; + EXPECT_EQ("name1", node["name"].as()); + EXPECT_FALSE(node["display"]); + EXPECT_FALSE(node["condition"]); - file = File("name1"); - node = file; - EXPECT_EQ("name1", node["name"].as()); - EXPECT_FALSE(node["display"]); - EXPECT_FALSE(node["condition"]); + file = File("name1", "name1"); + node = file; + EXPECT_EQ("name1", node["name"].as()); + EXPECT_FALSE(node["display"]); + EXPECT_FALSE(node["condition"]); - file = File("name1", "name1"); - node = file; - EXPECT_EQ("name1", node["name"].as()); - EXPECT_FALSE(node["display"]); - EXPECT_FALSE(node["condition"]); + file = File("name1", "display1"); + node = file; + EXPECT_EQ("name1", node["name"].as()); + EXPECT_EQ("display1", node["display"].as()); + EXPECT_FALSE(node["condition"]); + } - file = File("name1", "display1"); - node = file; - EXPECT_EQ("name1", node["name"].as()); - EXPECT_EQ("display1", node["display"].as()); - EXPECT_FALSE(node["condition"]); -} + TEST(File, YamlDecode) { + YAML::Node node = YAML::Load("{name: name1, display: display1, condition: 'file(\"Foo.esp\")'}"); + File file = node.as(); + EXPECT_EQ("name1", file.Name()); + EXPECT_EQ("display1", file.DisplayName()); + EXPECT_EQ("file(\"Foo.esp\")", file.Condition()); -TEST(File, YamlDecode) { - YAML::Node node = YAML::Load("{name: name1, display: display1, condition: 'file(\"Foo.esp\")'}"); - File file = node.as(); - EXPECT_EQ("name1", file.Name()); - EXPECT_EQ("display1", file.DisplayName()); - EXPECT_EQ("file(\"Foo.esp\")", file.Condition()); + node = YAML::Load("name1"); + file = node.as(); + EXPECT_EQ("name1", file.Name()); + EXPECT_EQ("name1", file.DisplayName()); + EXPECT_EQ("", file.Condition()); - node = YAML::Load("name1"); - file = node.as(); - EXPECT_EQ("name1", file.Name()); - EXPECT_EQ("name1", file.DisplayName()); - EXPECT_EQ("", file.Condition()); + node = YAML::Load("{name: name1, display: display1}"); + file = node.as(); + EXPECT_EQ("name1", file.Name()); + EXPECT_EQ("display1", file.DisplayName()); + EXPECT_EQ("", file.Condition()); - node = YAML::Load("{name: name1, display: display1}"); - file = node.as(); - EXPECT_EQ("name1", file.Name()); - EXPECT_EQ("display1", file.DisplayName()); - EXPECT_EQ("", file.Condition()); + node = YAML::Load("{name: name1, condition: 'file(\"Foo.esp\")'}"); + file = node.as(); + EXPECT_EQ("name1", file.Name()); + EXPECT_EQ("name1", file.DisplayName()); + EXPECT_EQ("file(\"Foo.esp\")", file.Condition()); - node = YAML::Load("{name: name1, condition: 'file(\"Foo.esp\")'}"); - file = node.as(); - EXPECT_EQ("name1", file.Name()); - EXPECT_EQ("name1", file.DisplayName()); - EXPECT_EQ("file(\"Foo.esp\")", file.Condition()); + node = YAML::Load("{name: name1, condition: invalid}"); + EXPECT_THROW(node.as(), YAML::RepresentationException); - node = YAML::Load("{name: name1, condition: invalid}"); - EXPECT_THROW(node.as(), YAML::RepresentationException); - - node = YAML::Load("[0, 1, 2]"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("[0, 1, 2]"); + EXPECT_ANY_THROW(node.as()); + } + } } #endif diff --git a/src/tests/backend/metadata/test_location.h b/src/tests/backend/metadata/test_location.h index 2a25d5d0..f822f51e 100644 --- a/src/tests/backend/metadata/test_location.h +++ b/src/tests/backend/metadata/test_location.h @@ -28,100 +28,102 @@ along with LOOT. If not, see #include "backend/metadata/location.h" #include "tests/fixtures.h" -using loot::Location; +namespace loot { + namespace test { + TEST(Location, ConstructorsAndDataAccess) { + Location loc; + EXPECT_EQ("", loc.URL()); -TEST(Location, ConstructorsAndDataAccess) { - Location loc; - EXPECT_EQ("", loc.URL()); + loc = Location("http://www.example.com"); + EXPECT_EQ("http://www.example.com", loc.URL()); - loc = Location("http://www.example.com"); - EXPECT_EQ("http://www.example.com", loc.URL()); + loc = Location("http://www.example.com", "example"); + EXPECT_EQ("http://www.example.com", loc.URL()); + EXPECT_EQ("example", loc.Name()); + } - loc = Location("http://www.example.com", "example"); - EXPECT_EQ("http://www.example.com", loc.URL()); - EXPECT_EQ("example", loc.Name()); -} + TEST(Location, EqualityOperator) { + Location loc1, loc2; + EXPECT_TRUE(loc1 == loc2); -TEST(Location, EqualityOperator) { - Location loc1, loc2; - EXPECT_TRUE(loc1 == loc2); + loc1 = Location("http://www.example.com"); + loc2 = Location("HTTP://WWW.EXAMPLE.COM"); + EXPECT_TRUE(loc1 == loc2); - loc1 = Location("http://www.example.com"); - loc2 = Location("HTTP://WWW.EXAMPLE.COM"); - EXPECT_TRUE(loc1 == loc2); + loc1 = Location("http://www.example.com", "example1"); + loc2 = Location("http://www.example.com", "example2"); + EXPECT_TRUE(loc1 == loc2); - loc1 = Location("http://www.example.com", "example1"); - loc2 = Location("http://www.example.com", "example2"); - EXPECT_TRUE(loc1 == loc2); + loc1 = Location("http://www.example1.com"); + loc2 = Location("http://www.example2.com"); + EXPECT_FALSE(loc1 == loc2); + } - loc1 = Location("http://www.example1.com"); - loc2 = Location("http://www.example2.com"); - EXPECT_FALSE(loc1 == loc2); -} + TEST(Location, LessThanOperator) { + Location loc1, loc2; + EXPECT_FALSE(loc1 < loc2); + EXPECT_FALSE(loc2 < loc1); -TEST(Location, LessThanOperator) { - Location loc1, loc2; - EXPECT_FALSE(loc1 < loc2); - EXPECT_FALSE(loc2 < loc1); + loc1 = Location("http://www.example.com"); + loc2 = Location("HTTP://WWW.EXAMPLE.COM"); + EXPECT_FALSE(loc1 < loc2); + EXPECT_FALSE(loc2 < loc1); - loc1 = Location("http://www.example.com"); - loc2 = Location("HTTP://WWW.EXAMPLE.COM"); - EXPECT_FALSE(loc1 < loc2); - EXPECT_FALSE(loc2 < loc1); + loc1 = Location("http://www.example.com", "example1"); + loc2 = Location("http://www.example.com", "example2"); + EXPECT_FALSE(loc1 < loc2); + EXPECT_FALSE(loc2 < loc1); - loc1 = Location("http://www.example.com", "example1"); - loc2 = Location("http://www.example.com", "example2"); - EXPECT_FALSE(loc1 < loc2); - EXPECT_FALSE(loc2 < loc1); + loc1 = Location("http://www.example1.com"); + loc2 = Location("http://www.example2.com"); + EXPECT_TRUE(loc1 < loc2); + EXPECT_FALSE(loc2 < loc1); + } - loc1 = Location("http://www.example1.com"); - loc2 = Location("http://www.example2.com"); - EXPECT_TRUE(loc1 < loc2); - EXPECT_FALSE(loc2 < loc1); -} + TEST(Location, YamlEmitter) { + Location loc("http://www.example.com"); + YAML::Emitter e1; + e1 << loc; + EXPECT_STREQ("'http://www.example.com'", e1.c_str()); -TEST(Location, YamlEmitter) { - Location loc("http://www.example.com"); - YAML::Emitter e1; - e1 << loc; - EXPECT_STREQ("'http://www.example.com'", e1.c_str()); + loc = Location("http://www.example.com", "example"); + YAML::Emitter e2; + e2 << loc; + EXPECT_STREQ("link: 'http://www.example.com'\nname: 'example'", e2.c_str()); + } - loc = Location("http://www.example.com", "example"); - YAML::Emitter e2; - e2 << loc; - EXPECT_STREQ("link: 'http://www.example.com'\nname: 'example'", e2.c_str()); -} + TEST(Location, YamlEncode) { + YAML::Node node; -TEST(Location, YamlEncode) { - YAML::Node node; + Location loc("http://www.example.com"); + node = loc; + EXPECT_EQ("http://www.example.com", node["link"].as()); + EXPECT_FALSE(node["name"]); - Location loc("http://www.example.com"); - node = loc; - EXPECT_EQ("http://www.example.com", node["link"].as()); - EXPECT_FALSE(node["name"]); + loc = Location("http://www.example.com", "example"); + node = loc; + EXPECT_EQ("http://www.example.com", node["link"].as()); + EXPECT_EQ("example", node["name"].as()); + } - loc = Location("http://www.example.com", "example"); - node = loc; - EXPECT_EQ("http://www.example.com", node["link"].as()); - EXPECT_EQ("example", node["name"].as()); -} + TEST(Location, YamlDecode) { + YAML::Node node; + Location loc; -TEST(Location, YamlDecode) { - YAML::Node node; - Location loc; + node = YAML::Load("http://www.example.com"); + loc = node.as(); + EXPECT_EQ("http://www.example.com", loc.URL()); + EXPECT_EQ("", loc.Name()); - node = YAML::Load("http://www.example.com"); - loc = node.as(); - EXPECT_EQ("http://www.example.com", loc.URL()); - EXPECT_EQ("", loc.Name()); + node = YAML::Load("{link: http://www.example.com, name: example}"); + loc = node.as(); + EXPECT_EQ("http://www.example.com", loc.URL()); + EXPECT_EQ("example", loc.Name()); - node = YAML::Load("{link: http://www.example.com, name: example}"); - loc = node.as(); - EXPECT_EQ("http://www.example.com", loc.URL()); - EXPECT_EQ("example", loc.Name()); - - node = YAML::Load("[0, 1, 2]"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("[0, 1, 2]"); + EXPECT_ANY_THROW(node.as()); + } + } } #endif diff --git a/src/tests/backend/metadata/test_message.h b/src/tests/backend/metadata/test_message.h index 7d379c0a..666e5880 100644 --- a/src/tests/backend/metadata/test_message.h +++ b/src/tests/backend/metadata/test_message.h @@ -28,393 +28,394 @@ along with LOOT. If not, see #include "backend/metadata/message.h" #include "tests/fixtures.h" -class Message : public SkyrimTest {}; +namespace loot { + namespace test { + class MessageTest : public SkyrimTest {}; -using loot::MessageContent; -using loot::Language; + typedef std::vector MessageContents; -typedef std::vector MessageContents; + TEST_F(MessageTest, ConstructorsAndDataAccess) { + Message message; + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents(), message.Content()); -TEST_F(Message, ConstructorsAndDataAccess) { - loot::Message message; - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents(), message.Content()); + message = Message(Message::say, "content1", "condition1"); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({ + MessageContent("content1", Language::english) + }), message.Content()); + EXPECT_EQ("condition1", message.Condition()); - message = loot::Message(loot::Message::say, "content1", "condition1"); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({ - MessageContent("content1", Language::english) - }), message.Content()); - EXPECT_EQ("condition1", message.Condition()); + MessageContents mc({MessageContent("content1", Language::english)}); + message = Message(Message::say, mc, "condition1"); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(mc, message.Content()); + EXPECT_EQ("condition1", message.Condition()); + } - MessageContents mc({MessageContent("content1", Language::english)}); - message = loot::Message(loot::Message::say, mc, "condition1"); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(mc, message.Content()); - EXPECT_EQ("condition1", message.Condition()); -} + TEST_F(MessageTest, EqualityOperator) { + Message message1, message2; + EXPECT_TRUE(message1 == message2); -TEST_F(Message, EqualityOperator) { - loot::Message message1, message2; - EXPECT_TRUE(message1 == message2); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, "content1", "condition2"); + EXPECT_TRUE(message1 == message2); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, "content1", "condition2"); - EXPECT_TRUE(message1 == message2); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, "content2", "condition1"); + EXPECT_FALSE(message1 == message2); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, "content2", "condition1"); - EXPECT_FALSE(message1 == message2); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::warn, "content1", "condition1"); + EXPECT_TRUE(message1 == message2); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::warn, "content1", "condition1"); - EXPECT_TRUE(message1 == message2); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + EXPECT_TRUE(message1 == message2); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - EXPECT_TRUE(message1 == message2); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); + EXPECT_FALSE(message1 == message2); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); - EXPECT_FALSE(message1 == message2); + message1 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + EXPECT_TRUE(message1 == message2); - message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - EXPECT_TRUE(message1 == message2); + message1 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); + EXPECT_FALSE(message1 == message2); - message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); - EXPECT_FALSE(message1 == message2); + message1 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content1", Language::french)}), "condition1"); + EXPECT_TRUE(message1 == message2); + } - message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::french)}), "condition1"); - EXPECT_TRUE(message1 == message2); -} + TEST_F(MessageTest, LessThanOperator) { + Message message1, message2; + EXPECT_FALSE(message1 < message2); + EXPECT_FALSE(message2 < message1); -TEST_F(Message, LessThanOperator) { - loot::Message message1, message2; - EXPECT_FALSE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, "content1", "condition1"); + EXPECT_FALSE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, "content1", "condition1"); - EXPECT_FALSE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, "content1", "condition2"); + EXPECT_FALSE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, "content1", "condition2"); - EXPECT_FALSE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::warn, "content1", "condition1"); + EXPECT_FALSE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::warn, "content1", "condition1"); - EXPECT_FALSE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, "", "condition1"); + message2 = Message(Message::say, "content1", "condition1"); + EXPECT_TRUE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, "", "condition1"); - message2 = loot::Message(loot::Message::say, "content1", "condition1"); - EXPECT_TRUE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, "", "condition1"); + EXPECT_FALSE(message1 < message2); + EXPECT_TRUE(message2 < message1); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, "", "condition1"); - EXPECT_FALSE(message1 < message2); - EXPECT_TRUE(message2 < message1); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + EXPECT_FALSE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - EXPECT_FALSE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, "content1", "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); + EXPECT_TRUE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, "content1", "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); - EXPECT_TRUE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + EXPECT_FALSE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - EXPECT_FALSE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); + EXPECT_TRUE(message1 < message2); + EXPECT_FALSE(message2 < message1); - message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1"); - EXPECT_TRUE(message1 < message2); - EXPECT_FALSE(message2 < message1); + message1 = Message(Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); + message2 = Message(Message::say, MessageContents({MessageContent("content1", Language::french)}), "condition1"); + EXPECT_FALSE(message1 < message2); + EXPECT_FALSE(message2 < message1); + } - message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1"); - message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::french)}), "condition1"); - EXPECT_FALSE(message1 < message2); - EXPECT_FALSE(message2 < message1); -} + TEST_F(MessageTest, EvalCondition) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); -TEST_F(Message, EvalCondition) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); + Message message; + EXPECT_TRUE(message.EvalCondition(game, Language::any)); + EXPECT_EQ(1, message.Content().size()); - loot::Message message; - EXPECT_TRUE(message.EvalCondition(game, Language::any)); - EXPECT_EQ(1, message.Content().size()); + message = Message(Message::say, MessageContents({ + MessageContent("content1", Language::german), + MessageContent("content1", Language::english), + MessageContent("content1", Language::french), + })); + EXPECT_TRUE(message.EvalCondition(game, Language::french)); + EXPECT_EQ(1, message.Content().size()); + } - message = loot::Message(loot::Message::say, MessageContents({ - MessageContent("content1", Language::german), - MessageContent("content1", Language::english), - MessageContent("content1", Language::french), - })); - EXPECT_TRUE(message.EvalCondition(game, Language::french)); - EXPECT_EQ(1, message.Content().size()); -} + TEST_F(MessageTest, ChooseContent) { + MessageContent mc; + Message message; + EXPECT_EQ(mc, message.ChooseContent(Language::any)); + EXPECT_EQ(mc, message.ChooseContent(Language::french)); + EXPECT_EQ(mc, message.ChooseContent(Language::english)); -TEST_F(Message, ChooseContent) { - MessageContent mc; - loot::Message message; - EXPECT_EQ(mc, message.ChooseContent(Language::any)); - EXPECT_EQ(mc, message.ChooseContent(Language::french)); - EXPECT_EQ(mc, message.ChooseContent(Language::english)); + mc = MessageContent("content1", Language::english); + message = Message(Message::say, "content1"); + EXPECT_EQ(mc, message.ChooseContent(Language::any)); + EXPECT_EQ(mc, message.ChooseContent(Language::french)); + EXPECT_EQ(mc, message.ChooseContent(Language::english)); - mc = MessageContent("content1", Language::english); - message = loot::Message(loot::Message::say, "content1"); - EXPECT_EQ(mc, message.ChooseContent(Language::any)); - EXPECT_EQ(mc, message.ChooseContent(Language::french)); - EXPECT_EQ(mc, message.ChooseContent(Language::english)); + mc = MessageContent("content1", Language::english); + message = Message(Message::say, MessageContents({mc})); + EXPECT_EQ(mc, message.ChooseContent(Language::any)); + EXPECT_EQ(mc, message.ChooseContent(Language::french)); + EXPECT_EQ(mc, message.ChooseContent(Language::english)); - mc = MessageContent("content1", Language::english); - message = loot::Message(loot::Message::say, MessageContents({mc})); - EXPECT_EQ(mc, message.ChooseContent(Language::any)); - EXPECT_EQ(mc, message.ChooseContent(Language::french)); - EXPECT_EQ(mc, message.ChooseContent(Language::english)); + mc = MessageContent("content1", Language::english); + message = Message(Message::say, MessageContents({ + MessageContent("content1", Language::english), + MessageContent("content1", Language::german), + })); + EXPECT_EQ(mc, message.ChooseContent(Language::any)); + EXPECT_EQ(mc, message.ChooseContent(Language::french)); + EXPECT_EQ(mc, message.ChooseContent(Language::english)); - mc = MessageContent("content1", Language::english); - message = loot::Message(loot::Message::say, MessageContents({ - MessageContent("content1", Language::english), - MessageContent("content1", Language::german), - })); - EXPECT_EQ(mc, message.ChooseContent(Language::any)); - EXPECT_EQ(mc, message.ChooseContent(Language::french)); - EXPECT_EQ(mc, message.ChooseContent(Language::english)); + message = Message(Message::say, MessageContents({ + MessageContent("content1", Language::german), + MessageContent("content1", Language::english), + MessageContent("content1", Language::french), + })); + EXPECT_EQ(MessageContent("content1", Language::german), message.ChooseContent(Language::any)); + EXPECT_EQ(MessageContent("content1", Language::french), message.ChooseContent(Language::french)); + EXPECT_EQ(MessageContent("content1", Language::english), message.ChooseContent(Language::english)); - message = loot::Message(loot::Message::say, MessageContents({ - MessageContent("content1", Language::german), - MessageContent("content1", Language::english), - MessageContent("content1", Language::french), - })); - EXPECT_EQ(MessageContent("content1", Language::german), message.ChooseContent(Language::any)); - EXPECT_EQ(MessageContent("content1", Language::french), message.ChooseContent(Language::french)); - EXPECT_EQ(MessageContent("content1", Language::english), message.ChooseContent(Language::english)); + mc = MessageContent("content1", Language::german); + message = Message(Message::say, MessageContents({mc})); + EXPECT_EQ(mc, message.ChooseContent(Language::any)); + EXPECT_EQ(mc, message.ChooseContent(Language::french)); + } - mc = MessageContent("content1", Language::german); - message = loot::Message(loot::Message::say, MessageContents({mc})); - EXPECT_EQ(mc, message.ChooseContent(Language::any)); - EXPECT_EQ(mc, message.ChooseContent(Language::french)); -} + TEST_F(MessageTest, YamlEmitter) { + Message message(Message::say, "content1"); + YAML::Emitter e1; + e1 << message; + EXPECT_STREQ("type: say\n" + "content: 'content1'", e1.c_str()); -TEST_F(Message, YamlEmitter) { - loot::Message message(loot::Message::say, "content1"); - YAML::Emitter e1; - e1 << message; - EXPECT_STREQ("type: say\n" - "content: 'content1'", e1.c_str()); + message = Message(Message::warn, "content1"); + YAML::Emitter e2; + e2 << message; + EXPECT_STREQ("type: warn\n" + "content: 'content1'", e2.c_str()); - message = loot::Message(loot::Message::warn, "content1"); - YAML::Emitter e2; - e2 << message; - EXPECT_STREQ("type: warn\n" - "content: 'content1'", e2.c_str()); + message = Message(Message::error, "content1"); + YAML::Emitter e3; + e3 << message; + EXPECT_STREQ("type: error\n" + "content: 'content1'", e3.c_str()); - message = loot::Message(loot::Message::error, "content1"); - YAML::Emitter e3; - e3 << message; - EXPECT_STREQ("type: error\n" - "content: 'content1'", e3.c_str()); + message = Message(Message::say, "content1", "condition1"); + YAML::Emitter e4; + e4 << message; + EXPECT_STREQ("type: say\n" + "content: 'content1'\n" + "condition: 'condition1'", e4.c_str()); - message = loot::Message(loot::Message::say, "content1", "condition1"); - YAML::Emitter e4; - e4 << message; - EXPECT_STREQ("type: say\n" - "content: 'content1'\n" - "condition: 'condition1'", e4.c_str()); + message = Message(Message::say, MessageContents({ + MessageContent("content1", Language::english), + })); + YAML::Emitter e5; + e5 << message; + EXPECT_STREQ("type: say\n" + "content: 'content1'", e5.c_str()); - message = loot::Message(loot::Message::say, MessageContents({ - MessageContent("content1", Language::english), - })); - YAML::Emitter e5; - e5 << message; - EXPECT_STREQ("type: say\n" - "content: 'content1'", e5.c_str()); + message = Message(Message::say, MessageContents({ + MessageContent("content1", Language::english), + MessageContent("content2", Language::german) + })); + YAML::Emitter e6; + e6 << message; + EXPECT_STREQ("type: say\n" + "content:\n" + " - lang: en\n" + " str: 'content1'\n" + " - lang: de\n" + " str: 'content2'", e6.c_str()); + } - message = loot::Message(loot::Message::say, MessageContents({ - MessageContent("content1", Language::english), - MessageContent("content2", Language::german) - })); - YAML::Emitter e6; - e6 << message; - EXPECT_STREQ("type: say\n" - "content:\n" - " - lang: en\n" - " str: 'content1'\n" - " - lang: de\n" - " str: 'content2'", e6.c_str()); -} + TEST_F(MessageTest, YamlEncode) { + YAML::Node node; -TEST_F(Message, YamlEncode) { - YAML::Node node; + MessageContents mcs({MessageContent("content1", Language::english)}); + Message message(Message::say, "content1"); + node = message; + EXPECT_EQ("say", node["type"].as()); + EXPECT_EQ(mcs, node["content"].as()); + EXPECT_FALSE(node["condition"]); - MessageContents mcs({MessageContent("content1", Language::english)}); - loot::Message message(loot::Message::say, "content1"); - node = message; - EXPECT_EQ("say", node["type"].as()); - EXPECT_EQ(mcs, node["content"].as()); - EXPECT_FALSE(node["condition"]); + message = Message(Message::warn, "content1"); + node = message; + EXPECT_EQ("warn", node["type"].as()); + EXPECT_EQ(mcs, node["content"].as()); + EXPECT_FALSE(node["condition"]); - message = loot::Message(loot::Message::warn, "content1"); - node = message; - EXPECT_EQ("warn", node["type"].as()); - EXPECT_EQ(mcs, node["content"].as()); - EXPECT_FALSE(node["condition"]); + message = Message(Message::error, "content1"); + node = message; + EXPECT_EQ("error", node["type"].as()); + EXPECT_EQ(mcs, node["content"].as()); + EXPECT_FALSE(node["condition"]); - message = loot::Message(loot::Message::error, "content1"); - node = message; - EXPECT_EQ("error", node["type"].as()); - EXPECT_EQ(mcs, node["content"].as()); - EXPECT_FALSE(node["condition"]); + message = Message(Message::say, "content1", "condition1"); + node = message; + EXPECT_EQ("say", node["type"].as()); + EXPECT_EQ(mcs, node["content"].as()); + EXPECT_EQ("condition1", node["condition"].as()); - message = loot::Message(loot::Message::say, "content1", "condition1"); - node = message; - EXPECT_EQ("say", node["type"].as()); - EXPECT_EQ(mcs, node["content"].as()); - EXPECT_EQ("condition1", node["condition"].as()); + mcs = MessageContents({ + MessageContent("content1", Language::english), + MessageContent("content2", Language::french), + }); + message = Message(Message::say, mcs); + node = message; + EXPECT_EQ("say", node["type"].as()); + EXPECT_EQ(mcs, node["content"].as()); + EXPECT_FALSE(node["condition"]); + } - mcs = MessageContents({ - MessageContent("content1", Language::english), - MessageContent("content2", Language::french), - }); - message = loot::Message(loot::Message::say, mcs); - node = message; - EXPECT_EQ("say", node["type"].as()); - EXPECT_EQ(mcs, node["content"].as()); - EXPECT_FALSE(node["condition"]); -} + TEST_F(MessageTest, YamlDecode) { + YAML::Node node = YAML::Load("type: say\n" + "content: content1"); + Message message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); + EXPECT_EQ("", message.Condition()); -TEST_F(Message, YamlDecode) { - YAML::Node node = YAML::Load("type: say\n" - "content: content1"); - loot::Message message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); - EXPECT_EQ("", message.Condition()); + node = YAML::Load("type: warn\n" + "content: content1"); + message = node.as(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); + EXPECT_EQ("", message.Condition()); - node = YAML::Load("type: warn\n" - "content: content1"); - message = node.as(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); - EXPECT_EQ("", message.Condition()); + node = YAML::Load("type: error\n" + "content: content1"); + message = node.as(); + EXPECT_EQ(Message::error, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); + EXPECT_EQ("", message.Condition()); - node = YAML::Load("type: error\n" - "content: content1"); - message = node.as(); - EXPECT_EQ(loot::Message::error, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); - EXPECT_EQ("", message.Condition()); + node = YAML::Load("type: invalid\n" + "content: content1"); + message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); + EXPECT_EQ("", message.Condition()); - node = YAML::Load("type: invalid\n" - "content: content1"); - message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); - EXPECT_EQ("", message.Condition()); + node = YAML::Load("type: say\n" + "content: content1\n" + "condition: 'file(\"Foo.esp\")'"); + message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); + EXPECT_EQ("file(\"Foo.esp\")", message.Condition()); - node = YAML::Load("type: say\n" - "content: content1\n" - "condition: 'file(\"Foo.esp\")'"); - message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content()); - EXPECT_EQ("file(\"Foo.esp\")", message.Condition()); + node = YAML::Load("type: say\n" + "content:\n" + " - lang: en\n" + " str: content1\n" + " - lang: de\n" + " str: content2"); + message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({ + MessageContent("content1", Language::english), + MessageContent("content2", Language::german), + }), message.Content()); + EXPECT_EQ("", message.Condition()); - node = YAML::Load("type: say\n" - "content:\n" - " - lang: en\n" - " str: content1\n" - " - lang: de\n" - " str: content2"); - message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({ - MessageContent("content1", Language::english), - MessageContent("content2", Language::german), - }), message.Content()); - EXPECT_EQ("", message.Condition()); + node = YAML::Load("type: say\n" + "content:\n" + " - lang: fr\n" + " str: content1"); + message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("content1", Language::french)}), message.Content()); + EXPECT_EQ("", message.Condition()); - node = YAML::Load("type: say\n" - "content:\n" - " - lang: fr\n" - " str: content1"); - message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("content1", Language::french)}), message.Content()); - EXPECT_EQ("", message.Condition()); + // Throw because no English string is given in a multilingual message. + node = YAML::Load("type: say\n" + "content:\n" + " - lang: de\n" + " str: content1\n" + " - lang: fr\n" + " str: content2"); + EXPECT_THROW(node.as(), YAML::RepresentationException); - // Throw because no English string is given in a multilingual message. - node = YAML::Load("type: say\n" - "content:\n" - " - lang: de\n" - " str: content1\n" - " - lang: fr\n" - " str: content2"); - EXPECT_THROW(node.as(), YAML::RepresentationException); + node = YAML::Load("type: say\n" + "content: con%1%tent1\n" + "subs:\n" + " - sub1"); + message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("consub1tent1", Language::english)}), message.Content()); + EXPECT_EQ("", message.Condition()); - node = YAML::Load("type: say\n" - "content: con%1%tent1\n" - "subs:\n" - " - sub1"); - message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("consub1tent1", Language::english)}), message.Content()); - EXPECT_EQ("", message.Condition()); + // Check that subs apply to all languages of a multilingual message. + node = YAML::Load("type: say\n" + "content:\n" + " - lang: en\n" + " str: content1 %1%\n" + " - lang: de\n" + " str: content2 %1%\n" + "subs:\n" + " - sub"); + message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({ + MessageContent("content1 sub", Language::english), + MessageContent("content2 sub", Language::german), + }), message.Content()); + EXPECT_EQ("", message.Condition()); - // Check that subs apply to all languages of a multilingual message. - node = YAML::Load("type: say\n" - "content:\n" - " - lang: en\n" - " str: content1 %1%\n" - " - lang: de\n" - " str: content2 %1%\n" - "subs:\n" - " - sub"); - message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({ - MessageContent("content1 sub", Language::english), - MessageContent("content2 sub", Language::german), - }), message.Content()); - EXPECT_EQ("", message.Condition()); + // Throw because there aren't the same number of subs as referred to in the content string. + node = YAML::Load("type: say\n" + "content: '%1% %2%'\n" + "subs:\n" + " - sub1"); + EXPECT_THROW(node.as(), YAML::RepresentationException); - // Throw because there aren't the same number of subs as referred to in the content string. - node = YAML::Load("type: say\n" - "content: '%1% %2%'\n" - "subs:\n" - " - sub1"); - EXPECT_THROW(node.as(), YAML::RepresentationException); + // Don't throw because no subs are given, so none are expected in the content string. + node = YAML::Load("type: say\n" + "content: con%1%tent1\n"); + message = node.as(); + EXPECT_EQ(Message::say, message.Type()); + EXPECT_EQ(MessageContents({MessageContent("con%1%tent1", Language::english)}), message.Content()); + EXPECT_EQ("", message.Condition()); - // Don't throw because no subs are given, so none are expected in the content string. - node = YAML::Load("type: say\n" - "content: con%1%tent1\n"); - message = node.as(); - EXPECT_EQ(loot::Message::say, message.Type()); - EXPECT_EQ(MessageContents({MessageContent("con%1%tent1", Language::english)}), message.Content()); - EXPECT_EQ("", message.Condition()); + node = YAML::Load("type: say\n" + "content: content1\n" + "condition: invalid"); + EXPECT_THROW(node.as(), YAML::RepresentationException); - node = YAML::Load("type: say\n" - "content: content1\n" - "condition: invalid"); - EXPECT_THROW(node.as(), YAML::RepresentationException); + node = YAML::Load("scalar"); + EXPECT_THROW(node.as(), YAML::RepresentationException); - node = YAML::Load("scalar"); - EXPECT_THROW(node.as(), YAML::RepresentationException); - - node = YAML::Load("[0, 1, 2]"); - EXPECT_THROW(node.as(), YAML::RepresentationException); + node = YAML::Load("[0, 1, 2]"); + EXPECT_THROW(node.as(), YAML::RepresentationException); + } + } } #endif diff --git a/src/tests/backend/metadata/test_message_content.h b/src/tests/backend/metadata/test_message_content.h index dba1ff40..daa7251c 100644 --- a/src/tests/backend/metadata/test_message_content.h +++ b/src/tests/backend/metadata/test_message_content.h @@ -28,84 +28,85 @@ along with LOOT. If not, see #include "backend/metadata/message_content.h" #include "tests/fixtures.h" -using loot::Language; -using loot::MessageContent; +namespace loot { + namespace test { + TEST(MessageContent, ConstructorsAndDataAccess) { + MessageContent mc; + EXPECT_EQ("", mc.Str()); + EXPECT_EQ(Language::english, mc.Language()); -TEST(MessageContent, ConstructorsAndDataAccess) { - MessageContent mc; - EXPECT_EQ("", mc.Str()); - EXPECT_EQ(Language::english, mc.Language()); + mc = MessageContent("content", Language::french); + EXPECT_EQ("content", mc.Str()); + EXPECT_EQ(Language::french, mc.Language()); + } - mc = MessageContent("content", Language::french); - EXPECT_EQ("content", mc.Str()); - EXPECT_EQ(Language::french, mc.Language()); -} + TEST(MessageContent, EqualityOperator) { + MessageContent mc1, mc2; + EXPECT_TRUE(mc1 == mc2); -TEST(MessageContent, EqualityOperator) { - MessageContent mc1, mc2; - EXPECT_TRUE(mc1 == mc2); + mc1 = MessageContent("content", Language::french); + mc2 = MessageContent("Content", Language::french); + EXPECT_TRUE(mc1 == mc2); - mc1 = MessageContent("content", Language::french); - mc2 = MessageContent("Content", Language::french); - EXPECT_TRUE(mc1 == mc2); + mc1 = MessageContent("content1", Language::french); + mc2 = MessageContent("content2", Language::french); + EXPECT_FALSE(mc1 == mc2); - mc1 = MessageContent("content1", Language::french); - mc2 = MessageContent("content2", Language::french); - EXPECT_FALSE(mc1 == mc2); + mc1 = MessageContent("content", Language::english); + mc2 = MessageContent("Content", Language::french); + EXPECT_TRUE(mc1 == mc2); + } - mc1 = MessageContent("content", Language::english); - mc2 = MessageContent("Content", Language::french); - EXPECT_TRUE(mc1 == mc2); -} + TEST(MessageContent, LessThanOperator) { + MessageContent mc1, mc2; + EXPECT_FALSE(mc1 < mc2); + EXPECT_FALSE(mc2 < mc1); -TEST(MessageContent, LessThanOperator) { - MessageContent mc1, mc2; - EXPECT_FALSE(mc1 < mc2); - EXPECT_FALSE(mc2 < mc1); + mc1 = MessageContent("content", Language::french); + mc2 = MessageContent("Content", Language::french); + EXPECT_FALSE(mc1 < mc2); + EXPECT_FALSE(mc2 < mc1); - mc1 = MessageContent("content", Language::french); - mc2 = MessageContent("Content", Language::french); - EXPECT_FALSE(mc1 < mc2); - EXPECT_FALSE(mc2 < mc1); + mc1 = MessageContent("content", Language::english); + mc2 = MessageContent("content", Language::french); + EXPECT_FALSE(mc1 < mc2); + EXPECT_FALSE(mc2 < mc1); - mc1 = MessageContent("content", Language::english); - mc2 = MessageContent("content", Language::french); - EXPECT_FALSE(mc1 < mc2); - EXPECT_FALSE(mc2 < mc1); + mc1 = MessageContent("content1", Language::english); + mc2 = MessageContent("content2", Language::english); + EXPECT_TRUE(mc1 < mc2); + EXPECT_FALSE(mc2 < mc1); + } - mc1 = MessageContent("content1", Language::english); - mc2 = MessageContent("content2", Language::english); - EXPECT_TRUE(mc1 < mc2); - EXPECT_FALSE(mc2 < mc1); -} + TEST(MessageContent, YamlEmitter) { + MessageContent mc("content", Language::french); + YAML::Emitter e1; + e1 << mc; + EXPECT_STREQ("lang: fr\nstr: 'content'", e1.c_str()); + } -TEST(MessageContent, YamlEmitter) { - MessageContent mc("content", Language::french); - YAML::Emitter e1; - e1 << mc; - EXPECT_STREQ("lang: fr\nstr: 'content'", e1.c_str()); -} + TEST(MessageContent, YamlEncode) { + YAML::Node node; -TEST(MessageContent, YamlEncode) { - YAML::Node node; + MessageContent mc("content", Language::french); + node = mc; + EXPECT_EQ("content", node["str"].as()); + EXPECT_EQ("fr", node["lang"].as()); + } - MessageContent mc("content", Language::french); - node = mc; - EXPECT_EQ("content", node["str"].as()); - EXPECT_EQ("fr", node["lang"].as()); -} + TEST(MessageContent, YamlDecode) { + YAML::Node node = YAML::Load("{str: content, lang: de}"); + MessageContent mc = node.as(); + EXPECT_EQ("content", mc.Str()); + EXPECT_EQ(Language::german, mc.Language()); -TEST(MessageContent, YamlDecode) { - YAML::Node node = YAML::Load("{str: content, lang: de}"); - MessageContent mc = node.as(); - EXPECT_EQ("content", mc.Str()); - EXPECT_EQ(Language::german, mc.Language()); + node = YAML::Load("scalar"); + EXPECT_ANY_THROW(node.as()); - node = YAML::Load("scalar"); - EXPECT_ANY_THROW(node.as()); - - node = YAML::Load("[0, 1, 2]"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("[0, 1, 2]"); + EXPECT_ANY_THROW(node.as()); + } + } } #endif diff --git a/src/tests/backend/metadata/test_plugin_dirty_info.h b/src/tests/backend/metadata/test_plugin_dirty_info.h index 3cbd248e..d632885c 100644 --- a/src/tests/backend/metadata/test_plugin_dirty_info.h +++ b/src/tests/backend/metadata/test_plugin_dirty_info.h @@ -28,212 +28,216 @@ along with LOOT. If not, see #include "backend/metadata/plugin_dirty_info.h" #include "tests/fixtures.h" -class PluginDirtyInfo : public SkyrimTest {}; +namespace loot { + namespace test { + class PluginDirtyInfoTest : public SkyrimTest {}; -TEST_F(PluginDirtyInfo, ConstructorsAndDataAccess) { - loot::PluginDirtyInfo info; - EXPECT_EQ(0, info.CRC()); - EXPECT_EQ(0, info.ITMs()); - EXPECT_EQ(0, info.DeletedRefs()); - EXPECT_EQ(0, info.DeletedNavmeshes()); - EXPECT_EQ("", info.CleaningUtility()); + TEST_F(PluginDirtyInfoTest, ConstructorsAndDataAccess) { + PluginDirtyInfo info; + EXPECT_EQ(0, info.CRC()); + EXPECT_EQ(0, info.ITMs()); + EXPECT_EQ(0, info.DeletedRefs()); + EXPECT_EQ(0, info.DeletedNavmeshes()); + EXPECT_EQ("", info.CleaningUtility()); - info = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); - EXPECT_EQ(0x12345678, info.CRC()); - EXPECT_EQ(2, info.ITMs()); - EXPECT_EQ(10, info.DeletedRefs()); - EXPECT_EQ(30, info.DeletedNavmeshes()); - EXPECT_EQ("cleaner", info.CleaningUtility()); -} + info = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); + EXPECT_EQ(0x12345678, info.CRC()); + EXPECT_EQ(2, info.ITMs()); + EXPECT_EQ(10, info.DeletedRefs()); + EXPECT_EQ(30, info.DeletedNavmeshes()); + EXPECT_EQ("cleaner", info.CleaningUtility()); + } -TEST_F(PluginDirtyInfo, MessageOutput) { - loot::Message message; + TEST_F(PluginDirtyInfoTest, MessageOutput) { + Message message; - message = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Contains 2 ITM records, 10 deleted references and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); + message = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Contains 2 ITM records, 10 deleted references and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); - message = loot::PluginDirtyInfo(0x12345678, 0, 0, 0, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Clean with cleaner.", message.ChooseContent(Language::any).Str()); + message = PluginDirtyInfo(0x12345678, 0, 0, 0, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Clean with cleaner.", message.ChooseContent(Language::any).Str()); - message = loot::PluginDirtyInfo(0x12345678, 0, 10, 30, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Contains 10 deleted references and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); + message = PluginDirtyInfo(0x12345678, 0, 10, 30, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Contains 10 deleted references and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); - message = loot::PluginDirtyInfo(0x12345678, 0, 0, 30, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Contains 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); + message = PluginDirtyInfo(0x12345678, 0, 0, 30, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Contains 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); - message = loot::PluginDirtyInfo(0x12345678, 0, 10, 0, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Contains 10 deleted references. Clean with cleaner.", message.ChooseContent(Language::any).Str()); + message = PluginDirtyInfo(0x12345678, 0, 10, 0, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Contains 10 deleted references. Clean with cleaner.", message.ChooseContent(Language::any).Str()); - message = loot::PluginDirtyInfo(0x12345678, 2, 0, 30, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Contains 2 ITM records and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); + message = PluginDirtyInfo(0x12345678, 2, 0, 30, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Contains 2 ITM records and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str()); - message = loot::PluginDirtyInfo(0x12345678, 2, 0, 0, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Contains 2 ITM records. Clean with cleaner.", message.ChooseContent(Language::any).Str()); + message = PluginDirtyInfo(0x12345678, 2, 0, 0, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Contains 2 ITM records. Clean with cleaner.", message.ChooseContent(Language::any).Str()); - message = loot::PluginDirtyInfo(0x12345678, 2, 10, 0, "cleaner").AsMessage(); - EXPECT_EQ(loot::Message::warn, message.Type()); - EXPECT_EQ("Contains 2 ITM records and 10 deleted references. Clean with cleaner.", message.ChooseContent(Language::any).Str()); -} + message = PluginDirtyInfo(0x12345678, 2, 10, 0, "cleaner").AsMessage(); + EXPECT_EQ(Message::warn, message.Type()); + EXPECT_EQ("Contains 2 ITM records and 10 deleted references. Clean with cleaner.", message.ChooseContent(Language::any).Str()); + } -TEST_F(PluginDirtyInfo, EqualityOperator) { - loot::PluginDirtyInfo info1, info2; - EXPECT_TRUE(info1 == info2); + TEST_F(PluginDirtyInfoTest, EqualityOperator) { + PluginDirtyInfo info1, info2; + EXPECT_TRUE(info1 == info2); - info1 = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner1"); - info2 = loot::PluginDirtyInfo(0x12345678, 4, 20, 60, "cleaner2"); - EXPECT_TRUE(info1 == info2); + info1 = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner1"); + info2 = PluginDirtyInfo(0x12345678, 4, 20, 60, "cleaner2"); + EXPECT_TRUE(info1 == info2); - info1 = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); - info2 = loot::PluginDirtyInfo(0x87654321, 2, 10, 30, "cleaner"); - EXPECT_FALSE(info1 == info2); -} + info1 = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); + info2 = PluginDirtyInfo(0x87654321, 2, 10, 30, "cleaner"); + EXPECT_FALSE(info1 == info2); + } -TEST_F(PluginDirtyInfo, LessThanOperator) { - loot::PluginDirtyInfo info1, info2; - EXPECT_FALSE(info1 < info2); - EXPECT_FALSE(info2 < info1); + TEST_F(PluginDirtyInfoTest, LessThanOperator) { + PluginDirtyInfo info1, info2; + EXPECT_FALSE(info1 < info2); + EXPECT_FALSE(info2 < info1); - info1 = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner1"); - info2 = loot::PluginDirtyInfo(0x12345678, 4, 20, 60, "cleaner2"); - EXPECT_FALSE(info1 < info2); - EXPECT_FALSE(info2 < info1); + info1 = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner1"); + info2 = PluginDirtyInfo(0x12345678, 4, 20, 60, "cleaner2"); + EXPECT_FALSE(info1 < info2); + EXPECT_FALSE(info2 < info1); - info1 = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); - info2 = loot::PluginDirtyInfo(0x87654321, 2, 10, 30, "cleaner"); - EXPECT_TRUE(info1 < info2); - EXPECT_FALSE(info2 < info1); -} + info1 = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); + info2 = PluginDirtyInfo(0x87654321, 2, 10, 30, "cleaner"); + EXPECT_TRUE(info1 < info2); + EXPECT_FALSE(info2 < info1); + } -TEST_F(PluginDirtyInfo, EvalConditionTrue) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); + TEST_F(PluginDirtyInfoTest, EvalConditionTrue) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); - loot::PluginDirtyInfo dirtyInfo = loot::PluginDirtyInfo(0x24F0E2A1, 2, 10, 30, "cleaner"); - EXPECT_TRUE(dirtyInfo.EvalCondition(game, "Blank.esp")); -} + PluginDirtyInfo dirtyInfo = PluginDirtyInfo(0x24F0E2A1, 2, 10, 30, "cleaner"); + EXPECT_TRUE(dirtyInfo.EvalCondition(game, "Blank.esp")); + } -TEST_F(PluginDirtyInfo, EvalConditionFalse) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); + TEST_F(PluginDirtyInfoTest, EvalConditionFalse) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); - loot::PluginDirtyInfo dirtyInfo; - EXPECT_FALSE(dirtyInfo.EvalCondition(game, "")); + PluginDirtyInfo dirtyInfo; + EXPECT_FALSE(dirtyInfo.EvalCondition(game, "")); - dirtyInfo = loot::PluginDirtyInfo(0xDEADBEEF, 2, 10, 30, "cleaner"); - EXPECT_FALSE(dirtyInfo.EvalCondition(game, "Blank.esp")); -} + dirtyInfo = PluginDirtyInfo(0xDEADBEEF, 2, 10, 30, "cleaner"); + EXPECT_FALSE(dirtyInfo.EvalCondition(game, "Blank.esp")); + } -TEST_F(PluginDirtyInfo, YamlEmitter) { - loot::PluginDirtyInfo info; + TEST_F(PluginDirtyInfoTest, YamlEmitter) { + PluginDirtyInfo info; - info = loot::PluginDirtyInfo(0x12345678, 0, 0, 0, "cleaner"); - YAML::Emitter e1; - e1 << info; - EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'", e1.c_str()); + info = PluginDirtyInfo(0x12345678, 0, 0, 0, "cleaner"); + YAML::Emitter e1; + e1 << info; + EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'", e1.c_str()); - info = loot::PluginDirtyInfo(0x12345678, 2, 0, 0, "cleaner"); - YAML::Emitter e2; - e2 << info; - EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'\nitm: 2", e2.c_str()); + info = PluginDirtyInfo(0x12345678, 2, 0, 0, "cleaner"); + YAML::Emitter e2; + e2 << info; + EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'\nitm: 2", e2.c_str()); - info = loot::PluginDirtyInfo(0x12345678, 2, 10, 0, "cleaner"); - YAML::Emitter e3; - e3 << info; - EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'\nitm: 2\nudr: 10", e3.c_str()); + info = PluginDirtyInfo(0x12345678, 2, 10, 0, "cleaner"); + YAML::Emitter e3; + e3 << info; + EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'\nitm: 2\nudr: 10", e3.c_str()); - info = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); - YAML::Emitter e4; - e4 << info; - EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'\nitm: 2\nudr: 10\nnav: 30", e4.c_str()); -} + info = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); + YAML::Emitter e4; + e4 << info; + EXPECT_STREQ("crc: 0x12345678\nutil: 'cleaner'\nitm: 2\nudr: 10\nnav: 30", e4.c_str()); + } -TEST_F(PluginDirtyInfo, YamlEncode) { - YAML::Node node; - loot::PluginDirtyInfo info; + TEST_F(PluginDirtyInfoTest, YamlEncode) { + YAML::Node node; + PluginDirtyInfo info; - info = loot::PluginDirtyInfo(0x12345678, 0, 0, 0, "cleaner"); - node = info; - EXPECT_EQ(0x12345678, node["crc"].as()); - EXPECT_EQ("cleaner", node["util"].as()); - EXPECT_FALSE(node["itm"]); - EXPECT_FALSE(node["udr"]); - EXPECT_FALSE(node["nav"]); + info = PluginDirtyInfo(0x12345678, 0, 0, 0, "cleaner"); + node = info; + EXPECT_EQ(0x12345678, node["crc"].as()); + EXPECT_EQ("cleaner", node["util"].as()); + EXPECT_FALSE(node["itm"]); + EXPECT_FALSE(node["udr"]); + EXPECT_FALSE(node["nav"]); - info = loot::PluginDirtyInfo(0x12345678, 2, 0, 0, "cleaner"); - node = info; - EXPECT_EQ(0x12345678, node["crc"].as()); - EXPECT_EQ("cleaner", node["util"].as()); - EXPECT_EQ(2, node["itm"].as()); - EXPECT_FALSE(node["udr"]); - EXPECT_FALSE(node["nav"]); + info = PluginDirtyInfo(0x12345678, 2, 0, 0, "cleaner"); + node = info; + EXPECT_EQ(0x12345678, node["crc"].as()); + EXPECT_EQ("cleaner", node["util"].as()); + EXPECT_EQ(2, node["itm"].as()); + EXPECT_FALSE(node["udr"]); + EXPECT_FALSE(node["nav"]); - info = loot::PluginDirtyInfo(0x12345678, 2, 10, 0, "cleaner"); - node = info; - EXPECT_EQ(0x12345678, node["crc"].as()); - EXPECT_EQ("cleaner", node["util"].as()); - EXPECT_EQ(2, node["itm"].as()); - EXPECT_EQ(10, node["udr"].as()); - EXPECT_FALSE(node["nav"]); + info = PluginDirtyInfo(0x12345678, 2, 10, 0, "cleaner"); + node = info; + EXPECT_EQ(0x12345678, node["crc"].as()); + EXPECT_EQ("cleaner", node["util"].as()); + EXPECT_EQ(2, node["itm"].as()); + EXPECT_EQ(10, node["udr"].as()); + EXPECT_FALSE(node["nav"]); - info = loot::PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); - node = info; - EXPECT_EQ(0x12345678, node["crc"].as()); - EXPECT_EQ("cleaner", node["util"].as()); - EXPECT_EQ(2, node["itm"].as()); - EXPECT_EQ(10, node["udr"].as()); - EXPECT_EQ(30, node["nav"].as()); -} + info = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner"); + node = info; + EXPECT_EQ(0x12345678, node["crc"].as()); + EXPECT_EQ("cleaner", node["util"].as()); + EXPECT_EQ(2, node["itm"].as()); + EXPECT_EQ(10, node["udr"].as()); + EXPECT_EQ(30, node["nav"].as()); + } -TEST_F(PluginDirtyInfo, YamlDecode) { - YAML::Node node; - loot::PluginDirtyInfo info; + TEST_F(PluginDirtyInfoTest, YamlDecode) { + YAML::Node node; + PluginDirtyInfo info; - node = YAML::Load("{crc: 0x12345678, util: cleaner}"); - info = node.as(); - EXPECT_EQ(0x12345678, info.CRC()); - EXPECT_EQ(0, info.ITMs()); - EXPECT_EQ(0, info.DeletedRefs()); - EXPECT_EQ(0, info.DeletedNavmeshes()); - EXPECT_EQ("cleaner", info.CleaningUtility()); + node = YAML::Load("{crc: 0x12345678, util: cleaner}"); + info = node.as(); + EXPECT_EQ(0x12345678, info.CRC()); + EXPECT_EQ(0, info.ITMs()); + EXPECT_EQ(0, info.DeletedRefs()); + EXPECT_EQ(0, info.DeletedNavmeshes()); + EXPECT_EQ("cleaner", info.CleaningUtility()); - node = YAML::Load("{crc: 0x12345678, util: cleaner, itm: 2}"); - info = node.as(); - EXPECT_EQ(0x12345678, info.CRC()); - EXPECT_EQ(2, info.ITMs()); - EXPECT_EQ(0, info.DeletedRefs()); - EXPECT_EQ(0, info.DeletedNavmeshes()); - EXPECT_EQ("cleaner", info.CleaningUtility()); + node = YAML::Load("{crc: 0x12345678, util: cleaner, itm: 2}"); + info = node.as(); + EXPECT_EQ(0x12345678, info.CRC()); + EXPECT_EQ(2, info.ITMs()); + EXPECT_EQ(0, info.DeletedRefs()); + EXPECT_EQ(0, info.DeletedNavmeshes()); + EXPECT_EQ("cleaner", info.CleaningUtility()); - node = YAML::Load("{crc: 0x12345678, util: cleaner, itm: 2, udr: 10}"); - info = node.as(); - EXPECT_EQ(0x12345678, info.CRC()); - EXPECT_EQ(2, info.ITMs()); - EXPECT_EQ(10, info.DeletedRefs()); - EXPECT_EQ(0, info.DeletedNavmeshes()); - EXPECT_EQ("cleaner", info.CleaningUtility()); + node = YAML::Load("{crc: 0x12345678, util: cleaner, itm: 2, udr: 10}"); + info = node.as(); + EXPECT_EQ(0x12345678, info.CRC()); + EXPECT_EQ(2, info.ITMs()); + EXPECT_EQ(10, info.DeletedRefs()); + EXPECT_EQ(0, info.DeletedNavmeshes()); + EXPECT_EQ("cleaner", info.CleaningUtility()); - node = YAML::Load("{crc: 0x12345678, util: cleaner, itm: 2, udr: 10, nav: 30}"); - info = node.as(); - EXPECT_EQ(0x12345678, info.CRC()); - EXPECT_EQ(2, info.ITMs()); - EXPECT_EQ(10, info.DeletedRefs()); - EXPECT_EQ(30, info.DeletedNavmeshes()); - EXPECT_EQ("cleaner", info.CleaningUtility()); + node = YAML::Load("{crc: 0x12345678, util: cleaner, itm: 2, udr: 10, nav: 30}"); + info = node.as(); + EXPECT_EQ(0x12345678, info.CRC()); + EXPECT_EQ(2, info.ITMs()); + EXPECT_EQ(10, info.DeletedRefs()); + EXPECT_EQ(30, info.DeletedNavmeshes()); + EXPECT_EQ("cleaner", info.CleaningUtility()); - node = YAML::Load("scalar"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("scalar"); + EXPECT_ANY_THROW(node.as()); - node = YAML::Load("[0, 1, 2]"); - EXPECT_ANY_THROW(node.as()); + node = YAML::Load("[0, 1, 2]"); + EXPECT_ANY_THROW(node.as()); + } + } } #endif diff --git a/src/tests/backend/metadata/test_plugin_metadata.h b/src/tests/backend/metadata/test_plugin_metadata.h index 8353e2de..d1d8f323 100644 --- a/src/tests/backend/metadata/test_plugin_metadata.h +++ b/src/tests/backend/metadata/test_plugin_metadata.h @@ -28,922 +28,926 @@ along with LOOT. If not, see #include "backend/metadata/plugin_metadata.h" #include "tests/fixtures.h" -class PluginMetadata : public SkyrimTest {}; - -TEST_F(PluginMetadata, Constructors) { - loot::PluginMetadata pm; - EXPECT_TRUE(pm.Enabled()); - EXPECT_FALSE(pm.IsPriorityExplicit()); - EXPECT_FALSE(pm.IsPriorityGlobal()); - EXPECT_EQ(0, pm.Priority()); - - pm = loot::PluginMetadata("Blank.esm"); - EXPECT_EQ("Blank.esm", pm.Name()); - EXPECT_TRUE(pm.Enabled()); - EXPECT_FALSE(pm.IsPriorityExplicit()); - EXPECT_FALSE(pm.IsPriorityGlobal()); - EXPECT_EQ(0, pm.Priority()); -} - -TEST_F(PluginMetadata, EqualityOperator) { - loot::PluginMetadata pm1, pm2; - EXPECT_TRUE(pm1 == pm2); - - pm1 = loot::PluginMetadata("Blank.esm"); - pm2 = loot::PluginMetadata("blank.esm"); - EXPECT_TRUE(pm1 == pm2); - - pm1 = loot::PluginMetadata("Blank.esm"); - pm2 = loot::PluginMetadata("Blan.\\.esm"); - EXPECT_TRUE(pm1 == pm2); - EXPECT_TRUE(pm2 == pm1); - - pm1 = loot::PluginMetadata("Blan.esm"); - pm2 = loot::PluginMetadata("Blan.\\.esm"); - EXPECT_FALSE(pm1 == pm2); - EXPECT_FALSE(pm2 == pm1); - - pm1 = loot::PluginMetadata("Blan.\\.esm"); - pm2 = loot::PluginMetadata("Blan.\\.esm"); - EXPECT_TRUE(pm1 == pm2); - EXPECT_TRUE(pm2 == pm1); - - pm1 = loot::PluginMetadata("Blan(k|p).esm"); - pm2 = loot::PluginMetadata("Blan.\\.esm"); - EXPECT_FALSE(pm1 == pm2); - EXPECT_FALSE(pm2 == pm1); -} - -TEST_F(PluginMetadata, MergeMetadata) { - loot::PluginMetadata pm1(YAML::Load( - "name: 'Blank.esp'\n" - "enabled: false\n" - "priority: 5\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - "tag:\n" - " - Relev\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'" - ).as()); - - loot::PluginMetadata pm2(YAML::Load( - "name: 'Blank - Different.esp'\n" - "after:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "req:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "inc:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - "tag:\n" - " - Relev\n" - " - -Relev\n" - " - Delev\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - " - crc: 0x9\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'\n" - " - 'http://www.example2.com'" - ).as()); - - EXPECT_NO_THROW(pm1.MergeMetadata(pm2)); - EXPECT_EQ("Blank.esp", pm1.Name()); - EXPECT_TRUE(pm1.Enabled()); - EXPECT_EQ(5, pm1.Priority()); - EXPECT_TRUE(pm1.IsPriorityExplicit()); - EXPECT_FALSE(pm1.IsPriorityGlobal()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm"), - loot::File("Blank.esp"), - }), pm1.LoadAfter()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm"), - loot::File("Blank.esp"), - }), pm1.Reqs()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm"), - loot::File("Blank.esp"), - }), pm1.Incs()); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "content"), - loot::Message(loot::Message::say, "content"), - }), pm1.Messages()); - EXPECT_EQ(std::set({ - loot::Tag("Relev"), - loot::Tag("Relev", false), - loot::Tag("Delev"), - }), pm1.Tags()); - EXPECT_EQ(std::set({ - loot::PluginDirtyInfo(5, 0, 1, 2, "utility"), - loot::PluginDirtyInfo(9, 0, 1, 2, "utility"), - }), pm1.DirtyInfo()); - EXPECT_EQ(std::set({ - loot::Location("http://www.example.com"), - loot::Location("http://www.example2.com"), - }), pm1.Locations()); - - pm2.SetPriorityExplicit(true); - EXPECT_NO_THROW(pm1.MergeMetadata(pm2)); - EXPECT_EQ(0, pm1.Priority()); - EXPECT_TRUE(pm1.IsPriorityExplicit()); - EXPECT_FALSE(pm1.IsPriorityGlobal()); -} - -TEST_F(PluginMetadata, DiffMetadata) { - loot::PluginMetadata pm1(YAML::Load( - "name: 'Blank.esp'\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - " - 'Blank - Different.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - " - 'Blank - Different.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - " - 'Blank - Different.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - " - type: say\n" - " content: 'content2'\n" - "tag:\n" - " - Relev\n" - " - NoMerge\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - " - crc: 0x1\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'\n" - " - 'http://www.other-example.com'" - ).as()); - - loot::PluginMetadata pm2(YAML::Load( - "name: 'Blank - Different.esp'\n" - "after:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "req:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "inc:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - " - type: say\n" - " content: 'content3'\n" - "tag:\n" - " - Relev\n" - " - -Relev\n" - " - Delev\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - " - crc: 0x9\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'\n" - " - 'http://www.example2.com'" - ).as()); - - loot::PluginMetadata result = pm1.DiffMetadata(pm2); - EXPECT_EQ("Blank.esp", result.Name()); - EXPECT_FALSE(result.Enabled()); - EXPECT_EQ(0, result.Priority()); - EXPECT_FALSE(result.IsPriorityExplicit()); - EXPECT_FALSE(result.IsPriorityGlobal()); - EXPECT_EQ(std::set({ - loot::File("Blank.esp"), - loot::File("Blank - Different.esm"), - }), result.LoadAfter()); - EXPECT_EQ(std::set({ - loot::File("Blank.esp"), - loot::File("Blank - Different.esm"), - }), result.Reqs()); - EXPECT_EQ(std::set({ - loot::File("Blank.esp"), - loot::File("Blank - Different.esm"), - }), result.Incs()); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "content2"), - loot::Message(loot::Message::say, "content3"), - }), result.Messages()); - EXPECT_EQ(std::set({ - loot::Tag("Relev", false), - loot::Tag("Delev"), - loot::Tag("NoMerge"), - }), result.Tags()); - EXPECT_EQ(std::set({ - loot::PluginDirtyInfo(9, 0, 1, 2, "utility"), - loot::PluginDirtyInfo(1, 0, 1, 2, "utility"), - }), result.DirtyInfo()); - EXPECT_EQ(std::set({ - loot::Location("http://www.example2.com"), - loot::Location("http://www.other-example.com"), - }), result.Locations()); - - pm1.Priority(5); - result = pm1.DiffMetadata(pm2); - - EXPECT_EQ(5, result.Priority()); - EXPECT_TRUE(result.IsPriorityExplicit()); - EXPECT_FALSE(result.IsPriorityGlobal()); -} - -TEST_F(PluginMetadata, NewMetadata) { - loot::PluginMetadata pm1(YAML::Load( - "name: 'Blank.esp'\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - " - 'Blank - Different.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - " - 'Blank - Different.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - " - 'Blank - Different.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - " - type: say\n" - " content: 'content2'\n" - "tag:\n" - " - Relev\n" - " - NoMerge\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - " - crc: 0x1\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'\n" - " - 'http://www.other-example.com'" - ).as()); - - loot::PluginMetadata pm2(YAML::Load( - "name: 'Blank - Different.esp'\n" - "after:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "req:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "inc:\n" - " - 'Blank.esm'\n" - " - 'Blank.esp'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - " - type: say\n" - " content: 'content3'\n" - "tag:\n" - " - Relev\n" - " - -Relev\n" - " - Delev\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - " - crc: 0x9\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'\n" - " - 'http://www.example2.com'" - ).as()); - - loot::PluginMetadata result = pm2.NewMetadata(pm1); - EXPECT_EQ("Blank - Different.esp", result.Name()); - EXPECT_TRUE(result.Enabled()); - EXPECT_EQ(0, result.Priority()); - EXPECT_FALSE(result.IsPriorityExplicit()); - EXPECT_FALSE(result.IsPriorityGlobal()); - EXPECT_EQ(std::set({ - loot::File("Blank.esp") - }), result.LoadAfter()); - EXPECT_EQ(std::set({ - loot::File("Blank.esp") - }), result.Reqs()); - EXPECT_EQ(std::set({ - loot::File("Blank.esp") - }), result.Incs()); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "content3"), - }), result.Messages()); - EXPECT_EQ(std::set({ - loot::Tag("Relev", false), - loot::Tag("Delev"), - }), result.Tags()); - EXPECT_EQ(std::set({ - loot::PluginDirtyInfo(9, 0, 1, 2, "utility") - }), result.DirtyInfo()); - EXPECT_EQ(std::set({ - loot::Location("http://www.example2.com") - }), result.Locations()); - - pm1.Priority(5); - result = pm2.NewMetadata(pm1); - - EXPECT_EQ(0, result.Priority()); - EXPECT_FALSE(result.IsPriorityExplicit()); - EXPECT_FALSE(result.IsPriorityGlobal()); -} - -TEST_F(PluginMetadata, Enabled) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.Enabled()); - pm.Enabled(false); - EXPECT_FALSE(pm.Enabled()); -} - -TEST_F(PluginMetadata, SetPriorityExplicit) { - loot::PluginMetadata pm; - ASSERT_FALSE(pm.IsPriorityExplicit()); - pm.SetPriorityExplicit(true); - EXPECT_TRUE(pm.IsPriorityExplicit()); -} - -TEST_F(PluginMetadata, Priority) { - loot::PluginMetadata pm; - ASSERT_NE(10, pm.Priority()); - pm.Priority(10); - EXPECT_EQ(10, pm.Priority()); -} - -TEST_F(PluginMetadata, settingPriorityWithAbsoluteValueGreaterOrEqualToGlobalPriorityDivisorShouldThrow) { - loot::PluginMetadata pm; - EXPECT_ANY_THROW(pm.Priority(loot::yamlGlobalPriorityDivisor)); - EXPECT_ANY_THROW(pm.Priority(loot::yamlGlobalPriorityDivisor + 1)); - EXPECT_ANY_THROW(pm.Priority(-loot::yamlGlobalPriorityDivisor)); - EXPECT_ANY_THROW(pm.Priority(-loot::yamlGlobalPriorityDivisor - 1)); -} - -TEST_F(PluginMetadata, settingPriorityAsGlobalShouldSucceed) { - loot::PluginMetadata pm; - ASSERT_FALSE(pm.IsPriorityGlobal()); - pm.SetPriorityGlobal(true); - EXPECT_TRUE(pm.IsPriorityGlobal()); -} - -TEST_F(PluginMetadata, settingPriorityAsNotGlobalShouldSucceed) { - loot::PluginMetadata pm; - pm.SetPriorityGlobal(true); - ASSERT_TRUE(pm.IsPriorityGlobal()); - pm.SetPriorityGlobal(false); - EXPECT_FALSE(pm.IsPriorityGlobal()); -} - -TEST_F(PluginMetadata, gettingYamlPriorityValueForAGlobalPriorityShouldReturnValueWithGlobalFlagSet) { - loot::PluginMetadata pm; - pm.Priority(10); - pm.SetPriorityGlobal(true); - EXPECT_EQ(1000010, pm.GetYamlPriorityValue()); - - pm.Priority(-20); - EXPECT_EQ(-1000020, pm.GetYamlPriorityValue()); -} - -TEST_F(PluginMetadata, gettingYamlPriorityValueForANonGlobalPriorityShouldReturnValueWithGlobalFlagNotSet) { - loot::PluginMetadata pm; - pm.Priority(10); - EXPECT_EQ(10, pm.GetYamlPriorityValue()); - - pm.Priority(-20); - EXPECT_EQ(-20, pm.GetYamlPriorityValue()); -} - -TEST_F(PluginMetadata, LoadAfter) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.LoadAfter().empty()); - pm.LoadAfter({ - loot::File("Blank.esm") - }); - EXPECT_EQ(std::set({ - loot::File("Blank.esm") - }), pm.LoadAfter()); -} - -TEST_F(PluginMetadata, Reqs) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.Reqs().empty()); - pm.Reqs({ - loot::File("Blank.esm") - }); - EXPECT_EQ(std::set({ - loot::File("Blank.esm") - }), pm.Reqs()); -} - -TEST_F(PluginMetadata, Incs) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.Incs().empty()); - pm.Incs({ - loot::File("Blank.esm") - }); - EXPECT_EQ(std::set({ - loot::File("Blank.esm") - }), pm.Incs()); -} - -TEST_F(PluginMetadata, Messages) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.Messages().empty()); - pm.Messages({ - loot::Message(loot::Message::say, "content") - }); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "content") - }), pm.Messages()); -} - -TEST_F(PluginMetadata, Tags) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.Tags().empty()); - pm.Tags({ - loot::Tag("Relev") - }); - EXPECT_EQ(std::set({ - loot::Tag("Relev") - }), pm.Tags()); -} - -TEST_F(PluginMetadata, DirtyInfo) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.DirtyInfo().empty()); - pm.DirtyInfo({ - loot::PluginDirtyInfo(5, 0, 1, 2, "utility") - }); - EXPECT_EQ(std::set({ - loot::PluginDirtyInfo(5, 0, 1, 2, "utility") - }), pm.DirtyInfo()); -} - -TEST_F(PluginMetadata, Locations) { - loot::PluginMetadata pm; - ASSERT_TRUE(pm.Locations().empty()); - pm.Locations({ - loot::Location("http://www.example.com") - }); - EXPECT_EQ(std::set({ - loot::Location("http://www.example.com") - }), pm.Locations()); -} - -TEST_F(PluginMetadata, EvalAllConditions) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - loot::PluginMetadata pm(YAML::Load( - "name: 'Blank.esp'\n" - "after:\n" - " - name: 'Blank.esm'\n" - " condition: 'file(\"Blank.esm\")'\n" - "req:\n" - " - name: 'Blank.esm'\n" - " condition: 'file(\"Blank.missing.esm\")'\n" - "inc:\n" - " - name: 'Blank.esm'\n" - " condition: 'file(\"Blank.esm\")'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - "tag:\n" - " - name: Relev\n" - " condition: 'file(\"Blank.missing.esm\")'\n" - "dirty:\n" - " - crc: 0x24F0E2A1\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - " - crc: 0xDEADBEEF\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2" - ).as()); - - pm.Messages({loot::Message(loot::Message::say, "content")}); - EXPECT_NO_THROW(pm.EvalAllConditions(game, loot::Language::english)); - EXPECT_EQ(std::set({ - loot::File("Blank.esm", "", "file(\"Blank.esm\")") - }), pm.LoadAfter()); - EXPECT_TRUE(pm.Reqs().empty()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm", "", "file(\"Blank.esm\")") - }), pm.Incs()); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "content") - }), pm.Messages()); - EXPECT_TRUE(pm.Tags().empty()); - EXPECT_EQ(std::set({ - loot::PluginDirtyInfo(0x24F0E2A1, 0, 1, 2, "utility") - }), pm.DirtyInfo()); -} - -TEST_F(PluginMetadata, HasNameOnly) { - loot::PluginMetadata pm; - EXPECT_TRUE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - EXPECT_TRUE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.Enabled(false); - EXPECT_TRUE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.SetPriorityExplicit(true); - EXPECT_FALSE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.LoadAfter({loot::File("Blank.esm")}); - EXPECT_FALSE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.Reqs({loot::File("Blank.esm")}); - EXPECT_FALSE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.Incs({loot::File("Blank.esm")}); - EXPECT_FALSE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.Messages({loot::Message(loot::Message::say, "content")}); - EXPECT_FALSE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.Tags({loot::Tag("Relev")}); - EXPECT_FALSE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.DirtyInfo({loot::PluginDirtyInfo(5, 0, 1, 2, "utility")}); - EXPECT_FALSE(pm.HasNameOnly()); - - pm = loot::PluginMetadata("Blank.esp"); - pm.Locations({loot::Location("http://www.example.com")}); - EXPECT_FALSE(pm.HasNameOnly()); -} - -TEST_F(PluginMetadata, IsRegexPlugin) { - loot::PluginMetadata pm; - EXPECT_FALSE(pm.IsRegexPlugin()); - - pm = loot::PluginMetadata("Blank.esm"); - EXPECT_FALSE(pm.IsRegexPlugin()); - - pm = loot::PluginMetadata("Blank[[:blank:]]- Different.esm"); - EXPECT_TRUE(pm.IsRegexPlugin()); - - pm = loot::PluginMetadata("Blank\\.esm"); - EXPECT_TRUE(pm.IsRegexPlugin()); - - pm = loot::PluginMetadata("Blank - (Different )*Master Dependent.esm"); - EXPECT_TRUE(pm.IsRegexPlugin()); - - pm = loot::PluginMetadata("Blank - (Different )?Master Dependent.esm"); - EXPECT_TRUE(pm.IsRegexPlugin()); - - pm = loot::PluginMetadata("Blank.es(p|m)"); - EXPECT_TRUE(pm.IsRegexPlugin()); -} - -TEST_F(PluginMetadata, YamlEmitter) { - loot::PluginMetadata pm("Blank.esp"); - YAML::Emitter e1; - e1 << pm; - EXPECT_STREQ("", e1.c_str()); - - pm.SetPriorityExplicit(true); - YAML::Emitter e2; - e2 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0", e2.c_str()); - - pm.Enabled(false); - YAML::Emitter e3; - e3 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false", e3.c_str()); - - pm.LoadAfter({loot::File("Blank.esm")}); - YAML::Emitter e4; - e4 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'", e4.c_str()); - - pm.Reqs({loot::File("Blank.esm")}); - YAML::Emitter e5; - e5 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'", e5.c_str()); - - pm.Incs({loot::File("Blank.esm")}); - YAML::Emitter e6; - e6 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - "inc:\n" - " - 'Blank.esm'", e6.c_str()); - - pm.Messages({loot::Message(loot::Message::say, "content")}); - YAML::Emitter e7; - e7 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'", e7.c_str()); - - pm.Tags({loot::Tag("Relev")}); - YAML::Emitter e8; - e8 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - "tag:\n" - " - Relev", e8.c_str()); - - pm.DirtyInfo({loot::PluginDirtyInfo(5, 0, 1, 2, "utility")}); - YAML::Emitter e9; - e9 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - "tag:\n" - " - Relev\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2", e9.c_str()); - - pm.Locations({loot::Location("http://www.example.com")}); - YAML::Emitter e10; - e10 << pm; - EXPECT_STREQ("name: 'Blank.esp'\n" - "priority: 0\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - "tag:\n" - " - Relev\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'", e10.c_str()); -} - -TEST_F(PluginMetadata, YamlEncode) { - YAML::Node node; - - loot::PluginMetadata pm("Blank.esp"); - node = pm; - EXPECT_EQ("Blank.esp", node["name"].as()); - EXPECT_FALSE(node["enabled"]); - EXPECT_FALSE(node["priority"]); - EXPECT_FALSE(node["after"]); - EXPECT_FALSE(node["req"]); - EXPECT_FALSE(node["inc"]); - EXPECT_FALSE(node["msg"]); - EXPECT_FALSE(node["tag"]); - EXPECT_FALSE(node["dirty"]); - EXPECT_FALSE(node["url"]); - - pm.SetPriorityExplicit(true); - node = pm; - EXPECT_EQ(0, node["priority"].as()); - - pm.Enabled(false); - node = pm; - EXPECT_FALSE(node["enabled"].as()); - - pm.LoadAfter({loot::File("Blank.esm")}); - node = pm; - EXPECT_EQ(pm.LoadAfter(), node["after"].as>()); - - pm.Reqs({loot::File("Blank.esm")}); - node = pm; - EXPECT_EQ(pm.Reqs(), node["req"].as>()); - - pm.Incs({loot::File("Blank.esm")}); - node = pm; - EXPECT_EQ(pm.Incs(), node["inc"].as>()); - - pm.Messages({loot::Message(loot::Message::say, "content")}); - node = pm; - EXPECT_EQ(pm.Messages(), node["msg"].as>()); - - pm.Tags({loot::Tag("Relev")}); - node = pm; - EXPECT_EQ(pm.Tags(), node["tag"].as>()); - - pm.DirtyInfo({loot::PluginDirtyInfo(5, 0, 1, 2, "utility")}); - node = pm; - EXPECT_EQ(pm.DirtyInfo(), node["dirty"].as>()); - - pm.Locations({loot::Location("http://www.example.com")}); - node = pm; - EXPECT_EQ(pm.Locations(), node["url"].as>()); -} - -TEST_F(PluginMetadata, YamlDecode) { - YAML::Node node; - loot::PluginMetadata pm; - - node = YAML::Load("name: Blank.esp"); - pm = node.as(); - EXPECT_EQ("Blank.esp", pm.Name()); - EXPECT_EQ(0, pm.Priority()); - EXPECT_FALSE(pm.IsPriorityExplicit()); - EXPECT_FALSE(pm.IsPriorityGlobal()); - - node = YAML::Load("name: 'Blank.esp'\n" - "priority: 5\n" - "enabled: false\n" - "after:\n" - " - 'Blank.esm'\n" - "req:\n" - " - 'Blank.esm'\n" - "inc:\n" - " - 'Blank.esm'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - "tag:\n" - " - Relev\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2\n" - "url:\n" - " - 'http://www.example.com'"); - pm = node.as(); - EXPECT_EQ("Blank.esp", pm.Name()); - EXPECT_EQ(5, pm.Priority()); - EXPECT_TRUE(pm.IsPriorityExplicit()); - EXPECT_FALSE(pm.IsPriorityGlobal()); - EXPECT_FALSE(pm.Enabled()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm") - }), pm.LoadAfter()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm") - }), pm.Reqs()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm") - }), pm.Incs()); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "content") - }), pm.Messages()); - EXPECT_EQ(std::set({ - loot::Tag("Relev") - }), pm.Tags()); - EXPECT_EQ(std::set({ - loot::PluginDirtyInfo(5, 0, 1, 2, "utility") - }), pm.DirtyInfo()); - EXPECT_EQ(std::set({ - loot::Location("http://www.example.com") - }), pm.Locations()); - - // Don't allow dirty metadata in regex entries. - node = YAML::Load("name: 'Blank\\.esp'\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2"); - EXPECT_THROW(node.as(), YAML::RepresentationException); - - // Don't allow invalid regex. - node = YAML::Load("name: 'RagnvaldBook(Farengar(+Ragnvald)?)?\\.esp'\n" - "dirty:\n" - " - crc: 0x5\n" - " util: 'utility'\n" - " udr: 1\n" - " nav: 2"); - EXPECT_THROW(node.as(), YAML::RepresentationException); - - // Catch condition syntax errors. - node = YAML::Load( - "name: 'Blank.esp'\n" - "after:\n" - " - name: 'Blank.esm'\n" - " condition: 'file(\"Blank.esm\")'\n" - "req:\n" - " - name: 'Blank.esm'\n" - " condition: 'file(\"Blank.missing.esm\")'\n" - "inc:\n" - " - name: 'Blank.esm'\n" - " condition: 'file(\"Blank.esm\")'\n" - "msg:\n" - " - type: say\n" - " content: 'content'\n" - " condition: 'condition'\n" - "tag:\n" - " - name: Relev\n" - " condition: 'file(\"Blank.missing.esm\")'" - ); - EXPECT_THROW(node.as(), YAML::RepresentationException); - - node = YAML::Load("scalar"); - EXPECT_THROW(node.as(), YAML::RepresentationException); - - node = YAML::Load("[0, 1, 2]"); - EXPECT_THROW(node.as(), YAML::RepresentationException); +namespace loot { + namespace test { + class PluginMetadataTest : public SkyrimTest {}; + + TEST_F(PluginMetadataTest, Constructors) { + PluginMetadata pm; + EXPECT_TRUE(pm.Enabled()); + EXPECT_FALSE(pm.IsPriorityExplicit()); + EXPECT_FALSE(pm.IsPriorityGlobal()); + EXPECT_EQ(0, pm.Priority()); + + pm = PluginMetadata("Blank.esm"); + EXPECT_EQ("Blank.esm", pm.Name()); + EXPECT_TRUE(pm.Enabled()); + EXPECT_FALSE(pm.IsPriorityExplicit()); + EXPECT_FALSE(pm.IsPriorityGlobal()); + EXPECT_EQ(0, pm.Priority()); + } + + TEST_F(PluginMetadataTest, EqualityOperator) { + PluginMetadata pm1, pm2; + EXPECT_TRUE(pm1 == pm2); + + pm1 = PluginMetadata("Blank.esm"); + pm2 = PluginMetadata("blank.esm"); + EXPECT_TRUE(pm1 == pm2); + + pm1 = PluginMetadata("Blank.esm"); + pm2 = PluginMetadata("Blan.\\.esm"); + EXPECT_TRUE(pm1 == pm2); + EXPECT_TRUE(pm2 == pm1); + + pm1 = PluginMetadata("Blan.esm"); + pm2 = PluginMetadata("Blan.\\.esm"); + EXPECT_FALSE(pm1 == pm2); + EXPECT_FALSE(pm2 == pm1); + + pm1 = PluginMetadata("Blan.\\.esm"); + pm2 = PluginMetadata("Blan.\\.esm"); + EXPECT_TRUE(pm1 == pm2); + EXPECT_TRUE(pm2 == pm1); + + pm1 = PluginMetadata("Blan(k|p).esm"); + pm2 = PluginMetadata("Blan.\\.esm"); + EXPECT_FALSE(pm1 == pm2); + EXPECT_FALSE(pm2 == pm1); + } + + TEST_F(PluginMetadataTest, MergeMetadata) { + PluginMetadata pm1(YAML::Load( + "name: 'Blank.esp'\n" + "enabled: false\n" + "priority: 5\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'" + ).as()); + + PluginMetadata pm2(YAML::Load( + "name: 'Blank - Different.esp'\n" + "after:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "req:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "inc:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + " - -Relev\n" + " - Delev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + " - crc: 0x9\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'\n" + " - 'http://www.example2.com'" + ).as()); + + EXPECT_NO_THROW(pm1.MergeMetadata(pm2)); + EXPECT_EQ("Blank.esp", pm1.Name()); + EXPECT_TRUE(pm1.Enabled()); + EXPECT_EQ(5, pm1.Priority()); + EXPECT_TRUE(pm1.IsPriorityExplicit()); + EXPECT_FALSE(pm1.IsPriorityGlobal()); + EXPECT_EQ(std::set({ + File("Blank.esm"), + File("Blank.esp"), + }), pm1.LoadAfter()); + EXPECT_EQ(std::set({ + File("Blank.esm"), + File("Blank.esp"), + }), pm1.Reqs()); + EXPECT_EQ(std::set({ + File("Blank.esm"), + File("Blank.esp"), + }), pm1.Incs()); + EXPECT_EQ(std::list({ + Message(Message::say, "content"), + Message(Message::say, "content"), + }), pm1.Messages()); + EXPECT_EQ(std::set({ + Tag("Relev"), + Tag("Relev", false), + Tag("Delev"), + }), pm1.Tags()); + EXPECT_EQ(std::set({ + PluginDirtyInfo(5, 0, 1, 2, "utility"), + PluginDirtyInfo(9, 0, 1, 2, "utility"), + }), pm1.DirtyInfo()); + EXPECT_EQ(std::set({ + Location("http://www.example.com"), + Location("http://www.example2.com"), + }), pm1.Locations()); + + pm2.SetPriorityExplicit(true); + EXPECT_NO_THROW(pm1.MergeMetadata(pm2)); + EXPECT_EQ(0, pm1.Priority()); + EXPECT_TRUE(pm1.IsPriorityExplicit()); + EXPECT_FALSE(pm1.IsPriorityGlobal()); + } + + TEST_F(PluginMetadataTest, DiffMetadata) { + PluginMetadata pm1(YAML::Load( + "name: 'Blank.esp'\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + " - 'Blank - Different.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + " - 'Blank - Different.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + " - 'Blank - Different.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + " - type: say\n" + " content: 'content2'\n" + "tag:\n" + " - Relev\n" + " - NoMerge\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + " - crc: 0x1\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'\n" + " - 'http://www.other-example.com'" + ).as()); + + PluginMetadata pm2(YAML::Load( + "name: 'Blank - Different.esp'\n" + "after:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "req:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "inc:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + " - type: say\n" + " content: 'content3'\n" + "tag:\n" + " - Relev\n" + " - -Relev\n" + " - Delev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + " - crc: 0x9\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'\n" + " - 'http://www.example2.com'" + ).as()); + + PluginMetadata result = pm1.DiffMetadata(pm2); + EXPECT_EQ("Blank.esp", result.Name()); + EXPECT_FALSE(result.Enabled()); + EXPECT_EQ(0, result.Priority()); + EXPECT_FALSE(result.IsPriorityExplicit()); + EXPECT_FALSE(result.IsPriorityGlobal()); + EXPECT_EQ(std::set({ + File("Blank.esp"), + File("Blank - Different.esm"), + }), result.LoadAfter()); + EXPECT_EQ(std::set({ + File("Blank.esp"), + File("Blank - Different.esm"), + }), result.Reqs()); + EXPECT_EQ(std::set({ + File("Blank.esp"), + File("Blank - Different.esm"), + }), result.Incs()); + EXPECT_EQ(std::list({ + Message(Message::say, "content2"), + Message(Message::say, "content3"), + }), result.Messages()); + EXPECT_EQ(std::set({ + Tag("Relev", false), + Tag("Delev"), + Tag("NoMerge"), + }), result.Tags()); + EXPECT_EQ(std::set({ + PluginDirtyInfo(9, 0, 1, 2, "utility"), + PluginDirtyInfo(1, 0, 1, 2, "utility"), + }), result.DirtyInfo()); + EXPECT_EQ(std::set({ + Location("http://www.example2.com"), + Location("http://www.other-example.com"), + }), result.Locations()); + + pm1.Priority(5); + result = pm1.DiffMetadata(pm2); + + EXPECT_EQ(5, result.Priority()); + EXPECT_TRUE(result.IsPriorityExplicit()); + EXPECT_FALSE(result.IsPriorityGlobal()); + } + + TEST_F(PluginMetadataTest, NewMetadata) { + PluginMetadata pm1(YAML::Load( + "name: 'Blank.esp'\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + " - 'Blank - Different.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + " - 'Blank - Different.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + " - 'Blank - Different.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + " - type: say\n" + " content: 'content2'\n" + "tag:\n" + " - Relev\n" + " - NoMerge\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + " - crc: 0x1\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'\n" + " - 'http://www.other-example.com'" + ).as()); + + PluginMetadata pm2(YAML::Load( + "name: 'Blank - Different.esp'\n" + "after:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "req:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "inc:\n" + " - 'Blank.esm'\n" + " - 'Blank.esp'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + " - type: say\n" + " content: 'content3'\n" + "tag:\n" + " - Relev\n" + " - -Relev\n" + " - Delev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + " - crc: 0x9\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'\n" + " - 'http://www.example2.com'" + ).as()); + + PluginMetadata result = pm2.NewMetadata(pm1); + EXPECT_EQ("Blank - Different.esp", result.Name()); + EXPECT_TRUE(result.Enabled()); + EXPECT_EQ(0, result.Priority()); + EXPECT_FALSE(result.IsPriorityExplicit()); + EXPECT_FALSE(result.IsPriorityGlobal()); + EXPECT_EQ(std::set({ + File("Blank.esp") + }), result.LoadAfter()); + EXPECT_EQ(std::set({ + File("Blank.esp") + }), result.Reqs()); + EXPECT_EQ(std::set({ + File("Blank.esp") + }), result.Incs()); + EXPECT_EQ(std::list({ + Message(Message::say, "content3"), + }), result.Messages()); + EXPECT_EQ(std::set({ + Tag("Relev", false), + Tag("Delev"), + }), result.Tags()); + EXPECT_EQ(std::set({ + PluginDirtyInfo(9, 0, 1, 2, "utility") + }), result.DirtyInfo()); + EXPECT_EQ(std::set({ + Location("http://www.example2.com") + }), result.Locations()); + + pm1.Priority(5); + result = pm2.NewMetadata(pm1); + + EXPECT_EQ(0, result.Priority()); + EXPECT_FALSE(result.IsPriorityExplicit()); + EXPECT_FALSE(result.IsPriorityGlobal()); + } + + TEST_F(PluginMetadataTest, Enabled) { + PluginMetadata pm; + ASSERT_TRUE(pm.Enabled()); + pm.Enabled(false); + EXPECT_FALSE(pm.Enabled()); + } + + TEST_F(PluginMetadataTest, SetPriorityExplicit) { + PluginMetadata pm; + ASSERT_FALSE(pm.IsPriorityExplicit()); + pm.SetPriorityExplicit(true); + EXPECT_TRUE(pm.IsPriorityExplicit()); + } + + TEST_F(PluginMetadataTest, Priority) { + PluginMetadata pm; + ASSERT_NE(10, pm.Priority()); + pm.Priority(10); + EXPECT_EQ(10, pm.Priority()); + } + + TEST_F(PluginMetadataTest, settingPriorityWithAbsoluteValueGreaterOrEqualToGlobalPriorityDivisorShouldThrow) { + PluginMetadata pm; + EXPECT_ANY_THROW(pm.Priority(yamlGlobalPriorityDivisor)); + EXPECT_ANY_THROW(pm.Priority(yamlGlobalPriorityDivisor + 1)); + EXPECT_ANY_THROW(pm.Priority(-yamlGlobalPriorityDivisor)); + EXPECT_ANY_THROW(pm.Priority(-yamlGlobalPriorityDivisor - 1)); + } + + TEST_F(PluginMetadataTest, settingPriorityAsGlobalShouldSucceed) { + PluginMetadata pm; + ASSERT_FALSE(pm.IsPriorityGlobal()); + pm.SetPriorityGlobal(true); + EXPECT_TRUE(pm.IsPriorityGlobal()); + } + + TEST_F(PluginMetadataTest, settingPriorityAsNotGlobalShouldSucceed) { + PluginMetadata pm; + pm.SetPriorityGlobal(true); + ASSERT_TRUE(pm.IsPriorityGlobal()); + pm.SetPriorityGlobal(false); + EXPECT_FALSE(pm.IsPriorityGlobal()); + } + + TEST_F(PluginMetadataTest, gettingYamlPriorityValueForAGlobalPriorityShouldReturnValueWithGlobalFlagSet) { + PluginMetadata pm; + pm.Priority(10); + pm.SetPriorityGlobal(true); + EXPECT_EQ(1000010, pm.GetYamlPriorityValue()); + + pm.Priority(-20); + EXPECT_EQ(-1000020, pm.GetYamlPriorityValue()); + } + + TEST_F(PluginMetadataTest, gettingYamlPriorityValueForANonGlobalPriorityShouldReturnValueWithGlobalFlagNotSet) { + PluginMetadata pm; + pm.Priority(10); + EXPECT_EQ(10, pm.GetYamlPriorityValue()); + + pm.Priority(-20); + EXPECT_EQ(-20, pm.GetYamlPriorityValue()); + } + + TEST_F(PluginMetadataTest, LoadAfter) { + PluginMetadata pm; + ASSERT_TRUE(pm.LoadAfter().empty()); + pm.LoadAfter({ + File("Blank.esm") + }); + EXPECT_EQ(std::set({ + File("Blank.esm") + }), pm.LoadAfter()); + } + + TEST_F(PluginMetadataTest, Reqs) { + PluginMetadata pm; + ASSERT_TRUE(pm.Reqs().empty()); + pm.Reqs({ + File("Blank.esm") + }); + EXPECT_EQ(std::set({ + File("Blank.esm") + }), pm.Reqs()); + } + + TEST_F(PluginMetadataTest, Incs) { + PluginMetadata pm; + ASSERT_TRUE(pm.Incs().empty()); + pm.Incs({ + File("Blank.esm") + }); + EXPECT_EQ(std::set({ + File("Blank.esm") + }), pm.Incs()); + } + + TEST_F(PluginMetadataTest, Messages) { + PluginMetadata pm; + ASSERT_TRUE(pm.Messages().empty()); + pm.Messages({ + Message(Message::say, "content") + }); + EXPECT_EQ(std::list({ + Message(Message::say, "content") + }), pm.Messages()); + } + + TEST_F(PluginMetadataTest, Tags) { + PluginMetadata pm; + ASSERT_TRUE(pm.Tags().empty()); + pm.Tags({ + Tag("Relev") + }); + EXPECT_EQ(std::set({ + Tag("Relev") + }), pm.Tags()); + } + + TEST_F(PluginMetadataTest, DirtyInfo) { + PluginMetadata pm; + ASSERT_TRUE(pm.DirtyInfo().empty()); + pm.DirtyInfo({ + PluginDirtyInfo(5, 0, 1, 2, "utility") + }); + EXPECT_EQ(std::set({ + PluginDirtyInfo(5, 0, 1, 2, "utility") + }), pm.DirtyInfo()); + } + + TEST_F(PluginMetadataTest, Locations) { + PluginMetadata pm; + ASSERT_TRUE(pm.Locations().empty()); + pm.Locations({ + Location("http://www.example.com") + }); + EXPECT_EQ(std::set({ + Location("http://www.example.com") + }), pm.Locations()); + } + + TEST_F(PluginMetadataTest, EvalAllConditions) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + PluginMetadata pm(YAML::Load( + "name: 'Blank.esp'\n" + "after:\n" + " - name: 'Blank.esm'\n" + " condition: 'file(\"Blank.esm\")'\n" + "req:\n" + " - name: 'Blank.esm'\n" + " condition: 'file(\"Blank.missing.esm\")'\n" + "inc:\n" + " - name: 'Blank.esm'\n" + " condition: 'file(\"Blank.esm\")'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - name: Relev\n" + " condition: 'file(\"Blank.missing.esm\")'\n" + "dirty:\n" + " - crc: 0x24F0E2A1\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + " - crc: 0xDEADBEEF\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2" + ).as()); + + pm.Messages({Message(Message::say, "content")}); + EXPECT_NO_THROW(pm.EvalAllConditions(game, Language::english)); + EXPECT_EQ(std::set({ + File("Blank.esm", "", "file(\"Blank.esm\")") + }), pm.LoadAfter()); + EXPECT_TRUE(pm.Reqs().empty()); + EXPECT_EQ(std::set({ + File("Blank.esm", "", "file(\"Blank.esm\")") + }), pm.Incs()); + EXPECT_EQ(std::list({ + Message(Message::say, "content") + }), pm.Messages()); + EXPECT_TRUE(pm.Tags().empty()); + EXPECT_EQ(std::set({ + PluginDirtyInfo(0x24F0E2A1, 0, 1, 2, "utility") + }), pm.DirtyInfo()); + } + + TEST_F(PluginMetadataTest, HasNameOnly) { + PluginMetadata pm; + EXPECT_TRUE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + EXPECT_TRUE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Enabled(false); + EXPECT_TRUE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.SetPriorityExplicit(true); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.LoadAfter({File("Blank.esm")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Reqs({File("Blank.esm")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Incs({File("Blank.esm")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Messages({Message(Message::say, "content")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Tags({Tag("Relev")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.DirtyInfo({PluginDirtyInfo(5, 0, 1, 2, "utility")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Locations({Location("http://www.example.com")}); + EXPECT_FALSE(pm.HasNameOnly()); + } + + TEST_F(PluginMetadataTest, IsRegexPlugin) { + PluginMetadata pm; + EXPECT_FALSE(pm.IsRegexPlugin()); + + pm = PluginMetadata("Blank.esm"); + EXPECT_FALSE(pm.IsRegexPlugin()); + + pm = PluginMetadata("Blank[[:blank:]]- Different.esm"); + EXPECT_TRUE(pm.IsRegexPlugin()); + + pm = PluginMetadata("Blank\\.esm"); + EXPECT_TRUE(pm.IsRegexPlugin()); + + pm = PluginMetadata("Blank - (Different )*Master Dependent.esm"); + EXPECT_TRUE(pm.IsRegexPlugin()); + + pm = PluginMetadata("Blank - (Different )?Master Dependent.esm"); + EXPECT_TRUE(pm.IsRegexPlugin()); + + pm = PluginMetadata("Blank.es(p|m)"); + EXPECT_TRUE(pm.IsRegexPlugin()); + } + + TEST_F(PluginMetadataTest, YamlEmitter) { + PluginMetadata pm("Blank.esp"); + YAML::Emitter e1; + e1 << pm; + EXPECT_STREQ("", e1.c_str()); + + pm.SetPriorityExplicit(true); + YAML::Emitter e2; + e2 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0", e2.c_str()); + + pm.Enabled(false); + YAML::Emitter e3; + e3 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false", e3.c_str()); + + pm.LoadAfter({File("Blank.esm")}); + YAML::Emitter e4; + e4 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'", e4.c_str()); + + pm.Reqs({File("Blank.esm")}); + YAML::Emitter e5; + e5 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'", e5.c_str()); + + pm.Incs({File("Blank.esm")}); + YAML::Emitter e6; + e6 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'", e6.c_str()); + + pm.Messages({Message(Message::say, "content")}); + YAML::Emitter e7; + e7 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'", e7.c_str()); + + pm.Tags({Tag("Relev")}); + YAML::Emitter e8; + e8 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev", e8.c_str()); + + pm.DirtyInfo({PluginDirtyInfo(5, 0, 1, 2, "utility")}); + YAML::Emitter e9; + e9 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2", e9.c_str()); + + pm.Locations({Location("http://www.example.com")}); + YAML::Emitter e10; + e10 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'", e10.c_str()); + } + + TEST_F(PluginMetadataTest, YamlEncode) { + YAML::Node node; + + PluginMetadata pm("Blank.esp"); + node = pm; + EXPECT_EQ("Blank.esp", node["name"].as()); + EXPECT_FALSE(node["enabled"]); + EXPECT_FALSE(node["priority"]); + EXPECT_FALSE(node["after"]); + EXPECT_FALSE(node["req"]); + EXPECT_FALSE(node["inc"]); + EXPECT_FALSE(node["msg"]); + EXPECT_FALSE(node["tag"]); + EXPECT_FALSE(node["dirty"]); + EXPECT_FALSE(node["url"]); + + pm.SetPriorityExplicit(true); + node = pm; + EXPECT_EQ(0, node["priority"].as()); + + pm.Enabled(false); + node = pm; + EXPECT_FALSE(node["enabled"].as()); + + pm.LoadAfter({File("Blank.esm")}); + node = pm; + EXPECT_EQ(pm.LoadAfter(), node["after"].as>()); + + pm.Reqs({File("Blank.esm")}); + node = pm; + EXPECT_EQ(pm.Reqs(), node["req"].as>()); + + pm.Incs({File("Blank.esm")}); + node = pm; + EXPECT_EQ(pm.Incs(), node["inc"].as>()); + + pm.Messages({Message(Message::say, "content")}); + node = pm; + EXPECT_EQ(pm.Messages(), node["msg"].as>()); + + pm.Tags({Tag("Relev")}); + node = pm; + EXPECT_EQ(pm.Tags(), node["tag"].as>()); + + pm.DirtyInfo({PluginDirtyInfo(5, 0, 1, 2, "utility")}); + node = pm; + EXPECT_EQ(pm.DirtyInfo(), node["dirty"].as>()); + + pm.Locations({Location("http://www.example.com")}); + node = pm; + EXPECT_EQ(pm.Locations(), node["url"].as>()); + } + + TEST_F(PluginMetadataTest, YamlDecode) { + YAML::Node node; + PluginMetadata pm; + + node = YAML::Load("name: Blank.esp"); + pm = node.as(); + EXPECT_EQ("Blank.esp", pm.Name()); + EXPECT_EQ(0, pm.Priority()); + EXPECT_FALSE(pm.IsPriorityExplicit()); + EXPECT_FALSE(pm.IsPriorityGlobal()); + + node = YAML::Load("name: 'Blank.esp'\n" + "priority: 5\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'"); + pm = node.as(); + EXPECT_EQ("Blank.esp", pm.Name()); + EXPECT_EQ(5, pm.Priority()); + EXPECT_TRUE(pm.IsPriorityExplicit()); + EXPECT_FALSE(pm.IsPriorityGlobal()); + EXPECT_FALSE(pm.Enabled()); + EXPECT_EQ(std::set({ + File("Blank.esm") + }), pm.LoadAfter()); + EXPECT_EQ(std::set({ + File("Blank.esm") + }), pm.Reqs()); + EXPECT_EQ(std::set({ + File("Blank.esm") + }), pm.Incs()); + EXPECT_EQ(std::list({ + Message(Message::say, "content") + }), pm.Messages()); + EXPECT_EQ(std::set({ + Tag("Relev") + }), pm.Tags()); + EXPECT_EQ(std::set({ + PluginDirtyInfo(5, 0, 1, 2, "utility") + }), pm.DirtyInfo()); + EXPECT_EQ(std::set({ + Location("http://www.example.com") + }), pm.Locations()); + + // Don't allow dirty metadata in regex entries. + node = YAML::Load("name: 'Blank\\.esp'\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2"); + EXPECT_THROW(node.as(), YAML::RepresentationException); + + // Don't allow invalid regex. + node = YAML::Load("name: 'RagnvaldBook(Farengar(+Ragnvald)?)?\\.esp'\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2"); + EXPECT_THROW(node.as(), YAML::RepresentationException); + + // Catch condition syntax errors. + node = YAML::Load( + "name: 'Blank.esp'\n" + "after:\n" + " - name: 'Blank.esm'\n" + " condition: 'file(\"Blank.esm\")'\n" + "req:\n" + " - name: 'Blank.esm'\n" + " condition: 'file(\"Blank.missing.esm\")'\n" + "inc:\n" + " - name: 'Blank.esm'\n" + " condition: 'file(\"Blank.esm\")'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + " condition: 'condition'\n" + "tag:\n" + " - name: Relev\n" + " condition: 'file(\"Blank.missing.esm\")'" + ); + EXPECT_THROW(node.as(), YAML::RepresentationException); + + node = YAML::Load("scalar"); + EXPECT_THROW(node.as(), YAML::RepresentationException); + + node = YAML::Load("[0, 1, 2]"); + EXPECT_THROW(node.as(), YAML::RepresentationException); + } + } } #endif diff --git a/src/tests/backend/metadata/test_tag.h b/src/tests/backend/metadata/test_tag.h index 2b112997..89f7cfea 100644 --- a/src/tests/backend/metadata/test_tag.h +++ b/src/tests/backend/metadata/test_tag.h @@ -28,153 +28,155 @@ along with LOOT. If not, see #include "backend/metadata/tag.h" #include "tests/fixtures.h" -using loot::Tag; +namespace loot { + namespace test { + TEST(Tag, ConstructorsAndDataAccess) { + Tag tag; + EXPECT_EQ("", tag.Name()); + EXPECT_TRUE(tag.IsAddition()); + EXPECT_EQ("", tag.Condition()); -TEST(Tag, ConstructorsAndDataAccess) { - Tag tag; - EXPECT_EQ("", tag.Name()); - EXPECT_TRUE(tag.IsAddition()); - EXPECT_EQ("", tag.Condition()); + tag = Tag("name"); + EXPECT_EQ("name", tag.Name()); + EXPECT_TRUE(tag.IsAddition()); + EXPECT_EQ("", tag.Condition()); - tag = Tag("name"); - EXPECT_EQ("name", tag.Name()); - EXPECT_TRUE(tag.IsAddition()); - EXPECT_EQ("", tag.Condition()); + tag = Tag("name", false); + EXPECT_EQ("name", tag.Name()); + EXPECT_FALSE(tag.IsAddition()); + EXPECT_EQ("", tag.Condition()); - tag = Tag("name", false); - EXPECT_EQ("name", tag.Name()); - EXPECT_FALSE(tag.IsAddition()); - EXPECT_EQ("", tag.Condition()); + // Not a valid condition, but not evaluating it in this test. + tag = Tag("name", false, "condition"); + EXPECT_EQ("name", tag.Name()); + EXPECT_FALSE(tag.IsAddition()); + EXPECT_EQ("condition", tag.Condition()); + } - // Not a valid condition, but not evaluating it in this test. - tag = Tag("name", false, "condition"); - EXPECT_EQ("name", tag.Name()); - EXPECT_FALSE(tag.IsAddition()); - EXPECT_EQ("condition", tag.Condition()); -} + TEST(Tag, EqualityOperator) { + Tag tag1, tag2; + EXPECT_TRUE(tag1 == tag2); -TEST(Tag, EqualityOperator) { - Tag tag1, tag2; - EXPECT_TRUE(tag1 == tag2); + // Not valid conditions, but not evaluating them in this test. + tag1 = Tag("name", true, "condition1"); + tag2 = Tag("name", true, "condition2"); + EXPECT_TRUE(tag1 == tag2); - // Not valid conditions, but not evaluating them in this test. - tag1 = Tag("name", true, "condition1"); - tag2 = Tag("name", true, "condition2"); - EXPECT_TRUE(tag1 == tag2); + tag1 = Tag("name"); + tag2 = Tag("Name"); + EXPECT_TRUE(tag1 == tag2); - tag1 = Tag("name"); - tag2 = Tag("Name"); - EXPECT_TRUE(tag1 == tag2); + tag1 = Tag("name", true); + tag2 = Tag("name", false); + EXPECT_FALSE(tag1 == tag2); - tag1 = Tag("name", true); - tag2 = Tag("name", false); - EXPECT_FALSE(tag1 == tag2); + tag1 = Tag("name1"); + tag2 = Tag("name2"); + EXPECT_FALSE(tag1 == tag2); + } - tag1 = Tag("name1"); - tag2 = Tag("name2"); - EXPECT_FALSE(tag1 == tag2); -} + TEST(Tag, LessThanOperator) { + Tag tag1, tag2; + EXPECT_FALSE(tag1 < tag2); + EXPECT_FALSE(tag2 < tag1); -TEST(Tag, LessThanOperator) { - Tag tag1, tag2; - EXPECT_FALSE(tag1 < tag2); - EXPECT_FALSE(tag2 < tag1); + tag1 = Tag("name", true, "condition1"); + tag2 = Tag("name", true, "condition2"); + EXPECT_FALSE(tag1 < tag2); + EXPECT_FALSE(tag2 < tag1); - tag1 = Tag("name", true, "condition1"); - tag2 = Tag("name", true, "condition2"); - EXPECT_FALSE(tag1 < tag2); - EXPECT_FALSE(tag2 < tag1); + tag1 = Tag("name"); + tag2 = Tag("Name"); + EXPECT_FALSE(tag1 < tag2); + EXPECT_FALSE(tag2 < tag1); - tag1 = Tag("name"); - tag2 = Tag("Name"); - EXPECT_FALSE(tag1 < tag2); - EXPECT_FALSE(tag2 < tag1); + tag1 = Tag("name1"); + tag2 = Tag("name2"); + EXPECT_TRUE(tag1 < tag2); + EXPECT_FALSE(tag2 < tag1); - tag1 = Tag("name1"); - tag2 = Tag("name2"); - EXPECT_TRUE(tag1 < tag2); - EXPECT_FALSE(tag2 < tag1); + tag1 = Tag("name", true); + tag2 = Tag("name", false); + EXPECT_TRUE(tag1 < tag2); + EXPECT_FALSE(tag2 < tag1); + } - tag1 = Tag("name", true); - tag2 = Tag("name", false); - EXPECT_TRUE(tag1 < tag2); - EXPECT_FALSE(tag2 < tag1); -} + TEST(Tag, YamlEmitter) { + Tag tag("name1"); + YAML::Emitter e1; + e1 << tag; + EXPECT_STREQ("name1", e1.c_str()); -TEST(Tag, YamlEmitter) { - Tag tag("name1"); - YAML::Emitter e1; - e1 << tag; - EXPECT_STREQ("name1", e1.c_str()); + tag = Tag("name1", false); + YAML::Emitter e2; + e2 << tag; + EXPECT_STREQ("-name1", e2.c_str()); - tag = Tag("name1", false); - YAML::Emitter e2; - e2 << tag; - EXPECT_STREQ("-name1", e2.c_str()); + tag = Tag("name1", true, "condition1"); + YAML::Emitter e3; + e3 << tag; + EXPECT_STREQ("name: name1\ncondition: 'condition1'", e3.c_str()); - tag = Tag("name1", true, "condition1"); - YAML::Emitter e3; - e3 << tag; - EXPECT_STREQ("name: name1\ncondition: 'condition1'", e3.c_str()); + tag = Tag("name1", false, "condition1"); + YAML::Emitter e4; + e4 << tag; + EXPECT_STREQ("name: -name1\ncondition: 'condition1'", e4.c_str()); + } - tag = Tag("name1", false, "condition1"); - YAML::Emitter e4; - e4 << tag; - EXPECT_STREQ("name: -name1\ncondition: 'condition1'", e4.c_str()); -} + TEST(Tag, YamlEncode) { + YAML::Node node; -TEST(Tag, YamlEncode) { - YAML::Node node; + Tag tag("name1"); + node = tag; + EXPECT_EQ("name1", node["name"].as()); + EXPECT_FALSE(node["condition"]); - Tag tag("name1"); - node = tag; - EXPECT_EQ("name1", node["name"].as()); - EXPECT_FALSE(node["condition"]); + tag = Tag("name1", false); + node = tag; + EXPECT_EQ("-name1", node["name"].as()); + EXPECT_FALSE(node["condition"]); - tag = Tag("name1", false); - node = tag; - EXPECT_EQ("-name1", node["name"].as()); - EXPECT_FALSE(node["condition"]); + tag = Tag("name1", false, "condition1"); + node = tag; + EXPECT_EQ("-name1", node["name"].as()); + EXPECT_EQ("condition1", node["condition"].as()); + } - tag = Tag("name1", false, "condition1"); - node = tag; - EXPECT_EQ("-name1", node["name"].as()); - EXPECT_EQ("condition1", node["condition"].as()); -} + TEST(Tag, YamlDecode) { + YAML::Node node; + Tag tag; -TEST(Tag, YamlDecode) { - YAML::Node node; - Tag tag; + node = YAML::Load("name1"); + tag = node.as(); + EXPECT_EQ("name1", tag.Name()); + EXPECT_TRUE(tag.IsAddition()); + EXPECT_EQ("", tag.Condition()); - node = YAML::Load("name1"); - tag = node.as(); - EXPECT_EQ("name1", tag.Name()); - EXPECT_TRUE(tag.IsAddition()); - EXPECT_EQ("", tag.Condition()); + node = YAML::Load("-name1"); + tag = node.as(); + EXPECT_EQ("name1", tag.Name()); + EXPECT_FALSE(tag.IsAddition()); + EXPECT_EQ("", tag.Condition()); - node = YAML::Load("-name1"); - tag = node.as(); - EXPECT_EQ("name1", tag.Name()); - EXPECT_FALSE(tag.IsAddition()); - EXPECT_EQ("", tag.Condition()); + node = YAML::Load("{name: -name1}"); + tag = node.as(); + EXPECT_EQ("name1", tag.Name()); + EXPECT_FALSE(tag.IsAddition()); + EXPECT_EQ("", tag.Condition()); - node = YAML::Load("{name: -name1}"); - tag = node.as(); - EXPECT_EQ("name1", tag.Name()); - EXPECT_FALSE(tag.IsAddition()); - EXPECT_EQ("", tag.Condition()); + node = YAML::Load("{name: name1, condition: 'file(\"Foo.esp\")'}"); + tag = node.as(); + EXPECT_EQ("name1", tag.Name()); + EXPECT_TRUE(tag.IsAddition()); + EXPECT_EQ("file(\"Foo.esp\")", tag.Condition()); - node = YAML::Load("{name: name1, condition: 'file(\"Foo.esp\")'}"); - tag = node.as(); - EXPECT_EQ("name1", tag.Name()); - EXPECT_TRUE(tag.IsAddition()); - EXPECT_EQ("file(\"Foo.esp\")", tag.Condition()); + node = YAML::Load("{name: name1, condition: invalid}"); + EXPECT_THROW(node.as(), YAML::RepresentationException); - node = YAML::Load("{name: name1, condition: invalid}"); - EXPECT_THROW(node.as(), YAML::RepresentationException); - - node = YAML::Load("[0, 1, 2]"); - EXPECT_THROW(node.as(), YAML::RepresentationException); + node = YAML::Load("[0, 1, 2]"); + EXPECT_THROW(node.as(), YAML::RepresentationException); + } + } } #endif diff --git a/src/tests/backend/plugin/test_plugin.h b/src/tests/backend/plugin/test_plugin.h index 710565d5..cffefa83 100644 --- a/src/tests/backend/plugin/test_plugin.h +++ b/src/tests/backend/plugin/test_plugin.h @@ -28,227 +28,231 @@ along with LOOT. If not, see #include "backend/plugin/plugin.h" #include "tests/fixtures.h" -class Plugin : public SkyrimTest { -protected: - inline virtual void SetUp() { - SkyrimTest::SetUp(); +namespace loot { + namespace test { + class PluginTest : public SkyrimTest { + protected: + inline virtual void SetUp() { + SkyrimTest::SetUp(); - game = loot::Game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); + game = Game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + } + + Game game; + }; + + TEST_F(PluginTest, ConstructorsAndDataAccess) { + Plugin plugin(game, "Blank.esm", true); + EXPECT_EQ("Blank.esm", plugin.Name()); + EXPECT_TRUE(plugin.getFormIds().empty()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_EQ("v5.0", plugin.getDescription()); + EXPECT_EQ(0, plugin.Crc()); + + plugin = Plugin(game, "Blank.esm", false); + EXPECT_EQ("Blank.esm", plugin.Name()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esm", std::vector(), 0xCF0), + libespm::FormId("Blank.esm", std::vector(), 0xCF1), + libespm::FormId("Blank.esm", std::vector(), 0xCF2), + libespm::FormId("Blank.esm", std::vector(), 0xCF3), + libespm::FormId("Blank.esm", std::vector(), 0xCF4), + libespm::FormId("Blank.esm", std::vector(), 0xCF5), + libespm::FormId("Blank.esm", std::vector(), 0xCF6), + libespm::FormId("Blank.esm", std::vector(), 0xCF7), + libespm::FormId("Blank.esm", std::vector(), 0xCF8), + libespm::FormId("Blank.esm", std::vector(), 0xCF9), + }), plugin.getFormIds()); + EXPECT_TRUE(plugin.getMasters().empty()); + EXPECT_TRUE(plugin.isMasterFile()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_EQ("v5.0", plugin.getDescription()); + EXPECT_EQ(0x187BE342, plugin.Crc()); + + plugin = Plugin(game, "Blank - Master Dependent.esp", false); + EXPECT_EQ("Blank - Master Dependent.esp", plugin.Name()); + EXPECT_FALSE(plugin.IsEmpty()); + EXPECT_FALSE(plugin.isMasterFile()); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esm", std::vector(), 0xCF0), + libespm::FormId("Blank.esm", std::vector(), 0xCF1), + libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCE9), + libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCEA), + }), plugin.getFormIds()); + EXPECT_EQ(std::vector({ + "Blank.esm" + }), plugin.getMasters()); + EXPECT_EQ("", plugin.getDescription()); + EXPECT_EQ(0x832152DC, plugin.Crc()); + } + + TEST_F(PluginTest, LoadsArchive) { + EXPECT_FALSE(Plugin(game, "Blank - Different.esm", true).LoadsArchive()); + EXPECT_FALSE(Plugin(game, "Blank\\.esm", true).LoadsArchive()); + EXPECT_TRUE(Plugin(game, "Blank.esm", true).LoadsArchive()); + } + + TEST_F(PluginTest, IsValid) { + EXPECT_TRUE(Plugin::IsValid("Blank.esm", game)); + EXPECT_FALSE(Plugin::IsValid("NotAPlugin.esm", game)); + EXPECT_FALSE(Plugin::IsValid("EmptyFile.esm", game)); + } + + TEST_F(PluginTest, IsActive) { + Plugin plugin(game, "Blank.esm", true); + EXPECT_TRUE(plugin.IsActive()); + + plugin = Plugin(game, "Blank.esp", true); + EXPECT_FALSE(plugin.IsActive()); + } + + TEST_F(PluginTest, EqualityOperator) { + Plugin plugin1(game, "Blank.esm", true); + Plugin plugin2(game, "blank.esm", true); + EXPECT_TRUE(plugin1 == plugin2); + EXPECT_TRUE(plugin2 == plugin1); + + plugin2 = Plugin(game, "Blank.esp", true); + EXPECT_FALSE(plugin1 == plugin2); + EXPECT_FALSE(plugin2 == plugin1); + + plugin2 = Plugin(game, "Blan.\\.esm", true); + EXPECT_TRUE(plugin1 == plugin2); + EXPECT_TRUE(plugin2 == plugin1); + + plugin1 = Plugin(game, "Blan.esm", true); + EXPECT_FALSE(plugin1 == plugin2); + EXPECT_FALSE(plugin2 == plugin1); + + plugin1 = Plugin(game, "Blan.\\.esm", true); + EXPECT_TRUE(plugin1 == plugin2); + EXPECT_TRUE(plugin2 == plugin1); + + plugin1 = Plugin(game, "Blan(k|p).esm", true); + EXPECT_FALSE(plugin1 == plugin2); + EXPECT_FALSE(plugin2 == plugin1); + } + + TEST_F(PluginTest, InequalityOperator) { + Plugin plugin1(game, "Blank.esm", true); + Plugin plugin2(game, "blank.esm", true); + EXPECT_FALSE(plugin1 != plugin2); + EXPECT_FALSE(plugin2 != plugin1); + + plugin2 = Plugin(game, "Blank.esp", true); + EXPECT_TRUE(plugin1 != plugin2); + EXPECT_TRUE(plugin2 != plugin1); + + plugin2 = Plugin(game, "Blan.\\.esm", true); + EXPECT_FALSE(plugin1 != plugin2); + EXPECT_FALSE(plugin2 != plugin1); + + plugin1 = Plugin(game, "Blan.esm", true); + EXPECT_TRUE(plugin1 != plugin2); + EXPECT_TRUE(plugin2 != plugin1); + + plugin1 = Plugin(game, "Blan.\\.esm", true); + EXPECT_FALSE(plugin1 != plugin2); + EXPECT_FALSE(plugin2 != plugin1); + + plugin1 = Plugin(game, "Blan(k|p).esm", true); + EXPECT_TRUE(plugin1 != plugin2); + EXPECT_TRUE(plugin2 != plugin1); + } + + TEST_F(PluginTest, DoFormIDsOverlap) { + Plugin plugin1(game, "Blank.esm", true); + Plugin plugin2(game, "blank.esm", true); + EXPECT_FALSE(plugin1.DoFormIDsOverlap(plugin2)); + EXPECT_FALSE(plugin2.DoFormIDsOverlap(plugin1)); + + plugin1 = Plugin(game, "Blank.esm", true); + plugin2 = Plugin(game, "Blank - Master Dependent.esm", true); + EXPECT_FALSE(plugin1.DoFormIDsOverlap(plugin2)); + EXPECT_FALSE(plugin2.DoFormIDsOverlap(plugin1)); + + plugin1 = Plugin(game, "Blank.esm", false); + plugin2 = Plugin(game, "Blank.esp", false); + EXPECT_FALSE(plugin1.DoFormIDsOverlap(plugin2)); + EXPECT_FALSE(plugin2.DoFormIDsOverlap(plugin1)); + + plugin1 = Plugin(game, "Blank.esm", false); + plugin2 = Plugin(game, "Blank - Master Dependent.esm", false); + EXPECT_TRUE(plugin1.DoFormIDsOverlap(plugin2)); + EXPECT_TRUE(plugin2.DoFormIDsOverlap(plugin1)); + } + + TEST_F(PluginTest, OverlapFormIDs) { + Plugin plugin1(game, "Blank.esm", true); + Plugin plugin2(game, "blank.esm", true); + EXPECT_TRUE(plugin1.OverlapFormIDs(plugin2).empty()); + EXPECT_TRUE(plugin2.OverlapFormIDs(plugin1).empty()); + + plugin1 = Plugin(game, "Blank.esm", true); + plugin2 = Plugin(game, "Blank - Master Dependent.esm", true); + EXPECT_TRUE(plugin1.OverlapFormIDs(plugin2).empty()); + EXPECT_TRUE(plugin2.OverlapFormIDs(plugin1).empty()); + + plugin1 = Plugin(game, "Blank.esm", false); + plugin2 = Plugin(game, "Blank.esp", false); + EXPECT_TRUE(plugin1.OverlapFormIDs(plugin2).empty()); + EXPECT_TRUE(plugin2.OverlapFormIDs(plugin1).empty()); + + plugin1 = Plugin(game, "Blank.esm", false); + plugin2 = Plugin(game, "Blank - Master Dependent.esm", false); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esm", std::vector(), 0xCF0), + libespm::FormId("Blank.esm", std::vector(), 0xCF1), + libespm::FormId("Blank.esm", std::vector(), 0xCF2), + libespm::FormId("Blank.esm", std::vector(), 0xCF3), + }), plugin1.OverlapFormIDs(plugin2)); + EXPECT_EQ(std::set({ + libespm::FormId("Blank.esm", std::vector(), 0xCF0), + libespm::FormId("Blank.esm", std::vector(), 0xCF1), + libespm::FormId("Blank.esm", std::vector(), 0xCF2), + libespm::FormId("Blank.esm", std::vector(), 0xCF3), + }), plugin2.OverlapFormIDs(plugin1)); + } + + TEST_F(PluginTest, CheckInstallValidity) { + Plugin plugin(game, "Blank.esm", false); + plugin.Reqs({ + File("Blank.missing.esm"), + File("Blank.esp"), + File("Blank - Master Dependent.esm"), + }); + plugin.Incs({ + File("Blank - Different.esm"), + File("Skyrim.esm"), + }); + plugin.DirtyInfo({ + PluginDirtyInfo(0x187BE342, 0, 1, 2, "utility1"), + PluginDirtyInfo(0xDEADBEEF, 0, 5, 10, "utility2"), + }); + EXPECT_TRUE(plugin.CheckInstallValidity(game)); + EXPECT_EQ(std::list({ + Message(Message::error, "This plugin requires \"Blank.missing.esm\" to be installed, but it is missing."), + Message(Message::error, "This plugin is incompatible with \"Skyrim.esm\", but both are present."), + PluginDirtyInfo(0x187BE342, 0, 1, 2, "utility1").AsMessage(), + PluginDirtyInfo(0xDEADBEEF, 0, 5, 10, "utility2").AsMessage(), + }), plugin.Messages()); + + plugin = Plugin(game, "Blank - Different Master Dependent.esp", false); + EXPECT_FALSE(plugin.CheckInstallValidity(game)); + EXPECT_EQ(std::list({ + Message(Message::error, "This plugin requires \"Blank - Different.esm\" to be active, but it is inactive."), + }), plugin.Messages()); + + plugin = Plugin(game, "Blank - Different Master Dependent.esp", false); + plugin.Tags({Tag("Filter")}); + EXPECT_FALSE(plugin.CheckInstallValidity(game)); + EXPECT_TRUE(plugin.Messages().empty()); + } } - - loot::Game game; -}; - -TEST_F(Plugin, ConstructorsAndDataAccess) { - loot::Plugin plugin(game, "Blank.esm", true); - EXPECT_EQ("Blank.esm", plugin.Name()); - EXPECT_TRUE(plugin.getFormIds().empty()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_EQ("v5.0", plugin.getDescription()); - EXPECT_EQ(0, plugin.Crc()); - - plugin = loot::Plugin(game, "Blank.esm", false); - EXPECT_EQ("Blank.esm", plugin.Name()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esm", std::vector(), 0xCF0), - libespm::FormId("Blank.esm", std::vector(), 0xCF1), - libespm::FormId("Blank.esm", std::vector(), 0xCF2), - libespm::FormId("Blank.esm", std::vector(), 0xCF3), - libespm::FormId("Blank.esm", std::vector(), 0xCF4), - libespm::FormId("Blank.esm", std::vector(), 0xCF5), - libespm::FormId("Blank.esm", std::vector(), 0xCF6), - libespm::FormId("Blank.esm", std::vector(), 0xCF7), - libespm::FormId("Blank.esm", std::vector(), 0xCF8), - libespm::FormId("Blank.esm", std::vector(), 0xCF9), - }), plugin.getFormIds()); - EXPECT_TRUE(plugin.getMasters().empty()); - EXPECT_TRUE(plugin.isMasterFile()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_EQ("v5.0", plugin.getDescription()); - EXPECT_EQ(0x187BE342, plugin.Crc()); - - plugin = loot::Plugin(game, "Blank - Master Dependent.esp", false); - EXPECT_EQ("Blank - Master Dependent.esp", plugin.Name()); - EXPECT_FALSE(plugin.IsEmpty()); - EXPECT_FALSE(plugin.isMasterFile()); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esm", std::vector(), 0xCF0), - libespm::FormId("Blank.esm", std::vector(), 0xCF1), - libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCE9), - libespm::FormId("Blank - Master Dependent.esp", std::vector(), 0xCEA), - }), plugin.getFormIds()); - EXPECT_EQ(std::vector({ - "Blank.esm" - }), plugin.getMasters()); - EXPECT_EQ("", plugin.getDescription()); - EXPECT_EQ(0x832152DC, plugin.Crc()); -} - -TEST_F(Plugin, LoadsArchive) { - EXPECT_FALSE(loot::Plugin(game, "Blank - Different.esm", true).LoadsArchive()); - EXPECT_FALSE(loot::Plugin(game, "Blank\\.esm", true).LoadsArchive()); - EXPECT_TRUE(loot::Plugin(game, "Blank.esm", true).LoadsArchive()); -} - -TEST_F(Plugin, IsValid) { - EXPECT_TRUE(loot::Plugin::IsValid("Blank.esm", game)); - EXPECT_FALSE(loot::Plugin::IsValid("NotAPlugin.esm", game)); - EXPECT_FALSE(loot::Plugin::IsValid("EmptyFile.esm", game)); -} - -TEST_F(Plugin, IsActive) { - loot::Plugin plugin(game, "Blank.esm", true); - EXPECT_TRUE(plugin.IsActive()); - - plugin = loot::Plugin(game, "Blank.esp", true); - EXPECT_FALSE(plugin.IsActive()); -} - -TEST_F(Plugin, EqualityOperator) { - loot::Plugin plugin1(game, "Blank.esm", true); - loot::Plugin plugin2(game, "blank.esm", true); - EXPECT_TRUE(plugin1 == plugin2); - EXPECT_TRUE(plugin2 == plugin1); - - plugin2 = loot::Plugin(game, "Blank.esp", true); - EXPECT_FALSE(plugin1 == plugin2); - EXPECT_FALSE(plugin2 == plugin1); - - plugin2 = loot::Plugin(game, "Blan.\\.esm", true); - EXPECT_TRUE(plugin1 == plugin2); - EXPECT_TRUE(plugin2 == plugin1); - - plugin1 = loot::Plugin(game, "Blan.esm", true); - EXPECT_FALSE(plugin1 == plugin2); - EXPECT_FALSE(plugin2 == plugin1); - - plugin1 = loot::Plugin(game, "Blan.\\.esm", true); - EXPECT_TRUE(plugin1 == plugin2); - EXPECT_TRUE(plugin2 == plugin1); - - plugin1 = loot::Plugin(game, "Blan(k|p).esm", true); - EXPECT_FALSE(plugin1 == plugin2); - EXPECT_FALSE(plugin2 == plugin1); -} - -TEST_F(Plugin, InequalityOperator) { - loot::Plugin plugin1(game, "Blank.esm", true); - loot::Plugin plugin2(game, "blank.esm", true); - EXPECT_FALSE(plugin1 != plugin2); - EXPECT_FALSE(plugin2 != plugin1); - - plugin2 = loot::Plugin(game, "Blank.esp", true); - EXPECT_TRUE(plugin1 != plugin2); - EXPECT_TRUE(plugin2 != plugin1); - - plugin2 = loot::Plugin(game, "Blan.\\.esm", true); - EXPECT_FALSE(plugin1 != plugin2); - EXPECT_FALSE(plugin2 != plugin1); - - plugin1 = loot::Plugin(game, "Blan.esm", true); - EXPECT_TRUE(plugin1 != plugin2); - EXPECT_TRUE(plugin2 != plugin1); - - plugin1 = loot::Plugin(game, "Blan.\\.esm", true); - EXPECT_FALSE(plugin1 != plugin2); - EXPECT_FALSE(plugin2 != plugin1); - - plugin1 = loot::Plugin(game, "Blan(k|p).esm", true); - EXPECT_TRUE(plugin1 != plugin2); - EXPECT_TRUE(plugin2 != plugin1); -} - -TEST_F(Plugin, DoFormIDsOverlap) { - loot::Plugin plugin1(game, "Blank.esm", true); - loot::Plugin plugin2(game, "blank.esm", true); - EXPECT_FALSE(plugin1.DoFormIDsOverlap(plugin2)); - EXPECT_FALSE(plugin2.DoFormIDsOverlap(plugin1)); - - plugin1 = loot::Plugin(game, "Blank.esm", true); - plugin2 = loot::Plugin(game, "Blank - Master Dependent.esm", true); - EXPECT_FALSE(plugin1.DoFormIDsOverlap(plugin2)); - EXPECT_FALSE(plugin2.DoFormIDsOverlap(plugin1)); - - plugin1 = loot::Plugin(game, "Blank.esm", false); - plugin2 = loot::Plugin(game, "Blank.esp", false); - EXPECT_FALSE(plugin1.DoFormIDsOverlap(plugin2)); - EXPECT_FALSE(plugin2.DoFormIDsOverlap(plugin1)); - - plugin1 = loot::Plugin(game, "Blank.esm", false); - plugin2 = loot::Plugin(game, "Blank - Master Dependent.esm", false); - EXPECT_TRUE(plugin1.DoFormIDsOverlap(plugin2)); - EXPECT_TRUE(plugin2.DoFormIDsOverlap(plugin1)); -} - -TEST_F(Plugin, OverlapFormIDs) { - loot::Plugin plugin1(game, "Blank.esm", true); - loot::Plugin plugin2(game, "blank.esm", true); - EXPECT_TRUE(plugin1.OverlapFormIDs(plugin2).empty()); - EXPECT_TRUE(plugin2.OverlapFormIDs(plugin1).empty()); - - plugin1 = loot::Plugin(game, "Blank.esm", true); - plugin2 = loot::Plugin(game, "Blank - Master Dependent.esm", true); - EXPECT_TRUE(plugin1.OverlapFormIDs(plugin2).empty()); - EXPECT_TRUE(plugin2.OverlapFormIDs(plugin1).empty()); - - plugin1 = loot::Plugin(game, "Blank.esm", false); - plugin2 = loot::Plugin(game, "Blank.esp", false); - EXPECT_TRUE(plugin1.OverlapFormIDs(plugin2).empty()); - EXPECT_TRUE(plugin2.OverlapFormIDs(plugin1).empty()); - - plugin1 = loot::Plugin(game, "Blank.esm", false); - plugin2 = loot::Plugin(game, "Blank - Master Dependent.esm", false); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esm", std::vector(), 0xCF0), - libespm::FormId("Blank.esm", std::vector(), 0xCF1), - libespm::FormId("Blank.esm", std::vector(), 0xCF2), - libespm::FormId("Blank.esm", std::vector(), 0xCF3), - }), plugin1.OverlapFormIDs(plugin2)); - EXPECT_EQ(std::set({ - libespm::FormId("Blank.esm", std::vector(), 0xCF0), - libespm::FormId("Blank.esm", std::vector(), 0xCF1), - libespm::FormId("Blank.esm", std::vector(), 0xCF2), - libespm::FormId("Blank.esm", std::vector(), 0xCF3), - }), plugin2.OverlapFormIDs(plugin1)); -} - -TEST_F(Plugin, CheckInstallValidity) { - loot::Plugin plugin(game, "Blank.esm", false); - plugin.Reqs({ - loot::File("Blank.missing.esm"), - loot::File("Blank.esp"), - loot::File("Blank - Master Dependent.esm"), - }); - plugin.Incs({ - loot::File("Blank - Different.esm"), - loot::File("Skyrim.esm"), - }); - plugin.DirtyInfo({ - loot::PluginDirtyInfo(0x187BE342, 0, 1, 2, "utility1"), - loot::PluginDirtyInfo(0xDEADBEEF, 0, 5, 10, "utility2"), - }); - EXPECT_TRUE(plugin.CheckInstallValidity(game)); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::error, "This plugin requires \"Blank.missing.esm\" to be installed, but it is missing."), - loot::Message(loot::Message::error, "This plugin is incompatible with \"Skyrim.esm\", but both are present."), - loot::PluginDirtyInfo(0x187BE342, 0, 1, 2, "utility1").AsMessage(), - loot::PluginDirtyInfo(0xDEADBEEF, 0, 5, 10, "utility2").AsMessage(), - }), plugin.Messages()); - - plugin = loot::Plugin(game, "Blank - Different Master Dependent.esp", false); - EXPECT_FALSE(plugin.CheckInstallValidity(game)); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::error, "This plugin requires \"Blank - Different.esm\" to be active, but it is inactive."), - }), plugin.Messages()); - - plugin = loot::Plugin(game, "Blank - Different Master Dependent.esp", false); - plugin.Tags({loot::Tag("Filter")}); - EXPECT_FALSE(plugin.CheckInstallValidity(game)); - EXPECT_TRUE(plugin.Messages().empty()); } #endif diff --git a/src/tests/backend/test_masterlist.h b/src/tests/backend/test_masterlist.h index c1c4fb12..b79b906d 100644 --- a/src/tests/backend/test_masterlist.h +++ b/src/tests/backend/test_masterlist.h @@ -28,125 +28,129 @@ along with LOOT. If not, see #include "backend/masterlist.h" #include "tests/fixtures.h" -class Masterlist : public SkyrimTest {}; +namespace loot { + namespace test { + class MasterlistTest : public SkyrimTest {}; -TEST_F(Masterlist, Update_Game) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - game.SetRepoURL("https://github.com/loot/testing-metadata.git"); - game.SetRepoBranch("master"); - ASSERT_NO_THROW(game.Init(false, localPath)); + TEST_F(MasterlistTest, Update_Game) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + game.SetRepoURL("https://github.com/loot/testing-metadata.git"); + game.SetRepoBranch("master"); + ASSERT_NO_THROW(game.Init(false, localPath)); - // This may fail on Windows if a 'real' LOOT install is also present. - loot::Masterlist masterlist; - EXPECT_TRUE(masterlist.Update(game)); - EXPECT_TRUE(boost::filesystem::exists(game.MasterlistPath())); + // This may fail on Windows if a 'real' LOOT install is also present. + Masterlist masterlist; + EXPECT_TRUE(masterlist.Update(game)); + EXPECT_TRUE(boost::filesystem::exists(game.MasterlistPath())); - EXPECT_FALSE(masterlist.Update(game)); - EXPECT_TRUE(boost::filesystem::exists(game.MasterlistPath())); -} + EXPECT_FALSE(masterlist.Update(game)); + EXPECT_TRUE(boost::filesystem::exists(game.MasterlistPath())); + } -TEST_F(Masterlist, Update_NonGame_InvalidPath) { - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.Update(";//\?", - "https://github.com/loot/testing-metadata.git", - "master")); -} + TEST_F(MasterlistTest, Update_NonGame_InvalidPath) { + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.Update(";//\?", + "https://github.com/loot/testing-metadata.git", + "master")); + } -TEST_F(Masterlist, Update_NonGame_EmptyPath) { - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.Update("", - "https://github.com/loot/testing-metadata.git", - "master")); -} + TEST_F(MasterlistTest, Update_NonGame_EmptyPath) { + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.Update("", + "https://github.com/loot/testing-metadata.git", + "master")); + } -TEST_F(Masterlist, Update_NonGame_InvalidBranch) { - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.Update(masterlistPath, - "https://github.com/loot/testing-metadata.git", - "missing-branch")); -} + TEST_F(MasterlistTest, Update_NonGame_InvalidBranch) { + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.Update(masterlistPath, + "https://github.com/loot/testing-metadata.git", + "missing-branch")); + } -TEST_F(Masterlist, Update_NonGame_EmptyBranch) { - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.Update(masterlistPath, - "https://github.com/loot/testing-metadata.git", - "")); -} + TEST_F(MasterlistTest, Update_NonGame_EmptyBranch) { + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.Update(masterlistPath, + "https://github.com/loot/testing-metadata.git", + "")); + } -TEST_F(Masterlist, Update_NonGame_InvalidUrl) { - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.Update(masterlistPath, - "https://github.com/loot/does-not-exist.git", - "master")); -} + TEST_F(MasterlistTest, Update_NonGame_InvalidUrl) { + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.Update(masterlistPath, + "https://github.com/loot/does-not-exist.git", + "master")); + } -TEST_F(Masterlist, Update_NonGame_EmptyUrl) { - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.Update(masterlistPath, - "", - "master")); -} + TEST_F(MasterlistTest, Update_NonGame_EmptyUrl) { + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.Update(masterlistPath, + "", + "master")); + } -TEST_F(Masterlist, Update_NonGame) { - loot::Masterlist masterlist; - EXPECT_TRUE(masterlist.Update(masterlistPath, - "https://github.com/loot/testing-metadata.git", - "master")); + TEST_F(MasterlistTest, Update_NonGame) { + Masterlist masterlist; + EXPECT_TRUE(masterlist.Update(masterlistPath, + "https://github.com/loot/testing-metadata.git", + "master")); - EXPECT_FALSE(masterlist.Update(masterlistPath, - "https://github.com/loot/testing-metadata.git", - "master")); -} + EXPECT_FALSE(masterlist.Update(masterlistPath, + "https://github.com/loot/testing-metadata.git", + "master")); + } -TEST_F(Masterlist, GetInfo_NoMasterlist) { - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.GetInfo(masterlistPath, false)); -} + TEST_F(MasterlistTest, GetInfo_NoMasterlist) { + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.GetInfo(masterlistPath, false)); + } -TEST_F(Masterlist, GetInfo_NoRepository) { - ASSERT_NO_THROW(boost::filesystem::copy("./testing-metadata/masterlist.yaml", masterlistPath)); + TEST_F(MasterlistTest, GetInfo_NoRepository) { + ASSERT_NO_THROW(boost::filesystem::copy("./testing-metadata/masterlist.yaml", masterlistPath)); - loot::Masterlist masterlist; - EXPECT_ANY_THROW(masterlist.GetInfo(masterlistPath, false)); -} + Masterlist masterlist; + EXPECT_ANY_THROW(masterlist.GetInfo(masterlistPath, false)); + } -TEST_F(Masterlist, GetInfo_LongID) { - loot::Masterlist masterlist; - ASSERT_TRUE(masterlist.Update(masterlistPath, - "https://github.com/loot/testing-metadata.git", - "master")); + TEST_F(MasterlistTest, GetInfo_LongID) { + Masterlist masterlist; + ASSERT_TRUE(masterlist.Update(masterlistPath, + "https://github.com/loot/testing-metadata.git", + "master")); - loot::Masterlist::Info info = masterlist.GetInfo(masterlistPath, false); - EXPECT_EQ(40, info.revision.length()); - EXPECT_EQ(10, info.date.length()); -} + Masterlist::Info info = masterlist.GetInfo(masterlistPath, false); + EXPECT_EQ(40, info.revision.length()); + EXPECT_EQ(10, info.date.length()); + } -TEST_F(Masterlist, GetInfo_ShortID) { - loot::Masterlist masterlist; - ASSERT_TRUE(masterlist.Update(masterlistPath, - "https://github.com/loot/testing-metadata.git", - "master")); + TEST_F(MasterlistTest, GetInfo_ShortID) { + Masterlist masterlist; + ASSERT_TRUE(masterlist.Update(masterlistPath, + "https://github.com/loot/testing-metadata.git", + "master")); - loot::Masterlist::Info info = masterlist.GetInfo(masterlistPath, true); - EXPECT_GE((unsigned)40, info.revision.length()); - EXPECT_LE((unsigned)7, info.revision.length()); - EXPECT_EQ(10, info.date.length()); -} + Masterlist::Info info = masterlist.GetInfo(masterlistPath, true); + EXPECT_GE((unsigned)40, info.revision.length()); + EXPECT_LE((unsigned)7, info.revision.length()); + EXPECT_EQ(10, info.date.length()); + } -TEST_F(Masterlist, GetInfo_Edited) { - loot::Masterlist masterlist; - ASSERT_TRUE(masterlist.Update(masterlistPath, - "https://github.com/loot/testing-metadata.git", - "master")); - boost::filesystem::ofstream out(masterlistPath); - out.close(); + TEST_F(MasterlistTest, GetInfo_Edited) { + Masterlist masterlist; + ASSERT_TRUE(masterlist.Update(masterlistPath, + "https://github.com/loot/testing-metadata.git", + "master")); + boost::filesystem::ofstream out(masterlistPath); + out.close(); - loot::Masterlist::Info info = masterlist.GetInfo(masterlistPath, false); - EXPECT_EQ(49, info.revision.length()); - EXPECT_EQ(" (edited)", info.revision.substr(40)); - EXPECT_EQ(19, info.date.length()); - EXPECT_EQ(" (edited)", info.date.substr(10)); + Masterlist::Info info = masterlist.GetInfo(masterlistPath, false); + EXPECT_EQ(49, info.revision.length()); + EXPECT_EQ(" (edited)", info.revision.substr(40)); + EXPECT_EQ(19, info.date.length()); + EXPECT_EQ(" (edited)", info.date.substr(10)); + } + } } #endif diff --git a/src/tests/backend/test_metadata_list.h b/src/tests/backend/test_metadata_list.h index b4bfa8d7..bcc3475b 100644 --- a/src/tests/backend/test_metadata_list.h +++ b/src/tests/backend/test_metadata_list.h @@ -28,220 +28,224 @@ along with LOOT. If not, see #include "backend/metadata_list.h" #include "tests/fixtures.h" -class MetadataList : public SkyrimTest { -protected: - MetadataList() : - metadataPath("./testing-metadata/masterlist.yaml"), - savedMetadataPath("./testing-metadata/saved.masterlist.yaml"), - invalidMetadataPaths({"./testing-metadata/invalid/non_unique.yaml"}) { - PluginMetadataToString = [](const loot::PluginMetadata& plugin) { - return plugin.Name(); +namespace loot { + namespace test { + class MetadataListTest : public SkyrimTest { + protected: + MetadataListTest() : + metadataPath("./testing-metadata/masterlist.yaml"), + savedMetadataPath("./testing-metadata/saved.masterlist.yaml"), + invalidMetadataPaths({"./testing-metadata/invalid/non_unique.yaml"}) { + PluginMetadataToString = [](const PluginMetadata& plugin) { + return plugin.Name(); + }; + } + + inline virtual void SetUp() { + SkyrimTest::SetUp(); + + ASSERT_TRUE(boost::filesystem::exists(metadataPath)); + ASSERT_FALSE(boost::filesystem::exists(savedMetadataPath)); + + for (const auto& path : invalidMetadataPaths) { + ASSERT_TRUE(boost::filesystem::exists(path)); + } + } + + inline virtual void TearDown() { + SkyrimTest::TearDown(); + + ASSERT_TRUE(boost::filesystem::exists(metadataPath)); + ASSERT_NO_THROW(boost::filesystem::remove(savedMetadataPath)); + + for (const auto& path : invalidMetadataPaths) { + ASSERT_TRUE(boost::filesystem::exists(path)); + } + } + + const boost::filesystem::path metadataPath; + const boost::filesystem::path savedMetadataPath; + const std::vector invalidMetadataPaths; + + std::function PluginMetadataToString; }; - } - inline virtual void SetUp() { - SkyrimTest::SetUp(); + TEST_F(MetadataListTest, Load) { + MetadataList ml; + EXPECT_NO_THROW(ml.Load(metadataPath)); + EXPECT_EQ(std::list({ + Message(Message::say, "A global message."), + }), ml.Messages()); - ASSERT_TRUE(boost::filesystem::exists(metadataPath)); - ASSERT_FALSE(boost::filesystem::exists(savedMetadataPath)); + // Non-regex plugins can be outputted in any order, and regex entries can + // match each other, so convert the list to a set of strings for + // comparison. + std::list result(ml.Plugins()); + std::set names; + std::transform(result.begin(), + result.end(), + std::insert_iterator>(names, names.begin()), + PluginMetadataToString); + EXPECT_EQ(std::set({ + "Blank.esm", + "Blank.esp", + "Blank.+\\.esp", + "Blank.+(Different)?.*\\.esp", + }), names); - for (const auto& path : invalidMetadataPaths) { - ASSERT_TRUE(boost::filesystem::exists(path)); + EXPECT_ANY_THROW(ml.Load("NotAPlugin.esm")); + EXPECT_TRUE(ml.Messages().empty()); + EXPECT_TRUE(ml.Plugins().empty()); + + // Fill the list again. + ASSERT_NO_THROW(ml.Load(metadataPath)); + + EXPECT_ANY_THROW(ml.Load("Blank.missing.esm")); + EXPECT_TRUE(ml.Messages().empty()); + EXPECT_TRUE(ml.Plugins().empty()); + } + + TEST_F(MetadataListTest, Load_Invalid) { + MetadataList ml; + for (const auto& path : invalidMetadataPaths) { + EXPECT_ANY_THROW(ml.Load(path)); + } + } + + TEST_F(MetadataListTest, Save) { + MetadataList ml; + ASSERT_NO_THROW(ml.Load(metadataPath)); + + EXPECT_NO_THROW(ml.Save(savedMetadataPath)); + EXPECT_TRUE(boost::filesystem::exists(savedMetadataPath)); + EXPECT_NO_THROW(ml.Load(savedMetadataPath)); + + EXPECT_EQ(std::list({ + Message(Message::say, "A global message."), + }), ml.Messages()); + + // Non-regex plugins can be outputted in any order, and regex entries can + // match each other, so convert the list to a set of strings for + // comparison. + std::list result(ml.Plugins()); + std::set names; + std::transform(result.begin(), + result.end(), + std::insert_iterator>(names, names.begin()), + PluginMetadataToString); + EXPECT_EQ(std::set({ + "Blank.esm", + "Blank.esp", + "Blank.+\\.esp", + "Blank.+(Different)?.*\\.esp", + }), names); + } + + TEST_F(MetadataListTest, clear) { + MetadataList ml; + ASSERT_NO_THROW(ml.Load(metadataPath)); + ASSERT_FALSE(ml.Messages().empty()); + ASSERT_FALSE(ml.Plugins().empty()); + + ml.clear(); + EXPECT_TRUE(ml.Messages().empty()); + EXPECT_TRUE(ml.Plugins().empty()); + } + + TEST_F(MetadataListTest, FindPlugin) { + MetadataList ml; + ASSERT_NO_THROW(ml.Load(metadataPath)); + + PluginMetadata pm = ml.FindPlugin(PluginMetadata("Blank - Different.esm")); + EXPECT_EQ("Blank - Different.esm", pm.Name()); + EXPECT_TRUE(pm.HasNameOnly()); + + pm = ml.FindPlugin(PluginMetadata("Blank - Different.esp")); + EXPECT_EQ("Blank - Different.esp", pm.Name()); + EXPECT_EQ(std::set({ + File("Blank.esm"), + }), pm.LoadAfter()); + EXPECT_EQ(std::set({ + File("Blank.esp"), + }), pm.Incs()); + } + + TEST_F(MetadataListTest, AddPlugin) { + MetadataList ml; + ASSERT_NO_THROW(ml.Load(metadataPath)); + + PluginMetadata pm = ml.FindPlugin(PluginMetadata("Blank - Different.esm")); + ASSERT_EQ("Blank - Different.esm", pm.Name()); + ASSERT_TRUE(pm.HasNameOnly()); + + pm.Priority(1000); + ml.AddPlugin(pm); + pm = ml.FindPlugin(pm); + EXPECT_EQ("Blank - Different.esm", pm.Name()); + EXPECT_EQ(1000, pm.Priority()); + + pm = PluginMetadata(".+Dependent\\.esp"); + pm.Priority(-10); + ml.AddPlugin(pm); + pm = ml.FindPlugin(PluginMetadata("Blank - Plugin Dependent.esp")); + EXPECT_EQ(-10, pm.Priority()); + } + + TEST_F(MetadataListTest, AddPlugin_NonUnique) { + MetadataList ml; + ASSERT_NO_THROW(ml.Load(metadataPath)); + + PluginMetadata pm = ml.FindPlugin(PluginMetadata("Blank.esm")); + ASSERT_EQ("Blank.esm", pm.Name()); + ASSERT_FALSE(pm.HasNameOnly()); + + ASSERT_ANY_THROW(ml.AddPlugin(PluginMetadata("Blank.esm"))); + } + + TEST_F(MetadataListTest, ErasePlugin) { + MetadataList ml; + ASSERT_NO_THROW(ml.Load(metadataPath)); + + PluginMetadata pm = ml.FindPlugin(PluginMetadata("Blank.esp")); + ASSERT_EQ("Blank.esp", pm.Name()); + ASSERT_FALSE(pm.HasNameOnly()); + + ml.ErasePlugin(pm); + pm = ml.FindPlugin(pm); + ASSERT_EQ("Blank.esp", pm.Name()); + ASSERT_TRUE(pm.HasNameOnly()); + } + + TEST_F(MetadataListTest, EvalAllConditions) { + Game game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + MetadataList ml; + ASSERT_NO_THROW(ml.Load(metadataPath)); + + PluginMetadata pm = ml.FindPlugin(PluginMetadata("Blank.esm")); + ASSERT_EQ(std::list({ + Message(Message::warn, "This is a warning."), + Message(Message::say, "This message should be removed when evaluating conditions."), + }), pm.Messages()); + + pm = ml.FindPlugin(PluginMetadata("Blank.esp")); + ASSERT_EQ("Blank.esp", pm.Name()); + ASSERT_FALSE(pm.HasNameOnly()); + + EXPECT_NO_THROW(ml.EvalAllConditions(game, Language::english)); + + pm = ml.FindPlugin(PluginMetadata("Blank.esm")); + EXPECT_EQ(std::list({ + Message(Message::warn, "This is a warning."), + }), pm.Messages()); + + pm = ml.FindPlugin(PluginMetadata("Blank.esp")); + EXPECT_EQ("Blank.esp", pm.Name()); + EXPECT_TRUE(pm.HasNameOnly()); } } - - inline virtual void TearDown() { - SkyrimTest::TearDown(); - - ASSERT_TRUE(boost::filesystem::exists(metadataPath)); - ASSERT_NO_THROW(boost::filesystem::remove(savedMetadataPath)); - - for (const auto& path : invalidMetadataPaths) { - ASSERT_TRUE(boost::filesystem::exists(path)); - } - } - - const boost::filesystem::path metadataPath; - const boost::filesystem::path savedMetadataPath; - const std::vector invalidMetadataPaths; - - std::function PluginMetadataToString; -}; - -TEST_F(MetadataList, Load) { - loot::MetadataList ml; - EXPECT_NO_THROW(ml.Load(metadataPath)); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "A global message."), - }), ml.Messages()); - - // Non-regex plugins can be outputted in any order, and regex entries can - // match each other, so convert the list to a set of strings for - // comparison. - std::list result(ml.Plugins()); - std::set names; - std::transform(result.begin(), - result.end(), - std::insert_iterator>(names, names.begin()), - PluginMetadataToString); - EXPECT_EQ(std::set({ - "Blank.esm", - "Blank.esp", - "Blank.+\\.esp", - "Blank.+(Different)?.*\\.esp", - }), names); - - EXPECT_ANY_THROW(ml.Load("NotAPlugin.esm")); - EXPECT_TRUE(ml.Messages().empty()); - EXPECT_TRUE(ml.Plugins().empty()); - - // Fill the list again. - ASSERT_NO_THROW(ml.Load(metadataPath)); - - EXPECT_ANY_THROW(ml.Load("Blank.missing.esm")); - EXPECT_TRUE(ml.Messages().empty()); - EXPECT_TRUE(ml.Plugins().empty()); -} - -TEST_F(MetadataList, Load_Invalid) { - loot::MetadataList ml; - for (const auto& path : invalidMetadataPaths) { - EXPECT_ANY_THROW(ml.Load(path)); - } -} - -TEST_F(MetadataList, Save) { - loot::MetadataList ml; - ASSERT_NO_THROW(ml.Load(metadataPath)); - - EXPECT_NO_THROW(ml.Save(savedMetadataPath)); - EXPECT_TRUE(boost::filesystem::exists(savedMetadataPath)); - EXPECT_NO_THROW(ml.Load(savedMetadataPath)); - - EXPECT_EQ(std::list({ - loot::Message(loot::Message::say, "A global message."), - }), ml.Messages()); - - // Non-regex plugins can be outputted in any order, and regex entries can - // match each other, so convert the list to a set of strings for - // comparison. - std::list result(ml.Plugins()); - std::set names; - std::transform(result.begin(), - result.end(), - std::insert_iterator>(names, names.begin()), - PluginMetadataToString); - EXPECT_EQ(std::set({ - "Blank.esm", - "Blank.esp", - "Blank.+\\.esp", - "Blank.+(Different)?.*\\.esp", - }), names); -} - -TEST_F(MetadataList, clear) { - loot::MetadataList ml; - ASSERT_NO_THROW(ml.Load(metadataPath)); - ASSERT_FALSE(ml.Messages().empty()); - ASSERT_FALSE(ml.Plugins().empty()); - - ml.clear(); - EXPECT_TRUE(ml.Messages().empty()); - EXPECT_TRUE(ml.Plugins().empty()); -} - -TEST_F(MetadataList, FindPlugin) { - loot::MetadataList ml; - ASSERT_NO_THROW(ml.Load(metadataPath)); - - loot::PluginMetadata pm = ml.FindPlugin(loot::PluginMetadata("Blank - Different.esm")); - EXPECT_EQ("Blank - Different.esm", pm.Name()); - EXPECT_TRUE(pm.HasNameOnly()); - - pm = ml.FindPlugin(loot::PluginMetadata("Blank - Different.esp")); - EXPECT_EQ("Blank - Different.esp", pm.Name()); - EXPECT_EQ(std::set({ - loot::File("Blank.esm"), - }), pm.LoadAfter()); - EXPECT_EQ(std::set({ - loot::File("Blank.esp"), - }), pm.Incs()); -} - -TEST_F(MetadataList, AddPlugin) { - loot::MetadataList ml; - ASSERT_NO_THROW(ml.Load(metadataPath)); - - loot::PluginMetadata pm = ml.FindPlugin(loot::PluginMetadata("Blank - Different.esm")); - ASSERT_EQ("Blank - Different.esm", pm.Name()); - ASSERT_TRUE(pm.HasNameOnly()); - - pm.Priority(1000); - ml.AddPlugin(pm); - pm = ml.FindPlugin(pm); - EXPECT_EQ("Blank - Different.esm", pm.Name()); - EXPECT_EQ(1000, pm.Priority()); - - pm = loot::PluginMetadata(".+Dependent\\.esp"); - pm.Priority(-10); - ml.AddPlugin(pm); - pm = ml.FindPlugin(loot::PluginMetadata("Blank - Plugin Dependent.esp")); - EXPECT_EQ(-10, pm.Priority()); -} - -TEST_F(MetadataList, AddPlugin_NonUnique) { - loot::MetadataList ml; - ASSERT_NO_THROW(ml.Load(metadataPath)); - - loot::PluginMetadata pm = ml.FindPlugin(loot::PluginMetadata("Blank.esm")); - ASSERT_EQ("Blank.esm", pm.Name()); - ASSERT_FALSE(pm.HasNameOnly()); - - ASSERT_ANY_THROW(ml.AddPlugin(loot::PluginMetadata("Blank.esm"))); -} - -TEST_F(MetadataList, ErasePlugin) { - loot::MetadataList ml; - ASSERT_NO_THROW(ml.Load(metadataPath)); - - loot::PluginMetadata pm = ml.FindPlugin(loot::PluginMetadata("Blank.esp")); - ASSERT_EQ("Blank.esp", pm.Name()); - ASSERT_FALSE(pm.HasNameOnly()); - - ml.ErasePlugin(pm); - pm = ml.FindPlugin(pm); - ASSERT_EQ("Blank.esp", pm.Name()); - ASSERT_TRUE(pm.HasNameOnly()); -} - -TEST_F(MetadataList, EvalAllConditions) { - loot::Game game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); - - loot::MetadataList ml; - ASSERT_NO_THROW(ml.Load(metadataPath)); - - loot::PluginMetadata pm = ml.FindPlugin(loot::PluginMetadata("Blank.esm")); - ASSERT_EQ(std::list({ - loot::Message(loot::Message::warn, "This is a warning."), - loot::Message(loot::Message::say, "This message should be removed when evaluating conditions."), - }), pm.Messages()); - - pm = ml.FindPlugin(loot::PluginMetadata("Blank.esp")); - ASSERT_EQ("Blank.esp", pm.Name()); - ASSERT_FALSE(pm.HasNameOnly()); - - EXPECT_NO_THROW(ml.EvalAllConditions(game, loot::Language::english)); - - pm = ml.FindPlugin(loot::PluginMetadata("Blank.esm")); - EXPECT_EQ(std::list({ - loot::Message(loot::Message::warn, "This is a warning."), - }), pm.Messages()); - - pm = ml.FindPlugin(loot::PluginMetadata("Blank.esp")); - EXPECT_EQ("Blank.esp", pm.Name()); - EXPECT_TRUE(pm.HasNameOnly()); } #endif diff --git a/src/tests/backend/test_plugin_sorter.h b/src/tests/backend/test_plugin_sorter.h index 06bd3be2..9f9aa847 100644 --- a/src/tests/backend/test_plugin_sorter.h +++ b/src/tests/backend/test_plugin_sorter.h @@ -28,241 +28,245 @@ along with LOOT. If not, see #include "backend/plugin_sorter.h" #include "tests/fixtures.h" -class PluginSorter : public SkyrimTest { -protected: - inline virtual void SetUp() { - SkyrimTest::SetUp(); +namespace loot { + namespace test { + class PluginSorterTest : public SkyrimTest { + protected: + inline virtual void SetUp() { + SkyrimTest::SetUp(); - game = loot::Game(loot::Game::tes5); - game.SetGamePath(dataPath.parent_path()); - ASSERT_NO_THROW(game.Init(false, localPath)); + game = Game(Game::tes5); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + } + + inline std::list GetExpectedSortedOrder() const { + return std::list({ + "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", + }); + } + + inline static std::list GetActualSortedOrder(const std::list& sortedPlugins) { + std::list output; + std::transform(begin(sortedPlugins), + end(sortedPlugins), + std::back_inserter(output), + [](const Plugin& plugin) { + return plugin.Name(); + }); + return output; + } + + Game game; + std::function callback; + }; + + TEST_F(PluginSorterTest, Sort_NoPlugins) { + PluginSorter ps; + std::list sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(sorted.empty()); + } + + TEST_F(PluginSorterTest, Sort) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + + PluginSorter ps; + std::list expectedSortedOrder = GetExpectedSortedOrder(); + + std::list sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); + + // Check stability. + sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); + } + + TEST_F(PluginSorterTest, sortingShouldClearExistingGameMessages) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + game.AppendMessage(Message(Message::say, "1")); + ASSERT_FALSE(game.GetMessages().empty()); + + PluginSorter ps; + std::list sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(game.GetMessages().empty()); + } + + TEST_F(PluginSorterTest, failedSortShouldNotClearExistingGameMessages) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + PluginMetadata plugin("Blank.esm"); + plugin.LoadAfter({File("Blank - Master Dependent.esm")}); + game.GetUserlist().AddPlugin(plugin); + game.AppendMessage(Message(Message::say, "1")); + ASSERT_FALSE(game.GetMessages().empty()); + + PluginSorter ps; + EXPECT_ANY_THROW(ps.Sort(game, Language::english)); + EXPECT_FALSE(game.GetMessages().empty()); + } + + TEST_F(PluginSorterTest, Sort_HeadersOnly) { + ASSERT_NO_THROW(game.LoadPlugins(true)); + + PluginSorter ps; + std::list expectedSortedOrder = GetExpectedSortedOrder(); + + std::list sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); + } + + TEST_F(PluginSorterTest, Sort_WithPriority) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + PluginMetadata plugin("Blank - Different Master Dependent.esp"); + plugin.Priority(-100000); + plugin.SetPriorityGlobal(true); + game.GetUserlist().AddPlugin(plugin); + + PluginSorter ps; + std::list expectedSortedOrder({ + "Skyrim.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Master Dependent.esm", + "Blank - Different Master Dependent.esm", + "Blank - Different Master Dependent.esp", + "Blank.esp", + "Blank - Different.esp", + "Blank - Master Dependent.esp", + "Blank - Plugin Dependent.esp", + "Blank - Different Plugin Dependent.esp", + }); + + std::list sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); + } + + TEST_F(PluginSorterTest, sortingWithPrioritiesShouldInheritRecursivelyRegardlessOfEvaluationOrder) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + + // Set Blank.esp's priority. + PluginMetadata plugin("Blank.esp"); + plugin.Priority(2); + game.GetUserlist().AddPlugin(plugin); + + // Load Blank - Master Dependent.esp after Blank.esp so that it + // inherits Blank.esp's priority. + plugin = PluginMetadata("Blank - Master Dependent.esp"); + plugin.LoadAfter({ + File("Blank.esp"), + }); + game.GetUserlist().AddPlugin(plugin); + + // Load Blank - Different.esp after Blank - Master Dependent.esp, so + // that it inherits its inherited priority. + plugin = PluginMetadata("Blank - Different.esp"); + plugin.LoadAfter({ + File("Blank - Master Dependent.esp"), + }); + game.GetUserlist().AddPlugin(plugin); + + // Set Blank - Different Master Dependent.esp to have a higher priority + // than 0 but lower than Blank.esp. Need to also make it a global priority + // because it doesn't otherwise conflict with the other plugins. + plugin = PluginMetadata("Blank - Different Master Dependent.esp"); + plugin.Priority(1); + plugin.SetPriorityGlobal(true); + game.GetUserlist().AddPlugin(plugin); + + PluginSorter ps; + std::list expectedSortedOrder({ + "Skyrim.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Master Dependent.esm", + "Blank - Different Master Dependent.esm", + "Blank - Different Master Dependent.esp", + "Blank.esp", + "Blank - Master Dependent.esp", + "Blank - Different.esp", + "Blank - Plugin Dependent.esp", + "Blank - Different Plugin Dependent.esp", + }); + + std::list actualSortedOrder = GetActualSortedOrder(ps.Sort(game, Language::english)); + EXPECT_EQ(expectedSortedOrder, actualSortedOrder); + } + + TEST_F(PluginSorterTest, Sort_WithLoadAfter) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + PluginMetadata plugin("Blank.esp"); + plugin.LoadAfter({ + File("Blank - Different.esp"), + File("Blank - Different Plugin Dependent.esp"), + }); + game.GetUserlist().AddPlugin(plugin); + + PluginSorter ps; + std::list expectedSortedOrder({ + "Skyrim.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Master Dependent.esm", + "Blank - Different Master Dependent.esm", + "Blank - Different.esp", + "Blank - Master Dependent.esp", + "Blank - Different Master Dependent.esp", + "Blank - Different Plugin Dependent.esp", + "Blank.esp", + "Blank - Plugin Dependent.esp", + }); + + std::list sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); + } + + TEST_F(PluginSorterTest, Sort_WithRequirements) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + PluginMetadata plugin("Blank.esp"); + plugin.Reqs({ + File("Blank - Different.esp"), + File("Blank - Different Plugin Dependent.esp"), + }); + game.GetUserlist().AddPlugin(plugin); + + PluginSorter ps; + std::list expectedSortedOrder({ + "Skyrim.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Master Dependent.esm", + "Blank - Different Master Dependent.esm", + "Blank - Different.esp", + "Blank - Master Dependent.esp", + "Blank - Different Master Dependent.esp", + "Blank - Different Plugin Dependent.esp", + "Blank.esp", + "Blank - Plugin Dependent.esp", + }); + + std::list sorted = ps.Sort(game, Language::english); + EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); + } + + TEST_F(PluginSorterTest, Sort_HasCycle) { + ASSERT_NO_THROW(game.LoadPlugins(false)); + PluginMetadata plugin("Blank.esm"); + plugin.LoadAfter({File("Blank - Master Dependent.esm")}); + game.GetUserlist().AddPlugin(plugin); + + PluginSorter ps; + EXPECT_ANY_THROW(ps.Sort(game, Language::english)); + } } - - inline std::list GetExpectedSortedOrder() const { - return std::list({ - "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", - }); - } - - inline static std::list GetActualSortedOrder(const std::list& sortedPlugins) { - std::list output; - std::transform(begin(sortedPlugins), - end(sortedPlugins), - std::back_inserter(output), - [](const loot::Plugin& plugin) { - return plugin.Name(); - }); - return output; - } - - loot::Game game; - std::function callback; -}; - -TEST_F(PluginSorter, Sort_NoPlugins) { - loot::PluginSorter ps; - std::list sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(sorted.empty()); -} - -TEST_F(PluginSorter, Sort) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - - loot::PluginSorter ps; - std::list expectedSortedOrder = GetExpectedSortedOrder(); - - std::list sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); - - // Check stability. - sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); -} - -TEST_F(PluginSorter, sortingShouldClearExistingGameMessages) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - game.AppendMessage(loot::Message(loot::Message::say, "1")); - ASSERT_FALSE(game.GetMessages().empty()); - - loot::PluginSorter ps; - std::list sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(game.GetMessages().empty()); -} - -TEST_F(PluginSorter, failedSortShouldNotClearExistingGameMessages) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - loot::PluginMetadata plugin("Blank.esm"); - plugin.LoadAfter({loot::File("Blank - Master Dependent.esm")}); - game.GetUserlist().AddPlugin(plugin); - game.AppendMessage(loot::Message(loot::Message::say, "1")); - ASSERT_FALSE(game.GetMessages().empty()); - - loot::PluginSorter ps; - EXPECT_ANY_THROW(ps.Sort(game, loot::Language::english)); - EXPECT_FALSE(game.GetMessages().empty()); -} - -TEST_F(PluginSorter, Sort_HeadersOnly) { - ASSERT_NO_THROW(game.LoadPlugins(true)); - - loot::PluginSorter ps; - std::list expectedSortedOrder = GetExpectedSortedOrder(); - - std::list sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); -} - -TEST_F(PluginSorter, Sort_WithPriority) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - loot::PluginMetadata plugin("Blank - Different Master Dependent.esp"); - plugin.Priority(-100000); - plugin.SetPriorityGlobal(true); - game.GetUserlist().AddPlugin(plugin); - - loot::PluginSorter ps; - std::list expectedSortedOrder({ - "Skyrim.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Master Dependent.esm", - "Blank - Different Master Dependent.esm", - "Blank - Different Master Dependent.esp", - "Blank.esp", - "Blank - Different.esp", - "Blank - Master Dependent.esp", - "Blank - Plugin Dependent.esp", - "Blank - Different Plugin Dependent.esp", - }); - - std::list sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); -} - -TEST_F(PluginSorter, sortingWithPrioritiesShouldInheritRecursivelyRegardlessOfEvaluationOrder) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - - // Set Blank.esp's priority. - loot::PluginMetadata plugin("Blank.esp"); - plugin.Priority(2); - game.GetUserlist().AddPlugin(plugin); - - // Load Blank - Master Dependent.esp after Blank.esp so that it - // inherits Blank.esp's priority. - plugin = loot::PluginMetadata("Blank - Master Dependent.esp"); - plugin.LoadAfter({ - loot::File("Blank.esp"), - }); - game.GetUserlist().AddPlugin(plugin); - - // Load Blank - Different.esp after Blank - Master Dependent.esp, so - // that it inherits its inherited priority. - plugin = loot::PluginMetadata("Blank - Different.esp"); - plugin.LoadAfter({ - loot::File("Blank - Master Dependent.esp"), - }); - game.GetUserlist().AddPlugin(plugin); - - // Set Blank - Different Master Dependent.esp to have a higher priority - // than 0 but lower than Blank.esp. Need to also make it a global priority - // because it doesn't otherwise conflict with the other plugins. - plugin = loot::PluginMetadata("Blank - Different Master Dependent.esp"); - plugin.Priority(1); - plugin.SetPriorityGlobal(true); - game.GetUserlist().AddPlugin(plugin); - - loot::PluginSorter ps; - std::list expectedSortedOrder({ - "Skyrim.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Master Dependent.esm", - "Blank - Different Master Dependent.esm", - "Blank - Different Master Dependent.esp", - "Blank.esp", - "Blank - Master Dependent.esp", - "Blank - Different.esp", - "Blank - Plugin Dependent.esp", - "Blank - Different Plugin Dependent.esp", - }); - - std::list actualSortedOrder = GetActualSortedOrder(ps.Sort(game, loot::Language::english)); - EXPECT_EQ(expectedSortedOrder, actualSortedOrder); -} - -TEST_F(PluginSorter, Sort_WithLoadAfter) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - loot::PluginMetadata plugin("Blank.esp"); - plugin.LoadAfter({ - loot::File("Blank - Different.esp"), - loot::File("Blank - Different Plugin Dependent.esp"), - }); - game.GetUserlist().AddPlugin(plugin); - - loot::PluginSorter ps; - std::list expectedSortedOrder({ - "Skyrim.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Master Dependent.esm", - "Blank - Different Master Dependent.esm", - "Blank - Different.esp", - "Blank - Master Dependent.esp", - "Blank - Different Master Dependent.esp", - "Blank - Different Plugin Dependent.esp", - "Blank.esp", - "Blank - Plugin Dependent.esp", - }); - - std::list sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); -} - -TEST_F(PluginSorter, Sort_WithRequirements) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - loot::PluginMetadata plugin("Blank.esp"); - plugin.Reqs({ - loot::File("Blank - Different.esp"), - loot::File("Blank - Different Plugin Dependent.esp"), - }); - game.GetUserlist().AddPlugin(plugin); - - loot::PluginSorter ps; - std::list expectedSortedOrder({ - "Skyrim.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Master Dependent.esm", - "Blank - Different Master Dependent.esm", - "Blank - Different.esp", - "Blank - Master Dependent.esp", - "Blank - Different Master Dependent.esp", - "Blank - Different Plugin Dependent.esp", - "Blank.esp", - "Blank - Plugin Dependent.esp", - }); - - std::list sorted = ps.Sort(game, loot::Language::english); - EXPECT_TRUE(std::equal(begin(sorted), end(sorted), begin(expectedSortedOrder))); -} - -TEST_F(PluginSorter, Sort_HasCycle) { - ASSERT_NO_THROW(game.LoadPlugins(false)); - loot::PluginMetadata plugin("Blank.esm"); - plugin.LoadAfter({loot::File("Blank - Master Dependent.esm")}); - game.GetUserlist().AddPlugin(plugin); - - loot::PluginSorter ps; - EXPECT_ANY_THROW(ps.Sort(game, loot::Language::english)); } #endif diff --git a/src/tests/fixtures.h b/src/tests/fixtures.h index 7073e608..e11038cf 100644 --- a/src/tests/fixtures.h +++ b/src/tests/fixtures.h @@ -32,286 +32,290 @@ along with LOOT. If not, see #include #include -class GameTest : public ::testing::Test { -protected: - GameTest(const boost::filesystem::path& gameDataPath, const boost::filesystem::path& gameLocalPath) - : dataPath(gameDataPath), - localPath(gameLocalPath), - missingPath("./missing"), - masterlistPath(localPath / "masterlist.yaml"), - userlistPath(localPath / "userlist.yaml"), - resourcePath(dataPath / "resource" / "detail" / "resource.txt"), - db(nullptr) {} +namespace loot { + namespace test { + class GenericGameTest : public ::testing::Test { + protected: + GenericGameTest(const boost::filesystem::path& gameDataPath, const boost::filesystem::path& gameLocalPath) + : dataPath(gameDataPath), + localPath(gameLocalPath), + missingPath("./missing"), + masterlistPath(localPath / "masterlist.yaml"), + userlistPath(localPath / "userlist.yaml"), + resourcePath(dataPath / "resource" / "detail" / "resource.txt"), + db(nullptr) {} - inline virtual void SetUp() { - ASSERT_NO_THROW(boost::filesystem::create_directories(localPath)); - ASSERT_TRUE(boost::filesystem::exists(localPath)); + inline virtual void SetUp() { + ASSERT_NO_THROW(boost::filesystem::create_directories(localPath)); + ASSERT_TRUE(boost::filesystem::exists(localPath)); - ASSERT_FALSE(boost::filesystem::exists(masterlistPath)); - ASSERT_FALSE(boost::filesystem::exists(userlistPath)); - ASSERT_FALSE(boost::filesystem::exists(localPath / ".git")); - ASSERT_FALSE(boost::filesystem::exists(missingPath)); + ASSERT_FALSE(boost::filesystem::exists(masterlistPath)); + ASSERT_FALSE(boost::filesystem::exists(userlistPath)); + ASSERT_FALSE(boost::filesystem::exists(localPath / ".git")); + ASSERT_FALSE(boost::filesystem::exists(missingPath)); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.esm")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different.esm")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different Master Dependent.esm")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.esp")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different.esp")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esp")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different Master Dependent.esp")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Plugin Dependent.esp")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different Plugin Dependent.esp")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.esm")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different.esm")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different Master Dependent.esm")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.esp")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different.esp")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esp")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different Master Dependent.esp")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Plugin Dependent.esp")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Different Plugin Dependent.esp")); - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank.missing.esm")); - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank.missing.esp")); + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank.missing.esm")); + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank.missing.esp")); - // Ghost a plugin. - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); - ASSERT_NO_THROW(boost::filesystem::rename(dataPath / "Blank - Master Dependent.esm", dataPath / "Blank - Master Dependent.esm.ghost")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); + // Ghost a plugin. + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); + ASSERT_NO_THROW(boost::filesystem::rename(dataPath / "Blank - Master Dependent.esm", dataPath / "Blank - Master Dependent.esm.ghost")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); - // Write out an empty file. - boost::filesystem::ofstream out(dataPath / "EmptyFile.esm"); - out.close(); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "EmptyFile.esm")); + // Write out an empty file. + boost::filesystem::ofstream out(dataPath / "EmptyFile.esm"); + out.close(); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "EmptyFile.esm")); - // Write out an empty resource file. - ASSERT_NO_THROW(boost::filesystem::create_directories(resourcePath.parent_path())); - out.open(resourcePath); - out.close(); - ASSERT_TRUE(boost::filesystem::exists(resourcePath)); + // Write out an empty resource file. + ASSERT_NO_THROW(boost::filesystem::create_directories(resourcePath.parent_path())); + out.open(resourcePath); + out.close(); + ASSERT_TRUE(boost::filesystem::exists(resourcePath)); - // Write out an non-empty, non-plugin file. - out.open(dataPath / "NotAPlugin.esm"); - out << "This isn't a valid plugin file."; - out.close(); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "NotAPlugin.esm")); - } + // Write out an non-empty, non-plugin file. + out.open(dataPath / "NotAPlugin.esm"); + out << "This isn't a valid plugin file."; + out.close(); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "NotAPlugin.esm")); + } - inline virtual void TearDown() { - // Unghost the ghosted plugin. - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); - ASSERT_NO_THROW(boost::filesystem::rename(dataPath / "Blank - Master Dependent.esm.ghost", dataPath / "Blank - Master Dependent.esm")); - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); + inline virtual void TearDown() { + // Unghost the ghosted plugin. + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); + ASSERT_NO_THROW(boost::filesystem::rename(dataPath / "Blank - Master Dependent.esm.ghost", dataPath / "Blank - Master Dependent.esm")); + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Blank - Master Dependent.esm.ghost")); - // Delete generated files. - ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "EmptyFile.esm")); - ASSERT_NO_THROW(boost::filesystem::remove(resourcePath)); - ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "NotAPlugin.esm")); - ASSERT_FALSE(boost::filesystem::exists(dataPath / "EmptyFile.esm")); - ASSERT_FALSE(boost::filesystem::exists(resourcePath)); - ASSERT_FALSE(boost::filesystem::exists(dataPath / "NotAPlugin.esm")); + // Delete generated files. + ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "EmptyFile.esm")); + ASSERT_NO_THROW(boost::filesystem::remove(resourcePath)); + ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "NotAPlugin.esm")); + ASSERT_FALSE(boost::filesystem::exists(dataPath / "EmptyFile.esm")); + ASSERT_FALSE(boost::filesystem::exists(resourcePath)); + ASSERT_FALSE(boost::filesystem::exists(dataPath / "NotAPlugin.esm")); - // Masterlist & userlist may have been created during test, so delete them. - ASSERT_NO_THROW(boost::filesystem::remove(masterlistPath)); - ASSERT_NO_THROW(boost::filesystem::remove(userlistPath)); + // Masterlist & userlist may have been created during test, so delete them. + ASSERT_NO_THROW(boost::filesystem::remove(masterlistPath)); + ASSERT_NO_THROW(boost::filesystem::remove(userlistPath)); - // Also remove the ".git" folder if it has been created. - ASSERT_NO_THROW(boost::filesystem::remove_all(localPath / ".git")); + // Also remove the ".git" folder if it has been created. + ASSERT_NO_THROW(boost::filesystem::remove_all(localPath / ".git")); - ASSERT_NO_THROW(loot_destroy_db(db)); - } + ASSERT_NO_THROW(loot_destroy_db(db)); + } - const boost::filesystem::path dataPath; - const boost::filesystem::path localPath; - const boost::filesystem::path missingPath; + const boost::filesystem::path dataPath; + const boost::filesystem::path localPath; + const boost::filesystem::path missingPath; - const boost::filesystem::path masterlistPath; - const boost::filesystem::path userlistPath; + const boost::filesystem::path masterlistPath; + const boost::filesystem::path userlistPath; - const boost::filesystem::path resourcePath; + const boost::filesystem::path resourcePath; - loot_db * db; -}; - -class OblivionTest : public GameTest { -protected: - OblivionTest() : GameTest("./Oblivion/Data", "./local/Oblivion") {} - - inline virtual void SetUp() { - GameTest::SetUp(); - - // LOOT expects the game master file to be present, so mock it. - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Oblivion.esm")); - ASSERT_NO_THROW(boost::filesystem::copy_file(dataPath / "Blank.esm", dataPath / "Oblivion.esm")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Oblivion.esm")); - - // Oblivion's load order is decided through timestamps, so reset them to a known order before each test. - std::list loadOrder = { - "Oblivion.esm", - "Blank.esm", - "Blank - Different.esm", - "Blank - Master Dependent.esm", // Ghosted - "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" + loot_db * db; }; - time_t modificationTime = time(NULL); // Current time. - for (const auto &plugin : loadOrder) { - if (boost::filesystem::exists(dataPath / boost::filesystem::path(plugin + ".ghost"))) { - boost::filesystem::last_write_time(dataPath / boost::filesystem::path(plugin + ".ghost"), modificationTime); + + class OblivionTest : public GenericGameTest { + protected: + OblivionTest() : GenericGameTest("./Oblivion/Data", "./local/Oblivion") {} + + inline virtual void SetUp() { + GenericGameTest::SetUp(); + + // LOOT expects the game master file to be present, so mock it. + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Oblivion.esm")); + ASSERT_NO_THROW(boost::filesystem::copy_file(dataPath / "Blank.esm", dataPath / "Oblivion.esm")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Oblivion.esm")); + + // Oblivion's load order is decided through timestamps, so reset them to a known order before each test. + std::list loadOrder = { + "Oblivion.esm", + "Blank.esm", + "Blank - Different.esm", + "Blank - Master Dependent.esm", // Ghosted + "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" + }; + time_t modificationTime = time(NULL); // Current time. + for (const auto &plugin : loadOrder) { + if (boost::filesystem::exists(dataPath / boost::filesystem::path(plugin + ".ghost"))) { + boost::filesystem::last_write_time(dataPath / boost::filesystem::path(plugin + ".ghost"), modificationTime); + } + else { + boost::filesystem::last_write_time(dataPath / plugin, modificationTime); + } + modificationTime += 60; + } + + // Set Oblivion's active plugins to a known list before running the test. + boost::filesystem::ofstream activePlugins(localPath / "plugins.txt"); + activePlugins + << "Oblivion.esm" << std::endl + << "Blank.esm" << std::endl; + activePlugins.close(); } - else { - boost::filesystem::last_write_time(dataPath / plugin, modificationTime); + + inline virtual void TearDown() { + GenericGameTest::TearDown(); + + // Delete the mock Oblivion.esm. + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Oblivion.esm")); + ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "Oblivion.esm")); + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Oblivion.esm")); + + // Delete existing plugins.txt. + ASSERT_NO_THROW(boost::filesystem::remove(localPath / "plugins.txt")); + }; + + inline void GenerateMasterlist() { + boost::filesystem::ofstream masterlist(masterlistPath); + masterlist + << "plugins:" << std::endl + << " - name: Oblivion.esm" << std::endl + << " - name: Silgrad_Tower.esm" << std::endl + << " - name: No Lights Flicker.esm" << std::endl + << " msg:" << std::endl + << " - type: say" << std::endl + << " content: Use Wrye Bash Bashed Patch tweak instead." << std::endl + << " - name: bookplacing.esm" << std::endl + << " msg:" << std::endl + << " - type: warn" << std::endl + << " content: 'Check you are using v2+. If not, Update. v1 has a severe bug with the Mystic Emporium disappearing.'" << std::endl + << " - name: EnhancedWeatherSIOnly.esm" << std::endl + << " msg:" << std::endl + << " - type: error" << std::endl + << " content: Obsolete. Remove this and install Enhanced Weather." << std::endl + << " - name: Hammerfell.esm" << std::endl + << " dirty:" << std::endl + << " - crc: 0x7d22f9df" << std::endl + << " util: TES4Edit" << std::endl + << " udr: 4" << std::endl + << " - name: nVidia Black Screen Fix.esp" << std::endl + << " msg:" << std::endl + << " - type: say" << std::endl + << " content: Use Wrye Bash Bashed Patch tweak instead." << std::endl + << " - type: say" << std::endl + << " content: 'Alternatively, remove this and use UOP v3.0.1+ instead.'" << std::endl + << " - name: Unofficial Oblivion Patch.esp" << std::endl + << " msg:" << std::endl + << " - type: say" << std::endl + << " content: 'Do not clean ITM records, they are intentional and required for the mod to function.'" << std::endl + << " tag:" << std::endl + << " - Actors.ACBS" << std::endl + << " - Actors.AIData" << std::endl + << " - Actors.AIPackages" << std::endl + << " - Actors.CombatStyle" << std::endl + << " - Actors.DeathItem" << std::endl + << " - Actors.Stats" << std::endl + << " - C.Climate" << std::endl + << " - C.Light" << std::endl + << " - C.Music" << std::endl + << " - C.Name" << std::endl + << " - C.Owner" << std::endl + << " - Creatures.Blood" << std::endl + << " - Delev" << std::endl + << " - Factions" << std::endl + << " - Invent" << std::endl + << " - Names" << std::endl + << " - NPC.Class" << std::endl + << " - Relations" << std::endl + << " - Relev" << std::endl + << " - Scripts" << std::endl + << " - Stats" << std::endl + << " - '-C.Water'" << std::endl; + + masterlist.close(); } - modificationTime += 60; - } + }; - // Set Oblivion's active plugins to a known list before running the test. - boost::filesystem::ofstream activePlugins(localPath / "plugins.txt"); - activePlugins - << "Oblivion.esm" << std::endl - << "Blank.esm" << std::endl; - activePlugins.close(); + class OblivionAPIOperationsTest : public OblivionTest { + protected: + inline virtual void SetUp() { + OblivionTest::SetUp(); + + ASSERT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + } + }; + + class SkyrimTest : public GenericGameTest { + protected: + SkyrimTest() : GenericGameTest("./Skyrim/Data", "./local/Skyrim") {} + + inline virtual void SetUp() { + GenericGameTest::SetUp(); + + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.bsa")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.bsl")); + + // Can't change Skyrim's main master file, so mock it. + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Skyrim.esm")); + ASSERT_NO_THROW(boost::filesystem::copy_file(dataPath / "Blank.esm", dataPath / "Skyrim.esm")); + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Skyrim.esm")); + + // Set Skyrim's load order to a known list before running the test. + boost::filesystem::ofstream loadOrder(localPath / "loadorder.txt"); + loadOrder + << "Skyrim.esm" << std::endl + << "Blank.esm" << std::endl + << "Blank - Different.esm" << std::endl + << "Blank - Master Dependent.esm" << std::endl // Ghosted + << "Blank - Different Master Dependent.esm" << std::endl + << "Blank.esp" << std::endl + << "Blank - Different.esp" << std::endl + << "Blank - Master Dependent.esp" << std::endl + << "Blank - Different Master Dependent.esp" << std::endl + << "Blank - Plugin Dependent.esp" << std::endl + << "Blank - Different Plugin Dependent.esp" << std::endl; + loadOrder.close(); + + // Set Skyrim's active plugins to a known list before running the test. + boost::filesystem::ofstream activePlugins(localPath / "plugins.txt"); + activePlugins + << "Blank.esm" << std::endl + << "Blank - Different Master Dependent.esp" << std::endl; + activePlugins.close(); + } + + inline virtual void TearDown() { + GenericGameTest::TearDown(); + + // Delete the mock Skyrim.esm. + ASSERT_TRUE(boost::filesystem::exists(dataPath / "Skyrim.esm")); + ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "Skyrim.esm")); + ASSERT_FALSE(boost::filesystem::exists(dataPath / "Skyrim.esm")); + + // Delete existing plugins.txt and loadorder.txt. + ASSERT_NO_THROW(boost::filesystem::remove(localPath / "plugins.txt")); + ASSERT_NO_THROW(boost::filesystem::remove(localPath / "loadorder.txt")); + }; + }; + + class SkyrimAPIOperationsTest : public SkyrimTest { + protected: + inline virtual void SetUp() { + SkyrimTest::SetUp(); + + ASSERT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), localPath.string().c_str())); + } + }; } - - inline virtual void TearDown() { - GameTest::TearDown(); - - // Delete the mock Oblivion.esm. - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Oblivion.esm")); - ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "Oblivion.esm")); - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Oblivion.esm")); - - // Delete existing plugins.txt. - ASSERT_NO_THROW(boost::filesystem::remove(localPath / "plugins.txt")); - }; - - inline void GenerateMasterlist() { - boost::filesystem::ofstream masterlist(masterlistPath); - masterlist - << "plugins:" << std::endl - << " - name: Oblivion.esm" << std::endl - << " - name: Silgrad_Tower.esm" << std::endl - << " - name: No Lights Flicker.esm" << std::endl - << " msg:" << std::endl - << " - type: say" << std::endl - << " content: Use Wrye Bash Bashed Patch tweak instead." << std::endl - << " - name: bookplacing.esm" << std::endl - << " msg:" << std::endl - << " - type: warn" << std::endl - << " content: 'Check you are using v2+. If not, Update. v1 has a severe bug with the Mystic Emporium disappearing.'" << std::endl - << " - name: EnhancedWeatherSIOnly.esm" << std::endl - << " msg:" << std::endl - << " - type: error" << std::endl - << " content: Obsolete. Remove this and install Enhanced Weather." << std::endl - << " - name: Hammerfell.esm" << std::endl - << " dirty:" << std::endl - << " - crc: 0x7d22f9df" << std::endl - << " util: TES4Edit" << std::endl - << " udr: 4" << std::endl - << " - name: nVidia Black Screen Fix.esp" << std::endl - << " msg:" << std::endl - << " - type: say" << std::endl - << " content: Use Wrye Bash Bashed Patch tweak instead." << std::endl - << " - type: say" << std::endl - << " content: 'Alternatively, remove this and use UOP v3.0.1+ instead.'" << std::endl - << " - name: Unofficial Oblivion Patch.esp" << std::endl - << " msg:" << std::endl - << " - type: say" << std::endl - << " content: 'Do not clean ITM records, they are intentional and required for the mod to function.'" << std::endl - << " tag:" << std::endl - << " - Actors.ACBS" << std::endl - << " - Actors.AIData" << std::endl - << " - Actors.AIPackages" << std::endl - << " - Actors.CombatStyle" << std::endl - << " - Actors.DeathItem" << std::endl - << " - Actors.Stats" << std::endl - << " - C.Climate" << std::endl - << " - C.Light" << std::endl - << " - C.Music" << std::endl - << " - C.Name" << std::endl - << " - C.Owner" << std::endl - << " - Creatures.Blood" << std::endl - << " - Delev" << std::endl - << " - Factions" << std::endl - << " - Invent" << std::endl - << " - Names" << std::endl - << " - NPC.Class" << std::endl - << " - Relations" << std::endl - << " - Relev" << std::endl - << " - Scripts" << std::endl - << " - Stats" << std::endl - << " - '-C.Water'" << std::endl; - - masterlist.close(); - } -}; - -class OblivionAPIOperationsTest : public OblivionTest { -protected: - inline virtual void SetUp() { - OblivionTest::SetUp(); - - ASSERT_EQ(loot_ok, loot_create_db(&db, loot_game_tes4, dataPath.parent_path().string().c_str(), localPath.string().c_str())); - } -}; - -class SkyrimTest : public GameTest { -protected: - SkyrimTest() : GameTest("./Skyrim/Data", "./local/Skyrim") {} - - inline virtual void SetUp() { - GameTest::SetUp(); - - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.bsa")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Blank.bsl")); - - // Can't change Skyrim's main master file, so mock it. - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Skyrim.esm")); - ASSERT_NO_THROW(boost::filesystem::copy_file(dataPath / "Blank.esm", dataPath / "Skyrim.esm")); - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Skyrim.esm")); - - // Set Skyrim's load order to a known list before running the test. - boost::filesystem::ofstream loadOrder(localPath / "loadorder.txt"); - loadOrder - << "Skyrim.esm" << std::endl - << "Blank.esm" << std::endl - << "Blank - Different.esm" << std::endl - << "Blank - Master Dependent.esm" << std::endl // Ghosted - << "Blank - Different Master Dependent.esm" << std::endl - << "Blank.esp" << std::endl - << "Blank - Different.esp" << std::endl - << "Blank - Master Dependent.esp" << std::endl - << "Blank - Different Master Dependent.esp" << std::endl - << "Blank - Plugin Dependent.esp" << std::endl - << "Blank - Different Plugin Dependent.esp" << std::endl; - loadOrder.close(); - - // Set Skyrim's active plugins to a known list before running the test. - boost::filesystem::ofstream activePlugins(localPath / "plugins.txt"); - activePlugins - << "Blank.esm" << std::endl - << "Blank - Different Master Dependent.esp" << std::endl; - activePlugins.close(); - } - - inline virtual void TearDown() { - GameTest::TearDown(); - - // Delete the mock Skyrim.esm. - ASSERT_TRUE(boost::filesystem::exists(dataPath / "Skyrim.esm")); - ASSERT_NO_THROW(boost::filesystem::remove(dataPath / "Skyrim.esm")); - ASSERT_FALSE(boost::filesystem::exists(dataPath / "Skyrim.esm")); - - // Delete existing plugins.txt and loadorder.txt. - ASSERT_NO_THROW(boost::filesystem::remove(localPath / "plugins.txt")); - ASSERT_NO_THROW(boost::filesystem::remove(localPath / "loadorder.txt")); - }; -}; - -class SkyrimAPIOperationsTest : public SkyrimTest { -protected: - inline virtual void SetUp() { - SkyrimTest::SetUp(); - - ASSERT_EQ(loot_ok, loot_create_db(&db, loot_game_tes5, dataPath.parent_path().string().c_str(), localPath.string().c_str())); - } -}; +} #endif diff --git a/src/tests/gui/test_loot_settings.h b/src/tests/gui/test_loot_settings.h index dfd11cb4..d9a4a44b 100644 --- a/src/tests/gui/test_loot_settings.h +++ b/src/tests/gui/test_loot_settings.h @@ -30,19 +30,19 @@ along with LOOT. If not, see namespace loot { namespace test { - class LootSettings : public ::testing::Test { + class LootSettingsTest : public ::testing::Test { protected: - LootSettings() : settingsFile("./settings.yaml") {} + LootSettingsTest() : settingsFile("./settings.yaml") {} - ~LootSettings() { + ~LootSettingsTest() { boost::filesystem::remove(settingsFile); } boost::filesystem::path settingsFile; - loot::LootSettings settings; + LootSettings settings; }; - TEST_F(LootSettings, defaultConstructorShouldSetDefaultValues) { + TEST_F(LootSettingsTest, defaultConstructorShouldSetDefaultValues) { const std::string currentVersion = std::to_string(g_version_major) + "." + std::to_string(g_version_minor) + "." + std::to_string(g_version_patch); const std::vector expectedGameSettings({ GameSettings(GameSettings::tes4), @@ -109,7 +109,7 @@ namespace loot { EXPECT_EQ(expectedGameSettings[5].RepoBranch(), actualGameSettings[5].RepoBranch()); } - TEST_F(LootSettings, loadingFromFileShouldLoadContentAsYaml) { + TEST_F(LootSettingsTest, loadingFromFileShouldLoadContentAsYaml) { boost::filesystem::ofstream out(settingsFile); out << "enableDebugLogging: true" << std::endl; out.close(); @@ -119,7 +119,7 @@ namespace loot { EXPECT_TRUE(settings.isDebugLoggingEnabled()); } - TEST_F(LootSettings, loadingFromYamlShouldStoreLoadedValues) { + TEST_F(LootSettingsTest, loadingFromYamlShouldStoreLoadedValues) { const bool enableDebugLogging = true; const bool updateMasterlist = true; const std::string game = "Oblivion"; @@ -174,12 +174,12 @@ namespace loot { EXPECT_EQ(games[0].Name(), settings.getGameSettings()[0].Name()); } - TEST_F(LootSettings, loadingFromEmptyYamlShouldNotThrow) { + TEST_F(LootSettingsTest, loadingFromEmptyYamlShouldNotThrow) { YAML::Node yaml; EXPECT_NO_THROW(settings.load(yaml)); } - TEST_F(LootSettings, loadingFromYamlShouldUpgradeFromVersion0Point6Format) { + TEST_F(LootSettingsTest, loadingFromYamlShouldUpgradeFromVersion0Point6Format) { const unsigned int DebugVerbosity = 3; const bool UpdateMasterlist = true; const std::string Game = "Oblivion"; @@ -215,7 +215,7 @@ namespace loot { EXPECT_EQ(Games[0].RepoBranch(), settings.getGameSettings()[0].RepoBranch()); } - TEST_F(LootSettings, loadingFromYamlShouldNotUpgradeVersion0Point6SettingsIfEquivalentsAlreadyExist) { + TEST_F(LootSettingsTest, loadingFromYamlShouldNotUpgradeVersion0Point6SettingsIfEquivalentsAlreadyExist) { const unsigned int DebugVerbosity = 3; const bool enableDebugLogging = false; const bool UpdateMasterlist = true; @@ -264,7 +264,7 @@ namespace loot { EXPECT_EQ(games[0].Name(), settings.getGameSettings()[0].Name()); } - TEST_F(LootSettings, loadingFromYamlShouldUpgradeOldDefaultGameRepositoryBranches) { + TEST_F(LootSettingsTest, loadingFromYamlShouldUpgradeOldDefaultGameRepositoryBranches) { const std::vector games({GameSettings(GameSettings::tes4)}); YAML::Node inputYaml; @@ -276,7 +276,7 @@ namespace loot { EXPECT_EQ(games[0].RepoBranch(), settings.getGameSettings()[0].RepoBranch()); } - TEST_F(LootSettings, loadingFromYamlShouldNotUpgradeNonDefaultGameRepositoryBranches) { + TEST_F(LootSettingsTest, loadingFromYamlShouldNotUpgradeNonDefaultGameRepositoryBranches) { const std::vector games({GameSettings(GameSettings::tes4)}); YAML::Node inputYaml; @@ -288,7 +288,7 @@ namespace loot { EXPECT_EQ("foo", settings.getGameSettings()[0].RepoBranch()); } - TEST_F(LootSettings, loadingFromYamlShouldAddMissingBaseGames) { + TEST_F(LootSettingsTest, loadingFromYamlShouldAddMissingBaseGames) { const std::vector games({GameSettings(GameSettings::tes4)}); YAML::Node inputYaml; inputYaml["games"] = games; @@ -305,7 +305,7 @@ namespace loot { EXPECT_EQ(expectedGameSettings, settings.getGameSettings()); } - TEST_F(LootSettings, loadingFromYamlShouldSkipUnrecognisedGames) { + TEST_F(LootSettingsTest, loadingFromYamlShouldSkipUnrecognisedGames) { YAML::Node inputYaml; inputYaml["games"][0] = GameSettings(GameSettings::tes4); inputYaml["games"][0]["type"] = "Foobar"; @@ -317,14 +317,14 @@ namespace loot { EXPECT_EQ("Game Name", settings.getGameSettings()[0].Name()); } - TEST_F(LootSettings, loadingFromYamlShouldRemoveTheContentFilterSetting) { + TEST_F(LootSettingsTest, loadingFromYamlShouldRemoveTheContentFilterSetting) { YAML::Node inputYaml; inputYaml["filters"]["contentFilter"] = "foo"; settings.load(inputYaml); } - TEST_F(LootSettings, saveShouldWriteSettingsAsYamlToPassedFile) { + TEST_F(LootSettingsTest, saveShouldWriteSettingsAsYamlToPassedFile) { settings.storeLastGame("Skyrim"); settings.save(settingsFile); @@ -334,7 +334,7 @@ namespace loot { EXPECT_EQ("Skyrim", settings.getLastGame()); } - TEST_F(LootSettings, getLanguageShouldReturnTheCurrentValue) { + TEST_F(LootSettingsTest, getLanguageShouldReturnTheCurrentValue) { YAML::Node inputYaml; inputYaml["language"] = "fr"; @@ -343,71 +343,71 @@ namespace loot { EXPECT_EQ("fr", settings.getLanguage().Locale()); } - TEST_F(LootSettings, isWindowPositionStoredShouldReturnFalseIfAllPositionValuesAreZero) { - loot::LootSettings::WindowPosition position; + TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnFalseIfAllPositionValuesAreZero) { + LootSettings::WindowPosition position; settings.storeWindowPosition(position); EXPECT_FALSE(settings.isWindowPositionStored()); } - TEST_F(LootSettings, isWindowPositionStoredShouldReturnTrueIfTopPositionValueIsNonZero) { - loot::LootSettings::WindowPosition position; + TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfTopPositionValueIsNonZero) { + LootSettings::WindowPosition position; position.top = 1; settings.storeWindowPosition(position); EXPECT_TRUE(settings.isWindowPositionStored()); } - TEST_F(LootSettings, isWindowPositionStoredShouldReturnTrueIfBottomPositionValueIsNonZero) { - loot::LootSettings::WindowPosition position; + TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfBottomPositionValueIsNonZero) { + LootSettings::WindowPosition position; position.bottom = 1; settings.storeWindowPosition(position); EXPECT_TRUE(settings.isWindowPositionStored()); } - TEST_F(LootSettings, isWindowPositionStoredShouldReturnTrueIfLeftPositionValueIsNonZero) { - loot::LootSettings::WindowPosition position; + TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfLeftPositionValueIsNonZero) { + LootSettings::WindowPosition position; position.left = 1; settings.storeWindowPosition(position); EXPECT_TRUE(settings.isWindowPositionStored()); } - TEST_F(LootSettings, isWindowPositionStoredShouldReturnTrueIfRightPositionValueIsNonZero) { - loot::LootSettings::WindowPosition position; + TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfRightPositionValueIsNonZero) { + LootSettings::WindowPosition position; position.right = 1; settings.storeWindowPosition(position); EXPECT_TRUE(settings.isWindowPositionStored()); } - TEST_F(LootSettings, storeGameSettingsShouldReplaceExistingGameSettings) { + TEST_F(LootSettingsTest, storeGameSettingsShouldReplaceExistingGameSettings) { const std::vector gameSettings({GameSettings(GameSettings::tes5)}); settings.storeGameSettings(gameSettings); EXPECT_EQ(gameSettings, settings.getGameSettings()); } - TEST_F(LootSettings, storeLastGameShouldReplaceExistingValue) { + TEST_F(LootSettingsTest, storeLastGameShouldReplaceExistingValue) { settings.storeLastGame("Fallout3"); EXPECT_EQ("Fallout3", settings.getLastGame()); } - TEST_F(LootSettings, storeWindowPositionShouldReplaceExistingValue) { - loot::LootSettings::WindowPosition expectedPosition; + TEST_F(LootSettingsTest, storeWindowPositionShouldReplaceExistingValue) { + LootSettings::WindowPosition expectedPosition; expectedPosition.top = 1; settings.storeWindowPosition(expectedPosition); - loot::LootSettings::WindowPosition actualPosition = settings.getWindowPosition(); + LootSettings::WindowPosition actualPosition = settings.getWindowPosition(); EXPECT_EQ(expectedPosition.top, actualPosition.top); EXPECT_EQ(expectedPosition.bottom, actualPosition.bottom); EXPECT_EQ(expectedPosition.left, actualPosition.left); EXPECT_EQ(expectedPosition.right, actualPosition.right); } - TEST_F(LootSettings, updateLastVersionShouldSetValueToCurrentLootVersion) { + TEST_F(LootSettingsTest, updateLastVersionShouldSetValueToCurrentLootVersion) { const std::string currentVersion = std::to_string(g_version_major) + "." + std::to_string(g_version_minor) + "." + std::to_string(g_version_patch); YAML::Node inputYaml; inputYaml["lastVersion"] = "v0.7.1"; @@ -418,7 +418,7 @@ namespace loot { EXPECT_EQ(currentVersion, settings.getLastVersion()); } - TEST_F(LootSettings, toYamlShouldOutputStoredSettings) { + TEST_F(LootSettingsTest, toYamlShouldOutputStoredSettings) { const bool enableDebugLogging = true; const bool updateMasterlist = true; const std::string game = "Oblivion"; diff --git a/src/tests/gui/test_loot_state.h b/src/tests/gui/test_loot_state.h index 6799cd56..e4ebc89f 100644 --- a/src/tests/gui/test_loot_state.h +++ b/src/tests/gui/test_loot_state.h @@ -31,40 +31,40 @@ along with LOOT. If not, see namespace loot { namespace test { - class LootState : public ::testing::Test { + class LootStateTest : public ::testing::Test { protected: - loot::LootState lootState; + LootState lootState; }; - TEST_F(LootState, hasUnappliedChangesShouldBeFalseByDefault) { + TEST_F(LootStateTest, hasUnappliedChangesShouldBeFalseByDefault) { EXPECT_FALSE(lootState.hasUnappliedChanges()); } - TEST_F(LootState, shouldNotHaveUnappliedChangesIfCounterIsDeccremented) { + TEST_F(LootStateTest, shouldNotHaveUnappliedChangesIfCounterIsDeccremented) { lootState.decrementUnappliedChangeCounter(); EXPECT_FALSE(lootState.hasUnappliedChanges()); } - TEST_F(LootState, shouldHaveUnappliedChangesIfCounterIsIncremented) { + TEST_F(LootStateTest, shouldHaveUnappliedChangesIfCounterIsIncremented) { lootState.incrementUnappliedChangeCounter(); EXPECT_TRUE(lootState.hasUnappliedChanges()); } - TEST_F(LootState, incrementingTheChangeCounterMoreThanItIsDecrementedShouldLeaveUnappliedChanges) { + TEST_F(LootStateTest, incrementingTheChangeCounterMoreThanItIsDecrementedShouldLeaveUnappliedChanges) { lootState.incrementUnappliedChangeCounter(); lootState.incrementUnappliedChangeCounter(); lootState.decrementUnappliedChangeCounter(); EXPECT_TRUE(lootState.hasUnappliedChanges()); } - TEST_F(LootState, incrementingTheChangeCounterLessThanItIsDecrementedShouldLeaveNoUnappliedChanges) { + TEST_F(LootStateTest, incrementingTheChangeCounterLessThanItIsDecrementedShouldLeaveNoUnappliedChanges) { lootState.incrementUnappliedChangeCounter(); lootState.decrementUnappliedChangeCounter(); lootState.decrementUnappliedChangeCounter(); EXPECT_FALSE(lootState.hasUnappliedChanges()); } - TEST_F(LootState, incrementingTheChangeCounterThenDecrementingItEquallyShouldLeaveNoUnappliedChanges) { + TEST_F(LootStateTest, incrementingTheChangeCounterThenDecrementingItEquallyShouldLeaveNoUnappliedChanges) { lootState.incrementUnappliedChangeCounter(); lootState.incrementUnappliedChangeCounter(); lootState.decrementUnappliedChangeCounter(); diff --git a/src/tests/printers.h b/src/tests/printers.h index e521eddd..a5f105a2 100644 --- a/src/tests/printers.h +++ b/src/tests/printers.h @@ -39,65 +39,67 @@ along with LOOT. If not, see #include "backend/plugin/plugin.h" namespace loot { - void PrintTo(const File& value, ::std::ostream* os) { - *os << "loot::File(\"" << value.Name() << "\", " - << "\"" << value.DisplayName() << "\", " - << "\"" << value.Condition() << "\"" - << ")"; - } + namespace test { + void PrintTo(const File& value, ::std::ostream* os) { + *os << "File(\"" << value.Name() << "\", " + << "\"" << value.DisplayName() << "\", " + << "\"" << value.Condition() << "\"" + << ")"; + } - void PrintTo(const Location& value, ::std::ostream* os) { - *os << "loot::Location(\"" << value.URL() << "\", " - << "\"" << value.Name() << "\", " - << ")"; - } + void PrintTo(const Location& value, ::std::ostream* os) { + *os << "Location(\"" << value.URL() << "\", " + << "\"" << value.Name() << "\", " + << ")"; + } - void PrintTo(const Message& value, ::std::ostream* os) { - std::string type; - if (value.Type() == Message::warn) - type = "warn"; - else if (value.Type() == Message::error) - type = "error"; - else - type = "say"; + void PrintTo(const Message& value, ::std::ostream* os) { + std::string type; + if (value.Type() == Message::warn) + type = "warn"; + else if (value.Type() == Message::error) + type = "error"; + else + type = "say"; - *os << "loot::Message(\"" << type << "\", " - << ::testing::PrintToString(value.Content()) << ", " - << "\"" << value.Condition() << "\"" - << ")"; - } + *os << "Message(\"" << type << "\", " + << ::testing::PrintToString(value.Content()) << ", " + << "\"" << value.Condition() << "\"" + << ")"; + } - void PrintTo(const MessageContent& value, ::std::ostream* os) { - *os << "loot::MessageContent(\"" << value.Str() << "\", " - << "\"" << Language(value.Language()).Name() << "\"" - << ")"; - } + void PrintTo(const MessageContent& value, ::std::ostream* os) { + *os << "MessageContent(\"" << value.Str() << "\", " + << "\"" << Language(value.Language()).Name() << "\"" + << ")"; + } - void PrintTo(const PluginDirtyInfo& value, ::std::ostream* os) { - *os << "loot::PluginDirtyInfo(0x" - << std::hex << std::uppercase - << value.CRC() - << std::nouppercase << std::dec << ", " - << value.ITMs() << ", " - << value.DeletedRefs() << ", " - << value.DeletedNavmeshes() << ", " - << "\"" << value.CleaningUtility() << "\"" - << ")"; - } + void PrintTo(const PluginDirtyInfo& value, ::std::ostream* os) { + *os << "PluginDirtyInfo(0x" + << std::hex << std::uppercase + << value.CRC() + << std::nouppercase << std::dec << ", " + << value.ITMs() << ", " + << value.DeletedRefs() << ", " + << value.DeletedNavmeshes() << ", " + << "\"" << value.CleaningUtility() << "\"" + << ")"; + } - void PrintTo(const PluginMetadata& value, ::std::ostream* os) { - *os << "loot::PluginMetadata(\"" << value.Name() << "\")"; - } + void PrintTo(const PluginMetadata& value, ::std::ostream* os) { + *os << "PluginMetadata(\"" << value.Name() << "\")"; + } - void PrintTo(const Tag& value, ::std::ostream* os) { - *os << "loot::Tag(\"" << value.Name() << "\", " - << value.IsAddition() << ", " - << "\"" << value.Condition() << "\"" - << ")"; - } + void PrintTo(const Tag& value, ::std::ostream* os) { + *os << "Tag(\"" << value.Name() << "\", " + << value.IsAddition() << ", " + << "\"" << value.Condition() << "\"" + << ")"; + } - void PrintTo(const Plugin& value, ::std::ostream* os) { - *os << "loot::Plugin(\"" << value.Name() << "\")"; + void PrintTo(const Plugin& value, ::std::ostream* os) { + *os << "Plugin(\"" << value.Name() << "\")"; + } } }