Add hpp tests
This commit is contained in:
parent
3a7ed91a68
commit
f48b78cf20
37
cpbin.js
37
cpbin.js
|
@ -1,44 +1,9 @@
|
|||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
const { copy, exists, mkdir, rm } = require('./utils');
|
||||
const { bin } = require('.');
|
||||
|
||||
|
||||
const copy = (src, dest) => new Promise(
|
||||
(res, rej) => fs.copyFile(src, dest, err => (err ? rej(err) : res()))
|
||||
);
|
||||
|
||||
|
||||
const exists = name => new Promise(
|
||||
res => fs.access(
|
||||
name,
|
||||
fs.constants.F_OK,
|
||||
err => res(err ? false : true)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
const mkdir = async name => {
|
||||
if (await exists(name)) {
|
||||
return;
|
||||
}
|
||||
return new Promise(
|
||||
(res, rej) => fs.mkdir(name, err => (err ? rej(err) : res()))
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
const rm = async name => {
|
||||
if ( ! await exists(name) ) {
|
||||
return;
|
||||
}
|
||||
await new Promise(
|
||||
(res, rej) => fs.unlink(name, err => (err ? rej(err) : res()))
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
module.exports = async name => {
|
||||
|
||||
const srcDir = process.cwd().replace(/\\/g, '/');
|
||||
|
|
|
@ -15,23 +15,22 @@
|
|||
#define NAPI_HS Napi::HandleScope scope(env);
|
||||
|
||||
|
||||
#define JS_UNDEFINED env.Undefined()
|
||||
#define JS_NULL env.Null()
|
||||
#define JS_STR(VAL) Napi::String::New(env, VAL)
|
||||
#define JS_NUM(VAL) Napi::Number::New(env, static_cast<double>(VAL))
|
||||
#define JS_EXT(VAL) Napi::External<void>::New(env, reinterpret_cast<void*>(VAL))
|
||||
#define JS_BOOL(VAL) Napi::Boolean::New(env, static_cast<bool>(VAL))
|
||||
#define JS_FUN(VAL) Napi::Function::New(env, VAL)
|
||||
#define JS_OBJ(VAL) Napi::Object::New(env, VAL)
|
||||
|
||||
#define JS_OBJECT Napi::Object::New(env)
|
||||
#define JS_ARRAY Napi::Array::New(env)
|
||||
|
||||
#define RET_VALUE(VAL) return VAL;
|
||||
#define RET_UNDEFINED RET_VALUE(env.Undefined())
|
||||
#define RET_NULL RET_VALUE(env.Null())
|
||||
#define RET_UNDEFINED RET_VALUE(JS_UNDEFINED)
|
||||
#define RET_NULL RET_VALUE(JS_NULL)
|
||||
#define RET_STR(VAL) RET_VALUE(JS_STR(VAL))
|
||||
#define RET_NUM(VAL) RET_VALUE(JS_NUM(VAL))
|
||||
#define RET_EXT(VAL) RET_VALUE(JS_EXT(VAL))
|
||||
#define RET_BOOL(VAL) RET_VALUE(JS_BOOL(VAL))
|
||||
#define RET_FUN(VAL) RET_VALUE(JS_FUN(VAL))
|
||||
#define RET_OBJ(VAL) RET_VALUE(JS_OBJ(VAL))
|
||||
|
||||
|
||||
#define JS_THROW(VAL) \
|
||||
|
@ -160,15 +159,13 @@
|
|||
|
||||
#define REQ_EXT_ARG(I, VAR) \
|
||||
CHECK_REQ_ARG(I, IsExternal(), "Pointer"); \
|
||||
Napi::External<void> VAR = info[I].As< Napi::External<void> >();
|
||||
void *VAR = info[I].As< Napi::External<void> >().Data();
|
||||
|
||||
#define USE_EXT_ARG(I, VAR, DEF) \
|
||||
CHECK_LET_ARG(I, IsExternal(), "Pointer"); \
|
||||
Napi::External<void> VAR = IS_ARG_EMPTY(I) \
|
||||
? (DEF) \
|
||||
: info[I].As< Napi::External<void> >();
|
||||
void *VAR = IS_ARG_EMPTY(I) ? (DEF) : info[I].As< Napi::External<void> >().Data();
|
||||
|
||||
#define LET_EXT_ARG(I, VAR) USE_EXT_ARG(I, VAR, JS_EXT(nullptr))
|
||||
#define LET_EXT_ARG(I, VAR) USE_EXT_ARG(I, VAR, nullptr)
|
||||
|
||||
|
||||
#define REQ_FUN_ARG(I, VAR) \
|
||||
|
@ -188,7 +185,7 @@
|
|||
|
||||
|
||||
#define REQ_ARRV_ARG(I, VAR) \
|
||||
CHECK_REQ_ARG(I, IsArrayBuffer(), "Object"); \
|
||||
CHECK_REQ_ARG(I, IsArrayBuffer(), "ArrayBuffer"); \
|
||||
Napi::ArrayBuffer VAR = info[I].As<Napi::ArrayBuffer>();
|
||||
|
||||
|
||||
|
@ -209,12 +206,8 @@
|
|||
|
||||
|
||||
#define REQ_TYPED_ARRAY_ARG(I, VAR) \
|
||||
REQ_OBJ_ARG(I, _obj_##VAR); \
|
||||
if ( ! _obj_##VAR.IsTypedArray() ) { \
|
||||
JS_THROW("Argument " #I " must be of type `TypedArray`"); \
|
||||
RET_UNDEFINED; \
|
||||
} \
|
||||
Napi::TypedArray VAR = _obj_##VAR.As<Napi::TypedArray>();
|
||||
CHECK_REQ_ARG(I, IsTypedArray(), "TypedArray"); \
|
||||
Napi::TypedArray VAR = info[I].As<Napi::TypedArray>();
|
||||
|
||||
|
||||
#define DES_CHECK \
|
||||
|
@ -494,33 +487,6 @@ inline void eventEmitAsync(
|
|||
}
|
||||
|
||||
|
||||
inline void inheritEs5(
|
||||
Napi::Env env,
|
||||
Napi::Function ctor,
|
||||
Napi::Function superCtor
|
||||
) {
|
||||
|
||||
Napi::Object global = env.Global();
|
||||
Napi::Object globalObject = global.Get("Object").As<Napi::Object>();
|
||||
Napi::Function setProto = globalObject.Get("setPrototypeOf").As<Napi::Function>();
|
||||
Napi::Value ctorProtoProp = ctor.Get("prototype");
|
||||
Napi::Value superCtorProtoProp = superCtor.Get("prototype");
|
||||
|
||||
napi_value argv[2];
|
||||
|
||||
argv[0] = ctorProtoProp;
|
||||
argv[1] = superCtorProtoProp;
|
||||
setProto.Call(global, 2, argv);
|
||||
|
||||
argv[0] = ctor;
|
||||
argv[1] = superCtor;
|
||||
setProto.Call(global, 2, argv);
|
||||
|
||||
ctor.Set("super_", superCtor);
|
||||
|
||||
}
|
||||
|
||||
|
||||
typedef Napi::Value (*Es5MethodCallback)(const Napi::CallbackInfo& info);
|
||||
typedef Napi::Value (*Es5GetterCallback)(const Napi::CallbackInfo& info);
|
||||
typedef void (*Es5SetterCallback)(const Napi::CallbackInfo& info);
|
||||
|
@ -581,14 +547,6 @@ private: \
|
|||
_ctorEs5.SuppressDestruct(); \
|
||||
return ctor; \
|
||||
} \
|
||||
inline static Napi::Function wrap( \
|
||||
Napi::Env env, \
|
||||
Napi::Function superCtor \
|
||||
) { \
|
||||
Napi::Function ctor = wrap(env); \
|
||||
inheritEs5(env, ctor, superCtor); \
|
||||
return ctor; \
|
||||
} \
|
||||
inline static void method( \
|
||||
const char *name, \
|
||||
Es5MethodCallback cb \
|
||||
|
|
|
@ -2,13 +2,49 @@
|
|||
'targets': [
|
||||
{
|
||||
'target_name': 'test',
|
||||
'type': 'executable',
|
||||
'sources': [
|
||||
'test.cpp',
|
||||
],
|
||||
'cflags!': ['-fno-exceptions'],
|
||||
'cflags_cc!': ['-fno-exceptions'],
|
||||
'include_dirs': [
|
||||
'<!@(node -p "require(\'..\').include")',
|
||||
],
|
||||
'conditions': [
|
||||
[
|
||||
'OS=="linux"',
|
||||
{
|
||||
'defines': ['__linux__'],
|
||||
}
|
||||
],
|
||||
[
|
||||
'OS=="mac"',
|
||||
{
|
||||
'defines': ['__APPLE__'],
|
||||
}
|
||||
],
|
||||
[
|
||||
'OS=="win"',
|
||||
{
|
||||
'defines' : [
|
||||
'WIN32_LEAN_AND_MEAN',
|
||||
'VC_EXTRALEAN',
|
||||
'_WIN32',
|
||||
],
|
||||
'msvs_settings' : {
|
||||
'VCCLCompilerTool' : {
|
||||
'AdditionalOptions' : [
|
||||
'/O2','/Oy','/GL','/GF','/Gm-',
|
||||
'/EHsc','/MT','/GS','/Gy','/GR-','/Gd',
|
||||
]
|
||||
},
|
||||
'VCLinkerTool' : {
|
||||
'AdditionalOptions' : ['/OPT:REF','/OPT:ICF','/LTCG']
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
|
17615
test/catch.hpp
17615
test/catch.hpp
File diff suppressed because it is too large
Load Diff
|
@ -5,6 +5,7 @@
|
|||
"main": "mocha",
|
||||
"scripts": {
|
||||
"test": "mocha",
|
||||
"build": "node-gyp rebuild",
|
||||
"preinstall": "cd .. && npm ci"
|
||||
},
|
||||
"dependencies": {
|
||||
|
|
302
test/test.cpp
302
test/test.cpp
|
@ -1,13 +1,297 @@
|
|||
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
|
||||
#include "catch.hpp"
|
||||
#include <addon-tools.hpp>
|
||||
|
||||
unsigned int Factorial( unsigned int number ) {
|
||||
return number <= 1 ? number : Factorial(number-1)*number;
|
||||
|
||||
JS_METHOD(empty) { NAPI_ENV;
|
||||
NAPI_HS;
|
||||
return env.Undefined();
|
||||
}
|
||||
|
||||
TEST_CASE( "Factorials are computed", "[factorial]" ) {
|
||||
REQUIRE( Factorial(1) == 1 );
|
||||
REQUIRE( Factorial(2) == 2 );
|
||||
REQUIRE( Factorial(3) == 6 );
|
||||
REQUIRE( Factorial(10) == 3628800 );
|
||||
JS_METHOD(throwing) { NAPI_ENV;
|
||||
JS_THROW("Some error");
|
||||
return env.Undefined();
|
||||
}
|
||||
|
||||
JS_METHOD(retUndefined) { NAPI_ENV;
|
||||
RET_UNDEFINED;
|
||||
}
|
||||
|
||||
JS_METHOD(retNull) { NAPI_ENV;
|
||||
RET_NULL;
|
||||
}
|
||||
|
||||
JS_METHOD(retStr) { NAPI_ENV;
|
||||
RET_STR("abcdef");
|
||||
}
|
||||
|
||||
JS_METHOD(retNum) { NAPI_ENV;
|
||||
RET_NUM(12345);
|
||||
}
|
||||
|
||||
JS_METHOD(retExt) { NAPI_ENV;
|
||||
RET_EXT(nullptr);
|
||||
}
|
||||
|
||||
JS_METHOD(retBool) { NAPI_ENV;
|
||||
RET_BOOL(true);
|
||||
}
|
||||
|
||||
JS_METHOD(retObject) { NAPI_ENV;
|
||||
RET_VALUE(JS_OBJECT);
|
||||
}
|
||||
|
||||
JS_METHOD(retArray) { NAPI_ENV;
|
||||
RET_VALUE(JS_ARRAY);
|
||||
}
|
||||
|
||||
JS_METHOD(reqArgs3) { NAPI_ENV;
|
||||
REQ_ARGS(3);
|
||||
RET_BOOL(true);
|
||||
}
|
||||
|
||||
JS_METHOD(isArg0Empty) { NAPI_ENV;
|
||||
RET_BOOL(IS_ARG_EMPTY(0));
|
||||
}
|
||||
|
||||
JS_METHOD(reqStrArg) { NAPI_ENV;
|
||||
REQ_STR_ARG(0, arg);
|
||||
RET_STR(arg.c_str());
|
||||
}
|
||||
|
||||
JS_METHOD(useStrArg) { NAPI_ENV;
|
||||
USE_STR_ARG(0, arg, "default");
|
||||
RET_STR(arg.c_str());
|
||||
}
|
||||
|
||||
JS_METHOD(letStrArg) { NAPI_ENV;
|
||||
LET_STR_ARG(0, arg);
|
||||
RET_STR(arg.c_str());
|
||||
}
|
||||
|
||||
JS_METHOD(reqIntArg) { NAPI_ENV;
|
||||
REQ_INT_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useIntArg) { NAPI_ENV;
|
||||
USE_INT_ARG(0, arg, 10);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letIntArg) { NAPI_ENV;
|
||||
LET_INT_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqUintArg) { NAPI_ENV;
|
||||
REQ_UINT_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useUintArg) { NAPI_ENV;
|
||||
USE_UINT_ARG(0, arg, 10);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letUintArg) { NAPI_ENV;
|
||||
LET_UINT_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqBoolArg) { NAPI_ENV;
|
||||
REQ_BOOL_ARG(0, arg);
|
||||
RET_BOOL(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useBoolArg) { NAPI_ENV;
|
||||
USE_BOOL_ARG(0, arg, true);
|
||||
RET_BOOL(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letBoolArg) { NAPI_ENV;
|
||||
LET_BOOL_ARG(0, arg);
|
||||
RET_BOOL(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqOffsArg) { NAPI_ENV;
|
||||
REQ_OFFS_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useOffsArg) { NAPI_ENV;
|
||||
USE_OFFS_ARG(0, arg, 10);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letOffsArg) { NAPI_ENV;
|
||||
LET_OFFS_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqDoubleArg) { NAPI_ENV;
|
||||
REQ_DOUBLE_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useDoubleArg) { NAPI_ENV;
|
||||
USE_DOUBLE_ARG(0, arg, 10);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letDoubleArg) { NAPI_ENV;
|
||||
LET_DOUBLE_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqFloatArg) { NAPI_ENV;
|
||||
REQ_FLOAT_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useFloatArg) { NAPI_ENV;
|
||||
USE_FLOAT_ARG(0, arg, 10);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letFloatArg) { NAPI_ENV;
|
||||
LET_FLOAT_ARG(0, arg);
|
||||
RET_NUM(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqExtArg) { NAPI_ENV;
|
||||
REQ_EXT_ARG(0, arg);
|
||||
RET_EXT(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useExtArg) { NAPI_ENV;
|
||||
USE_EXT_ARG(0, arg, nullptr);
|
||||
RET_EXT(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letExtArg) { NAPI_ENV;
|
||||
LET_EXT_ARG(0, arg);
|
||||
RET_EXT(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqObjArg) { NAPI_ENV;
|
||||
REQ_OBJ_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useObjArg) { NAPI_ENV;
|
||||
USE_OBJ_ARG(0, arg, JS_OBJECT);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letObjArg) { NAPI_ENV;
|
||||
LET_OBJ_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqArrayArg) { NAPI_ENV;
|
||||
REQ_ARRAY_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(useArrayArg) { NAPI_ENV;
|
||||
USE_ARRAY_ARG(0, arg, JS_ARRAY);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(letArrayArg) { NAPI_ENV;
|
||||
LET_ARRAY_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqFunArg) { NAPI_ENV;
|
||||
REQ_FUN_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqArrvArg) { NAPI_ENV;
|
||||
REQ_ARRV_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqBufArg) { NAPI_ENV;
|
||||
REQ_BUF_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
JS_METHOD(reqTypedArg) { NAPI_ENV;
|
||||
REQ_TYPED_ARRAY_ARG(0, arg);
|
||||
RET_VALUE(arg);
|
||||
}
|
||||
|
||||
|
||||
#define TEST_SET_METHOD(name) \
|
||||
exports.DefineProperty( \
|
||||
Napi::PropertyDescriptor::Function(env, exports, #name, name) \
|
||||
);
|
||||
|
||||
Napi::Object init(Napi::Env env, Napi::Object exports) {
|
||||
|
||||
TEST_SET_METHOD(empty);
|
||||
TEST_SET_METHOD(throwing);
|
||||
|
||||
TEST_SET_METHOD(retUndefined);
|
||||
TEST_SET_METHOD(retNull);
|
||||
TEST_SET_METHOD(retStr);
|
||||
TEST_SET_METHOD(retNum);
|
||||
TEST_SET_METHOD(retExt);
|
||||
TEST_SET_METHOD(retBool);
|
||||
TEST_SET_METHOD(retObject);
|
||||
TEST_SET_METHOD(retArray);
|
||||
|
||||
TEST_SET_METHOD(reqArgs3);
|
||||
TEST_SET_METHOD(isArg0Empty);
|
||||
|
||||
TEST_SET_METHOD(reqStrArg);
|
||||
TEST_SET_METHOD(useStrArg);
|
||||
TEST_SET_METHOD(letStrArg);
|
||||
|
||||
TEST_SET_METHOD(reqIntArg);
|
||||
TEST_SET_METHOD(useIntArg);
|
||||
TEST_SET_METHOD(letIntArg);
|
||||
|
||||
TEST_SET_METHOD(reqUintArg);
|
||||
TEST_SET_METHOD(useUintArg);
|
||||
TEST_SET_METHOD(letUintArg);
|
||||
|
||||
TEST_SET_METHOD(reqBoolArg);
|
||||
TEST_SET_METHOD(useBoolArg);
|
||||
TEST_SET_METHOD(letBoolArg);
|
||||
|
||||
TEST_SET_METHOD(reqOffsArg);
|
||||
TEST_SET_METHOD(useOffsArg);
|
||||
TEST_SET_METHOD(letOffsArg);
|
||||
|
||||
TEST_SET_METHOD(reqDoubleArg);
|
||||
TEST_SET_METHOD(useDoubleArg);
|
||||
TEST_SET_METHOD(letDoubleArg);
|
||||
|
||||
TEST_SET_METHOD(reqFloatArg);
|
||||
TEST_SET_METHOD(useFloatArg);
|
||||
TEST_SET_METHOD(letFloatArg);
|
||||
|
||||
TEST_SET_METHOD(reqExtArg);
|
||||
TEST_SET_METHOD(useExtArg);
|
||||
TEST_SET_METHOD(letExtArg);
|
||||
|
||||
TEST_SET_METHOD(reqObjArg);
|
||||
TEST_SET_METHOD(useObjArg);
|
||||
TEST_SET_METHOD(letObjArg);
|
||||
|
||||
TEST_SET_METHOD(reqArrayArg);
|
||||
TEST_SET_METHOD(useArrayArg);
|
||||
TEST_SET_METHOD(letArrayArg);
|
||||
|
||||
TEST_SET_METHOD(reqFunArg);
|
||||
TEST_SET_METHOD(reqArrvArg);
|
||||
TEST_SET_METHOD(reqBufArg);
|
||||
TEST_SET_METHOD(reqTypedArg);
|
||||
|
||||
return exports;
|
||||
|
||||
}
|
||||
|
||||
NODE_API_MODULE(test, init)
|
||||
|
|
1224
test/test.js
1224
test/test.js
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue