Blender  V3.3
source/blender/blenkernel/intern/image_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2022 Blender Foundation. */
3 
4 #include "BLI_path_util.h"
5 #include "BLI_string.h"
6 
7 #include "BKE_image.h"
8 
9 #include "MEM_guardedalloc.h"
10 
11 #include "testing/testing.h"
12 
13 namespace blender::bke::tests {
14 
15 TEST(udim, image_ensure_tile_token)
16 {
17  auto verify = [](const char *original, const char *expected) {
18  char result[FILE_MAX];
19 
20  BLI_strncpy(result, original, sizeof(result));
22  EXPECT_STREQ(result, expected);
23  };
24 
25  /* Already present tokens. */
26  verify("test.<UDIM>.png", "test.<UDIM>.png");
27  verify("test.<UVTILE>.png", "test.<UVTILE>.png");
28 
29  /* UDIM pattern detection. */
30  verify("test.1002.png", "test.<UDIM>.png");
31  verify("test-1002-ao.png", "test-<UDIM>-ao.png");
32  verify("test_1002_ao.png", "test_<UDIM>_ao.png");
33  verify("test.1002.ver0023.png", "test.<UDIM>.ver0023.png");
34  verify("test.ver0023.1002.png", "test.ver0023.<UDIM>.png");
35  verify("test.1002.1.png", "test.<UDIM>.1.png");
36  verify("test.1.1002.png", "test.1.<UDIM>.png");
37  verify("test-2022-01-01.1002.png", "test-2022-01-01.<UDIM>.png");
38  verify("1111_11.1002.png", "1111_11.<UDIM>.png");
39  verify("2111_01.1002.png", "2111_01.<UDIM>.png");
40  verify("2022_1002_100200.1002.png", "2022_1002_100200.<UDIM>.png");
41 
42  /* UVTILE pattern detection. */
43  verify("uv-test.u2_v10.png", "uv-test.<UVTILE>.png");
44  verify("uv-test-u2_v10-ao.png", "uv-test-<UVTILE>-ao.png");
45  verify("uv-test_u2_v10_ao.png", "uv-test_<UVTILE>_ao.png");
46  verify("uv-test.u10_v100.png", "uv-test.<UVTILE>.png");
47  verify("u_v-test.u2_v10.png", "u_v-test.<UVTILE>.png");
48  verify("u2_v10uv-test.png", "<UVTILE>uv-test.png");
49  verify("u2_v10u_v-test.png", "<UVTILE>u_v-test.png");
50 
51  /* Patterns which should not be detected as UDIMs. */
52  for (const char *incorrect : {"1002.png",
53  "1002test.png",
54  "test1002.png",
55  "test(1002).png",
56  "(1002)test.png",
57  "test-1080p.png",
58  "test-1920x1080.png",
59  "test.123.png",
60  "test.12345.png",
61  "test.uv.png",
62  "test.u1v.png",
63  "test.uv1.png",
64  "test.u_v.png",
65  "test.u1_v.png",
66  "test.u_v2.png",
67  "test.u2v3.png",
68  "test.u123_v1.png",
69  "test.u1_v12345.png"}) {
70  /* These should not result in modifications happening. */
71  verify(incorrect, incorrect);
72  }
73 }
74 
75 TEST(udim, image_get_tile_strformat)
76 {
77  eUDIM_TILE_FORMAT tile_format;
78  char *udim_pattern;
79 
80  /* Parameter validation. */
81  udim_pattern = BKE_image_get_tile_strformat(nullptr, &tile_format);
82  EXPECT_EQ(udim_pattern, nullptr);
83 
84  udim_pattern = BKE_image_get_tile_strformat("", nullptr);
85  EXPECT_EQ(udim_pattern, nullptr);
86 
87  /* Typical usage. */
88  udim_pattern = BKE_image_get_tile_strformat("", &tile_format);
89  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_NONE);
90  EXPECT_EQ(udim_pattern, nullptr);
91 
92  udim_pattern = BKE_image_get_tile_strformat("test.<UNKNOWN>.png", &tile_format);
93  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_NONE);
94  EXPECT_EQ(udim_pattern, nullptr);
95 
96  udim_pattern = BKE_image_get_tile_strformat("test.<UDIM>.png", &tile_format);
97  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_UDIM);
98  EXPECT_STREQ(udim_pattern, "test.%d.png");
99  MEM_freeN(udim_pattern);
100 
101  udim_pattern = BKE_image_get_tile_strformat("test.<UVTILE>.png", &tile_format);
102  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_UVTILE);
103  EXPECT_STREQ(udim_pattern, "test.u%d_v%d.png");
104  MEM_freeN(udim_pattern);
105 }
106 
107 TEST(udim, image_get_tile_number_from_filepath)
108 {
109  eUDIM_TILE_FORMAT tile_format;
110  char *udim_pattern;
111  int tile_number;
112 
113  udim_pattern = BKE_image_get_tile_strformat("test.<UDIM>.png", &tile_format);
114  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_UDIM);
115  EXPECT_NE(udim_pattern, nullptr);
116 
117  /* Parameter validation. */
118  EXPECT_FALSE(
119  BKE_image_get_tile_number_from_filepath(nullptr, udim_pattern, tile_format, &tile_number));
121  "test.1004.png", nullptr, tile_format, &tile_number));
123  "test.1004.png", udim_pattern, UDIM_TILE_FORMAT_NONE, &tile_number));
125  "test.1004.png", udim_pattern, tile_format, nullptr));
126 
127  /* UDIM tile format tests. */
129  "test.1004.png", udim_pattern, tile_format, &tile_number));
130  EXPECT_EQ(tile_number, 1004);
131 
133  "has_no_number.png", udim_pattern, tile_format, &tile_number));
135  "test.X.png", udim_pattern, tile_format, &tile_number));
137  "wrong.1004.png", udim_pattern, tile_format, &tile_number));
138 
139  MEM_freeN(udim_pattern);
140 
141  /* UVTILE tile format tests. */
142  udim_pattern = BKE_image_get_tile_strformat("test.<UVTILE>.png", &tile_format);
143  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_UVTILE);
144  EXPECT_NE(udim_pattern, nullptr);
145 
147  "test.u2_v2.png", udim_pattern, tile_format, &tile_number));
148  EXPECT_EQ(tile_number, 1012);
149 
151  "has_no_number.png", udim_pattern, tile_format, &tile_number));
153  "test.u1_vX.png", udim_pattern, tile_format, &tile_number));
155  "test.uX_v1.png", udim_pattern, tile_format, &tile_number));
157  "wrong.u2_v2.png", udim_pattern, tile_format, &tile_number));
158 
159  MEM_freeN(udim_pattern);
160 }
161 
162 TEST(udim, image_set_filepath_from_tile_number)
163 {
164  eUDIM_TILE_FORMAT tile_format;
165  char *udim_pattern;
166 
167  udim_pattern = BKE_image_get_tile_strformat("test.<UDIM>.png", &tile_format);
168  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_UDIM);
169  EXPECT_NE(udim_pattern, nullptr);
170 
171  char filepath[FILE_MAX];
172 
173  /* Parameter validation. */
174  BLI_strncpy(filepath, "xxxx", FILE_MAX);
175 
176  BKE_image_set_filepath_from_tile_number(nullptr, udim_pattern, tile_format, 1028);
177  BKE_image_set_filepath_from_tile_number(filepath, nullptr, tile_format, 1028);
178  EXPECT_STREQ(filepath, "xxxx");
179  BKE_image_set_filepath_from_tile_number(filepath, udim_pattern, UDIM_TILE_FORMAT_NONE, 1028);
180  EXPECT_STREQ(filepath, "xxxx");
181 
182  /* UDIM tile format tests. */
183  BKE_image_set_filepath_from_tile_number(filepath, udim_pattern, tile_format, 1028);
184  EXPECT_STREQ(filepath, "test.1028.png");
185  MEM_freeN(udim_pattern);
186 
187  /* UVTILE tile format tests. */
188  udim_pattern = BKE_image_get_tile_strformat("test.<UVTILE>.png", &tile_format);
189  EXPECT_EQ(tile_format, UDIM_TILE_FORMAT_UVTILE);
190  EXPECT_NE(udim_pattern, nullptr);
191 
192  BKE_image_set_filepath_from_tile_number(filepath, udim_pattern, tile_format, 1028);
193  EXPECT_STREQ(filepath, "test.u8_v3.png");
194  MEM_freeN(udim_pattern);
195 }
196 
197 } // namespace blender::bke::tests
eUDIM_TILE_FORMAT
Definition: BKE_image.h:378
@ UDIM_TILE_FORMAT_UVTILE
Definition: BKE_image.h:381
@ UDIM_TILE_FORMAT_NONE
Definition: BKE_image.h:379
@ UDIM_TILE_FORMAT_UDIM
Definition: BKE_image.h:380
void BKE_image_set_filepath_from_tile_number(char *filepath, const char *pattern, eUDIM_TILE_FORMAT tile_format, int tile_number)
bool BKE_image_get_tile_number_from_filepath(const char *filepath, const char *pattern, eUDIM_TILE_FORMAT tile_format, int *r_tile_number)
void BKE_image_ensure_tile_token(char *filename)
char * BKE_image_get_tile_strformat(const char *filepath, eUDIM_TILE_FORMAT *r_tile_format)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define FILE_MAX
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
Read Guarded memory(de)allocation.
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
TEST(action_groups, ReconstructGroupsWithReordering)
Definition: action_test.cc:17