Add hpp tests

This commit is contained in:
Luis Blanco 2020-03-29 20:33:41 +03:00
parent 3a7ed91a68
commit f48b78cf20
7 changed files with 1563 additions and 17722 deletions

View File

@ -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, '/');

View File

@ -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 \

View File

@ -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']
},
},
},
],
],
},
],
}

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@
"main": "mocha",
"scripts": {
"test": "mocha",
"build": "node-gyp rebuild",
"preinstall": "cd .. && npm ci"
},
"dependencies": {

View File

@ -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)

File diff suppressed because it is too large Load Diff