diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt index 2b5070ba..2a6ca409 100644 --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -1,558 +1,576 @@ enable_testing() configure_file(mediaplaylisttestconfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/mediaplaylisttestconfig.h @ONLY) include_directories(${elisa_CURRENT_BINARY_DIR}) include_directories(${elisa_BINARY_DIR}) include_directories(${elisa_BINARY_DIR}/src) set(databaseInterfaceTest_SOURCES ../src/databaseinterface.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp databaseinterfacetest.cpp ) ecm_add_test(${databaseInterfaceTest_SOURCES} TEST_NAME "databaseInterfaceTest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql KF5::I18n) target_include_directories(databaseInterfaceTest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(managemediaplayercontrolTest_SOURCES ../src/managemediaplayercontrol.cpp ../src/mediaplaylist.cpp ../src/databaseinterface.cpp ../src/musiclistenersmanager.cpp ../src/elisaapplication.cpp ../src/manageaudioplayer.cpp ../src/models/allalbumsmodel.cpp ../src/models/allartistsmodel.cpp ../src/models/alltracksmodel.cpp ../src/models/albummodel.cpp ../src/models/abstractmediaproxymodel.cpp ../src/models/allalbumsproxymodel.cpp ../src/models/allartistsproxymodel.cpp ../src/models/alltracksproxymodel.cpp ../src/models/singleartistproxymodel.cpp ../src/models/singlealbumproxymodel.cpp ../src/notificationitem.cpp ../src/trackslistener.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/elisautils.cpp ../src/file/filelistener.cpp ../src/file/localfilelisting.cpp ../src/abstractfile/abstractfilelistener.cpp ../src/abstractfile/abstractfilelisting.cpp managemediaplayercontroltest.cpp ) if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) qt5_add_dbus_interface(managemediaplayercontrolTest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.fileindexer.xml baloo/fileindexer) qt5_add_dbus_interface(managemediaplayercontrolTest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.scheduler.xml baloo/scheduler) set(managemediaplayercontrolTest_SOURCES ${managemediaplayercontrolTest_SOURCES} ../src/baloo/baloolistener.cpp ../src/baloo/localbaloofilelisting.cpp ) endif() endif() if (UPNPQT_FOUND) set(managemediaplayercontrolTest_SOURCES ${managemediaplayercontrolTest_SOURCES} ../src/upnp/upnpcontrolcontentdirectory.cpp ../src/upnp/upnpcontentdirectorymodel.cpp ../src/upnp/upnpcontrolconnectionmanager.cpp ../src/upnp/upnpcontrolmediaserver.cpp ../src/upnp/didlparser.cpp ../src/upnp/upnplistener.cpp ../src/upnp/upnpdiscoverallmusic.cpp ) endif() kconfig_add_kcfg_files(managemediaplayercontrolTest_SOURCES ../src/elisa_settings.kcfgc ) set(managemediaplayercontrolTest_SOURCES ${managemediaplayercontrolTest_SOURCES} ../src/elisa_core.kcfg ) ecm_add_test(${managemediaplayercontrolTest_SOURCES} TEST_NAME "managemediaplayercontrolTest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql Qt5::Widgets KF5::I18n Qt5::Quick Qt5::Multimedia Qt5::Concurrent KF5::ConfigCore KF5::ConfigGui KF5::FileMetaData ) if (KF5Baloo_FOUND) target_link_libraries(managemediaplayercontrolTest KF5::Baloo Qt5::DBus) endif() if (KF5KCMUtils_FOUND) target_link_libraries(managemediaplayercontrolTest KF5::KCMUtils) endif() if (UPNPQT_FOUND) target_link_libraries(managemediaplayercontrolTest Qt5::Xml UPNP::upnpQt Qt5::Network) endif() if (KF5XmlGui_FOUND) target_link_libraries(managemediaplayercontrolTest KF5::XmlGui) endif() target_include_directories(managemediaplayercontrolTest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(manageheaderbarTest_SOURCES ../src/manageheaderbar.cpp ../src/mediaplaylist.cpp ../src/databaseinterface.cpp ../src/musiclistenersmanager.cpp ../src/elisaapplication.cpp ../src/manageaudioplayer.cpp ../src/models/allalbumsmodel.cpp ../src/models/allartistsmodel.cpp ../src/models/alltracksmodel.cpp ../src/models/albummodel.cpp ../src/models/abstractmediaproxymodel.cpp ../src/models/allalbumsproxymodel.cpp ../src/models/allartistsproxymodel.cpp ../src/models/alltracksproxymodel.cpp ../src/models/singleartistproxymodel.cpp ../src/models/singlealbumproxymodel.cpp ../src/notificationitem.cpp ../src/trackslistener.cpp ../src/trackslistener.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/elisautils.cpp ../src/file/filelistener.cpp ../src/file/localfilelisting.cpp ../src/abstractfile/abstractfilelistener.cpp ../src/abstractfile/abstractfilelisting.cpp manageheaderbartest.cpp ) if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) qt5_add_dbus_interface(manageheaderbarTest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.fileindexer.xml baloo/fileindexer) qt5_add_dbus_interface(manageheaderbarTest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.scheduler.xml baloo/scheduler) set(manageheaderbarTest_SOURCES ${manageheaderbarTest_SOURCES} ../src/baloo/baloolistener.cpp ../src/baloo/localbaloofilelisting.cpp ) endif() endif() if (UPNPQT_FOUND) set(manageheaderbarTest_SOURCES ${manageheaderbarTest_SOURCES} ../src/upnp/upnpcontrolcontentdirectory.cpp ../src/upnp/upnpcontentdirectorymodel.cpp ../src/upnp/upnpcontrolconnectionmanager.cpp ../src/upnp/upnpcontrolmediaserver.cpp ../src/upnp/didlparser.cpp ../src/upnp/upnplistener.cpp ../src/upnp/upnpdiscoverallmusic.cpp ) endif() kconfig_add_kcfg_files(manageheaderbarTest_SOURCES ../src/elisa_settings.kcfgc ) set(manageheaderbarTest_SOURCES ${manageheaderbarTest_SOURCES} ../src/elisa_core.kcfg ) ecm_add_test(${manageheaderbarTest_SOURCES} TEST_NAME "manageheaderbarTest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql Qt5::Gui Qt5::Widgets KF5::I18n Qt5::Quick Qt5::Multimedia Qt5::Concurrent KF5::ConfigCore KF5::ConfigGui KF5::FileMetaData ) if (KF5Baloo_FOUND) target_link_libraries(manageheaderbarTest KF5::Baloo Qt5::DBus) endif() if (KF5KCMUtils_FOUND) target_link_libraries(manageheaderbarTest KF5::KCMUtils) endif() if (UPNPQT_FOUND) target_link_libraries(manageheaderbarTest Qt5::Xml UPNP::upnpQt Qt5::Network) endif() if (KF5XmlGui_FOUND) target_link_libraries(manageheaderbarTest KF5::XmlGui) endif() target_include_directories(manageheaderbarTest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(manageaudioplayerTest_SOURCES ../src/manageaudioplayer.cpp manageaudioplayertest.cpp ) ecm_add_test(${manageaudioplayerTest_SOURCES} TEST_NAME "manageaudioplayerTest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Gui Qt5::Multimedia KF5::FileMetaData) target_include_directories(manageaudioplayerTest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(mediaplaylistTest_SOURCES ../src/mediaplaylist.cpp ../src/databaseinterface.cpp ../src/trackslistener.cpp ../src/musiclistenersmanager.cpp ../src/models/allalbumsmodel.cpp ../src/models/allartistsmodel.cpp ../src/models/alltracksmodel.cpp ../src/models/albummodel.cpp ../src/models/abstractmediaproxymodel.cpp ../src/models/allalbumsproxymodel.cpp ../src/models/allartistsproxymodel.cpp ../src/models/alltracksproxymodel.cpp ../src/models/singleartistproxymodel.cpp ../src/models/singlealbumproxymodel.cpp ../src/manageaudioplayer.cpp ../src/elisaapplication.cpp ../src/notificationitem.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/elisautils.cpp ../src/file/filelistener.cpp ../src/file/localfilelisting.cpp ../src/abstractfile/abstractfilelistener.cpp ../src/abstractfile/abstractfilelisting.cpp modeltest.cpp mediaplaylisttest.cpp ) if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) qt5_add_dbus_interface(mediaplaylistTest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.fileindexer.xml baloo/fileindexer) qt5_add_dbus_interface(mediaplaylistTest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.scheduler.xml baloo/scheduler) set(mediaplaylistTest_SOURCES ${mediaplaylistTest_SOURCES} ../src/baloo/baloolistener.cpp ../src/baloo/localbaloofilelisting.cpp ) endif() endif() if (UPNPQT_FOUND) set(mediaplaylistTest_SOURCES ${mediaplaylistTest_SOURCES} ../src/upnp/upnpcontrolcontentdirectory.cpp ../src/upnp/upnpcontentdirectorymodel.cpp ../src/upnp/upnpcontrolconnectionmanager.cpp ../src/upnp/upnpcontrolmediaserver.cpp ../src/upnp/didlparser.cpp ../src/upnp/upnplistener.cpp ../src/upnp/upnpdiscoverallmusic.cpp ) endif() kconfig_add_kcfg_files(mediaplaylistTest_SOURCES ../src/elisa_settings.kcfgc ) set(mediaplaylistTest_SOURCES ${mediaplaylistTest_SOURCES} ../src/elisa_core.kcfg ) ecm_add_test(${mediaplaylistTest_SOURCES} TEST_NAME "mediaplaylistTest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql Qt5::Gui Qt5::Widgets KF5::I18n Qt5::Quick Qt5::Multimedia Qt5::Concurrent KF5::ConfigCore KF5::ConfigGui KF5::FileMetaData ) if (KF5Baloo_FOUND) target_link_libraries(mediaplaylistTest KF5::Baloo Qt5::DBus) endif() if (KF5KCMUtils_FOUND) target_link_libraries(mediaplaylistTest KF5::KCMUtils) endif() if (UPNPQT_FOUND) target_link_libraries(mediaplaylistTest Qt5::Xml UPNP::upnpQt Qt5::Network) endif() if (KF5XmlGui_FOUND) target_link_libraries(mediaplaylistTest KF5::XmlGui) endif() target_include_directories(mediaplaylistTest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(trackslistenertest_SOURCES ../src/mediaplaylist.cpp ../src/databaseinterface.cpp ../src/trackslistener.cpp ../src/musiclistenersmanager.cpp ../src/elisaapplication.cpp ../src/manageaudioplayer.cpp ../src/models/allalbumsmodel.cpp ../src/models/allartistsmodel.cpp ../src/models/alltracksmodel.cpp ../src/models/albummodel.cpp ../src/models/abstractmediaproxymodel.cpp ../src/models/allalbumsproxymodel.cpp ../src/models/allartistsproxymodel.cpp ../src/models/alltracksproxymodel.cpp ../src/models/singleartistproxymodel.cpp ../src/models/singlealbumproxymodel.cpp ../src/notificationitem.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/elisautils.cpp ../src/file/filelistener.cpp ../src/file/localfilelisting.cpp ../src/abstractfile/abstractfilelistener.cpp ../src/abstractfile/abstractfilelisting.cpp trackslistenertest.cpp ) if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) qt5_add_dbus_interface(trackslistenertest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.fileindexer.xml baloo/fileindexer) qt5_add_dbus_interface(trackslistenertest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.scheduler.xml baloo/scheduler) set(trackslistenertest_SOURCES ${trackslistenertest_SOURCES} ../src/baloo/baloolistener.cpp ../src/baloo/localbaloofilelisting.cpp ) endif() endif() if (UPNPQT_FOUND) set(trackslistenertest_SOURCES ${trackslistenertest_SOURCES} ../src/upnp/upnpcontrolcontentdirectory.cpp ../src/upnp/upnpcontentdirectorymodel.cpp ../src/upnp/upnpcontrolconnectionmanager.cpp ../src/upnp/upnpcontrolmediaserver.cpp ../src/upnp/didlparser.cpp ../src/upnp/upnplistener.cpp ../src/upnp/upnpdiscoverallmusic.cpp ) endif() kconfig_add_kcfg_files(trackslistenertest_SOURCES ../src/elisa_settings.kcfgc ) set(trackslistenertest_SOURCES ${trackslistenertest_SOURCES} ../src/elisa_core.kcfg ) ecm_add_test(${trackslistenertest_SOURCES} TEST_NAME "trackslistenertest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql Qt5::Gui Qt5::Widgets KF5::I18n Qt5::Quick Qt5::Multimedia Qt5::Concurrent KF5::ConfigCore KF5::ConfigGui KF5::FileMetaData ) if (KF5Baloo_FOUND) target_link_libraries(trackslistenertest KF5::Baloo Qt5::DBus) endif() if (KF5KCMUtils_FOUND) target_link_libraries(trackslistenertest KF5::KCMUtils) endif() if (UPNPQT_FOUND) target_link_libraries(trackslistenertest Qt5::Xml UPNP::upnpQt Qt5::Network) endif() if (KF5XmlGui_FOUND) target_link_libraries(trackslistenertest KF5::XmlGui) endif() target_include_directories(trackslistenertest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(allalbumsmodeltest_SOURCES ../src/databaseinterface.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/models/allalbumsmodel.cpp modeltest.cpp allalbumsmodeltest.cpp ) ecm_add_test(${allalbumsmodeltest_SOURCES} TEST_NAME "allalbumsmodeltest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql Qt5::Concurrent KF5::I18n) target_include_directories(allalbumsmodeltest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(albummodeltest_SOURCES ../src/databaseinterface.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/models/albummodel.cpp modeltest.cpp albummodeltest.cpp ) ecm_add_test(${albummodeltest_SOURCES} TEST_NAME "albummodeltest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql Qt5::Concurrent KF5::I18n) target_include_directories(albummodeltest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(allartistsmodeltest_SOURCES ../src/databaseinterface.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/models/allartistsmodel.cpp modeltest.cpp allartistsmodeltest.cpp ) ecm_add_test(${allartistsmodeltest_SOURCES} TEST_NAME "allartistsmodeltest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql KF5::I18n) target_include_directories(allartistsmodeltest PRIVATE ${CMAKE_SOURCE_DIR}/src) set(alltracksmodeltest_SOURCES ../src/databaseinterface.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/models/alltracksmodel.cpp modeltest.cpp alltracksmodeltest.cpp ) ecm_add_test(${alltracksmodeltest_SOURCES} TEST_NAME "alltracksmodeltest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql KF5::I18n) target_include_directories(alltracksmodeltest PRIVATE ${CMAKE_SOURCE_DIR}/src) +set(alltracksproxymodeltest_SOURCES + ../src/databaseinterface.cpp + ../src/musicartist.cpp + ../src/musicalbum.cpp + ../src/musicaudiotrack.cpp + ../src/models/alltracksmodel.cpp + ../src/models/alltracksproxymodel.cpp + ../src/models/abstractmediaproxymodel.cpp + modeltest.cpp + alltracksproxymodeltest.cpp +) + +ecm_add_test(${alltracksproxymodeltest_SOURCES} + TEST_NAME "alltracksproxymodeltest" + LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql Qt5::Concurrent KF5::I18n) + +target_include_directories(alltracksproxymodeltest PRIVATE ${CMAKE_SOURCE_DIR}/src) + set(localfilelistingtest_SOURCES ../src/file/localfilelisting.cpp ../src/abstractfile/abstractfilelisting.cpp ../src/musicaudiotrack.cpp ../src/notificationitem.cpp ../src/elisautils.cpp localfilelistingtest.cpp ) kconfig_add_kcfg_files(localfilelistingtest_SOURCES ../src/elisa_settings.kcfgc ) set(localfilelistingtest_SOURCES ${localfilelistingtest_SOURCES} ../src/elisa_core.kcfg ) ecm_add_test(${localfilelistingtest_SOURCES} TEST_NAME "localfilelistingtest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Sql KF5::I18n KF5::FileMetaData KF5::ConfigCore KF5::ConfigGui) target_include_directories(localfilelistingtest PRIVATE ${CMAKE_SOURCE_DIR}/src) if (KF5XmlGui_FOUND AND KF5KCMUtils_FOUND) set(elisaapplicationtest_SOURCES ../src/elisaapplication.cpp ../src/musiclistenersmanager.cpp ../src/databaseinterface.cpp ../src/notificationitem.cpp ../src/trackslistener.cpp ../src/mediaplaylist.cpp ../src/musicartist.cpp ../src/musicalbum.cpp ../src/musicaudiotrack.cpp ../src/elisautils.cpp ../src/manageaudioplayer.cpp ../src/models/allalbumsmodel.cpp ../src/models/allartistsmodel.cpp ../src/models/alltracksmodel.cpp ../src/models/albummodel.cpp ../src/models/abstractmediaproxymodel.cpp ../src/models/allalbumsproxymodel.cpp ../src/models/allartistsproxymodel.cpp ../src/models/alltracksproxymodel.cpp ../src/models/singleartistproxymodel.cpp ../src/models/singlealbumproxymodel.cpp ../src/file/filelistener.cpp ../src/file/localfilelisting.cpp ../src/abstractfile/abstractfilelistener.cpp ../src/abstractfile/abstractfilelisting.cpp elisaapplicationtest.cpp ) if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) qt5_add_dbus_interface(elisaapplicationtest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.fileindexer.xml baloo/fileindexer) qt5_add_dbus_interface(elisaapplicationtest_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.scheduler.xml baloo/scheduler) set(elisaapplicationtest_SOURCES ${elisaapplicationtest_SOURCES} ../src/baloo/baloolistener.cpp ../src/baloo/localbaloofilelisting.cpp ) endif() endif() kconfig_add_kcfg_files(elisaapplicationtest_SOURCES ../src/elisa_settings.kcfgc ) set(elisaapplicationtest_SOURCES ${elisaapplicationtest_SOURCES} ../src/elisa_core.kcfg ) ecm_add_test(${elisaapplicationtest_SOURCES} TEST_NAME "elisaapplicationtest" LINK_LIBRARIES Qt5::Test Qt5::Core Qt5::Widgets Qt5::Multimedia Qt5::Sql Qt5::Concurrent KF5::FileMetaData KF5::I18n KF5::ConfigCore KF5::ConfigGui KF5::ConfigWidgets KF5::XmlGui KF5::KCMUtils) if (KF5Baloo_FOUND) target_link_libraries(elisaapplicationtest KF5::Baloo Qt5::DBus) endif() target_include_directories(elisaapplicationtest PRIVATE ${CMAKE_SOURCE_DIR}/src) endif() if (Qt5Quick_FOUND AND Qt5Widgets_FOUND) set(elisaqmltests_SOURCES elisaqmltests.cpp qmltests/tst_GridBrowserDelegate.qml qmltests/tst_NavigationActionBar.qml ) ecm_add_test(${elisaqmltests_SOURCES} TEST_NAME "elisaqmltests" LINK_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Test Qt5::QuickTest GUI) target_compile_definitions(elisaqmltests PRIVATE QUICK_TEST_SOURCE_DIR="${CMAKE_SOURCE_DIR}/autotests/qmltests") target_include_directories(elisaqmltests PRIVATE ${CMAKE_SOURCE_DIR}/src) endif() diff --git a/autotests/alltracksmodeltest.cpp b/autotests/alltracksmodeltest.cpp index c6ecb5ca..80b0a69c 100644 --- a/autotests/alltracksmodeltest.cpp +++ b/autotests/alltracksmodeltest.cpp @@ -1,512 +1,568 @@ /* * Copyright 2015-2017 Matthieu Gallien * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "musicalbum.h" #include "musicaudiotrack.h" #include "databaseinterface.h" #include "models/alltracksmodel.h" #include "modeltest.h" #include #include #include #include #include #include #include #include #include #include #include #include class AllTracksModelTests: public QObject { Q_OBJECT private: QList mNewTracks = { {true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$1"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$1"))}, 1, false}, {true, QStringLiteral("$2"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 2, 2, QTime::fromMSecsSinceStartOfDay(2), {QUrl::fromLocalFile(QStringLiteral("/$2"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$2"))}, 2, false}, {true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 3, 3, QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$3"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$3"))}, 3, false}, {true, QStringLiteral("$4"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist4"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 4, 4, QTime::fromMSecsSinceStartOfDay(4), {QUrl::fromLocalFile(QStringLiteral("/$4"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$4"))}, 4, false}, {true, QStringLiteral("$5"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 1, 1, QTime::fromMSecsSinceStartOfDay(5), {QUrl::fromLocalFile(QStringLiteral("/$5"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$5"))}, 5, true}, {true, QStringLiteral("$6"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 2, 1, QTime::fromMSecsSinceStartOfDay(6), {QUrl::fromLocalFile(QStringLiteral("/$6"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 1, true}, {true, QStringLiteral("$7"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 3, 1, QTime::fromMSecsSinceStartOfDay(7), {QUrl::fromLocalFile(QStringLiteral("/$7"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$7"))}, 2, true}, {true, QStringLiteral("$8"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 4, 1, QTime::fromMSecsSinceStartOfDay(8), {QUrl::fromLocalFile(QStringLiteral("/$8"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$8"))}, 3, true}, {true, QStringLiteral("$9"), QStringLiteral("0"), QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 5, 1, QTime::fromMSecsSinceStartOfDay(9), {QUrl::fromLocalFile(QStringLiteral("/$9"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$9"))}, 4, true}, {true, QStringLiteral("$10"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), QStringLiteral("artist1"), 6, 1, QTime::fromMSecsSinceStartOfDay(10), {QUrl::fromLocalFile(QStringLiteral("/$10"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$10"))}, 5, true}, {true, QStringLiteral("$11"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(11), {QUrl::fromLocalFile(QStringLiteral("/$11"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$11"))}, 1, true}, {true, QStringLiteral("$12"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 2, 1, QTime::fromMSecsSinceStartOfDay(12), {QUrl::fromLocalFile(QStringLiteral("/$12"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$12"))}, 2, true}, {true, QStringLiteral("$13"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 3, 1, QTime::fromMSecsSinceStartOfDay(13), {QUrl::fromLocalFile(QStringLiteral("/$13"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$13"))}, 3, true}, {true, QStringLiteral("$14"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(14), {QUrl::fromLocalFile(QStringLiteral("/$14"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$14"))}, 4, true}, {true, QStringLiteral("$15"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 2, 1, QTime::fromMSecsSinceStartOfDay(15), {QUrl::fromLocalFile(QStringLiteral("/$15"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$15"))}, 5, true}, {true, QStringLiteral("$16"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 3, 1, QTime::fromMSecsSinceStartOfDay(16), {QUrl::fromLocalFile(QStringLiteral("/$16"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$16"))}, 1, true}, {true, QStringLiteral("$17"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 4, 1, QTime::fromMSecsSinceStartOfDay(17), {QUrl::fromLocalFile(QStringLiteral("/$17"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$17"))}, 2, true}, {true, QStringLiteral("$18"), QStringLiteral("0"), QStringLiteral("track5"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 5, 1, QTime::fromMSecsSinceStartOfDay(18), {QUrl::fromLocalFile(QStringLiteral("/$18"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$18"))}, 3, true} }; QHash mNewCovers = { {QStringLiteral("album1"), QUrl::fromLocalFile(QStringLiteral("album1"))}, {QStringLiteral("album2"), QUrl::fromLocalFile(QStringLiteral("album2"))}, {QStringLiteral("album3"), QUrl::fromLocalFile(QStringLiteral("album3"))}, {QStringLiteral("album4"), QUrl::fromLocalFile(QStringLiteral("album4"))} }; private Q_SLOTS: void initTestCase() { qRegisterMetaType>("QHash"); qRegisterMetaType>("QHash"); qRegisterMetaType>>("QHash>"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType("MusicArtist"); } void removeOneTrack() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 18); auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); auto firstTrack = musicDb.trackFromDatabaseId(trackId); musicDb.removeTracksList({firstTrack.resourceURI()}); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 1); QCOMPARE(endRemoveRowsSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 17); } void removeOneAlbum() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 18); auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); auto firstTrack = musicDb.trackFromDatabaseId(firstTrackId); auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album1"), 2, 2); auto secondTrack = musicDb.trackFromDatabaseId(secondTrackId); auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3); auto thirdTrack = musicDb.trackFromDatabaseId(thirdTrackId); auto fourthTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"), QStringLiteral("album1"), 4, 4); auto fourthTrack = musicDb.trackFromDatabaseId(fourthTrackId); musicDb.removeTracksList({firstTrack.resourceURI(), secondTrack.resourceURI(), thirdTrack.resourceURI(), fourthTrack.resourceURI()}); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 4); QCOMPARE(endRemoveRowsSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 14); } void addOneTrack() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 18); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}; auto newTracks = QList(); newTracks.push_back(newTrack); musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 2); QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 19); } void addOneAlbum() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 18); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album5"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}; auto newTracks = QList(); newTracks.push_back(newTrack); auto newCover = QUrl::fromLocalFile(QStringLiteral("album5")); auto newCovers = QHash(); newCovers[QStringLiteral("album5")] = newCover; auto newFiles2 = QList(); for (const auto &oneTrack : newTracks) { newFiles2.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(newTracks, newCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 2); QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 19); } void addDuplicateTracks() { AllTracksModel tracksModel; ModelTest testModel(&tracksModel); auto newTracks = QList(); newTracks.push_back({true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}); newTracks.push_back({true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}); QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); tracksModel.tracksAdded(newTracks); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 1); } void modifyOneTrack() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 18); auto newTrack = MusicAudioTrack{true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$1"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$1"))}, 5, true}; auto newTracks = QList(); newTracks.push_back(newTrack); musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(tracksModel.rowCount(), 18); auto dataChangedSignal = dataChangedSpy.constFirst(); QCOMPARE(dataChangedSignal.size(), 3); auto changedIndex = dataChangedSignal.constFirst().toModelIndex(); QCOMPARE(tracksModel.data(changedIndex, AllTracksModel::RatingRole).isValid(), true); QCOMPARE(tracksModel.data(changedIndex, AllTracksModel::RatingRole).toInt(), 5); } void addEmptyTracksList() { AllTracksModel tracksModel; ModelTest testModel(&tracksModel); auto newTracks = QList(); QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); tracksModel.tracksAdded(newTracks); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(tracksModel.rowCount(), 0); } + + void addTracksListTwice() + { + DatabaseInterface musicDb; + AllTracksModel tracksModel; + ModelTest testModel(&tracksModel); + + connect(&musicDb, &DatabaseInterface::tracksAdded, + &tracksModel, &AllTracksModel::tracksAdded); + connect(&musicDb, &DatabaseInterface::trackModified, + &tracksModel, &AllTracksModel::trackModified); + connect(&musicDb, &DatabaseInterface::trackRemoved, + &tracksModel, &AllTracksModel::trackRemoved); + + musicDb.init(QStringLiteral("testDb")); + + QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + + QCOMPARE(beginInsertRowsSpy.count(), 0); + QCOMPARE(endInsertRowsSpy.count(), 0); + QCOMPARE(beginRemoveRowsSpy.count(), 0); + QCOMPARE(endRemoveRowsSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); + + QCOMPARE(beginInsertRowsSpy.count(), 1); + QCOMPARE(endInsertRowsSpy.count(), 1); + QCOMPARE(beginRemoveRowsSpy.count(), 0); + QCOMPARE(endRemoveRowsSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(tracksModel.rowCount(), 18); + + auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track19"), + QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), + 1, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, + {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}; + + auto newTracks = QList(); + newTracks.push_back(newTrack); + + musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); + + QCOMPARE(beginInsertRowsSpy.count(), 2); + QCOMPARE(endInsertRowsSpy.count(), 2); + QCOMPARE(beginRemoveRowsSpy.count(), 0); + QCOMPARE(endRemoveRowsSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(tracksModel.rowCount(), 19); + } }; QTEST_GUILESS_MAIN(AllTracksModelTests) #include "alltracksmodeltest.moc" diff --git a/autotests/alltracksmodeltest.cpp b/autotests/alltracksproxymodeltest.cpp similarity index 73% copy from autotests/alltracksmodeltest.cpp copy to autotests/alltracksproxymodeltest.cpp index c6ecb5ca..de4c142c 100644 --- a/autotests/alltracksmodeltest.cpp +++ b/autotests/alltracksproxymodeltest.cpp @@ -1,512 +1,593 @@ /* - * Copyright 2015-2017 Matthieu Gallien + * Copyright 2015-2018 Matthieu Gallien * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "musicalbum.h" #include "musicaudiotrack.h" #include "databaseinterface.h" #include "models/alltracksmodel.h" +#include "models/alltracksproxymodel.h" #include "modeltest.h" #include #include #include #include #include #include #include #include #include #include #include #include -class AllTracksModelTests: public QObject +class AllTracksProxyModelTests: public QObject { Q_OBJECT private: QList mNewTracks = { {true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$1"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$1"))}, 1, false}, {true, QStringLiteral("$2"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 2, 2, QTime::fromMSecsSinceStartOfDay(2), {QUrl::fromLocalFile(QStringLiteral("/$2"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$2"))}, 2, false}, {true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 3, 3, QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$3"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$3"))}, 3, false}, {true, QStringLiteral("$4"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist4"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 4, 4, QTime::fromMSecsSinceStartOfDay(4), {QUrl::fromLocalFile(QStringLiteral("/$4"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$4"))}, 4, false}, {true, QStringLiteral("$5"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 1, 1, QTime::fromMSecsSinceStartOfDay(5), {QUrl::fromLocalFile(QStringLiteral("/$5"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$5"))}, 5, true}, {true, QStringLiteral("$6"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 2, 1, QTime::fromMSecsSinceStartOfDay(6), {QUrl::fromLocalFile(QStringLiteral("/$6"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 1, true}, {true, QStringLiteral("$7"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 3, 1, QTime::fromMSecsSinceStartOfDay(7), {QUrl::fromLocalFile(QStringLiteral("/$7"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$7"))}, 2, true}, {true, QStringLiteral("$8"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 4, 1, QTime::fromMSecsSinceStartOfDay(8), {QUrl::fromLocalFile(QStringLiteral("/$8"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$8"))}, 3, true}, {true, QStringLiteral("$9"), QStringLiteral("0"), QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 5, 1, QTime::fromMSecsSinceStartOfDay(9), {QUrl::fromLocalFile(QStringLiteral("/$9"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$9"))}, 4, true}, {true, QStringLiteral("$10"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), QStringLiteral("artist1"), 6, 1, QTime::fromMSecsSinceStartOfDay(10), {QUrl::fromLocalFile(QStringLiteral("/$10"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$10"))}, 5, true}, {true, QStringLiteral("$11"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(11), {QUrl::fromLocalFile(QStringLiteral("/$11"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$11"))}, 1, true}, {true, QStringLiteral("$12"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 2, 1, QTime::fromMSecsSinceStartOfDay(12), {QUrl::fromLocalFile(QStringLiteral("/$12"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$12"))}, 2, true}, {true, QStringLiteral("$13"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 3, 1, QTime::fromMSecsSinceStartOfDay(13), {QUrl::fromLocalFile(QStringLiteral("/$13"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$13"))}, 3, true}, {true, QStringLiteral("$14"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(14), {QUrl::fromLocalFile(QStringLiteral("/$14"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$14"))}, 4, true}, {true, QStringLiteral("$15"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 2, 1, QTime::fromMSecsSinceStartOfDay(15), {QUrl::fromLocalFile(QStringLiteral("/$15"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$15"))}, 5, true}, {true, QStringLiteral("$16"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 3, 1, QTime::fromMSecsSinceStartOfDay(16), {QUrl::fromLocalFile(QStringLiteral("/$16"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$16"))}, 1, true}, {true, QStringLiteral("$17"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 4, 1, QTime::fromMSecsSinceStartOfDay(17), {QUrl::fromLocalFile(QStringLiteral("/$17"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$17"))}, 2, true}, {true, QStringLiteral("$18"), QStringLiteral("0"), QStringLiteral("track5"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 5, 1, QTime::fromMSecsSinceStartOfDay(18), {QUrl::fromLocalFile(QStringLiteral("/$18"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$18"))}, 3, true} }; QHash mNewCovers = { {QStringLiteral("album1"), QUrl::fromLocalFile(QStringLiteral("album1"))}, {QStringLiteral("album2"), QUrl::fromLocalFile(QStringLiteral("album2"))}, {QStringLiteral("album3"), QUrl::fromLocalFile(QStringLiteral("album3"))}, {QStringLiteral("album4"), QUrl::fromLocalFile(QStringLiteral("album4"))} }; private Q_SLOTS: void initTestCase() { qRegisterMetaType>("QHash"); qRegisterMetaType>("QHash"); qRegisterMetaType>>("QHash>"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType("MusicArtist"); } void removeOneTrack() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); - QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); - QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); - QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); - QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); - QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 18); + QCOMPARE(proxyTracksModel.rowCount(), 18); auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); auto firstTrack = musicDb.trackFromDatabaseId(trackId); musicDb.removeTracksList({firstTrack.resourceURI()}); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 1); QCOMPARE(endRemoveRowsSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 17); + QCOMPARE(proxyTracksModel.rowCount(), 17); } void removeOneAlbum() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); - QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); - QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); - QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); - QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); - QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 18); + QCOMPARE(proxyTracksModel.rowCount(), 18); auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); auto firstTrack = musicDb.trackFromDatabaseId(firstTrackId); auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album1"), 2, 2); auto secondTrack = musicDb.trackFromDatabaseId(secondTrackId); auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3); auto thirdTrack = musicDb.trackFromDatabaseId(thirdTrackId); auto fourthTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"), QStringLiteral("album1"), 4, 4); auto fourthTrack = musicDb.trackFromDatabaseId(fourthTrackId); musicDb.removeTracksList({firstTrack.resourceURI(), secondTrack.resourceURI(), thirdTrack.resourceURI(), fourthTrack.resourceURI()}); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 4); QCOMPARE(endRemoveRowsSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 14); + QCOMPARE(proxyTracksModel.rowCount(), 14); } void addOneTrack() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); - QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); - QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); - QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); - QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); - QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 18); + QCOMPARE(proxyTracksModel.rowCount(), 18); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}; auto newTracks = QList(); newTracks.push_back(newTrack); musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 2); QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 19); + QCOMPARE(proxyTracksModel.rowCount(), 19); } void addOneAlbum() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); - QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); - QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); - QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); - QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); - QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 18); + QCOMPARE(proxyTracksModel.rowCount(), 18); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album5"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}; auto newTracks = QList(); newTracks.push_back(newTrack); auto newCover = QUrl::fromLocalFile(QStringLiteral("album5")); auto newCovers = QHash(); newCovers[QStringLiteral("album5")] = newCover; auto newFiles2 = QList(); for (const auto &oneTrack : newTracks) { newFiles2.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(newTracks, newCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 2); QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 19); + QCOMPARE(proxyTracksModel.rowCount(), 19); } void addDuplicateTracks() { AllTracksModel tracksModel; ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); auto newTracks = QList(); newTracks.push_back({true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}); newTracks.push_back({true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}); - QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); - QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); - QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); - QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); - QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); tracksModel.tracksAdded(newTracks); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 1); + QCOMPARE(proxyTracksModel.rowCount(), 1); } void modifyOneTrack() { DatabaseInterface musicDb; AllTracksModel tracksModel; ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); connect(&musicDb, &DatabaseInterface::tracksAdded, &tracksModel, &AllTracksModel::tracksAdded); connect(&musicDb, &DatabaseInterface::trackModified, &tracksModel, &AllTracksModel::trackModified); connect(&musicDb, &DatabaseInterface::trackRemoved, &tracksModel, &AllTracksModel::trackRemoved); musicDb.init(QStringLiteral("testDb")); - QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); - QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); - QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); - QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); - QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 18); + QCOMPARE(proxyTracksModel.rowCount(), 18); auto newTrack = MusicAudioTrack{true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$1"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$1"))}, 5, true}; auto newTracks = QList(); newTracks.push_back(newTrack); musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); QCOMPARE(beginInsertRowsSpy.count(), 1); QCOMPARE(endInsertRowsSpy.count(), 1); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 1); - QCOMPARE(tracksModel.rowCount(), 18); + QCOMPARE(proxyTracksModel.rowCount(), 18); auto dataChangedSignal = dataChangedSpy.constFirst(); QCOMPARE(dataChangedSignal.size(), 3); auto changedIndex = dataChangedSignal.constFirst().toModelIndex(); - QCOMPARE(tracksModel.data(changedIndex, AllTracksModel::RatingRole).isValid(), true); - QCOMPARE(tracksModel.data(changedIndex, AllTracksModel::RatingRole).toInt(), 5); + QCOMPARE(proxyTracksModel.data(changedIndex, AllTracksModel::RatingRole).isValid(), true); + QCOMPARE(proxyTracksModel.data(changedIndex, AllTracksModel::RatingRole).toInt(), 5); } void addEmptyTracksList() { AllTracksModel tracksModel; ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); auto newTracks = QList(); - QSignalSpy beginInsertRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeInserted); - QSignalSpy endInsertRowsSpy(&tracksModel, &AllTracksModel::rowsInserted); - QSignalSpy beginRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsAboutToBeRemoved); - QSignalSpy endRemoveRowsSpy(&tracksModel, &AllTracksModel::rowsRemoved); - QSignalSpy dataChangedSpy(&tracksModel, &AllTracksModel::dataChanged); + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); tracksModel.tracksAdded(newTracks); QCOMPARE(beginInsertRowsSpy.count(), 0); QCOMPARE(endInsertRowsSpy.count(), 0); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); - QCOMPARE(tracksModel.rowCount(), 0); + QCOMPARE(proxyTracksModel.rowCount(), 0); + } + + void addTracksListTwice() + { + DatabaseInterface musicDb; + AllTracksModel tracksModel; + ModelTest testModel(&tracksModel); + AllTracksProxyModel proxyTracksModel; + ModelTest proxyTestModel(&proxyTracksModel); + proxyTracksModel.setSourceModel(&tracksModel); + + connect(&musicDb, &DatabaseInterface::tracksAdded, + &tracksModel, &AllTracksModel::tracksAdded); + connect(&musicDb, &DatabaseInterface::trackModified, + &tracksModel, &AllTracksModel::trackModified); + connect(&musicDb, &DatabaseInterface::trackRemoved, + &tracksModel, &AllTracksModel::trackRemoved); + + musicDb.init(QStringLiteral("testDb")); + + QSignalSpy beginInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeInserted); + QSignalSpy endInsertRowsSpy(&proxyTracksModel, &AllTracksModel::rowsInserted); + QSignalSpy beginRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsAboutToBeRemoved); + QSignalSpy endRemoveRowsSpy(&proxyTracksModel, &AllTracksModel::rowsRemoved); + QSignalSpy dataChangedSpy(&proxyTracksModel, &AllTracksModel::dataChanged); + + QCOMPARE(beginInsertRowsSpy.count(), 0); + QCOMPARE(endInsertRowsSpy.count(), 0); + QCOMPARE(beginRemoveRowsSpy.count(), 0); + QCOMPARE(endRemoveRowsSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); + + QCOMPARE(beginInsertRowsSpy.count(), 1); + QCOMPARE(endInsertRowsSpy.count(), 1); + QCOMPARE(beginRemoveRowsSpy.count(), 0); + QCOMPARE(endRemoveRowsSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(proxyTracksModel.rowCount(), 18); + + auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track19"), + QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), + 1, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, + {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}; + + auto newTracks = QList(); + newTracks.push_back(newTrack); + + musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); + + QCOMPARE(beginInsertRowsSpy.count(), 2); + QCOMPARE(endInsertRowsSpy.count(), 2); + QCOMPARE(beginRemoveRowsSpy.count(), 0); + QCOMPARE(endRemoveRowsSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(proxyTracksModel.rowCount(), 19); } }; -QTEST_GUILESS_MAIN(AllTracksModelTests) +QTEST_GUILESS_MAIN(AllTracksProxyModelTests) -#include "alltracksmodeltest.moc" +#include "alltracksproxymodeltest.moc"