| // Copyright 2025 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_TEST_IOS_TEST_UTILS_H_ |
| #define COMPONENTS_TEST_IOS_TEST_UTILS_H_ |
| |
| #import "third_party/ocmock/OCMock/OCMock.h" |
| |
| // This file contains helpers, in order to easily uses OCMStub and OCMExpect |
| // with methods whose arguments are pointers to c++ object. It also contains |
| // helper to assign received id value to a variable. |
| // |
| // See components/test/ios/test_utils_unittests.mm for examples of how to use |
| // those helpers. |
| |
| // Expects that the i-th parameter of the invocation is equal to `expected` |
| #define andCompareObjectAtIndex(expected, index) \ |
| andDo(^(NSInvocation * invocation) { \ |
| /* Introducing an extra variable in case `expected` is "param".*/ \ |
| std::add_const_t<decltype(expected)> expected_ = (expected); \ |
| /* Not __unsafe_unretained because type is a c++ class.*/ \ |
| std::remove_reference_t<decltype(expected)>* param = nullptr; \ |
| [invocation getArgument:¶m atIndex:index + 2]; \ |
| EXPECT_EQ(*param, expected_); \ |
| }) |
| |
| // Sets `variable` to the `index`-th parameter. |
| // The type of variable must be a non-objective C value. |
| #define andAssignStructParameterToVariable(variable, index) \ |
| andDo(^(NSInvocation * invocation) { \ |
| /* Not __unsafe_unretained because type is a c++ class.*/ \ |
| [invocation getArgument:&variable atIndex:index + 2]; \ |
| }) |
| |
| // Sets `variable` to the value whose address is `index`-th parameter. |
| // The type of variable must be a non-objective C value. |
| #define andAssignStructParameterAtAddressToVariable(variable, index) \ |
| andDo(^(NSInvocation * invocation) { \ |
| /* Not __unsafe_unretained because type is a c++ class.*/ \ |
| const decltype(variable)* param = nullptr; \ |
| [invocation getArgument:¶m atIndex:index + 2]; \ |
| variable = *param; \ |
| }) |
| |
| // Sets `variable` to the NSObject value received by the API. This function |
| // should be called is a OCMExpect or OCMStub, as an argument of the |
| // mocked/stubbed function call. |
| #define AssignValueToVariable(variable) \ |
| [OCMArg checkWithBlock:^BOOL(decltype(variable) param) { \ |
| variable = param; \ |
| return YES; \ |
| }] |
| |
| // Sets `variable` to a copy of the NSObject value received by the API. This |
| // objects must be copyable. This function should be called is a OCMExpect or |
| // OCMStub, as an argument of the mocked/stubbed function call. |
| #define CopyValueToVariable(variable) \ |
| [OCMArg checkWithBlock:^BOOL(decltype(variable) param) { \ |
| variable = [param copy]; \ |
| return YES; \ |
| }] |
| |
| // Calls `block` with the `index`-th parameter. |
| // The type of the parameter must be a non-objective-C value. |
| #define andCallBlockWithParameterAtIndex(type, index, block) \ |
| andDo(^(NSInvocation * invocation) { \ |
| /* Not __unsafe_unretained because type is a c++ class.*/ \ |
| std::remove_reference_t<type>* param = nullptr; \ |
| [invocation getArgument:¶m atIndex:index + 2]; \ |
| block(param); \ |
| }) |
| |
| namespace ios::OCM { |
| // Returns a OCMArg that accepts any pointer, and can be used as argument of |
| // pointer of type T*. |
| template <typename T> |
| T* AnyPointer() { |
| return static_cast<T*>([OCMArg anyPointer]); |
| } |
| |
| } // namespace ios::OCM |
| |
| #endif // COMPONENTS_TEST_IOS_TEST_UTILS_H_ |