Skip to content

Commit

Permalink
introduce RCTMockDef
Browse files Browse the repository at this point in the history
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
  • Loading branch information
philIip authored and facebook-github-bot committed Nov 24, 2021
1 parent 9c5e177 commit 749a920
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
1 change: 1 addition & 0 deletions BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
58 changes: 58 additions & 0 deletions React/Base/RCTMockDef.h
Original file line number Diff line number Diff line change
@@ -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 <React/RCTDefines.h>

/* 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

0 comments on commit 749a920

Please sign in to comment.