blob: c10300dc71643dbff10dc7dc73b34c9617efb4ed [file] [log] [blame]
#include "buffer.h"
#include "napi.h"
using namespace Napi;
namespace test_buffer {
uint16_t testData[testLength];
int finalizeCount = 0;
} // namespace test_buffer
using namespace test_buffer;
namespace {
Value CreateBuffer(const CallbackInfo& info) {
Buffer<uint16_t> buffer = Buffer<uint16_t>::New(info.Env(), testLength);
if (buffer.Length() != testLength) {
Error::New(info.Env(), "Incorrect buffer length.")
.ThrowAsJavaScriptException();
return Value();
}
InitData(buffer.Data(), testLength);
return buffer;
}
Value CreateExternalBuffer(const CallbackInfo& info) {
finalizeCount = 0;
Buffer<uint16_t> buffer =
Buffer<uint16_t>::New(info.Env(), testData, testLength);
if (buffer.Length() != testLength) {
Error::New(info.Env(), "Incorrect buffer length.")
.ThrowAsJavaScriptException();
return Value();
}
if (buffer.Data() != testData) {
Error::New(info.Env(), "Incorrect buffer data.")
.ThrowAsJavaScriptException();
return Value();
}
InitData(testData, testLength);
return buffer;
}
Value CreateExternalBufferWithFinalize(const CallbackInfo& info) {
finalizeCount = 0;
uint16_t* data = new uint16_t[testLength];
Buffer<uint16_t> buffer = Buffer<uint16_t>::New(
info.Env(), data, testLength, [](Env /*env*/, uint16_t* finalizeData) {
delete[] finalizeData;
finalizeCount++;
});
if (buffer.Length() != testLength) {
Error::New(info.Env(), "Incorrect buffer length.")
.ThrowAsJavaScriptException();
return Value();
}
if (buffer.Data() != data) {
Error::New(info.Env(), "Incorrect buffer data.")
.ThrowAsJavaScriptException();
return Value();
}
InitData(data, testLength);
return buffer;
}
Value CreateExternalBufferWithFinalizeHint(const CallbackInfo& info) {
finalizeCount = 0;
uint16_t* data = new uint16_t[testLength];
char* hint = nullptr;
Buffer<uint16_t> buffer = Buffer<uint16_t>::New(
info.Env(),
data,
testLength,
[](Env /*env*/, uint16_t* finalizeData, char* /*finalizeHint*/) {
delete[] finalizeData;
finalizeCount++;
},
hint);
if (buffer.Length() != testLength) {
Error::New(info.Env(), "Incorrect buffer length.")
.ThrowAsJavaScriptException();
return Value();
}
if (buffer.Data() != data) {
Error::New(info.Env(), "Incorrect buffer data.")
.ThrowAsJavaScriptException();
return Value();
}
InitData(data, testLength);
return buffer;
}
Value CreateBufferCopy(const CallbackInfo& info) {
InitData(testData, testLength);
Buffer<uint16_t> buffer =
Buffer<uint16_t>::Copy(info.Env(), testData, testLength);
if (buffer.Length() != testLength) {
Error::New(info.Env(), "Incorrect buffer length.")
.ThrowAsJavaScriptException();
return Value();
}
if (buffer.Data() == testData) {
Error::New(info.Env(), "Copy should have different memory.")
.ThrowAsJavaScriptException();
return Value();
}
if (!VerifyData(buffer.Data(), buffer.Length())) {
Error::New(info.Env(), "Copy data is incorrect.")
.ThrowAsJavaScriptException();
return Value();
}
return buffer;
}
#include "buffer_new_or_copy-inl.h"
void CheckBuffer(const CallbackInfo& info) {
if (!info[0].IsBuffer()) {
Error::New(info.Env(), "A buffer was expected.")
.ThrowAsJavaScriptException();
return;
}
Buffer<uint16_t> buffer = info[0].As<Buffer<uint16_t>>();
if (buffer.Length() != testLength) {
Error::New(info.Env(), "Incorrect buffer length.")
.ThrowAsJavaScriptException();
return;
}
if (!VerifyData(buffer.Data(), testLength)) {
Error::New(info.Env(), "Incorrect buffer data.")
.ThrowAsJavaScriptException();
return;
}
}
Value GetFinalizeCount(const CallbackInfo& info) {
return Number::New(info.Env(), finalizeCount);
}
} // end anonymous namespace
Object InitBuffer(Env env) {
Object exports = Object::New(env);
exports["createBuffer"] = Function::New(env, CreateBuffer);
exports["createExternalBuffer"] = Function::New(env, CreateExternalBuffer);
exports["createExternalBufferWithFinalize"] =
Function::New(env, CreateExternalBufferWithFinalize);
exports["createExternalBufferWithFinalizeHint"] =
Function::New(env, CreateExternalBufferWithFinalizeHint);
exports["createOrCopyExternalBuffer"] =
Function::New(env, CreateOrCopyExternalBuffer);
exports["createOrCopyExternalBufferWithFinalize"] =
Function::New(env, CreateOrCopyExternalBufferWithFinalize);
exports["createOrCopyExternalBufferWithFinalizeHint"] =
Function::New(env, CreateOrCopyExternalBufferWithFinalizeHint);
exports["createBufferCopy"] = Function::New(env, CreateBufferCopy);
exports["checkBuffer"] = Function::New(env, CheckBuffer);
exports["getFinalizeCount"] = Function::New(env, GetFinalizeCount);
return exports;
}