MediaTests.cpp 9.45 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*****************************************************************************
 * Media Library
 *****************************************************************************
 * Copyright (C) 2015 Hugo Beauzée-Luyssen, Videolabs
 *
 * Authors: Hugo Beauzée-Luyssen<hugo@beauzee.fr>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/

23
24
25
26
#if HAVE_CONFIG_H
# include "config.h"
#endif

27
#include "Tests.h"
28

29
#include "medialibrary/IMediaLibrary.h"
30
#include "File.h"
31
#include "Media.h"
32
33
34
#include "Artist.h"
#include "Album.h"
#include "AlbumTrack.h"
35
#include "mocks/FileSystem.h"
36
#include "compat/Thread.h"
37

38
class Medias : public Tests
39
40
41
42
{
};


43
TEST_F( Medias, Init )
44
45
46
47
{
    // only test for correct test fixture behavior
}

48
TEST_F( Medias, Create )
49
{
50
51
52
53
54
55
56
57
    auto m = ml->addFile( "media.avi" );
    ASSERT_NE( m, nullptr );

    ASSERT_EQ( m->playCount(), 0 );
    ASSERT_EQ( m->albumTrack(), nullptr );
    ASSERT_EQ( m->showEpisode(), nullptr );
    ASSERT_EQ( m->duration(), -1 );
    ASSERT_NE( 0u, m->insertionDate() );
58
59
}

60
TEST_F( Medias, Fetch )
61
{
62
    auto f = ml->addFile( "media.avi" );
63
64
    auto f2 = ml->media( f->id() );
    ASSERT_EQ( f->id(), f2->id() );
65
    ASSERT_EQ( f, f2 );
66
67

    // Flush cache and fetch from DB
68
    Reload();
69

70
    f2 = std::static_pointer_cast<Media>( ml->media( f->id() ) );
71
    ASSERT_EQ( f->id(), f2->id() );
72
}
73

74
TEST_F( Medias, Duration )
75
{
76
    auto f = ml->addFile( "media.avi" );
77
    ASSERT_EQ( f->duration(), -1 );
78

79
80
81
82
    // Use a value that checks we're using a 64bits value
    int64_t d = int64_t(1) << 40;

    f->setDuration( d );
83
    f->save();
84
    ASSERT_EQ( f->duration(), d );
85
86
87

    Reload();

88
    auto f2 = ml->media( f->id() );
89
    ASSERT_EQ( f2->duration(), d );
90
}
91

Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
92
TEST_F( Medias, Thumbnail )
93
{
94
    auto f = ml->addFile( "media.avi" );
Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
95
    ASSERT_EQ( f->thumbnail(), "" );
96

Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
97
    std::string newThumbnail( "/path/to/thumbnail" );
98

Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
99
    f->setThumbnail( newThumbnail );
100
    f->save();
Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
101
    ASSERT_EQ( f->thumbnail(), newThumbnail );
102
103
104

    Reload();

105
    auto f2 = ml->media( f->id() );
Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
106
    ASSERT_EQ( f2->thumbnail(), newThumbnail );
107
}
108
109
110

TEST_F( Medias, PlayCount )
{
111
    auto f = ml->addFile( "media.avi" );
112
113
114
115
116
117
    ASSERT_EQ( 0, f->playCount() );
    f->increasePlayCount();
    ASSERT_EQ( 1, f->playCount() );

    Reload();

118
    f = std::static_pointer_cast<Media>( ml->media( f->id() ) );
119
120
    ASSERT_EQ( 1, f->playCount() );
}
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

TEST_F( Medias, Progress )
{
    auto f = ml->addFile( "media.avi" );
    ASSERT_EQ( .0f, f->progress() );
    f->setProgress( 123.0f );
    // Check that a non-sensical value is ignored
    ASSERT_EQ( .0f, f->progress() );
    f->setProgress( 0.666f );
    ASSERT_EQ( .666f, f->progress() );

    Reload();

    f = ml->media( f->id() );
    ASSERT_EQ( .666f, f->progress() );
}

TEST_F( Medias, Rating )
{
    auto f = ml->addFile( "media.avi" );
    ASSERT_EQ( -1, f->rating() );
    f->setRating( 12345 );
    ASSERT_EQ( 12345, f->rating() );

    Reload();

    f = ml->media( f->id() );
    ASSERT_EQ( 12345, f->rating() );
}
150
151
152
153
154
155
156

