Blender V5.0
brush_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#include "testing/testing.h"
5
6#include "BKE_brush.hh"
7#include "BKE_idtype.hh"
8#include "BKE_lib_id.hh"
9#include "BKE_main.hh"
10
11#include "BLI_listbase.h"
12
13#include "DNA_brush_types.h"
14#include "DNA_material_types.h"
15#include "DNA_node_types.h"
16
17class BrushTest : public testing::Test {
18 public:
19 Main *bmain = nullptr;
20
21 static void SetUpTestSuite()
22 {
24 }
25
26 void SetUp() override
27 {
29 }
30
31 void TearDown() override
32 {
34 }
35};
36
37static void check_id_and_name(const ID *a, const ID *b)
38{
39 EXPECT_NE(a, b) << "ID " << a->name << " and " << b->name << "should be different pointers";
40 EXPECT_EQ(a->us, 1) << "ID " << a->name << " should have 1 user";
41 EXPECT_EQ(b->us, 1) << "ID " << b->name << " should have 1 user";
42 EXPECT_STRNE(a->name, b->name);
43}
44
45static void check_embedded_copy(const ID *a, const ID *b)
46{
47 EXPECT_NE(a, b) << "ID " << a->name << " and " << b->name << "should be different pointers";
48 EXPECT_EQ(a->us, 0) << "ID " << a->name << " should have 0 users";
49 EXPECT_EQ(b->us, 0) << "ID " << b->name << " should have 0 users";
50 EXPECT_TRUE(a->flag & ID_FLAG_EMBEDDED_DATA);
51 EXPECT_TRUE(b->flag & ID_FLAG_EMBEDDED_DATA);
52}
53
54TEST_F(BrushTest, deep_copy)
55{
56 Brush *brush = BKE_brush_add(bmain, "UnitTestBrush", OB_MODE_SCULPT);
57 /* TODO: Ideally this shouldn't be needed, but BKE_brush_add generates an extra user. Remove this
58 * once that has been fixed. */
59 id_us_min(&brush->id);
60
61 /* Normal Linked Data */
62 brush->paint_curve = static_cast<PaintCurve *>(BKE_id_new(bmain, ID_PC, "UnitTestPaintCurve"));
63 brush->mtex.tex = static_cast<Tex *>(BKE_id_new(bmain, ID_TE, "UnitTestTexture"));
64 brush->mtex.tex->ima = static_cast<Image *>(BKE_id_new(bmain, ID_IM, "UnitTestImage"));
65
66 /* Embedded Data */
67 brush->mtex.tex->nodetree = BKE_id_new_nomain<bNodeTree>("UnitTestNodeTree");
69
70 Brush *duplicated_brush = BKE_brush_duplicate(
72
73 check_id_and_name(&brush->id, &duplicated_brush->id);
74 check_id_and_name(&brush->paint_curve->id, &duplicated_brush->paint_curve->id);
75 check_id_and_name(&brush->mtex.tex->id, &duplicated_brush->mtex.tex->id);
76 check_id_and_name(&brush->mtex.tex->ima->id, &duplicated_brush->mtex.tex->ima->id);
77
78 check_embedded_copy(&brush->mtex.tex->nodetree->id, &duplicated_brush->mtex.tex->nodetree->id);
79
80 EXPECT_TRUE(BLI_listbase_is_empty(&bmain->nodetrees));
81}
82
83TEST_F(BrushTest, deep_copy_grease_pencil_brush)
84{
85 /* Grease pencil brushes potentially have more ID linked to them, hence a separate test */
86
87 Brush *brush = BKE_brush_add(bmain, "UnitTestBrush", OB_MODE_PAINT_GREASE_PENCIL);
88 /* TODO: Ideally this shouldn't be needed, but #BKE_brush_add generates an extra user.
89 * Remove this once that has been fixed. */
90 id_us_min(&brush->id);
91
92 /* Normal Linked Data */
93 brush->paint_curve = static_cast<PaintCurve *>(BKE_id_new(bmain, ID_PC, "UnitTestPaintCurve"));
94 brush->gpencil_settings->material = static_cast<Material *>(
95 BKE_id_new(bmain, ID_MA, "UnitTestMaterial"));
96 brush->gpencil_settings->material_alt = static_cast<Material *>(
97 BKE_id_new(bmain, ID_MA, "UnitTestMaterialAlt"));
98
99 /* Embedded Data */
100 brush->gpencil_settings->material->nodetree = BKE_id_new_nomain<bNodeTree>("UnitTestNodeTree");
103 "UnitTestNodeTree2");
105
106 Brush *duplicated_brush = BKE_brush_duplicate(
108
109 check_id_and_name(&brush->id, &duplicated_brush->id);
110 check_id_and_name(&brush->paint_curve->id, &duplicated_brush->paint_curve->id);
112 &duplicated_brush->gpencil_settings->material->id);
114 &duplicated_brush->gpencil_settings->material_alt->id);
115
117 &duplicated_brush->gpencil_settings->material->nodetree->id);
119 &duplicated_brush->gpencil_settings->material_alt->nodetree->id);
120
121 EXPECT_TRUE(BLI_listbase_is_empty(&bmain->nodetrees));
122}
Brush * BKE_brush_add(Main *bmain, const char *name, eObjectMode ob_mode)
Definition brush.cc:627
Brush * BKE_brush_duplicate(Main *bmain, Brush *brush, eDupli_ID_Flags dupflag, uint duplicate_options)
Definition brush.cc:690
void BKE_idtype_init()
Definition idtype.cc:121
void * BKE_id_new(Main *bmain, short type, const char *name)
Definition lib_id.cc:1514
void id_us_min(ID *id)
Definition lib_id.cc:366
@ LIB_ID_DUPLICATE_IS_ROOT_ID
void * BKE_id_new_nomain(short type, const char *name)
Definition lib_id.cc:1519
Main * BKE_main_new()
Definition main.cc:89
void BKE_main_free(Main *bmain)
Definition main.cc:192
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
@ ID_FLAG_EMBEDDED_DATA
Definition DNA_ID.h:774
@ ID_TE
@ ID_IM
@ ID_MA
@ ID_PC
@ OB_MODE_SCULPT
@ OB_MODE_PAINT_GREASE_PENCIL
@ USER_DUP_LINKED_ID
@ USER_DUP_OBDATA
static void check_id_and_name(const ID *a, const ID *b)
Definition brush_test.cc:37
static void check_embedded_copy(const ID *a, const ID *b)
Definition brush_test.cc:45
TEST_F(BrushTest, deep_copy)
Definition brush_test.cc:54
Main * bmain
Definition brush_test.cc:19
static void SetUpTestSuite()
Definition brush_test.cc:21
void SetUp() override
Definition brush_test.cc:26
void TearDown() override
Definition brush_test.cc:31
struct Material * material
struct Material * material_alt
struct MTex mtex
struct BrushGpencilSettings * gpencil_settings
struct PaintCurve * paint_curve
Definition DNA_ID.h:414
char name[258]
Definition DNA_ID.h:432
int us
Definition DNA_ID.h:443
short flag
Definition DNA_ID.h:438
struct Tex * tex
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct Image * ima