Files
ark_js_runtime/ecmascript/napi/test/jsnapi_tests.cpp
T
wengchangcheng 96a03dc5e5 fix length error of Chainese char
Signed-off-by: wengchangcheng <wengchangcheng@huawei.com>
2021-10-14 21:36:56 +08:00

632 lines
22 KiB
C++

/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* 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 "ecmascript/tests/test_helper.h"
#include <cstddef>
#include "ecmascript/ecma_vm.h"
#include "ecmascript/js_thread.h"
#include "ecmascript/napi/include/jsnapi.h"
#include "ecmascript/object_factory.h"
using namespace panda;
using namespace panda::ecmascript;
namespace panda::test {
class JSNApiTests : public testing::Test {
public:
static void SetUpTestCase()
{
GTEST_LOG_(INFO) << "SetUpTestCase";
}
static void TearDownTestCase()
{
GTEST_LOG_(INFO) << "TearDownCase";
}
void SetUp() override
{
RuntimeOption option;
option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
vm_ = JSNApi::CreateJSVM(option);
ASSERT_TRUE(vm_ != nullptr) << "Cannot create Runtime";
thread_ = vm_->GetJSThread();
thread_->SetIsEcmaInterpreter(true);
vm_->GetFactory()->SetTriggerGc(true);
}
void TearDown() override
{
vm_->GetFactory()->SetTriggerGc(false);
JSNApi::DestoryJSVM(vm_);
}
protected:
JSThread *thread_ = nullptr;
EcmaVM *vm_ = nullptr;
};
Local<JSValueRef> FunctionCallback(EcmaVM *vm, Local<JSValueRef>, const Local<JSValueRef> *, int32_t length, void *)
{
EscapeLocalScope scope(vm);
return scope.Escape(ArrayRef::New(vm, length));
}
void ThreadCheck(const EcmaVM *vm)
{
EXPECT_TRUE(vm->GetJSThread()->GetThreadId() != JSThread::GetCurrentThreadId());
}
HWTEST_F_L0(JSNApiTests, GetGlobalObject)
{
LocalScope scope(vm_);
Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_);
ASSERT_FALSE(globalObject.IsEmpty());
ASSERT_TRUE(globalObject->IsObject());
}
HWTEST_F_L0(JSNApiTests, ThreadIdCheck)
{
EXPECT_TRUE(vm_->GetJSThread()->GetThreadId() == JSThread::GetCurrentThreadId());
std::thread testThread(ThreadCheck, vm_);
testThread.join();
}
HWTEST_F_L0(JSNApiTests, RegisterFunction)
{
LocalScope scope(vm_);
Local<FunctionRef> callback = FunctionRef::New(vm_, FunctionCallback, nullptr);
ASSERT_TRUE(!callback.IsEmpty());
std::vector<Local<JSValueRef>> arguments;
arguments.emplace_back(JSValueRef::Undefined(vm_));
Local<JSValueRef> result =
callback->Call(vm_, JSValueRef::Undefined(vm_), arguments.data(), arguments.size());
ASSERT_TRUE(result->IsArray(vm_));
Local<ArrayRef> array(result);
ASSERT_EQ(array->Length(vm_), arguments.size());
}
HWTEST_F_L0(JSNApiTests, GetProperty)
{
LocalScope scope(vm_);
Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_);
ASSERT_FALSE(globalObject.IsEmpty());
ASSERT_TRUE(globalObject->IsObject());
Local<ObjectRef> key = StringRef::NewFromUtf8(vm_, "Number");
Local<ObjectRef> property = globalObject->Get(vm_, key);
ASSERT_TRUE(property->IsFunction());
}
HWTEST_F_L0(JSNApiTests, SetProperty)
{
LocalScope scope(vm_);
Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_);
ASSERT_FALSE(globalObject.IsEmpty());
ASSERT_TRUE(globalObject->IsObject());
Local<ArrayRef> property = ArrayRef::New(vm_, 3); // 3 : length
ASSERT_TRUE(property->IsArray(vm_));
ASSERT_EQ(property->Length(vm_), 3); // 3 : test case of input
Local<ObjectRef> key = StringRef::NewFromUtf8(vm_, "Test");
bool result = globalObject->Set(vm_, key, property);
ASSERT_TRUE(result);
Local<ObjectRef> propertyGet = globalObject->Get(vm_, key);
ASSERT_TRUE(propertyGet->IsArray(vm_));
ASSERT_EQ(Local<ArrayRef>(propertyGet)->Length(vm_), 3); // 3 : test case of input
}
HWTEST_F_L0(JSNApiTests, JsonParser)
{
LocalScope scope(vm_);
Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_);
ASSERT_FALSE(globalObject.IsEmpty());
ASSERT_TRUE(globalObject->IsObject());
const char *const test{R"({"orientation": "portrait"})"};
Local<ObjectRef> jsonString = StringRef::NewFromUtf8(vm_, test);
Local<JSValueRef> result = JSON::Parse(vm_, jsonString);
ASSERT_TRUE(result->IsObject());
Local<ObjectRef> keyString = StringRef::NewFromUtf8(vm_, "orientation");
Local<JSValueRef> property = Local<ObjectRef>(result)->Get(vm_, keyString);
ASSERT_TRUE(property->IsString());
}
HWTEST_F_L0(JSNApiTests, StrictEqual)
{
LocalScope scope(vm_);
Local<StringRef> origin = StringRef::NewFromUtf8(vm_, "1");
Local<StringRef> target1 = StringRef::NewFromUtf8(vm_, "1");
Local<NumberRef> target = NumberRef::New(vm_, 1);
ASSERT_FALSE(origin->IsStrictEquals(vm_, target));
ASSERT_TRUE(origin->IsStrictEquals(vm_, target1));
}
HWTEST_F_L0(JSNApiTests, InstanceOf)
{
LocalScope scope(vm_);
Local<FunctionRef> target = FunctionRef::New(vm_, nullptr, nullptr);
Local<ArrayRef> origin = ArrayRef::New(vm_, 1);
ASSERT_FALSE(origin->InstanceOf(vm_, target));
}
HWTEST_F_L0(JSNApiTests, TypeOf)
{
LocalScope scope(vm_);
Local<StringRef> origin = StringRef::NewFromUtf8(vm_, "1");
Local<StringRef> typeString = origin->Typeof(vm_);
ASSERT_EQ(typeString->ToString(), "string");
Local<NumberRef> target = NumberRef::New(vm_, 1);
typeString = target->Typeof(vm_);
ASSERT_EQ(typeString->ToString(), "number");
}
HWTEST_F_L0(JSNApiTests, Symbol)
{
LocalScope scope(vm_);
Local<StringRef> description = StringRef::NewFromUtf8(vm_, "test");
Local<SymbolRef> symbol = SymbolRef::New(vm_, description);
ASSERT_FALSE(description->IsSymbol());
ASSERT_TRUE(symbol->IsSymbol());
}
HWTEST_F_L0(JSNApiTests, StringUtf8_001)
{
LocalScope scope(vm_);
std::string test = "Hello world";
Local<StringRef> testString = StringRef::NewFromUtf8(vm_, test.c_str());
EXPECT_TRUE(testString->Utf8Length() == 12); // 12 : length of testString("Hello World")
char buffer[12]; // 12 : length of testString
EXPECT_TRUE(testString->WriteUtf8(buffer, 12) == 12); // 12 : length of testString("Hello World")
std::string res(buffer);
ASSERT_EQ(res, test);
}
HWTEST_F_L0(JSNApiTests, StringUtf8_002)
{
LocalScope scope(vm_);
std::string test = "";
Local<StringRef> testString = StringRef::NewFromUtf8(vm_, test.c_str());
EXPECT_TRUE(testString->Utf8Length() == 4); // 4 : length of testString("年")
char buffer[4]; // 4 : length of testString
EXPECT_TRUE(testString->WriteUtf8(buffer, 4) == 4); // 4 : length of testString("年")
std::string res(buffer);
ASSERT_EQ(res, test);
}
HWTEST_F_L0(JSNApiTests, ToType)
{
LocalScope scope(vm_);
Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123.3");
Local<JSValueRef> toValue(toString);
ASSERT_EQ(toString->ToNumber(vm_)->Value(), -123.3); // -123 : test case of input
ASSERT_EQ(toString->ToBoolean(vm_)->Value(), true);
ASSERT_EQ(toValue->ToString(vm_)->ToString(), "-123.3");
ASSERT_TRUE(toValue->ToObject(vm_)->IsObject());
}
HWTEST_F_L0(JSNApiTests, TypeValue)
{
LocalScope scope(vm_);
Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123");
Local<JSValueRef> toValue(toString);
ASSERT_EQ(toString->Int32Value(vm_), -123); // -123 : test case of input
ASSERT_EQ(toString->BooleaValue(), true);
ASSERT_EQ(toString->Uint32Value(vm_), 4294967173); // 4294967173 : test case of input
ASSERT_EQ(toString->IntegerValue(vm_), -123); // -123 : test case of input
}
HWTEST_F_L0(JSNApiTests, DefineProperty)
{
LocalScope scope(vm_);
Local<ObjectRef> object = ObjectRef::New(vm_);
Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey");
Local<JSValueRef> value = ObjectRef::New(vm_);
PropertyAttribute attribute(value, true, true, true);
ASSERT_TRUE(object->DefineProperty(vm_, key, attribute));
Local<JSValueRef> value1 = object->Get(vm_, key);
ASSERT_TRUE(value->IsStrictEquals(vm_, value1));
}
HWTEST_F_L0(JSNApiTests, HasProperty)
{
LocalScope scope(vm_);
Local<ObjectRef> object = ObjectRef::New(vm_);
Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey");
Local<JSValueRef> value = ObjectRef::New(vm_);
PropertyAttribute attribute(value, true, true, true);
ASSERT_TRUE(object->DefineProperty(vm_, key, attribute));
ASSERT_TRUE(object->Has(vm_, key));
}
HWTEST_F_L0(JSNApiTests, DeleteProperty)
{
LocalScope scope(vm_);
Local<ObjectRef> object = ObjectRef::New(vm_);
Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey");
Local<JSValueRef> value = ObjectRef::New(vm_);
PropertyAttribute attribute(value, true, true, true);
ASSERT_TRUE(object->DefineProperty(vm_, key, attribute));
ASSERT_TRUE(object->Delete(vm_, key));
ASSERT_FALSE(object->Has(vm_, key));
}
HWTEST_F_L0(JSNApiTests, GetProtoType)
{
LocalScope scope(vm_);
Local<FunctionRef> function = FunctionRef::New(vm_, nullptr, nullptr);
Local<JSValueRef> protoType = function->GetPrototype(vm_);
ASSERT_TRUE(protoType->IsObject());
Local<FunctionRef> object = ObjectRef::New(vm_);
protoType = object->GetPrototype(vm_);
ASSERT_TRUE(protoType->IsObject());
}
void CheckReject(EcmaVM *, Local<JSValueRef>, const Local<JSValueRef> argv[], int32_t length, void *)
{
ASSERT_EQ(length, 1);
Local<JSValueRef> reason = argv[0];
ASSERT_TRUE(reason->IsString());
ASSERT_EQ(Local<StringRef>(reason)->ToString(), "Reject");
}
Local<JSValueRef> RejectCallback(EcmaVM *vm, Local<JSValueRef> thisArg, const Local<JSValueRef> argv[], int32_t length,
void *data)
{
LocalScope scope(vm);
CheckReject(vm, thisArg, argv, length, data);
return JSValueRef::Undefined(vm);
}
HWTEST_F_L0(JSNApiTests, PromiseCatch)
{
LocalScope scope(vm_);
Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm_);
Local<PromiseRef> promise = capability->GetPromise(vm_);
Local<FunctionRef> reject = FunctionRef::New(vm_, RejectCallback, nullptr);
Local<PromiseRef> catchPromise = promise->Catch(vm_, reject);
ASSERT_TRUE(promise->IsPromise());
ASSERT_TRUE(catchPromise->IsPromise());
Local<StringRef> reason = StringRef::NewFromUtf8(vm_, "Reject");
ASSERT_TRUE(capability->Reject(vm_, reason));
vm_->ExecutePromisePendingJob();
}
void CheckResolve(EcmaVM *, Local<JSValueRef>, const Local<JSValueRef> argv[], int32_t length, void *)
{
ASSERT_EQ(length, 1);
Local<JSValueRef> value = argv[0];
ASSERT_TRUE(value->IsNumber());
ASSERT_EQ(Local<NumberRef>(value)->Value(), 300.3); // 300.3 : test case of input
}
Local<JSValueRef> ResolvedCallback(EcmaVM *vm, Local<JSValueRef> thisArg, const Local<JSValueRef> argv[],
int32_t length, void *data)
{
LocalScope scope(vm);
CheckResolve(vm, thisArg, argv, length, data);
return JSValueRef::Undefined(vm);
}
HWTEST_F_L0(JSNApiTests, PromiseThen)
{
LocalScope scope(vm_);
Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm_);
Local<PromiseRef> promise = capability->GetPromise(vm_);
Local<FunctionRef> resolve = FunctionRef::New(vm_, ResolvedCallback, nullptr);
Local<FunctionRef> reject = FunctionRef::New(vm_, RejectCallback, nullptr);
Local<PromiseRef> thenPromise = promise->Then(vm_, resolve, reject);
ASSERT_TRUE(promise->IsPromise());
ASSERT_TRUE(thenPromise->IsPromise());
Local<StringRef> value = NumberRef::New(vm_, 300.3); // 300.3 : test case of input
ASSERT_TRUE(capability->Resolve(vm_, value));
vm_->ExecutePromisePendingJob();
}
HWTEST_F_L0(JSNApiTests, Constructor)
{
LocalScope scope(vm_);
Local<ObjectRef> object = JSNApi::GetGlobalObject(vm_);
Local<StringRef> key = StringRef::NewFromUtf8(vm_, "Number");
Local<FunctionRef> numberConstructor = object->Get(vm_, key);
Local<JSValueRef> argv[1];
argv[0] = NumberRef::New(vm_, 1.3); // 1.3 : test case of input
Local<JSValueRef> result = numberConstructor->Constructor(vm_, argv, 1);
ASSERT_TRUE(result->IsObject());
ASSERT_EQ(result->ToNumber(vm_)->Value(), 1.3); // 1.3 : size of arguments
}
HWTEST_F_L0(JSNApiTests, ArrayBuffer)
{
LocalScope scope(vm_);
const int32_t length = 15;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
ASSERT_EQ(arrayBuffer->ByteLength(vm_), length);
ASSERT_NE(arrayBuffer->GetBuffer(), nullptr);
JSNApi::TriggerGC(vm_);
}
HWTEST_F_L0(JSNApiTests, ArrayBufferWithBuffer)
{
static bool isFree = false;
struct Data {
int32_t length;
};
const int32_t length = 15;
Data *data = new Data();
data->length = length;
Deleter deleter = [](void *buffer, void *data) -> void {
delete[] reinterpret_cast<uint8_t *>(buffer);
Data *currentData = reinterpret_cast<Data *>(data);
ASSERT_EQ(currentData->length, 15); // 5 : size of arguments
delete currentData;
isFree = true;
};
{
LocalScope scope(vm_);
uint8_t *buffer = new uint8_t[length]();
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, buffer, length, deleter, data);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
ASSERT_EQ(arrayBuffer->ByteLength(vm_), length);
ASSERT_EQ(arrayBuffer->GetBuffer(), buffer);
}
JSNApi::TriggerGC(vm_);
ASSERT_TRUE(isFree);
}
HWTEST_F_L0(JSNApiTests, DataView)
{
LocalScope scope(vm_);
const int32_t length = 15;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
JSNApi::TriggerGC(vm_);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 5 : offset of byte, 7 : length
Local<DataViewRef> dataView = DataViewRef::New(vm_, arrayBuffer, 5, 7);
ASSERT_TRUE(dataView->IsDataView());
ASSERT_EQ(dataView->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
ASSERT_EQ(dataView->ByteLength(), 7); // 7 : size of arguments
ASSERT_EQ(dataView->ByteOffset(), 5); // 5 : size of arguments
// 5 : offset of byte, 11 : length
dataView = DataViewRef::New(vm_, arrayBuffer, 5, 11);
ASSERT_TRUE(dataView->IsException());
}
HWTEST_F_L0(JSNApiTests, Int8Array)
{
LocalScope scope(vm_);
const int32_t length = 15;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 5 : offset of byte, 6 : length
Local<Int8ArrayRef> typedArray = Int8ArrayRef::New(vm_, arrayBuffer, 5, 6);
ASSERT_TRUE(typedArray->IsInt8Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 6); // 6 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 5); // 5 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Uint8Array)
{
LocalScope scope(vm_);
const int32_t length = 15;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 5 : offset of byte, 6 : length
Local<Uint8ArrayRef> typedArray = Uint8ArrayRef::New(vm_, arrayBuffer, 5, 6);
ASSERT_TRUE(typedArray->IsUint8Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 6); // 6 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 5); // 5 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Uint8ClampedArray)
{
LocalScope scope(vm_);
const int32_t length = 15;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 5 : offset of byte, 6 : length
Local<Uint8ClampedArrayRef> typedArray = Uint8ClampedArrayRef::New(vm_, arrayBuffer, 5, 6);
ASSERT_TRUE(typedArray->IsUint8ClampedArray());
ASSERT_EQ(typedArray->ByteLength(vm_), 6); // 6 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 5); // 5 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Int16Array)
{
LocalScope scope(vm_);
const int32_t length = 30;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 4 : offset of byte, 6 : length
Local<Int16ArrayRef> typedArray = Int16ArrayRef::New(vm_, arrayBuffer, 4, 6);
ASSERT_TRUE(typedArray->IsInt16Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 12); // 12 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 4); // 4 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Uint16Array)
{
LocalScope scope(vm_);
const int32_t length = 30;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 4 : offset of byte, 6 : length
Local<Uint16ArrayRef> typedArray = Uint16ArrayRef::New(vm_, arrayBuffer, 4, 6);
ASSERT_TRUE(typedArray->IsUint16Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 12); // 12 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 4); // 4 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Uint32Array)
{
LocalScope scope(vm_);
const int32_t length = 30;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 4 : offset of byte, 6 : length
Local<Uint32ArrayRef> typedArray = Uint32ArrayRef::New(vm_, arrayBuffer, 4, 6);
ASSERT_TRUE(typedArray->IsUint32Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 24); // 24 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 4); // 4 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Int32Array)
{
LocalScope scope(vm_);
const int32_t length = 30;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 4 : offset of byte, 6 : length
Local<Int32ArrayRef> typedArray = Int32ArrayRef::New(vm_, arrayBuffer, 4, 6);
ASSERT_TRUE(typedArray->IsInt32Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 24); // 24 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 4); // 4 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Float32Array)
{
LocalScope scope(vm_);
const int32_t length = 30;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 4 : offset of byte, 6 : length
Local<Float32ArrayRef> typedArray = Float32ArrayRef::New(vm_, arrayBuffer, 4, 6);
ASSERT_TRUE(typedArray->IsFloat32Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 24); // 24 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 4); // 4 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Float64Array)
{
LocalScope scope(vm_);
const int32_t length = 57;
Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
ASSERT_TRUE(arrayBuffer->IsArrayBuffer());
// 8 : offset of byte, 6 : length
Local<Float64ArrayRef> typedArray = Float64ArrayRef::New(vm_, arrayBuffer, 8, 6);
ASSERT_TRUE(typedArray->IsFloat64Array());
ASSERT_EQ(typedArray->ByteLength(vm_), 48); // 48 : length of bytes
ASSERT_EQ(typedArray->ByteOffset(vm_), 8); // 8 : offset of byte
ASSERT_EQ(typedArray->ArrayLength(vm_), 6); // 6 : length of array
ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(), arrayBuffer->GetBuffer());
}
HWTEST_F_L0(JSNApiTests, Error)
{
LocalScope scope(vm_);
Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest");
Local<JSValueRef> error = Exception::Error(vm_, message);
ASSERT_TRUE(error->IsError());
JSNApi::ThrowException(vm_, error);
ASSERT_TRUE(thread_->HasPendingException());
}
HWTEST_F_L0(JSNApiTests, RangeError)
{
LocalScope scope(vm_);
Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest");
Local<JSValueRef> error = Exception::RangeError(vm_, message);
ASSERT_TRUE(error->IsError());
JSNApi::ThrowException(vm_, error);
ASSERT_TRUE(thread_->HasPendingException());
}
HWTEST_F_L0(JSNApiTests, TypeError)
{
LocalScope scope(vm_);
Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest");
Local<JSValueRef> error = Exception::TypeError(vm_, message);
ASSERT_TRUE(error->IsError());
JSNApi::ThrowException(vm_, error);
ASSERT_TRUE(thread_->HasPendingException());
}
HWTEST_F_L0(JSNApiTests, ReferenceError)
{
LocalScope scope(vm_);
Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest");
Local<JSValueRef> error = Exception::ReferenceError(vm_, message);
ASSERT_TRUE(error->IsError());
JSNApi::ThrowException(vm_, error);
ASSERT_TRUE(thread_->HasPendingException());
}
HWTEST_F_L0(JSNApiTests, SyntaxError)
{
LocalScope scope(vm_);
Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest");
Local<JSValueRef> error = Exception::SyntaxError(vm_, message);
ASSERT_TRUE(error->IsError());
JSNApi::ThrowException(vm_, error);
ASSERT_TRUE(thread_->HasPendingException());
}
} // namespace panda::test