Blender V4.5
node_iterator_tests.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 "testing/testing.h"
6
7#include "CLG_log.h"
8
10
11#include "BKE_appdir.hh"
12#include "BKE_context.hh"
13#include "BKE_global.hh"
14#include "BKE_idtype.hh"
15#include "BKE_main.hh"
16#include "BKE_material.hh"
17#include "BKE_node.hh"
18#include "BKE_scene.hh"
19
20#include "IMB_imbuf.hh"
21
22#include "ED_node_c.hh"
23
24#include "RNA_define.hh"
25
27
28class NodeTest : public ::testing::Test {
29
30 protected:
41
42 static void TearDownTestSuite()
43 {
46 RNA_exit();
48 IMB_exit();
49 CLG_exit();
50 }
51
56
58 {
59 IteratorResult iter_result;
60
61 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
62 iter_result.node_trees.append(ntree);
63 iter_result.ids.append(id);
64 }
66
67 return iter_result;
68 };
69};
70
71class TestData {
72 public:
73 Main *bmain = nullptr;
74 bContext *C = nullptr;
75
77 {
78 if (bmain == nullptr) {
80 G.main = bmain;
81 }
82
83 if (C == nullptr) {
84 C = CTX_create();
86 }
87 }
88
90 {
91 if (bmain != nullptr) {
93 bmain = nullptr;
94 G.main = nullptr;
95 }
96
97 if (C != nullptr) {
98 CTX_free(C);
99 C = nullptr;
100 }
101 }
102};
103
104TEST_F(NodeTest, tree_iterator_empty)
105{
106 TestData context;
107
108 IteratorResult iter_result = this->get_node_trees(context.bmain);
109
110 EXPECT_EQ(iter_result.node_trees.size(), 0);
111 EXPECT_EQ(iter_result.ids.size(), 0);
112}
113
114TEST_F(NodeTest, tree_iterator_1_mat)
115{
116 TestData context;
117
118 Material *material = BKE_material_add(context.bmain, "Material");
119 ED_node_shader_default(context.C, &material->id);
120
121 IteratorResult iter_result = this->get_node_trees(context.bmain);
122
123 ASSERT_EQ(iter_result.node_trees.size(), 1);
124 ASSERT_EQ(iter_result.ids.size(), 1);
125
126 EXPECT_EQ(GS(iter_result.ids[0]->name), ID_MA);
127}
128
129TEST_F(NodeTest, tree_iterator_scene_no_tree)
130{
131 TestData context;
132
133 Material *material = BKE_material_add(context.bmain, "Material");
134 ED_node_shader_default(context.C, &material->id);
135
136 BKE_scene_add(context.bmain, "Scene");
137
138 IteratorResult iter_result = this->get_node_trees(context.bmain);
139
140 ASSERT_EQ(iter_result.node_trees.size(), 1);
141 ASSERT_EQ(iter_result.ids.size(), 1);
142
143 EXPECT_EQ(GS(iter_result.ids[0]->name), ID_MA);
144}
145
146TEST_F(NodeTest, tree_iterator_1mat_1scene)
147{
148 TestData context;
149 const char SCENE_NAME[MAX_ID_NAME] = "Scene for testing";
150
151 Material *material = BKE_material_add(context.bmain, "Material");
152 ED_node_shader_default(context.C, &material->id);
153
154 Scene *scene = BKE_scene_add(context.bmain, SCENE_NAME);
156 context.bmain, &scene->id, "compositing nodetree", "CompositorNodeTree");
157
158 IteratorResult iter_result = this->get_node_trees(context.bmain);
159
160 ASSERT_EQ(iter_result.node_trees.size(), 2);
161 ASSERT_EQ(iter_result.ids.size(), 2);
162
163 EXPECT_EQ(GS(iter_result.ids[1]->name), ID_MA);
164 EXPECT_EQ(GS(iter_result.ids[0]->name), ID_SCE);
165 EXPECT_STREQ(iter_result.ids[0]->name + 2, SCENE_NAME);
166}
167
168TEST_F(NodeTest, tree_iterator_1mat_3scenes)
169{
170 TestData context;
171 const char SCENE_NAME_1[MAX_ID_NAME] = "Scene 1";
172 const char SCENE_NAME_2[MAX_ID_NAME] = "Scene 2";
173 const char SCENE_NAME_3[MAX_ID_NAME] = "Scene 3";
174 const char NTREE_NAME[MAX_NAME] = "Test Composisiting Nodetree";
175 /* Name is hard-coded in #ED_node_shader_default(). */
176 const char MATERIAL_NTREE_NAME[MAX_NAME] = "Shader Nodetree";
177
178 Material *material = BKE_material_add(context.bmain, "Material");
179 ED_node_shader_default(context.C, &material->id);
180
181 BKE_scene_add(context.bmain, SCENE_NAME_1);
182 /* Note: no node tree for scene 1. */
183
184 Scene *scene2 = BKE_scene_add(context.bmain, SCENE_NAME_2);
186 context.bmain, &scene2->id, NTREE_NAME, "CompositorNodeTree");
187
188 BKE_scene_add(context.bmain, SCENE_NAME_3);
189 /* Also no node tree for scene 3. */
190
191 IteratorResult iter_result = this->get_node_trees(context.bmain);
192
193 ASSERT_EQ(iter_result.node_trees.size(), 2);
194 ASSERT_EQ(iter_result.ids.size(), 2);
195
196 /* Expect that scenes with no node-trees don't have side effects for node trees. */
197 EXPECT_EQ(GS(iter_result.ids[0]->name), ID_SCE);
198 EXPECT_STREQ(iter_result.ids[0]->name + 2, SCENE_NAME_2);
199 EXPECT_STREQ(iter_result.node_trees[0]->id.name + 2, NTREE_NAME);
200
201 EXPECT_EQ(GS(iter_result.ids[1]->name), ID_MA);
202 EXPECT_STREQ(iter_result.node_trees[1]->id.name + 2, MATERIAL_NTREE_NAME);
203}
204
205} // namespace blender::nodes::tests
void BKE_appdir_init()
Definition appdir.cc:93
void BKE_appdir_exit()
Definition appdir.cc:101
void CTX_data_main_set(bContext *C, Main *bmain)
void CTX_free(bContext *C)
bContext * CTX_create()
void BKE_idtype_init()
Definition idtype.cc:122
Main * BKE_main_new()
Definition main.cc:48
void BKE_main_free(Main *bmain)
Definition main.cc:175
General operations, lookup, etc. for materials.
void BKE_materials_init()
Material * BKE_material_add(Main *bmain, const char *name)
void BKE_materials_exit()
#define FOREACH_NODETREE_END
Definition BKE_node.hh:866
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
Definition BKE_node.hh:856
Scene * BKE_scene_add(Main *bmain, const char *name)
Definition scene.cc:2010
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void CLG_exit(void)
Definition clog.c:704
void CLG_init(void)
Definition clog.c:697
@ ID_SCE
@ ID_MA
void ED_node_shader_default(const bContext *C, ID *id)
Definition node_edit.cc:574
void IMB_exit()
Definition module.cc:23
void IMB_init()
Definition module.cc:16
void append(const T &value)
IteratorResult get_node_trees(Main *bmain)
#define MAX_ID_NAME
#define MAX_NAME
#define GS(a)
#define G(x, y, z)
bNodeTree * node_tree_add_tree_embedded(Main *bmain, ID *owner_id, StringRefNull name, StringRefNull idname)
Definition node.cc:4375
void node_system_exit()
Definition node.cc:5620
void node_system_init()
Definition node.cc:5615
TEST_F(NodeTest, tree_iterator_empty)
void RNA_exit()
void RNA_init()
Definition rna_access.cc:80
struct bNodeTree * nodetree