blob: f2f82853e4e39458ceb3422449ee7f131627f69c [file] [log] [blame]
// 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 "sync/notifier/object_id_invalidation_map_test_util.h"
#include <algorithm>
#include "base/basictypes.h"
namespace syncer {
using ::testing::MakeMatcher;
using ::testing::MatchResultListener;
using ::testing::Matcher;
using ::testing::MatcherInterface;
using ::testing::PrintToString;
namespace {
class ObjectIdInvalidationMapEqMatcher
: public MatcherInterface<const ObjectIdInvalidationMap&> {
public:
explicit ObjectIdInvalidationMapEqMatcher(
const ObjectIdInvalidationMap& expected);
virtual bool MatchAndExplain(const ObjectIdInvalidationMap& actual,
MatchResultListener* listener) const;
virtual void DescribeTo(::std::ostream* os) const;
virtual void DescribeNegationTo(::std::ostream* os) const;
private:
const ObjectIdInvalidationMap expected_;
DISALLOW_COPY_AND_ASSIGN(ObjectIdInvalidationMapEqMatcher);
};
ObjectIdInvalidationMapEqMatcher::ObjectIdInvalidationMapEqMatcher(
const ObjectIdInvalidationMap& expected) : expected_(expected) {
}
bool ObjectIdInvalidationMapEqMatcher::MatchAndExplain(
const ObjectIdInvalidationMap& actual,
MatchResultListener* listener) const {
ObjectIdInvalidationMap expected_only;
ObjectIdInvalidationMap actual_only;
typedef std::pair<invalidation::ObjectId,
std::pair<Invalidation, Invalidation> >
ValueDifference;
std::vector<ValueDifference> value_differences;
std::set_difference(expected_.begin(), expected_.end(),
actual.begin(), actual.end(),
std::inserter(expected_only, expected_only.begin()),
expected_.value_comp());
std::set_difference(actual.begin(), actual.end(),
expected_.begin(), expected_.end(),
std::inserter(actual_only, actual_only.begin()),
actual.value_comp());
for (ObjectIdInvalidationMap::const_iterator it = expected_.begin();
it != expected_.end(); ++it) {
ObjectIdInvalidationMap::const_iterator find_it =
actual.find(it->first);
if (find_it != actual.end() &&
!Matches(Eq(it->second))(find_it->second)) {
value_differences.push_back(std::make_pair(
it->first, std::make_pair(it->second, find_it->second)));
}
}
if (expected_only.empty() && actual_only.empty() && value_differences.empty())
return true;
bool printed_header = false;
if (!actual_only.empty()) {
*listener << " which has these unexpected elements: "
<< PrintToString(actual_only);
printed_header = true;
}
if (!expected_only.empty()) {
*listener << (printed_header ? ",\nand" : "which")
<< " doesn't have these expected elements: "
<< PrintToString(expected_only);
printed_header = true;
}
if (!value_differences.empty()) {
*listener << (printed_header ? ",\nand" : "which")
<< " differ in the following values: "
<< PrintToString(value_differences);
}
return false;
}
void ObjectIdInvalidationMapEqMatcher::DescribeTo(::std::ostream* os) const {
*os << " is equal to " << PrintToString(expected_);
}
void ObjectIdInvalidationMapEqMatcher::DescribeNegationTo
(::std::ostream* os) const {
*os << " isn't equal to " << PrintToString(expected_);
}
} // namespace
Matcher<const ObjectIdInvalidationMap&> Eq(
const ObjectIdInvalidationMap& expected) {
return MakeMatcher(new ObjectIdInvalidationMapEqMatcher(expected));
}
} // namespace syncer