Commit: e8eb5d8a7c603cbbfb5d97a77bfc0dd93fccb663 Author: Julian Eisel Date: Thu Sep 2 15:23:08 2021 +0200 Branches: temp-asset-browser-catalogs https://developer.blender.org/rBe8eb5d8a7c603cbbfb5d97a77bfc0dd93fccb663
Add tests for catalog tree Removes the printing of the catalog tree. Also adds and tests a function to get the full catalog path from a tree item. =================================================================== M source/blender/blenkernel/BKE_asset_catalog.hh M source/blender/blenkernel/intern/asset_catalog.cc M source/blender/blenkernel/intern/asset_catalog_test.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_asset_catalog.hh b/source/blender/blenkernel/BKE_asset_catalog.hh index d978868c7da..8ee7395af4c 100644 --- a/source/blender/blenkernel/BKE_asset_catalog.hh +++ b/source/blender/blenkernel/BKE_asset_catalog.hh @@ -70,6 +70,8 @@ class AssetCatalogService { /** For testing only, get the loaded catalog definition file. */ AssetCatalogDefinitionFile *get_catalog_definition_file(); + AssetCatalogTree *get_catalog_tree(); + /** Return true iff there are no catalogs known. */ bool is_empty() const; @@ -101,7 +103,6 @@ class AssetCatalogService { bool ensure_asset_library_root(); std::unique_ptr<AssetCatalogTree> read_into_tree(); - void print_tree(); }; class AssetCatalogTreeItem { @@ -114,6 +115,9 @@ class AssetCatalogTreeItem { AssetCatalogTreeItem(StringRef name, const AssetCatalogTreeItem *parent = nullptr); StringRef get_name() const; + /** Return the full catalog path, defined as the name of this catalog prefixed by the full + * catalog path of its parent and a separator. */ + CatalogPath catalog_path() const; int count_parents() const; static void foreach_item_recursive(const ChildSet &children_, const ItemIterFn callback); diff --git a/source/blender/blenkernel/intern/asset_catalog.cc b/source/blender/blenkernel/intern/asset_catalog.cc index 60c15804be4..5e24ba30e55 100644 --- a/source/blender/blenkernel/intern/asset_catalog.cc +++ b/source/blender/blenkernel/intern/asset_catalog.cc @@ -143,7 +143,6 @@ void AssetCatalogService::load_from_disk(const CatalogFilePath &file_or_director /* TODO: Should there be a sanitize step? E.g. to remove catalogs with identical paths? */ catalog_tree_ = read_into_tree(); - print_tree(); } void AssetCatalogService::load_directory_recursive(const CatalogFilePath &directory_path) @@ -239,6 +238,8 @@ std::unique_ptr<AssetCatalogTree> AssetCatalogService::read_into_tree() /* Go through the catalogs, insert each path component into the tree where needed. */ for (auto &catalog : catalogs_.values()) { + /* #fs::path adds useful behavior to the path. Remember that on Windows it uses "\" as + * separator! For catalogs it should always be "/". Use #fs::path::generic_string if needed. */ fs::path catalog_path = catalog->path; const AssetCatalogTreeItem *parent = nullptr; @@ -263,18 +264,6 @@ std::unique_ptr<AssetCatalogTree> AssetCatalogService::read_into_tree() return tree; } -/* TODO just for testing. */ -void AssetCatalogService::print_tree() -{ - std::cout << "==== Printing Catalog Tree: ====" << std::endl; - catalog_tree_->foreach_item([](const AssetCatalogTreeItem &item) { - for (int i = 0; i < item.count_parents(); i++) { - std::cout << " "; - } - std::cout << item.get_name() << std::endl; - }); -} - AssetCatalogTreeItem::AssetCatalogTreeItem(StringRef name, const AssetCatalogTreeItem *parent) : name_(name), parent_(parent) { @@ -285,6 +274,15 @@ StringRef AssetCatalogTreeItem::get_name() const return name_; } +CatalogPath AssetCatalogTreeItem::catalog_path() const +{ + std::string current_path = name_; + for (const AssetCatalogTreeItem *parent = parent_; parent; parent = parent->parent_) { + current_path = parent->name_ + AssetCatalogService::PATH_SEPARATOR + current_path; + } + return current_path; +} + int AssetCatalogTreeItem::count_parents() const { int i = 0; @@ -313,6 +311,11 @@ AssetCatalogDefinitionFile *AssetCatalogService::get_catalog_definition_file() return catalog_definition_file_.get(); } +AssetCatalogTree *AssetCatalogService::get_catalog_tree() +{ + return catalog_tree_.get(); +} + bool AssetCatalogDefinitionFile::contains(const CatalogID &catalog_id) const { return catalogs_.contains(catalog_id); diff --git a/source/blender/blenkernel/intern/asset_catalog_test.cc b/source/blender/blenkernel/intern/asset_catalog_test.cc index 856008e0537..e547da86ccd 100644 --- a/source/blender/blenkernel/intern/asset_catalog_test.cc +++ b/source/blender/blenkernel/intern/asset_catalog_test.cc @@ -93,6 +93,45 @@ TEST_F(AssetCatalogTest, load_single_file) EXPECT_EQ("character/Ružena/poselib", poses_ruzena->path); } +static int count_path_parents(const fs::path &path) +{ + int counter = 0; + for (fs::path segment : path.parent_path()) { + counter++; + } + return counter; +} + +TEST_F(AssetCatalogTest, load_single_file_into_tree) +{ + AssetCatalogService service(asset_library_root_); + service.load_from_disk(asset_library_root_ / "blender_assets.cats.txt"); + + std::vector<fs::path> expected_paths{ + "character", + "character/Elly", + "character/Elly/poselib", + "character/Elly/poselib/white space", + "character/Ružena", + "character/Ružena/poselib", + "character/Ružena/poselib/face", + "character/Ružena/poselib/hand", + }; + + AssetCatalogTree *tree = service.get_catalog_tree(); + + int i = 0; + tree->foreach_item([&](const AssetCatalogTreeItem &actual_item) { + /* Is the catalog name as expected? "character", "Elly", ... */ + EXPECT_EQ(expected_paths[i].filename().string(), actual_item.get_name()); + /* Does the amount of parents match? */ + EXPECT_EQ(count_path_parents(expected_paths[i]), actual_item.count_parents()); + EXPECT_EQ(expected_paths[i].generic_string(), actual_item.catalog_path()); + + i++; + }); +} + TEST_F(AssetCatalogTest, write_single_file) { AssetCatalogService service(asset_library_root_); _______________________________________________ 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