Skip to content

Commit c81ec7b

Browse files
Add NativeCxxModuleExampleTests
Summary: Changelog: [Internal] This adds an example of Unit Testing a C++ Turbo Module with Google GTest and also adds necessary and useful utility classes for testings This is GTEST / C++ version of the same tests added in #52477 Differential Revision: D78250302
1 parent eb31107 commit c81ec7b

File tree

2 files changed

+197
-0
lines changed

2 files changed

+197
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#pragma once
9+
10+
#include <ReactCommon/TestCallInvoker.h>
11+
#include <gtest/gtest.h>
12+
#include <hermes/hermes.h>
13+
#include <memory>
14+
15+
namespace facebook::react {
16+
17+
template <typename T>
18+
class TurboModuleTestFixture : public ::testing::Test {
19+
public:
20+
TurboModuleTestFixture()
21+
: runtime_(facebook::hermes::makeHermesRuntime()),
22+
jsInvoker_(std::make_shared<TestCallInvoker>(runtime_)),
23+
module_(std::make_shared<T>(jsInvoker_)) {}
24+
25+
protected:
26+
std::shared_ptr<jsi::Runtime> runtime_{};
27+
std::shared_ptr<TestCallInvoker> jsInvoker_{};
28+
std::shared_ptr<T> module_;
29+
};
30+
31+
} // namespace facebook::react
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#include <NativeCxxModuleExample/NativeCxxModuleExample.h>
9+
#include <ReactCommon/TestCallInvoker.h>
10+
#include <ReactCommon/TurboModuleTestFixture.h>
11+
#include <gtest/gtest.h>
12+
#include <list>
13+
#include <memory>
14+
#include <optional>
15+
#include <vector>
16+
17+
namespace facebook::react {
18+
19+
class NativeCxxModuleExampleTests
20+
: public TurboModuleTestFixture<NativeCxxModuleExample> {};
21+
22+
TEST_F(NativeCxxModuleExampleTests, GetArrayReturnsCorrectValues) {
23+
std::vector<std::optional<facebook::react::ObjectStruct>> empty;
24+
EXPECT_EQ(module_->getArray(*runtime_, empty), empty);
25+
26+
std::vector<std::optional<ObjectStruct>> withNull = {std::nullopt};
27+
EXPECT_EQ(module_->getArray(*runtime_, withNull), withNull);
28+
29+
std::vector<std::optional<ObjectStruct>> withObj = {ObjectStruct{1, "2"}};
30+
auto result = module_->getArray(*runtime_, withObj);
31+
ASSERT_EQ(result.size(), 1);
32+
EXPECT_EQ(result[0]->a, 1);
33+
EXPECT_EQ(result[0]->b, "2");
34+
}
35+
36+
TEST_F(NativeCxxModuleExampleTests, GetBoolReturnsCorrectValues) {
37+
EXPECT_FALSE(module_->getBool(*runtime_, false));
38+
EXPECT_TRUE(module_->getBool(*runtime_, true));
39+
}
40+
41+
TEST_F(NativeCxxModuleExampleTests, GetConstantsReturnsCorrectValues) {
42+
auto constants = module_->getConstants(*runtime_);
43+
EXPECT_TRUE(constants.const1);
44+
EXPECT_EQ(constants.const2, 69);
45+
EXPECT_EQ(constants.const3, "react-native");
46+
}
47+
48+
TEST_F(NativeCxxModuleExampleTests, GetCustomEnumReturnsCorrectValue) {
49+
EXPECT_EQ(
50+
module_->getCustomEnum(*runtime_, CustomEnumInt::A), CustomEnumInt::A);
51+
}
52+
53+
TEST_F(NativeCxxModuleExampleTests, GetAndConsumeCustomHostObject) {
54+
auto hostObj = module_->getCustomHostObject(*runtime_);
55+
ASSERT_NE(hostObj, nullptr);
56+
EXPECT_EQ(module_->consumeCustomHostObject(*runtime_, hostObj), "answer42");
57+
}
58+
59+
TEST_F(NativeCxxModuleExampleTests, GetBinaryTreeNodeReturnsCorrectValues) {
60+
auto result = module_->getBinaryTreeNode(
61+
*runtime_,
62+
BinaryTreeNode{
63+
.left = std::make_unique<BinaryTreeNode>(
64+
BinaryTreeNode{nullptr, 2, nullptr}),
65+
.value = 4,
66+
.right = std::make_unique<BinaryTreeNode>(
67+
BinaryTreeNode{nullptr, 6, nullptr})});
68+
ASSERT_NE(result.left, nullptr);
69+
EXPECT_EQ(result.left->value, 2);
70+
EXPECT_EQ(result.value, 4);
71+
ASSERT_NE(result.right, nullptr);
72+
EXPECT_EQ(result.right->value, 6);
73+
}
74+
75+
TEST_F(NativeCxxModuleExampleTests, GetGraphNodeReturnsCorrectValues) {
76+
GraphNode input{
77+
.label = "root",
78+
.neighbors = std::vector<GraphNode>{
79+
GraphNode{.label = "child1"}, GraphNode{.label = "child2"}}};
80+
auto result = module_->getGraphNode(*runtime_, input);
81+
EXPECT_EQ(result.label, "root");
82+
ASSERT_EQ(result.neighbors.value().size(), 4);
83+
EXPECT_EQ(result.neighbors.value()[0].label, "child1");
84+
EXPECT_EQ(result.neighbors.value()[1].label, "child2");
85+
EXPECT_EQ(result.neighbors.value()[2].label, "top");
86+
EXPECT_EQ(result.neighbors.value()[3].label, "down");
87+
}
88+
89+
TEST_F(NativeCxxModuleExampleTests, GetNumEnumReturnsCorrectValues) {
90+
EXPECT_EQ(
91+
module_->getNumEnum(*runtime_, NativeCxxModuleExampleEnumInt::IA),
92+
NativeCxxModuleExampleEnumInt::IA);
93+
EXPECT_EQ(
94+
module_->getNumEnum(*runtime_, NativeCxxModuleExampleEnumInt::IB),
95+
NativeCxxModuleExampleEnumInt::IB);
96+
}
97+
98+
TEST_F(NativeCxxModuleExampleTests, GetStrEnumReturnsCorrectValues) {
99+
EXPECT_EQ(
100+
module_->getStrEnum(*runtime_, NativeCxxModuleExampleEnumNone::NA),
101+
NativeCxxModuleExampleEnumStr::SB);
102+
EXPECT_EQ(
103+
module_->getStrEnum(*runtime_, NativeCxxModuleExampleEnumNone::NB),
104+
NativeCxxModuleExampleEnumStr::SB);
105+
}
106+
107+
TEST_F(NativeCxxModuleExampleTests, GetMapReturnsCorrectValues) {
108+
std::map<std::string, std::optional<int32_t>> input = {
109+
{"a", 0}, {"b", std::nullopt}, {"c", 3}};
110+
auto result = module_->getMap(*runtime_, input);
111+
EXPECT_EQ(result["a"], 0);
112+
EXPECT_EQ(result["b"], std::nullopt);
113+
EXPECT_EQ(result["c"], 3);
114+
}
115+
116+
TEST_F(NativeCxxModuleExampleTests, GetNumberReturnsCorrectValues) {
117+
EXPECT_EQ(module_->getNumber(*runtime_, 0), 0);
118+
EXPECT_EQ(module_->getNumber(*runtime_, pow(2, 53)), pow(2, 53));
119+
}
120+
121+
TEST_F(NativeCxxModuleExampleTests, GetObjectReturnsCorrectValues) {
122+
ObjectStruct input1{2, "two"};
123+
auto result1 = module_->getObject(*runtime_, input1);
124+
EXPECT_EQ(result1.a, 2);
125+
EXPECT_EQ(result1.b, "two");
126+
ObjectStruct input2{4, "four", "seven"};
127+
auto result2 = module_->getObject(*runtime_, input2);
128+
EXPECT_EQ(result2.a, 4);
129+
EXPECT_EQ(result2.b, "four");
130+
EXPECT_EQ(result2.c, "seven");
131+
}
132+
133+
TEST_F(NativeCxxModuleExampleTests, GetSetReturnsCorrectValues) {
134+
std::set<float> input = {1, 2, 3, 3, 3};
135+
auto result = module_->getSet(*runtime_, input);
136+
EXPECT_EQ(result.size(), 3);
137+
EXPECT_TRUE(result.count(1));
138+
EXPECT_TRUE(result.count(2));
139+
EXPECT_TRUE(result.count(3));
140+
}
141+
142+
TEST_F(NativeCxxModuleExampleTests, GetStringReturnsCorrectValues) {
143+
EXPECT_EQ(module_->getString(*runtime_, ""), "");
144+
EXPECT_EQ(module_->getString(*runtime_, "string"), "string");
145+
}
146+
147+
TEST_F(NativeCxxModuleExampleTests, GetValueReturnsCorrectValues) {
148+
ObjectStruct z{4, "four", "seven"};
149+
auto result = module_->getValue(*runtime_, 23, "forty-two", z);
150+
EXPECT_EQ(result.x, 23);
151+
EXPECT_EQ(result.y, "forty-two");
152+
EXPECT_EQ(result.z.a, 4);
153+
EXPECT_EQ(result.z.b, "four");
154+
EXPECT_EQ(result.z.c, "seven");
155+
}
156+
157+
TEST_F(
158+
NativeCxxModuleExampleTests,
159+
GetWithWithOptionalArgsReturnsCorrectValues) {
160+
EXPECT_EQ(
161+
module_->getWithWithOptionalArgs(*runtime_, std::nullopt), std::nullopt);
162+
EXPECT_EQ(module_->getWithWithOptionalArgs(*runtime_, true), true);
163+
EXPECT_EQ(module_->getWithWithOptionalArgs(*runtime_, false), false);
164+
}
165+
166+
} // namespace facebook::react

0 commit comments

Comments
 (0)