4#include "testing/testing.h"
37 ID *prev_id =
nullptr;
40 if (prev_id !=
nullptr) {
48TEST(lib_id_main_sort, local_ids_1)
78TEST(lib_id_main_sort, linked_ids_1)
114TEST(lib_id_main_unique_name, local_ids_rename_existing_never)
134 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
135 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
148 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
149 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
163 EXPECT_STREQ(future_name,
"OB_B.001");
165 STRNCPY(future_name,
"OB_BBBB");
167 EXPECT_STREQ(future_name,
"OB_BBBB");
168 constexpr char long_name[] =
169 "OB_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
170 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
171 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
172 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
174 "Wrong 'max length' name");
175 constexpr char long_name_shorten[] =
176 "OB_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
177 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
178 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
179 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
181 "Wrong 'max length' name");
183 STRNCPY(future_name, long_name);
185 EXPECT_STREQ(id_a->
name + 2, future_name);
186 EXPECT_STREQ(future_name, long_name);
188 EXPECT_STREQ(future_name, long_name_shorten);
191TEST(lib_id_main_unique_name, local_ids_rename_existing_always)
210 EXPECT_STREQ(id_c->
name + 2,
"OB_A");
211 EXPECT_STREQ(id_a->
name + 2,
"OB_A.001");
223 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
224 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
234TEST(lib_id_main_unique_name, local_ids_rename_existing_same_root)
254 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
255 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
267 EXPECT_STREQ(id_c->
name + 2,
"OB_A");
268 EXPECT_STREQ(id_a->
name + 2,
"OB_A.001");
278TEST(lib_id_main_unique_name, linked_ids_1)
297 EXPECT_STREQ(id_b->
name + 2,
"OB_A.001");
298 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
308 EXPECT_STREQ(id_b->
name + 2,
"OB_A");
309 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
329TEST(lib_id_main_global_unique_name, linked_ids_1)
349 EXPECT_STREQ(id_b->
name + 2,
"OB_A.001");
350 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
360 EXPECT_STREQ(id_b->
name + 2,
"OB_C.001");
361 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
362 EXPECT_STREQ(id_c->
name + 2,
"OB_C");
364 EXPECT_STREQ(id_b->
name + 2,
"OB_C.001");
365 EXPECT_STREQ(id_a->
name + 2,
"OB_C.002");
366 EXPECT_STREQ(id_c->
name + 2,
"OB_C");
374 EXPECT_STREQ(id_b->
name + 2,
"OB_C");
375 EXPECT_STREQ(id_a->
name + 2,
"OB_C.002");
376 EXPECT_STREQ(id_c->
name + 2,
"OB_C");
384TEST(lib_id_main_unique_name, ids_sorted_by_default)
407TEST(lib_id_main_unique_name, ids_sorted_by_default_with_libraries)
431TEST(lib_id_main_unique_name, name_too_long_handling)
434 constexpr char name_a[] =
435 "Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated_"
436 "Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated_"
437 "Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated_"
438 "Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated";
440 "Wrong 'max length' name");
441 constexpr char name_a_shorten[] =
442 "Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated_"
443 "Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated_"
444 "Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated_"
445 "Long_Name_That_Does_Not_Fit_Into_Max";
447 "Wrong 'max length' name");
448 constexpr char name_b[] =
449 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix_____"
450 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix_____"
451 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix_____"
452 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix.123456";
454 "Wrong 'max length' name");
455 constexpr char name_b_shorten[] =
456 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix_____"
457 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix_____"
458 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix_____"
459 "Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix.123";
461 "Wrong 'max length' name");
462 constexpr char name_c[] =
"Name_That_Has_Too_Long_Number_Suffix.1234567890";
464 "Wrong 'max length' name");
479TEST(lib_id_main_unique_name, create_equivalent_numeric_suffixes)
498 EXPECT_STREQ(id_a->
name + 2,
"Foo.123");
499 EXPECT_STREQ(id_b->
name + 2,
"Foo.000");
500 EXPECT_STREQ(id_c->
name + 2,
"Foo.003");
501 EXPECT_STREQ(id_d->
name + 2,
"Foo.3");
502 EXPECT_STREQ(id_e->
name + 2,
"Foo.0");
503 EXPECT_STREQ(id_f->
name + 2,
"Foo.");
504 EXPECT_STREQ(id_g->
name + 2,
"Foo.0123");
505 EXPECT_STREQ(id_h->
name + 2,
"Foo");
506 EXPECT_STREQ(id_i->
name + 2,
"Foo..");
507 EXPECT_STREQ(id_j->
name + 2,
"Foo..001");
508 EXPECT_STREQ(id_k->
name + 2,
"Foo..000");
525 EXPECT_STREQ(id_a->
name + 2,
"Foo.001");
526 EXPECT_STREQ(id_b->
name + 2,
"Foo.002");
527 EXPECT_STREQ(id_c->
name + 2,
"Foo.004");
528 EXPECT_STREQ(id_d->
name + 2,
"Foo.005");
529 EXPECT_STREQ(id_e->
name + 2,
"Foo.006");
530 EXPECT_STREQ(id_f->
name + 2,
"Foo..002");
531 EXPECT_STREQ(id_g->
name + 2,
"Foo.007");
532 EXPECT_STREQ(id_h->
name + 2,
"Foo.008");
533 EXPECT_STREQ(id_i->
name + 2,
"Foo...001");
534 EXPECT_STREQ(id_j->
name + 2,
"Foo..003");
535 EXPECT_STREQ(id_k->
name + 2,
"Foo..004");
542TEST(lib_id_main_unique_name, re_create_equivalent_numeric_suffixes)
591TEST(lib_id_main_unique_name, zero_suffix_is_never_assigned)
601 EXPECT_STREQ(id_002->
name + 2,
"Foo.002");
602 EXPECT_STREQ(id_001->
name + 2,
"Foo.001");
603 EXPECT_STREQ(id_003->
name + 2,
"Foo.003");
610TEST(lib_id_main_unique_name, remove_after_dup_get_original_name)
617 EXPECT_STREQ(id_a->
name + 2,
"Foo");
618 EXPECT_STREQ(id_b->
name + 2,
"Foo.001");
624 EXPECT_STREQ(id_a->
name + 2,
"Foo");
631TEST(lib_id_main_unique_name, name_number_suffix_assignment)
636 const int total_object_count = 1200;
637 ID *ids[total_object_count] = {};
638 for (
int i = 0;
i < total_object_count / 2; ++
i) {
643 EXPECT_STREQ(ids[0]->
name + 2,
"Foo");
644 EXPECT_STREQ(ids[1]->
name + 2,
"Foo.001");
645 EXPECT_STREQ(ids[total_object_count / 2 - 1]->
name + 2,
"Foo.599");
658 EXPECT_STREQ(id_010->
name + 2,
"Foo.010");
660 EXPECT_STREQ(id_020->
name + 2,
"Foo.020");
663 EXPECT_STREQ(id_2000->
name + 2,
"Foo.2000");
666 EXPECT_STREQ(id_030->
name + 2,
"Foo.030");
668 EXPECT_STREQ(id_600->
name + 2,
"Foo.600");
674 EXPECT_STREQ(id_max->
name + 2,
"Foo.999999999");
677 EXPECT_STREQ(id_max1->
name + 2,
"Foo.601");
686 for (
int i = total_object_count / 2;
i < total_object_count; ++
i) {
696 EXPECT_STREQ(
BKE_id_name(*id_foo_001_178),
"Foo_001.178");
698 EXPECT_STREQ(
BKE_id_name(*id_foo_001_179),
"Foo_001.179");
700 EXPECT_STREQ(
BKE_id_name(*id_foo_001_180),
"Foo_001.180");
703 for (
int i = 0;
i < total_object_count; ++
i) {
708 EXPECT_STREQ(
BKE_id_name(*id_max),
"ALongerName.999999999");
711 EXPECT_STREQ(
BKE_id_name(*id_alongernam),
"ALongerNam");
713 EXPECT_STREQ(
BKE_id_name(*id_alongernam001),
"ALongerNam.001");
720TEST(lib_id_main_unique_name, renames_with_duplicates)
728 EXPECT_STREQ(id_a->
name + 2,
"Foo");
729 EXPECT_STREQ(id_b->
name + 2,
"Foo.001");
730 EXPECT_STREQ(id_c->
name + 2,
"Bar");
735 EXPECT_STREQ(id_a->
name + 2,
"Foo.002");
737 EXPECT_STREQ(id_b->
name + 2,
"Bar.001");
739 EXPECT_STREQ(id_c->
name + 2,
"Foo");
741 EXPECT_STREQ(id_b->
name + 2,
"Bar");
748TEST(lib_id_main_unique_name, names_are_unique_per_id_type)
756 EXPECT_STREQ(id_a->
name + 2,
"Foo");
757 EXPECT_STREQ(id_b->
name + 2,
"Foo");
758 EXPECT_STREQ(id_c->
name + 2,
"Foo.001");
765TEST(lib_id_main_unique_name, name_huge_number_suffix)
772 EXPECT_STREQ(id_a->
name + 2,
"SuperLong.1234567890");
775 EXPECT_STREQ(id_b->
name + 2,
"SuperLong.001");
792 EXPECT_NE(br_a->
newid,
nullptr);
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
@ LIB_ID_MAKELOCAL_FORCE_COPY
void BKE_id_free(Main *bmain, void *idv)
void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint)
IDNewNameResult BKE_libblock_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags)
void * BKE_id_new(Main *bmain, short type, const char *name)
const char * BKE_id_name(const ID &id)
void BKE_main_free(Main *bmain)
void BKE_main_namemap_remove_id(Main &bmain, ID &id)
bool BKE_main_namemap_get_unique_name(Main &bmain, ID &id, char *r_name)
bool BKE_main_global_namemap_get_unique_name(Main &bmain, ID &id, char *r_name)
bool BKE_main_namemap_validate(Main &bmain)
#define BLI_STATIC_ASSERT(a, msg)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
char * STRNCPY(char(&dst)[N], const char *src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
ID and Library types, which are fundamental for SDNA.
static ID * add_id_in_library(Main *bmain, const char *name, Library *lib)
static void change_lib(Main *bmain, ID *id, Library *lib)
TEST(action_groups, ReconstructGroupsWithReordering)
static void change_name_global(Main *bmain, ID *id, const char *name)
static IDNewNameResult change_name(Main *bmain, ID *id, const char *name, const IDNewNameMode mode)
static void test_lib_id_main_sort_check_order(std::initializer_list< ID * > list)
@ RENAMED_COLLISION_FORCED
@ RENAMED_COLLISION_ADJUSTED
UniqueName_Map * name_map_global
~LibIDMainSortTestContext()
LibIDMainSortTestContext()
static DynamicLibrary lib