1 #include "SayonaraTest.h"
2
3 #include "Components/LibraryManagement/LibraryManager.h"
4
5 #include "Interfaces/LibraryPlaylistInteractor.h"
6
7 #include "Utils/Library/LibraryInfo.h"
8 #include "Utils/FileUtils.h"
9
10 #include <map>
11 #include <memory>
12 // access working directory with Test::Base::tempPath("somefile.txt");
13
14 class LibraryPlaylistInteractorStub : public LibraryPlaylistInteractor
15 {
16 public:
17 ~LibraryPlaylistInteractorStub() override = default;
18
createPlaylist(const QStringList &,bool)19 void createPlaylist(const QStringList&, bool) override {}
20
createPlaylist(const MetaDataList &,bool)21 void createPlaylist(const MetaDataList&, bool) override {}
22
append(const MetaDataList &)23 void append(const MetaDataList&) override {}
24
insertAfterCurrentTrack(const MetaDataList &)25 void insertAfterCurrentTrack(const MetaDataList&) override {}
26 };
27
28 class LibraryManagerTest :
29 public Test::Base
30 {
31 Q_OBJECT
32
33 public:
LibraryManagerTest()34 LibraryManagerTest() :
35 Test::Base("LibraryManagerTest") {}
36
37 private:
38
createLibraryManager()39 std::shared_ptr<Library::Manager> createLibraryManager()
40 {
41 auto deleter = [&](Library::Manager* libraryManager) {
42 removeAllLibraries(libraryManager);
43 delete libraryManager;
44 };
45
46 auto* libraryPlaylistInteractor = new LibraryPlaylistInteractorStub();
47 auto libraryManager =
48 std::shared_ptr<Library::Manager>(new Library::Manager(libraryPlaylistInteractor), deleter);
49
50 return libraryManager;
51 }
52
removeAllLibraries(Library::Manager * manager)53 void removeAllLibraries(Library::Manager* manager)
54 {
55 auto allLibraries = manager->allLibraries();
56 for(const auto& library : allLibraries)
57 {
58 manager->removeLibrary(library.id());
59 }
60
61 QVERIFY(manager->allLibraries().isEmpty());
62 QVERIFY(manager->count() == 0);
63 }
64
createLibraries(std::shared_ptr<Library::Manager> manager,int count)65 void createLibraries(std::shared_ptr<Library::Manager> manager, int count)
66 {
67 removeAllLibraries(manager.get());
68
69 for(int i = 0; i < count; i++)
70 {
71 const auto name = QString("Library%1").arg(i);
72 const auto dir = Test::Base::tempPath(name);
73 manager->addLibrary(name, dir);
74 }
75
76 QVERIFY(manager->allLibraries().size() == count);
77 QVERIFY(manager->count() == count);
78 }
79
80 private slots:
81 void addTest();
82 void infoTest();
83 void removeTest();
84 void renameTest();
85 void moveTest();
86 };
87
addTest()88 void LibraryManagerTest::addTest()
89 {
90 auto manager = createLibraryManager();
91 QVERIFY(manager->allLibraries().isEmpty());
92
93 for(int i = 0; i < 3; i++)
94 {
95 const auto name = QString("Library%1").arg(i);
96 const auto dir = Test::Base::tempPath(name);
97 const auto id = manager->addLibrary(name, dir);
98 QVERIFY(id >= 0);
99 QVERIFY(manager->allLibraries().size() == (i + 1));
100 QVERIFY(manager->count() == i + 1);
101 }
102
103 { // already available library
104 const auto allLibraries = manager->allLibraries();
105 const auto library = allLibraries[1];
106 const auto id = manager->addLibrary(library.name(), library.path());
107 QVERIFY(id == -1);
108 QVERIFY(manager->allLibraries().size() == 3);
109 }
110
111 { // empty name
112 const auto dir = Test::Base::tempPath("Empty");
113 const auto id = manager->addLibrary(QString(), dir);
114 QVERIFY(id == -1);
115 QVERIFY(manager->allLibraries().size() == 3);
116 }
117
118 { // SubDir of already available library
119 const auto dir = Test::Base::tempPath("Library1/Subdir");
120 const auto id = manager->addLibrary("SubLib", dir);
121 QVERIFY(id == -1);
122 QVERIFY(manager->allLibraries().size() == 3);
123 }
124 }
125
infoTest()126 void LibraryManagerTest::infoTest()
127 {
128 auto manager = createLibraryManager();
129 QVERIFY(manager->count() == 0);
130
131 for(int i = 0; i < 3; i++)
132 {
133 const auto name = QString("Library%1").arg(i);
134 const auto dir = Test::Base::tempPath(name);
135 const auto id = manager->addLibrary(name, dir);
136
137 const auto info = manager->libraryInfo(id);
138 QVERIFY(info.name() == name);
139 QVERIFY(info.id() == id);
140 QVERIFY(Util::File::isSamePath(info.path(), dir));
141 QVERIFY(info.valid());
142 }
143 }
144
removeTest()145 void LibraryManagerTest::removeTest()
146 {
147 auto manager = createLibraryManager();
148 createLibraries(manager, 3);
149
150 auto allLibraries = manager->allLibraries();
151 QVERIFY(allLibraries.size() == 3);
152
153 { // remove library
154 const auto id = allLibraries[1].id();
155 const auto success = manager->removeLibrary(id);
156 QVERIFY(success);
157
158 allLibraries = manager->allLibraries();
159 QVERIFY(allLibraries.size() == 2);
160 QVERIFY(allLibraries[0].id() != id);
161 QVERIFY(allLibraries[1].id() != id);
162 }
163
164 { // remove invalid id
165 const auto success = manager->removeLibrary(-4);
166 QVERIFY(!success);
167 allLibraries = manager->allLibraries();
168 QVERIFY(allLibraries.size() == 2);
169 }
170
171 { // delete library two times
172 const auto id = allLibraries[0].id();
173 auto success = manager->removeLibrary(id);
174 QVERIFY(success);
175
176 allLibraries = manager->allLibraries();
177 QVERIFY(allLibraries.size() == 1);
178 success = manager->removeLibrary(id);
179 QVERIFY(!success);
180 QVERIFY(allLibraries.size() == 1);
181 }
182 }
183
renameTest()184 void LibraryManagerTest::renameTest()
185 {
186 auto manager = createLibraryManager();
187 createLibraries(manager, 3);
188
189 auto allLibraries = manager->allLibraries();
190 QVERIFY(allLibraries.size() == 3);
191
192 { // rename
193 const auto id = allLibraries[0].id();
194 manager->renameLibrary(id, "New Name");
195 QVERIFY(manager->libraryInfo(id).name() == "New Name");
196 allLibraries = manager->allLibraries();
197 }
198
199 { // empty name
200 const auto id = allLibraries[1].id();
201 const auto oldName = allLibraries[1].name();
202 const auto success = manager->renameLibrary(id, QString());
203 QVERIFY(!success);
204 QVERIFY(manager->libraryInfo(id).name() == oldName);
205 allLibraries = manager->allLibraries();
206 }
207
208 { // already existing name
209 const auto id = allLibraries[1].id();
210 const auto oldName = allLibraries[1].name();
211 const auto existingName = allLibraries[0].name();
212 const auto success = manager->renameLibrary(id, existingName);
213 QVERIFY(!success);
214 QVERIFY(manager->libraryInfo(id).name() == oldName);
215 allLibraries = manager->allLibraries();
216 }
217 }
218
moveTest()219 void LibraryManagerTest::moveTest()
220 {
221 auto manager = createLibraryManager();
222
223 { // move forward
224 createLibraries(manager, 4);
225 const auto oldLibraries = manager->allLibraries();
226 manager->moveLibrary(0, 2);
227 const auto newLibraries = manager->allLibraries();
228 QVERIFY(newLibraries[0].id() == oldLibraries[1].id());
229 QVERIFY(newLibraries[1].id() == oldLibraries[2].id());
230 QVERIFY(newLibraries[2].id() == oldLibraries[0].id());
231 QVERIFY(newLibraries[3].id() == oldLibraries[3].id());
232 }
233
234 { // move to the end
235 createLibraries(manager, 4);
236 const auto oldLibraries = manager->allLibraries();
237 manager->moveLibrary(0, 3);
238 const auto newLibraries = manager->allLibraries();
239 QVERIFY(newLibraries[0].id() == oldLibraries[1].id());
240 QVERIFY(newLibraries[1].id() == oldLibraries[2].id());
241 QVERIFY(newLibraries[2].id() == oldLibraries[3].id());
242 QVERIFY(newLibraries[3].id() == oldLibraries[0].id());
243 }
244
245 { // move back
246 createLibraries(manager, 4);
247 const auto oldLibraries = manager->allLibraries();
248 const auto success = manager->moveLibrary(2, 0);
249 QVERIFY(success);
250 const auto newLibraries = manager->allLibraries();
251 QVERIFY(newLibraries[0].id() == oldLibraries[2].id());
252 QVERIFY(newLibraries[1].id() == oldLibraries[0].id());
253 QVERIFY(newLibraries[2].id() == oldLibraries[1].id());
254 QVERIFY(newLibraries[3].id() == oldLibraries[3].id());
255 removeAllLibraries(manager.get());
256 QVERIFY(manager->count() == 0);
257 }
258
259 { // same position
260 createLibraries(manager, 4);
261 const auto oldLibraries = manager->allLibraries();
262 const auto success = manager->moveLibrary(2, 2);
263 QVERIFY(success);
264 const auto newLibraries = manager->allLibraries();
265 QVERIFY(newLibraries[0].id() == oldLibraries[0].id());
266 QVERIFY(newLibraries[1].id() == oldLibraries[1].id());
267 QVERIFY(newLibraries[2].id() == oldLibraries[2].id());
268 QVERIFY(newLibraries[3].id() == oldLibraries[3].id());
269 removeAllLibraries(manager.get());
270 QVERIFY(manager->count() == 0);
271 }
272
273 { // invalid position (negative)
274 createLibraries(manager, 4);
275 const auto oldLibraries = manager->allLibraries();
276 const auto success = manager->moveLibrary(2, -2);
277 QVERIFY(!success);
278 const auto newLibraries = manager->allLibraries();
279 QVERIFY(newLibraries[0].id() == oldLibraries[0].id());
280 QVERIFY(newLibraries[1].id() == oldLibraries[1].id());
281 QVERIFY(newLibraries[2].id() == oldLibraries[2].id());
282 QVERIFY(newLibraries[3].id() == oldLibraries[3].id());
283 removeAllLibraries(manager.get());
284 QVERIFY(manager->count() == 0);
285 }
286
287 { // invalid position (too far)
288 createLibraries(manager, 4);
289 const auto oldLibraries = manager->allLibraries();
290 const auto success = manager->moveLibrary(2, 4);
291 QVERIFY(!success);
292 const auto newLibraries = manager->allLibraries();
293 QVERIFY(newLibraries[0].id() == oldLibraries[0].id());
294 QVERIFY(newLibraries[1].id() == oldLibraries[1].id());
295 QVERIFY(newLibraries[2].id() == oldLibraries[2].id());
296 QVERIFY(newLibraries[3].id() == oldLibraries[3].id());
297 removeAllLibraries(manager.get());
298 QVERIFY(manager->count() == 0);
299 }
300 }
301
302 QTEST_GUILESS_MAIN(LibraryManagerTest)
303
304 #include "LibraryManagerTest.moc"
305