/* This file is part of Clementine. Copyright 2010, David Sansome Clementine 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. Clementine 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 Clementine. If not, see . */ #include "test_utils.h" #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" #include "core/timeconstants.h" #include "playlistparsers/xspfparser.h" #include #include using ::testing::HasSubstr; class XSPFParserTest : public ::testing::Test {}; TEST_F(XSPFParserTest, ParsesOneTrackFromXML) { QByteArray data = "" "http://example.com/foo.mp3" "Foo" "Bar" "Baz" "60000" "http://example.com/albumcover.jpg" "http://example.com" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); XSPFParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); const Song& song = songs[0]; EXPECT_EQ("Foo", song.title()); EXPECT_EQ("Bar", song.artist()); EXPECT_EQ("Baz", song.album()); EXPECT_EQ(QUrl("http://example.com/foo.mp3"), song.url()); EXPECT_EQ(60 * kNsecPerSec, song.length_nanosec()); EXPECT_TRUE(song.is_valid()); } TEST_F(XSPFParserTest, ParsesMoreThanOneTrackFromXML) { QByteArray data = "" "" "http://example.com/foo.mp3" "" "" "http://example.com/bar.mp3" "" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); XSPFParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(2, songs.length()); EXPECT_EQ(QUrl("http://example.com/foo.mp3"), songs[0].url()); EXPECT_EQ(QUrl("http://example.com/bar.mp3"), songs[1].url()); EXPECT_TRUE(songs[0].is_stream()); EXPECT_TRUE(songs[1].is_stream()); } TEST_F(XSPFParserTest, IgnoresInvalidLength) { QByteArray data = "" "http://example.com/foo.mp3" "Foo" "Bar" "Baz" "60000qwerty" "http://example.com/albumcover.jpg" "http://example.com" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); XSPFParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); EXPECT_EQ(-1, songs[0].length_nanosec()); } TEST_F(XSPFParserTest, ParsesTrackNum) { QByteArray data = "" "http://example.com/foo.mp3" "Foo" "Bar" "Baz" "http://example.com/albumcover.jpg" "http://example.com" "42" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); XSPFParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); EXPECT_EQ(42, songs[0].track()); } TEST_F(XSPFParserTest, SavesSong) { QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); XSPFParser parser(nullptr); Song one; one.set_url(QUrl("http://www.example.com/foo.mp3")); one.set_filetype(Song::Type_Stream); one.set_title("foo"); one.set_length_nanosec(123 * kNsecPerSec); one.set_artist("bar"); SongList songs; songs << one; parser.Save(songs, &buffer); EXPECT_THAT(data.constData(), HasSubstr("http://www.example.com/foo.mp3")); EXPECT_THAT(data.constData(), HasSubstr("123000")); EXPECT_THAT(data.constData(), HasSubstr("foo")); EXPECT_THAT(data.constData(), HasSubstr("bar")); } TEST_F(XSPFParserTest, SavesLocalFile) { QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); XSPFParser parser(nullptr); Song one; one.set_url(QUrl("file:///bar/foo.mp3")); one.set_filetype(Song::Type_Mpeg); one.set_title("foo"); one.set_length_nanosec(123 * kNsecPerSec); one.set_artist("bar"); one.set_track(42); SongList songs; songs << one; parser.Save(songs, &buffer); EXPECT_THAT(data.constData(), HasSubstr("/bar/foo.mp3")); EXPECT_THAT(data.constData(), HasSubstr("123000")); EXPECT_THAT(data.constData(), HasSubstr("foo")); EXPECT_THAT(data.constData(), HasSubstr("bar")); EXPECT_THAT(data.constData(), HasSubstr("42")); }