Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: test/UtilForEachQueryStringParameterTest.cpp

Issue 5921969115496448: Issue 1115 - Some yahoo page not correctly shown on IE8 when ABP enabled (Closed)
Patch Set: rebase and address comments Created Feb. 12, 2015, 2:30 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/UtilForEachQueryStringParameterTest.cpp
diff --git a/test/UtilForEachQueryStringParameterTest.cpp b/test/UtilForEachQueryStringParameterTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f36b553903dc5e5f571d3508a500550a17dea646
--- /dev/null
+++ b/test/UtilForEachQueryStringParameterTest.cpp
@@ -0,0 +1,192 @@
+/*
+ * This file is part of Adblock Plus <https://adblockplus.org/>,
+ * Copyright (C) 2006-2015 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus 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 Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <cstdint>
+#include <gtest/gtest.h>
+#include "../src/shared/Utils.h"
+
+namespace
+{
+ struct ParameterHandler
Eric 2015/02/12 17:24:41 The code reads much better with this class present
sergei 2015/02/13 15:21:56 Yes, it's not possible due to compiler limitation,
Eric 2015/02/13 16:33:43 I've written such things, and you can get the loca
+ {
+ bool operator()(const std::wstring& parameter, const std::wstring& value)
+ {
+ parameters.emplace_back(parameter, value);
+ return true;
+ }
+ struct Parameter
+ {
+ Parameter(const std::wstring& name, const std::wstring& value)
+ : name(name), value(value)
+ {
+ }
+ std::wstring name;
+ std::wstring value;
+ };
+ std::vector<Parameter> parameters;
+ };
+
+ struct LimitedParameterHandler : ParameterHandler
Eric 2015/02/12 17:24:41 I think I'd prefer than ParameterHandler take the
sergei 2015/02/13 15:21:56 I thought about it when I was creating of it and d
Eric 2015/02/13 16:33:43 If we had more variation in the tests, subclassing
+ {
+ LimitedParameterHandler(uint32_t limit)
+ : callCounter(0), limit(limit)
+ {
+ }
+ bool operator()(const std::wstring& parameter, const std::wstring& value)
+ {
+ ++callCounter;
+ return shouldContinue() && ParameterHandler::operator()(parameter, value) && shouldContinue();
Eric 2015/02/12 17:24:41 No need for the first shouldContinue() call here.
sergei 2015/02/13 15:21:56 I've added it with another intention but it's fine
+ }
+ bool shouldContinue() const
+ {
+ return parameters.size() < limit;
+ }
+ uint32_t callCounter;
+ uint32_t limit;
+ };
+}
+
+TEST(ForEachQueryStringParameterTest, EmptyParameterHandler)
+{
+ ASSERT_THROW(ForEachQueryStringParameter(L"some=query&string",
+ std::function<bool(const std::wstring&, const std::wstring&)>()), std::bad_function_call);
+}
+
+TEST(ForEachQueryStringParameterTest, EmptyQueryString)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"", std::ref(parameterHandler));
Eric 2015/02/12 17:24:41 Do we need reference wrappers? It seems like would
sergei 2015/02/13 15:21:56 The tested function accepts `std::function` but we
Eric 2015/02/13 16:33:43 You may have misunderstood. I was suggesting decla
+ EXPECT_EQ(0, parameterHandler.parameters.size());
+}
+
+TEST(ForEachQueryStringParameterTest, QueryStringWithOneNormalParameter)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"param=value", std::ref(parameterHandler));
+ ASSERT_EQ(1, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"value", parameterHandler.parameters[0].value);
+}
+
+TEST(ForEachQueryStringParameterTest, QueryStringWithSeveralNormalParameters)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"param1=value1&param2=value2&param3=value3", std::ref(parameterHandler));
+ ASSERT_EQ(3, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param1", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"value1", parameterHandler.parameters[0].value);
+ EXPECT_EQ(L"param2", parameterHandler.parameters[1].name);
+ EXPECT_EQ(L"value2", parameterHandler.parameters[1].value);
+ EXPECT_EQ(L"param3", parameterHandler.parameters[2].name);
+ EXPECT_EQ(L"value3", parameterHandler.parameters[2].value);
+}
+
+TEST(ForEachQueryStringParameterTest, QueryStringWithEmptyParameterAtTheEnd)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"param=value&", std::ref(parameterHandler));
+ ASSERT_EQ(2, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"value", parameterHandler.parameters[0].value);
+ EXPECT_EQ(L"", parameterHandler.parameters[1].name);
+ EXPECT_EQ(L"", parameterHandler.parameters[1].value);
+}
+
+TEST(ForEachQueryStringParameterTest, QueryStringWithEmptyParameterAtTheBeginning)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"&param=value", std::ref(parameterHandler));
+ ASSERT_EQ(2, parameterHandler.parameters.size());
+ EXPECT_EQ(L"", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"", parameterHandler.parameters[0].value);
+ EXPECT_EQ(L"param", parameterHandler.parameters[1].name);
+ EXPECT_EQ(L"value", parameterHandler.parameters[1].value);
+}
+
+TEST(ForEachQueryStringParameterTest, ParameterWithoutAssignSign)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"param", std::ref(parameterHandler));
+ ASSERT_EQ(1, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"", parameterHandler.parameters[0].value);
+}
+
+TEST(ForEachQueryStringParameterTest, ParametersWithoutAssignSign)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"param1&param2&param3", std::ref(parameterHandler));
+ ASSERT_EQ(3, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param1", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"", parameterHandler.parameters[0].value);
+ EXPECT_EQ(L"param2", parameterHandler.parameters[1].name);
+ EXPECT_EQ(L"", parameterHandler.parameters[1].value);
+ EXPECT_EQ(L"param3", parameterHandler.parameters[2].name);
+ EXPECT_EQ(L"", parameterHandler.parameters[2].value);
+}
+
+TEST(ForEachQueryStringParameterTest, ParameterWithSeveralAssignSigns)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"param1=value1.1=value1.2", std::ref(parameterHandler));
+ ASSERT_EQ(1, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param1", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"value1.1=value1.2", parameterHandler.parameters[0].value);
+}
+
+TEST(ForEachQueryStringParameterTest, ParameterWithEmptyValue)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"param1=", std::ref(parameterHandler));
+ ASSERT_EQ(1, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param1", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"", parameterHandler.parameters[0].value);
+}
+
+TEST(ForEachQueryStringParameterTest, StopProcessingWhenHandlerReturnsFalse)
+{
+ LimitedParameterHandler parameterHandler(2);
+ ForEachQueryStringParameter(L"param1=value1&param2=value2&param3=value3", std::ref(parameterHandler));
+ EXPECT_EQ(2, parameterHandler.callCounter);
+ ASSERT_EQ(2, parameterHandler.parameters.size());
+ EXPECT_EQ(L"param1", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"value1", parameterHandler.parameters[0].value);
+ EXPECT_EQ(L"param2", parameterHandler.parameters[1].name);
+ EXPECT_EQ(L"value2", parameterHandler.parameters[1].value);
+}
+
+TEST(ForEachQueryStringParameterTest, ParameterWithoutName)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"=param", std::ref(parameterHandler));
+ ASSERT_EQ(1, parameterHandler.parameters.size());
+ EXPECT_EQ(L"", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"param", parameterHandler.parameters[0].value);
+}
+
+TEST(ForEachQueryStringParameterTest, ParametersWithoutName)
+{
+ ParameterHandler parameterHandler;
+ ForEachQueryStringParameter(L"=param1&=param2&=param3", std::ref(parameterHandler));
+ ASSERT_EQ(3, parameterHandler.parameters.size());
+ EXPECT_EQ(L"", parameterHandler.parameters[0].name);
+ EXPECT_EQ(L"param1", parameterHandler.parameters[0].value);
+ EXPECT_EQ(L"", parameterHandler.parameters[1].name);
+ EXPECT_EQ(L"param2", parameterHandler.parameters[1].value);
+ EXPECT_EQ(L"", parameterHandler.parameters[2].name);
+ EXPECT_EQ(L"param3", parameterHandler.parameters[2].value);
+}
« src/shared/Utils.cpp ('K') | « src/shared/Utils.cpp ('k') | test/UtilForEachTokenTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld