Blender V5.0
idprop_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "BKE_idprop.hh"
6#include "testing/testing.h"
7
8namespace blender::bke::tests {
9
10TEST(idproperties, CreateGroup)
11{
12 IDProperty *prop = idprop::create_group("test").release();
13 IDP_FreeProperty(prop);
14}
15
16TEST(idproperties, AddToGroup)
17{
18 IDProperty *group = idprop::create_group("test").release();
19 EXPECT_EQ(IDP_GetPropertyFromGroup(group, "a"), nullptr);
20 EXPECT_TRUE(IDP_AddToGroup(group, idprop::create("a", 3.0f).release()));
21 EXPECT_TRUE(IDP_AddToGroup(group, idprop::create("b", 5).release()));
24 IDProperty *duplicate_prop = idprop::create("a", 10).release();
25 EXPECT_FALSE(IDP_AddToGroup(group, duplicate_prop));
27 EXPECT_EQ(IDP_GetPropertyFromGroup(group, "c"), nullptr);
28 IDP_FreeProperty(duplicate_prop);
29 IDP_FreeProperty(group);
30}
31
32TEST(idproperties, ReplaceInGroup)
33{
34 IDProperty *group = idprop::create_group("test").release();
35 EXPECT_TRUE(IDP_AddToGroup(group, idprop::create("a", 3.0f).release()));
37 IDP_ReplaceInGroup(group, idprop::create("a", 5.0f).release());
39 IDP_ReplaceInGroup(group, idprop::create("b", 5).release());
41 IDP_FreeProperty(group);
42}
43
44TEST(idproperties, RemoveFromGroup)
45{
46 IDProperty *group = idprop::create_group("test").release();
47 EXPECT_EQ(IDP_GetPropertyFromGroup(group, "a"), nullptr);
48 IDProperty *prop_a = idprop::create("a", 3.0f).release();
49 EXPECT_TRUE(IDP_AddToGroup(group, prop_a));
51 IDP_RemoveFromGroup(group, prop_a);
52 EXPECT_EQ(IDP_GetPropertyFromGroup(group, "a"), nullptr);
53 IDP_FreeProperty(prop_a);
54 IDP_FreeProperty(group);
55}
56
57TEST(idproperties, ReplaceGroupInGroup)
58{
59 IDProperty *group1 = idprop::create_group("test").release();
60 IDP_AddToGroup(group1, idprop::create("a", 1).release());
61 IDP_AddToGroup(group1, idprop::create("b", 2).release());
62 IDProperty *group2 = idprop::create_group("test2").release();
63 IDP_AddToGroup(group2, idprop::create("b", 3).release());
64 IDP_AddToGroup(group2, idprop::create("c", 4).release());
65
66 IDP_ReplaceGroupInGroup(group1, group2);
70
71 IDP_FreeProperty(group1);
72 IDP_FreeProperty(group2);
73}
74
75TEST(idproperties, SyncGroupValues)
76{
77 IDProperty *group1 = idprop::create_group("test").release();
78 IDProperty *group2 = idprop::create_group("test").release();
79 IDP_AddToGroup(group1, idprop::create("a", 1).release());
80 IDP_AddToGroup(group1, idprop::create("b", 2).release());
81 IDP_AddToGroup(group1, idprop::create("x", 2).release());
82 IDP_AddToGroup(group2, idprop::create("a", 3).release());
83 IDP_AddToGroup(group2, idprop::create("c", 4).release());
84 IDP_AddToGroup(group2, idprop::create("x", "value").release());
85
86 IDP_SyncGroupValues(group1, group2);
90 EXPECT_EQ(IDP_GetPropertyFromGroup(group1, "c"), nullptr);
91
92 IDP_FreeProperty(group1);
93 IDP_FreeProperty(group2);
94}
95
96TEST(idproperties, ReprGroup)
97{
98 auto repr_fn = [](IDProperty *prop) -> std::string {
99 uint result_len;
100 char *c_str = IDP_reprN(prop, &result_len);
101 std::string result = std::string(c_str, result_len);
102 MEM_freeN(c_str);
103 return result;
104 };
105
106 IDProperty *group = idprop::create_group("test").release();
107
108 EXPECT_EQ(repr_fn(group), "{}");
109
110 IDP_AddToGroup(group, idprop::create("a", 1).release());
111 IDP_AddToGroup(group, idprop::create("b", 0.5f).release());
112 IDP_AddToGroup(group, idprop::create_bool("c", true).release());
113 IDP_AddToGroup(group, idprop::create_bool("d", false).release());
114 IDP_AddToGroup(group, idprop::create("e", "ABC (escape \" \\)").release());
115 IDP_AddToGroup(group, idprop::create("f", Span<int32_t>({-1, 0, 1})).release());
116 IDP_AddToGroup(group, idprop::create("g", Span<float>({-0.5f, 0.0f, 0.5f})).release());
117 IDP_AddToGroup(group, idprop::create_group("h").release());
118
119 EXPECT_EQ(repr_fn(group),
120 "{"
121 "\"a\": 1, "
122 "\"b\": 0.5, "
123 "\"c\": True, "
124 "\"d\": False, "
125 "\"e\": \"ABC (escape \\\" \\\\)\", "
126 "\"f\": [-1, 0, 1], "
127 "\"g\": [-0.5, 0, 0.5], "
128 "\"h\": {}"
129 "}");
130
131 IDP_FreeProperty(group);
132}
133
134} // namespace blender::bke::tests
#define IDP_float_get(prop)
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:747
#define IDP_int_get(prop)
char * IDP_reprN(const IDProperty *prop, uint *r_len)
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1251
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:717
void IDP_RemoveFromGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:730
void IDP_ReplaceGroupInGroup(IDProperty *dest, const IDProperty *src) ATTR_NONNULL()
Definition idprop.cc:634
void IDP_SyncGroupValues(IDProperty *dest, const IDProperty *src) ATTR_NONNULL()
Definition idprop.cc:585
void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:666
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
unsigned int uint
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
std::unique_ptr< IDProperty, IDPropertyDeleter > create_bool(StringRef prop_name, bool value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_BOOLEAN, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
TEST(action_groups, ReconstructGroupsWithReordering)