1// Copyright 2013 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 "components/dom_distiller/core/dom_distiller_test_util.h"
6
7#include "components/dom_distiller/core/dom_distiller_store.h"
8#include "components/dom_distiller/core/fake_distiller.h"
9
10using leveldb_proto::test::FakeDB;
11
12namespace dom_distiller {
13namespace test {
14namespace util {
15
16namespace {
17
18std::vector<ArticleEntry> EntryMapToList(
19    const FakeDB<ArticleEntry>::EntryMap& entries) {
20  std::vector<ArticleEntry> entry_list;
21  for (FakeDB<ArticleEntry>::EntryMap::const_iterator it = entries.begin();
22       it != entries.end(); ++it) {
23    entry_list.push_back(it->second);
24  }
25  return entry_list;
26}
27}  // namespace
28
29ObserverUpdatesMatcher::ObserverUpdatesMatcher(
30    const std::vector<DomDistillerObserver::ArticleUpdate>& expected_updates)
31    : expected_updates_(expected_updates) {}
32
33bool ObserverUpdatesMatcher::MatchAndExplain(
34    const std::vector<DomDistillerObserver::ArticleUpdate>& actual_updates,
35    testing::MatchResultListener* listener) const {
36  if (actual_updates.size() != expected_updates_.size()) {
37    *listener << "Incorrect number of updates. Expected: "
38              << expected_updates_.size() << " got: " << actual_updates.size();
39    return false;
40  }
41  std::vector<DomDistillerObserver::ArticleUpdate>::const_iterator expected,
42      actual;
43  for (expected = expected_updates_.begin(), actual = actual_updates.begin();
44       expected != expected_updates_.end(); ++expected, ++actual) {
45    if (expected->entry_id != actual->entry_id) {
46      *listener << " Mismatched entry id. Expected: " << expected->entry_id
47                << " actual: " << actual->entry_id;
48      return false;
49    }
50    if (expected->update_type != actual->update_type) {
51      *listener << " Mismatched update for entryid:" << expected->entry_id
52                << ". Expected: " << expected->update_type
53                << " actual: " << actual->update_type;
54      return false;
55    }
56  }
57  return true;
58}
59
60void ObserverUpdatesMatcher::DescribeUpdates(std::ostream* os) const {
61  bool start = true;
62  for (std::vector<DomDistillerObserver::ArticleUpdate>::const_iterator i =
63           expected_updates_.begin();
64       i != expected_updates_.end(); ++i) {
65    if (start) {
66      start = false;
67    } else {
68      *os << ", ";
69    }
70    *os << "( EntryId: " << i->entry_id << ", UpdateType: " << i->update_type
71        << " )";
72  }
73}
74
75void ObserverUpdatesMatcher::DescribeTo(std::ostream* os) const {
76  *os << " has updates: { ";
77  DescribeUpdates(os);
78  *os << "}";
79}
80void ObserverUpdatesMatcher::DescribeNegationTo(std::ostream* os) const {
81  *os << " does not have updates: { ";
82  DescribeUpdates(os);
83  *os << "}";
84}
85
86testing::Matcher<const std::vector<DomDistillerObserver::ArticleUpdate>&>
87HasExpectedUpdates(
88    const std::vector<DomDistillerObserver::ArticleUpdate>& expected_updates) {
89  return testing::MakeMatcher(new ObserverUpdatesMatcher(expected_updates));
90}
91
92// static
93DomDistillerStore* CreateStoreWithFakeDB(
94    FakeDB<ArticleEntry>* fake_db,
95    const FakeDB<ArticleEntry>::EntryMap& store_model) {
96  return new DomDistillerStore(
97      scoped_ptr<leveldb_proto::ProtoDatabase<ArticleEntry> >(fake_db),
98      EntryMapToList(store_model), FakeDB<ArticleEntry>::DirectoryForTestDB());
99}
100
101}  // namespace util
102}  // namespace test
103}  // namespace dom_distiller
104