Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4297)

Unified Diff: chrome/browser/extensions/api/declarative/substring_set_matcher_unittest.cc

Issue 9390018: Implementation of a Matching strategy for URLs in the Declarative WebRequest API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: MSVC does not support EXPECT_NE on iterators Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/declarative/substring_set_matcher_unittest.cc
diff --git a/chrome/browser/extensions/api/declarative/substring_set_matcher_unittest.cc b/chrome/browser/extensions/api/declarative/substring_set_matcher_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0dc4a92bd74fe03f10b3ffdc6a52e63bde7a3d3f
--- /dev/null
+++ b/chrome/browser/extensions/api/declarative/substring_set_matcher_unittest.cc
@@ -0,0 +1,160 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/declarative/substring_set_matcher.h"
+
+#include <set>
+#include <string>
+#include <vector>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+using namespace extensions;
+
+TEST(SubstringSetMatcherTest, SubstringPattern) {
+ SubstringPattern r1("Test", 2);
+ EXPECT_EQ("Test", r1.pattern());
+ EXPECT_EQ(2, r1.id());
+
+ EXPECT_FALSE(r1 < r1);
+ SubstringPattern r2("Test", 3);
+ EXPECT_TRUE(r1 < r2);
+ SubstringPattern r3("ZZZZ", 2);
+ EXPECT_TRUE(r1 < r3);
+}
+
+namespace {
+void TestOnePattern(const std::string& test_string,
+ const std::string& pattern,
+ bool is_match) {
+ std::vector<const SubstringPattern*> patterns;
+ SubstringPattern substring_pattern(pattern, 1);
+ patterns.push_back(&substring_pattern);
+ SubstringSetMatcher matcher;
+ matcher.RegisterPatterns(patterns);
+ std::set<int> matches;
+ matcher.Match(test_string, &matches);
+
+ size_t expected_matches = (is_match ? 1 : 0);
+ EXPECT_EQ(expected_matches, matches.size());
+ EXPECT_EQ(is_match, matches.find(1) != matches.end());
+}
+
+void TestTwoPatterns(const std::string& test_string,
+ const std::string& pattern_1,
+ const std::string& pattern_2,
+ bool is_match_1,
+ bool is_match_2) {
+ SubstringPattern substring_pattern_1(pattern_1, 1);
+ SubstringPattern substring_pattern_2(pattern_2, 2);
+ // In order to make sure that the order in which patterns are registered
+ // does not make any difference we try both permutations.
+ for (int permutation = 0; permutation < 2; ++permutation) {
+ std::vector<const SubstringPattern*> patterns;
+ if (permutation == 0) {
+ patterns.push_back(&substring_pattern_1);
+ patterns.push_back(&substring_pattern_2);
+ } else {
+ patterns.push_back(&substring_pattern_2);
+ patterns.push_back(&substring_pattern_1);
+ }
+ SubstringSetMatcher matcher;
+ matcher.RegisterPatterns(patterns);
+ std::set<int> matches;
+ matcher.Match(test_string, &matches);
+
+ size_t expected_matches = (is_match_1 ? 1 : 0) + (is_match_2 ? 1 : 0);
+ EXPECT_EQ(expected_matches, matches.size());
+ EXPECT_EQ(is_match_1, matches.find(1) != matches.end());
+ EXPECT_EQ(is_match_2, matches.find(2) != matches.end());
+ }
+}
+}
+
+TEST(SubstringSetMatcherTest, TestMatcher) {
+ // Test overlapping patterns
+ // String abcde
+ // Pattern 1 bc
+ // Pattern 2 cd
+ TestTwoPatterns("abcde", "bc", "cd", true, true);
+
+ // Test subpatterns - part 1
+ // String abcde
+ // Pattern 1 bc
+ // Pattern 2 b
+ TestTwoPatterns("abcde", "bc", "b", true, true);
+
+ // Test subpatterns - part 2
+ // String abcde
+ // Pattern 1 bc
+ // Pattern 2 c
+ TestTwoPatterns("abcde", "bc", "c", true, true);
+
+ // Test identical matches
+ // String abcde
+ // Pattern 1 abcde
+ TestOnePattern("abcde", "abcde", true);
+
+ // Test multiple matches
+ // String aaaaa
+ // Pattern 1 a
+ TestOnePattern("abcde", "a", true);
+
+ // Test matches at beginning and end
+ // String abcde
+ // Pattern 1 ab
+ // Pattern 2 de
+ TestTwoPatterns("abcde", "ab", "de", true, true);
+
+ // Test duplicate patterns with different IDs
+ // String abcde
+ // Pattern 1 bc
+ // Pattern 2 bc
+ TestTwoPatterns("abcde", "bc", "bc", true, true);
+
+ // Test non-match
+ // String abcde
+ // Pattern 1 fg
+ TestOnePattern("abcde", "fg", false);
+
+ // Test empty pattern and too long pattern
+ // String abcde
+ // Pattern 1
+ // Pattern 2 abcdef
+ TestTwoPatterns("abcde", "", "abcdef", true, false);
+}
+
+TEST(SubstringSetMatcherTest, RegisterAndRemove) {
+ SubstringSetMatcher matcher;
+
+ SubstringPattern pattern_1("a", 1);
+ SubstringPattern pattern_2("b", 2);
+ SubstringPattern pattern_3("c", 3);
+
+ std::vector<const SubstringPattern*> patterns;
+ patterns.push_back(&pattern_1);
+ matcher.RegisterPatterns(patterns);
+
+ patterns.clear();
+ patterns.push_back(&pattern_2);
+ patterns.push_back(&pattern_3);
+ matcher.RegisterPatterns(patterns);
+
+ std::set<int> matches;
+ matcher.Match("abd", &matches);
+ EXPECT_EQ(2u, matches.size());
+ EXPECT_TRUE(matches.end() != matches.find(1));
+ EXPECT_TRUE(matches.end() != matches.find(2));
+
+ patterns.clear();
+ patterns.push_back(&pattern_2);
+ matcher.UnregisterPatterns(patterns);
+
+ matches.clear();
+ matcher.Match("abd", &matches);
+ EXPECT_EQ(1u, matches.size());
+ EXPECT_TRUE(matches.end() != matches.find(1));
+ EXPECT_TRUE(matches.end() == matches.find(2));
+}
+

Powered by Google App Engine
This is Rietveld 408576698