// Copyright 2024 The Abseil Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef ABSL_STATUS_INTERNAL_STATUS_MATCHERS_H_ #define ABSL_STATUS_INTERNAL_STATUS_MATCHERS_H_ #include <ostream> // NOLINT #include <string> #include <type_traits> #include <utility> #include "gmock/gmock.h" // gmock_for_status_matchers.h #include "absl/base/config.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" namespace absl_testing { ABSL_NAMESPACE_BEGIN namespace status_internal { inline const absl::Status& GetStatus(const absl::Status& status) { … } template <typename T> inline const absl::Status& GetStatus(const absl::StatusOr<T>& status) { … } //////////////////////////////////////////////////////////// // Implementation of IsOkAndHolds(). // Monomorphic implementation of matcher IsOkAndHolds(m). StatusOrType is a // reference to StatusOr<T>. template <typename StatusOrType> class IsOkAndHoldsMatcherImpl : public ::testing::MatcherInterface<StatusOrType> { … }; // Implements IsOkAndHolds(m) as a polymorphic matcher. template <typename InnerMatcher> class IsOkAndHoldsMatcher { … }; //////////////////////////////////////////////////////////// // Implementation of StatusIs(). // `StatusCode` is implicitly convertible from `int`, `absl::StatusCode`, and // is explicitly convertible to these types as well. // // We need this class because `absl::StatusCode` (as a scoped enum) is not // implicitly convertible to `int`. In order to handle use cases like // ``` // StatusIs(Anyof(absl::StatusCode::kUnknown, absl::StatusCode::kCancelled)) // ``` // which uses polymorphic matchers, we need to unify the interfaces into // `Matcher<StatusCode>`. class StatusCode { … }; // Relational operators to handle matchers like Eq, Lt, etc.. inline bool operator==(const StatusCode& lhs, const StatusCode& rhs) { … } inline bool operator!=(const StatusCode& lhs, const StatusCode& rhs) { … } // StatusIs() is a polymorphic matcher. This class is the common // implementation of it shared by all types T where StatusIs() can be // used as a Matcher<T>. class StatusIsMatcherCommonImpl { … }; // Monomorphic implementation of matcher StatusIs() for a given type // T. T can be Status, StatusOr<>, or a reference to either of them. template <typename T> class MonoStatusIsMatcherImpl : public ::testing::MatcherInterface<T> { … }; // Implements StatusIs() as a polymorphic matcher. class StatusIsMatcher { … }; // Monomorphic implementation of matcher IsOk() for a given type T. // T can be Status, StatusOr<>, or a reference to either of them. template <typename T> class MonoIsOkMatcherImpl : public ::testing::MatcherInterface<T> { … }; // Implements IsOk() as a polymorphic matcher. class IsOkMatcher { … }; } // namespace status_internal ABSL_NAMESPACE_END } // namespace absl_testing #endif // ABSL_STATUS_INTERNAL_STATUS_MATCHERS_H_