diff --git a/BUCK b/BUCK index e6204f035f3..516d735affd 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 00000000000..d73ca25592a --- /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