1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci * 3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci * You may obtain a copy of the License at 6425bb815Sopenharmony_ci * 7425bb815Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci * 9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci * limitations under the License. 14425bb815Sopenharmony_ci */ 15425bb815Sopenharmony_ci 16425bb815Sopenharmony_ci#include "jerryscript.h" 17425bb815Sopenharmony_ci#include "jerryscript-port.h" 18425bb815Sopenharmony_ci#include "jerryscript-port-default.h" 19425bb815Sopenharmony_ci#include "test-common.h" 20425bb815Sopenharmony_ci#include <gtest/gtest.h> 21425bb815Sopenharmony_ci 22425bb815Sopenharmony_ciclass DataViewTest : public testing::Test{ 23425bb815Sopenharmony_cipublic: 24425bb815Sopenharmony_ci static void SetUpTestCase() 25425bb815Sopenharmony_ci { 26425bb815Sopenharmony_ci GTEST_LOG_(INFO) << "DataViewTest SetUpTestCase"; 27425bb815Sopenharmony_ci } 28425bb815Sopenharmony_ci 29425bb815Sopenharmony_ci static void TearDownTestCase() 30425bb815Sopenharmony_ci { 31425bb815Sopenharmony_ci GTEST_LOG_(INFO) << "DataViewTest TearDownTestCase"; 32425bb815Sopenharmony_ci } 33425bb815Sopenharmony_ci 34425bb815Sopenharmony_ci void SetUp() override {} 35425bb815Sopenharmony_ci void TearDown() override {} 36425bb815Sopenharmony_ci 37425bb815Sopenharmony_ci}; 38425bb815Sopenharmony_ci 39425bb815Sopenharmony_cistatic constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024; 40425bb815Sopenharmony_cistatic void* context_alloc_fn(size_t size, void* cb_data) 41425bb815Sopenharmony_ci{ 42425bb815Sopenharmony_ci (void)cb_data; 43425bb815Sopenharmony_ci size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size; 44425bb815Sopenharmony_ci return malloc(newSize); 45425bb815Sopenharmony_ci} 46425bb815Sopenharmony_ci 47425bb815Sopenharmony_ciHWTEST_F(DataViewTest, Test001, testing::ext::TestSize.Level1) 48425bb815Sopenharmony_ci{ 49425bb815Sopenharmony_ci if (!jerry_is_feature_enabled (JERRY_FEATURE_DATAVIEW)) 50425bb815Sopenharmony_ci { 51425bb815Sopenharmony_ci jerry_port_log (JERRY_LOG_LEVEL_ERROR, "DataView support is disabled!\n"); 52425bb815Sopenharmony_ci } 53425bb815Sopenharmony_ci else{ 54425bb815Sopenharmony_ci jerry_context_t *ctx_p = jerry_create_context (1024, context_alloc_fn, NULL); 55425bb815Sopenharmony_ci jerry_port_default_set_current_context (ctx_p); 56425bb815Sopenharmony_ci /* DataView builtin requires the TypedArray builtin */ 57425bb815Sopenharmony_ci TEST_ASSERT (jerry_is_feature_enabled (JERRY_FEATURE_TYPEDARRAY)); 58425bb815Sopenharmony_ci 59425bb815Sopenharmony_ci jerry_init (JERRY_INIT_EMPTY); 60425bb815Sopenharmony_ci 61425bb815Sopenharmony_ci /* Test accessors */ 62425bb815Sopenharmony_ci jerry_value_t arraybuffer = jerry_create_arraybuffer (16); 63425bb815Sopenharmony_ci jerry_value_t view1 = jerry_create_dataview (arraybuffer, 0, 16); 64425bb815Sopenharmony_ci TEST_ASSERT (!jerry_value_is_error (view1)); 65425bb815Sopenharmony_ci TEST_ASSERT (jerry_value_is_dataview (view1)); 66425bb815Sopenharmony_ci 67425bb815Sopenharmony_ci jerry_length_t byteOffset = 0; 68425bb815Sopenharmony_ci jerry_length_t byteLength = 0;; 69425bb815Sopenharmony_ci jerry_value_t internal_buffer = jerry_get_dataview_buffer (view1, &byteOffset, &byteLength); 70425bb815Sopenharmony_ci TEST_ASSERT (jerry_binary_operation (JERRY_BIN_OP_STRICT_EQUAL, internal_buffer, arraybuffer)); 71425bb815Sopenharmony_ci TEST_ASSERT (byteOffset == 0); 72425bb815Sopenharmony_ci TEST_ASSERT (byteLength == 16); 73425bb815Sopenharmony_ci jerry_release_value (internal_buffer); 74425bb815Sopenharmony_ci 75425bb815Sopenharmony_ci jerry_value_t view2 = jerry_create_dataview (arraybuffer, 12, 4); 76425bb815Sopenharmony_ci TEST_ASSERT (!jerry_value_is_error (view1)); 77425bb815Sopenharmony_ci TEST_ASSERT (jerry_value_is_dataview (view2)); 78425bb815Sopenharmony_ci internal_buffer = jerry_get_dataview_buffer (view2, &byteOffset, &byteLength); 79425bb815Sopenharmony_ci TEST_ASSERT (jerry_binary_operation (JERRY_BIN_OP_STRICT_EQUAL, internal_buffer, arraybuffer)); 80425bb815Sopenharmony_ci TEST_ASSERT (byteOffset == 12); 81425bb815Sopenharmony_ci TEST_ASSERT (byteLength == 4); 82425bb815Sopenharmony_ci jerry_release_value (internal_buffer); 83425bb815Sopenharmony_ci 84425bb815Sopenharmony_ci /* Test invalid construction */ 85425bb815Sopenharmony_ci jerry_value_t empty_object = jerry_create_object (); 86425bb815Sopenharmony_ci jerry_value_t view3 = jerry_create_dataview (empty_object, 20, 10); 87425bb815Sopenharmony_ci TEST_ASSERT (jerry_value_is_error (view3)); 88425bb815Sopenharmony_ci jerry_value_t error_obj = jerry_get_value_from_error (view3, true); 89425bb815Sopenharmony_ci TEST_ASSERT (jerry_get_error_type (error_obj) == JERRY_ERROR_TYPE); 90425bb815Sopenharmony_ci jerry_release_value (error_obj); 91425bb815Sopenharmony_ci jerry_release_value (empty_object); 92425bb815Sopenharmony_ci 93425bb815Sopenharmony_ci jerry_value_t view4 = jerry_create_dataview (arraybuffer, 20, 10); 94425bb815Sopenharmony_ci TEST_ASSERT (jerry_value_is_error (view3)); 95425bb815Sopenharmony_ci error_obj = jerry_get_value_from_error (view4, true); 96425bb815Sopenharmony_ci TEST_ASSERT (jerry_get_error_type (error_obj) == JERRY_ERROR_RANGE); 97425bb815Sopenharmony_ci jerry_release_value (error_obj); 98425bb815Sopenharmony_ci 99425bb815Sopenharmony_ci /* Test getting/setting values */ 100425bb815Sopenharmony_ci jerry_value_t global_obj = jerry_get_global_object (); 101425bb815Sopenharmony_ci jerry_value_t view1_str = jerry_create_string ((const jerry_char_t *) "view1"); 102425bb815Sopenharmony_ci jerry_value_t view2_str = jerry_create_string ((const jerry_char_t *) "view2"); 103425bb815Sopenharmony_ci TEST_ASSERT (jerry_set_property (global_obj, view1_str, view1)); 104425bb815Sopenharmony_ci TEST_ASSERT (jerry_set_property (global_obj, view2_str, view2)); 105425bb815Sopenharmony_ci 106425bb815Sopenharmony_ci jerry_release_value (view1_str); 107425bb815Sopenharmony_ci jerry_release_value (view2_str); 108425bb815Sopenharmony_ci jerry_release_value (global_obj); 109425bb815Sopenharmony_ci 110425bb815Sopenharmony_ci const jerry_char_t set_src[] = "view1.setInt16 (12, 255)"; 111425bb815Sopenharmony_ci TEST_ASSERT (jerry_value_is_undefined (jerry_eval (set_src, sizeof (set_src) - 1, JERRY_PARSE_NO_OPTS))); 112425bb815Sopenharmony_ci 113425bb815Sopenharmony_ci const jerry_char_t get_src[] = "view2.getInt16 (0)"; 114425bb815Sopenharmony_ci TEST_ASSERT (jerry_get_number_value (jerry_eval (get_src, sizeof (get_src) - 1, JERRY_PARSE_NO_OPTS)) == 255); 115425bb815Sopenharmony_ci 116425bb815Sopenharmony_ci const jerry_char_t get_src_little_endian[] = "view2.getInt16 (0, true)"; 117425bb815Sopenharmony_ci TEST_ASSERT (jerry_get_number_value (jerry_eval (get_src_little_endian, 118425bb815Sopenharmony_ci sizeof (get_src_little_endian) - 1, 119425bb815Sopenharmony_ci JERRY_PARSE_NO_OPTS)) == -256); 120425bb815Sopenharmony_ci 121425bb815Sopenharmony_ci /* Cleanup */ 122425bb815Sopenharmony_ci jerry_release_value (view2); 123425bb815Sopenharmony_ci jerry_release_value (view1); 124425bb815Sopenharmony_ci jerry_release_value (arraybuffer); 125425bb815Sopenharmony_ci 126425bb815Sopenharmony_ci jerry_cleanup (); 127425bb815Sopenharmony_ci free (ctx_p); 128425bb815Sopenharmony_ci } 129425bb815Sopenharmony_ci} 130