Blender  V3.3
bpath_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation. */
3 #include "testing/testing.h"
4 
5 #include "CLG_log.h"
6 
7 #include "BKE_bpath.h"
8 #include "BKE_idtype.h"
9 #include "BKE_lib_id.h"
10 #include "BKE_main.h"
11 
12 #include "MEM_guardedalloc.h"
13 
14 #include "DNA_listBase.h"
15 #include "DNA_movieclip_types.h"
16 #include "DNA_text_types.h"
17 
18 #include "BLI_listbase.h"
19 #include "BLI_path_util.h"
20 #include "BLI_string.h"
21 
22 namespace blender::bke::tests {
23 
24 #ifdef WIN32
25 # define ABSOLUTE_ROOT "C:" SEP_STR
26 #else
27 # define ABSOLUTE_ROOT SEP_STR
28 #endif
29 
30 #define RELATIVE_ROOT "//"
31 #define BASE_DIR ABSOLUTE_ROOT "blendfiles" SEP_STR
32 #define REBASE_DIR BASE_DIR "rebase" SEP_STR
33 
34 #define BLENDFILE_NAME "bpath.blend"
35 #define BLENDFILE_PATH BASE_DIR BLENDFILE_NAME
36 
37 #define TEXT_PATH_ITEM "texts" SEP_STR "text.txt"
38 #define TEXT_PATH_ABSOLUTE ABSOLUTE_ROOT TEXT_PATH_ITEM
39 #define TEXT_PATH_ABSOLUTE_MADE_RELATIVE RELATIVE_ROOT ".." SEP_STR TEXT_PATH_ITEM
40 #define TEXT_PATH_RELATIVE RELATIVE_ROOT TEXT_PATH_ITEM
41 #define TEXT_PATH_RELATIVE_MADE_ABSOLUTE BASE_DIR TEXT_PATH_ITEM
42 
43 #define MOVIECLIP_PATH_ITEM "movieclips" SEP_STR "movieclip.avi"
44 #define MOVIECLIP_PATH_ABSOLUTE ABSOLUTE_ROOT MOVIECLIP_PATH_ITEM
45 #define MOVIECLIP_PATH_ABSOLUTE_MADE_RELATIVE RELATIVE_ROOT ".." SEP_STR MOVIECLIP_PATH_ITEM
46 #define MOVIECLIP_PATH_RELATIVE RELATIVE_ROOT MOVIECLIP_PATH_ITEM
47 #define MOVIECLIP_PATH_RELATIVE_MADE_ABSOLUTE BASE_DIR MOVIECLIP_PATH_ITEM
48 
49 class BPathTest : public testing::Test {
50  public:
51  static void SetUpTestSuite()
52  {
53  CLG_init();
55  }
56  static void TearDownTestSuite()
57  {
58  CLG_exit();
59  }
60 
61  void SetUp() override
62  {
63  bmain = BKE_main_new();
65 
66  BKE_id_new(bmain, ID_TXT, nullptr);
67  BKE_id_new(bmain, ID_MC, nullptr);
68  }
69 
70  void TearDown() override
71  {
73  }
74 
76 };
77 
78 TEST_F(BPathTest, rebase_on_relative)
79 {
80  /* Test on relative paths, should be modified. */
81  Text *text = reinterpret_cast<Text *>(bmain->texts.first);
83 
84  MovieClip *movie_clip = reinterpret_cast<MovieClip *>(bmain->movieclips.first);
85  BLI_strncpy(movie_clip->filepath, MOVIECLIP_PATH_RELATIVE, sizeof(movie_clip->filepath));
86 
88 
89  EXPECT_STREQ(text->filepath, RELATIVE_ROOT ".." SEP_STR TEXT_PATH_ITEM);
90  EXPECT_STREQ(movie_clip->filepath, RELATIVE_ROOT ".." SEP_STR MOVIECLIP_PATH_ITEM);
91 }
92 
93 TEST_F(BPathTest, rebase_on_absolute)
94 {
95  /* Test on absolute paths, should not be modified. */
96  Text *text = reinterpret_cast<Text *>(bmain->texts.first);
98 
99  MovieClip *movie_clip = reinterpret_cast<MovieClip *>(bmain->movieclips.first);
100  BLI_strncpy(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE, sizeof(movie_clip->filepath));
101 
103 
104  EXPECT_STREQ(text->filepath, TEXT_PATH_ABSOLUTE);
105  EXPECT_STREQ(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE);
106 }
107 
108 TEST_F(BPathTest, convert_to_relative)
109 {
110  Text *text = reinterpret_cast<Text *>(bmain->texts.first);
112 
113  MovieClip *movie_clip = reinterpret_cast<MovieClip *>(bmain->movieclips.first);
114  BLI_strncpy(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE, sizeof(movie_clip->filepath));
115 
116  BKE_bpath_relative_convert(bmain, BASE_DIR, nullptr);
117 
118  /* Already relative path should not be modified. */
119  EXPECT_STREQ(text->filepath, TEXT_PATH_RELATIVE);
120  /* Absolute path should be modified. */
121  EXPECT_STREQ(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE_MADE_RELATIVE);
122 }
123 
124 TEST_F(BPathTest, convert_to_absolute)
125 {
126  Text *text = reinterpret_cast<Text *>(bmain->texts.first);
128 
129  MovieClip *movie_clip = reinterpret_cast<MovieClip *>(bmain->movieclips.first);
130  BLI_strncpy(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE, sizeof(movie_clip->filepath));
131 
132  BKE_bpath_absolute_convert(bmain, BASE_DIR, nullptr);
133 
134  /* Relative path should be modified. */
135  EXPECT_STREQ(text->filepath, TEXT_PATH_RELATIVE_MADE_ABSOLUTE);
136  /* Already absolute path should not be modified. */
137  EXPECT_STREQ(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE);
138 }
139 
140 TEST_F(BPathTest, list_backup_restore)
141 {
142  Text *text = reinterpret_cast<Text *>(bmain->texts.first);
144 
145  MovieClip *movie_clip = reinterpret_cast<MovieClip *>(bmain->movieclips.first);
146  BLI_strncpy(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE, sizeof(movie_clip->filepath));
147 
148  void *path_list_handle = BKE_bpath_list_backup(bmain, static_cast<eBPathForeachFlag>(0));
149 
150  ListBase *path_list = reinterpret_cast<ListBase *>(path_list_handle);
151  EXPECT_EQ(BLI_listbase_count(path_list), 2);
152 
153  MEM_freeN(text->filepath);
155  BLI_strncpy(movie_clip->filepath, MOVIECLIP_PATH_RELATIVE, sizeof(movie_clip->filepath));
156 
157  BKE_bpath_list_restore(bmain, static_cast<eBPathForeachFlag>(0), path_list_handle);
158 
159  EXPECT_STREQ(text->filepath, TEXT_PATH_RELATIVE);
160  EXPECT_STREQ(movie_clip->filepath, MOVIECLIP_PATH_ABSOLUTE);
161  EXPECT_EQ(BLI_listbase_count(path_list), 0);
162 
163  BKE_bpath_list_free(path_list_handle);
164 }
165 
166 } // namespace blender::bke::tests
void BKE_bpath_relative_rebase(struct Main *bmain, const char *basedir_src, const char *basedir_dst, struct ReportList *reports)
Definition: bpath.c:439
void BKE_bpath_relative_convert(struct Main *bmain, const char *basedir, struct ReportList *reports)
Definition: bpath.c:559
void * BKE_bpath_list_backup(struct Main *bmain, eBPathForeachFlag flag)
Definition: bpath.c:619
void BKE_bpath_list_restore(struct Main *bmain, eBPathForeachFlag flag, void *path_list_handle)
Definition: bpath.c:631
eBPathForeachFlag
Definition: BKE_bpath.h:27
void BKE_bpath_list_free(void *path_list_handle)
Definition: bpath.c:641
void BKE_bpath_absolute_convert(struct Main *bmain, const char *basedir, struct ReportList *reports)
Definition: bpath.c:564
void BKE_idtype_init(void)
Definition: idtype.c:106
void * BKE_id_new(struct Main *bmain, short type, const char *name)
Definition: lib_id.c:1159
struct Main * BKE_main_new(void)
Definition: main.c:32
void BKE_main_free(struct Main *mainvar)
Definition: main.c:40
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STRNCPY(dst, src)
Definition: BLI_string.h:483
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:42
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
void CLG_exit(void)
Definition: clog.c:703
void CLG_init(void)
Definition: clog.c:696
@ ID_MC
Definition: DNA_ID_enums.h:73
@ ID_TXT
Definition: DNA_ID_enums.h:62
These structs are the foundation for all linked lists in the library system.
Read Guarded memory(de)allocation.
#define REBASE_DIR
Definition: bpath_test.cc:32
#define TEXT_PATH_RELATIVE_MADE_ABSOLUTE
Definition: bpath_test.cc:41
#define MOVIECLIP_PATH_ABSOLUTE_MADE_RELATIVE
Definition: bpath_test.cc:45
#define MOVIECLIP_PATH_RELATIVE
Definition: bpath_test.cc:46
#define TEXT_PATH_RELATIVE
Definition: bpath_test.cc:40
#define TEXT_PATH_ABSOLUTE
Definition: bpath_test.cc:38
#define MOVIECLIP_PATH_ITEM
Definition: bpath_test.cc:43
#define BASE_DIR
Definition: bpath_test.cc:31
#define TEXT_PATH_ITEM
Definition: bpath_test.cc:37
#define RELATIVE_ROOT
Definition: bpath_test.cc:30
#define BLENDFILE_PATH
Definition: bpath_test.cc:35
#define MOVIECLIP_PATH_ABSOLUTE
Definition: bpath_test.cc:44
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
TEST_F(BKE_armature_find_selected_bones_test, some_bones_selected)
Definition: BKE_main.h:121
char filepath[1024]
Definition: BKE_main.h:124
char filepath[1024]
char * filepath
#define SEP_STR
Definition: unit.c:33