TEST_F( Medias, Search )
{
    for ( auto i = 1u; i <= 10u; ++i )
    {
        auto m = ml->addFile( "track " + std::to_string( i ) + ".mp3" );
    }
157
    auto media = ml->searchMedia( "tra" ).others;
158
159
    ASSERT_EQ( 10u, media.size() );

160
    media = ml->searchMedia( "track 1" ).others;
161
162
    ASSERT_EQ( 2u, media.size() );

163
    media = ml->searchMedia( "grouik" ).others;
164
165
    ASSERT_EQ( 0u, media.size() );

166
    media = ml->searchMedia( "rack" ).others;
167
168
169
170
171
172
173
    ASSERT_EQ( 0u, media.size() );
}

TEST_F( Medias, SearchAfterEdit )
{
    auto m = ml->addFile( "media.mp3" );

174
    auto media = ml->searchMedia( "media" ).others;
175
176
177
178
179
    ASSERT_EQ( 1u, media.size() );

    m->setTitle( "otters are awesome" );
    m->save();

180
    media = ml->searchMedia( "media" ).others;
181
182
    ASSERT_EQ( 0u, media.size() );

183
    media = ml->searchMedia( "otters" ).others;
184
185
186
187
188
189
190
    ASSERT_EQ( 1u, media.size() );
}

TEST_F( Medias, SearchAfterDelete )
{
    auto m = ml->addFile( "media.mp3" );

191
    auto media = ml->searchMedia( "media" ).others;
192
193
194
195
196
    ASSERT_EQ( 1u, media.size() );

    auto f = m->files()[0];
    m->removeFile( static_cast<File&>( *f ) );

197
    media = ml->searchMedia( "media" ).others;
198
199
    ASSERT_EQ( 0u, media.size() );
}
200
201
202
203

TEST_F( Medias, SearchByLabel )
{
    auto m = ml->addFile( "media.mkv" );
204
    auto media = ml->searchMedia( "otter" ).others;
205
206
207
208
209
    ASSERT_EQ( 0u, media.size() );

    auto l = ml->createLabel( "otter" );
    m->addLabel( l );

210
    media = ml->searchMedia( "otter" ).others;
211
212
213
214
215
    ASSERT_EQ( 1u, media.size() );

    auto l2 = ml->createLabel( "pangolins" );
    m->addLabel( l2 );

216
    media = ml->searchMedia( "otter" ).others;
217
218
    ASSERT_EQ( 1u, media.size() );

219
    media = ml->searchMedia( "pangolin" ).others;
220
221
222
223
    ASSERT_EQ( 1u, media.size() );

    m->removeLabel( l );

224
    media = ml->searchMedia( "otter" ).others;
225
226
    ASSERT_EQ( 0u, media.size() );

227
    media = ml->searchMedia( "pangolin" ).others;
228
229
230
231
    ASSERT_EQ( 1u, media.size() );

    m->addLabel( l );

232
    media = ml->searchMedia( "otter" ).others;
233
234
    ASSERT_EQ( 1u, media.size() );

235
    media = ml->searchMedia( "pangolin" ).others;
236
237
238
239
    ASSERT_EQ( 1u, media.size() );

    ml->deleteLabel( l );

240
    media = ml->searchMedia( "otter" ).others;
241
242
    ASSERT_EQ( 0u, media.size() );

243
    media = ml->searchMedia( "pangolin" ).others;
244
245
    ASSERT_EQ( 1u, media.size() );
}
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266

TEST_F( Medias, SearchTracks )
{
    auto a = ml->createAlbum( "album" );
    for ( auto i = 1u; i <= 10u; ++i )
    {
       auto m = ml->addFile( "track " + std::to_string( i ) + ".mp3" );
       a->addTrack( m, i, 1 );
    }
    auto tracks = ml->searchMedia( "tra" ).tracks;
    ASSERT_EQ( 10u, tracks.size() );

    tracks = ml->searchMedia( "track 1" ).tracks;
    ASSERT_EQ( 2u, tracks.size() );

    tracks = ml->searchMedia( "grouik" ).tracks;
    ASSERT_EQ( 0u, tracks.size() );

    tracks = ml->searchMedia( "rack" ).tracks;
    ASSERT_EQ( 0u, tracks.size() );
}
267
268
269
270
271
272
273
274
275
276
277
278
279
280

