From 749a9207b6f0545c03ca83efbda7971ffd4d2d57 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Tue, 23 Nov 2021 22:32:40 -0800 Subject: [PATCH] introduce RCTMockDef Summary: here's a way we can mock C apis - however i am not sure if the flag i'm using is correct used in D31949237 Changelog: [General][Added] - add macros to be able to stub C functions in tests Reviewed By: RSNara Differential Revision: D31949238 fbshipit-source-id: 0f18a65f810f1b855dbc844f11f5a304c1e5ecea --- BUCK | 1 + React/Base/RCTMockDef.h | 58 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 React/Base/RCTMockDef.h diff --git a/BUCK b/BUCK index e6204f035f37c4..516d735affdac7 100644 --- a/BUCK +++ b/BUCK @@ -253,6 +253,7 @@ REACT_PUBLIC_HEADERS = { "React/RCTLayoutAnimationGroup.h": RCTMODULES_PATH + "RCTLayoutAnimationGroup.h", "React/RCTLog.h": RCTBASE_PATH + "RCTLog.h", "React/RCTManagedPointer.h": RCTBASE_PATH + "RCTManagedPointer.h", + "React/RCTMockDef.h": RCTBASE_PATH + "RCTMockDef.h", "React/RCTModalHostViewController.h": RCTVIEWS_PATH + "RCTModalHostViewController.h", "React/RCTModalHostViewManager.h": RCTVIEWS_PATH + "RCTModalHostViewManager.h", "React/RCTModalManager.h": RCTVIEWS_PATH + "RCTModalManager.h", diff --git a/React/Base/RCTMockDef.h b/React/Base/RCTMockDef.h new file mode 100644 index 00000000000000..d73ca25592ae38 --- /dev/null +++ b/React/Base/RCTMockDef.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +/* These macros are used to stub C functions. Here's an example: + * + * Helpers.h + * ------ + * boolean ReturnsTrueOrFalse(void); + * + * FileToBeTested.h + * ------ + * RCT_MOCK_DEF(Testing, ReturnsTrueOrFalse); + * #define ReturnsTrueOrFalse RCT_MOCK_USE(Testing, ReturnsTrueOrFalse) + * + * int FunctionToBeTested(int input) { + * return ReturnsTrueOrFalse() ? input + 1 : input - 1; + * } + * + * Test.h + * ----- + * RCT_MOCK_GET(Testing, ReturnsTrueOrFalse); + * + * boolean _ReturnsTrue(void) { return true; } + * boolean _ReturnsFalse(void) { return false; } + * + * void TestFunctionTrue(void) { + * RCT_MOCK_SET(Testing, ReturnsTrueOrFalse, _ReturnsTrue); + * assert(FunctionToBeTested(5) == 6); + * RCT_MOCK_RESET(Testing, ReturnsTrueOrFalse); + * } + * + * void TestFunctionFalse(void) { + * RCT_MOCK_SET(Testing, ReturnsTrueOrFalse, _ReturnsFalse); + * assert(FunctionToBeTested(5) == 4); + * RCT_MOCK_RESET(Testing, ReturnsTrueOrFalse); + * } + * + */ + +#ifdef RCT_DEV + #define RCT_MOCK_DEF(context, api) __typeof(__typeof(api) *) mockptr_ ## context ## _ ## api = &api; + #define RCT_MOCK_REF(context, api) extern __typeof(__typeof(api) *) mockptr_ ## context ## _ ## api; + #define RCT_MOCK_SET(context, api, mockapi) (mockptr_ ## context ## _ ## api = &mockapi) + #define RCT_MOCK_RESET(context, api) (mockptr_ ## context ## _ ## api = &api) + #define RCT_MOCK_USE(context, api) (*mockptr_ ## context ## _ ## api) +#else + #define RCT_MOCK_DEF(context, api) + #define RCT_MOCK_REF(context, api) + #define RCT_MOCK_SET(context, api, mockapi) + #define RCT_MOCK_RESET(context, api) + #define RCT_MOCK_USE(context, api) api +#endif