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,75 @@ 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
+ jsi::PropNameID::forAscii (*runtime_, " setImmediate" );
31
+ runtime_->global ().setProperty (
32
+ *runtime_,
33
+ setImmediateName,
34
+ jsi::Function::createFromHostFunction (
35
+ *runtime_,
36
+ setImmediateName,
37
+ 1 ,
38
+ [jsInvoker = jsInvoker_](
39
+ jsi::Runtime& rt,
40
+ [[maybe_unused]] const jsi::Value& thisVal,
41
+ const jsi::Value* args,
42
+ size_t count) {
43
+ react_native_assert (count >= 1 );
44
+ jsInvoker->invokeAsync ([cb = std::make_shared<jsi::Value>(
45
+ rt, args[0 ])](jsi::Runtime& rt) {
46
+ cb->asObject (rt).asFunction (rt).call (rt);
47
+ });
48
+ return jsi::Value::undefined ();
49
+ }));
50
+ }
51
+
52
+ void TearDown () override {
53
+ module_ = nullptr ;
54
+ jsInvoker_ = nullptr ;
55
+ runtime_ = nullptr ;
56
+ }
57
+
58
+ template <typename TPromise>
59
+ std::optional<TPromise> resolvePromise (
60
+ const AsyncPromise<TPromise>& asyncPromise) {
61
+ auto promise = asyncPromise.get (*runtime_);
62
+ std::optional<TPromise> result = std::nullopt;
63
+ promise.getPropertyAsFunction (*runtime_, " then" )
64
+ .callWithThis (
65
+ *runtime_,
66
+ promise,
67
+ bridging::toJs (
68
+ *runtime_,
69
+ [&](TPromise value) { result = std::move (value); },
70
+ jsInvoker_));
71
+ jsInvoker_->flushQueue ();
72
+ return result;
73
+ }
74
+
75
+ template <typename TPromise>
76
+ std::optional<std::string> handleError (
77
+ const AsyncPromise<TPromise>& asyncPromise) {
78
+ auto promise = asyncPromise.get (*runtime_);
79
+ std::optional<std::string> message;
80
+ promise.getPropertyAsFunction (*runtime_, " catch" )
81
+ .callWithThis (
82
+ *runtime_,
83
+ promise,
84
+ bridging::toJs (
85
+ *runtime_,
86
+ [&](jsi::Object error) {
87
+ message = bridging::fromJs<std::string>(
88
+ *runtime_,
89
+ error.getProperty (*runtime_, " message" ),
90
+ jsInvoker_);
91
+ },
92
+ jsInvoker_));
93
+ jsInvoker_->flushQueue ();
94
+ return message;
95
+ }
96
+
25
97
protected:
26
98
std::shared_ptr<jsi::Runtime> runtime_{};
27
99
std::shared_ptr<TestCallInvoker> jsInvoker_{};
0 commit comments