forked from Tencent/ScriptX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCustomConverterTest.cc
73 lines (57 loc) · 2.31 KB
/
CustomConverterTest.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
* Tencent is pleased to support the open source community by making ScriptX available.
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include "test.h"
using CustomType = void*;
// ScriptX 本身不支持这个类型
// static_assert(!script::converter::isConvertible<CustomType>);
// 增加一个把 void* 指针 转成 Local<Value> 的转换算法:中间使用string来承载。
// 1. 要定义在 script::converter namespace下
namespace script::converter {
template <>
struct Converter<CustomType, void> {
// convert custom type T to Local<Value>
static Local<Value> toScript(CustomType value) {
return String::newString(std::to_string(reinterpret_cast<int64_t>(value)));
}
// convert Local<Value> to custom type T
static CustomType toCpp(const Local<Value>& value) {
return reinterpret_cast<void*>(std::stoll(value.asString().toString()));
}
};
} // namespace script::converter
namespace script::test {
DEFINE_ENGINE_TEST(CustomConverterTest);
TEST_F(CustomConverterTest, CustomConverter) {
EngineScope scope(engine);
bool called = false;
// 0. converter::isConvertible 现在是true
static_assert(converter::isConvertible<CustomType>);
static_assert(!converter::isConvertible<int*>);
// 1. 允许使用CustomType作为参数和返回值
auto func = Function::newFunction([](CustomType ptr) -> CustomType {
*static_cast<bool*>(ptr) = true;
return ptr;
});
// 2. 允许使用CustomType来调用函数
auto ret = func.call({}, static_cast<CustomType>(&called));
EXPECT_TRUE(called);
ASSERT_TRUE(ret.isString());
auto pointerString = std::to_string(reinterpret_cast<int64_t>(&called));
EXPECT_EQ(ret.asString().toString(), pointerString);
}
} // namespace script::test