From 84786c7bc8b4426f0cd4102e43045a32d1005e97 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Mon, 1 Mar 2010 16:31:19 +0000 Subject: [PATCH] Add more tests to m3uparser including one windows-only test. Fix code review comments from r291. --- src/m3uparser.cpp | 19 ++++++++++++------- src/m3uparser.h | 17 +++++++++++------ tests/m3uparser_test.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/m3uparser.cpp b/src/m3uparser.cpp index 8860dd6a8..3659edbac 100644 --- a/src/m3uparser.cpp +++ b/src/m3uparser.cpp @@ -2,7 +2,7 @@ #include -M3UParser::M3UParser(QIODevice* device, QDir directory, QObject* parent) +M3UParser::M3UParser(QIODevice* device, const QDir& directory, QObject* parent) : QObject(parent), device_(device), type_(STANDARD), @@ -38,7 +38,7 @@ const QList& M3UParser::Parse() { return songs_; } -bool M3UParser::ParseMetadata(QString line, M3UParser::Metadata* metadata) const { +bool M3UParser::ParseMetadata(const QString& line, M3UParser::Metadata* metadata) const { // Extended info, eg. // #EXTINF:123,Sample Artist - Sample title QString info = line.section(':', 1); @@ -59,7 +59,7 @@ bool M3UParser::ParseMetadata(QString line, M3UParser::Metadata* metadata) const return true; } -bool M3UParser::ParseTrackLocation(QString line, QUrl* url) const { +bool M3UParser::ParseTrackLocation(const QString& line, QUrl* url) const { if (line.contains(QRegExp("^[a-z]+://"))) { // Looks like a url. QUrl temp(line); @@ -72,10 +72,11 @@ bool M3UParser::ParseTrackLocation(QString line, QUrl* url) const { } // Should be a local path. - if (line.contains(QRegExp("^([a-zA-Z]:\\)|(/)"))) { + if (QDir::isAbsolutePath(line)) { // Absolute path. - // Fix windows \. - QString proper_path = line.replace('\\', '/'); + // Fix windows \, eg. C:\foo -> C:/foo. + QString proper_path = QDir::fromNativeSeparators(line); + // C:/foo -> /C:/foo. if (!proper_path.startsWith('/')) { proper_path.prepend("/"); } @@ -83,8 +84,12 @@ bool M3UParser::ParseTrackLocation(QString line, QUrl* url) const { return true; } else { // Relative path. - QString proper_path = line.replace('\\', '/'); + QString proper_path = QDir::fromNativeSeparators(line); QString absolute_path = directory_.absoluteFilePath(proper_path); + // C:/foo -> /C:/foo. + if (!absolute_path.startsWith('/')) { + absolute_path.prepend("/"); + } *url = "file://" + absolute_path; return true; } diff --git a/src/m3uparser.h b/src/m3uparser.h index 2bc315b76..3b0d7f5dd 100644 --- a/src/m3uparser.h +++ b/src/m3uparser.h @@ -14,10 +14,10 @@ class QIODevice; class M3UParser : public QObject { Q_OBJECT public: - M3UParser(QIODevice* device, QDir directory = QDir(), QObject* parent = 0); + M3UParser(QIODevice* device, const QDir& directory = QDir(), QObject* parent = 0); virtual ~M3UParser() {} - const QList& Parse(); + const SongList& Parse(); struct Metadata { QString artist; @@ -29,21 +29,26 @@ class M3UParser : public QObject { enum M3UType { STANDARD = 0, EXTENDED, // Includes extended info (track, artist, etc.) - LINK // Points to a directory. + LINK, // Points to a directory. }; - bool ParseMetadata(QString line, Metadata* metadata) const; - bool ParseTrackLocation(QString line, QUrl* url) const; + bool ParseMetadata(const QString& line, Metadata* metadata) const; + bool ParseTrackLocation(const QString& line, QUrl* url) const; FRIEND_TEST(M3UParserTest, ParsesMetadata); FRIEND_TEST(M3UParserTest, ParsesTrackLocation); + FRIEND_TEST(M3UParserTest, ParsesTrackLocationRelative); + FRIEND_TEST(M3UParserTest, ParsesTrackLocationHttp); +#ifdef Q_OS_WIN32 + FRIEND_TEST(M3UParserTest, ParsesTrackLocationAbsoluteWindows); +#endif // Q_OS_WIN32 QIODevice* device_; M3UType type_; QDir directory_; Metadata current_metadata_; - QList songs_; + SongList songs_; }; #endif // M3UPARSER_H diff --git a/tests/m3uparser_test.cpp b/tests/m3uparser_test.cpp index 496d10a9c..7539dc97f 100644 --- a/tests/m3uparser_test.cpp +++ b/tests/m3uparser_test.cpp @@ -27,3 +27,27 @@ TEST_F(M3UParserTest, ParsesTrackLocation) { ASSERT_TRUE(parser_.ParseTrackLocation(line, &url)); EXPECT_EQ(QUrl("file:///foo/bar.mp3"), url); } + +TEST_F(M3UParserTest, ParsesTrackLocationRelative) { + M3UParser parser(NULL, QDir("/tmp")); + QString line("foo/bar.mp3"); + QUrl url; + ASSERT_TRUE(parser.ParseTrackLocation(line, &url)); + EXPECT_EQ(QUrl("file:///tmp/foo/bar.mp3"), url); +} + +TEST_F(M3UParserTest, ParsesTrackLocationHttp) { + QString line("http://example.com/foo/bar.mp3"); + QUrl url; + ASSERT_TRUE(parser_.ParseTrackLocation(line, &url)); + EXPECT_EQ(QUrl("http://example.com/foo/bar.mp3"), url); +} + +#ifdef Q_OS_WIN32 +TEST_F(M3UParserTest, ParsesTrackLocationHttp) { + QString line("c:/foo/bar.mp3"); + QUrl url; + ASSERT_TRUE(parser_.ParseTrackLocation(line, &url)); + EXPECT_EQ(QUrl("file:///c:/foo/bar.mp3"), url); +} +#endif // Q_OS_WIN32