diff --git a/src/xspfparser.cpp b/src/xspfparser.cpp index 399f0fdca..6fee98e58 100644 --- a/src/xspfparser.cpp +++ b/src/xspfparser.cpp @@ -94,9 +94,8 @@ Song XSPFParser::ParseTrack(QXmlStreamReader* reader) const { bool ok = false; length = duration.toInt(&ok) / 1000; if (!ok) { - return Song(); + length = -1; } - song.set_length(length); } else if (name == "image") { // TODO: Fetch album covers. } else if (name == "info") { diff --git a/tests/xspfparser_test.cpp b/tests/xspfparser_test.cpp index 89111456c..d5cf6dc9f 100644 --- a/tests/xspfparser_test.cpp +++ b/tests/xspfparser_test.cpp @@ -30,5 +30,46 @@ TEST_F(XSPFParserTest, ParsesOneTrackFromXML) { EXPECT_EQ("Bar", song.artist()); EXPECT_EQ("Baz", song.album()); EXPECT_EQ("http://example.com/foo.mp3", song.filename()); + EXPECT_EQ(60, song.length()); 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(&buffer); + const SongList& songs = parser.Parse(); + ASSERT_EQ(2, songs.length()); + EXPECT_EQ("http://example.com/foo.mp3", songs[0].filename()); + EXPECT_EQ("http://example.com/bar.mp3", songs[1].filename()); + EXPECT_EQ(Song::Type_Stream, songs[0].filetype()); + EXPECT_EQ(Song::Type_Stream, songs[1].filetype()); +} + +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(&buffer); + const SongList& songs = parser.Parse(); + ASSERT_EQ(1, songs.length()); + EXPECT_EQ(-1, songs[0].length()); +}