10
10
#include < ReactCommon/TestCallInvoker.h>
11
11
#include < gtest/gtest.h>
12
12
#include < hermes/hermes.h>
13
+ #include < react/bridging/Promise.h>
14
+ #include < react/debug/react_native_assert.h>
13
15
#include < memory>
16
+ #include < optional>
14
17
15
18
namespace facebook ::react {
16
19
@@ -22,6 +25,76 @@ class TurboModuleTestFixture : public ::testing::Test {
22
25
jsInvoker_(std::make_shared<TestCallInvoker>(runtime_)),
23
26
module_(std::make_shared<T>(jsInvoker_, std::forward<Args>(args)...)) {}
24
27
28
+ void SetUp () override {
29
+ auto setImmediateName =
30
+ facebook::jsi::PropNameID::forAscii (*runtime_, " setImmediate" );
31
+ runtime_->global ().setProperty (
32
+ *runtime_,
33
+ setImmediateName,
34
+ facebook::jsi::Function::createFromHostFunction (
35
+ *runtime_,
36
+ setImmediateName,
37
+ 1 ,
38
+ [jsInvoker = jsInvoker_](
39
+ facebook::jsi::Runtime& rt,
40
+ [[maybe_unused]] const facebook::jsi::Value& thisVal,
41
+ const facebook::jsi::Value* args,
42
+ size_t count) {
43
+ react_native_assert (count >= 1 );
44
+ jsInvoker->invokeAsync (
45
+ [cb = std::make_shared<facebook::jsi::Value>(rt, args[0 ])](
46
+ facebook::jsi::Runtime& runtime) {
47
+ cb->asObject (runtime).asFunction (runtime).call (runtime);
48
+ });
49
+ return facebook::jsi::Value::undefined ();
50
+ }));
51
+ }
52
+
53
+ void TearDown () override {
54
+ module_ = nullptr ;
55
+ jsInvoker_ = nullptr ;
56
+ runtime_ = nullptr ;
57
+ }
58
+
59
+ template <typename TPromise>
60
+ std::optional<TPromise> resolvePromise (
61
+ const AsyncPromise<TPromise>& asyncPromise) {
62
+ auto promise = asyncPromise.get (*runtime_);
63
+ std::optional<TPromise> result = std::nullopt;
64
+ promise.getPropertyAsFunction (*runtime_, " then" )
65
+ .callWithThis (
66
+ *runtime_,
67
+ promise,
68
+ bridging::toJs (
69
+ *runtime_,
70
+ [&](TPromise value) { result = std::move (value); },
71
+ jsInvoker_));
72
+ jsInvoker_->flushQueue ();
73
+ return result;
74
+ }
75
+
76
+ template <typename TPromise>
77
+ std::optional<std::string> handleError (
78
+ const AsyncPromise<TPromise>& asyncPromise) {
79
+ auto promise = asyncPromise.get (*runtime_);
80
+ std::optional<std::string> message;
81
+ promise.getPropertyAsFunction (*runtime_, " catch" )
82
+ .callWithThis (
83
+ *runtime_,
84
+ promise,
85
+ bridging::toJs (
86
+ *runtime_,
87
+ [&](facebook::jsi::Object error) {
88
+ message = bridging::fromJs<std::string>(
89
+ *runtime_,
90
+ error.getProperty (*runtime_, " message" ),
91
+ jsInvoker_);
92
+ },
93
+ jsInvoker_));
94
+ jsInvoker_->flushQueue ();
95
+ return message;
96
+ }
97
+
25
98
protected:
26
99
std::shared_ptr<jsi::Runtime> runtime_{};
27
100
std::shared_ptr<TestCallInvoker> jsInvoker_{};
0 commit comments