Common Built-In Container Matchers in GoogleTest: ElementsAre, UnorderedElementsAre, and More
GoogleTest provides seven built-in container matchers—including ElementsAre, UnorderedElementsAre, IsSubsetOf, and UnorderedPointwise—that enable precise, order-aware or order-agnostic validation of STL containers and custom ranges without writing explicit iteration logic.
The GoogleTest framework (via Google Mock) ships with a comprehensive matching library defined primarily in googlemock/include/gmock/gmock-matchers.h. These built-in container matchers allow developers to write declarative assertions about vector, list, map, and set contents directly in unit tests using the testing:: namespace.
Ordered Element Matching
When you need to verify that a container contains specific elements in an exact sequence, GoogleTest provides matchers that check both the values and their positions.
ElementsAre
The ElementsAre matcher verifies that a container has exactly the given number of elements in order and that each element matches the supplied sub-matchers. According to the google/googletest source code, this is implemented in [gmock-matchers.h at line 3653](https://github.com/google/googletest/blob/main/googlemock/include/gmock/gmock-matchers.h#L3653).
std::vector<int> v{1, 2, 3};
EXPECT_THAT(v, ElementsAre(1, 2, 3)); // Passes
EXPECT_THAT(v, ElementsAre(3, 2, 1)); // Fails: wrong order
ElementsAreArray
ElementsAreArray functions identically to ElementsAre but accepts an iterator range or initializer list of matchers. As implemented in the same header at line 4606, it creates a copy of the matcher sequence before performing the match, ensuring stability during comparison.
std::vector<int> v{1, 2, 3};
EXPECT_THAT(v, ElementsAreArray({1, 2, 3})); // Uses initializer list
Unordered Container Matchers
For containers where element position is irrelevant, GoogleTest offers matchers that verify contents regardless of sequence.
UnorderedElementsAre
The UnorderedElementsAre matcher checks that a container contains the given elements in any order, with all supplied matchers satisfied exactly once. The implementation at line 4150 handles the permutation logic internally.
std::vector<std::string> fruits{"apple", "banana", "cherry"};
EXPECT_THAT(fruits, UnorderedElementsAre("cherry", "banana", "apple")); // Passes
UnorderedElementsAreArray
Similar to its ordered counterpart, UnorderedElementsAreArray accepts an iterator range or initializer list. Found at line 4205, this matcher is useful when the expected values are stored in a separate container.
std::vector<std::string> actual{"banana", "apple"};
std::vector<std::string> expected{"apple", "banana"};
EXPECT_THAT(actual, UnorderedElementsAreArray(expected));
Set Relationship Matchers
GoogleTest includes matchers for verifying subset and superset relationships without requiring manual container intersection logic.
IsSubsetOf
IsSubsetOf asserts that every element of the actual container appears in the expected container, ignoring order and allowing extra elements in the expected set. The implementation resides at line 5326.
std::vector<int> actual{1, 3, 5};
EXPECT_THAT(actual, IsSubsetOf(1, 3, 5, 7, 9)); // Passes: actual ⊆ expected
IsSupersetOf
Conversely, IsSupersetOf verifies that the actual container contains all elements of the expected container (again ignoring order). This matcher is located at line 5366.
std::vector<int> actual{5, 1, 3, 9};
EXPECT_THAT(actual, IsSupersetOf(1, 3, 5)); // Passes: actual ⊇ expected
Advanced Container Matching
UnorderedPointwise
The UnorderedPointwise matcher verifies a one-to-one correspondence between two containers where the order of the actual container is irrelevant. Each pair of elements is matched by a supplied binary matcher. As noted in the source at line 4251, this is internally built on UnorderedElementsAreArray.
using ::testing::Pair;
std::map<int, std::string> actual{{1, "one"}, {2, "two"}};
EXPECT_THAT(actual, UnorderedPointwise(Pair(), std::vector<std::pair<int, std::string>>{{2, "two"}, {1, "one"}}));
Complete Usage Examples
The following example demonstrates practical applications of the primary GoogleTest container matchers in a single test suite:
#include <gmock/gmock.h>
using ::testing::ElementsAre;
using ::testing::ElementsAreArray;
using ::testing::UnorderedElementsAre;
using ::testing::UnorderedElementsAreArray;
using ::testing::IsSubsetOf;
using ::testing::IsSupersetOf;
TEST(ContainerMatchersDemo, OrderedElements) {
std::vector<int> v{1, 2, 3};
EXPECT_THAT(v, ElementsAre(1, 2, 3)); // exact order required
EXPECT_THAT(v, ElementsAreArray({1, 2, 3})); // same using initializer list
}
TEST(ContainerMatchersDemo, UnorderedElements) {
std::vector<std::string> v{"apple", "banana", "cherry"};
EXPECT_THAT(v, UnorderedElementsAre("cherry", "banana", "apple"));
EXPECT_THAT(v, UnorderedElementsAreArray({"banana", "apple", "cherry"}));
}
TEST(ContainerMatchersDemo, SubsetAndSuperset) {
std::vector<int> actual{5, 1, 3, 9};
EXPECT_THAT(actual, IsSubsetOf(1, 3, 5, 7, 9)); // actual ⊆ expected
EXPECT_THAT(actual, IsSupersetOf(1, 3, 5, 9)); // actual ⊇ expected
}
Implementation and Testing
The container matcher logic is centralized in the Google Mock subsystem. The primary definitions reside in:
googlemock/include/gmock/gmock-matchers.h: Contains the template classes andElementsAre,UnorderedElementsAre,IsSubsetOf, andUnorderedPointwiseimplementations referenced above.googlemock/src/gmock-matchers.cc: Provides the underlying matching logic, description generation, and failure message formatting.googlemock/test/gmock-matchers-containers_test.cc: Validates all container matcher behaviors against STL containers and edge cases.
These files constitute the core of GoogleTest's container validation capabilities and are maintained under the google/googletest repository.
Summary
- Use
ElementsArewhen container order matters and you need exact positional matching. - Use
UnorderedElementsArewhen verifying contents without regard to sequence. - Use
IsSubsetOfandIsSupersetOfto validate containment relationships without manual set operations. - Use
UnorderedPointwisefor element-by-element comparison using custom binary matchers on unordered data. - Include
gmock/gmock.hto access thetesting::namespace where all container matchers reside.
Frequently Asked Questions
How do I check if a vector contains specific elements in any order?
Use the UnorderedElementsAre matcher. It verifies that all supplied matchers match distinct elements in the container, regardless of their positions. This is defined in gmock-matchers.h at line 4150 and handles permutation matching automatically.
What is the difference between ElementsAre and ElementsAreArray?
ElementsAre accepts a variadic list of matchers directly, while ElementsAreArray accepts an iterator range or initializer list. According to the source at line 4606, ElementsAreArray creates a copy of the matcher sequence before matching, making it safer when the expected values are stored in a container that might be modified.
Can I verify that one container is a subset of another?
Yes. Use the IsSubsetOf matcher, which checks that every element in the actual container exists in the expected container. The implementation at line 5326 ignores order and allows the expected container to contain additional elements not present in the actual container.
Do these matchers work with custom container types?
Yes. All built-in container matchers in GoogleTest work with any container that supports begin() and end() iterators, including custom range types. The matchers use template-based duck typing rather than requiring specific STL interfaces, as evidenced by the generic implementations in gmock-matchers.h.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →