mirror of https://github.com/catchorg/Catch2.git
102 lines
3.6 KiB
C
102 lines
3.6 KiB
C
![]() |
/*
|
||
|
* Created by Phil Nash on 21/02/2017.
|
||
|
* Copyright (c) 2017 Two Blue Cubes Ltd. All rights reserved.
|
||
|
*
|
||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
*/
|
||
|
#ifndef TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED
|
||
|
#define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED
|
||
|
|
||
|
#include "catch_matchers.hpp"
|
||
|
|
||
|
namespace Catch {
|
||
|
namespace Matchers {
|
||
|
|
||
|
namespace Vector {
|
||
|
|
||
|
template<typename T>
|
||
|
struct ContainsElementMatcher : MatcherBase<std::vector<T>, T> {
|
||
|
|
||
|
ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {}
|
||
|
|
||
|
bool match(std::vector<T> const &v) const CATCH_OVERRIDE {
|
||
|
return std::find(v.begin(), v.end(), m_comparator) != v.end();
|
||
|
}
|
||
|
|
||
|
virtual std::string describe() const CATCH_OVERRIDE {
|
||
|
return "Contains: " + Catch::toString( m_comparator );
|
||
|
}
|
||
|
|
||
|
T const& m_comparator;
|
||
|
};
|
||
|
|
||
|
template<typename T>
|
||
|
struct ContainsMatcher : MatcherBase<std::vector<T>, std::vector<T> > {
|
||
|
|
||
|
ContainsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}
|
||
|
|
||
|
bool match(std::vector<T> const &v) const CATCH_OVERRIDE {
|
||
|
// !TBD: see note in EqualsMatcher
|
||
|
if (m_comparator.size() > v.size())
|
||
|
return false;
|
||
|
for (size_t i = 0; i < m_comparator.size(); ++i)
|
||
|
if (std::find(v.begin(), v.end(), m_comparator[i]) == v.end())
|
||
|
return false;
|
||
|
return true;
|
||
|
}
|
||
|
virtual std::string describe() const CATCH_OVERRIDE {
|
||
|
return "Contains: " + Catch::toString( m_comparator );
|
||
|
}
|
||
|
|
||
|
std::vector<T> const& m_comparator;
|
||
|
};
|
||
|
|
||
|
template<typename T>
|
||
|
struct EqualsMatcher : MatcherBase<std::vector<T>, std::vector<T> > {
|
||
|
|
||
|
EqualsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}
|
||
|
|
||
|
bool match(std::vector<T> const &v) const CATCH_OVERRIDE {
|
||
|
// !TBD: This currently works if all elements can be compared using !=
|
||
|
// - a more general approach would be via a compare template that defaults
|
||
|
// to using !=. but could be specialised for, e.g. std::vector<T> etc
|
||
|
// - then just call that directly
|
||
|
if (m_comparator.size() != v.size())
|
||
|
return false;
|
||
|
for (size_t i = 0; i < v.size(); ++i)
|
||
|
if (m_comparator[i] != v[i])
|
||
|
return false;
|
||
|
return true;
|
||
|
}
|
||
|
virtual std::string describe() const CATCH_OVERRIDE {
|
||
|
return "Equals: " + Catch::toString( m_comparator );
|
||
|
}
|
||
|
std::vector<T> const& m_comparator;
|
||
|
};
|
||
|
|
||
|
} // namespace Vector
|
||
|
|
||
|
// The following functions create the actual matcher objects.
|
||
|
// This allows the types to be inferred
|
||
|
|
||
|
template<typename T>
|
||
|
Vector::ContainsMatcher<T> Contains( std::vector<T> const& comparator ) {
|
||
|
return Vector::ContainsMatcher<T>( comparator );
|
||
|
}
|
||
|
|
||
|
template<typename T>
|
||
|
Vector::ContainsElementMatcher<T> VectorContains( T const& comparator ) {
|
||
|
return Vector::ContainsElementMatcher<T>( comparator );
|
||
|
}
|
||
|
|
||
|
template<typename T>
|
||
|
Vector::EqualsMatcher<T> Equals( std::vector<T> const& comparator ) {
|
||
|
return Vector::EqualsMatcher<T>( comparator );
|
||
|
}
|
||
|
|
||
|
} // namespace Matchers
|
||
|
} // namespace Catch
|
||
|
|
||
|
#endif // TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED
|