1 /* This file is part of Clementine.
2    Copyright 2010, David Sansome <me@davidsansome.com>
3 
4    Clementine is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8 
9    Clementine is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License
15    along with Clementine.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 
18 #include "test_utils.h"
19 #include "gtest/gtest.h"
20 
21 #include "fmpsparser.h"
22 
23 #include <QtDebug>
24 
25 class FMPSParserTest : public testing::Test {
26 protected:
27   FMPSParser parser_;
28 };
29 
TEST_F(FMPSParserTest,ParseFloats)30 TEST_F(FMPSParserTest, ParseFloats) {
31   QVariant value;
32 
33   EXPECT_EQ(1, parser_.ParseValue("0", &value));
34   EXPECT_EQ(QVariant::Double, value.type());
35   EXPECT_EQ(0, value.toDouble());
36 
37   EXPECT_EQ(3, parser_.ParseValue("123", &value));
38   EXPECT_EQ(QVariant::Double, value.type());
39   EXPECT_EQ(123, value.toDouble());
40 
41   EXPECT_EQ(3, parser_.ParseValue("0.0", &value));
42   EXPECT_EQ(QVariant::Double, value.type());
43   EXPECT_EQ(0, value.toDouble());
44 
45   EXPECT_EQ(2, parser_.ParseValue("-1", &value));
46   EXPECT_EQ(QVariant::Double, value.type());
47   EXPECT_EQ(-1, value.toDouble());
48 
49   EXPECT_EQ(5, parser_.ParseValue("-1.23", &value));
50   EXPECT_EQ(QVariant::Double, value.type());
51   EXPECT_EQ(-1.23, value.toDouble());
52 
53   EXPECT_EQ(4, parser_.ParseValue("+123", &value));
54   EXPECT_EQ(QVariant::Double, value.type());
55   EXPECT_EQ(123, value.toDouble());
56 
57   parser_.ParseValue("1.", &value);
58   EXPECT_NE(QVariant::Double, value.type());
59 
60   parser_.ParseValue("abc", &value);
61   EXPECT_NE(QVariant::Double, value.type());
62 }
63 
TEST_F(FMPSParserTest,ParseStrings)64 TEST_F(FMPSParserTest, ParseStrings) {
65   QVariant value;
66 
67   EXPECT_EQ(3, parser_.ParseValue("abc", &value));
68   EXPECT_EQ(QVariant::String, value.type());
69   EXPECT_EQ("abc", value.toString());
70 
71   EXPECT_EQ(8, parser_.ParseValue("foo\\\\bar", &value));
72   EXPECT_EQ(QVariant::String, value.type());
73   EXPECT_EQ("foo\\bar", value.toString());
74 
75   EXPECT_EQ(8, parser_.ParseValue("foo\\:bar", &value));
76   EXPECT_EQ(QVariant::String, value.type());
77   EXPECT_EQ("foo:bar", value.toString());
78 
79   EXPECT_EQ(8, parser_.ParseValue("foo\\;bar", &value));
80   EXPECT_EQ(QVariant::String, value.type());
81   EXPECT_EQ("foo;bar", value.toString());
82 
83   EXPECT_EQ(12, parser_.ParseValue("foo\\\\\\:\\;bar", &value));
84   EXPECT_EQ(QVariant::String, value.type());
85   EXPECT_EQ("foo\\:;bar", value.toString());
86 
87   EXPECT_EQ(2, parser_.ParseValue("1.", &value));
88   EXPECT_EQ(QVariant::String, value.type());
89   EXPECT_EQ("1.", value.toString());
90 
91   EXPECT_EQ(5, parser_.ParseValue("1.abc", &value));
92   EXPECT_EQ(QVariant::String, value.type());
93   EXPECT_EQ("1.abc", value.toString());
94 
95   EXPECT_EQ(-1, parser_.ParseValue("foo\\bar", &value));
96 
97   EXPECT_EQ(-1, parser_.ParseValue("foo:bar", &value));
98 
99   EXPECT_EQ(-1, parser_.ParseValue("foo;bar", &value));
100 }
101 
TEST_F(FMPSParserTest,ParseLists)102 TEST_F(FMPSParserTest, ParseLists) {
103   QVariantList value;
104 
105   EXPECT_EQ(3, parser_.ParseList("abc", &value));
106   EXPECT_EQ(1, value.length());
107   EXPECT_EQ("abc", value[0]);
108 
109   EXPECT_EQ(3, parser_.ParseList("123", &value));
110   EXPECT_EQ(1, value.length());
111   EXPECT_EQ(123, value[0]);
112 
113   EXPECT_EQ(8, parser_.ParseList("abc::def", &value));
114   EXPECT_EQ(2, value.length());
115   EXPECT_EQ("abc", value[0]);
116   EXPECT_EQ("def", value[1]);
117 
118   EXPECT_EQ(13, parser_.ParseList("abc::def::ghi", &value));
119   EXPECT_EQ(3, value.length());
120   EXPECT_EQ("abc", value[0]);
121   EXPECT_EQ("def", value[1]);
122   EXPECT_EQ("ghi", value[2]);
123 
124   EXPECT_EQ(12, parser_.ParseList("ab\\:c::\\\\def", &value));
125   EXPECT_EQ(2, value.length());
126   EXPECT_EQ("ab:c", value[0]);
127   EXPECT_EQ("\\def", value[1]);
128 
129   EXPECT_EQ(5, parser_.ParseList("abc::def:", &value));
130   EXPECT_EQ(1, value.length());
131   EXPECT_EQ("abc", value[0]);
132 }
133 
TEST_F(FMPSParserTest,ParseListLists)134 TEST_F(FMPSParserTest, ParseListLists) {
135   FMPSParser::Result value;
136 
137   EXPECT_EQ(8, parser_.ParseListList("abc::def", &value));
138   EXPECT_EQ(1, value.length());
139   EXPECT_EQ(2, value[0].length());
140   EXPECT_EQ("abc", value[0][0]);
141   EXPECT_EQ("def", value[0][1]);
142 
143   EXPECT_EQ(18, parser_.ParseListList("abc::def;;123::456", &value));
144   EXPECT_EQ(2, value.length());
145   EXPECT_EQ(2, value[0].length());
146   EXPECT_EQ(2, value[1].length());
147   EXPECT_EQ("abc", value[0][0]);
148   EXPECT_EQ("def", value[0][1]);
149   EXPECT_EQ(123, value[1][0]);
150   EXPECT_EQ(456, value[1][1]);
151 }
152 
TEST_F(FMPSParserTest,Parse)153 TEST_F(FMPSParserTest, Parse) {
154   EXPECT_TRUE(parser_.Parse("abc"));
155   EXPECT_TRUE(parser_.Parse("abc::def"));
156   EXPECT_TRUE(parser_.Parse("abc::def;;123::456;;foo::bar"));
157   EXPECT_TRUE(parser_.Parse("1."));
158   EXPECT_TRUE(parser_.Parse("1.abc"));
159 
160   EXPECT_FALSE(parser_.Parse("1:"));
161   EXPECT_FALSE(parser_.Parse("1;"));
162   EXPECT_FALSE(parser_.Parse("1:abc"));
163   EXPECT_FALSE(parser_.Parse("abc;"));
164 }
165 
TEST_F(FMPSParserTest,SpecExamples)166 TEST_F(FMPSParserTest, SpecExamples) {
167   FMPSParser::Result expected;
168 
169   expected.clear();
170   expected << (QVariantList() << "Alice Abba" << 0.6);
171   expected << (QVariantList() << "Bob Beatles" << 0.8);
172 
173   ASSERT_TRUE(parser_.Parse("Alice Abba::0.6;;Bob Beatles::0.8"));
174   EXPECT_EQ(expected, parser_.result());
175 
176   expected.clear();
177   expected << (QVariantList() << "Rolling Stone" << "Ralph Gleason" << 0.83);
178   expected << (QVariantList() << "musicOMH.com" << "FMPS_Nothing" << 0.76);
179   expected << (QVariantList() << "Metacritic" << "FMPS_Nothing" << 0.8);
180   expected << (QVariantList() << "FMPS_Nothing" << "Some Dude" << 0.9);
181 
182   ASSERT_TRUE(parser_.Parse("Rolling Stone::Ralph Gleason::0.83;;musicOMH.com::FMPS_Nothing::0.76;;Metacritic::FMPS_Nothing::0.8;;FMPS_Nothing::Some Dude::0.9"));
183   EXPECT_EQ(expected, parser_.result());
184 
185   expected.clear();
186   expected << (QVariantList() << "Amarok" << "AutoRate" << 0.52);
187   expected << (QVariantList() << "VLC" << "Standard" << 0.6);
188   expected << (QVariantList() << "QuodLibet" << "RatingPlugin:X" << 0.35);
189   expected << (QVariantList() << "The Free Music Player Alliance" << "Rating Algorithm 1" << 0.5);
190 
191   ASSERT_TRUE(parser_.Parse("Amarok::AutoRate::0.52;;VLC::Standard::0.6;;QuodLibet::RatingPlugin\\:X::0.35;;The Free Music Player Alliance::Rating Algorithm 1::0.5"));
192   EXPECT_EQ(expected, parser_.result());
193 
194   expected.clear();
195   expected << (QVariantList() << "Willy Nelson" << "Guitar");
196   expected << (QVariantList() << "Eric Clapton" << "Guitar (Backup)");
197   expected << (QVariantList() << "B.B. King" << "Vocals");
198   ASSERT_TRUE(parser_.Parse("Willy Nelson::Guitar;;Eric Clapton::Guitar (Backup);;B.B. King::Vocals"));
199   EXPECT_EQ(expected, parser_.result());
200 
201   expected.clear();
202   expected << (QVariantList() << "Alice Aardvark" << "[lyrics]");
203   expected << (QVariantList() << "Bob Baboon" << "[lyrics]");
204   expected << (QVariantList() << "http://www.lyricssite.net" << "[lyrics]");
205   ASSERT_TRUE(parser_.Parse("Alice Aardvark::[lyrics];;Bob Baboon::[lyrics];;http\\://www.lyricssite.net::[lyrics]"));
206   EXPECT_EQ(expected, parser_.result());
207 
208   expected.clear();
209   expected << (QVariantList() << "Amarok" << "Album" << "2982ab29ef");
210   expected << (QVariantList() << "AmarokUser" << "Compilation" << "My Compilation");
211   expected << (QVariantList() << "Banshee" << "Compilation" << "ad8slpbzl229zier");
212   expected << (QVariantList() << "FMPSAlliance" << "Album" << "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3");
213   ASSERT_TRUE(parser_.Parse("Amarok::Album::2982ab29ef;;AmarokUser::Compilation::My Compilation;;Banshee::Compilation::ad8slpbzl229zier;;FMPSAlliance::Album::de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3"));
214   EXPECT_EQ(expected, parser_.result());
215 }
216