4#include "testing/testing.h"
35 ID *prev_id =
nullptr;
38 if (prev_id !=
nullptr) {
46TEST(lib_id_main_sort, local_ids_1)
76TEST(lib_id_main_sort, linked_ids_1)
112TEST(lib_id_main_unique_name, local_ids_rename_existing_never)
132 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
133 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
146 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
147 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
161 EXPECT_STREQ(future_name,
"OB_B.001");
163 STRNCPY(future_name,
"OB_BBBB");
165 EXPECT_STREQ(future_name,
"OB_BBBB");
167 STRNCPY(future_name,
"OB_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
169 EXPECT_STREQ(id_a->
name + 2, future_name);
170 EXPECT_STREQ(future_name,
"OB_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
172 EXPECT_STREQ(future_name,
"OB_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
175TEST(lib_id_main_unique_name, local_ids_rename_existing_always)
194 EXPECT_STREQ(id_c->
name + 2,
"OB_A");
195 EXPECT_STREQ(id_a->
name + 2,
"OB_A.001");
207 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
208 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
218TEST(lib_id_main_unique_name, local_ids_rename_existing_same_root)
238 EXPECT_STREQ(id_c->
name + 2,
"OB_A.001");
239 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
251 EXPECT_STREQ(id_c->
name + 2,
"OB_A");
252 EXPECT_STREQ(id_a->
name + 2,
"OB_A.001");
262TEST(lib_id_main_unique_name, linked_ids_1)
281 EXPECT_STREQ(id_b->
name + 2,
"OB_A.001");
282 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
292 EXPECT_STREQ(id_b->
name + 2,
"OB_A");
293 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
313TEST(lib_id_main_global_unique_name, linked_ids_1)
333 EXPECT_STREQ(id_b->
name + 2,
"OB_A.001");
334 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
344 EXPECT_STREQ(id_b->
name + 2,
"OB_C.001");
345 EXPECT_STREQ(id_a->
name + 2,
"OB_A");
346 EXPECT_STREQ(id_c->
name + 2,
"OB_C");
348 EXPECT_STREQ(id_b->
name + 2,
"OB_C.001");
349 EXPECT_STREQ(id_a->
name + 2,
"OB_C.002");
350 EXPECT_STREQ(id_c->
name + 2,
"OB_C");
358 EXPECT_STREQ(id_b->
name + 2,
"OB_C");
359 EXPECT_STREQ(id_a->
name + 2,
"OB_C.002");
360 EXPECT_STREQ(id_c->
name + 2,
"OB_C");
368TEST(lib_id_main_unique_name, ids_sorted_by_default)
391TEST(lib_id_main_unique_name, ids_sorted_by_default_with_libraries)
415TEST(lib_id_main_unique_name, name_too_long_handling)
418 const char *name_a =
"Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_Truncated";
419 const char *name_b =
"Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix.123456";
420 const char *name_c =
"Name_That_Has_Too_Long_Number_Suffix.1234567890";
426 EXPECT_STREQ(id_a->
name + 2,
"Long_Name_That_Does_Not_Fit_Into_Max_Name_Limit_And_Should_Get_");
427 EXPECT_STREQ(id_b->
name + 2,
"Another_Long_Name_That_Does_Not_Fit_And_Has_A_Number_Suffix.123");
428 EXPECT_STREQ(id_c->
name + 2,
"Name_That_Has_Too_Long_Number_Suffix.1234567890");
435TEST(lib_id_main_unique_name, create_equivalent_numeric_suffixes)
454 EXPECT_STREQ(id_a->
name + 2,
"Foo.123");
455 EXPECT_STREQ(id_b->
name + 2,
"Foo.000");
456 EXPECT_STREQ(id_c->
name + 2,
"Foo.003");
457 EXPECT_STREQ(id_d->
name + 2,
"Foo.3");
458 EXPECT_STREQ(id_e->
name + 2,
"Foo.0");
459 EXPECT_STREQ(id_f->
name + 2,
"Foo.");
460 EXPECT_STREQ(id_g->
name + 2,
"Foo.0123");
461 EXPECT_STREQ(id_h->
name + 2,
"Foo");
462 EXPECT_STREQ(id_i->
name + 2,
"Foo..");
463 EXPECT_STREQ(id_j->
name + 2,
"Foo..001");
464 EXPECT_STREQ(id_k->
name + 2,
"Foo..000");
481 EXPECT_STREQ(id_a->
name + 2,
"Foo.001");
482 EXPECT_STREQ(id_b->
name + 2,
"Foo.002");
483 EXPECT_STREQ(id_c->
name + 2,
"Foo.004");
484 EXPECT_STREQ(id_d->
name + 2,
"Foo.005");
485 EXPECT_STREQ(id_e->
name + 2,
"Foo.006");
486 EXPECT_STREQ(id_f->
name + 2,
"Foo..002");
487 EXPECT_STREQ(id_g->
name + 2,
"Foo.007");
488 EXPECT_STREQ(id_h->
name + 2,
"Foo.008");
489 EXPECT_STREQ(id_i->
name + 2,
"Foo...001");
490 EXPECT_STREQ(id_j->
name + 2,
"Foo..003");
491 EXPECT_STREQ(id_k->
name + 2,
"Foo..004");
498TEST(lib_id_main_unique_name, re_create_equivalent_numeric_suffixes)
547TEST(lib_id_main_unique_name, zero_suffix_is_never_assigned)
557 EXPECT_STREQ(id_002->
name + 2,
"Foo.002");
558 EXPECT_STREQ(id_001->
name + 2,
"Foo.001");
559 EXPECT_STREQ(id_003->
name + 2,
"Foo.003");
566TEST(lib_id_main_unique_name, remove_after_dup_get_original_name)
573 EXPECT_STREQ(id_a->
name + 2,
"Foo");
574 EXPECT_STREQ(id_b->
name + 2,
"Foo.001");
580 EXPECT_STREQ(id_a->
name + 2,
"Foo");
587TEST(lib_id_main_unique_name, name_number_suffix_assignment)
592 const int total_object_count = 1200;
593 ID *ids[total_object_count] = {};
594 for (
int i = 0;
i < total_object_count / 2; ++
i) {
599 EXPECT_STREQ(ids[0]->name + 2,
"Foo");
600 EXPECT_STREQ(ids[1]->name + 2,
"Foo.001");
601 EXPECT_STREQ(ids[total_object_count / 2 - 1]->name + 2,
"Foo.599");
614 EXPECT_STREQ(id_010->
name + 2,
"Foo.010");
616 EXPECT_STREQ(id_020->
name + 2,
"Foo.020");
619 EXPECT_STREQ(id_2000->
name + 2,
"Foo.2000");
622 EXPECT_STREQ(id_030->
name + 2,
"Foo.030");
624 EXPECT_STREQ(id_600->
name + 2,
"Foo.600");
630 EXPECT_STREQ(id_max->
name + 2,
"Foo.999999999");
633 EXPECT_STREQ(id_max1->
name + 2,
"Foo.601");
642 for (
int i = total_object_count / 2;
i < total_object_count; ++
i) {
652 EXPECT_STREQ(
BKE_id_name(*id_foo_001_178),
"Foo_001.178");
654 EXPECT_STREQ(
BKE_id_name(*id_foo_001_179),
"Foo_001.179");
656 EXPECT_STREQ(
BKE_id_name(*id_foo_001_180),
"Foo_001.180");
659 for (
int i = 0;
i < total_object_count; ++
i) {
664 EXPECT_STREQ(
BKE_id_name(*id_max),
"ALongerName.999999999");
667 EXPECT_STREQ(
BKE_id_name(*id_alongernam),
"ALongerNam");
669 EXPECT_STREQ(
BKE_id_name(*id_alongernam001),
"ALongerNam.001");
676TEST(lib_id_main_unique_name, renames_with_duplicates)
684 EXPECT_STREQ(id_a->
name + 2,
"Foo");
685 EXPECT_STREQ(id_b->
name + 2,
"Foo.001");
686 EXPECT_STREQ(id_c->
name + 2,
"Bar");
691 EXPECT_STREQ(id_a->
name + 2,
"Foo.002");
693 EXPECT_STREQ(id_b->
name + 2,
"Bar.001");
695 EXPECT_STREQ(id_c->
name + 2,
"Foo");
697 EXPECT_STREQ(id_b->
name + 2,
"Bar");
704TEST(lib_id_main_unique_name, names_are_unique_per_id_type)
712 EXPECT_STREQ(id_a->
name + 2,
"Foo");
713 EXPECT_STREQ(id_b->
name + 2,
"Foo");
714 EXPECT_STREQ(id_c->
name + 2,
"Foo.001");
721TEST(lib_id_main_unique_name, name_huge_number_suffix)
728 EXPECT_STREQ(id_a->
name + 2,
"SuperLong.1234567890");
731 EXPECT_STREQ(id_b->
name + 2,
"SuperLong.001");
748 EXPECT_NE(br_a->
newid,
nullptr);
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
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)
@ LIB_ID_MAKELOCAL_FORCE_COPY
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)
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