From 60bd90848bcd039882fe280a79be1d42ddf2dc0d Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Fri, 28 Jun 2019 01:33:22 +0200 Subject: [PATCH] Add tests (#193) --- CMakeLists.txt | 1 + src/collection/collectionmodel.cpp | 9 +- src/organise/organisedialog.cpp | 3 +- src/organise/organisedialog.h | 7 +- tests/CMakeLists.txt | 99 +++++ tests/data/audio/strawberry.aif | Bin 0 -> 72188 bytes tests/data/audio/strawberry.asf | Bin 0 -> 29344 bytes tests/data/audio/strawberry.flac | Bin 0 -> 41426 bytes tests/data/audio/strawberry.m4a | Bin 0 -> 13056 bytes tests/data/audio/strawberry.mp3 | Bin 0 -> 7019 bytes tests/data/audio/strawberry.mp4 | Bin 0 -> 13060 bytes tests/data/audio/strawberry.oga | Bin 0 -> 33495 bytes tests/data/audio/strawberry.opus | Bin 0 -> 19597 bytes tests/data/audio/strawberry.spx | Bin 0 -> 6067 bytes tests/data/audio/strawberry.wav | Bin 0 -> 72178 bytes tests/data/audio/strawberry.wv | Bin 0 -> 34511 bytes tests/data/testdata.qrc | 15 + tests/src/closure_test.cpp | 148 +++++++ tests/src/collectionbackend_test.cpp | 370 ++++++++++++++++ tests/src/collectionmodel_test.cpp | 335 +++++++++++++++ tests/src/concurrentrun_test.cpp | 169 ++++++++ tests/src/logging_env.h | 36 ++ tests/src/main.cpp | 44 ++ tests/src/mergedproxymodel_test.cpp | 181 ++++++++ tests/src/metatypes_env.h | 46 ++ tests/src/mock_collectionbackend.h | 72 ++++ tests/src/mock_networkaccessmanager.cpp | 137 ++++++ tests/src/mock_networkaccessmanager.h | 74 ++++ tests/src/mock_playlistitem.cpp | 28 ++ tests/src/mock_playlistitem.h | 50 +++ tests/src/mock_settingsprovider.h | 54 +++ tests/src/organiseformat_test.cpp | 173 ++++++++ tests/src/playlist_test.cpp | 543 ++++++++++++++++++++++++ tests/src/resources_env.h | 37 ++ tests/src/song_test.cpp | 147 +++++++ tests/src/songplaylistitem_test.cpp | 79 ++++ tests/src/sqlite_test.cpp | 16 + tests/src/test_utils.cpp | 87 ++++ tests/src/test_utils.h | 87 ++++ tests/src/testobjectdecorators.cpp | 30 ++ tests/src/testobjectdecorators.h | 36 ++ tests/src/utilities_test.cpp | 50 +++ 42 files changed, 3156 insertions(+), 7 deletions(-) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/data/audio/strawberry.aif create mode 100644 tests/data/audio/strawberry.asf create mode 100644 tests/data/audio/strawberry.flac create mode 100644 tests/data/audio/strawberry.m4a create mode 100644 tests/data/audio/strawberry.mp3 create mode 100644 tests/data/audio/strawberry.mp4 create mode 100644 tests/data/audio/strawberry.oga create mode 100644 tests/data/audio/strawberry.opus create mode 100644 tests/data/audio/strawberry.spx create mode 100644 tests/data/audio/strawberry.wav create mode 100644 tests/data/audio/strawberry.wv create mode 100644 tests/data/testdata.qrc create mode 100644 tests/src/closure_test.cpp create mode 100644 tests/src/collectionbackend_test.cpp create mode 100644 tests/src/collectionmodel_test.cpp create mode 100644 tests/src/concurrentrun_test.cpp create mode 100644 tests/src/logging_env.h create mode 100644 tests/src/main.cpp create mode 100644 tests/src/mergedproxymodel_test.cpp create mode 100644 tests/src/metatypes_env.h create mode 100644 tests/src/mock_collectionbackend.h create mode 100644 tests/src/mock_networkaccessmanager.cpp create mode 100644 tests/src/mock_networkaccessmanager.h create mode 100644 tests/src/mock_playlistitem.cpp create mode 100644 tests/src/mock_playlistitem.h create mode 100644 tests/src/mock_settingsprovider.h create mode 100644 tests/src/organiseformat_test.cpp create mode 100644 tests/src/playlist_test.cpp create mode 100644 tests/src/resources_env.h create mode 100644 tests/src/song_test.cpp create mode 100644 tests/src/songplaylistitem_test.cpp create mode 100644 tests/src/sqlite_test.cpp create mode 100644 tests/src/test_utils.cpp create mode 100644 tests/src/test_utils.h create mode 100644 tests/src/testobjectdecorators.cpp create mode 100644 tests/src/testobjectdecorators.h create mode 100644 tests/src/utilities_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4035c6a5..223ff25a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -395,6 +395,7 @@ endif() # Subdirectories add_subdirectory(src) add_subdirectory(dist) +add_subdirectory(tests) add_subdirectory(ext/libstrawberry-common) add_subdirectory(ext/libstrawberry-tagreader) add_subdirectory(ext/strawberry-tagreader) diff --git a/src/collection/collectionmodel.cpp b/src/collection/collectionmodel.cpp index aa31f433..bc1bcb7e 100644 --- a/src/collection/collectionmodel.cpp +++ b/src/collection/collectionmodel.cpp @@ -106,7 +106,8 @@ CollectionModel::CollectionModel(CollectionBackend *backend, Application *app, Q cover_loader_options_.pad_output_image_ = true; cover_loader_options_.scale_output_image_ = true; - connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(AlbumArtLoaded(quint64, QImage))); + if (app_) + connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(AlbumArtLoaded(quint64, QImage))); //icon_cache_->setCacheDirectory(Utilities::GetConfigPath(Utilities::Path_CacheRoot) + "/pixmapcache"); //icon_cache_->setMaximumCacheSize(CollectionModel::kIconCacheSize); @@ -172,7 +173,8 @@ void CollectionModel::Init(bool async) { endResetModel(); // Show a loading indicator in the status bar too. - init_task_id_ = app_->task_manager()->StartTask(tr("Loading songs")); + if (app_) + init_task_id_ = app_->task_manager()->StartTask(tr("Loading songs")); ResetAsync(); } @@ -794,7 +796,8 @@ void CollectionModel::ResetAsyncQueryFinished(QFuturetask_manager()->SetTaskFinished(init_task_id_); + if (app_) + app_->task_manager()->SetTaskFinished(init_task_id_); init_task_id_ = -1; } diff --git a/src/organise/organisedialog.cpp b/src/organise/organisedialog.cpp index 6c77d985..5ce4d8e8 100644 --- a/src/organise/organisedialog.cpp +++ b/src/organise/organisedialog.cpp @@ -69,7 +69,8 @@ using std::shared_ptr; using std::stable_sort; -const char *OrganiseDialog::kDefaultFormat = "%albumartist/%album{ (Disc %disc)}/{%track - }%albumartist - %album - %title.%extension"; +const char *OrganiseDialog::kDefaultFormat = "%albumartist/%album{ (Disc %disc)}/{%track - }{%albumartist - }%album{ (Disc %disc)} - %title.%extension"; + const char *OrganiseDialog::kSettingsGroup = "OrganiseDialog"; OrganiseDialog::OrganiseDialog(TaskManager *task_manager, CollectionBackend *backend, QWidget *parent) diff --git a/src/organise/organisedialog.h b/src/organise/organisedialog.h index fecbb5e4..1b9d159e 100644 --- a/src/organise/organisedialog.h +++ b/src/organise/organisedialog.h @@ -59,6 +59,8 @@ class OrganiseDialog : public QDialog { OrganiseDialog(TaskManager *task_manager, CollectionBackend *backend = nullptr, QWidget *parent = nullptr); ~OrganiseDialog(); + static const char *kDefaultFormat; + QSize sizeHint() const; void SetDestinationModel(QAbstractItemModel *model, bool devices = false); @@ -71,6 +73,8 @@ class OrganiseDialog : public QDialog { void SetCopy(bool copy); + static Organise::NewSongInfoList ComputeNewSongsFilenames(const SongList &songs, const OrganiseFormat &format); + signals: void FileCopied(int); @@ -97,10 +101,7 @@ class OrganiseDialog : public QDialog { SongList LoadSongsBlocking(const QStringList &filenames); void SetLoadingSongs(bool loading); - static Organise::NewSongInfoList ComputeNewSongsFilenames(const SongList &songs, const OrganiseFormat &format); - private: - static const char *kDefaultFormat; static const char *kSettingsGroup; Ui_OrganiseDialog *ui_; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 00000000..c4f1ad81 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,99 @@ +cmake_minimum_required(VERSION 2.8.11) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fpermissive -Wno-c++11-narrowing -U__STRICT_ANSI__") + +find_package(Qt5 ${QT_MIN_VERSION} COMPONENTS Test) +find_package(GTest) +find_library(GMOCK_LIBRARY gmock) + +if(Qt5Test_FOUND AND GTEST_FOUND AND GMOCK_LIBRARY) + + include_directories(${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS} ${QT_QTTEST_INCLUDE_DIR}) + include_directories(${TAGLIB_INCLUDE_DIRS}) + if(HAVE_GSTREAMER) + link_directories(${GSTREAMER_LIBRARY_DIRS}) + include_directories(${GSTREAMER_INCLUDE_DIRS}) + include_directories(${GSTREAMER_APP_INCLUDE_DIRS}) + include_directories(${GSTREAMER_AUDIO_INCLUDE_DIRS}) + include_directories(${GSTREAMER_BASE_INCLUDE_DIRS}) + include_directories(${GSTREAMER_TAG_INCLUDE_DIRS}) + endif() + include_directories(${CMAKE_SOURCE_DIR}/src) + include_directories(${CMAKE_BINARY_DIR}/src) + include_directories(${CMAKE_SOURCE_DIR}/tests/src) + include_directories(${CMAKE_BINARY_DIR}/tests/src) + include_directories(${CMAKE_SOURCE_DIR}/ext/strawberry-tagreader) + include_directories(${CMAKE_SOURCE_DIR}/ext/libstrawberry-common) + include_directories(${CMAKE_SOURCE_DIR}/ext/libstrawberry-tagreader) + include_directories(${CMAKE_BINARY_DIR}/ext/libstrawberry-tagreader) + if(HAVE_LIBGPOD) + include_directories(${LIBGPOD_INCLUDE_DIRS}) + endif(HAVE_LIBGPOD) + + add_definitions(-DGTEST_USE_OWN_TR1_TUPLE=1) + + set(TESTUTILS-SOURCES + src/mock_networkaccessmanager.cpp + src/mock_playlistitem.cpp + src/test_utils.cpp + src/testobjectdecorators.cpp + ) + + set(TESTUTILS-MOC-HEADERS src/mock_networkaccessmanager.h src/test_utils.h src/testobjectdecorators.h) + + qt5_wrap_cpp(TESTUTILS-SOURCES-MOC ${TESTUTILS-MOC-HEADERS}) + + add_library(test_utils STATIC EXCLUDE_FROM_ALL ${TESTUTILS-SOURCES} ${TESTUTILS-SOURCES-MOC}) + target_link_libraries(test_utils ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${QT_LIBRARIES} ${Qt5Test_LIBRARIES}) + + add_custom_target(strawberry_test echo "Running Strawberry tests" WORKING_DIRECTORY ${CURRENT_BINARY_DIR}) + add_custom_target(build_tests WORKING_DIRECTORY ${CURRENT_BINARY_DIR}) + add_dependencies(strawberry_test build_tests) + + qt5_add_resources(TEST-RESOURCE-SOURCES data/testdata.qrc) + + add_library(test_gui_main STATIC EXCLUDE_FROM_ALL ${TEST-RESOURCE-SOURCES} src/main.cpp) + target_link_libraries(test_gui_main strawberry_lib) + set_target_properties(test_gui_main PROPERTIES COMPILE_DEFINITIONS GUI) + + add_library(test_main STATIC EXCLUDE_FROM_ALL ${TEST-RESOURCE-SOURCES} src/main.cpp) + target_link_libraries(test_main strawberry_lib) + + # Given a file foo_test.cpp, creates a target foo_test and adds it to the test target. + macro(add_test_file test_source gui_required) + get_filename_component(TEST_NAME ${test_source} NAME_WE) + add_executable(${TEST_NAME} + EXCLUDE_FROM_ALL + ${test_source} + ) + target_link_libraries(${TEST_NAME} ${GMOCK_LIBRARY} strawberry_lib test_utils Qt5::Test) + set(GUI_REQUIRED ${gui_required}) + if (GUI_REQUIRED) + target_link_libraries(${TEST_NAME} test_gui_main) + else (GUI_REQUIRED) + target_link_libraries(${TEST_NAME} test_main) + endif (GUI_REQUIRED) + + check_cxx_compiler_flag("-Wno-bool-conversions" SUPPORTS_NOBOOL) + if (SUPPORTS_NOBOOL) + set_target_properties(${TEST_NAME} PROPERTIES COMPILE_FLAGS "-Wno-bool-conversions") + endif (SUPPORTS_NOBOOL) + + add_custom_command(TARGET strawberry_test POST_BUILD + COMMAND ./${TEST_NAME}${CMAKE_EXECUTABLE_SUFFIX}) + add_dependencies(build_tests ${TEST_NAME}) + endmacro (add_test_file) + + add_test_file(src/utilities_test.cpp false) + add_test_file(src/concurrentrun_test.cpp false) + add_test_file(src/closure_test.cpp false) + add_test_file(src/mergedproxymodel_test.cpp false) + add_test_file(src/sqlite_test.cpp false) + add_test_file(src/song_test.cpp false) + add_test_file(src/collectionbackend_test.cpp false) + add_test_file(src/collectionmodel_test.cpp true) + add_test_file(src/playlist_test.cpp true) + add_test_file(src/songplaylistitem_test.cpp false) + add_test_file(src/organiseformat_test.cpp false) + +endif() # Qt5Test_FOUND AND GTEST_FOUND AND GMOCK_LIBRARY diff --git a/tests/data/audio/strawberry.aif b/tests/data/audio/strawberry.aif new file mode 100644 index 0000000000000000000000000000000000000000..9ea29815e24c4bc886050886fdf7b553a216a831 GIT binary patch literal 72188 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 m5W(O4C zcieRRP*PlS)Kyn#Kn|ztD*OFK-qXHqqR3{N0t4#@*z^_YJ4%pJjoPTz>*Dpl=tM2W z#uG!pi5Mk#2_0RT`V(w;pP|f{#NQQ@goXYtzEi#{{j=JKa*vTG77WEzd%>=5A-kti6E#) zl~EzUPMg3RyrCXIF}N-G(C>pG$wdOLb*d5&_sr2%-In&`~m^IUb0@{N`g*pskvD~-Thp$;&+v}4Rn zz;m)?j9kV_v~qXEswWNNdef z)o@MEJD$BcKfiQcnPeZ}T;Zu05?yW``*k1W|lUR#A=6Me9SgH`VLd2x=XeATN=<8K3%z`XMt$*&sFs zNB97sTEmpJA}0)i>T)gdlDGo;H&canLNn|>E9iM1NB`(Cx`1_rA~8;sp_aJ_>;ese zu62_?AwD+(W6w5p{yGEeJOnmh8}yz!qW1qC9A5p1kbH|jtd5Mi&QBm3+> z54{`D?jOW#=%&;mXz;=M5W_1VXZ`|=VHTd%zR*@`0gO5Urwn~4XsPYN=^jO|=?0?3 zN6hJbgH8%3i_j->K%r`Y@*M9}AIMNeR7-uJ#xfC|rvB7)Dj8gcHfjYuf%%#F!n|O* z)6eKLG{;P5%D{<#hrP~*($A>bK==M(=CeJRdcccHh9*&ozFoj7>&8Hb zWr!u!x-&E{d`;+`pr)p4raJMro9Lst^rd_fmM^UFQ1D zO~UhcMB^peFi-uAnnq|b|4e-Hy3JhG4@6e5ClDo5zDGf*tVUKjVZRA{MWQZbt#`kP#X1 zQ2770B#9H=fzHHE%pk1;e?fQfk~TmFmZe+=Ht`gdQ?ZhZ3hV{`b)y%o0khpl_y9X_ zgHSx}dU$&VKHh|?N{y~@3BLcmZ|s3GRSEt}!uKlRi-CUF2jwf?!v+Mm5xhwf^0{Pq z3mX(L9C(+SxRXDDhqEcz6F#F)Js*|!AY}5_@w0CLX^ch2b_;s0!N~frqn7hR#it71 zX&t=QOK=?TBcn0nage#n)?!I8K$3KSYArZ%OPThn&6=;;%bL1ODrrL=@e+!xTc{>P z9^PRQs<xs)Emh0zEO_x zrJYNb6i>^4o4Y#yK#9e%-aW+~-1Tjgx5GCj=+)Xtb`*IK zIM7y72Y$A2W+d|v+B_pvV;GT|43^PfrOjd@--5IF;E--)-ab^#96J6qP{&$0(Q2r{vXHf< zB1_l}bn7=|Hfps!%3Yj4hpdo7?k@q~kP$yZ5MxH7$GsF?v0>1e?T8E{3H-Qfy#HNP za+eTkzRwc0Mx1GlPi{vndV$!}2%hLTdTQ^$Z)_(uWK}X6-PA95ryxw4%mu3HAeN!C z7f8mT<9eH@3O?rUm;lKZ?b1H^B@qfmHOwM`b^9Eq4q6evgTrhLL6RLY4-mvwR!z{f z)>YGawO>^isCW3=vC45+YXsO_A5#aQr*a9*oj1j0yp|i}{oB*i-P@JnIpV)1&!)d> zE@Nh7pr#39g}%~e>ZNLqZmMCE@t*)HI4JCF1XXc`O%4b**EM8oE7F7co1Qt`9A&EN zsBWKXk(BP+;F@8-U7AxkB70U=%Wn_!ioi${;XLWS%v}}FAyYam?(h|OqTO@7m3fYM ztFr1&8N&>@dQNvw8>k+@>>?gYQ-nQGZ)}0iVLePA4JSg#?!;QDFZbH*bq#Yzd#i9d z{~&&a7%9iV5;e)%#7t;hR6*DG54ob0C%09)5-(8|bf@>yiI^NqBI+wYq7v@_O}nn> zsfj=?Uwmi709vwBiAO}AhDg%_Op&L-Si2mvVG+0o&HuxaKcQQC0ae@!%rdA^-_=DW zSC^;=4{;gyA_=N=(a_IKR7N7pKltD4KEUI+aGQ+4%PQkWB?3!Z01tJZNQIi=ec++< zaZ5rFgFYe`eT{6x3I9_Qo&)&6f3rr{lyj&c9jF&KL*4jiob*K~P4`9*eF<_>9X!`y z?EbWYVyj41fEwg>D7#03XUQPx#d+dyQZsoo@dLS&N&pXfEzDG$R9ZvluqsqAuK`zF zud=EiYCc0X^^visQK$QXU4$b4Z)G&;!6ctcRZrDZ^+a`^)sv&eFy9RKJy&f!33a?#dO3ad&1(8!iCR>LEs*QKl zW29i0*;Pk4$nJxpabt3!@0?>h_~)Iu?LSNJ6W)LP-16JGf@{SO%97n~VK=c6EV+mI zww{{KZO$d$yV7AMNq65IV+k-nGRK<24ZF1mma(ZZSpr9sIp5&>`GU6%)ns0I{vTU_=ZCF`$d8V#Q=?JO zruQ2@tFgcGnTi)He6%>&V$b2Cb&fVlm@(1%mtm$@$)1>>mOUi%^tiz&-W2rBdezp**2H=sD8y)I7l<#s z@y>+~t-VsIPZHeD>-j-`hDx&l*+?O(m40LlW}T9dPn^Mx7zYh{6)MIARG+(1H}ph*>#n>D zx;)d+;XjRz@nB$r(Wq7aB_qip;NSiQ?-5H#$a5AW{>>vUVkfTv(QY^TV_ksG-%|P^ zvfaSXj0R>A25n^%G#EZ2CY~lEh{^c5Z{X?9l56pI`I|Wn=G5^_4xI&!glfur`Kt64 z%7ay;abQ`$O)jQeGBiDq)Ji+~X5eSD`37^V`D7`IoU6*vKQZkz38s3cQ1d`bKhsO? z7kZ^~m5f%;GACGH22Zjj26YaoW)Rq1(cs7{3d&!VKf0i6VM4gB(t~%ki^&zW;>MhTfyK{s!FDM$h(oF#z;DOl=6i502L7d-TG^Y z+$Q;&R9`sF|L!kDXZ|@jEd!y*QcuYtVxeumQ8CIJP{AYuZ+eVM@(6H+U4;B!%)bTy z{0%7W0HrZHYC&Lnia`Z36u)nc>6}+kX+DU1aTT$x6bcrLfJDv5bWSByImu9)osCMk z8%Yxn(XT#%D%g)cnoKx=E~cSA>IK{+1uW1{<#cGEtVKlHg00UL$QvG@3)&EODGK=V zR%A8LNs;c${LP+K{jBQ8?f^D;kTff|p#a|!-H7Vo=NteoYz{Lk-RW(FTeNd;y#`N1 zPqwd%KVGa(+)^Dj#G9v@ADPaZ+M8Ddm@IYm>zQ=?J@awyg~3ZhzEn7E8y%!ISJ2Rs z%jqoqUtWj2ki2L4azR#cqN}>thaGH+2%KbTs?Aj1dy<@^xeVr8puI93{jSE{_{7!; zKR#|hqvg!n*Q++Fd^c=Gz)!@P;wiaSr;16l-3y(m^?5!QEYJEQ<9+&sCr7UjzCvF= z_+Y^69qCsx*xZNi_f&uVPGd{932$)@E^SdZ$eXFyHAgJ6twV6t3SC1Mgj}moB|xW| zCj9N{S=y{r}W9iG!Za1kFBO zeZ5gPLqjo9N`_bl{Gyihhhl*mS`+dX_m_%*^EaD9& zk+0*|EL5kN=+xSAdzzrWxC^^a!|YueRHZyXKz*2=(_!wp4p{;3xDPsed!alPK*o|b zX!kCG?m;1@a{DRq$c@+FCnuxRSc=JtF3^bYia$RVIm%$vY~u(9^OT*yv6#l5QjzQd zuwHZ|-$BV?7P?iv$VB_6%%fKCiDs-{luLLW^n^%qz$!s#-j% z)tJ<)=R1KZ^V?a zRn{lEqyD7Ae#KUPmOd)uJdQ~0R+>$@LYeL0ogwRE3w zPG!{Z)Yel@`DjN0IE~%HQ~FoE*77azRnP%jXmAyqKhUjTOg{5Ba&;>^Tk=B@QK&Ee z&3TBg552Cge5U6YCyfjw%=M4+o8yynf#(K)TX_yo(p(d&-JlE6s#OiZ_n#-ez=UJC zoCMW`*6{Y7$+_f6R09?{NBTpoAq4SL_%TAb7$h~8M=Q&LFuZ`e@>FDv6QRWS9@;Gb z$~^ADUT9i&0nWS%6-7_<_cD~f!04X{G~0;T=5WNDx=JXRxgSC0`WSSsU&?thhZ|NK zdC79rL1pj?jS#C2;U>6Ham2x&Ou|0+Dx7^HJQRf)7(eE$HSj9$(6gThyp%wevmT#g z5bE-CsGkQzmD>fMR0H1U6ww0JZ)5!YLBPVSm~-0-wV93J{M*YsrWaCy&|E!)Df-<& zR(w!FNI*6+3EYI2sY%LYVSz8-lj%9&J;(LuXXCac;I=e2{bDj1-Wd)WKbhVcJ7|_s z*#v{z(#Z1Iwj#Kfb#7p^d7>_Z-pt$V_X@uh%q{R2O2z$48rXaLPAaF>V@=yEoeY~) z4aB+bt)8vY4sGk;uu9#cUdC>ZlbT&`UAcL7-Az%xh^Vj`)=9c3Zb`w_;-Nwl{i6!H zfE4A4V@1KQ*@wQ~O+WEOyu0aM<;TO{Z2Nfi%k%83Wy8gWs#yJO&2Ng%>&9)dxH}0S z>7VscmS=&>gJxQ9*~Z&a0>|nrk|+I1u9Px+$%&%1g@2b+a8=}oZ3pdna9w_;Iw;{%6ZG?!$w$EY(ht1!AwU^T#5(1o zyg}-Lxwa_&B!3H-S~uji>rorm#EH%TlX(^plv{jjJ$IQBE`R`W;H-S`krV(PxBrM;5V@U@HeuPZU131`_UJf2u$WXN|KHa%mYjcm%%#?ffsrKeOwOy z=rn$(LXEW?b-oH!>M80Zy#@T)iP4>OvCi~9|gQRUl7E`3zsY};4&@I>X(bqSG>qlv-(EEwyz|{BY$D7jw23S^` zNux>YV%|vCy>;z5rMabN%W9OB*!wxbDJs`tI_s7jE9;x8x003ooqdahcxs^0WGe|h z9?_}lKQ-g)S>vkK*ik7bWR2~#B}ey?nB*K&I?vaM`evd6)~bMKIfIH<76j(Z{516S zrI!ug984dV*)%65ze{Oz?ihJQ^-)ukdduJOc6WVtx%`YWn60X>Z%Q+dG^bgXS=N~6 z>p!!JQUMq1KI9x{e^PeEKGgNlZCLOu{9^@NIu85&oupfdCjGa|E) zBlg8t7Lc3X2ECNk(YK{;-t*4- z_KWru`%%Xd$9q?fzo-0;p|uP2iQ3I-l8oU~xI(c7b-^&#x~qazv3cal7=4Y0H6KMg zDuSauXqRcaMpkaPIy>t5kI~HyXUrOAvp>-_yp$?DotKhv`0d5FL(_lz{Px@2yv3Mp z*w5dkLNOsYh@|;A-%8I@&vkyelECh7GwYN9qxMMqpmdFULw+Olv|+O0_7Gcw?MfC$}LcCfpQC!TcF$mrHf^Skk4*}{<(i+`M$Kga<4^9}k2Lv=`A$eQ`zdH>^g z*8I2((&+9fZ=65=@yBt+h2xIJPrH@gcWdO0Lxqoa-|+eMA6LT=4%z{ELROG76btQz z;-FulNU#?U`9on)BKZ69>A=GEDCnRWDQ=|f>&#B{({n5F86=< z<$oKXV?m_IlhUPeLkclMg11`ubl&G>?&;Dva~s^h+ChVVbOl-gc9cQ;aXa_GFl0mq z<8^?bVT3xgXyLLS=ip()Faqp4`aL_TzxJud^9oV4nPKA++hpj-2?WwKnEB0!~~-NoANMteDhCo81aYP5rXg>Q-)1-^yKnTj60MSXp*h0sm2RjR8yW(!&_sr z$d0#jn{RB?UenephU;`Hdxy%@Yu-yIx~r+;$?g{lvu~U}_|Jd)=w!M^fORD0Jy-T+G}27{ zIKG6H<@D8J{|nfHes%9K?=m+Z>+3Y!5;qf9%!!GSS|rUK@paTnpfofzT<~5d4P7N@ zQu0EynC^9;&+!jt28umx5)yoBC=^#TcWC|0P;K}5y4XQt@??H{*O7P9yvN%EI8wu@ zcb>dXVV>e!alCunvA`#}Rf`M5>`YtMASos6MHSKC`Q#x^=>q|)Z-gYc+`^rp1w1aD zkwtChIhiM$Cdwr;)w*+Zb0L=?kyDdoYZ>JyVA}1oMf*yJf|shCp3(k2!oQs*wCBXK zid#9hxI)u7JfGg^b4t#>Ecr4fkd2cD^;>suI`m1nv0d8j=At|Fv07KXxVghxcVv2p zBr5V+|7?&Jk97acbZlYwXIf>~1s7d)n#9s5r_oQ2=O6YoO2;N7sL+tyb8A+081SE?aN?%G?du@DXnb4C ztn3r@_9HuYC?bvp;H{ZPsa2+>&wW12CfS1JGr#oDavhulnm3G?q*krEFA-0}Y7J}@ z2k&W9VwU%#8$2(se&C+8fcv(2+*`hz60)wMt+lNgevY|`%aalAHp;~eCc)aA zDVE(l#;Qb9lAg=5q_2Z$vnig2sY0nQVo*05n5czmzQiS8NkNtOsYWs3; z7uXgXpPkSRpPWjpT%==_+sl^8w>nTd))lPTATRa)%D#O{!`_&! zP7ZpZ3pNU+3F2FiT0@k1Eo)h!eT>{MnX;oe>BP|bcG;S$C9A=th)zOQ9C8nT$SoN4 z9w&{2U8~#X&$i%PCD^4)r*-BInow>?1e|GX86i^2<5F&)5-m1Lt*vyR1W8L_%RYh9 zW9;Lp7OSbphrO8=`hAugL%wlm^ULEJZWmZ}O^dM`;#~5b#@1)53}VaHUE%1A*?#dlHsl%VS?^b+Y8Pn=q z*KBbN%j=mDf6gOqZ&cFOnf-l*r9&W3di`5Yna-DQrEmi6o&Y-{JF4V8)^L8VvybN{ z5edT3rQa@yWwfX>nPy%Uaql_%GG7k{Ng3(8 zP?VcND%9B5+7ZXv-I5Thh6XLpL9B|1BDL-mmQP6D^VBkb_v)1MI$ao7_M2WG`IK~# z)98_wX}g0LoTiVvdMdlRx>_;*20x7a8~4czxNo1wz4fk~OH@CMpE%OS*R|ZHvM6$H ztY@l~6}oCbd-j;qU#h02Qy&t1u2`QMA?`}s3fp=@sp*$0H6p=EgN5oV}nXn?76E~^W5mC|*BMCXrop`CXJndZWb-1GKr3%>bHG#NiYw7n3&U#04Q@@3e&M~JBnO{T{AQ)4*?k^WvEdTbovN)&NVYNal zA#y6@Jl&1hEm(=D*rzh~0-a>pMko_@#hUoCh6tq^*3ribWYI5KQ-gkjHkVUEg{UrxovwX8vVA*2MFC_%W< zH;zKBiw)|qR;SfpXpehO6HnirEHuk|wWvX3j^tBYU6{YmB*A#9Y6VB^{CmW6>bVV{ zf`Y6BtnGuuzHh6hxYs8;^p!GfD$^ksU7bba`acnILH2Q?YRwPNOYt343k51QDz;r0 z(~a4t4cip^q^7@lU4-#-x=m&)D=WezY=A9%)6o`J1o6FK)Ze%-{inPq=n5}RZTF9( z*qJ7Z-@5NmFB#N|CuQ2Qd`74u{pyz~V~yK-H^=w&Tb>9XnP@Sis!SZ1(TMV>49%W6 zQ2Hp?B^hlEC8M`OI}rWxy&GRxRX*v6EF}76rIz_g_oe$N{9&WOC6O>8*V879GpD9v z*^~8sD`hp+I$O(Q^D3w%XEAmsyM9gRPUZ!)uo8TotsYNVrMPiKdEau1u^S4$-96H7 z;YOj)S|k!mC#h!+eJ0Rb#gqC9G4QzJ`K;Pqu>9klpIvEZOD7$rOiRmjaLZijtr`!` zmekxNS&CgQ1BAf1-b@q!JTC zIOhIgVn`(}orEVkZ_Rrg<=vm|^T}b~fE-6DP0x1b;b=?_nwlONh-#*jy8G1{dK>Qb zh_~r$RT4uy8Xd>YE7Asx-CH6{+C2bY#88 ztsnk&Pt$4U`Te1~(rNTfmBY@>Cmk#3!&jW8l*x0}b?wex8}S_&skFf_v+E2_T2l6u z5=fJK^Wx-2^{IFF@4J@S|NCn%gy-JjdUVurxsLyQ@5EZNaqT~**MBbQcQZhxC1bNyLL%cnnn=@Q*6>7N^<40@!;2zcGEoMfi8+T}-Z6l#5K#QVaWTTg0uwxyre259=> z3n_A|H|iHl(j(lc^|R+sI8CQo-3+9Bd4Ar97@A&7pw<)_m6_;awpauweO)KYw-d3S zlgyb^Qiw9+kW^Tzk^<#1^&mp zSNg*ad$BMtAI$3`9A}Sveb*t^Kg+rpxA;noDn5d~T2VY1>|DReBAij?sB}ezQI7pC zS8Tgwr#m^W=>v`HJ%z{hL*a2uAuRLi=wq8lc_fH=Fr9&gXF%HpVPO-7c3IELsLUz% z(oUfX0~X>8VBxB#u+Y>89$wjXq16L5xA}^D^0?MgXk7a|XgFwGGagDdy6tkU#;$?{{3HCOR;`mJuk zM~mffLLWBRxRbo@nI{jfoCtpuxMF0kQ%!JLIuRBvb3Xh)-+|pl$=Yu!qoV}oLp`#i z!_DYm=PFHSo<&re?^Lfalg^%^CN@i&x}RHynhPbB&;9D>rB#(ep^wf;Q6xIc1i{MM zipWZ0ni{2RINsoT-h~gBc9j)bgaH%1G8@L1R94omESddMQ)76}A||7u@W3+5lbB_O zSqPGaX@=TOI#Iux`z)3#`&48|$S3Dc<_Sti2WoysdLZFKh2qchxY$IAK`_#$AaIDQl0m^AI{@m#Z+pWQBY@>iiI~bR%ou= zciPom4ks{_)UVaeSv?EvZ4V{DB!K2$K}%#PVFtEH8_t}FDjkCZ8EWvze1mkovpa|R zyrf}~8sAN*#P<>^X2NOU)DG|^6KGKnfphmj@!ry&dn=J@kOKn1_0hS!_Z=2162zke zh}+Og#3Zy5=?_k|gZ&U_4ciP^adhwaE;?)p;BCs#<9`+t2z{I^8C!X{gZd&~Xdd#6 zi6<>tg!u3Xx<^`!Mx58_WuI!bY#!{QD~GM>Y~0;o?XhuJ_xe}+z|=$ynyJ*hTRc-` zB=<7Cb8kn`fpO0!)Ej7*RkUp*bsz!YEcXo+bqyl06ZGx~1JSL)8l!24ye~U=ly%1U zUQDoz_vG1&H2->6PnfJ)ygcH1XSXc%T0SmNJzG1-Xivr-L$lOWo1zK(klWnYV=0XU z?@yA-vD^8$q!BfKbh0vPQa>f7b#;iJ`*7GVqUYB$`V9P}QD>C|wS^NVPxC{3@=H=Q z0uU-e@A}_ZF7ExnE&cxhZb(VI z>E0T{UUtF+ML#D&!WORPBSm-bEirnjQYzRy)q4wehSW9y>x`bD8r$*v_!&8D3SmFU z;U)lcF9?ecNYKqWkQ2|1llBrAZH{V;IY^0d6H-aLG?v4~wd_XIHJTLkAgaP@$o{=7 zwzge=iQ%2stuf;mJ0SI~;c-oC=zYsife$+leBdT8LIEQ$4HAKO5!wVI2dX%Dl%Ew- z6);dRF^`c0DNV*ivKKwPe~(aQ!o&T7N4}W5iWrVt@Al`tsgf ziA83Ha*NqfyVMOD)pn;6)PddD{OW@+_ln4zKQj<@k8n#_M5=bFVsDtFp-;&hA9RqL zOle1E3b^L)?-`$ti8>vJ>Tku-9mHxaI$sHbd{2YMEFV2jq7RB=tC{MErg#sv6a9%e zXI|#!$|1G3U#0fW2KC3V=}FtCz3-Y|u-NaGLs(=XD zcYYWf!kq4J8@GkGgmalxQ~IL@(``Pp`98HNmV#o-%6tX9RzQ-@d7P9+9)8%eE53Kr z+@T?sC3b^|Cnlge2nCW|C&INIG+H(!EZ<*lXLev-KAQ*~`-st=q?<%lJW*xV*XfQ2D$DO8+AYnIMAp*t zRLjLXt7u(Izo{J9?TB|S^J=!e_Yh|b8>TIPR;Wg)&S%mlO%2vzsj9MmUC3Lcjcw9$&aO3x{gG*mPgR5pP)iSCMw8*P!3U zY)nu#hIO@iJ*s+NDEimp`(E#=O}-=*U))zRg>2A6dco#b%YSY9FHDYk)c=cZKm3ma zAn`Gu|5(V2EZAY03-hvdeqN%}H3Hu|C<#p=q|mAm4m!|Kt-rUg-)fs`a}+5Wx2cl__35(|xyV|}QSq?WN6PBzXo>Zw3zMv}LpkVjpmY*0`tz13~uBYur5+DcU zdLRT2Kq>(xs@j<@SLl5IP$j;nqhdpP*RPhMto`}#I_M_M7jCqOb;^c@cEoG_YJc6` zPc(FGyF7TBGhcW$AN$+MQ)jH_2qE)g4_6C+| zL^H9wfA3cxzl%6)k`GIr<+lhfs|n00eUKhWkCR?mZdWPK;kAOq$szS8hVHnXXA)H3 z=?SIJ#C93G5k8R4j5qt9c4o@fMoK4bjbvMkWsPW&An?&tNU1wWKm0xx*gNBH?BMae zVhMF{z3@`~CVW>Myoh1dla_OCWK!gU$`q_N53{}Rtzlk_c!qY$X(-e9q_7sqWjaof26{hX{F^vu7gthe?9` zp!e=~y!`6drQ7vv=h;}UcK6(3agNVu@hikIAo#{}P5qjlHJkYV1?2y0Uji@WD;IFz zyny?A^SHNrwne#RW##ZAp(!6Jw62DQM(PTZODX=rgo2|YG!sfz4F;xA1Oy%)rtDpU z?gX}_Om3E}3eKpppyb78!C3>yUvkD9AO`Vg2qO>ZoF@SJ*^m;WkgtSgupngdZ)oyW zf(ZN@kxDg`tnw?ctX_dHeuCty>`qRFZlt#yy5b&JP}9BsZHkY4nkBnwc+&B{c0^%X zP!Pz^1ur#m`6v->>0VbmT+t>%2SQ=NJsg-ra>t;;|1qhNBNgrW3NSI`DF8zOpx^y^iCP#~#_r`0+0I)|*rSNe-(d*Z%xKMKUWuJ0p>wBPz!;#-2{67epFF}9^J zE8Xs@Ra}+sWA~k2su#_okd+epRbv3~6ThK(OmjkMCeD7RtD_=IOQXRErFdURzHyA4 zA3@)SI2Np;a#TiGe=%Wk{h%58%J;4#F)!{(yI-kIBn3QCy)@PyeK7v+ih~*A%3s|B z1@%wQpDl%Hy_I8Z*==@5!-2k;ZAdA3Q`$MBMhbpVi+3HC@dyuDCQ74vNXLj*<`k!> zU7w?^p378fs1wLgXbW+VGSS!lLrO}zucsa@-G_`$ZLD$s>z7OE5$*vhW_uLJw=_Fn z{-xkw8^`~vy@OTewb26ZKQG{Z!S9BTKd5VGkvA}^A!MmspiZlcOXN;k@ZCa@{2f4S zQhWXMR}W%Qx$UAQp^!+;8u$U*0b)&{(2YKMa^Q{t*V+zJgOea7_Z^F#AgVXPVR$Dm zy<_4(G0fH$_YXa>@3$7Mnyh!IZHv6Tw_JZ}tiM4fF$@Z~_>Iat&mCH-)=3jIq>acs zLsxl=zqF-Lk`R1qQhVse_LkcNBlO{h@t78)UNnz!(h-Myf3xZhx04Nlfn&xT)$a?^BP0`AjMldzK>@=lc2GFE@{!1S1Kr8cJW@0e4~&; z|JZP4Ys<=HWj-wC4d>nwe2>D4b%iF?$YJbw%Afum+!CW+B{5H#zPXK6**xgHY#X8| z#sbAO?CT-kpP7}W)2Xhsl)Av_7V$*G$;{9m$4bJg8Zm=Z(-2I_jJrYIiMwQ!gd{-XuSh{*gI_UO_ zAWE)nv1eM#At*?zSkb1nT>tXjcFjlaGDiu52od4pYaS)pM7-zrPAx5_`iU)`q#NbL ztxL_AC!V2_2BZG_i|GGVX#c0z!yvf&58Uf5nU6Ou_#b%g&`R}=c#nzUmia73@}hZA zSIoO0B75Di)=i~7Pf#sC2`$EvLepxbaI*nYXc7-XrVOOys?ekmelV!j&d6I3?`n)k zd?f}47&j$+g~%@Fy+Zrx@);ps9VuJ~^vDJw&?nZg(CjHQvBu6y zf1}@6)d4u_EaSo!K24)a@23wffDD0Ed_LR~+Bl%PjjFqn{8sG$v2q}$+x9mr#l9n0 z1HLnI(~>T2o63!9+RI2UR?ztpi7U_zDW8*pJ`kZ@p^elg@?Q;0syE%+!A4AFHXb8n z?^=D96S>R_txsq;S#hWqQ6D-uoDkM%2iC`p2o zMvr0ATnin7iYv%+ue|G19m$_uR;pf!n@oR@pcbg_ly*o%=gKx7j0ZBq63C8KkeZzg z;j+?a&@wcM{PueykGaB0c%CA6?Fe?-u|)NB!G`a%mLF?ARp}8-c`tr%-QnHa{t}@n z^vX+6Wn0#~THmK1jN^t`-ROwd@teJIpSWf5h3@MYr?SQqQts^4(7sWGb7h&R`;ve{ z@D})`*ZL`YYF)d5E;4Af%`o|Vk%)vMCtxKqb48hQ@_&k?|6V8OQU5Qt{qR355kLG7 zpoIQ0FWnaA5Pur>7MUIB!;#Ra37s3cd;iGj3G6|*oA9&tz&80hWgO9< z^LlxIW6kY+dgLJ2=gTN|a!|U-KCx)Bo7~%kd8P1nC`XN;7bdYm-Wq!c)yF3D{W3@tek_}Y6cLoIubB1yq^=i6P7XjRf& z?Gq;mTnGN)ul3S>nVpf-dxciEjD|CX##4iCG(T2Oq2E3uKO*WPCe)1q`l$Ed`-7V1 zlQrcVga#UqjTS%0tuqhUvIp;qhxl8s?I~WW2L1Pf?EewHg#p z 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 T?!^6l@dlv69X|hixyAlp;NC=` literal 0 HcmV?d00001 diff --git a/tests/data/audio/strawberry.m4a b/tests/data/audio/strawberry.m4a new file mode 100644 index 0000000000000000000000000000000000000000..9af19c85aa597116fe6c5399465ad583d6f4521a GIT binary patch literal 13056 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 literal 0 HcmV?d00001 diff --git a/tests/data/audio/strawberry.mp3 b/tests/data/audio/strawberry.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1eb6c3b621fd0154b28b9aff92fca57c6772fd30 GIT binary patch literal 7019 zcmeI0XH*kix5p=;g&qjR&>?^VDjh*;r~-mOC{m>fBGLp@uqA;YMS77c0@78g4I2R| zf{1jxAPOibO+jkT&G@YMez|u&>$!Km-|jstYi7=5X8+G`?>&3Y919aQW(aQ54)*q@ zj6E*|F|~QC9x*?_V46GmQ41U5gO^P)3JwJ!A+$BKi;q4-Y>UDh0|x92^~e^Wnp%sj08uzc2p!wYIedU~$Iad>MmN(||kw zYBEe>e;tbGOMh(p*V(`J;3uI2LTe$0SPXHHd5*H8$uf&5Z}o}G&)8XGr+CmW6KG^| z(VD*PjDA)0DOS#FpD2<8=S#fM6M1N~;&}-<-1^J)_JsqR9LDRs16YU!`P`#+OhLev z1)1CfhS$*(o+bTnqYh!==a*(ZDYnStzHav~>ykrT9!@;5axZEh#%!f0yD1oi z7msg6=}Kf^rP0h4t()6h4&p4dR84eQnB@NbQg{FW9p5#L( zWk)bhuN*0+S1gRfKpfcXW6uy|ImlXDFnsU%xCpTwCcZqU&Sdl*E9>as(&+E+vv7!s zjZI(^Zx*{LL5wYmaNR>q?`>X9!8+u;r(j)@y|G5ps2V%I>mHNwxN$I)oCdZ=Mg7Vs zWRc*w*x))J7>Gl#X1>>jLV)xSc5gMCS>9O3hevz9HA61UY@JL#^{RLCm+nz<-UyA} z4eLjC`5i5vmIe-Nfyd+HqibFUGJ`XzS?3ovIt(MI0=w9CHVv}5$?t$`s;TtJXH*|q zh)j?~LxnI9?~W|-dCx>GCg~xbS*COLKIj@_=}C{2ynulK!+xDS{|B46!Pcvfacw0D z>SBUm>#3QMWEc;ZV!(%on{OUI*P1Lot9tAjSOHt>>sN*P7_R$R{PB=!ZRE;_I5gzehl6HzH@(Vv+G^-<35YaBy{)9z_0z6MY<1nE>)klH9S`2F2H8{D5eg|+`h)+x-Z<> zsvH-CzCdCAB0|>#`iBIy|D+h1EGa4cnW`X(I1cT$1^Ltq%!RfNd_Pg2&Q5;FYV(JI zaD4feW6o_yzDw^yZfGEXRGFEUB-8`2A((vg{`rav+PJF5GolgKzPbzUubj?O{iH`} zlo*-Rh>hDp=Q#O;|8Ujo=-bs%nX3{@RhHKxJt*$VIc9gOh!>BHYXZ>y9CIf+2nO22 zKWIi9ph=*Vo`#7wI(0T&<&WWvcKlv)d7Dt;XAO^c-LyxbnWozA>mHTWl55V^~8&#$-&_N91%GkxI zPL2@h-L1Eh4-svt0Vln5h`s#)+xIlJfBoJHOVB)c5+l`r%jZ{8jVuOODrA;9mAd&a49>r=N`3p4(k%C5w4FQ;43UDf!!rwCJ# zWLD9=>?w#~vGza%0czf{om}W>eTrkcA`Em$HiG9?YhD1P9L7KWO$fC#;#aCDY{B=% z$D?+Nx(o=is(=mVubZtnZAL^mSs_-{8zcj;175B zTKN+K!_w8e({#xtk@>#aK{BW$*Mq%zio%-80h%aIjrZnmDVVsPfp)gZGFJAs1@KC z(G4N)cRn}-5+Xwu4rM|x5D&H|=2ksJDBEBTa%k^0R97uXd5F&H_k12PpP%K0+S=U1 z!p!!i9au;#(RdFHI?CREw^_279*kYR|8~0$j2q=$&^(besiVTI_j*a)5MQv-{khdt;4}3d)hl7+sTrsIr~; z=1{fQ+M8^tov&%UQ8yj6%1E*Y82Oi?a&BQ zrH!oedlvl#ac^LeKBltv9r?k@LJe}>1>vE1dp}n~iHFfxA}5ggKL6MraP++;o}YOE z14)T|YiAUNC`dSXWeIEo*W0ZiWhNx>0P2=$gKLi>pf`;2u1+tfa}O$u9TiF`Io;VA zHr2X$Kb1@6`tVnKu9ZOkN*jax1+c=@PDsa@pZP(*`pDTQ@kO^#dmcenau9804+C)v z*rkpg9?(MenaHv>lp&d|;_e$z6CjqUl!IqEFi9Ko)AekgzA4=f0i?bqh@v1yPw041~v=?V5Kw636Bn zYf5W=M~Tn=I`qPEiv+r=3+{pK2uJW_lLVV*7->uD2(q;5@FpO_nD}Q?hCdrafrK+Ql1lR-SOVXH?Sh&-vOX{2jIf9Av=esqE zeh0-+jRu<6?nyUeMptV_`6NcoyB!uPQyx5Yiu^NE(8A)eJvqr}Xw&8$n6ZTR4@mXn z+3tNKC6`1Wls1trIChNg!3;{|av+w3_y}ux&q%BZ#wp-*m4m#JLzyUpHk}eMUaPjW` z`S~-y=VV@o>q2p8=Gx7iEGD|=W`%RQJK*jz(;q3^%Ho9hKF2oQqoX? zPhYaHZE|wivcf)opK#YcHWkh8umTw9kmS&6&%L|=rmVEtombeSYa;We0}16vPE`ih z2StSRz{PintJ%@({?Y z4jH?eOFV079xTheDG!tO7AnTtpMg_ur`YUodC5b~! zw*{{#6*ekev{F}GZ)oFHoU!!(CV8^h-$sv^tdVO|D07Ug&)&J06~N>Lu~50sFLn|>_8vqU>0c1tkOLM< zV;iT4%le(4qYjHx9I<3T z4q{ptp{XToppyM86T)zu zPsO->TPzSVrP8=S(c23})5-~0oCz<^g!r*$n9cDJf~o_lA?uJ7AaPq*0)pr>2s~at__SNm`Ib7XrCsHu5F!Sk-kndF$G&; zHm>{#yb_@6vZm&J?hmQVXZY*Upj{W$*r$T;g_Ah!zXAnuOVrPoT#TPGZ3!#2>SGH7 z@nU?4ojFNbko-Iir}v|PiJ8<{K|A(@<}Ab4)%x4`iv{W2lZiD`5$^b|6aX%FQV*$* z=#dyN_(1vUs`Q;K00>~Ey$evee6J+zG(^hRlG^XzD#JzYQrEAx$l)L19%X!Y8Fh$? z1U5Awk_iY=G>09k+jov~bEjVU@zht=3c4T5I62xbyV zd&sS|AeOno@8 z>todj#?%Lef?5zifPayy3Q=$43Az`7&Pbscy=G0;4=)94OH=V;+>QL)(d}}XF4K+3 zHt!om4awj)uQ>9UPr5ky@X@4nQmv!jZfDhJCh0Ii(yArc5l0F|CFbj!4bj;>=&MDb&f)I zUUMh-Hu5c9k}AjFZsuj&H+NIwd%pTA?UE`2;$m(j^n9ze2TSKZu3f=Z*MGW=TjgW~ z3V=m-4%S^{2rc5p3?aywC8%9QJ>~P9951P#rWyq#`N(T9keG-|<>0;KC@7N`^>B}o z`<==CXQwUKTsoI4)DK>pT3^TsyI8oMCfz9zWRzO@p_%WvsR*bTZUyc4BtTxB`tWTaAW9h#JySJ(pyP1s;!2QZjALScgXxO48*xZrFOI`*%`8OX;=(v3;Ka! zX(+M6Bf1hC7n|1B&$WK0nCT~%kLe+l zsWeb!HqXW2o8?cSlOO6y-WT_1tgrGBeP+v;)x*zFK4Ws4<_rnT)bOIhXi9AkB#a;D z!Wq~l4kT)P==0bmmJlx#IpKTQd)-7s^>5^4yxNv4?z*n`uhW?86AgsaWv=%#b3B<9 z99QaPdF2(XbsV|)Zj~_G$smFuMT|-Y48*fz>26OwBjuR6AES47Q98U)uDjUG4xg5- zBZ29aX%4Ebutl1dSgx-i z=_bcgA71d=@Evw(>W!CzXki$B72PDYAC)9E9hFf1=uPoZWs_yOri}pkkgaSvk=(uk zhSW`A>>ApUSZjr(57~(PDGKb^mZtlNv;e3K6~<5Vt;r~v6_iEq9VzU;wfpOb$4|5`9|@hmi*IGPe}}= zEtaiAdT$)5a`Q@DNwDK!oeo$BqkAAlm0#SnJR@zNAnYJF4c;j+|ifvyn1P|fp+r_LkG+OHO+xL z9A956-8lA_<1*?PnGgUuf8-nPyUdcez=gTb3e}4XU4C9LwDS;CQrix$c2g|@VmD=e zC+AA0Zb#Tp6`HNyn2o_tYNnoQ^hioigaOXSH7qkkhbPz4l#RhN47PVV8u#6vrM}j& zpY(=-IIwn2k6@t|T-<%uwy$~?=KD>TxQWHY3sUk#!fYjm;MQFyAT3)ez<*o!8xVWn z@yJqYP^QnV+(X=Y*sAaKeRoBX9#3FwyjJDBN+~h6nqZX=2Ey??OGG=M zm`fGPSn;xsj>Fb?Bgd#;zfb4?f&NQ2{i73b%Ke{; X&_D9ZKez}k3V-_y{R12S=#u{cr96F; literal 0 HcmV?d00001 diff --git a/tests/data/audio/strawberry.mp4 b/tests/data/audio/strawberry.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..76cf9514d5914e12027ea8fafcdf773aa5bf3a66 GIT binary patch literal 13060 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∋la7p)$V&U$i~hAyIk}y8*b@{Ah9*fZ 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 literal 0 HcmV?d00001 diff --git a/tests/data/audio/strawberry.wav b/tests/data/audio/strawberry.wav new file mode 100644 index 0000000000000000000000000000000000000000..afe820594cb4ec0570908032fc250f66f3df19b2 GIT binary patch literal 72178 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 literal 0 HcmV?d00001 diff --git a/tests/data/testdata.qrc b/tests/data/testdata.qrc new file mode 100644 index 00000000..bce4ae1f --- /dev/null +++ b/tests/data/testdata.qrc @@ -0,0 +1,15 @@ + + + audio/strawberry.wav + audio/strawberry.flac + audio/strawberry.wv + audio/strawberry.oga + audio/strawberry.opus + audio/strawberry.spx + audio/strawberry.aif + audio/strawberry.asf + audio/strawberry.mp3 + audio/strawberry.m4a + audio/strawberry.mp4 + + diff --git a/tests/src/closure_test.cpp b/tests/src/closure_test.cpp new file mode 100644 index 00000000..ce27101b --- /dev/null +++ b/tests/src/closure_test.cpp @@ -0,0 +1,148 @@ +#include "config.h" + +#include +#include + +#include + +#include +#include +#include +#include + +#include "core/closure.h" +#include "test_utils.h" + +TEST(ClosureTest, ClosureInvokesReceiver) { + + TestQObject sender; + TestQObject receiver; + _detail::ClosureBase* closure = NewClosure(&sender, SIGNAL(Emitted()), &receiver, SLOT(Invoke())); + EXPECT_EQ(0, receiver.invoked()); + sender.Emit(); + EXPECT_EQ(1, receiver.invoked()); + +} + +TEST(ClosureTest, ClosureDeletesSelf) { + + TestQObject sender; + TestQObject receiver; + _detail::ClosureBase* closure = NewClosure(&sender, SIGNAL(Emitted()), &receiver, SLOT(Invoke())); + _detail::ObjectHelper* helper = closure->helper(); + QSignalSpy spy(helper, SIGNAL(destroyed())); + EXPECT_EQ(0, receiver.invoked()); + sender.Emit(); + EXPECT_EQ(1, receiver.invoked()); + + EXPECT_EQ(0, spy.count()); + QEventLoop loop; + QObject::connect(helper, SIGNAL(destroyed()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(1, spy.count()); + +} + +TEST(ClosureTest, ClosureDoesNotCrashWithSharedPointerSender) { + + TestQObject receiver; + TestQObject* sender; + std::unique_ptr spy; + QPointer<_detail::ObjectHelper> closure; + { + QSharedPointer sender_shared(new TestQObject); + sender = sender_shared.data(); + closure = QPointer<_detail::ObjectHelper>(NewClosure(sender_shared, SIGNAL(Emitted()), &receiver, SLOT(Invoke()))->helper()); + spy.reset(new QSignalSpy(sender, SIGNAL(destroyed()))); + } + ASSERT_EQ(0, receiver.invoked()); + sender->Emit(); + ASSERT_EQ(1, receiver.invoked()); + + ASSERT_EQ(0, spy->count()); + QEventLoop loop; + QObject::connect(sender, SIGNAL(destroyed()), &loop, SLOT(quit())); + loop.exec(); + ASSERT_EQ(1, spy->count()); + EXPECT_TRUE(closure.isNull()); + +} + +namespace { + +void Foo(bool* called, int question, int* answer) { + + *called = true; + *answer = question; + +} + +} // namespace + +TEST(ClosureTest, ClosureWorksWithFunctionPointers) { + + TestQObject sender; + bool called = false; + int question = 42; + int answer = 0; + NewClosure(&sender, SIGNAL(Emitted()), &Foo, &called, question, &answer); + EXPECT_FALSE(called); + sender.Emit(); + EXPECT_TRUE(called); + EXPECT_EQ(question, answer); + +} + +TEST(ClosureTest, ClosureWorksWithStandardFunctions) { + + TestQObject sender; + bool called = false; + int question = 42; + int answer = 0; + std::function callback(&Foo); + NewClosure(&sender, SIGNAL(Emitted()), callback, &called, question, &answer); + EXPECT_FALSE(called); + sender.Emit(); + EXPECT_TRUE(called); + EXPECT_EQ(question, answer); + +} + +namespace { + +class Bar { + public: + explicit Bar(int a) : foo_(a) {} + bool Foo(int* answer) { + *answer = foo_; + return true; + } + + private: + int foo_; +}; + +} + +TEST(ClosureTest, ClosureWorksWithMemberFunctionPointers) { + + TestQObject sender; + Bar receiver(42); + int q = 1; + NewClosure(&sender, SIGNAL(Emitted()), &receiver, &Bar::Foo, &q); + EXPECT_EQ(1, q); + sender.Emit(); + EXPECT_EQ(42, q); + +} + +TEST(ClosureTest, ClosureCallsLambda) { + + TestQObject sender; + bool called = false; + NewClosure(&sender, SIGNAL(Emitted()), [&called] () { called = true; }); + EXPECT_FALSE(called); + sender.Emit(); + EXPECT_TRUE(called); + +} diff --git a/tests/src/collectionbackend_test.cpp b/tests/src/collectionbackend_test.cpp new file mode 100644 index 00000000..91437b9f --- /dev/null +++ b/tests/src/collectionbackend_test.cpp @@ -0,0 +1,370 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * Copyright 2019, Jonas Kvinge + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include + +#include + +#include +#include +#include +#include + +#include "test_utils.h" + +#include "core/song.h" +#include "core/database.h" +#include "core/logging.h" +#include "collection/collectionbackend.h" +#include "collection/collection.h" + +namespace { + +class CollectionBackendTest : public ::testing::Test { + protected: + virtual void SetUp() { + database_.reset(new MemoryDatabase(nullptr)); + backend_.reset(new CollectionBackend); + backend_->Init(database_.get(), SCollection::kSongsTable, SCollection::kDirsTable, SCollection::kSubdirsTable, SCollection::kFtsTable); + } + + Song MakeDummySong(int directory_id) { + // Returns a valid song with all the required fields set + Song ret; + ret.set_directory_id(directory_id); + ret.set_url(QUrl::fromLocalFile("foo.flac")); + ret.set_mtime(1); + ret.set_ctime(1); + ret.set_filesize(1); + return ret; + } + + std::shared_ptr database_; + std::unique_ptr backend_; +}; + +TEST_F(CollectionBackendTest, EmptyDatabase) { + + // Check the database is empty to start with + QStringList artists = backend_->GetAllArtists(); + EXPECT_TRUE(artists.isEmpty()); + + CollectionBackend::AlbumList albums = backend_->GetAllAlbums(); + EXPECT_TRUE(albums.isEmpty()); + +} + +TEST_F(CollectionBackendTest, AddDirectory) { + + QSignalSpy spy(backend_.get(), SIGNAL(DirectoryDiscovered(Directory, SubdirectoryList))); + + backend_->AddDirectory("/tmp"); + + // Check the signal was emitted correctly + ASSERT_EQ(1, spy.count()); + Directory dir = spy[0][0].value(); + EXPECT_EQ(QFileInfo("/tmp").canonicalFilePath(), dir.path); + EXPECT_EQ(1, dir.id); + EXPECT_EQ(0, spy[0][1].value().size()); + +} + +TEST_F(CollectionBackendTest, RemoveDirectory) { + + // Add a directory + Directory dir; + dir.id = 1; + dir.path = "/tmp"; + backend_->AddDirectory(dir.path); + + QSignalSpy spy(backend_.get(), SIGNAL(DirectoryDeleted(Directory))); + + // Remove the directory again + backend_->RemoveDirectory(dir); + + // Check the signal was emitted correctly + ASSERT_EQ(1, spy.count()); + dir = spy[0][0].value(); + EXPECT_EQ("/tmp", dir.path); + EXPECT_EQ(1, dir.id); + +} + +TEST_F(CollectionBackendTest, AddInvalidSong) { + + // Adding a song without certain fields set should fail + backend_->AddDirectory("/tmp"); + Song s; + //s.set_url(QUrl::fromLocalFile("foo.flac")); + s.set_directory_id(1); + + QSignalSpy spy(database_.get(), SIGNAL(Error(QString))); + + backend_->AddOrUpdateSongs(SongList() << s); + //ASSERT_EQ(1, spy.count()); spy.takeFirst(); + + s.set_url(QUrl::fromLocalFile("foo.flac")); + backend_->AddOrUpdateSongs(SongList() << s); + //ASSERT_EQ(1, spy.count()); spy.takeFirst(); + + s.set_filesize(100); + backend_->AddOrUpdateSongs(SongList() << s); + //ASSERT_EQ(1, spy.count()); spy.takeFirst(); + + s.set_mtime(100); + backend_->AddOrUpdateSongs(SongList() << s); + //ASSERT_EQ(1, spy.count()); spy.takeFirst(); + + s.set_ctime(100); + backend_->AddOrUpdateSongs(SongList() << s); + ASSERT_EQ(0, spy.count()); + +} + +TEST_F(CollectionBackendTest, GetAlbumArtNonExistent) { +} + +// Test adding a single song to the database, then getting various information back about it. +class SingleSong : public CollectionBackendTest { + protected: + virtual void SetUp() { + CollectionBackendTest::SetUp(); + + // Add a directory - this will get ID 1 + backend_->AddDirectory("/tmp"); + + // Make a song in that directory + song_ = MakeDummySong(1); + song_.set_title("Title"); + song_.set_artist("Artist"); + song_.set_album("Album"); + song_.set_url(QUrl::fromLocalFile("foo.flac")); + } + + void AddDummySong() { + QSignalSpy added_spy(backend_.get(), SIGNAL(SongsDiscovered(SongList))); + QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); + + // Add the song + backend_->AddOrUpdateSongs(SongList() << song_); + + // Check the correct signals were emitted + EXPECT_EQ(0, deleted_spy.count()); + ASSERT_EQ(1, added_spy.count()); + + SongList list = *(reinterpret_cast(added_spy[0][0].data())); + ASSERT_EQ(1, list.count()); + EXPECT_EQ(song_.title(), list[0].title()); + EXPECT_EQ(song_.artist(), list[0].artist()); + EXPECT_EQ(song_.album(), list[0].album()); + EXPECT_EQ(1, list[0].id()); + EXPECT_EQ(1, list[0].directory_id()); + } + + Song song_; + +}; + +TEST_F(SingleSong, GetSongWithNoAlbum) { + + song_.set_album(""); + AddDummySong(); if (HasFatalFailure()) return; + + EXPECT_EQ(1, backend_->GetAllArtists().size()); + CollectionBackend::AlbumList albums = backend_->GetAllAlbums(); + //EXPECT_EQ(1, albums.size()); + //EXPECT_EQ("Artist", albums[0].artist); + //EXPECT_EQ("", albums[0].album_name); + +} + +TEST_F(SingleSong, GetAllArtists) { + + AddDummySong(); if (HasFatalFailure()) return; + + QStringList artists = backend_->GetAllArtists(); + ASSERT_EQ(1, artists.size()); + EXPECT_EQ(song_.artist(), artists[0]); + +} + +TEST_F(SingleSong, GetAllAlbums) { + + AddDummySong(); if (HasFatalFailure()) return; + + CollectionBackend::AlbumList albums = backend_->GetAllAlbums(); + ASSERT_EQ(1, albums.size()); + EXPECT_EQ(song_.album(), albums[0].album_name); + EXPECT_EQ(song_.artist(), albums[0].artist); + +} + +TEST_F(SingleSong, GetAlbumsByArtist) { + + AddDummySong(); if (HasFatalFailure()) return; + + CollectionBackend::AlbumList albums = backend_->GetAlbumsByArtist("Artist"); + ASSERT_EQ(1, albums.size()); + EXPECT_EQ(song_.album(), albums[0].album_name); + EXPECT_EQ(song_.artist(), albums[0].artist); + +} + +TEST_F(SingleSong, GetAlbumArt) { + + AddDummySong(); if (HasFatalFailure()) return; + + CollectionBackend::Album album = backend_->GetAlbumArt("Artist", "AlbumArtist", "Album"); + EXPECT_EQ(song_.album(), album.album_name); + EXPECT_EQ(song_.artist(), album.artist); + +} + +TEST_F(SingleSong, GetSongs) { + + AddDummySong(); if (HasFatalFailure()) return; + + SongList songs = backend_->GetSongs("Artist", "Album"); + ASSERT_EQ(1, songs.size()); + EXPECT_EQ(song_.album(), songs[0].album()); + EXPECT_EQ(song_.artist(), songs[0].artist()); + EXPECT_EQ(song_.title(), songs[0].title()); + EXPECT_EQ(1, songs[0].id()); + +} + +TEST_F(SingleSong, GetSongById) { + + AddDummySong(); if (HasFatalFailure()) return; + + Song song = backend_->GetSongById(1); + EXPECT_EQ(song_.album(), song.album()); + EXPECT_EQ(song_.artist(), song.artist()); + EXPECT_EQ(song_.title(), song.title()); + EXPECT_EQ(1, song.id()); + +} + +TEST_F(SingleSong, FindSongsInDirectory) { + + AddDummySong(); if (HasFatalFailure()) return; + + SongList songs = backend_->FindSongsInDirectory(1); + ASSERT_EQ(1, songs.size()); + EXPECT_EQ(song_.album(), songs[0].album()); + EXPECT_EQ(song_.artist(), songs[0].artist()); + EXPECT_EQ(song_.title(), songs[0].title()); + EXPECT_EQ(1, songs[0].id()); + +} + +TEST_F(SingleSong, UpdateSong) { + + AddDummySong(); if (HasFatalFailure()) return; + + Song new_song(song_); + new_song.set_id(1); + new_song.set_title("A different title"); + + QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); + QSignalSpy added_spy(backend_.get(), SIGNAL(SongsDiscovered(SongList))); + + backend_->AddOrUpdateSongs(SongList() << new_song); + + ASSERT_EQ(1, added_spy.size()); + ASSERT_EQ(1, deleted_spy.size()); + + SongList songs_added = *(reinterpret_cast(added_spy[0][0].data())); + SongList songs_deleted = *(reinterpret_cast(deleted_spy[0][0].data())); + ASSERT_EQ(1, songs_added.size()); + ASSERT_EQ(1, songs_deleted.size()); + EXPECT_EQ("Title", songs_deleted[0].title()); + EXPECT_EQ("A different title", songs_added[0].title()); + EXPECT_EQ(1, songs_deleted[0].id()); + EXPECT_EQ(1, songs_added[0].id()); + +} + +TEST_F(SingleSong, DeleteSongs) { + + AddDummySong(); if (HasFatalFailure()) return; + + Song new_song(song_); + new_song.set_id(1); + + QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); + + backend_->DeleteSongs(SongList() << new_song); + + ASSERT_EQ(1, deleted_spy.size()); + + SongList songs_deleted = *(reinterpret_cast(deleted_spy[0][0].data())); + ASSERT_EQ(1, songs_deleted.size()); + EXPECT_EQ("Title", songs_deleted[0].title()); + EXPECT_EQ(1, songs_deleted[0].id()); + + // Check we can't retreive that song any more + Song song = backend_->GetSongById(1); + EXPECT_FALSE(song.is_valid()); + EXPECT_EQ(-1, song.id()); + + // And the artist or album shouldn't show up either + QStringList artists = backend_->GetAllArtists(); + EXPECT_EQ(0, artists.size()); + + CollectionBackend::AlbumList albums = backend_->GetAllAlbums(); + EXPECT_EQ(0, albums.size()); + +} + +TEST_F(SingleSong, MarkSongsUnavailable) { + + AddDummySong(); if (HasFatalFailure()) return; + + Song new_song(song_); + new_song.set_id(1); + + QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); + + backend_->MarkSongsUnavailable(SongList() << new_song); + + ASSERT_EQ(1, deleted_spy.size()); + + SongList songs_deleted = *(reinterpret_cast(deleted_spy[0][0].data())); + ASSERT_EQ(1, songs_deleted.size()); + EXPECT_EQ("Title", songs_deleted[0].title()); + EXPECT_EQ(1, songs_deleted[0].id()); + + // Check the song is marked as deleted. + Song song = backend_->GetSongById(1); + EXPECT_TRUE(song.is_valid()); + EXPECT_TRUE(song.is_unavailable()); + + // And the artist or album shouldn't show up either + QStringList artists = backend_->GetAllArtists(); + EXPECT_EQ(0, artists.size()); + + CollectionBackend::AlbumList albums = backend_->GetAllAlbums(); + EXPECT_EQ(0, albums.size()); + +} + +} // namespace diff --git a/tests/src/collectionmodel_test.cpp b/tests/src/collectionmodel_test.cpp new file mode 100644 index 00000000..4bc104c7 --- /dev/null +++ b/tests/src/collectionmodel_test.cpp @@ -0,0 +1,335 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * Copyright 2019, Jonas Kvinge + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "test_utils.h" + +#include "core/database.h" +#include "collection/collectionmodel.h" +#include "collection/collectionbackend.h" +#include "collection/collection.h" + +namespace { + +class CollectionModelTest : public ::testing::Test { + protected: + void SetUp() { + database_.reset(new MemoryDatabase(nullptr)); + backend_.reset(new CollectionBackend); + backend_->Init(database_.get(), SCollection::kSongsTable, SCollection::kDirsTable, SCollection::kSubdirsTable, SCollection::kFtsTable); + model_.reset(new CollectionModel(backend_.get(), nullptr)); + + added_dir_ = false; + + model_sorted_.reset(new QSortFilterProxyModel); + model_sorted_->setSourceModel(model_.get()); + model_sorted_->setSortRole(CollectionModel::Role_SortText); + model_sorted_->setDynamicSortFilter(true); + model_sorted_->sort(0); + } + + Song AddSong(Song& song) { + song.set_directory_id(1); + if (song.mtime() == -1) song.set_mtime(1); + if (song.ctime() == -1) song.set_ctime(1); + if (song.url().isEmpty()) song.set_url(QUrl("file:///tmp/foo")); + if (song.filesize() == -1) song.set_filesize(1); + + if (!added_dir_) { + backend_->AddDirectory("/tmp"); + added_dir_ = true; + } + + backend_->AddOrUpdateSongs(SongList() << song); + return song; + } + + Song AddSong(const QString& title, const QString& artist, const QString& album, int length) { + Song song; + song.Init(title, artist, album, length); + return AddSong(song); + } + + std::shared_ptr database_; + std::unique_ptr backend_; + std::unique_ptr model_; + std::unique_ptr model_sorted_; + + bool added_dir_; +}; + +TEST_F(CollectionModelTest, Initialisation) { + EXPECT_EQ(0, model_->rowCount(QModelIndex())); +} + +TEST_F(CollectionModelTest, WithInitialArtists) { + + AddSong("Title", "Artist 1", "Album", 123); + AddSong("Title", "Artist 2", "Album", 123); + AddSong("Title", "Foo", "Album", 123); + model_->Init(false); + + ASSERT_EQ(5, model_sorted_->rowCount(QModelIndex())); + EXPECT_EQ("A", model_sorted_->index(0, 0, QModelIndex()).data().toString()); + EXPECT_EQ("Artist 1", model_sorted_->index(1, 0, QModelIndex()).data().toString()); + EXPECT_EQ("Artist 2", model_sorted_->index(2, 0, QModelIndex()).data().toString()); + EXPECT_EQ("F", model_sorted_->index(3, 0, QModelIndex()).data().toString()); + EXPECT_EQ("Foo", model_sorted_->index(4, 0, QModelIndex()).data().toString()); + +} + +TEST_F(CollectionModelTest, CompilationAlbums) { + + Song song; + song.Init("Title", "Artist", "Album", 123); + song.set_compilation(true); + + AddSong(song); + model_->Init(false); + model_->fetchMore(model_->index(0, 0)); + + ASSERT_EQ(1, model_->rowCount(QModelIndex())); + + QModelIndex va_index = model_->index(0, 0, QModelIndex()); + EXPECT_EQ("Various artists", va_index.data().toString()); + EXPECT_TRUE(model_->hasChildren(va_index)); + ASSERT_EQ(model_->rowCount(va_index), 1); + + QModelIndex album_index = model_->index(0, 0, va_index); + EXPECT_EQ(model_->data(album_index).toString(), "Album"); + EXPECT_TRUE(model_->hasChildren(album_index)); + +} + +TEST_F(CollectionModelTest, NumericHeaders) { + + AddSong("Title", "1artist", "Album", 123); + AddSong("Title", "2artist", "Album", 123); + AddSong("Title", "0artist", "Album", 123); + AddSong("Title", "zartist", "Album", 123); + model_->Init(false); + + ASSERT_EQ(6, model_sorted_->rowCount(QModelIndex())); + EXPECT_EQ("0-9", model_sorted_->index(0, 0, QModelIndex()).data().toString()); + EXPECT_EQ("0artist", model_sorted_->index(1, 0, QModelIndex()).data().toString()); + EXPECT_EQ("1artist", model_sorted_->index(2, 0, QModelIndex()).data().toString()); + EXPECT_EQ("2artist", model_sorted_->index(3, 0, QModelIndex()).data().toString()); + EXPECT_EQ("Z", model_sorted_->index(4, 0, QModelIndex()).data().toString()); + EXPECT_EQ("zartist", model_sorted_->index(5, 0, QModelIndex()).data().toString()); + +} + +TEST_F(CollectionModelTest, MixedCaseHeaders) { + + AddSong("Title", "Artist", "Album", 123); + AddSong("Title", "artist", "Album", 123); + model_->Init(false); + + ASSERT_EQ(3, model_sorted_->rowCount(QModelIndex())); + EXPECT_EQ("A", model_sorted_->index(0, 0, QModelIndex()).data().toString()); + EXPECT_EQ("Artist", model_sorted_->index(1, 0, QModelIndex()).data().toString()); + EXPECT_EQ("artist", model_sorted_->index(2, 0, QModelIndex()).data().toString()); + +} + +TEST_F(CollectionModelTest, UnknownArtists) { + + AddSong("Title", "", "Album", 123); + model_->Init(false); + model_->fetchMore(model_->index(0, 0)); + + ASSERT_EQ(1, model_->rowCount(QModelIndex())); + QModelIndex unknown_index = model_->index(0, 0, QModelIndex()); + EXPECT_EQ("Unknown", unknown_index.data().toString()); + + ASSERT_EQ(1, model_->rowCount(unknown_index)); + EXPECT_EQ("Album", model_->index(0, 0, unknown_index).data().toString()); + +} + +TEST_F(CollectionModelTest, UnknownAlbums) { + + AddSong("Title", "Artist", "", 123); + AddSong("Title", "Artist", "Album", 123); + model_->Init(false); + model_->fetchMore(model_->index(0, 0)); + + QModelIndex artist_index = model_->index(0, 0, QModelIndex()); + ASSERT_EQ(2, model_->rowCount(artist_index)); + + QModelIndex unknown_album_index = model_->index(0, 0, artist_index); + QModelIndex real_album_index = model_->index(1, 0, artist_index); + + EXPECT_EQ("Unknown", unknown_album_index.data().toString()); + EXPECT_EQ("Album", real_album_index.data().toString()); + +} + +TEST_F(CollectionModelTest, VariousArtistSongs) { + + SongList songs; + for (int i=0 ; i < 4 ; ++i) { + QString n = QString::number(i+1); + Song song; + song.Init("Title " + n, "Artist " + n, "Album", 0); + songs << song; + } + + // Different ways of putting songs in "Various Artist". Make sure they all work + songs[0].set_compilation_detected(true); + songs[1].set_compilation(true); + songs[2].set_compilation_on(true); + songs[3].set_compilation_detected(true); songs[3].set_artist("Various Artists"); + + for (int i=0 ; i<4 ; ++i) + AddSong(songs[i]); + model_->Init(false); + + QModelIndex artist_index = model_->index(0, 0, QModelIndex()); + model_->fetchMore(artist_index); + ASSERT_EQ(1, model_->rowCount(artist_index)); + + QModelIndex album_index = model_->index(0, 0, artist_index); + model_->fetchMore(album_index); + ASSERT_EQ(4, model_->rowCount(album_index)); + + EXPECT_EQ("Artist 1 - Title 1", model_->index(0, 0, album_index).data().toString()); + EXPECT_EQ("Artist 2 - Title 2", model_->index(1, 0, album_index).data().toString()); + EXPECT_EQ("Artist 3 - Title 3", model_->index(2, 0, album_index).data().toString()); + EXPECT_EQ("Title 4", model_->index(3, 0, album_index).data().toString()); + +} + +TEST_F(CollectionModelTest, RemoveSongsLazyLoaded) { + + Song one = AddSong("Title 1", "Artist", "Album", 123); one.set_id(1); + Song two = AddSong("Title 2", "Artist", "Album", 123); two.set_id(2); + AddSong("Title 3", "Artist", "Album", 123); + model_->Init(false); + + // Lazy load the items + QModelIndex artist_index = model_->index(0, 0, QModelIndex()); + model_->fetchMore(artist_index); + ASSERT_EQ(1, model_->rowCount(artist_index)); + QModelIndex album_index = model_->index(0, 0, artist_index); + model_->fetchMore(album_index); + ASSERT_EQ(3, model_->rowCount(album_index)); + + // Remove the first two songs + QSignalSpy spy_preremove(model_.get(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + QSignalSpy spy_remove(model_.get(), SIGNAL(rowsRemoved(QModelIndex,int,int))); + QSignalSpy spy_reset(model_.get(), SIGNAL(modelReset())); + + backend_->DeleteSongs(SongList() << one << two); + + ASSERT_EQ(2, spy_preremove.count()); + ASSERT_EQ(2, spy_remove.count()); + ASSERT_EQ(0, spy_reset.count()); + + artist_index = model_->index(0, 0, QModelIndex()); + ASSERT_EQ(1, model_->rowCount(artist_index)); + album_index = model_->index(0, 0, artist_index); + ASSERT_EQ(1, model_->rowCount(album_index)); + EXPECT_EQ("Title 3", model_->index(0, 0, album_index).data().toString()); + +} + +TEST_F(CollectionModelTest, RemoveSongsNotLazyLoaded) { + + Song one = AddSong("Title 1", "Artist", "Album", 123); one.set_id(1); + Song two = AddSong("Title 2", "Artist", "Album", 123); two.set_id(2); + model_->Init(false); + + // Remove the first two songs + QSignalSpy spy_preremove(model_.get(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + QSignalSpy spy_remove(model_.get(), SIGNAL(rowsRemoved(QModelIndex,int,int))); + QSignalSpy spy_reset(model_.get(), SIGNAL(modelReset())); + + backend_->DeleteSongs(SongList() << one << two); + + ASSERT_EQ(0, spy_preremove.count()); + ASSERT_EQ(0, spy_remove.count()); + ASSERT_EQ(1, spy_reset.count()); + +} + +TEST_F(CollectionModelTest, RemoveEmptyAlbums) { + + Song one = AddSong("Title 1", "Artist", "Album 1", 123); one.set_id(1); + Song two = AddSong("Title 2", "Artist", "Album 2", 123); two.set_id(2); + Song three = AddSong("Title 3", "Artist", "Album 2", 123); three.set_id(3); + model_->Init(false); + + QModelIndex artist_index = model_->index(0, 0, QModelIndex()); + model_->fetchMore(artist_index); + ASSERT_EQ(2, model_->rowCount(artist_index)); + + // Remove one song from each album + backend_->DeleteSongs(SongList() << one << two); + + // Check the model + artist_index = model_->index(0, 0, QModelIndex()); + model_->fetchMore(artist_index); + ASSERT_EQ(1, model_->rowCount(artist_index)); + QModelIndex album_index = model_->index(0, 0, artist_index); + model_->fetchMore(album_index); + EXPECT_EQ("Album 2", album_index.data().toString()); + + ASSERT_EQ(1, model_->rowCount(album_index)); + EXPECT_EQ("Title 3", model_->index(0, 0, album_index).data().toString()); + +} + +TEST_F(CollectionModelTest, RemoveEmptyArtists) { + + Song one = AddSong("Title", "Artist", "Album", 123); one.set_id(1); + model_->Init(false); + + // Lazy load the items + QModelIndex artist_index = model_->index(0, 0, QModelIndex()); + model_->fetchMore(artist_index); + ASSERT_EQ(1, model_->rowCount(artist_index)); + QModelIndex album_index = model_->index(0, 0, artist_index); + model_->fetchMore(album_index); + ASSERT_EQ(1, model_->rowCount(album_index)); + + // The artist header is there too right? + ASSERT_EQ(2, model_->rowCount(QModelIndex())); + + // Remove the song + backend_->DeleteSongs(SongList() << one); + + // Everything should be gone - even the artist header + ASSERT_EQ(0, model_->rowCount(QModelIndex())); + +} + +} // namespace diff --git a/tests/src/concurrentrun_test.cpp b/tests/src/concurrentrun_test.cpp new file mode 100644 index 00000000..07013f69 --- /dev/null +++ b/tests/src/concurrentrun_test.cpp @@ -0,0 +1,169 @@ +#include + +#include + +#include +#include +#include + +#include "core/concurrentrun.h" +#include "test_utils.h" + +int f() { + return 1337; +} + +TEST(ConcurrentRunTest, ConcurrentRun0StartAndWait) { + + QThreadPool threadpool; + QFuture future = ConcurrentRun::Run(&threadpool, &f); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(1337, watcher.result()); + +} + +int g(int i) { + return ++i; +} + +TEST(ConcurrentRunTest, ConcurrentRun1StartAndWait) { + + QThreadPool threadpool; + int i = 1336; + QFuture future = ConcurrentRun::Run(&threadpool, &g, i); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(1337, watcher.result()); + +} + +int max(int i, int j) { + return (i > j ? i : j); +} + +TEST(ConcurrentRunTest, ConcurrentRun2StartAndWait) { + + int i = 10; + int j = 42; + QThreadPool threadpool; + QFuture future = ConcurrentRun::Run(&threadpool, &max, i, j); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(42, watcher.result()); + +} + +int sum(int a, int b, int c) { + return a + b + c; +} + +TEST(ConcurrentRunTest, ConcurrentRun3StartAndWait) { + + int i = 10; + int j = 42; + int k = 50; + QThreadPool threadpool; + QFuture future = ConcurrentRun::Run(&threadpool, &sum, i, j, k); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(102, watcher.result()); + +} + +void aFunction(int* n) { + *n = 1337; +} + +void bFunction(int* n, int *m) { + aFunction(n); + *m = 1338; +} + +void cFunction(int* n, int *m, int *o) { + bFunction(n, m); + *o = 1339; +} + +TEST(ConcurrentRunTest, ConcurrentRunVoidFunction1Start) { + + QThreadPool threadpool; + + int n = 10; + QFuture future = ConcurrentRun::Run(&threadpool, &aFunction, &n); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(1337, n); + +} + +TEST(ConcurrentRunTest, ConcurrentRunVoidFunction2Start) { + + QThreadPool threadpool; + + int n = 10, m = 11; + QFuture future = ConcurrentRun::Run(&threadpool, &bFunction, &n, &m); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(1337, n); + EXPECT_EQ(1338, m); + +} + +TEST(ConcurrentRunTest, ConcurrentRunVoidFunction3Start) { + + QThreadPool threadpool; + + int n = 10, m = 11, o = 12; + QFuture future = ConcurrentRun::Run(&threadpool, &cFunction, &n, &m, &o); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(1337, n); + EXPECT_EQ(1338, m); + EXPECT_EQ(1339, o); + +} + +class A { + public: + void f(int* i) { + *i = *i + 1; + } +}; + +TEST(ConcurrentRunTest, ConcurrentRunVoidBindFunctionStart) { + + QThreadPool threadpool; + + A a; + int nb = 10; + QFuture future = ConcurrentRun::Run(&threadpool, std::bind(&A::f, &a, &nb)); + QFutureWatcher watcher; + watcher.setFuture(future); + QEventLoop loop; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(11, nb); + +} diff --git a/tests/src/logging_env.h b/tests/src/logging_env.h new file mode 100644 index 00000000..a663f849 --- /dev/null +++ b/tests/src/logging_env.h @@ -0,0 +1,36 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef LOGGING_ENV_H +#define LOGGING_ENV_H + +#include + +#include "core/logging.h" + +class LoggingEnvironment : public ::testing::Environment { +public: + void SetUp() { + logging::Init(); + logging::SetLevels("*:4"); + } +}; + +#endif // LOGGING_ENV_H diff --git a/tests/src/main.cpp b/tests/src/main.cpp new file mode 100644 index 00000000..1b7ff6c0 --- /dev/null +++ b/tests/src/main.cpp @@ -0,0 +1,44 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include + +#include + +#include "logging_env.h" +#include "metatypes_env.h" +#include "resources_env.h" + +int main(int argc, char** argv) { + + testing::InitGoogleMock(&argc, argv); + + testing::AddGlobalTestEnvironment(new MetatypesEnvironment); +#ifdef GUI + QApplication a(argc, argv); +#else + QCoreApplication a(argc, argv); +#endif + testing::AddGlobalTestEnvironment(new ResourcesEnvironment); + testing::AddGlobalTestEnvironment(new LoggingEnvironment); + + return RUN_ALL_TESTS(); + +} diff --git a/tests/src/mergedproxymodel_test.cpp b/tests/src/mergedproxymodel_test.cpp new file mode 100644 index 00000000..fb175ea3 --- /dev/null +++ b/tests/src/mergedproxymodel_test.cpp @@ -0,0 +1,181 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + + +#include "gtest/gtest.h" +#include "test_utils.h" +#include "core/mergedproxymodel.h" + +#include +#include + +class MergedProxyModelTest : public ::testing::Test { + protected: + void SetUp() { + merged_.setSourceModel(&source_); + } + + QStandardItemModel source_; + MergedProxyModel merged_; + +}; + +TEST_F(MergedProxyModelTest, Flat) { + + source_.appendRow(new QStandardItem("one")); + source_.appendRow(new QStandardItem("two")); + + ASSERT_EQ(2, merged_.rowCount(QModelIndex())); + QModelIndex one_i = merged_.index(0, 0, QModelIndex()); + QModelIndex two_i = merged_.index(1, 0, QModelIndex()); + + EXPECT_EQ("one", one_i.data().toString()); + EXPECT_EQ("two", two_i.data().toString()); + EXPECT_FALSE(merged_.parent(one_i).isValid()); + EXPECT_FALSE(merged_.hasChildren(one_i)); + +} + +TEST_F(MergedProxyModelTest, Tree) { + + QStandardItem* one = new QStandardItem("one"); + QStandardItem* two = new QStandardItem("two"); + source_.appendRow(one); + one->appendRow(two); + + ASSERT_EQ(1, merged_.rowCount(QModelIndex())); + QModelIndex one_i = merged_.index(0, 0, QModelIndex()); + + ASSERT_EQ(1, merged_.rowCount(one_i)); + QModelIndex two_i = merged_.index(0, 0, one_i); + + EXPECT_EQ("one", one_i.data().toString()); + EXPECT_EQ("two", two_i.data().toString()); + EXPECT_EQ("one", two_i.parent().data().toString()); + +} + +TEST_F(MergedProxyModelTest, Merged) { + + source_.appendRow(new QStandardItem("one")); + + QStandardItemModel submodel; + submodel.appendRow(new QStandardItem("two")); + + merged_.AddSubModel(source_.index(0, 0, QModelIndex()), &submodel); + + ASSERT_EQ(1, merged_.rowCount(QModelIndex())); + QModelIndex one_i = merged_.index(0, 0, QModelIndex()); + + EXPECT_EQ("one", merged_.data(one_i).toString()); + EXPECT_TRUE(merged_.hasChildren(one_i)); + + ASSERT_EQ(1, merged_.rowCount(one_i)); + QModelIndex two_i = merged_.index(0, 0, one_i); + + EXPECT_EQ("two", merged_.data(two_i).toString()); + EXPECT_EQ(0, merged_.rowCount(two_i)); + EXPECT_FALSE(merged_.hasChildren(two_i)); + +} + +TEST_F(MergedProxyModelTest, SourceInsert) { + + QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); + QSignalSpy after_spy(&merged_, SIGNAL(rowsInserted(QModelIndex,int,int))); + + source_.appendRow(new QStandardItem("one")); + + ASSERT_EQ(1, before_spy.count()); + ASSERT_EQ(1, after_spy.count()); + EXPECT_FALSE(before_spy[0][0].value().isValid()); + EXPECT_EQ(0, before_spy[0][1].toInt()); + EXPECT_EQ(0, before_spy[0][2].toInt()); + EXPECT_FALSE(after_spy[0][0].value().isValid()); + EXPECT_EQ(0, after_spy[0][1].toInt()); + EXPECT_EQ(0, after_spy[0][2].toInt()); + +} + +TEST_F(MergedProxyModelTest, SourceRemove) { + + source_.appendRow(new QStandardItem("one")); + + QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + QSignalSpy after_spy(&merged_, SIGNAL(rowsRemoved(QModelIndex,int,int))); + + source_.removeRow(0, QModelIndex()); + + ASSERT_EQ(1, before_spy.count()); + ASSERT_EQ(1, after_spy.count()); + EXPECT_FALSE(before_spy[0][0].value().isValid()); + EXPECT_EQ(0, before_spy[0][1].toInt()); + EXPECT_EQ(0, before_spy[0][2].toInt()); + EXPECT_FALSE(after_spy[0][0].value().isValid()); + EXPECT_EQ(0, after_spy[0][1].toInt()); + EXPECT_EQ(0, after_spy[0][2].toInt()); + +} + +TEST_F(MergedProxyModelTest, SubInsert) { + + source_.appendRow(new QStandardItem("one")); + QStandardItemModel submodel; + merged_.AddSubModel(source_.index(0, 0, QModelIndex()), &submodel); + + QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); + QSignalSpy after_spy(&merged_, SIGNAL(rowsInserted(QModelIndex,int,int))); + + submodel.appendRow(new QStandardItem("two")); + + ASSERT_EQ(1, before_spy.count()); + ASSERT_EQ(1, after_spy.count()); + EXPECT_EQ("one", before_spy[0][0].value().data()); + EXPECT_EQ(0, before_spy[0][1].toInt()); + EXPECT_EQ(0, before_spy[0][2].toInt()); + EXPECT_EQ("one", after_spy[0][0].value().data()); + EXPECT_EQ(0, after_spy[0][1].toInt()); + EXPECT_EQ(0, after_spy[0][2].toInt()); + +} + +TEST_F(MergedProxyModelTest, SubRemove) { + + source_.appendRow(new QStandardItem("one")); + QStandardItemModel submodel; + merged_.AddSubModel(source_.index(0, 0, QModelIndex()), &submodel); + + submodel.appendRow(new QStandardItem("two")); + + QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + QSignalSpy after_spy(&merged_, SIGNAL(rowsRemoved(QModelIndex,int,int))); + + submodel.removeRow(0, QModelIndex()); + + ASSERT_EQ(1, before_spy.count()); + ASSERT_EQ(1, after_spy.count()); + EXPECT_EQ("one", before_spy[0][0].value().data()); + EXPECT_EQ(0, before_spy[0][1].toInt()); + EXPECT_EQ(0, before_spy[0][2].toInt()); + EXPECT_EQ("one", after_spy[0][0].value().data()); + EXPECT_EQ(0, after_spy[0][1].toInt()); + EXPECT_EQ(0, after_spy[0][2].toInt()); + +} diff --git a/tests/src/metatypes_env.h b/tests/src/metatypes_env.h new file mode 100644 index 00000000..0a7d3219 --- /dev/null +++ b/tests/src/metatypes_env.h @@ -0,0 +1,46 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef METATYPES_ENV_H +#define METATYPES_ENV_H + +#include + +#include +#include + +#include "core/song.h" +#include "core/songloader.h" +#include "collection/directory.h" + +class MetatypesEnvironment : public ::testing::Environment { +public: + void SetUp() { + qRegisterMetaType("Directory"); + qRegisterMetaType("DirectoryList"); + qRegisterMetaType("Subdirectory"); + qRegisterMetaType("SubdirectoryList"); + qRegisterMetaType("SongList"); + qRegisterMetaType("QModelIndex"); + qRegisterMetaType("SongLoader::Result"); + } +}; + +#endif // RESOURCES_ENV_H diff --git a/tests/src/mock_collectionbackend.h b/tests/src/mock_collectionbackend.h new file mode 100644 index 00000000..6fe8a350 --- /dev/null +++ b/tests/src/mock_collectionbackend.h @@ -0,0 +1,72 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef MOCKCOLLECTIONBACKEND_H +#define MOCKCOLLECTIONBACKEND_H + +#include + +#include "collection/collectionbackend.h" + +class MockCollectionBackend : public CollectionBackendInterface { + public: + MOCK_CONST_METHOD0(songs_table, QString()); + + // Get a list of directories in the collection. Emits DirectoriesDiscovered. + MOCK_METHOD0(LoadDirectoriesAsync, void()); + + // Counts the songs in the collection. + MOCK_METHOD0(UpdateTotalSongCountAsync, void()); + MOCK_METHOD0(UpdateTotalAlbumCountAsync, void()); + MOCK_METHOD0(UpdateTotalArtistCountAsync, void()); + + MOCK_METHOD1(FindSongsInDirectory, SongList(int)); + MOCK_METHOD1(SubdirsInDirectory, SubdirectoryList(int)); + MOCK_METHOD0(GetAllDirectories, DirectoryList()); + MOCK_METHOD3(ChangeDirPath, void(int, const QString&, const QString&)); + + MOCK_METHOD1(GetAllArtists, QStringList(const QueryOptions&)); + MOCK_METHOD1(GetAllArtistsWithAlbums, QStringList(const QueryOptions&)); + MOCK_METHOD3(GetSongs, SongList(const QString&, const QString&, const QueryOptions&)); + + MOCK_METHOD2(GetCompilationSongs, SongList(const QString&, const QueryOptions&)); + + MOCK_METHOD1(GetAllAlbums, AlbumList(const QueryOptions&)); + MOCK_METHOD2(GetAlbumsByArtist, AlbumList(const QString&, const QueryOptions&)); + MOCK_METHOD1(GetCompilationAlbums, AlbumList(const QueryOptions&)); + + MOCK_METHOD4(UpdateManualAlbumArtAsync, void(const QString&, const QString&, const QString&, const QString&)); + MOCK_METHOD3(GetAlbumArt, Album(const QString&, const QString&, const QString&)); + + MOCK_METHOD1(GetSongById, Song(int)); + + MOCK_METHOD1(GetSongsByUrl, SongList(const QUrl&)); + MOCK_METHOD2(GetSongByUrl, Song(const QUrl&, qint64)); + + MOCK_METHOD1(AddDirectory, void(const QString&)); + MOCK_METHOD1(RemoveDirectory, void(const Directory&)); + + MOCK_METHOD1(ExecQuery, bool(CollectionQuery*)); + + MOCK_METHOD2(GetSongsByAlbum, SongList(const QString&, const QueryOptions&)); + +}; + +#endif // MOCKCOLLECTIONBACKEND_H diff --git a/tests/src/mock_networkaccessmanager.cpp b/tests/src/mock_networkaccessmanager.cpp new file mode 100644 index 00000000..e8a7e1a7 --- /dev/null +++ b/tests/src/mock_networkaccessmanager.cpp @@ -0,0 +1,137 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include "mock_networkaccessmanager.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using std::min; + +using ::testing::MakeMatcher; +using ::testing::Matcher; +using ::testing::MatcherInterface; +using ::testing::MatchResultListener; +using ::testing::Return; + +class RequestForUrlMatcher : public MatcherInterface { + public: + RequestForUrlMatcher(const QString& contains, const QMap& expected_params) + : contains_(contains), expected_params_(expected_params) {} + + virtual ~RequestForUrlMatcher() {} + + virtual bool Matches(const QNetworkRequest& req) const { + const QUrl& url = req.url(); + + if (!url.toString().contains(contains_)) { + return false; + } + + QUrlQuery url_query(url); + for (QMap::const_iterator it = expected_params_.constBegin(); it != expected_params_.constEnd(); ++it) { + if (!url_query.hasQueryItem(it.key()) || url_query.queryItemValue(it.key()) != it.value()) { + return false; + } + } + return true; + } + + virtual bool MatchAndExplain(const QNetworkRequest& req, MatchResultListener* listener) const { + *listener << "which is " << req.url().toString().toUtf8().constData(); + return Matches(req); + } + + virtual void DescribeTo(::std::ostream* os) const { + *os << "matches url"; + } + + private: + QString contains_; + QMap expected_params_; + +}; + +inline Matcher RequestForUrl(const QString& contains, const QMap& params) { + return MakeMatcher(new RequestForUrlMatcher(contains, params)); +} + +MockNetworkReply* MockNetworkAccessManager::ExpectGet(const QString& contains, const QMap& expected_params, int status, const QByteArray& data) { + + MockNetworkReply* reply = new MockNetworkReply(data); + reply->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, status); + + EXPECT_CALL(*this, createRequest(GetOperation, RequestForUrl(contains, expected_params), nullptr)). WillOnce(Return(reply)); + + return reply; + +} + +MockNetworkReply::MockNetworkReply() + : data_(nullptr) { +} + +MockNetworkReply::MockNetworkReply(const QByteArray& data) + : data_(data), + pos_(0) { +} + +void MockNetworkReply::SetData(const QByteArray& data) { + data_ = data; + pos_ = 0; +} + +qint64 MockNetworkReply::readData(char* data, qint64 size) { + + if (data_.size() == pos_) { + return -1; + } + qint64 bytes_to_read = min(data_.size() - pos_, size); + memcpy(data, data_.constData() + pos_, bytes_to_read); + pos_ += bytes_to_read; + return bytes_to_read; + +} + +qint64 MockNetworkReply::writeData(const char* data, qint64) { + + ADD_FAILURE() << "Something tried to write to a QNetworkReply"; + return -1; + +} + +void MockNetworkReply::Done() { + + setOpenMode(QIODevice::ReadOnly); + emit finished(); + +} + +void MockNetworkReply::setAttribute(QNetworkRequest::Attribute code, const QVariant& value) { + QNetworkReply::setAttribute(code, value); +} diff --git a/tests/src/mock_networkaccessmanager.h b/tests/src/mock_networkaccessmanager.h new file mode 100644 index 00000000..8f2df95e --- /dev/null +++ b/tests/src/mock_networkaccessmanager.h @@ -0,0 +1,74 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef MOCK_NETWORKACCESSMANAGER_H +#define MOCK_NETWORKACCESSMANAGER_H + +#include +#include +#include +#include +#include +#include + +#include "test_utils.h" +#include "gmock/gmock.h" + +// Usage: +// Create a MockNetworkAccessManager. +// Call ExpectGet() with appropriate expectations and the data you want back. +// This will return a MockNetworkReply*. When you are ready for the reply to arrive, call MockNetworkReply::Done(). + +class MockNetworkReply : public QNetworkReply { + Q_OBJECT + public: + MockNetworkReply(); + MockNetworkReply(const QByteArray& data); + + // Use these to set expectations. + void SetData(const QByteArray& data); + virtual void setAttribute(QNetworkRequest::Attribute code, const QVariant& value); + + // Call this when you are ready for the finished() signal. + void Done(); + + protected: + MOCK_METHOD0(abort, void()); + virtual qint64 readData(char* data, qint64); + virtual qint64 writeData(const char* data, qint64); + + QByteArray data_; + qint64 pos_; +}; + + +class MockNetworkAccessManager : public QNetworkAccessManager { + Q_OBJECT + public: + MockNetworkReply* ExpectGet( + const QString& contains, // A string that should be present in the URL. + const QMap& params, // Required URL parameters. + int status, // Returned HTTP status code. + const QByteArray& ret_data); // Returned data. + protected: + MOCK_METHOD3(createRequest, QNetworkReply*(Operation, const QNetworkRequest&, QIODevice*)); +}; + +#endif // MOCK_NETWORKACCESSMANAGER_H diff --git a/tests/src/mock_playlistitem.cpp b/tests/src/mock_playlistitem.cpp new file mode 100644 index 00000000..c7c3b16a --- /dev/null +++ b/tests/src/mock_playlistitem.cpp @@ -0,0 +1,28 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include "core/song.h" + +#include "mock_playlistitem.h" + +using ::testing::_; +using ::testing::Return; + +MockPlaylistItem::MockPlaylistItem() : PlaylistItem(Song::Source_LocalFile) {} diff --git a/tests/src/mock_playlistitem.h b/tests/src/mock_playlistitem.h new file mode 100644 index 00000000..5cc1ab57 --- /dev/null +++ b/tests/src/mock_playlistitem.h @@ -0,0 +1,50 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef MOCK_PLAYLISTITEM_H +#define MOCK_PLAYLISTITEM_H + +#include + +#include +#include + +#include "core/song.h" +#include "core/settingsprovider.h" +#include "collection/sqlrow.h" +#include "playlist/playlistitem.h" + +class MockPlaylistItem : public PlaylistItem { + + public: + + MockPlaylistItem(); + MOCK_CONST_METHOD0(options, Options()); + MOCK_METHOD1(InitFromQuery, bool(const SqlRow& settings)); + MOCK_METHOD0(Reload, void()); + MOCK_CONST_METHOD0(Metadata, Song()); + MOCK_CONST_METHOD0(Url, QUrl()); + MOCK_METHOD1(SetTemporaryMetadata, void(const Song& metadata)); + MOCK_METHOD0(ClearTemporaryMetadata, void()); + MOCK_METHOD1(DatabaseValue, QVariant(DatabaseColumn)); + +}; + +#endif // MOCK_PLAYLISTITEM_H diff --git a/tests/src/mock_settingsprovider.h b/tests/src/mock_settingsprovider.h new file mode 100644 index 00000000..5ca4c53e --- /dev/null +++ b/tests/src/mock_settingsprovider.h @@ -0,0 +1,54 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef MOCK_SETTINGSPROVIDER_H +#define MOCK_SETTINGSPROVIDER_H + +#include "core/settingsprovider.h" + +#include + +class MockSettingsProvider : public SettingsProvider { + public: + MOCK_METHOD1(set_group, void(const char* group)); + MOCK_CONST_METHOD2(value, QVariant(const QString& key, const QVariant& default_value)); + MOCK_METHOD2(setValue, void(const QString& key, const QVariant& value)); + MOCK_METHOD1(beginReadArray, int(const QString& prefix)); + MOCK_METHOD2(beginWriteArray, void(const QString& prefix, int size)); + MOCK_METHOD1(setArrayIndex, void(int i)); + MOCK_METHOD0(endArray, void()); +}; + +class DummySettingsProvider : public SettingsProvider { + public: + DummySettingsProvider() {} + + void set_group(const char *group) {} + + QVariant value(const QString&, const QVariant& = QVariant()) const { return QVariant(); } + void setValue(const QString&, const QVariant&) {} + int beginReadArray(const QString&) { return 0; } + void beginWriteArray(const QString&, int = -1) {} + void setArrayIndex(int) {} + void endArray() {} + +}; + +#endif // MOCK_SETTINGSPROVIDER_H diff --git a/tests/src/organiseformat_test.cpp b/tests/src/organiseformat_test.cpp new file mode 100644 index 00000000..04f2b9b3 --- /dev/null +++ b/tests/src/organiseformat_test.cpp @@ -0,0 +1,173 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * Copyright 2019, Jonas Kvinge + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include +#include "test_utils.h" + +#include "organise/organiseformat.h" +#include "core/timeconstants.h" +#include "core/song.h" +#include "core/logging.h" + +#include + +class OrganiseFormatTest : public ::testing::Test { +protected: + OrganiseFormat format_; + Song song_; +}; + + +TEST_F(OrganiseFormatTest, BasicReplace) { + + song_.set_title("title"); + song_.set_album("album"); + song_.set_artist("artist"); + song_.set_albumartist("albumartist"); + song_.set_track(321); + song_.set_disc(789); + song_.set_year(2010); + song_.set_originalyear(1995); + song_.set_genre("genre"); + song_.set_composer("composer"); + song_.set_performer("performer"); + song_.set_grouping("grouping"); + song_.set_comment("comment"); + song_.set_length_nanosec(987 * kNsecPerSec); + song_.set_samplerate(654); + song_.set_bitdepth(32); + song_.set_bitrate(123); + + format_.set_format("%album %albumartist %artist %bitrate %comment %composer %performer %grouping %disc %genre %length %samplerate %bitdepth %title %track %year"); + + ASSERT_TRUE(format_.IsValid()); + EXPECT_EQ("album_albumartist_artist_123_comment_composer_performer_grouping_789_genre_987_654_32_title_321_2010", format_.GetFilenameForSong(song_)); + +} + +TEST_F(OrganiseFormatTest, Extension) { + + song_.set_url(QUrl("file:///some/path/filename.flac")); + + format_.set_format("%extension"); + ASSERT_TRUE(format_.IsValid()); + EXPECT_EQ("flac", format_.GetFilenameForSong(song_)); + +} + +TEST_F(OrganiseFormatTest, ArtistInitial) { + + song_.set_artist("bob"); + + format_.set_format("%artistinitial"); + ASSERT_TRUE(format_.IsValid()); + EXPECT_EQ("B", format_.GetFilenameForSong(song_)); + +} + +TEST_F(OrganiseFormatTest, AlbumArtistInitial) { + + song_.set_albumartist("bob"); + + format_.set_format("%artistinitial"); + ASSERT_TRUE(format_.IsValid()); + EXPECT_EQ("B", format_.GetFilenameForSong(song_)); + +} + +TEST_F(OrganiseFormatTest, InvalidTag) { + + format_.set_format("%invalid"); + EXPECT_FALSE(format_.IsValid()); + +} + +TEST_F(OrganiseFormatTest, Blocks) { + + format_.set_format("Before{Inside%year}After"); + ASSERT_TRUE(format_.IsValid()); + + song_.set_year(-1); + EXPECT_EQ("BeforeAfter", format_.GetFilenameForSong(song_)); + + song_.set_year(0); + EXPECT_EQ("BeforeAfter", format_.GetFilenameForSong(song_)); + + song_.set_year(123); + EXPECT_EQ("BeforeInside123After", format_.GetFilenameForSong(song_)); + +} + +TEST_F(OrganiseFormatTest, ReplaceSpaces) { + + song_.set_title("The Song Title"); + format_.set_format("The Format String %title"); + + format_.set_replace_spaces(false); + EXPECT_EQ("The Format String The Song Title", format_.GetFilenameForSong(song_)); + format_.set_replace_spaces(true); + EXPECT_EQ("The_Format_String_The_Song_Title", format_.GetFilenameForSong(song_)); + +} + +TEST_F(OrganiseFormatTest, ReplaceNonAscii) { + + song_.set_artist(QString::fromUtf8("Röyksopp")); + format_.set_format("%artist"); + + format_.set_remove_non_ascii(false); + EXPECT_EQ(QString::fromUtf8("Röyksopp"), format_.GetFilenameForSong(song_)); + format_.set_remove_non_ascii(true); + EXPECT_EQ("Royksopp", format_.GetFilenameForSong(song_)); + + song_.set_artist(QString::fromUtf8("Владимир Высоцкий")); + EXPECT_EQ("_________________", format_.GetFilenameForSong(song_)); + +} + +TEST_F(OrganiseFormatTest, TrackNumberPadding) { + + format_.set_format("%track"); + + song_.set_track(9); + EXPECT_EQ("09", format_.GetFilenameForSong(song_)); + + song_.set_track(99); + EXPECT_EQ("99", format_.GetFilenameForSong(song_)); + + song_.set_track(999); + EXPECT_EQ("999", format_.GetFilenameForSong(song_)); + + song_.set_track(0); + EXPECT_EQ("", format_.GetFilenameForSong(song_)); + +} + +#if 0 +TEST_F(OrganiseFormatTest, ReplaceSlashes) { + + format_.set_format("%title"); + song_.set_title("foo/bar\\baz"); + qLog(Debug) << format_.GetFilenameForSong(song_); + EXPECT_EQ("foo_bar_baz", format_.GetFilenameForSong(song_)); + +} +#endif diff --git a/tests/src/playlist_test.cpp b/tests/src/playlist_test.cpp new file mode 100644 index 00000000..df3334f4 --- /dev/null +++ b/tests/src/playlist_test.cpp @@ -0,0 +1,543 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * Copyright 2019, Jonas Kvinge + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include + +#include + +#include "test_utils.h" + +#include "collection/collectionplaylistitem.h" +#include "playlist/playlist.h" +#include "mock_settingsprovider.h" +#include "mock_playlistitem.h" + +#include +#include + +using std::shared_ptr; +using ::testing::Return; + +namespace { + +class PlaylistTest : public ::testing::Test { + protected: + PlaylistTest() + : playlist_(nullptr, nullptr, nullptr, 1), + sequence_(nullptr, new DummySettingsProvider) + { + } + + void SetUp() { + playlist_.set_sequence(&sequence_); + } + + MockPlaylistItem* MakeMockItem(const QString& title, const QString& artist = QString(), const QString& album = QString(), int length = 123) const { + Song metadata; + metadata.Init(title, artist, album, length); + + MockPlaylistItem* ret = new MockPlaylistItem; + EXPECT_CALL(*ret, Metadata()).WillRepeatedly(Return(metadata)); + + return ret; + } + + shared_ptr MakeMockItemP(const QString& title, const QString& artist = QString(), const QString& album = QString(), int length = 123) const { + return shared_ptr(MakeMockItem(title, artist, album, length)); + } + + Playlist playlist_; + PlaylistSequence sequence_; + +}; + +TEST_F(PlaylistTest, Basic) { + EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); +} + +TEST_F(PlaylistTest, InsertItems) { + + MockPlaylistItem* item = MakeMockItem("Title", "Artist", "Album", 123); + shared_ptr item_ptr(item); + + // Insert the item + EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); + playlist_.InsertItems(PlaylistItemList() << item_ptr, -1); + ASSERT_EQ(1, playlist_.rowCount(QModelIndex())); + + // Get the metadata + EXPECT_EQ("Title", playlist_.data(playlist_.index(0, Playlist::Column_Title))); + EXPECT_EQ("Artist", playlist_.data(playlist_.index(0, Playlist::Column_Artist))); + EXPECT_EQ("Album", playlist_.data(playlist_.index(0, Playlist::Column_Album))); + EXPECT_EQ(123, playlist_.data(playlist_.index(0, Playlist::Column_Length))); + +} + +TEST_F(PlaylistTest, Indexes) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + // Start "playing" track 1 + playlist_.set_current_row(0); + EXPECT_EQ(0, playlist_.current_row()); + EXPECT_EQ("One", playlist_.current_item()->Metadata().title()); + EXPECT_EQ(-1, playlist_.previous_row()); + EXPECT_EQ(1, playlist_.next_row()); + + // Stop playing + EXPECT_EQ(0, playlist_.last_played_row()); + playlist_.set_current_row(-1); + EXPECT_EQ(0, playlist_.last_played_row()); + EXPECT_EQ(-1, playlist_.current_row()); + + // Play track 2 + playlist_.set_current_row(1); + EXPECT_EQ(1, playlist_.current_row()); + EXPECT_EQ("Two", playlist_.current_item()->Metadata().title()); + EXPECT_EQ(0, playlist_.previous_row()); + EXPECT_EQ(2, playlist_.next_row()); + + // Play track 3 + playlist_.set_current_row(2); + EXPECT_EQ(2, playlist_.current_row()); + EXPECT_EQ("Three", playlist_.current_item()->Metadata().title()); + EXPECT_EQ(1, playlist_.previous_row()); + EXPECT_EQ(-1, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, RepeatPlaylist) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + playlist_.sequence()->SetRepeatMode(PlaylistSequence::Repeat_Playlist); + + playlist_.set_current_row(0); + EXPECT_EQ(1, playlist_.next_row()); + + playlist_.set_current_row(1); + EXPECT_EQ(2, playlist_.next_row()); + + playlist_.set_current_row(2); + EXPECT_EQ(0, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, RepeatTrack) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + playlist_.sequence()->SetRepeatMode(PlaylistSequence::Repeat_Track); + + playlist_.set_current_row(0); + EXPECT_EQ(0, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, RepeatAlbum) { + + playlist_.InsertItems(PlaylistItemList() + << MakeMockItemP("One", "Album one") + << MakeMockItemP("Two", "Album two") + << MakeMockItemP("Three", "Album one")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + playlist_.sequence()->SetRepeatMode(PlaylistSequence::Repeat_Album); + + playlist_.set_current_row(0); + EXPECT_EQ(2, playlist_.next_row()); + + playlist_.set_current_row(2); + EXPECT_EQ(0, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, RemoveBeforeCurrent) { + + playlist_.InsertItems(PlaylistItemList() + << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + // Remove a row before the currently playing track + playlist_.set_current_row(2); + EXPECT_EQ(2, playlist_.current_row()); + playlist_.removeRow(1, QModelIndex()); + EXPECT_EQ(1, playlist_.current_row()); + EXPECT_EQ(1, playlist_.last_played_row()); + EXPECT_EQ(0, playlist_.previous_row()); + EXPECT_EQ(-1, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, RemoveAfterCurrent) { + + playlist_.InsertItems(PlaylistItemList() + << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + // Remove a row after the currently playing track + playlist_.set_current_row(0); + EXPECT_EQ(0, playlist_.current_row()); + playlist_.removeRow(1, QModelIndex()); + EXPECT_EQ(0, playlist_.current_row()); + EXPECT_EQ(0, playlist_.last_played_row()); + EXPECT_EQ(-1, playlist_.previous_row()); + EXPECT_EQ(1, playlist_.next_row()); + + playlist_.set_current_row(1); + EXPECT_EQ(-1, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, RemoveCurrent) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + // Remove the currently playing track's row + playlist_.set_current_row(1); + EXPECT_EQ(1, playlist_.current_row()); + playlist_.removeRow(1, QModelIndex()); + EXPECT_EQ(-1, playlist_.current_row()); + EXPECT_EQ(-1, playlist_.last_played_row()); + EXPECT_EQ(-1, playlist_.previous_row()); + EXPECT_EQ(0, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, InsertBeforeCurrent) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + playlist_.set_current_row(1); + EXPECT_EQ(1, playlist_.current_row()); + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Four"), 0); + ASSERT_EQ(4, playlist_.rowCount(QModelIndex())); + + EXPECT_EQ(2, playlist_.current_row()); + EXPECT_EQ(2, playlist_.last_played_row()); + EXPECT_EQ(1, playlist_.previous_row()); + EXPECT_EQ(3, playlist_.next_row()); + + EXPECT_EQ("Four", playlist_.data(playlist_.index(0, Playlist::Column_Title))); + EXPECT_EQ("One", playlist_.data(playlist_.index(1, Playlist::Column_Title))); + +} + +TEST_F(PlaylistTest, InsertAfterCurrent) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + playlist_.set_current_row(1); + EXPECT_EQ(1, playlist_.current_row()); + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Four"), 2); + ASSERT_EQ(4, playlist_.rowCount(QModelIndex())); + + EXPECT_EQ(1, playlist_.current_row()); + EXPECT_EQ(1, playlist_.last_played_row()); + EXPECT_EQ(0, playlist_.previous_row()); + EXPECT_EQ(2, playlist_.next_row()); + + EXPECT_EQ("Two", playlist_.data(playlist_.index(1, Playlist::Column_Title))); + EXPECT_EQ("Four", playlist_.data(playlist_.index(2, Playlist::Column_Title))); + EXPECT_EQ("Three", playlist_.data(playlist_.index(3, Playlist::Column_Title))); + +} + +TEST_F(PlaylistTest, Clear) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + playlist_.set_current_row(1); + EXPECT_EQ(1, playlist_.current_row()); + playlist_.Clear(); + + EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); + EXPECT_EQ(-1, playlist_.current_row()); + EXPECT_EQ(-1, playlist_.last_played_row()); + EXPECT_EQ(-1, playlist_.previous_row()); + EXPECT_EQ(-1, playlist_.next_row()); + +} + +TEST_F(PlaylistTest, UndoAdd) { + + EXPECT_FALSE(playlist_.undo_stack()->canUndo()); + EXPECT_FALSE(playlist_.undo_stack()->canRedo()); + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); + EXPECT_EQ(1, playlist_.rowCount(QModelIndex())); + EXPECT_FALSE(playlist_.undo_stack()->canRedo()); + ASSERT_TRUE(playlist_.undo_stack()->canUndo()); + + playlist_.undo_stack()->undo(); + EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); + EXPECT_FALSE(playlist_.undo_stack()->canUndo()); + ASSERT_TRUE(playlist_.undo_stack()->canRedo()); + + playlist_.undo_stack()->redo(); + EXPECT_EQ(1, playlist_.rowCount(QModelIndex())); + EXPECT_FALSE(playlist_.undo_stack()->canRedo()); + EXPECT_TRUE(playlist_.undo_stack()->canUndo()); + + EXPECT_EQ("Title", playlist_.data(playlist_.index(0, Playlist::Column_Title))); + +} + +TEST_F(PlaylistTest, UndoMultiAdd) { + + // Add 1 item + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One")); + + // Add 2 items + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Two") << MakeMockItemP("Three")); + + // Undo adding 2 items + ASSERT_TRUE(playlist_.undo_stack()->canUndo()); + EXPECT_EQ("add 2 songs", playlist_.undo_stack()->undoText()); + playlist_.undo_stack()->undo(); + + // Undo adding 1 item + ASSERT_TRUE(playlist_.undo_stack()->canUndo()); + EXPECT_EQ("add 1 songs", playlist_.undo_stack()->undoText()); + playlist_.undo_stack()->undo(); + + EXPECT_FALSE(playlist_.undo_stack()->canUndo()); + +} + +#if 0 +TEST_F(PlaylistTest, UndoRemove) { + + EXPECT_FALSE(playlist_.undo_stack()->canUndo()); + EXPECT_FALSE(playlist_.undo_stack()->canRedo()); + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); + playlist_.removeRow(0); + + EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); + EXPECT_FALSE(playlist_.undo_stack()->canRedo()); + ASSERT_TRUE(playlist_.undo_stack()->canUndo()); + + playlist_.undo_stack()->undo(); + //EXPECT_EQ(1, playlist_.rowCount(QModelIndex())); + //ASSERT_TRUE(playlist_.undo_stack()->canRedo()); + + //EXPECT_EQ("Title", playlist_.data(playlist_.index(0, Playlist::Column_Title))); + + //playlist_.undo_stack()->redo(); + //EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); + //EXPECT_FALSE(playlist_.undo_stack()->canRedo()); + //EXPECT_TRUE(playlist_.undo_stack()->canUndo()); + +} + +TEST_F(PlaylistTest, UndoMultiRemove) { + + // Add 3 items + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + // Remove 1 item + playlist_.removeRow(1); // Item "Two" + + // Remove 2 items + playlist_.removeRows(0, 2); // "One" and "Three" + + ASSERT_EQ(0, playlist_.rowCount(QModelIndex())); + + // Undo removing all 3 items + ASSERT_TRUE(playlist_.undo_stack()->canUndo()); + EXPECT_EQ("remove 3 songs", playlist_.undo_stack()->undoText()); + playlist_.undo_stack()->undo(); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); +} +#endif + +TEST_F(PlaylistTest, UndoClear) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + + playlist_.Clear(); + ASSERT_EQ(0, playlist_.rowCount(QModelIndex())); + ASSERT_TRUE(playlist_.undo_stack()->canUndo()); + EXPECT_EQ("remove 3 songs", playlist_.undo_stack()->undoText()); + playlist_.undo_stack()->undo(); + + ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); + +} + +#if 0 +TEST_F(PlaylistTest, UndoRemoveCurrent) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); + playlist_.set_current_row(0); + EXPECT_EQ(0, playlist_.current_row()); + EXPECT_EQ(0, playlist_.last_played_row()); + + playlist_.removeRow(0); + EXPECT_EQ(-1, playlist_.current_row()); + EXPECT_EQ(-1, playlist_.last_played_row()); + + playlist_.undo_stack()->undo(); + EXPECT_EQ(0, playlist_.current_row()); + EXPECT_EQ(0, playlist_.last_played_row()); + +} + +TEST_F(PlaylistTest, UndoRemoveOldCurrent) { + + playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); + playlist_.set_current_row(0); + EXPECT_EQ(0, playlist_.current_row()); + EXPECT_EQ(0, playlist_.last_played_row()); + + playlist_.removeRow(0); + EXPECT_EQ(-1, playlist_.current_row()); + EXPECT_EQ(-1, playlist_.last_played_row()); + + playlist_.set_current_row(-1); + + playlist_.undo_stack()->undo(); + EXPECT_EQ(0, playlist_.current_row()); + EXPECT_EQ(0, playlist_.last_played_row()); + +} + +TEST_F(PlaylistTest, ShuffleThenNext) { + + // Add 100 items + PlaylistItemList items; + for (int i=0 ; i<100 ; ++i) + items << MakeMockItemP("Item " + QString::number(i)); + playlist_.InsertItems(items); + + playlist_.set_current_row(0); + + // Shuffle until the current index is not at the end + forever { + playlist_.Shuffle(); + if (playlist_.current_row() != items.count()-1) + break; + } + + int index = playlist_.current_row(); + EXPECT_EQ("Item 0", playlist_.current_item()->Metadata().title()); + EXPECT_EQ("Item 0", playlist_.data(playlist_.index(index, Playlist::Column_Title))); + EXPECT_EQ(index, playlist_.last_played_row()); + EXPECT_EQ(index + 1, playlist_.next_row()); + + // Shuffle until the current index *is* at the end + forever { + playlist_.Shuffle(); + if (playlist_.current_row() == items.count()-1) + break; + } + + index = playlist_.current_row(); + EXPECT_EQ("Item 0", playlist_.current_item()->Metadata().title()); + EXPECT_EQ("Item 0", playlist_.data(playlist_.index(index, Playlist::Column_Title))); + EXPECT_EQ(index, playlist_.last_played_row()); + EXPECT_EQ(-1, playlist_.next_row()); + EXPECT_EQ(index-1, playlist_.previous_row()); + +} +#endif + +TEST_F(PlaylistTest, CollectionIdMapSingle) { + + Song song; + song.Init("title", "artist", "album", 123); + song.set_id(1); + + PlaylistItemPtr item(new CollectionPlaylistItem(song)); + playlist_.InsertItems(PlaylistItemList() << item); + + EXPECT_EQ(0, playlist_.collection_items_by_id(-1).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(0).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(2).count()); + ASSERT_EQ(1, playlist_.collection_items_by_id(1).count()); + EXPECT_EQ(song.title(), playlist_.collection_items_by_id(1)[0]->Metadata().title()); + + playlist_.Clear(); + + EXPECT_EQ(0, playlist_.collection_items_by_id(1).count()); + +} + +TEST_F(PlaylistTest, CollectionIdMapInvalid) { + + Song invalid; + invalid.Init("title", "artist", "album", 123); + ASSERT_EQ(-1, invalid.id()); + + PlaylistItemPtr item(new CollectionPlaylistItem(invalid)); + playlist_.InsertItems(PlaylistItemList() << item); + + EXPECT_EQ(0, playlist_.collection_items_by_id(-1).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(0).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(1).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(2).count()); + +} + +TEST_F(PlaylistTest, CollectionIdMapMulti) { + + Song one; + one.Init("title", "artist", "album", 123); + one.set_id(1); + + Song two; + two.Init("title 2", "artist 2", "album 2", 123); + two.set_id(2); + + PlaylistItemPtr item_one(new CollectionPlaylistItem(one)); + PlaylistItemPtr item_two(new CollectionPlaylistItem(two)); + PlaylistItemPtr item_three(new CollectionPlaylistItem(one)); + playlist_.InsertItems(PlaylistItemList() << item_one << item_two << item_three); + + EXPECT_EQ(2, playlist_.collection_items_by_id(1).count()); + EXPECT_EQ(1, playlist_.collection_items_by_id(2).count()); + + playlist_.removeRow(1); // item_two + EXPECT_EQ(2, playlist_.collection_items_by_id(1).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(2).count()); + + playlist_.removeRow(1); // item_three + EXPECT_EQ(1, playlist_.collection_items_by_id(1).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(2).count()); + + playlist_.removeRow(0); // item_one + EXPECT_EQ(0, playlist_.collection_items_by_id(1).count()); + EXPECT_EQ(0, playlist_.collection_items_by_id(2).count()); + +} + + +} // namespace diff --git a/tests/src/resources_env.h b/tests/src/resources_env.h new file mode 100644 index 00000000..ccfaef02 --- /dev/null +++ b/tests/src/resources_env.h @@ -0,0 +1,37 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef RESOURCES_ENV_H +#define RESOURCES_ENV_H + +#include + +#include + +class ResourcesEnvironment : public ::testing::Environment { +public: + void SetUp() { + Q_INIT_RESOURCE(data); + Q_INIT_RESOURCE(translations); + Q_INIT_RESOURCE(testdata); + } +}; + +#endif // RESOURCES_ENV_H diff --git a/tests/src/song_test.cpp b/tests/src/song_test.cpp new file mode 100644 index 00000000..579e7034 --- /dev/null +++ b/tests/src/song_test.cpp @@ -0,0 +1,147 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * Copyright 2019, Jonas Kvinge + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include "config.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "core/song.h" + +#include "tagreader.h" +#include "test_utils.h" + +namespace { + +class SongTest : public ::testing::Test { + protected: + static void SetUpTestCase() { + // Return something from uninteresting mock functions. + testing::DefaultValue::Set("foobarbaz"); + } + + static Song ReadSongFromFile(const QString& filename) { + TagReader tag_reader; + Song song; + ::pb::tagreader::SongMetadata pb_song; + + // We need to init protobuf object from a Song object, to have default values initialized correctly. + song.ToProtobuf(&pb_song); + tag_reader.ReadFile(filename, &pb_song); + song.InitFromProtobuf(pb_song); + return song; + } + + static void WriteSongToFile(const Song& song, const QString& filename) { + TagReader tag_reader; + ::pb::tagreader::SongMetadata pb_song; + song.ToProtobuf(&pb_song); + tag_reader.SaveFile(filename, pb_song); + } + +}; + +TEST_F(SongTest, TestAudioFileTagging) { + + const QStringList files_to_test = QStringList() << ":/audio/strawberry.wav" + << ":/audio/strawberry.flac" + << ":/audio/strawberry.wv" + << ":/audio/strawberry.oga" + << ":/audio/strawberry.opus" + << ":/audio/strawberry.spx" + << ":/audio/strawberry.aif" + << ":/audio/strawberry.m4a" + << ":/audio/strawberry.mp4" + << ":/audio/strawberry.mp3" + << ":/audio/strawberry.asf"; + + for (const QString& test_filename : files_to_test) { + + TemporaryResource r(test_filename); + Song song = ReadSongFromFile(r.fileName()); + + // Compare files + QFile orig_file(test_filename); + orig_file.open(QIODevice::ReadOnly); + EXPECT_TRUE(orig_file.isOpen()); + QByteArray orig_file_data = orig_file.readAll(); + + QFile temp_file(r.fileName()); + temp_file.open(QIODevice::ReadOnly); + EXPECT_TRUE(temp_file.isOpen()); + QByteArray temp_file_data = temp_file.readAll(); + + EXPECT_TRUE(!orig_file_data.isEmpty()); + EXPECT_TRUE(!temp_file_data.isEmpty()); + EXPECT_TRUE(orig_file_data == temp_file_data); + + if (test_filename.contains(QRegExp(".*\\.wav$"))) continue; + + // Write tags + song.set_title("strawberry title"); + song.set_artist("strawberry artist"); + song.set_album("strawberry album"); + song.set_albumartist("strawberry album artist"); + song.set_composer("strawberry composer"); + song.set_performer("strawberry performer"); + song.set_grouping("strawberry grouping"); + song.set_genre("strawberry genre"); + song.set_comment("strawberry comment"); + song.set_track(12); + song.set_disc(1234); + song.set_year(2019); + WriteSongToFile(song, r.fileName()); + + // Read tags + Song new_song = ReadSongFromFile(r.fileName()); + EXPECT_EQ("strawberry title", new_song.title()); + EXPECT_EQ("strawberry artist", new_song.artist()); + EXPECT_EQ("strawberry album", new_song.album()); + if (!test_filename.contains(QRegExp(".*\\.aif$")) && !test_filename.contains(QRegExp(".*\\.asf$"))) { + EXPECT_EQ("strawberry album artist", new_song.albumartist()); + EXPECT_EQ("strawberry composer", new_song.composer()); + if (!test_filename.contains(QRegExp(".*\\.mp4$")) && !test_filename.contains(QRegExp(".*\\.m4a$"))) { + EXPECT_EQ("strawberry performer", new_song.performer()); + } + EXPECT_EQ("strawberry grouping", new_song.grouping()); + EXPECT_EQ(1234, new_song.disc()); + } + EXPECT_EQ("strawberry genre", new_song.genre()); + if (!test_filename.contains(QRegExp(".*\\.asf$"))) { + EXPECT_EQ("strawberry comment", new_song.comment()); + } + EXPECT_EQ(12, new_song.track()); + EXPECT_EQ(2019, new_song.year()); + + } + +} + +} // namespace diff --git a/tests/src/songplaylistitem_test.cpp b/tests/src/songplaylistitem_test.cpp new file mode 100644 index 00000000..ce96cd17 --- /dev/null +++ b/tests/src/songplaylistitem_test.cpp @@ -0,0 +1,79 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include + +#include + +#include +#include +#include +#include +#include + +#include "test_utils.h" + +#include "playlist/songplaylistitem.h" + +namespace { + +class SongPlaylistItemTest : public ::testing::TestWithParam { + protected: + SongPlaylistItemTest() : temp_file_(GetParam()) {} + + void SetUp() { + // SongPlaylistItem::Url() checks if the file exists, so we need a real file + temp_file_.open(); + + absolute_file_name_ = QFileInfo(temp_file_.fileName()).absoluteFilePath(); + + song_.Init("Title", "Artist", "Album", 123); + song_.set_url(QUrl::fromLocalFile(absolute_file_name_)); + + item_.reset(new SongPlaylistItem(song_)); + + if (!absolute_file_name_.startsWith('/')) + absolute_file_name_.prepend('/'); + } + + Song song_; + QTemporaryFile temp_file_; + QString absolute_file_name_; + std::unique_ptr item_; +}; + +INSTANTIATE_TEST_CASE_P(RealFiles, SongPlaylistItemTest, testing::Values( + "normalfile.flac", + "file with spaces.flac", + "file with # hash.flac", + "file with ? question.flac" +)); + +TEST_P(SongPlaylistItemTest, Url) { + QUrl expected; + expected.setScheme("file"); + expected.setPath(absolute_file_name_); + + EXPECT_EQ(expected, item_->Url()); +} + + +} //namespace + diff --git a/tests/src/sqlite_test.cpp b/tests/src/sqlite_test.cpp new file mode 100644 index 00000000..647da236 --- /dev/null +++ b/tests/src/sqlite_test.cpp @@ -0,0 +1,16 @@ +#include +#include + +TEST(SqliteTest, FTS3SupportEnabled) { + + sqlite3* db = nullptr; + int rc = sqlite3_open(":memory:", &db); + ASSERT_EQ(0, rc); + + char* errmsg = nullptr; + rc = sqlite3_exec(db, "CREATE VIRTUAL TABLE foo USING fts3(content, TEXT)", nullptr, nullptr, &errmsg); + ASSERT_EQ(0, rc) << errmsg; + + sqlite3_close(db); + +} diff --git a/tests/src/test_utils.cpp b/tests/src/test_utils.cpp new file mode 100644 index 00000000..560d659a --- /dev/null +++ b/tests/src/test_utils.cpp @@ -0,0 +1,87 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include "test_utils.h" + +#include +#include +#include +#include +#include +#include +#include + +std::ostream& operator<<(std::ostream& stream, const QString& str) { + stream << str.toStdString(); + return stream; +} + +std::ostream& operator <<(std::ostream& stream, const QUrl& url) { + stream << url.toString().toStdString(); + return stream; +} + +std::ostream& operator <<(std::ostream& stream, const QNetworkRequest& req) { + stream << req.url().toString().toStdString(); + return stream; +} + +std::ostream& operator <<(std::ostream& stream, const QVariant& var) { + stream << var.toString().toStdString(); + return stream; +} + +void PrintTo(const ::QString& str, std::ostream& os) { + os << str.toStdString(); +} + +void PrintTo(const ::QVariant& var, std::ostream& os) { + os << var.toString().toStdString(); +} + +void PrintTo(const ::QUrl& url, std::ostream& os) { + os << url.toString().toStdString(); +} + +TemporaryResource::TemporaryResource(const QString& filename) { + + setFileTemplate(QDir::tempPath() + "/strawberry_test-XXXXXX." + filename.section('.', -1, -1)); + open(); + + QFile resource(filename); + resource.open(QIODevice::ReadOnly); + write(resource.readAll()); + + reset(); + +} + +TestQObject::TestQObject(QObject* parent) + : QObject(parent), + invoked_(0) { +} + +void TestQObject::Emit() { + emit Emitted(); +} + +void TestQObject::Invoke() { + ++invoked_; +} diff --git a/tests/src/test_utils.h b/tests/src/test_utils.h new file mode 100644 index 00000000..fee8b31c --- /dev/null +++ b/tests/src/test_utils.h @@ -0,0 +1,87 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef TEST_UTILS_H +#define TEST_UTILS_H + +#include + +#include +#include +#include + +class QNetworkRequest; +class QString; +class QUrl; +class QVariant; + +std::ostream& operator <<(std::ostream& stream, const QString& str); +std::ostream& operator <<(std::ostream& stream, const QVariant& var); +std::ostream& operator <<(std::ostream& stream, const QUrl& url); +std::ostream& operator <<(std::ostream& stream, const QNetworkRequest& req); + +template +std::ostream& operator <<(std::ostream& stream, const QList& list) { + stream << "QList("; + foreach (const T& item, list) { + stream << item << ","; + } + stream << ")"; + return stream; +} + +void PrintTo(const ::QString& str, std::ostream& os); +void PrintTo(const ::QVariant& var, std::ostream& os); +void PrintTo(const ::QUrl& url, std::ostream& os); + +#define EXPOSE_SIGNAL0(n) \ + void Emit##n() { emit n(); } +#define EXPOSE_SIGNAL1(n, t1) \ + void Emit##n(const t1& a1) { emit n(a1); } +#define EXPOSE_SIGNAL2(n, t1, t2) \ + void Emit##n(const t1& a1, const t2& a2) { emit n(a1, a2); } + +Q_DECLARE_METATYPE(QModelIndex); + +class TemporaryResource : public QTemporaryFile { +public: + TemporaryResource(const QString& filename); +}; + +class TestQObject : public QObject { + Q_OBJECT + public: + TestQObject(QObject* parent = 0); + + void Emit(); + + int invoked() const { return invoked_; } + + signals: + void Emitted(); + + public slots: + void Invoke(); + + private: + int invoked_; +}; + +#endif // TEST_UTILS_H diff --git a/tests/src/testobjectdecorators.cpp b/tests/src/testobjectdecorators.cpp new file mode 100644 index 00000000..0cd540ab --- /dev/null +++ b/tests/src/testobjectdecorators.cpp @@ -0,0 +1,30 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#define protected public +#include +#undef protected + +#include "testobjectdecorators.h" + + +void TestObjectDecorators::initStyleOption(QProgressBar* self, QStyleOptionProgressBar* opt) { + self->initStyleOption(opt); +} diff --git a/tests/src/testobjectdecorators.h b/tests/src/testobjectdecorators.h new file mode 100644 index 00000000..f9d35d95 --- /dev/null +++ b/tests/src/testobjectdecorators.h @@ -0,0 +1,36 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef TESTOBJECTDECORATORS_H +#define TESTOBJECTDECORATORS_H + +#include + +class QProgressBar; +class QStyleOptionProgressBar; + +class TestObjectDecorators : public QObject { + Q_OBJECT + +public slots: + void initStyleOption(QProgressBar* self, QStyleOptionProgressBar* opt); +}; + +#endif // TESTOBJECTDECORATORS_H diff --git a/tests/src/utilities_test.cpp b/tests/src/utilities_test.cpp new file mode 100644 index 00000000..af4a9287 --- /dev/null +++ b/tests/src/utilities_test.cpp @@ -0,0 +1,50 @@ +/* + * Strawberry Music Player + * This file was part of Clementine. + * Copyright 2010, David Sansome + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include + +#include +#include +#include + +#include "test_utils.h" +#include "core/utilities.h" + +TEST(UtilitiesTest, HmacFunctions) { + QString key("key"); + QString data("The quick brown fox jumps over the lazy dog"); + // Test Hmac Md5 + QByteArray result_hash_md5 = Utilities::HmacMd5(key.toLocal8Bit(), data.toLocal8Bit()).toHex(); + bool result_md5 = result_hash_md5 == QString("80070713463e7749b90c2dc24911e275"); + EXPECT_TRUE(result_md5); + // Test Hmac Sha256 + QByteArray result_hash_sha256 = Utilities::HmacSha256(key.toLocal8Bit(), data.toLocal8Bit()).toHex(); + bool result_sha256 = result_hash_sha256 == QString("f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"); + EXPECT_TRUE(result_sha256); +} + +TEST(UtilitiesTest, ParseRFC822DateTim) { + QDateTime result_DateTime = Utilities::ParseRFC822DateTime(QString("22 Feb 2008 00:16:17 GMT")); + EXPECT_TRUE(result_DateTime.isValid()); + result_DateTime = Utilities::ParseRFC822DateTime(QString("Thu, 13 Dec 2012 13:27:52 +0000")); + EXPECT_TRUE(result_DateTime.isValid()); + result_DateTime = Utilities::ParseRFC822DateTime(QString("Mon, 12 March 2012 20:00:00 +0100")); + EXPECT_TRUE(result_DateTime.isValid()); +}