File indexing completed on 2024-04-28 04:48:44
0001 /* 0002 SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 0007 #include "databasetestdata.h" 0008 0009 #include "databaseinterface.h" 0010 #include "datatypes.h" 0011 #include "models/datamodel.h" 0012 0013 #include <QObject> 0014 #include <QTemporaryFile> 0015 #include <QUrl> 0016 #include <QString> 0017 #include <QHash> 0018 #include <QVector> 0019 #include <QThread> 0020 #include <QStandardPaths> 0021 #include <QAbstractItemModelTester> 0022 0023 #include <QDebug> 0024 0025 #include <QSignalSpy> 0026 #include <QTest> 0027 0028 class DataModelTests: public QObject, public DatabaseTestData 0029 { 0030 Q_OBJECT 0031 0032 public: 0033 0034 explicit DataModelTests(QObject *aParent = nullptr) : QObject(aParent) 0035 { 0036 } 0037 0038 private Q_SLOTS: 0039 0040 void initTestCase() 0041 { 0042 qRegisterMetaType<QHash<qulonglong,int>>("QHash<qulonglong,int>"); 0043 qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>"); 0044 qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>"); 0045 qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>"); 0046 } 0047 0048 void removeOneTrack() 0049 { 0050 DatabaseInterface musicDb; 0051 DataModel albumsModel; 0052 QAbstractItemModelTester testModel(&albumsModel); 0053 0054 connect(&musicDb, &DatabaseInterface::tracksAdded, 0055 &albumsModel, &DataModel::tracksAdded); 0056 connect(&musicDb, &DatabaseInterface::trackRemoved, 0057 &albumsModel, &DataModel::trackRemoved); 0058 connect(&musicDb, &DatabaseInterface::trackModified, 0059 &albumsModel, &DataModel::trackModified); 0060 0061 musicDb.init(QStringLiteral("testDb")); 0062 0063 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 0064 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 0065 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 0066 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 0067 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 0068 0069 QCOMPARE(beginInsertRowsSpy.count(), 0); 0070 QCOMPARE(endInsertRowsSpy.count(), 0); 0071 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0072 QCOMPARE(endRemoveRowsSpy.count(), 0); 0073 QCOMPARE(dataChangedSpy.count(), 0); 0074 0075 musicDb.insertTracksList(mNewTracks, mNewCovers); 0076 0077 QCOMPARE(beginInsertRowsSpy.count(), 0); 0078 QCOMPARE(endInsertRowsSpy.count(), 0); 0079 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0080 QCOMPARE(endRemoveRowsSpy.count(), 0); 0081 QCOMPARE(dataChangedSpy.count(), 0); 0082 0083 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {}, 0084 musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {}); 0085 0086 QCOMPARE(beginInsertRowsSpy.count(), 0); 0087 QCOMPARE(endInsertRowsSpy.count(), 0); 0088 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0089 QCOMPARE(endRemoveRowsSpy.count(), 0); 0090 QCOMPARE(dataChangedSpy.count(), 0); 0091 0092 albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")))); 0093 0094 QCOMPARE(albumsModel.rowCount(), 4); 0095 QCOMPARE(beginInsertRowsSpy.count(), 1); 0096 QCOMPARE(endInsertRowsSpy.count(), 1); 0097 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0098 QCOMPARE(endRemoveRowsSpy.count(), 0); 0099 QCOMPARE(dataChangedSpy.count(), 0); 0100 0101 auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); 0102 0103 auto firstTrack = musicDb.trackDataFromDatabaseId(trackId); 0104 0105 musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()}); 0106 0107 QCOMPARE(albumsModel.rowCount(), 3); 0108 QCOMPARE(beginInsertRowsSpy.count(), 1); 0109 QCOMPARE(endInsertRowsSpy.count(), 1); 0110 QCOMPARE(beginRemoveRowsSpy.count(), 1); 0111 QCOMPARE(endRemoveRowsSpy.count(), 1); 0112 QCOMPARE(dataChangedSpy.count(), 0); 0113 } 0114 0115 void removeOneAlbum() 0116 { 0117 DatabaseInterface musicDb; 0118 DataModel albumsModel; 0119 QAbstractItemModelTester testModel(&albumsModel); 0120 0121 connect(&musicDb, &DatabaseInterface::tracksAdded, 0122 &albumsModel, &DataModel::tracksAdded); 0123 connect(&musicDb, &DatabaseInterface::trackRemoved, 0124 &albumsModel, &DataModel::trackRemoved); 0125 connect(&musicDb, &DatabaseInterface::trackModified, 0126 &albumsModel, &DataModel::trackModified); 0127 0128 musicDb.init(QStringLiteral("testDb")); 0129 0130 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 0131 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 0132 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 0133 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 0134 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 0135 0136 QCOMPARE(beginInsertRowsSpy.count(), 0); 0137 QCOMPARE(endInsertRowsSpy.count(), 0); 0138 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0139 QCOMPARE(endRemoveRowsSpy.count(), 0); 0140 QCOMPARE(dataChangedSpy.count(), 0); 0141 0142 musicDb.insertTracksList(mNewTracks, mNewCovers); 0143 0144 QCOMPARE(beginInsertRowsSpy.count(), 0); 0145 QCOMPARE(endInsertRowsSpy.count(), 0); 0146 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0147 QCOMPARE(endRemoveRowsSpy.count(), 0); 0148 QCOMPARE(dataChangedSpy.count(), 0); 0149 0150 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {}, 0151 musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/")), {}); 0152 0153 QCOMPARE(beginInsertRowsSpy.count(), 0); 0154 QCOMPARE(endInsertRowsSpy.count(), 0); 0155 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0156 QCOMPARE(endRemoveRowsSpy.count(), 0); 0157 QCOMPARE(dataChangedSpy.count(), 0); 0158 0159 albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/")))); 0160 0161 QCOMPARE(albumsModel.rowCount(), 3); 0162 QCOMPARE(beginInsertRowsSpy.count(), 1); 0163 QCOMPARE(endInsertRowsSpy.count(), 1); 0164 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0165 QCOMPARE(endRemoveRowsSpy.count(), 0); 0166 QCOMPARE(dataChangedSpy.count(), 0); 0167 0168 auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), 0169 QStringLiteral("album3"), 1, 1); 0170 auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId); 0171 auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), 0172 QStringLiteral("album3"), 2, 1); 0173 auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId); 0174 auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), 0175 QStringLiteral("album3"), 3, 1); 0176 auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId); 0177 0178 musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl(), 0179 secondTrack[DataTypes::ResourceRole].toUrl(), 0180 thirdTrack[DataTypes::ResourceRole].toUrl()}); 0181 0182 QCOMPARE(albumsModel.rowCount(), 0); 0183 QCOMPARE(beginInsertRowsSpy.count(), 1); 0184 QCOMPARE(endInsertRowsSpy.count(), 1); 0185 QCOMPARE(beginRemoveRowsSpy.count(), 3); 0186 QCOMPARE(endRemoveRowsSpy.count(), 3); 0187 QCOMPARE(dataChangedSpy.count(), 0); 0188 } 0189 0190 void addOneTrack() 0191 { 0192 DatabaseInterface musicDb; 0193 DataModel albumsModel; 0194 QAbstractItemModelTester testModel(&albumsModel); 0195 0196 connect(&musicDb, &DatabaseInterface::tracksAdded, 0197 &albumsModel, &DataModel::tracksAdded); 0198 connect(&musicDb, &DatabaseInterface::trackRemoved, 0199 &albumsModel, &DataModel::trackRemoved); 0200 connect(&musicDb, &DatabaseInterface::trackModified, 0201 &albumsModel, &DataModel::trackModified); 0202 0203 musicDb.init(QStringLiteral("testDb")); 0204 0205 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 0206 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 0207 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 0208 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 0209 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 0210 0211 QCOMPARE(beginInsertRowsSpy.count(), 0); 0212 QCOMPARE(endInsertRowsSpy.count(), 0); 0213 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0214 QCOMPARE(endRemoveRowsSpy.count(), 0); 0215 QCOMPARE(dataChangedSpy.count(), 0); 0216 0217 auto newFiles = QList<QUrl>(); 0218 const auto &constNewTracks = mNewTracks; 0219 for (const auto &oneTrack : constNewTracks) { 0220 newFiles.push_back(oneTrack.resourceURI()); 0221 } 0222 0223 musicDb.insertTracksList(mNewTracks, mNewCovers); 0224 0225 QCOMPARE(beginInsertRowsSpy.count(), 0); 0226 QCOMPARE(endInsertRowsSpy.count(), 0); 0227 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0228 QCOMPARE(endRemoveRowsSpy.count(), 0); 0229 QCOMPARE(dataChangedSpy.count(), 0); 0230 0231 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {}, 0232 musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {}); 0233 0234 QCOMPARE(beginInsertRowsSpy.count(), 0); 0235 QCOMPARE(endInsertRowsSpy.count(), 0); 0236 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0237 QCOMPARE(endRemoveRowsSpy.count(), 0); 0238 QCOMPARE(dataChangedSpy.count(), 0); 0239 0240 albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")))); 0241 0242 QCOMPARE(albumsModel.rowCount(), 4); 0243 QCOMPARE(beginInsertRowsSpy.count(), 1); 0244 QCOMPARE(endInsertRowsSpy.count(), 1); 0245 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0246 QCOMPARE(endRemoveRowsSpy.count(), 0); 0247 QCOMPARE(dataChangedSpy.count(), 0); 0248 0249 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"), 0250 QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 6, 1, 0251 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 0252 QDateTime::fromMSecsSinceEpoch(23), 0253 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true, 0254 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 0255 auto newTracks = DataTypes::ListTrackDataType(); 0256 newTracks.push_back(newTrack); 0257 0258 auto newFiles2 = QList<QUrl>(); 0259 for (const auto &oneTrack : newTracks) { 0260 newFiles2.push_back(oneTrack.resourceURI()); 0261 } 0262 0263 musicDb.insertTracksList(newTracks, mNewCovers); 0264 0265 QCOMPARE(albumsModel.rowCount(), 5); 0266 QCOMPARE(beginInsertRowsSpy.count(), 2); 0267 QCOMPARE(endInsertRowsSpy.count(), 2); 0268 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0269 QCOMPARE(endRemoveRowsSpy.count(), 0); 0270 QCOMPARE(dataChangedSpy.count(), 0); 0271 0272 QCOMPARE(beginInsertRowsSpy.at(1).at(1).toInt(), 4); 0273 QCOMPARE(beginInsertRowsSpy.at(1).at(2).toInt(), 4); 0274 0275 QCOMPARE(albumsModel.data(albumsModel.index(4, 0), DataTypes::ColumnsRoles::TitleRole).toString(), QStringLiteral("track6")); 0276 0277 auto secondNewTrack = DataTypes::TrackDataType{true, QStringLiteral("$24"), QStringLiteral("0"), QStringLiteral("track5"), 0278 QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 5, 1, 0279 QTime::fromMSecsSinceStartOfDay(24), {QUrl::fromLocalFile(QStringLiteral("/$24"))}, 0280 QDateTime::fromMSecsSinceEpoch(24), 0281 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true, 0282 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 0283 auto secondNewTracks = DataTypes::ListTrackDataType(); 0284 secondNewTracks.push_back(secondNewTrack); 0285 0286 auto newFiles3 = QList<QUrl>(); 0287 for (const auto &oneTrack : secondNewTracks) { 0288 newFiles3.push_back(oneTrack.resourceURI()); 0289 } 0290 0291 musicDb.insertTracksList(secondNewTracks, mNewCovers); 0292 0293 QCOMPARE(albumsModel.rowCount(), 6); 0294 QCOMPARE(beginInsertRowsSpy.count(), 3); 0295 QCOMPARE(endInsertRowsSpy.count(), 3); 0296 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0297 QCOMPARE(endRemoveRowsSpy.count(), 0); 0298 QCOMPARE(dataChangedSpy.count(), 0); 0299 0300 QCOMPARE(beginInsertRowsSpy.at(2).at(1).toInt(), 4); 0301 QCOMPARE(beginInsertRowsSpy.at(2).at(2).toInt(), 4); 0302 0303 QCOMPARE(albumsModel.data(albumsModel.index(4, 0), DataTypes::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); 0304 } 0305 0306 void modifyOneTrack() 0307 { 0308 DatabaseInterface musicDb; 0309 DataModel albumsModel; 0310 QAbstractItemModelTester testModel(&albumsModel); 0311 0312 connect(&musicDb, &DatabaseInterface::tracksAdded, 0313 &albumsModel, &DataModel::tracksAdded); 0314 connect(&musicDb, &DatabaseInterface::trackRemoved, 0315 &albumsModel, &DataModel::trackRemoved); 0316 connect(&musicDb, &DatabaseInterface::trackModified, 0317 &albumsModel, &DataModel::trackModified); 0318 0319 musicDb.init(QStringLiteral("testDb")); 0320 0321 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 0322 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 0323 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 0324 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 0325 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 0326 0327 QCOMPARE(beginInsertRowsSpy.count(), 0); 0328 QCOMPARE(endInsertRowsSpy.count(), 0); 0329 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0330 QCOMPARE(endRemoveRowsSpy.count(), 0); 0331 QCOMPARE(dataChangedSpy.count(), 0); 0332 0333 auto newFiles = QList<QUrl>(); 0334 const auto &constNewTracks = mNewTracks; 0335 for (const auto &oneTrack : constNewTracks) { 0336 newFiles.push_back(oneTrack.resourceURI()); 0337 } 0338 0339 musicDb.insertTracksList(mNewTracks, mNewCovers); 0340 0341 QCOMPARE(beginInsertRowsSpy.count(), 0); 0342 QCOMPARE(endInsertRowsSpy.count(), 0); 0343 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0344 QCOMPARE(endRemoveRowsSpy.count(), 0); 0345 QCOMPARE(dataChangedSpy.count(), 0); 0346 0347 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {}, 0348 musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {}); 0349 0350 QCOMPARE(beginInsertRowsSpy.count(), 0); 0351 QCOMPARE(endInsertRowsSpy.count(), 0); 0352 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0353 QCOMPARE(endRemoveRowsSpy.count(), 0); 0354 QCOMPARE(dataChangedSpy.count(), 0); 0355 0356 albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")))); 0357 0358 QCOMPARE(albumsModel.rowCount(), 4); 0359 QCOMPARE(beginInsertRowsSpy.count(), 1); 0360 QCOMPARE(endInsertRowsSpy.count(), 1); 0361 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0362 QCOMPARE(endRemoveRowsSpy.count(), 0); 0363 QCOMPARE(dataChangedSpy.count(), 0); 0364 0365 auto modifiedTrack = DataTypes::TrackDataType{ 0366 true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"), 0367 QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 5, 3, 0368 QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$3"))}, 0369 QDateTime::fromMSecsSinceEpoch(23), 0370 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true, 0371 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 0372 0373 musicDb.insertTracksList({modifiedTrack}, mNewCovers); 0374 0375 QCOMPARE(albumsModel.rowCount(), 4); 0376 QCOMPARE(beginInsertRowsSpy.count(), 1); 0377 QCOMPARE(endInsertRowsSpy.count(), 1); 0378 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0379 QCOMPARE(endRemoveRowsSpy.count(), 0); 0380 QCOMPARE(dataChangedSpy.count(), 1); 0381 0382 QCOMPARE(dataChangedSpy.at(0).at(0).toModelIndex(), albumsModel.index(2, 0)); 0383 QCOMPARE(dataChangedSpy.at(0).at(1).toModelIndex(), albumsModel.index(2, 0)); 0384 0385 QCOMPARE(albumsModel.data(albumsModel.index(2, 0), DataTypes::ColumnsRoles::TrackNumberRole).toInt(), 5); 0386 } 0387 0388 0389 void removeOneTrackAllTracks() 0390 { 0391 DatabaseInterface musicDb; 0392 DataModel tracksModel; 0393 QAbstractItemModelTester testModel(&tracksModel); 0394 0395 connect(&musicDb, &DatabaseInterface::tracksAdded, 0396 &tracksModel, &DataModel::tracksAdded); 0397 connect(&musicDb, &DatabaseInterface::trackModified, 0398 &tracksModel, &DataModel::trackModified); 0399 connect(&musicDb, &DatabaseInterface::trackRemoved, 0400 &tracksModel, &DataModel::trackRemoved); 0401 0402 musicDb.init(QStringLiteral("testDb")); 0403 0404 QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted); 0405 QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted); 0406 QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved); 0407 QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved); 0408 QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged); 0409 0410 QCOMPARE(beginInsertRowsSpy.count(), 0); 0411 QCOMPARE(endInsertRowsSpy.count(), 0); 0412 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0413 QCOMPARE(endRemoveRowsSpy.count(), 0); 0414 QCOMPARE(dataChangedSpy.count(), 0); 0415 0416 tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {}); 0417 0418 QCOMPARE(beginInsertRowsSpy.count(), 0); 0419 QCOMPARE(endInsertRowsSpy.count(), 0); 0420 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0421 QCOMPARE(endRemoveRowsSpy.count(), 0); 0422 QCOMPARE(dataChangedSpy.count(), 0); 0423 0424 musicDb.insertTracksList(mNewTracks, mNewCovers); 0425 0426 QCOMPARE(beginInsertRowsSpy.count(), 1); 0427 QCOMPARE(endInsertRowsSpy.count(), 1); 0428 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0429 QCOMPARE(endRemoveRowsSpy.count(), 0); 0430 QCOMPARE(dataChangedSpy.count(), 0); 0431 0432 QCOMPARE(tracksModel.rowCount(), 23); 0433 0434 auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), 0435 QStringLiteral("album1"), 1, 1); 0436 0437 auto firstTrack = musicDb.trackDataFromDatabaseId(trackId); 0438 0439 musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()}); 0440 0441 QCOMPARE(beginInsertRowsSpy.count(), 1); 0442 QCOMPARE(endInsertRowsSpy.count(), 1); 0443 QCOMPARE(beginRemoveRowsSpy.count(), 1); 0444 QCOMPARE(endRemoveRowsSpy.count(), 1); 0445 QCOMPARE(dataChangedSpy.count(), 0); 0446 0447 QCOMPARE(tracksModel.rowCount(), 22); 0448 } 0449 0450 void removeOneAlbumAllTracks() 0451 { 0452 DatabaseInterface musicDb; 0453 DataModel tracksModel; 0454 QAbstractItemModelTester testModel(&tracksModel); 0455 0456 connect(&musicDb, &DatabaseInterface::tracksAdded, 0457 &tracksModel, &DataModel::tracksAdded); 0458 connect(&musicDb, &DatabaseInterface::trackModified, 0459 &tracksModel, &DataModel::trackModified); 0460 connect(&musicDb, &DatabaseInterface::trackRemoved, 0461 &tracksModel, &DataModel::trackRemoved); 0462 0463 musicDb.init(QStringLiteral("testDb")); 0464 0465 QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted); 0466 QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted); 0467 QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved); 0468 QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved); 0469 QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged); 0470 0471 QCOMPARE(beginInsertRowsSpy.count(), 0); 0472 QCOMPARE(endInsertRowsSpy.count(), 0); 0473 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0474 QCOMPARE(endRemoveRowsSpy.count(), 0); 0475 QCOMPARE(dataChangedSpy.count(), 0); 0476 0477 tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {}); 0478 0479 QCOMPARE(beginInsertRowsSpy.count(), 0); 0480 QCOMPARE(endInsertRowsSpy.count(), 0); 0481 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0482 QCOMPARE(endRemoveRowsSpy.count(), 0); 0483 QCOMPARE(dataChangedSpy.count(), 0); 0484 0485 musicDb.insertTracksList(mNewTracks, mNewCovers); 0486 0487 QCOMPARE(beginInsertRowsSpy.count(), 1); 0488 QCOMPARE(endInsertRowsSpy.count(), 1); 0489 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0490 QCOMPARE(endRemoveRowsSpy.count(), 0); 0491 QCOMPARE(dataChangedSpy.count(), 0); 0492 0493 QCOMPARE(tracksModel.rowCount(), 23); 0494 0495 auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), 0496 QStringLiteral("album3"), 1, 1); 0497 auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId); 0498 auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), 0499 QStringLiteral("album3"), 2, 1); 0500 auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId); 0501 auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), 0502 QStringLiteral("album3"), 3, 1); 0503 auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId); 0504 0505 musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl(), 0506 secondTrack[DataTypes::ResourceRole].toUrl(), 0507 thirdTrack[DataTypes::ResourceRole].toUrl()}); 0508 0509 QCOMPARE(beginInsertRowsSpy.count(), 1); 0510 QCOMPARE(endInsertRowsSpy.count(), 1); 0511 QCOMPARE(beginRemoveRowsSpy.count(), 3); 0512 QCOMPARE(endRemoveRowsSpy.count(), 3); 0513 QCOMPARE(dataChangedSpy.count(), 0); 0514 0515 QCOMPARE(tracksModel.rowCount(), 20); 0516 } 0517 0518 void addOneTrackAllTracks() 0519 { 0520 DatabaseInterface musicDb; 0521 DataModel tracksModel; 0522 QAbstractItemModelTester testModel(&tracksModel); 0523 0524 connect(&musicDb, &DatabaseInterface::tracksAdded, 0525 &tracksModel, &DataModel::tracksAdded); 0526 connect(&musicDb, &DatabaseInterface::trackModified, 0527 &tracksModel, &DataModel::trackModified); 0528 connect(&musicDb, &DatabaseInterface::trackRemoved, 0529 &tracksModel, &DataModel::trackRemoved); 0530 0531 musicDb.init(QStringLiteral("testDb")); 0532 0533 QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted); 0534 QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted); 0535 QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved); 0536 QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved); 0537 QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged); 0538 0539 QCOMPARE(beginInsertRowsSpy.count(), 0); 0540 QCOMPARE(endInsertRowsSpy.count(), 0); 0541 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0542 QCOMPARE(endRemoveRowsSpy.count(), 0); 0543 QCOMPARE(dataChangedSpy.count(), 0); 0544 0545 tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {}); 0546 0547 QCOMPARE(beginInsertRowsSpy.count(), 0); 0548 QCOMPARE(endInsertRowsSpy.count(), 0); 0549 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0550 QCOMPARE(endRemoveRowsSpy.count(), 0); 0551 QCOMPARE(dataChangedSpy.count(), 0); 0552 0553 musicDb.insertTracksList(mNewTracks, mNewCovers); 0554 0555 QCOMPARE(beginInsertRowsSpy.count(), 1); 0556 QCOMPARE(endInsertRowsSpy.count(), 1); 0557 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0558 QCOMPARE(endRemoveRowsSpy.count(), 0); 0559 QCOMPARE(dataChangedSpy.count(), 0); 0560 0561 QCOMPARE(tracksModel.rowCount(), 23); 0562 0563 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"), 0564 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23), 0565 {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 0566 QDateTime::fromMSecsSinceEpoch(23), 0567 {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true, 0568 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 0569 auto newTracks = DataTypes::ListTrackDataType(); 0570 newTracks.push_back(newTrack); 0571 0572 musicDb.insertTracksList(newTracks, mNewCovers); 0573 0574 QCOMPARE(beginInsertRowsSpy.count(), 2); 0575 QCOMPARE(endInsertRowsSpy.count(), 2); 0576 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0577 QCOMPARE(endRemoveRowsSpy.count(), 0); 0578 QCOMPARE(dataChangedSpy.count(), 0); 0579 0580 QCOMPARE(tracksModel.rowCount(), 24); 0581 } 0582 0583 void addOneAlbumAllTracks() 0584 { 0585 DatabaseInterface musicDb; 0586 DataModel tracksModel; 0587 QAbstractItemModelTester testModel(&tracksModel); 0588 0589 connect(&musicDb, &DatabaseInterface::tracksAdded, 0590 &tracksModel, &DataModel::tracksAdded); 0591 connect(&musicDb, &DatabaseInterface::trackModified, 0592 &tracksModel, &DataModel::trackModified); 0593 connect(&musicDb, &DatabaseInterface::trackRemoved, 0594 &tracksModel, &DataModel::trackRemoved); 0595 0596 musicDb.init(QStringLiteral("testDb")); 0597 0598 QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted); 0599 QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted); 0600 QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved); 0601 QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved); 0602 QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged); 0603 0604 QCOMPARE(beginInsertRowsSpy.count(), 0); 0605 QCOMPARE(endInsertRowsSpy.count(), 0); 0606 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0607 QCOMPARE(endRemoveRowsSpy.count(), 0); 0608 QCOMPARE(dataChangedSpy.count(), 0); 0609 0610 tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {}); 0611 0612 QCOMPARE(beginInsertRowsSpy.count(), 0); 0613 QCOMPARE(endInsertRowsSpy.count(), 0); 0614 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0615 QCOMPARE(endRemoveRowsSpy.count(), 0); 0616 QCOMPARE(dataChangedSpy.count(), 0); 0617 0618 auto newFiles = QList<QUrl>(); 0619 const auto &constNewTracks = mNewTracks; 0620 for (const auto &oneTrack : constNewTracks) { 0621 newFiles.push_back(oneTrack.resourceURI()); 0622 } 0623 0624 musicDb.insertTracksList(mNewTracks, mNewCovers); 0625 0626 QCOMPARE(beginInsertRowsSpy.count(), 1); 0627 QCOMPARE(endInsertRowsSpy.count(), 1); 0628 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0629 QCOMPARE(endRemoveRowsSpy.count(), 0); 0630 QCOMPARE(dataChangedSpy.count(), 0); 0631 0632 QCOMPARE(tracksModel.rowCount(), 23); 0633 0634 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"), 0635 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23), 0636 {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 0637 QDateTime::fromMSecsSinceEpoch(23), 0638 {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true, 0639 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 0640 auto newTracks = DataTypes::ListTrackDataType(); 0641 newTracks.push_back(newTrack); 0642 0643 auto newCover = QUrl::fromLocalFile(QStringLiteral("album5")); 0644 auto newCovers = QHash<QString, QUrl>(); 0645 newCovers[QStringLiteral("album5")] = newCover; 0646 0647 auto newFiles2 = QList<QUrl>(); 0648 for (const auto &oneTrack : newTracks) { 0649 newFiles2.push_back(oneTrack.resourceURI()); 0650 } 0651 0652 musicDb.insertTracksList(newTracks, newCovers); 0653 0654 QCOMPARE(beginInsertRowsSpy.count(), 2); 0655 QCOMPARE(endInsertRowsSpy.count(), 2); 0656 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0657 QCOMPARE(endRemoveRowsSpy.count(), 0); 0658 QCOMPARE(dataChangedSpy.count(), 0); 0659 0660 QCOMPARE(tracksModel.rowCount(), 24); 0661 } 0662 0663 void modifyOneTrackAllTracks() 0664 { 0665 DatabaseInterface musicDb; 0666 DataModel tracksModel; 0667 QAbstractItemModelTester testModel(&tracksModel); 0668 0669 connect(&musicDb, &DatabaseInterface::tracksAdded, 0670 &tracksModel, &DataModel::tracksAdded); 0671 connect(&musicDb, &DatabaseInterface::trackModified, 0672 &tracksModel, &DataModel::trackModified); 0673 connect(&musicDb, &DatabaseInterface::trackRemoved, 0674 &tracksModel, &DataModel::trackRemoved); 0675 0676 musicDb.init(QStringLiteral("testDb")); 0677 0678 QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted); 0679 QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted); 0680 QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved); 0681 QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved); 0682 QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged); 0683 0684 QCOMPARE(beginInsertRowsSpy.count(), 0); 0685 QCOMPARE(endInsertRowsSpy.count(), 0); 0686 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0687 QCOMPARE(endRemoveRowsSpy.count(), 0); 0688 QCOMPARE(dataChangedSpy.count(), 0); 0689 0690 tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {}); 0691 0692 QCOMPARE(beginInsertRowsSpy.count(), 0); 0693 QCOMPARE(endInsertRowsSpy.count(), 0); 0694 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0695 QCOMPARE(endRemoveRowsSpy.count(), 0); 0696 QCOMPARE(dataChangedSpy.count(), 0); 0697 0698 musicDb.insertTracksList(mNewTracks, mNewCovers); 0699 0700 QCOMPARE(beginInsertRowsSpy.count(), 1); 0701 QCOMPARE(endInsertRowsSpy.count(), 1); 0702 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0703 QCOMPARE(endRemoveRowsSpy.count(), 0); 0704 QCOMPARE(dataChangedSpy.count(), 0); 0705 0706 QCOMPARE(tracksModel.rowCount(), 23); 0707 0708 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"), 0709 QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 0710 1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$1"))}, 0711 QDateTime::fromMSecsSinceEpoch(1), 0712 {QUrl::fromLocalFile(QStringLiteral("file://image$1"))}, 5, true, 0713 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 0714 auto newTracks = DataTypes::ListTrackDataType(); 0715 newTracks.push_back(newTrack); 0716 0717 musicDb.insertTracksList(newTracks, mNewCovers); 0718 0719 QCOMPARE(beginInsertRowsSpy.count(), 1); 0720 QCOMPARE(endInsertRowsSpy.count(), 1); 0721 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0722 QCOMPARE(endRemoveRowsSpy.count(), 0); 0723 QCOMPARE(dataChangedSpy.count(), 1); 0724 0725 QCOMPARE(tracksModel.rowCount(), 23); 0726 0727 const auto &dataChangedSignal = dataChangedSpy.constFirst(); 0728 0729 QCOMPARE(dataChangedSignal.size(), 3); 0730 0731 auto changedIndex = dataChangedSignal.constFirst().toModelIndex(); 0732 0733 QCOMPARE(tracksModel.data(changedIndex, DataTypes::ColumnsRoles::RatingRole).isValid(), true); 0734 QCOMPARE(tracksModel.data(changedIndex, DataTypes::ColumnsRoles::RatingRole).toInt(), 5); 0735 } 0736 0737 void addEmptyTracksListAllTracks() 0738 { 0739 DataModel tracksModel; 0740 QAbstractItemModelTester testModel(&tracksModel); 0741 0742 auto newTracks = DataModel::ListTrackDataType{}; 0743 0744 QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted); 0745 QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted); 0746 QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved); 0747 QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved); 0748 QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged); 0749 0750 QCOMPARE(beginInsertRowsSpy.count(), 0); 0751 QCOMPARE(endInsertRowsSpy.count(), 0); 0752 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0753 QCOMPARE(endRemoveRowsSpy.count(), 0); 0754 QCOMPARE(dataChangedSpy.count(), 0); 0755 0756 tracksModel.tracksAdded(newTracks); 0757 0758 QCOMPARE(beginInsertRowsSpy.count(), 0); 0759 QCOMPARE(endInsertRowsSpy.count(), 0); 0760 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0761 QCOMPARE(endRemoveRowsSpy.count(), 0); 0762 QCOMPARE(dataChangedSpy.count(), 0); 0763 0764 QCOMPARE(tracksModel.rowCount(), 0); 0765 } 0766 0767 void addTracksListTwiceAllTracks() 0768 { 0769 DatabaseInterface musicDb; 0770 DataModel tracksModel; 0771 QAbstractItemModelTester testModel(&tracksModel); 0772 0773 connect(&musicDb, &DatabaseInterface::tracksAdded, 0774 &tracksModel, &DataModel::tracksAdded); 0775 connect(&musicDb, &DatabaseInterface::trackModified, 0776 &tracksModel, &DataModel::trackModified); 0777 connect(&musicDb, &DatabaseInterface::trackRemoved, 0778 &tracksModel, &DataModel::trackRemoved); 0779 0780 musicDb.init(QStringLiteral("testDb")); 0781 0782 QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted); 0783 QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted); 0784 QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved); 0785 QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved); 0786 QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged); 0787 0788 QCOMPARE(beginInsertRowsSpy.count(), 0); 0789 QCOMPARE(endInsertRowsSpy.count(), 0); 0790 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0791 QCOMPARE(endRemoveRowsSpy.count(), 0); 0792 QCOMPARE(dataChangedSpy.count(), 0); 0793 0794 tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {}); 0795 0796 QCOMPARE(beginInsertRowsSpy.count(), 0); 0797 QCOMPARE(endInsertRowsSpy.count(), 0); 0798 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0799 QCOMPARE(endRemoveRowsSpy.count(), 0); 0800 QCOMPARE(dataChangedSpy.count(), 0); 0801 0802 musicDb.insertTracksList(mNewTracks, mNewCovers); 0803 0804 QCOMPARE(beginInsertRowsSpy.count(), 1); 0805 QCOMPARE(endInsertRowsSpy.count(), 1); 0806 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0807 QCOMPARE(endRemoveRowsSpy.count(), 0); 0808 QCOMPARE(dataChangedSpy.count(), 0); 0809 0810 QCOMPARE(tracksModel.rowCount(), 23); 0811 0812 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"), 0813 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23), 0814 {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 0815 QDateTime::fromMSecsSinceEpoch(23), 0816 {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true, 0817 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 0818 0819 auto newTracks = DataTypes::ListTrackDataType(); 0820 newTracks.push_back(newTrack); 0821 0822 musicDb.insertTracksList(newTracks, mNewCovers); 0823 0824 QCOMPARE(beginInsertRowsSpy.count(), 2); 0825 QCOMPARE(endInsertRowsSpy.count(), 2); 0826 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0827 QCOMPARE(endRemoveRowsSpy.count(), 0); 0828 QCOMPARE(dataChangedSpy.count(), 0); 0829 0830 QCOMPARE(tracksModel.rowCount(), 24); 0831 } 0832 0833 void removeOneTrackAllAlbums() 0834 { 0835 DatabaseInterface musicDb; 0836 DataModel albumsModel; 0837 QAbstractItemModelTester testModel(&albumsModel); 0838 0839 connect(&musicDb, &DatabaseInterface::albumsAdded, 0840 &albumsModel, &DataModel::albumsAdded); 0841 connect(&musicDb, &DatabaseInterface::albumModified, 0842 &albumsModel, &DataModel::albumModified); 0843 connect(&musicDb, &DatabaseInterface::albumRemoved, 0844 &albumsModel, &DataModel::albumRemoved); 0845 0846 musicDb.init(QStringLiteral("testDb")); 0847 0848 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 0849 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 0850 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 0851 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 0852 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 0853 0854 QCOMPARE(beginInsertRowsSpy.count(), 0); 0855 QCOMPARE(endInsertRowsSpy.count(), 0); 0856 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0857 QCOMPARE(endRemoveRowsSpy.count(), 0); 0858 QCOMPARE(dataChangedSpy.count(), 0); 0859 0860 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {}); 0861 0862 QCOMPARE(beginInsertRowsSpy.count(), 0); 0863 QCOMPARE(endInsertRowsSpy.count(), 0); 0864 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0865 QCOMPARE(endRemoveRowsSpy.count(), 0); 0866 QCOMPARE(dataChangedSpy.count(), 0); 0867 0868 musicDb.insertTracksList(mNewTracks, mNewCovers); 0869 0870 QCOMPARE(albumsModel.rowCount(), 5); 0871 QCOMPARE(beginInsertRowsSpy.count(), 1); 0872 QCOMPARE(endInsertRowsSpy.count(), 1); 0873 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0874 QCOMPARE(endRemoveRowsSpy.count(), 0); 0875 QCOMPARE(dataChangedSpy.count(), 0); 0876 0877 auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); 0878 0879 auto firstTrack = musicDb.trackDataFromDatabaseId(trackId); 0880 0881 QVERIFY(!firstTrack.isEmpty()); 0882 0883 musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()}); 0884 0885 QCOMPARE(albumsModel.rowCount(), 5); 0886 QCOMPARE(beginInsertRowsSpy.count(), 1); 0887 QCOMPARE(endInsertRowsSpy.count(), 1); 0888 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0889 QCOMPARE(endRemoveRowsSpy.count(), 0); 0890 QCOMPARE(dataChangedSpy.count(), 1); 0891 } 0892 0893 void removeOneAlbumAllAlbums() 0894 { 0895 DatabaseInterface musicDb; 0896 DataModel albumsModel; 0897 QAbstractItemModelTester testModel(&albumsModel); 0898 0899 connect(&musicDb, &DatabaseInterface::albumsAdded, 0900 &albumsModel, &DataModel::albumsAdded); 0901 connect(&musicDb, &DatabaseInterface::albumModified, 0902 &albumsModel, &DataModel::albumModified); 0903 connect(&musicDb, &DatabaseInterface::albumRemoved, 0904 &albumsModel, &DataModel::albumRemoved); 0905 0906 musicDb.init(QStringLiteral("testDb")); 0907 0908 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 0909 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 0910 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 0911 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 0912 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 0913 0914 QCOMPARE(albumsModel.rowCount(), 0); 0915 QCOMPARE(beginInsertRowsSpy.count(), 0); 0916 QCOMPARE(endInsertRowsSpy.count(), 0); 0917 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0918 QCOMPARE(endRemoveRowsSpy.count(), 0); 0919 QCOMPARE(dataChangedSpy.count(), 0); 0920 0921 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {}); 0922 0923 QCOMPARE(beginInsertRowsSpy.count(), 0); 0924 QCOMPARE(endInsertRowsSpy.count(), 0); 0925 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0926 QCOMPARE(endRemoveRowsSpy.count(), 0); 0927 QCOMPARE(dataChangedSpy.count(), 0); 0928 0929 musicDb.insertTracksList(mNewTracks, mNewCovers); 0930 0931 QCOMPARE(albumsModel.rowCount(), 5); 0932 QCOMPARE(beginInsertRowsSpy.count(), 1); 0933 QCOMPARE(endInsertRowsSpy.count(), 1); 0934 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0935 QCOMPARE(endRemoveRowsSpy.count(), 0); 0936 QCOMPARE(dataChangedSpy.count(), 0); 0937 0938 auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), 0939 QStringLiteral("album3"), 1, 1); 0940 auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId); 0941 auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), 0942 QStringLiteral("album3"), 2, 1); 0943 auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId); 0944 auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), 0945 QStringLiteral("album3"), 3, 1); 0946 auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId); 0947 0948 musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl(), 0949 secondTrack[DataTypes::ResourceRole].toUrl(), 0950 thirdTrack[DataTypes::ResourceRole].toUrl()}); 0951 0952 QCOMPARE(albumsModel.rowCount(), 4); 0953 QCOMPARE(beginInsertRowsSpy.count(), 1); 0954 QCOMPARE(endInsertRowsSpy.count(), 1); 0955 QCOMPARE(beginRemoveRowsSpy.count(), 1); 0956 QCOMPARE(endRemoveRowsSpy.count(), 1); 0957 QCOMPARE(dataChangedSpy.count(), 0); 0958 } 0959 0960 void addOneTrackAllAlbums() 0961 { 0962 DatabaseInterface musicDb; 0963 DataModel albumsModel; 0964 QAbstractItemModelTester testModel(&albumsModel); 0965 0966 connect(&musicDb, &DatabaseInterface::albumsAdded, 0967 &albumsModel, &DataModel::albumsAdded); 0968 connect(&musicDb, &DatabaseInterface::albumModified, 0969 &albumsModel, &DataModel::albumModified); 0970 connect(&musicDb, &DatabaseInterface::albumRemoved, 0971 &albumsModel, &DataModel::albumRemoved); 0972 0973 musicDb.init(QStringLiteral("testDb")); 0974 0975 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 0976 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 0977 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 0978 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 0979 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 0980 0981 QCOMPARE(beginInsertRowsSpy.count(), 0); 0982 QCOMPARE(endInsertRowsSpy.count(), 0); 0983 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0984 QCOMPARE(endRemoveRowsSpy.count(), 0); 0985 QCOMPARE(dataChangedSpy.count(), 0); 0986 0987 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {}); 0988 0989 QCOMPARE(beginInsertRowsSpy.count(), 0); 0990 QCOMPARE(endInsertRowsSpy.count(), 0); 0991 QCOMPARE(beginRemoveRowsSpy.count(), 0); 0992 QCOMPARE(endRemoveRowsSpy.count(), 0); 0993 QCOMPARE(dataChangedSpy.count(), 0); 0994 0995 musicDb.insertTracksList(mNewTracks, mNewCovers); 0996 0997 QCOMPARE(beginInsertRowsSpy.count(), 1); 0998 QCOMPARE(endInsertRowsSpy.count(), 1); 0999 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1000 QCOMPARE(endRemoveRowsSpy.count(), 0); 1001 QCOMPARE(dataChangedSpy.count(), 0); 1002 1003 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"), 1004 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23), 1005 {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 1006 QDateTime::fromMSecsSinceEpoch(23), 1007 {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true, 1008 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 1009 auto newTracks = DataTypes::ListTrackDataType(); 1010 newTracks.push_back(newTrack); 1011 1012 musicDb.insertTracksList(newTracks, mNewCovers); 1013 1014 QCOMPARE(beginInsertRowsSpy.count(), 1); 1015 QCOMPARE(endInsertRowsSpy.count(), 1); 1016 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1017 QCOMPARE(endRemoveRowsSpy.count(), 0); 1018 QCOMPARE(dataChangedSpy.count(), 1); 1019 } 1020 1021 void addOneAlbumAllAlbums() 1022 { 1023 DatabaseInterface musicDb; 1024 DataModel albumsModel; 1025 QAbstractItemModelTester testModel(&albumsModel); 1026 1027 connect(&musicDb, &DatabaseInterface::albumsAdded, 1028 &albumsModel, &DataModel::albumsAdded); 1029 connect(&musicDb, &DatabaseInterface::albumModified, 1030 &albumsModel, &DataModel::albumModified); 1031 connect(&musicDb, &DatabaseInterface::albumRemoved, 1032 &albumsModel, &DataModel::albumRemoved); 1033 1034 musicDb.init(QStringLiteral("testDb")); 1035 1036 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 1037 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 1038 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 1039 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 1040 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 1041 1042 QCOMPARE(beginInsertRowsSpy.count(), 0); 1043 QCOMPARE(endInsertRowsSpy.count(), 0); 1044 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1045 QCOMPARE(endRemoveRowsSpy.count(), 0); 1046 QCOMPARE(dataChangedSpy.count(), 0); 1047 1048 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {}); 1049 1050 QCOMPARE(beginInsertRowsSpy.count(), 0); 1051 QCOMPARE(endInsertRowsSpy.count(), 0); 1052 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1053 QCOMPARE(endRemoveRowsSpy.count(), 0); 1054 QCOMPARE(dataChangedSpy.count(), 0); 1055 1056 auto newFiles = QList<QUrl>(); 1057 const auto &constNewTracks = mNewTracks; 1058 for (const auto &oneTrack : constNewTracks) { 1059 newFiles.push_back(oneTrack.resourceURI()); 1060 } 1061 1062 musicDb.insertTracksList(mNewTracks, mNewCovers); 1063 1064 QCOMPARE(beginInsertRowsSpy.count(), 1); 1065 QCOMPARE(endInsertRowsSpy.count(), 1); 1066 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1067 QCOMPARE(endRemoveRowsSpy.count(), 0); 1068 QCOMPARE(dataChangedSpy.count(), 0); 1069 1070 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track1"), 1071 QStringLiteral("artist2"), QStringLiteral("album5"), QStringLiteral("artist2"), 1, 1, 1072 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 1073 QDateTime::fromMSecsSinceEpoch(23), 1074 {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true, 1075 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 1076 auto newTracks = DataTypes::ListTrackDataType(); 1077 newTracks.push_back(newTrack); 1078 1079 auto newCover = QUrl::fromLocalFile(QStringLiteral("album5")); 1080 auto newCovers = QHash<QString, QUrl>(); 1081 newCovers[QStringLiteral("album5")] = newCover; 1082 1083 musicDb.insertTracksList(newTracks, newCovers); 1084 1085 QCOMPARE(beginInsertRowsSpy.count(), 2); 1086 QCOMPARE(endInsertRowsSpy.count(), 2); 1087 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1088 QCOMPARE(endRemoveRowsSpy.count(), 0); 1089 QCOMPARE(dataChangedSpy.count(), 0); 1090 } 1091 1092 void removeOneArtistAllArtists() 1093 { 1094 DatabaseInterface musicDb; 1095 DataModel artistsModel; 1096 QAbstractItemModelTester testModel(&artistsModel); 1097 1098 musicDb.init(QStringLiteral("testDb")); 1099 1100 QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted); 1101 QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted); 1102 QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved); 1103 QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved); 1104 QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged); 1105 1106 QCOMPARE(artistsModel.rowCount(), 0); 1107 QCOMPARE(beginInsertRowsSpy.count(), 0); 1108 QCOMPARE(endInsertRowsSpy.count(), 0); 1109 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1110 QCOMPARE(endRemoveRowsSpy.count(), 0); 1111 QCOMPARE(dataChangedSpy.count(), 0); 1112 1113 artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Artist, ElisaUtils::NoFilter, {}, {}, 0, {}); 1114 1115 QCOMPARE(artistsModel.rowCount(), 0); 1116 QCOMPARE(beginInsertRowsSpy.count(), 0); 1117 QCOMPARE(endInsertRowsSpy.count(), 0); 1118 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1119 QCOMPARE(endRemoveRowsSpy.count(), 0); 1120 QCOMPARE(dataChangedSpy.count(), 0); 1121 1122 auto newFiles = QList<QUrl>(); 1123 const auto &constNewTracks = mNewTracks; 1124 for (const auto &oneTrack : constNewTracks) { 1125 newFiles.push_back(oneTrack.resourceURI()); 1126 } 1127 1128 musicDb.insertTracksList(mNewTracks, mNewCovers); 1129 1130 beginInsertRowsSpy.wait(); 1131 1132 QCOMPARE(artistsModel.rowCount(), 7); 1133 QCOMPARE(beginInsertRowsSpy.count(), 1); 1134 QCOMPARE(endInsertRowsSpy.count(), 1); 1135 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1136 QCOMPARE(endRemoveRowsSpy.count(), 0); 1137 QCOMPARE(dataChangedSpy.count(), 0); 1138 1139 auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1); 1140 1141 auto firstTrack = musicDb.trackDataFromDatabaseId(trackId); 1142 1143 musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()}); 1144 1145 beginRemoveRowsSpy.wait(); 1146 1147 QCOMPARE(artistsModel.rowCount(), 6); 1148 QCOMPARE(beginInsertRowsSpy.count(), 1); 1149 QCOMPARE(endInsertRowsSpy.count(), 1); 1150 QCOMPARE(beginRemoveRowsSpy.count(), 1); 1151 QCOMPARE(endRemoveRowsSpy.count(), 1); 1152 QCOMPARE(dataChangedSpy.count(), 0); 1153 } 1154 1155 void addOneArtistAllArtists() 1156 { 1157 DatabaseInterface musicDb; 1158 DataModel artistsModel; 1159 QAbstractItemModelTester testModel(&artistsModel); 1160 1161 musicDb.init(QStringLiteral("testDb")); 1162 1163 QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted); 1164 QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted); 1165 QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved); 1166 QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved); 1167 QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged); 1168 1169 QCOMPARE(artistsModel.rowCount(), 0); 1170 QCOMPARE(beginInsertRowsSpy.count(), 0); 1171 QCOMPARE(endInsertRowsSpy.count(), 0); 1172 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1173 QCOMPARE(endRemoveRowsSpy.count(), 0); 1174 QCOMPARE(dataChangedSpy.count(), 0); 1175 1176 artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Artist, ElisaUtils::NoFilter, {}, {}, 0, {}); 1177 1178 QCOMPARE(artistsModel.rowCount(), 0); 1179 QCOMPARE(beginInsertRowsSpy.count(), 0); 1180 QCOMPARE(endInsertRowsSpy.count(), 0); 1181 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1182 QCOMPARE(endRemoveRowsSpy.count(), 0); 1183 QCOMPARE(dataChangedSpy.count(), 0); 1184 1185 auto newFiles = QList<QUrl>(); 1186 const auto &constNewTracks = mNewTracks; 1187 for (const auto &oneTrack : constNewTracks) { 1188 newFiles.push_back(oneTrack.resourceURI()); 1189 } 1190 1191 musicDb.insertTracksList(mNewTracks, mNewCovers); 1192 1193 beginInsertRowsSpy.wait(); 1194 1195 QCOMPARE(artistsModel.rowCount(), 7); 1196 QCOMPARE(beginInsertRowsSpy.count(), 1); 1197 QCOMPARE(endInsertRowsSpy.count(), 1); 1198 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1199 QCOMPARE(endRemoveRowsSpy.count(), 0); 1200 QCOMPARE(dataChangedSpy.count(), 0); 1201 1202 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"), 1203 QStringLiteral("artist6"), QStringLiteral("album4"), QStringLiteral("Various Artists"), 23, 1, QTime::fromMSecsSinceStartOfDay(23), 1204 {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 1205 QDateTime::fromMSecsSinceEpoch(23), 1206 {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true, 1207 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 1208 auto newTracks = DataTypes::ListTrackDataType(); 1209 newTracks.push_back(newTrack); 1210 1211 auto newFiles2 = QList<QUrl>(); 1212 for (const auto &oneTrack : newTracks) { 1213 newFiles2.push_back(oneTrack.resourceURI()); 1214 } 1215 1216 musicDb.insertTracksList(newTracks, mNewCovers); 1217 1218 beginInsertRowsSpy.wait(); 1219 1220 QCOMPARE(artistsModel.rowCount(), 8); 1221 QCOMPARE(beginInsertRowsSpy.count(), 2); 1222 QCOMPARE(endInsertRowsSpy.count(), 2); 1223 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1224 QCOMPARE(endRemoveRowsSpy.count(), 0); 1225 QCOMPARE(dataChangedSpy.count(), 0); 1226 } 1227 1228 void displayAlbumsFromOneArtist() 1229 { 1230 QTemporaryFile databaseFile; 1231 databaseFile.open(); 1232 1233 qDebug() << "displayAlbumsFromOneArtist" << databaseFile.fileName(); 1234 1235 DatabaseInterface musicDb; 1236 DataModel artistsModel; 1237 QAbstractItemModelTester testModel(&artistsModel); 1238 1239 musicDb.init(QStringLiteral("testDb"), databaseFile.fileName()); 1240 1241 QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted); 1242 QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted); 1243 QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved); 1244 QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved); 1245 QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset); 1246 QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset); 1247 QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged); 1248 1249 QCOMPARE(artistsModel.rowCount(), 0); 1250 QCOMPARE(beginInsertRowsSpy.count(), 0); 1251 QCOMPARE(endInsertRowsSpy.count(), 0); 1252 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1253 QCOMPARE(endRemoveRowsSpy.count(), 0); 1254 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1255 QCOMPARE(modelResetSpy.count(), 0); 1256 QCOMPARE(dataChangedSpy.count(), 0); 1257 1258 artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Album, ElisaUtils::FilterByArtist, {}, QStringLiteral("artist1"), 0, {}); 1259 1260 QCOMPARE(artistsModel.rowCount(), 0); 1261 QCOMPARE(beginInsertRowsSpy.count(), 0); 1262 QCOMPARE(endInsertRowsSpy.count(), 0); 1263 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1264 QCOMPARE(endRemoveRowsSpy.count(), 0); 1265 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1266 QCOMPARE(modelResetSpy.count(), 0); 1267 QCOMPARE(dataChangedSpy.count(), 0); 1268 1269 auto newFiles = QList<QUrl>(); 1270 const auto &constNewTracks = mNewTracks; 1271 for (const auto &oneTrack : constNewTracks) { 1272 newFiles.push_back(oneTrack.resourceURI()); 1273 } 1274 1275 musicDb.insertTracksList(mNewTracks, mNewCovers); 1276 1277 beginInsertRowsSpy.wait(); 1278 1279 QCOMPARE(artistsModel.rowCount(), 1); 1280 QCOMPARE(beginInsertRowsSpy.count(), 1); 1281 QCOMPARE(endInsertRowsSpy.count(), 1); 1282 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1283 QCOMPARE(endRemoveRowsSpy.count(), 0); 1284 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1285 QCOMPARE(modelResetSpy.count(), 0); 1286 QCOMPARE(dataChangedSpy.count(), 0); 1287 } 1288 1289 void displayArtistsFromOneGenre() 1290 { 1291 QTemporaryFile databaseFile; 1292 databaseFile.open(); 1293 1294 qDebug() << "displayArtistsFromOneGenre" << databaseFile.fileName(); 1295 1296 DatabaseInterface musicDb; 1297 DataModel artistsModel; 1298 QAbstractItemModelTester testModel(&artistsModel); 1299 1300 musicDb.init(QStringLiteral("testDb"), databaseFile.fileName()); 1301 1302 QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted); 1303 QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted); 1304 QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved); 1305 QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved); 1306 QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset); 1307 QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset); 1308 QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged); 1309 1310 QCOMPARE(artistsModel.rowCount(), 0); 1311 QCOMPARE(beginInsertRowsSpy.count(), 0); 1312 QCOMPARE(endInsertRowsSpy.count(), 0); 1313 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1314 QCOMPARE(endRemoveRowsSpy.count(), 0); 1315 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1316 QCOMPARE(modelResetSpy.count(), 0); 1317 QCOMPARE(dataChangedSpy.count(), 0); 1318 1319 artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Artist, ElisaUtils::FilterByGenre, QStringLiteral("genre1"), {}, 0, {}); 1320 1321 QCOMPARE(artistsModel.rowCount(), 0); 1322 QCOMPARE(beginInsertRowsSpy.count(), 0); 1323 QCOMPARE(endInsertRowsSpy.count(), 0); 1324 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1325 QCOMPARE(endRemoveRowsSpy.count(), 0); 1326 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1327 QCOMPARE(modelResetSpy.count(), 0); 1328 QCOMPARE(dataChangedSpy.count(), 0); 1329 1330 auto newFiles = QList<QUrl>(); 1331 const auto &constNewTracks = mNewTracks; 1332 for (const auto &oneTrack : constNewTracks) { 1333 newFiles.push_back(oneTrack.resourceURI()); 1334 } 1335 1336 musicDb.insertTracksList(mNewTracks, mNewCovers); 1337 1338 beginInsertRowsSpy.wait(); 1339 1340 QCOMPARE(artistsModel.rowCount(), 4); 1341 QCOMPARE(beginInsertRowsSpy.count(), 1); 1342 QCOMPARE(endInsertRowsSpy.count(), 1); 1343 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1344 QCOMPARE(endRemoveRowsSpy.count(), 0); 1345 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1346 QCOMPARE(modelResetSpy.count(), 0); 1347 QCOMPARE(dataChangedSpy.count(), 0); 1348 } 1349 1350 void displayAlbumsFromOneArtistAndGenre() 1351 { 1352 QTemporaryFile databaseFile; 1353 databaseFile.open(); 1354 1355 qDebug() << "displayAlbumsFromOneArtistAndGenre" << databaseFile.fileName(); 1356 1357 DatabaseInterface musicDb; 1358 DataModel artistsModel; 1359 QAbstractItemModelTester testModel(&artistsModel); 1360 1361 musicDb.init(QStringLiteral("testDb"), databaseFile.fileName()); 1362 1363 QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted); 1364 QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted); 1365 QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved); 1366 QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved); 1367 QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset); 1368 QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset); 1369 QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged); 1370 1371 QCOMPARE(artistsModel.rowCount(), 0); 1372 QCOMPARE(beginInsertRowsSpy.count(), 0); 1373 QCOMPARE(endInsertRowsSpy.count(), 0); 1374 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1375 QCOMPARE(endRemoveRowsSpy.count(), 0); 1376 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1377 QCOMPARE(modelResetSpy.count(), 0); 1378 QCOMPARE(dataChangedSpy.count(), 0); 1379 1380 artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Album, ElisaUtils::FilterByGenreAndArtist, 1381 QStringLiteral("genre3"), QStringLiteral("artist2"), 0, {}); 1382 1383 QCOMPARE(artistsModel.rowCount(), 0); 1384 QCOMPARE(beginInsertRowsSpy.count(), 0); 1385 QCOMPARE(endInsertRowsSpy.count(), 0); 1386 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1387 QCOMPARE(endRemoveRowsSpy.count(), 0); 1388 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1389 QCOMPARE(modelResetSpy.count(), 0); 1390 QCOMPARE(dataChangedSpy.count(), 0); 1391 1392 auto newFiles = QList<QUrl>(); 1393 const auto &constNewTracks = mNewTracks; 1394 for (const auto &oneTrack : constNewTracks) { 1395 newFiles.push_back(oneTrack.resourceURI()); 1396 } 1397 1398 musicDb.insertTracksList(mNewTracks, mNewCovers); 1399 1400 beginInsertRowsSpy.wait(); 1401 1402 QCOMPARE(artistsModel.rowCount(), 2); 1403 QCOMPARE(beginInsertRowsSpy.count(), 1); 1404 QCOMPARE(endInsertRowsSpy.count(), 1); 1405 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1406 QCOMPARE(endRemoveRowsSpy.count(), 0); 1407 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1408 QCOMPARE(modelResetSpy.count(), 0); 1409 QCOMPARE(dataChangedSpy.count(), 0); 1410 } 1411 1412 void displayTracksFromOneAlbum() 1413 { 1414 QTemporaryFile databaseFile; 1415 databaseFile.open(); 1416 1417 qDebug() << "displayTracksFromOneAlbum" << databaseFile.fileName(); 1418 1419 DatabaseInterface musicDb; 1420 DataModel artistsModel; 1421 QAbstractItemModelTester testModel(&artistsModel); 1422 1423 musicDb.init(QStringLiteral("testDb"), databaseFile.fileName()); 1424 1425 QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted); 1426 QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted); 1427 QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved); 1428 QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved); 1429 QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset); 1430 QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset); 1431 QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged); 1432 1433 QCOMPARE(artistsModel.rowCount(), 0); 1434 QCOMPARE(beginInsertRowsSpy.count(), 0); 1435 QCOMPARE(endInsertRowsSpy.count(), 0); 1436 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1437 QCOMPARE(endRemoveRowsSpy.count(), 0); 1438 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1439 QCOMPARE(modelResetSpy.count(), 0); 1440 QCOMPARE(dataChangedSpy.count(), 0); 1441 1442 musicDb.insertTracksList(mNewTracks, mNewCovers); 1443 1444 QCOMPARE(artistsModel.rowCount(), 0); 1445 QCOMPARE(beginInsertRowsSpy.count(), 0); 1446 QCOMPARE(endInsertRowsSpy.count(), 0); 1447 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1448 QCOMPARE(endRemoveRowsSpy.count(), 0); 1449 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1450 QCOMPARE(modelResetSpy.count(), 0); 1451 QCOMPARE(dataChangedSpy.count(), 0); 1452 1453 auto albumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), 1454 QStringLiteral("Various Artists"), 1455 QStringLiteral("/")); 1456 1457 QVERIFY(albumId != 0); 1458 1459 artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Track, ElisaUtils::FilterById, {}, {}, albumId, {}); 1460 1461 beginInsertRowsSpy.wait(); 1462 1463 QCOMPARE(artistsModel.rowCount(), 4); 1464 QCOMPARE(beginInsertRowsSpy.count(), 1); 1465 QCOMPARE(endInsertRowsSpy.count(), 1); 1466 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1467 QCOMPARE(endRemoveRowsSpy.count(), 0); 1468 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1469 QCOMPARE(modelResetSpy.count(), 0); 1470 QCOMPARE(dataChangedSpy.count(), 0); 1471 1472 auto newTracks = DataTypes::ListTrackDataType(); 1473 1474 newTracks = {{true, QStringLiteral("$31"), QStringLiteral("0"), QStringLiteral("track12"), 1475 QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 1476 12, 1, QTime::fromMSecsSinceStartOfDay(31), 1477 {QUrl::fromLocalFile(QStringLiteral("/$31"))}, 1478 QDateTime::fromMSecsSinceEpoch(31), 1479 {QUrl::fromLocalFile(QStringLiteral("album1"))}, 5, true, 1480 QStringLiteral("genre4"), QStringLiteral("composer4"), QStringLiteral("lyricist4"), true}, 1481 {true, QStringLiteral("$32"), QStringLiteral("0"), QStringLiteral("track13"), 1482 QStringLiteral("artist3"), QStringLiteral("album3"), QStringLiteral("artist3"), 1483 13, 1, QTime::fromMSecsSinceStartOfDay(32), 1484 {QUrl::fromLocalFile(QStringLiteral("/$32"))}, 1485 QDateTime::fromMSecsSinceEpoch(32), 1486 {QUrl::fromLocalFile(QStringLiteral("album3"))}, 4, true, 1487 QStringLiteral("genre3"), QStringLiteral("composer3"), QStringLiteral("lyricist3"), false}}; 1488 1489 auto newCovers = mNewCovers; 1490 newCovers[QStringLiteral("file:///$31")] = QUrl::fromLocalFile(QStringLiteral("album1")); 1491 newCovers[QStringLiteral("file:///$32")] = QUrl::fromLocalFile(QStringLiteral("album3")); 1492 1493 musicDb.insertTracksList(newTracks, newCovers); 1494 1495 beginInsertRowsSpy.wait(); 1496 1497 QCOMPARE(artistsModel.rowCount(), 5); 1498 QCOMPARE(beginInsertRowsSpy.count(), 2); 1499 QCOMPARE(endInsertRowsSpy.count(), 2); 1500 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1501 QCOMPARE(endRemoveRowsSpy.count(), 0); 1502 QCOMPARE(modelAboutToBeResetSpy.count(), 0); 1503 QCOMPARE(modelResetSpy.count(), 0); 1504 QCOMPARE(dataChangedSpy.count(), 0); 1505 } 1506 1507 void addOneTrackWrongOrder() 1508 { 1509 DatabaseInterface musicDb; 1510 DataModel albumsModel; 1511 QAbstractItemModelTester testModel(&albumsModel); 1512 1513 connect(&musicDb, &DatabaseInterface::tracksAdded, 1514 &albumsModel, &DataModel::tracksAdded); 1515 connect(&musicDb, &DatabaseInterface::trackRemoved, 1516 &albumsModel, &DataModel::trackRemoved); 1517 connect(&musicDb, &DatabaseInterface::trackModified, 1518 &albumsModel, &DataModel::trackModified); 1519 1520 musicDb.init(QStringLiteral("testDb")); 1521 1522 QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted); 1523 QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted); 1524 QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved); 1525 QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved); 1526 QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged); 1527 1528 QCOMPARE(beginInsertRowsSpy.count(), 0); 1529 QCOMPARE(endInsertRowsSpy.count(), 0); 1530 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1531 QCOMPARE(endRemoveRowsSpy.count(), 0); 1532 QCOMPARE(dataChangedSpy.count(), 0); 1533 1534 auto newFiles = QList<QUrl>(); 1535 const auto &constNewTracks = mNewTracks; 1536 for (const auto &oneTrack : constNewTracks) { 1537 newFiles.push_back(oneTrack.resourceURI()); 1538 } 1539 1540 musicDb.insertTracksList(mNewTracks, mNewCovers); 1541 1542 QCOMPARE(beginInsertRowsSpy.count(), 0); 1543 QCOMPARE(endInsertRowsSpy.count(), 0); 1544 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1545 QCOMPARE(endRemoveRowsSpy.count(), 0); 1546 QCOMPARE(dataChangedSpy.count(), 0); 1547 1548 albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {}, 1549 musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {}); 1550 1551 QCOMPARE(beginInsertRowsSpy.count(), 0); 1552 QCOMPARE(endInsertRowsSpy.count(), 0); 1553 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1554 QCOMPARE(endRemoveRowsSpy.count(), 0); 1555 QCOMPARE(dataChangedSpy.count(), 0); 1556 1557 albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")))); 1558 1559 QCOMPARE(albumsModel.rowCount(), 4); 1560 QCOMPARE(beginInsertRowsSpy.count(), 1); 1561 QCOMPARE(endInsertRowsSpy.count(), 1); 1562 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1563 QCOMPARE(endRemoveRowsSpy.count(), 0); 1564 QCOMPARE(dataChangedSpy.count(), 0); 1565 1566 auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"), 1567 QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 2, 1, 1568 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))}, 1569 QDateTime::fromMSecsSinceEpoch(23), 1570 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true, 1571 {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}; 1572 auto newTracks = DataTypes::ListTrackDataType(); 1573 newTracks.push_back(newTrack); 1574 1575 auto newFiles2 = QList<QUrl>(); 1576 for (const auto &oneTrack : newTracks) { 1577 newFiles2.push_back(oneTrack.resourceURI()); 1578 } 1579 1580 musicDb.insertTracksList(newTracks, mNewCovers); 1581 1582 QCOMPARE(albumsModel.rowCount(), 5); 1583 QCOMPARE(beginInsertRowsSpy.count(), 2); 1584 QCOMPARE(endInsertRowsSpy.count(), 2); 1585 QCOMPARE(beginRemoveRowsSpy.count(), 0); 1586 QCOMPARE(endRemoveRowsSpy.count(), 0); 1587 QCOMPARE(dataChangedSpy.count(), 0); 1588 1589 QCOMPARE(beginInsertRowsSpy.at(1).at(1).toInt(), 2); 1590 QCOMPARE(beginInsertRowsSpy.at(1).at(2).toInt(), 2); 1591 } 1592 }; 1593 1594 QTEST_GUILESS_MAIN(DataModelTests) 1595 1596 1597 #include "datamodeltest.moc"