From e2560f3134ed00c946e5c468282c913a82ce5f10 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 23 Mar 2014 14:42:01 -0400 Subject: [PATCH] tagdb: Add most functions I implemented: - add_track() - remove_track() - add_library() - remove_library() - lookup() - get_track_db() - get_library_db() Signed-off-by: Anna Schumaker --- DESIGN | 14 +++--- include/tags.h | 9 +++- lib/tags.cpp | 50 +++++++++++++++++++++- tests/Music/1.ogg | Bin 4146 -> 4145 bytes tests/Music/10.ogg | Bin 0 -> 4948 bytes tests/Music/15.ogg | Bin 0 -> 5409 bytes tests/Music/60.ogg | Bin 0 -> 9499 bytes tests/Music/600.ogg | Bin 0 -> 58478 bytes tests/Music/666.ogg | Bin 0 -> 64459 bytes tests/Music/90.ogg | Bin 0 -> 12223 bytes tests/src/tagdb.cpp | 101 ++++++++++++++++++++++++++++++++++++++++++++ tests/tag_db | 5 +++ 12 files changed, 170 insertions(+), 9 deletions(-) create mode 100644 tests/Music/10.ogg create mode 100644 tests/Music/15.ogg create mode 100644 tests/Music/60.ogg create mode 100644 tests/Music/600.ogg create mode 100644 tests/Music/666.ogg create mode 100644 tests/Music/90.ogg create mode 100644 tests/src/tagdb.cpp diff --git a/DESIGN b/DESIGN index 8122a01c..15d57a1d 100644 --- a/DESIGN +++ b/DESIGN @@ -577,22 +577,24 @@ Tag Database: last played variables. Library *tagdb :: add_library(const std::string &filepath); - Add a new path to library_db and return its library_id. + Add a new path to library_db. Return a pointer to the new path + or return NULL if the path is already in the database. void tagdb :: remove_track(unsigned int track_id); Remove the track with id equal to track_id from the track_db. void tagdb :: remove_library(unsigned int library_id); - Remove the library with id equal to library_id from the - library_db. + Remove all tracks associated with this library from the + track_db, then remove this library from the library_db. Track *tagdb :: lookup(unsigned int track_id); - Look up the track_id in the track database. + Look up the track_id in the track database. Return NULL if + there is no matching track. - const Database &tagdb :: get_track_db(); + Database &tagdb :: get_track_db(); Return a reference to the track_db. - const Database &tagdb :: get_library_db(); + Database &tagdb :: get_library_db(); Return a reference to the library_db. diff --git a/include/tags.h b/include/tags.h index c9175eee..9e2c8627 100644 --- a/include/tags.h +++ b/include/tags.h @@ -105,9 +105,16 @@ public: }; -namespace tagdb { +namespace tagdb +{ + Track *add_track(const std::string &, Library *); Library *add_library(const std::string &); + void remove_track(unsigned int); + void remove_library(unsigned int); + Track *lookup(unsigned int); + Database &get_track_db(); + Database &get_library_db(); } diff --git a/lib/tags.cpp b/lib/tags.cpp index c5d43711..94b8d47f 100644 --- a/lib/tags.cpp +++ b/lib/tags.cpp @@ -12,6 +12,7 @@ Database artist_db("artist.db", true); Database album_db("album.db", true); Database genre_db("genre.db", true); Database library_db("library.db", true); +Database track_db("track.db", false); /** @@ -193,8 +194,53 @@ bool Track :: less_than(Track *rhs, sort_t field) * */ -Library *tagdb :: add_library(const std::string &filepath) +Track *tagdb :: add_track(const std::string &filepath, Library *library) { - Database::iterator it = library_db.insert(Library(filepath)); + unsigned int size = track_db.size(); + Database::iterator it = track_db.insert(Track(filepath, library)); + if (size == track_db.size()) + return NULL; return &(*it); } + +Library *tagdb :: add_library(const std::string &filepath) +{ + unsigned int size = library_db.size(); + Database::iterator it = library_db.insert(Library(filepath)); + if (size == library_db.size()) + return NULL; + return &(*it); +} + +void tagdb :: remove_track(unsigned int track_id) +{ + track_db.remove(track_id); +} + +void tagdb :: remove_library(unsigned int library_id) +{ + Database::iterator it; + for (it = track_db.begin(); it != track_db.end(); it++) { + if (it->library->id == library_id) + track_db.remove(it->id); + } + library_db.remove(library_id); +} + +Track *tagdb :: lookup(unsigned int track_id) +{ + Database::iterator it = track_db.at(track_id); + if (it == track_db.end()) + return NULL; + return &(*it); +} + +Database &tagdb :: get_track_db() +{ + return track_db; +} + +Database &tagdb :: get_library_db() +{ + return library_db; +} diff --git a/tests/Music/1.ogg b/tests/Music/1.ogg index b869165de0c947d841019a3a1d094276ba720af7..5e94d3694e28b6fa7fe3d301dcc4ee4735e6f6c3 100644 GIT binary patch delta 113 zcmdm_uu)+`0GsN``)&erCWiUOa56A3gm{MdxZ3*XrSbwfjzJ-w!6CMeMJ1WVCEOqZ zAE!`XTgRNF(p->Y7sn7+TO$KQ6F!j6AV+6!zffN%*C1O1Ly&fNSHB=v+u+Qc)V$

