133eb0b6dSopenharmony_ci/*
233eb0b6dSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
333eb0b6dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
433eb0b6dSopenharmony_ci * you may not use this file except in compliance with the License.
533eb0b6dSopenharmony_ci * You may obtain a copy of the License at
633eb0b6dSopenharmony_ci *
733eb0b6dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
833eb0b6dSopenharmony_ci *
933eb0b6dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1033eb0b6dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1133eb0b6dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1233eb0b6dSopenharmony_ci * See the License for the specific language governing permissions and
1333eb0b6dSopenharmony_ci * limitations under the License.
1433eb0b6dSopenharmony_ci */
1533eb0b6dSopenharmony_ci
1633eb0b6dSopenharmony_ci#include "demo_javascript_class.h"
1733eb0b6dSopenharmony_ci
1833eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassConstructor(napi_env env, napi_callback_info info);
1933eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassAdd(napi_env env, napi_callback_info info);
2033eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassSub(napi_env env, napi_callback_info info);
2133eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassMul(napi_env env, napi_callback_info info);
2233eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassDiv(napi_env env, napi_callback_info info);
2333eb0b6dSopenharmony_ci
2433eb0b6dSopenharmony_cienum TestEnum {
2533eb0b6dSopenharmony_ci    ONE = 0,
2633eb0b6dSopenharmony_ci    TWO,
2733eb0b6dSopenharmony_ci    THREE,
2833eb0b6dSopenharmony_ci    FOUR
2933eb0b6dSopenharmony_ci};
3033eb0b6dSopenharmony_ci
3133eb0b6dSopenharmony_ci/*
3233eb0b6dSopenharmony_ci * Class Init
3333eb0b6dSopenharmony_ci */
3433eb0b6dSopenharmony_civoid DemoJavascriptClassInit(napi_env env, napi_value exports)
3533eb0b6dSopenharmony_ci{
3633eb0b6dSopenharmony_ci    napi_value one = nullptr;
3733eb0b6dSopenharmony_ci    napi_value two = nullptr;
3833eb0b6dSopenharmony_ci    napi_value three = nullptr;
3933eb0b6dSopenharmony_ci    napi_value four = nullptr;
4033eb0b6dSopenharmony_ci
4133eb0b6dSopenharmony_ci    napi_create_int32(env, TestEnum::ONE, &one);
4233eb0b6dSopenharmony_ci    napi_create_int32(env, TestEnum::TWO, &two);
4333eb0b6dSopenharmony_ci    napi_create_int32(env, TestEnum::THREE, &three);
4433eb0b6dSopenharmony_ci    napi_create_int32(env, TestEnum::FOUR, &four);
4533eb0b6dSopenharmony_ci
4633eb0b6dSopenharmony_ci    napi_property_descriptor descriptors[] = {
4733eb0b6dSopenharmony_ci        DECLARE_NAPI_FUNCTION("add", DemoJavascriptClassAdd),
4833eb0b6dSopenharmony_ci        DECLARE_NAPI_FUNCTION("sub", DemoJavascriptClassSub),
4933eb0b6dSopenharmony_ci        DECLARE_NAPI_FUNCTION("mul", DemoJavascriptClassMul),
5033eb0b6dSopenharmony_ci        DECLARE_NAPI_FUNCTION("div", DemoJavascriptClassDiv),
5133eb0b6dSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ONE", one),
5233eb0b6dSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("TWO", two),
5333eb0b6dSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("THREE", three),
5433eb0b6dSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("FOUR", four),
5533eb0b6dSopenharmony_ci    };
5633eb0b6dSopenharmony_ci
5733eb0b6dSopenharmony_ci    napi_value result = nullptr;
5833eb0b6dSopenharmony_ci    napi_define_class(env, "DemoClass", NAPI_AUTO_LENGTH, DemoJavascriptClassConstructor, nullptr,
5933eb0b6dSopenharmony_ci                      sizeof(descriptors) / sizeof(*descriptors), descriptors, &result);
6033eb0b6dSopenharmony_ci
6133eb0b6dSopenharmony_ci    napi_set_named_property(env, exports, "DemoClass", result);
6233eb0b6dSopenharmony_ci}
6333eb0b6dSopenharmony_ci
6433eb0b6dSopenharmony_ci/*
6533eb0b6dSopenharmony_ci * Constructor
6633eb0b6dSopenharmony_ci */
6733eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassConstructor(napi_env env, napi_callback_info info)
6833eb0b6dSopenharmony_ci{
6933eb0b6dSopenharmony_ci    napi_value thisArg = nullptr;
7033eb0b6dSopenharmony_ci    void* data = nullptr;
7133eb0b6dSopenharmony_ci
7233eb0b6dSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data);
7333eb0b6dSopenharmony_ci
7433eb0b6dSopenharmony_ci    napi_value global = nullptr;
7533eb0b6dSopenharmony_ci    napi_get_global(env, &global);
7633eb0b6dSopenharmony_ci
7733eb0b6dSopenharmony_ci    return thisArg;
7833eb0b6dSopenharmony_ci}
7933eb0b6dSopenharmony_ci
8033eb0b6dSopenharmony_ci/*
8133eb0b6dSopenharmony_ci * Add Method
8233eb0b6dSopenharmony_ci */
8333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassAdd(napi_env env, napi_callback_info info)
8433eb0b6dSopenharmony_ci{
8533eb0b6dSopenharmony_ci    size_t requireArgc = 2;
8633eb0b6dSopenharmony_ci    size_t argc = 2;
8733eb0b6dSopenharmony_ci    napi_value argv[2] = { 0 };
8833eb0b6dSopenharmony_ci    napi_value thisArg = nullptr;
8933eb0b6dSopenharmony_ci    void* data = nullptr;
9033eb0b6dSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisArg, &data);
9133eb0b6dSopenharmony_ci
9233eb0b6dSopenharmony_ci    napi_value result = nullptr;
9333eb0b6dSopenharmony_ci
9433eb0b6dSopenharmony_ci    NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type");
9533eb0b6dSopenharmony_ci
9633eb0b6dSopenharmony_ci    napi_valuetype valueType = napi_undefined;
9733eb0b6dSopenharmony_ci    double param1 = 0;
9833eb0b6dSopenharmony_ci    double param2 = 0;
9933eb0b6dSopenharmony_ci
10033eb0b6dSopenharmony_ci    napi_typeof(env, argv[0], &valueType);
10133eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
10233eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 1");
10333eb0b6dSopenharmony_ci        return nullptr;
10433eb0b6dSopenharmony_ci    }
10533eb0b6dSopenharmony_ci
10633eb0b6dSopenharmony_ci    napi_typeof(env, argv[1], &valueType);
10733eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
10833eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 2");
10933eb0b6dSopenharmony_ci        return nullptr;
11033eb0b6dSopenharmony_ci    }
11133eb0b6dSopenharmony_ci
11233eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[0], &param1);
11333eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[1], &param2);
11433eb0b6dSopenharmony_ci
11533eb0b6dSopenharmony_ci    napi_create_double(env, param1 + param2, &result);
11633eb0b6dSopenharmony_ci
11733eb0b6dSopenharmony_ci    return result;
11833eb0b6dSopenharmony_ci}
11933eb0b6dSopenharmony_ci
12033eb0b6dSopenharmony_ci/*
12133eb0b6dSopenharmony_ci * Sub Method
12233eb0b6dSopenharmony_ci */
12333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassSub(napi_env env, napi_callback_info info)
12433eb0b6dSopenharmony_ci{
12533eb0b6dSopenharmony_ci    size_t requireArgc = 2;
12633eb0b6dSopenharmony_ci    size_t argc = 2;
12733eb0b6dSopenharmony_ci    napi_value argv[2] = { 0 };
12833eb0b6dSopenharmony_ci    napi_value thisArg = nullptr;
12933eb0b6dSopenharmony_ci    void* data = nullptr;
13033eb0b6dSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisArg, &data);
13133eb0b6dSopenharmony_ci
13233eb0b6dSopenharmony_ci    napi_value result = nullptr;
13333eb0b6dSopenharmony_ci
13433eb0b6dSopenharmony_ci    NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type");
13533eb0b6dSopenharmony_ci
13633eb0b6dSopenharmony_ci    napi_valuetype valueType = napi_undefined;
13733eb0b6dSopenharmony_ci    double param1 = 0;
13833eb0b6dSopenharmony_ci    double param2 = 0;
13933eb0b6dSopenharmony_ci
14033eb0b6dSopenharmony_ci    napi_typeof(env, argv[0], &valueType);
14133eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
14233eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 1");
14333eb0b6dSopenharmony_ci        return nullptr;
14433eb0b6dSopenharmony_ci    }
14533eb0b6dSopenharmony_ci
14633eb0b6dSopenharmony_ci    napi_typeof(env, argv[1], &valueType);
14733eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
14833eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 2");
14933eb0b6dSopenharmony_ci        return nullptr;
15033eb0b6dSopenharmony_ci    }
15133eb0b6dSopenharmony_ci
15233eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[0], &param1);
15333eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[1], &param2);
15433eb0b6dSopenharmony_ci
15533eb0b6dSopenharmony_ci    napi_create_double(env, param1 - param2, &result);
15633eb0b6dSopenharmony_ci
15733eb0b6dSopenharmony_ci    return result;
15833eb0b6dSopenharmony_ci}
15933eb0b6dSopenharmony_ci
16033eb0b6dSopenharmony_ci/*
16133eb0b6dSopenharmony_ci * Mul Method
16233eb0b6dSopenharmony_ci */
16333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassMul(napi_env env, napi_callback_info info)
16433eb0b6dSopenharmony_ci{
16533eb0b6dSopenharmony_ci    size_t requireArgc = 2;
16633eb0b6dSopenharmony_ci    size_t argc = 2;
16733eb0b6dSopenharmony_ci    napi_value argv[2] = { 0 };
16833eb0b6dSopenharmony_ci    napi_value thisArg = nullptr;
16933eb0b6dSopenharmony_ci    void* data = nullptr;
17033eb0b6dSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisArg, &data);
17133eb0b6dSopenharmony_ci
17233eb0b6dSopenharmony_ci    napi_value result = nullptr;
17333eb0b6dSopenharmony_ci
17433eb0b6dSopenharmony_ci    NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type");
17533eb0b6dSopenharmony_ci
17633eb0b6dSopenharmony_ci    napi_valuetype valueType = napi_undefined;
17733eb0b6dSopenharmony_ci    double param1 = 0;
17833eb0b6dSopenharmony_ci    double param2 = 0;
17933eb0b6dSopenharmony_ci
18033eb0b6dSopenharmony_ci    napi_typeof(env, argv[0], &valueType);
18133eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
18233eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 1");
18333eb0b6dSopenharmony_ci        return nullptr;
18433eb0b6dSopenharmony_ci    }
18533eb0b6dSopenharmony_ci
18633eb0b6dSopenharmony_ci    napi_typeof(env, argv[1], &valueType);
18733eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
18833eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 2");
18933eb0b6dSopenharmony_ci        return nullptr;
19033eb0b6dSopenharmony_ci    }
19133eb0b6dSopenharmony_ci
19233eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[0], &param1);
19333eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[1], &param2);
19433eb0b6dSopenharmony_ci
19533eb0b6dSopenharmony_ci    napi_create_double(env, param1 * param2, &result);
19633eb0b6dSopenharmony_ci
19733eb0b6dSopenharmony_ci    return result;
19833eb0b6dSopenharmony_ci}
19933eb0b6dSopenharmony_ci
20033eb0b6dSopenharmony_ci/*
20133eb0b6dSopenharmony_ci * Div Method
20233eb0b6dSopenharmony_ci */
20333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassDiv(napi_env env, napi_callback_info info)
20433eb0b6dSopenharmony_ci{
20533eb0b6dSopenharmony_ci    size_t requireArgc = 2;
20633eb0b6dSopenharmony_ci    size_t argc = 2;
20733eb0b6dSopenharmony_ci    napi_value argv[2] = { 0 };
20833eb0b6dSopenharmony_ci    napi_value thisArg = nullptr;
20933eb0b6dSopenharmony_ci    void* data = nullptr;
21033eb0b6dSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisArg, &data);
21133eb0b6dSopenharmony_ci
21233eb0b6dSopenharmony_ci    napi_value result = nullptr;
21333eb0b6dSopenharmony_ci
21433eb0b6dSopenharmony_ci    NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type");
21533eb0b6dSopenharmony_ci
21633eb0b6dSopenharmony_ci    napi_valuetype valueType = napi_undefined;
21733eb0b6dSopenharmony_ci    double param1 = 0;
21833eb0b6dSopenharmony_ci    double param2 = 0;
21933eb0b6dSopenharmony_ci
22033eb0b6dSopenharmony_ci    napi_typeof(env, argv[0], &valueType);
22133eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
22233eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 1");
22333eb0b6dSopenharmony_ci        return nullptr;
22433eb0b6dSopenharmony_ci    }
22533eb0b6dSopenharmony_ci
22633eb0b6dSopenharmony_ci    napi_typeof(env, argv[1], &valueType);
22733eb0b6dSopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
22833eb0b6dSopenharmony_ci        napi_throw_type_error(env, nullptr, "type mismatch for parameter 2");
22933eb0b6dSopenharmony_ci        return nullptr;
23033eb0b6dSopenharmony_ci    }
23133eb0b6dSopenharmony_ci
23233eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[0], &param1);
23333eb0b6dSopenharmony_ci    napi_get_value_double(env, argv[1], &param2);
23433eb0b6dSopenharmony_ci
23533eb0b6dSopenharmony_ci    NAPI_ASSERT(env, param2 == 0, "parameter 2 cannot be zero");
23633eb0b6dSopenharmony_ci
23733eb0b6dSopenharmony_ci    napi_create_double(env, param1 / param2, &result);
23833eb0b6dSopenharmony_ci
23933eb0b6dSopenharmony_ci    return result;
24033eb0b6dSopenharmony_ci}
241