Blender V4.5
main_namemap_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include <ranges>
6
7#include "testing/testing.h"
8
9#include "CLG_log.h"
10
11#include "BLI_array.hh"
12#include "BLI_listbase.h"
13#include "BLI_path_utils.hh"
14#include "BLI_string.h"
15
16#include "BKE_collection.hh"
17#include "BKE_idtype.hh"
18#include "BKE_lib_id.hh"
19#include "BKE_library.hh"
20#include "BKE_main.hh"
21#include "BKE_main_namemap.hh"
22
23#include "DNA_ID.h"
25#include "DNA_object_types.h"
26
27namespace blender::bke::tests {
28
29/* TODO: Move here most tests from python `bl_id_management.py`, as some lower-level advanced
30 * features are not exposed to RNA/bpy. */
31
32class BMainNameMapTest : public testing::Test {
33 public:
34 static void SetUpTestSuite()
35 {
36 CLG_init();
38 }
39 static void TearDownTestSuite()
40 {
41 CLG_exit();
42 }
43
44 void SetUp() override
45 {
47 }
48
49 void TearDown() override
50 {
51 if (bmain) {
53 }
54 }
55
57};
58
59TEST_F(BMainNameMapTest, global_map_uniqueness)
60{
61 EXPECT_TRUE(BLI_listbase_is_empty(&bmain->libraries));
62 EXPECT_TRUE(BLI_listbase_is_empty(&bmain->collections));
63 EXPECT_TRUE(BLI_listbase_is_empty(&bmain->objects));
64
65 Library *lib_1 = BKE_id_new<Library>(bmain, "Library");
66 EXPECT_STREQ(BKE_id_name(lib_1->id), "Library");
67
68 Library *lib_2 = BKE_id_new<Library>(bmain, "Library");
69 EXPECT_STREQ(BKE_id_name(lib_2->id), "Library.001");
70
71 Collection *coll_1 = BKE_id_new<Collection>(bmain, "IDName");
72 EXPECT_STREQ(BKE_id_name(coll_1->id), "IDName");
73
74 Collection *coll_2 = BKE_id_new<Collection>(bmain, "IDName");
75 EXPECT_STREQ(BKE_id_name(coll_2->id), "IDName.001");
76
77 Object *ob_1 = BKE_id_new<Object>(bmain, "IDName");
78 EXPECT_STREQ(BKE_id_name(ob_1->id), "IDName");
79
80 Object *ob_2 = BKE_id_new<Object>(bmain, "IDName");
81 EXPECT_STREQ(BKE_id_name(ob_2->id), "IDName.001");
82
83 Object *ob_1_lib_1 = static_cast<Object *>(BKE_id_new_in_lib(bmain, lib_1, ID_OB, "IDName"));
84 EXPECT_STREQ(BKE_id_name(ob_1_lib_1->id), "IDName");
85
86 Object *ob_2_lib_1 = static_cast<Object *>(BKE_id_new_in_lib(bmain, lib_1, ID_OB, "IDName"));
87 EXPECT_STREQ(BKE_id_name(ob_2_lib_1->id), "IDName.001");
88
89 Object *ob_1_lib_2 = static_cast<Object *>(BKE_id_new_in_lib(bmain, lib_2, ID_OB, "IDName"));
90 EXPECT_STREQ(BKE_id_name(ob_1_lib_2->id), "IDName");
91
92 Object *ob_2_lib_2 = static_cast<Object *>(BKE_id_new_in_lib(bmain, lib_2, ID_OB, "IDName"));
93 EXPECT_STREQ(BKE_id_name(ob_2_lib_2->id), "IDName.001");
94
95 Object *ob_3_lib_2 = static_cast<Object *>(BKE_id_new_in_lib(bmain, lib_2, ID_OB, "IDName.003"));
96 EXPECT_STREQ(BKE_id_name(ob_3_lib_2->id), "IDName.003");
97
98 /* Generate a globally unique name for `ob_1_lib_1`. */
99 BKE_main_namemap_remove_id(*bmain, ob_1_lib_1->id);
100 // BLI_strncpy(ob_1_lib_1->id.name + 2, "IDName", MAX_ID_NAME - 2);
101 BKE_main_global_namemap_get_unique_name(*bmain, ob_1_lib_1->id, BKE_id_name(ob_1_lib_1->id));
102 id_sort_by_name(which_libbase(bmain, GS(ob_1_lib_1->id.name)), &ob_1_lib_1->id, nullptr);
103 EXPECT_STREQ(BKE_id_name(ob_1_lib_1->id), "IDName.002");
104
105 /* Generate a globally unique name for `ob_2_lib_1`. */
106 BKE_main_namemap_remove_id(*bmain, ob_2_lib_1->id);
107 // BLI_strncpy(ob_2_lib_1->id.name + 2, "IDName", MAX_ID_NAME - 2);
108 BKE_main_global_namemap_get_unique_name(*bmain, ob_2_lib_1->id, BKE_id_name(ob_2_lib_1->id));
109 id_sort_by_name(which_libbase(bmain, GS(ob_2_lib_1->id.name)), &ob_2_lib_1->id, nullptr);
110 EXPECT_STREQ(BKE_id_name(ob_2_lib_1->id), "IDName.004");
111}
112
113} // namespace blender::bke::tests
void BKE_idtype_init()
Definition idtype.cc:122
void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint)
Definition lib_id.cc:1770
void * BKE_id_new_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name)
Definition lib_id.cc:1477
void * BKE_id_new(Main *bmain, short type, const char *name)
Definition lib_id.cc:1495
const char * BKE_id_name(const ID &id)
ListBase * which_libbase(Main *bmain, short type)
Definition main.cc:887
Main * BKE_main_new()
Definition main.cc:48
void BKE_main_free(Main *bmain)
Definition main.cc:175
void BKE_main_namemap_remove_id(Main &bmain, ID &id)
bool BKE_main_global_namemap_get_unique_name(Main &bmain, ID &id, char *r_name)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void CLG_exit(void)
Definition clog.c:704
void CLG_init(void)
Definition clog.c:697
ID and Library types, which are fundamental for SDNA.
@ ID_OB
Object groups, one object can be in many groups at once.
Object is a sort of wrapper for general info.
#define GS(a)
TEST_F(BKE_armature_find_selected_bones_test, some_bones_selected)
char name[66]
Definition DNA_ID.h:415
ID id
Definition DNA_ID.h:505