Commit: 6d7a301b0440716a740791f47c9d6322583aee58 Author: Julian Eisel Date: Wed Sep 28 12:47:44 2022 +0200 Branches: blender-projects-basics https://developer.blender.org/rB6d7a301b0440716a740791f47c9d6322583aee58
Test project paths with unicode characters & trailing slashes =================================================================== M source/blender/blenkernel/intern/project_settings_test.cc =================================================================== diff --git a/source/blender/blenkernel/intern/project_settings_test.cc b/source/blender/blenkernel/intern/project_settings_test.cc index ccd9ca26812..ce11cce4c4d 100644 --- a/source/blender/blenkernel/intern/project_settings_test.cc +++ b/source/blender/blenkernel/intern/project_settings_test.cc @@ -5,81 +5,102 @@ #include "BKE_project_settings.hh" #include "BLI_fileops.h" +#include "BLI_function_ref.hh" #include "testing/testing.h" namespace blender::bke::tests { class ProjectSettingsTest : public testing::Test { - public: - std::string temp_project_root_path_; + struct ProjectDirectoryRAIIWrapper { + std::string project_path_; + + ProjectDirectoryRAIIWrapper(StringRefNull project_path) + { + /** Assert would be preferable but that would only run in debug builds, and #ASSERT_TRUE() + * doesn't support printing a message. */ + if (BLI_exists(project_path.c_str())) { + throw std::runtime_error("Can't execute test, temporary path '" + project_path + + "' already exists"); + } + + BLI_dir_create_recursive(project_path.c_str()); + if (!BLI_exists(project_path.c_str())) { + throw std::runtime_error("Can't execute test, failed to create path '" + project_path + + "'"); + } + project_path_ = project_path; + } - void TearDown() override - { - if (!temp_project_root_path_.empty()) { - BLI_delete(temp_project_root_path_.c_str(), true, true); - temp_project_root_path_ = ""; + ~ProjectDirectoryRAIIWrapper() + { + if (!project_path_.empty()) { + BLI_delete(project_path_.c_str(), true, true); + } } - } + }; - StringRefNull create_temp_project_path() + public: + /* Run the test on multiple paths or variations of the same path. Useful to test things like + * unicode paths, with or without trailing slash, etc. */ + void test_foreach_project_path(FunctionRef<void(StringRefNull)> fn) { - BKE_tempdir_init(""); - const std::string tempdir = BKE_tempdir_session(); - temp_project_root_path_ = tempdir + "test-temporary-project-root"; + std::vector<StringRefNull> subpaths = { + "temporary-project-root", + "test-temporary-unicode-dir-Ružena/temporary-project-root", + /* Same but with trailing slash. */ + "test-temporary-unicode-dir-Ružena/temporary-project-root/", + }; - /** Assert would be preferable but that would only run in debug builds, and #ASSERT_TRUE() - * doesn't support printing a message. */ - if (BLI_exists(temp_project_root_path_.c_str())) { - throw std::runtime_error("Can't execute test, temporary path '" + temp_project_root_path_ + - "' already exists"); - } + BKE_tempdir_init(""); - BLI_dir_create_recursive(temp_project_root_path_.c_str()); - if (!BLI_exists(temp_project_root_path_.c_str())) { - throw std::runtime_error("Can't execute test, failed to create path '" + - temp_project_root_path_ + "'"); + const std::string tempdir = BKE_tempdir_session(); + for (StringRefNull subpath : subpaths) { + ProjectDirectoryRAIIWrapper temp_project_path(tempdir + subpath); + fn(temp_project_path.project_path_); } - return temp_project_root_path_; } }; TEST_F(ProjectSettingsTest, create) { - StringRefNull project_path = create_temp_project_path(); - - if (!ProjectSettings::create_settings_directory(project_path)) { - /* Not a regular test failure, this may fail if there is a permission issue for example. */ - FAIL() << "Failed to create project directory in '" << project_path << "', check permissions"; - } - std::string project_settings_dir = project_path + "/" + ProjectSettings::SETTINGS_DIRNAME; - EXPECT_TRUE(BLI_exists(project_settings_dir.c_str())) - << project_settings_dir + " was not created"; + test_foreach_project_path([](StringRefNull project_path) { + if (!ProjectSettings::create_settings_directory(project_path)) { + /* Not a regular test failure, this may fail if there is a permission issue for example. */ + FAIL() << "Failed to create project directory in '" << project_path + << "', check permissions"; + } + std::string project_settings_dir = project_path + "/" + ProjectSettings::SETTINGS_DIRNAME; + EXPECT_TRUE(BLI_exists(project_settings_dir.c_str())) + << project_settings_dir + " was not created"; + }); } /* Load the project by pointing to the project root directory (as opposed to the .blender_project * directory). */ -TEST_F(ProjectSettingsTest, load_project_root) +TEST_F(ProjectSettingsTest, load_from_project_root_path) { - StringRefNull project_path = create_temp_project_path(); - ProjectSettings::create_settings_directory(project_path); + test_foreach_project_path([](StringRefNull project_path) { + ProjectSettings::create_settings_directory(project_path); - std::unique_ptr project_settings = ProjectSettings::load_from_disk(project_path); - EXPECT_NE(project_settings, nullptr); - EXPECT_EQ(project_settings->project_root_path(), project_path); + std::unique_ptr project_settings = ProjectSettings::load_from_disk(project_path); + EXPECT_NE(project_settings, nullptr); + EXPECT_EQ(project_settings->project_root_path(), project_path); + }); } -/* Load the project by pointing to the .blender_project directory (ass opposed to the project root +/* Load the project by pointing to the .blender_project directory (as opposed to the project root * directory). */ -TEST_F(ProjectSettingsTest, load_project_settings_dir) +TEST_F(ProjectSettingsTest, load_from_project_settings_path) { - StringRefNull project_path = create_temp_project_path(); - ProjectSettings::create_settings_directory(project_path); - - std::unique_ptr project_settings = ProjectSettings::load_from_disk( - project_path + "/" + ProjectSettings::SETTINGS_DIRNAME); - EXPECT_NE(project_settings, nullptr); - EXPECT_EQ(project_settings->project_root_path(), project_path); + test_foreach_project_path([](StringRefNull project_path) { + ProjectSettings::create_settings_directory(project_path); + + std::unique_ptr project_settings = ProjectSettings::load_from_disk( + project_path + "/" + ProjectSettings::SETTINGS_DIRNAME); + EXPECT_NE(project_settings, nullptr); + EXPECT_EQ(project_settings->project_root_path(), project_path); + }); } } // namespace blender::bke::tests _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs