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
7#include "components/content_settings/core/browser/content_settings_rule.h"
8#include "components/content_settings/core/common/content_settings_pattern.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace content_settings {
12
13namespace {
14
15class ListIterator : public RuleIterator {
16 public:
17  explicit ListIterator(const std::list<Rule>& rules)
18      : rules_(rules) {}
19
20  virtual ~ListIterator() {}
21
22  virtual bool HasNext() const OVERRIDE {
23    return !rules_.empty();
24  }
25
26  virtual Rule Next() OVERRIDE {
27    EXPECT_FALSE(rules_.empty());
28    // |front()| returns a reference but we're going to discard the object
29    // referred to; force copying here.
30    Rule rule = rules_.front();
31    rules_.pop_front();
32    return rule;
33  }
34
35 private:
36  std::list<Rule> rules_;
37};
38
39}  // namespace
40
41TEST(RuleTest, ConcatenationIterator) {
42  std::list<Rule> rules1;
43  rules1.push_back(Rule(ContentSettingsPattern::FromString("a"),
44                        ContentSettingsPattern::Wildcard(),
45                        new base::FundamentalValue(0)));
46  rules1.push_back(Rule(ContentSettingsPattern::FromString("b"),
47                        ContentSettingsPattern::Wildcard(),
48                        new base::FundamentalValue(0)));
49  std::list<Rule> rules2;
50  rules2.push_back(Rule(ContentSettingsPattern::FromString("c"),
51                        ContentSettingsPattern::Wildcard(),
52                        new base::FundamentalValue(0)));
53  rules2.push_back(Rule(ContentSettingsPattern::FromString("d"),
54                        ContentSettingsPattern::Wildcard(),
55                        new base::FundamentalValue(0)));
56
57  ScopedVector<RuleIterator> iterators;
58  iterators.push_back(new ListIterator(rules1));
59  iterators.push_back(new ListIterator(rules2));
60  ConcatenationIterator concatenation_iterator(&iterators, NULL);
61
62  Rule rule;
63  ASSERT_TRUE(concatenation_iterator.HasNext());
64  rule = concatenation_iterator.Next();
65  EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("a"));
66
67  ASSERT_TRUE(concatenation_iterator.HasNext());
68  rule = concatenation_iterator.Next();
69  EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("b"));
70
71  ASSERT_TRUE(concatenation_iterator.HasNext());
72  rule = concatenation_iterator.Next();
73  EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("c"));
74
75  ASSERT_TRUE(concatenation_iterator.HasNext());
76  rule = concatenation_iterator.Next();
77  EXPECT_EQ(rule.primary_pattern, ContentSettingsPattern::FromString("d"));
78
79  EXPECT_FALSE(concatenation_iterator.HasNext());
80}
81
82}  // namespace content_settings
83