1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <list>
6 #include <utility>
7 #include <vector>
8 
9 #include "components/content_settings/core/browser/content_settings_rule.h"
10 #include "components/content_settings/core/common/content_settings_pattern.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
13 namespace content_settings {
14 
15 namespace {
16 
17 class ListIterator : public RuleIterator {
18  public:
ListIterator(std::list<Rule> rules)19   explicit ListIterator(std::list<Rule> rules) : rules_(std::move(rules)) {}
20 
~ListIterator()21   ~ListIterator() override {}
22 
HasNext() const23   bool HasNext() const override { return !rules_.empty(); }
24 
Next()25   Rule Next() override {
26     EXPECT_FALSE(rules_.empty());
27     Rule rule = std::move(rules_.front());
28     rules_.pop_front();
29     return rule;
30   }
31 
32  private:
33   std::list<Rule> rules_;
34 };
35 
36 }  // namespace
37 
TEST(RuleTest,ConcatenationIterator)38 TEST(RuleTest, ConcatenationIterator) {
39   std::list<Rule> rules1;
40   rules1.push_back(Rule(ContentSettingsPattern::FromString("a"),
41                         ContentSettingsPattern::Wildcard(), base::Value(0)));
42   rules1.push_back(Rule(ContentSettingsPattern::FromString("b"),
43                         ContentSettingsPattern::Wildcard(), base::Value(0)));
44   std::list<Rule> rules2;
45   rules2.push_back(Rule(ContentSettingsPattern::FromString("c"),
46                         ContentSettingsPattern::Wildcard(), base::Value(0)));
47   rules2.push_back(Rule(ContentSettingsPattern::FromString("d"),
48                         ContentSettingsPattern::Wildcard(), base::Value(0)));
49 
50   std::vector<std::unique_ptr<RuleIterator>> iterators;
51   iterators.push_back(std::make_unique<ListIterator>(std::move(rules1)));
52   iterators.push_back(std::make_unique<ListIterator>(std::move(rules2)));
53   ConcatenationIterator concatenation_iterator(std::move(iterators), nullptr);
54 
55   Rule rule;
56   ASSERT_TRUE(concatenation_iterator.HasNext());
57   rule = concatenation_iterator.Next();
58   EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("a"));
59 
60   ASSERT_TRUE(concatenation_iterator.HasNext());
61   rule = concatenation_iterator.Next();
62   EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("b"));
63 
64   ASSERT_TRUE(concatenation_iterator.HasNext());
65   rule = concatenation_iterator.Next();
66   EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("c"));
67 
68   ASSERT_TRUE(concatenation_iterator.HasNext());
69   rule = concatenation_iterator.Next();
70   EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("d"));
71 
72   EXPECT_FALSE(concatenation_iterator.HasNext());
73 }
74 
75 }  // namespace content_settings
76