n`~cBW9#{YX diff --git a/tests/Music/10.ogg b/tests/Music/10.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6f2e4fcd8a6791cdc26df596689e684516b6c6f9 GIT binary patch literal 4948 zcmd^De^66b_P;3z2}Bwp($J=z7bFWWl3jzLHSRKBh*Hgis5}ysP_`uyH3X<6gx$_} z*`X3xpqL^=7DMdtBS8}ht5m44vt27qKtx28ptU<{t)SA~?ylRq-|5Wud)|w-Zg-~p z_s-tA@8-UH?mg$8b3W(3bF+QVo?P@4dQ^(yKaZli4_dZ!880xZUpH#?CTf7Od4T$X z@-qhgbDFW8TKP?(R#KFoi)$Dh$JhT<&V>XS{Rrs0^!xVyaJz92R;JhH(d;n=ma86hAK0S;z{YEA~QB+ZBr}dnPl3!6l(dF%xz?5TCToKS5d5EtO)K6 zmv72rASRF{*_f|(wpEP~2cg#z@Tm6P3fyJuNqVExww3Dn)-`q7ntZ(C7K#6HgGozP zBNU2ilUUZiMMde1Y!5HdYV4Njw{19zg*WHil(Ei!@q^-u{!{&iiWywUT$#TDf#K7) z3hKEe)o2?94LoRm#Wzk0jyjAHqGR3rBT^=@y6lvD&h~8^?;Y#2ZoHp#YE~X8J~c;V zOXl;62Y(k<_zTmFY{~JcVbOYEuorn)TnR_cq}Vs&{hdZ&6;umDwV)>2a*(Sy$vuCP zf8kQX_P-|Q#H3zYpP8#ts-c(*cUJ2bs?7`4HTj+O1*dEBPuCY*tuK67U&L#8RR3Oc z;~`aP)iDO@UL)(cjrYbs+xv;EH^kB~@DwVcOoFl6;_BC`{~C{pxlm7x`gkm>__6HYaQT99CZf@7*51Le6iKFh$ zF4}`-GjX@Um-y6SU-#izyJ<$jw!4D8H=?`3z3w>}i(7I;`QwUUo_@|A?!LAQ*5=RJ z7mtl{q1R;VN*o?l1^GRKh5M(DnGa;QU`5kMU4~IsA@u&Q#PO#KENbk#@JR>16&t|@ZU-5c=&IUJYmOmg;m|04+|W=CqS)Ei zESgGscRJ;KGSv)>&um;iG0xe*AQvt;Xh8N#44a&9}T*Cp)T9=I^a91#*z^PbC zYerZc9V88%#wq+LM8%Vi`*Xs@RnK2~qF($9KPOrU^-_vBcYT^#rQTUxp8sp}_4n!v zubOWx)ZAD&@ai)S-v!n;k%J&;EOboTv@MbeN8L6#E9l_IkyFW?ILJSDFd=IwK{=Ov z;jhx|52Tl3GIONL+|`AbR+}%!>T+K!yqv1Ltk%s}>#mLH3f`;9A9)lo!LYfpV16QU zs1S*lS#NJ`3;i~7x|6J*Y_P6Tv?b)X{osv`JxzA^;dk!2dn3LRIeVLrb~YbvY+h=# zCN*{Fo9v#^-m@4~m$sxt_Wa>OAR;$v!KVpD7FI8Taf?*FK6o=3naI%HdY;2WRr0rr#786$V z$ijL)H)q!!5WZx^R-WyDMR8{X6OO%5l!H*M zWK!}W&p4wv*S&d0!a8D`lqI^_=M=cOgSQ?R_D2`rcJ$3D&N*$otmY%m=;9_XEJES% zME1*N!XD(4({UT&fpV#%XG#a zN8M~j5<=J+20Zd4X-OvHB%+)95-zq&v$(>nn9Pe@-9n6V;gIx#G&M)1J|Cl=SE;YZ zD%B%GWsFk!HFxT`-eVqnlE>rrjFfu@y#>8@ zJ-wc(p*^0#fvKV293L!O2I}B3&rq_*lYD$=;44q^^2jmIn0IREMAzW)<&n=L$CH=G z_IU;ej}LuDQOCT?{>tUCb-(Dx&-Wj{Kjt1At5_bZoE|CX_j&HWFFJqr#MIE|%VR$} zWftV9&3~{J-rfm%l)w73cM2ZX50(G;_uj9jfWh3~Wfx!PkHWHdE1rWf|AV#vQ?$YA z+GB^Edc0kpSUeEn8(fRj5kmO_k>-^uY z;}>3k5eP?yypc7LnDYBw-Ym|%&U z%MtmoDh_!cbE+g^0@F6a$G7buN(HtnB0r|GDkdH6(ZpWdHb;i{xONbR9$SDkob11% z{Uhd#CG=w3oTk+6zoKbbRm@3Qa+b^}SgunP0az_{JEP=;%gN0m#Cg*I_(&U(4Z9+Ull7#gOcHRAWvQ?$VAV#HiT#>_>|rxU6G`vNJDg`I_4+}$ z(8bFlP7cQ!DkO`~5_&Hs-0h1ku!8VhLu!AZlp++Arv>aL!W+0k9sojd`S0fK|NHr4 z&9$Xse?aS{go{odY6IbmA8A@-wmB`ZY9m`S8K7ij z!56~x_UIRRaO%{Cp!8anuA4eSsIbjwBxe+Qj&WKhV#%jviEd-I9LLqu8BF2uj10$p z0U1;1ip>&qchF%Qrfl*tB394ShzRBSO>~j?#I3AXm1B zqn(!B{se{I4o1+LMaSwwr+*L&pY-9vN zqJ5ANoyaLM?LXKJXXaDr4eHD!WZ^xwmvKL4Ya>A%sN^=X!FIkpieS@xh5Cg1iT!~Yj0+>mFj%7d@9 zpZ6Ryn3caAO}`eGJxbC$gRf8I?B8bZ-`6WJcmZ-xHYok~5#i|T@aOWjY`~w5Or~_? zz*U1c-U&Mnd*0H3-*sBRJw2NUS&|S?g5v-mh-jOJIBX(GkKiEdWxL$zB^R5l!PzI*o4P1@H2NVes)wW*5%3BKs2&?4AO0IDdA z2rS@+;FzWLn=#JDr69BbP)osiwjFXBTFf38!=DF`CDA=0^jN_Jjs~M88d5nMa1M^y zqCp0o-q}bBkzg8%Ktq-8u>_R4=*fcMS}GR=h=x$7@S3{`eN*ve(pzUkcI=%bP%Rsw z%B!WzcwiFqIV>GnmR2K2`@>aavuw*r-PSlCZ{8+xadSz-U5BOb3|CLXl@(*6bsWL^H`5th-XsXJgyN|C#F<&iE1{vEMyEuuBPJ}SIeiG?SSHyA z8+WmzV?1y6YB!=?ue>%HUdujk;M7}@cT>)+DE!!rS+Gz+qmRLDt*wix`1vO*x1aui zwK3Bb6}(|H&|Y}{?_8^0Zr zu(`zI{P5FIAx)+lCNp?d38nkN8+iJcAvB%3fm34M|A(adYsP>C Z-xGu=U{DZwc74~qq5nKw{O39H{{b2*UOfN+ literal 0 HcmV?d00001 diff --git a/tests/Music/15.ogg b/tests/Music/15.ogg new file mode 100644 index 0000000000000000000000000000000000000000..99bb15b73e0c6ce1966e79f418a12c3ab5e846bd GIT binary patch literal 5409 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 E0zy_3!2kdN literal 0 HcmV?d00001 diff --git a/tests/Music/90.ogg b/tests/Music/90.ogg new file mode 100644 index 0000000000000000000000000000000000000000..abeceb9aea961299fed8a2f5fb55950010c13a13 GIT binary patch literal 12223 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 +#include + +#include + +unsigned int test_num = 0; + +void test_results(bool success, unsigned int line) +{ + print(" %u: ", test_num); + if (success) + print("Success!\n"); + else { + print("FAILED (%u) =(\n", line); + exit(1); + } + test_num++; +} + +void test_library_size(unsigned int expected, unsigned int line) +{ + test_results(tagdb :: get_library_db().size() == expected, line); +} + +void test_track_size(unsigned int expected, unsigned int line) +{ + test_results(tagdb :: get_track_db().size() == expected, line); +} + +int main(int argc, char **argv) +{ + /** + * Initial library checks + */ + Library *library = tagdb :: add_library("Music"); + test_results(library->root_path == "Music", __LINE__); + test_library_size(1, __LINE__); + + Library *library_null = tagdb :: add_library("Music"); + test_results(library_null == NULL, __LINE__); + test_library_size(1, __LINE__); + + unsigned int id = library->id; + tagdb :: remove_library(id); + test_library_size(0, __LINE__); + tagdb :: remove_library(id); + test_library_size(0, __LINE__); + + + /** + * Test adding / removing tracks + */ + library = tagdb :: add_library("Music"); + Track *track = tagdb :: add_track("Music/1.ogg", library); + test_track_size(1, __LINE__); + Track *track_null = tagdb :: add_track("Music/1.ogg", library); + test_track_size(1, __LINE__); + + test_results(track->path() == "Music/1.ogg", __LINE__); + test_results(track_null == NULL, __LINE__); + + id = track->id; + tagdb :: remove_track(id); + test_track_size(0, __LINE__); + tagdb :: remove_track(id); + test_track_size(0, __LINE__); + + + /** + * Test adding and removing multiple tracks + */ + tagdb :: add_track("Music/1.ogg", library); + tagdb :: add_track("Music/10.ogg", library); + tagdb :: add_track("Music/15.ogg", library); + tagdb :: add_track("Music/60.ogg", library); + tagdb :: add_track("Music/90.ogg", library); + tagdb :: add_track("Music/600.ogg", library); + tagdb :: add_track("Music/666.ogg", library); + test_track_size(7, __LINE__); + + test_results(tagdb :: lookup(0) == NULL, __LINE__); + test_results(tagdb :: lookup(1)->id == 1, __LINE__); + test_results(tagdb :: lookup(2)->id == 2, __LINE__); + test_results(tagdb :: lookup(3)->id == 3, __LINE__); + test_results(tagdb :: lookup(4)->id == 4, __LINE__); + test_results(tagdb :: lookup(5)->id == 5, __LINE__); + test_results(tagdb :: lookup(6)->id == 6, __LINE__); + test_results(tagdb :: lookup(7)->id == 7, __LINE__); + test_results(tagdb :: lookup(8) == NULL, __LINE__); + + + tagdb :: remove_library(library->id); + test_track_size(0, __LINE__); + + return 0; +} diff --git a/tests/tag_db b/tests/tag_db index ffe5cd54..2e29ff50 100755 --- a/tests/tag_db +++ b/tests/tag_db @@ -18,3 +18,8 @@ echo test_tag "Library" "-l" echo test_tag "Track" "-t" + + +echo +new_test "Test TagDB" +./src/tagdb.run