1 #include <gtest/gtest.h>
2 
3 #include "track/trackrecord.h"
4 
5 class TrackMetadataTest : public testing::Test {
6 };
7 
TEST_F(TrackMetadataTest,parseArtistTitleFromFileName)8 TEST_F(TrackMetadataTest, parseArtistTitleFromFileName) {
9     {
10         mixxx::TrackInfo trackInfo;
11         trackInfo.parseArtistTitleFromFileName(" only - title ", false);
12         EXPECT_EQ(QString(), trackInfo.getArtist());
13         EXPECT_EQ("only - title", trackInfo.getTitle());
14     }
15     {
16         mixxx::TrackInfo trackInfo;
17         trackInfo.parseArtistTitleFromFileName(" only-title ", true);
18         EXPECT_EQ(QString(), trackInfo.getArtist());
19         EXPECT_EQ("only-title", trackInfo.getTitle());
20     }
21     {
22         mixxx::TrackInfo trackInfo;
23         trackInfo.parseArtistTitleFromFileName(" only -_title ", true);
24         EXPECT_EQ(QString(), trackInfo.getArtist());
25         EXPECT_EQ("only -_title", trackInfo.getTitle());
26     }
27     {
28         mixxx::TrackInfo trackInfo;
29         trackInfo.parseArtistTitleFromFileName(" only  -  title ", false);
30         EXPECT_EQ(QString(), trackInfo.getArtist());
31         EXPECT_EQ("only  -  title", trackInfo.getTitle());
32     }
33     {
34         mixxx::TrackInfo trackInfo;
35         trackInfo.parseArtistTitleFromFileName(" artist  -  title ", true);
36         EXPECT_EQ("artist", trackInfo.getArtist());
37         EXPECT_EQ("title", trackInfo.getTitle());
38     }
39     {
40         mixxx::TrackInfo trackInfo;
41         trackInfo.parseArtistTitleFromFileName(" only -\ttitle\t", true);
42         EXPECT_EQ(QString(), trackInfo.getArtist());
43         EXPECT_EQ("only -\ttitle", trackInfo.getTitle());
44     }
45     {
46         mixxx::TrackInfo trackInfo;
47         trackInfo.parseArtistTitleFromFileName(" - artist__-__title - ", true);
48         EXPECT_EQ("- artist_", trackInfo.getArtist());
49         EXPECT_EQ("_title -", trackInfo.getTitle());
50     }
51     {
52         mixxx::TrackInfo trackInfo;
53         trackInfo.parseArtistTitleFromFileName(" - only__-__title_-_", true);
54         EXPECT_EQ(QString(), trackInfo.getArtist());
55         EXPECT_EQ("- only__-__title_-_", trackInfo.getTitle());
56     }
57     {
58         mixxx::TrackInfo trackInfo;
59         trackInfo.parseArtistTitleFromFileName(" again - only_-_title _ ", true);
60         EXPECT_EQ(QString(), trackInfo.getArtist());
61         EXPECT_EQ("again - only_-_title _", trackInfo.getTitle());
62     }
63 }
64 
TEST_F(TrackMetadataTest,mergeImportedMetadata)65 TEST_F(TrackMetadataTest, mergeImportedMetadata) {
66     // Existing track metadata (stored in the database) without extra properties
67     mixxx::TrackRecord oldTrackRecord;
68     mixxx::TrackMetadata* pOldTrackMetadata = oldTrackRecord.ptrMetadata();
69     pOldTrackMetadata->setStreamInfo(
70             mixxx::audio::StreamInfo{
71                     mixxx::audio::SignalInfo{
72                             mixxx::audio::ChannelCount(1),
73                             mixxx::audio::SampleRate(10000),
74                     },
75                     mixxx::audio::Bitrate(100),
76                     mixxx::Duration::fromSeconds(60),
77             });
78     mixxx::TrackInfo* pOldTrackInfo = pOldTrackMetadata->ptrTrackInfo();
79     pOldTrackInfo->setArtist("old artist");
80     pOldTrackInfo->setBpm(mixxx::Bpm(100));
81     pOldTrackInfo->setComment("old comment");
82     pOldTrackInfo->setComposer("old composer");
83     pOldTrackInfo->setGenre("old genre");
84     pOldTrackInfo->setGrouping("old grouping");
85     pOldTrackInfo->setKey("1A");
86     pOldTrackInfo->setReplayGain(mixxx::ReplayGain(0.1, 1));
87     pOldTrackInfo->setTitle("old title");
88     pOldTrackInfo->setTrackNumber("1");
89     pOldTrackInfo->setTrackTotal("10");
90     pOldTrackInfo->setYear("2001-01-01");
91     mixxx::AlbumInfo* pOldAlbumInfo = pOldTrackMetadata->ptrAlbumInfo();
92     pOldAlbumInfo->setArtist("old album artist");
93     pOldAlbumInfo->setTitle("old album title");
94 
95     // Imported track metadata (from file tags) with extra properties
96     mixxx::TrackMetadata newTrackMetadata;
97     newTrackMetadata.setStreamInfo(
98             mixxx::audio::StreamInfo{
99                     mixxx::audio::SignalInfo{
100                             mixxx::audio::ChannelCount(2),
101                             mixxx::audio::SampleRate(20000),
102                     },
103                     mixxx::audio::Bitrate(200),
104                     mixxx::Duration::fromSeconds(120),
105             });
106     mixxx::TrackInfo* pNewTrackInfo = newTrackMetadata.ptrTrackInfo();
107     pNewTrackInfo->setArtist("new artist");
108     pNewTrackInfo->setBpm(mixxx::Bpm(200));
109     pNewTrackInfo->setComment("new comment");
110     pNewTrackInfo->setComposer("new composer");
111 #if defined(__EXTRA_METADATA__)
112     pNewTrackInfo->setConductor("new conductor");
113     pNewTrackInfo->setDiscNumber("1");
114     pNewTrackInfo->setDiscTotal("2");
115     pNewTrackInfo->setEncoder("encoder");
116     pNewTrackInfo->setEncoderSettings("encoder settings");
117 #endif // __EXTRA_METADATA__
118     pNewTrackInfo->setGenre("new genre");
119     pNewTrackInfo->setGrouping("new grouping");
120 #if defined(__EXTRA_METADATA__)
121     pNewTrackInfo->setISRC("isrc");
122 #endif // __EXTRA_METADATA__
123     pNewTrackInfo->setKey("1A");
124 #if defined(__EXTRA_METADATA__)
125     pNewTrackInfo->setLanguage("language");
126     pNewTrackInfo->setLyricist("lyricist");
127     pNewTrackInfo->setMood("mood");
128     pNewTrackInfo->setMovement("movement");
129     pNewTrackInfo->setMusicBrainzArtistId(QUuid("11111111-1111-1111-1111-111111111111"));
130     pNewTrackInfo->setMusicBrainzRecordingId(QUuid("22222222-2222-2222-2222-222222222222"));
131     pNewTrackInfo->setMusicBrainzReleaseId(QUuid("33333333-3333-3333-3333-333333333333"));
132     pNewTrackInfo->setMusicBrainzWorkId(QUuid("44444444-4444-4444-4444-444444444444"));
133     pNewTrackInfo->setRemixer("remixer");
134 #endif // __EXTRA_METADATA__
135     pNewTrackInfo->setReplayGain(mixxx::ReplayGain(0.2, 2));
136     pNewTrackInfo->setTitle("new title");
137     pNewTrackInfo->setTrackNumber("2");
138     pNewTrackInfo->setTrackTotal("20");
139 #if defined(__EXTRA_METADATA__)
140     pNewTrackInfo->setWork("work");
141 #endif // __EXTRA_METADATA__
142     pNewTrackInfo->setYear("2002-02-02");
143     mixxx::AlbumInfo* pNewAlbumInfo = newTrackMetadata.ptrAlbumInfo();
144     pNewAlbumInfo->setArtist("new album artist");
145 #if defined(__EXTRA_METADATA__)
146     pNewAlbumInfo->setCopyright("copyright");
147     pNewAlbumInfo->setLicense("license");
148     pNewAlbumInfo->setMusicBrainzArtistId(QUuid("55555555-5555-5555-5555-555555555555"));
149     pNewAlbumInfo->setMusicBrainzReleaseGroupId(QUuid("66666666-6666-6666-6666-666666666666"));
150     pNewAlbumInfo->setMusicBrainzReleaseId(QUuid("77777777-7777-7777-7777-777777777777"));
151     pNewAlbumInfo->setRecordLabel("copyright");
152     pNewAlbumInfo->setReplayGain(mixxx::ReplayGain(0.3, 3));
153 #endif // __EXTRA_METADATA__
154     pNewAlbumInfo->setTitle("new album title");
155 
156     mixxx::TrackRecord mergedTrackRecord = oldTrackRecord;
157     ASSERT_EQ(mergedTrackRecord.getMetadata(), oldTrackRecord.getMetadata());
158     ASSERT_NE(newTrackMetadata, *pOldTrackMetadata);
159     mergedTrackRecord.mergeImportedMetadata(newTrackMetadata);
160 
161     mixxx::TrackMetadata* pMergedTrackMetadata = mergedTrackRecord.ptrMetadata();
162     EXPECT_EQ(pOldTrackMetadata->getStreamInfo(), pMergedTrackMetadata->getStreamInfo());
163     mixxx::TrackInfo* pMergedTrackInfo = pMergedTrackMetadata->ptrTrackInfo();
164     EXPECT_EQ(pOldTrackInfo->getArtist(), pMergedTrackInfo->getArtist());
165     EXPECT_EQ(pOldTrackInfo->getBpm(), pMergedTrackInfo->getBpm());
166     EXPECT_EQ(pOldTrackInfo->getComment(), pMergedTrackInfo->getComment());
167     EXPECT_EQ(pOldTrackInfo->getComposer(), pMergedTrackInfo->getComposer());
168 #if defined(__EXTRA_METADATA__)
169     EXPECT_EQ(pNewTrackInfo->getConductor(), pMergedTrackInfo->getConductor());
170     EXPECT_EQ(pNewTrackInfo->getDiscNumber(), pMergedTrackInfo->getDiscNumber());
171     EXPECT_EQ(pNewTrackInfo->getDiscTotal(), pMergedTrackInfo->getDiscTotal());
172     EXPECT_EQ(pNewTrackInfo->getEncoder(), pMergedTrackInfo->getEncoder());
173     EXPECT_EQ(pNewTrackInfo->getEncoderSettings(), pMergedTrackInfo->getEncoderSettings());
174 #endif // __EXTRA_METADATA__
175     EXPECT_EQ(pOldTrackInfo->getGenre(), pMergedTrackInfo->getGenre());
176     EXPECT_EQ(pOldTrackInfo->getGrouping(), pMergedTrackInfo->getGrouping());
177 #if defined(__EXTRA_METADATA__)
178     EXPECT_EQ(pNewTrackInfo->getISRC(), pMergedTrackInfo->getISRC());
179 #endif // __EXTRA_METADATA__
180     EXPECT_EQ(pOldTrackInfo->getKey(), pMergedTrackInfo->getKey());
181 #if defined(__EXTRA_METADATA__)
182     EXPECT_EQ(pNewTrackInfo->getLanguage(), pMergedTrackInfo->getLanguage());
183     EXPECT_EQ(pNewTrackInfo->getLyricist(), pMergedTrackInfo->getLyricist());
184     EXPECT_EQ(pNewTrackInfo->getMood(), pMergedTrackInfo->getMood());
185     EXPECT_EQ(pNewTrackInfo->getMovement(), pMergedTrackInfo->getMovement());
186     EXPECT_EQ(pNewTrackInfo->getMusicBrainzArtistId(), pMergedTrackInfo->getMusicBrainzArtistId());
187     EXPECT_EQ(pNewTrackInfo->getMusicBrainzRecordingId(),
188             pMergedTrackInfo->getMusicBrainzRecordingId());
189     EXPECT_EQ(pNewTrackInfo->getMusicBrainzReleaseId(),
190             pMergedTrackInfo->getMusicBrainzReleaseId());
191     EXPECT_EQ(pNewTrackInfo->getMusicBrainzWorkId(),
192             pMergedTrackInfo->getMusicBrainzWorkId());
193     EXPECT_EQ(pNewTrackInfo->getRemixer(), pMergedTrackInfo->getRemixer());
194 #endif // __EXTRA_METADATA__
195     EXPECT_EQ(
196             pOldTrackInfo->getReplayGain(), pMergedTrackInfo->getReplayGain());
197     EXPECT_EQ(pOldTrackInfo->getTitle(), pMergedTrackInfo->getTitle());
198     EXPECT_EQ(pOldTrackInfo->getTrackNumber(),
199             pMergedTrackInfo->getTrackNumber());
200     EXPECT_EQ(
201             pOldTrackInfo->getTrackTotal(), pMergedTrackInfo->getTrackTotal());
202 #if defined(__EXTRA_METADATA__)
203     EXPECT_EQ(pNewTrackInfo->getWork(), pMergedTrackInfo->getWork());
204 #endif // __EXTRA_METADATA__
205     EXPECT_EQ(pOldTrackInfo->getYear(), pMergedTrackInfo->getYear());
206     mixxx::AlbumInfo* pMergedAlbumInfo =
207             pMergedTrackMetadata->ptrAlbumInfo();
208     EXPECT_EQ(pOldAlbumInfo->getArtist(), pMergedAlbumInfo->getArtist());
209 #if defined(__EXTRA_METADATA__)
210     EXPECT_EQ(pNewAlbumInfo->getCopyright(), pMergedAlbumInfo->getCopyright());
211     EXPECT_EQ(pNewAlbumInfo->getLicense(), pMergedAlbumInfo->getLicense());
212     EXPECT_EQ(pNewAlbumInfo->getMusicBrainzArtistId(),
213             pMergedAlbumInfo->getMusicBrainzArtistId());
214     EXPECT_EQ(pNewAlbumInfo->getMusicBrainzReleaseGroupId(),
215             pMergedAlbumInfo->getMusicBrainzReleaseGroupId());
216     EXPECT_EQ(pNewAlbumInfo->getMusicBrainzReleaseId(),
217             pMergedAlbumInfo->getMusicBrainzReleaseId());
218     EXPECT_EQ(pNewAlbumInfo->getRecordLabel(), pMergedAlbumInfo->getRecordLabel());
219     EXPECT_EQ(pNewAlbumInfo->getReplayGain(), pMergedAlbumInfo->getReplayGain());
220 #endif // __EXTRA_METADATA__
221     EXPECT_EQ(pOldAlbumInfo->getTitle(), pMergedAlbumInfo->getTitle());
222 
223     // Check that all existing properties are preserved, even if empty or missing
224     pMergedTrackInfo->setArtist("");
225     pMergedTrackInfo->setTitle(QString());
226     pMergedAlbumInfo->setArtist("");
227     pMergedAlbumInfo->setTitle(QString());
228     mergedTrackRecord.mergeImportedMetadata(newTrackMetadata);
229     EXPECT_EQ(QString(""), pMergedTrackInfo->getArtist());
230     EXPECT_EQ(QString(), pMergedTrackInfo->getTitle());
231     EXPECT_EQ(QString(""), pMergedAlbumInfo->getArtist());
232     EXPECT_EQ(QString(), pMergedAlbumInfo->getTitle());
233 
234     // Check that the placeholder for track total is replaced with the actual property
235     ASSERT_NE(mixxx::TrackRecord::kTrackTotalPlaceholder, pNewTrackInfo->getTrackTotal());
236     pMergedTrackInfo->setTrackTotal(mixxx::TrackRecord::kTrackTotalPlaceholder);
237     mergedTrackRecord.mergeImportedMetadata(newTrackMetadata);
238     EXPECT_EQ(pNewTrackInfo->getTrackTotal(), pMergedTrackInfo->getTrackTotal());
239     // ...but if track total is missing entirely it should be preserved
240     ASSERT_NE(QString(), pNewTrackInfo->getTrackTotal());
241     pMergedTrackInfo->setTrackTotal(QString());
242     mergedTrackRecord.mergeImportedMetadata(newTrackMetadata);
243     EXPECT_EQ(QString(), pMergedTrackInfo->getTrackTotal());
244 }
245