TEST_F( Medias, Favorite )
{
    auto m = ml->addFile( "media.mkv" );
    ASSERT_FALSE( m->isFavorite() );

    m->setFavorite( true );
    ASSERT_TRUE( m->isFavorite() );

    Reload();

    m = ml->media( m->id() );
    ASSERT_TRUE( m->isFavorite() );
}
281
282
283
284
285
286
287
288
289
290
291
292
293
294

TEST_F( Medias, History )
{
    auto m = ml->addFile( "media.mkv" );

    auto history = ml->lastMediaPlayed();
    ASSERT_EQ( 0u, history.size() );

    m->increasePlayCount();
    m->save();
    history = ml->lastMediaPlayed();
    ASSERT_EQ( 1u, history.size() );
    ASSERT_EQ( m->id(), history[0]->id() );

295
    compat::this_thread::sleep_for( std::chrono::seconds{ 1 } );
296
297
298
299
300
301
302
303
304
    auto m2 = ml->addFile( "media.mkv" );
    m2->increasePlayCount();
    m2->save();

    history = ml->lastMediaPlayed();
    ASSERT_EQ( 2u, history.size() );
    ASSERT_EQ( m2->id(), history[0]->id() );
    ASSERT_EQ( m->id(), history[1]->id() );
}
305

306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
TEST_F( Medias, ClearHistory )
{
    auto m = ml->addFile( "media.mkv" );

    auto history = ml->lastMediaPlayed();
    ASSERT_EQ( 0u, history.size() );

    m->increasePlayCount();
    m->save();
    history = ml->lastMediaPlayed();
    ASSERT_EQ( 1u, history.size() );

    ASSERT_TRUE( ml->clearHistory() );

    history = ml->lastMediaPlayed();
    ASSERT_EQ( 0u, history.size() );

    Reload();

    history = ml->lastMediaPlayed();
    ASSERT_EQ( 0u, history.size() );
}

329
330
331
332
333
334
335
336
337
338
339
340
341
342
TEST_F( Medias, SetReleaseDate )
{
    auto m = ml->addFile( "movie.mkv" );

    ASSERT_EQ( m->releaseDate(), 0u );
    m->setReleaseDate( 1234 );
    m->save();
    ASSERT_EQ( m->releaseDate(), 1234u );

    Reload();

    auto m2 = ml->media( m->id() );
    ASSERT_EQ( m2->releaseDate(), 1234u );
}
343
344
345
346
347
348
349
350
351
352
353

TEST_F( Medias, SortByAlpha )
{
    auto m1 = ml->addFile( "media1.mp3" );
    m1->setTitle( "Abcd" );
    m1->save();

    auto m2 = ml->addFile( "media2.mp3" );
    m2->setTitle( "Zyxw" );
    m2->save();

354
    auto media = ml->audioFiles( SortingCriteria::Alpha, false );
355
356
357
358
    ASSERT_EQ( 2u, media.size() );
    ASSERT_EQ( m1->id(), media[0]->id() );
    ASSERT_EQ( m2->id(), media[1]->id() );

359
    media = ml->audioFiles( SortingCriteria::Alpha, true );
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
    ASSERT_EQ( 2u, media.size() );
    ASSERT_EQ( m2->id(), media[0]->id() );
    ASSERT_EQ( m1->id(), media[1]->id() );
}

TEST_F( Medias, SortByLastModifDate )
{
    auto file1 = std::make_shared<mock::NoopFile>( "media.mkv" );
    file1->setLastModificationDate( 666 );
    auto m1 = ml->addFile( *file1 );

    auto file2 = std::make_shared<mock::NoopFile>( "media2.mkv" );
    file2->setLastModificationDate( 111 );
    auto m2 = ml->addFile( *file2 );

375
    auto media = ml->videoFiles( SortingCriteria::LastModificationDate, false );
376
377
378
379
    ASSERT_EQ( 2u, media.size() );
    ASSERT_EQ( m2->id(), media[0]->id() );
    ASSERT_EQ( m1->id(), media[1]->id() );

380
    media = ml->videoFiles( SortingCriteria::LastModificationDate, true );
381
382
383
384
    ASSERT_EQ( 2u, media.size() );
    ASSERT_EQ( m2->id(), media[1]->id() );
    ASSERT_EQ( m1->id(), media[0]->id() );
}