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