1/*
2 * Copyright JS Foundation and other contributors, http://js.foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16extern "C"
17{
18  #include "ecma-init-finalize.h"
19  #include "jmem.h"
20  #include "ecma-helpers.h"
21  #include "ecma-conversion.h"
22  #include "ecma-exceptions.h"
23  #include "jcontext.h"
24}
25
26#include "jerryscript-port.h"
27#include "jerryscript-port-default.h"
28#include "ecma-globals.h"
29#include "jerryscript.h"
30#include <gtest/gtest.h>
31#include "test-common.h"
32
33/**
34 * Unit test's main function.
35 */
36class ToLengthTest : public testing::Test{
37public:
38    static void SetUpTestCase()
39    {
40        GTEST_LOG_(INFO) << "ToLengthTest SetUpTestCase";
41    }
42
43    static void TearDownTestCase()
44    {
45        GTEST_LOG_(INFO) << "ToLengthTest TearDownTestCase";
46    }
47
48    void SetUp() override {}
49    void TearDown() override {}
50
51};
52static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
53static void* context_alloc_fn(size_t size, void* cb_data)
54{
55    (void)cb_data;
56    size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size;
57    return malloc(newSize);
58}
59HWTEST_F(ToLengthTest, Test001, testing::ext::TestSize.Level1)
60{
61  TEST_INIT ();
62  jerry_context_t *ctx_p = jerry_create_context (1024, context_alloc_fn, NULL);
63  jerry_port_default_set_current_context (ctx_p);
64  jmem_init ();
65  ecma_init ();
66
67  uint32_t num;
68
69  ecma_value_t int_num = ecma_make_int32_value (123);
70
71  uint32_t result = ecma_op_to_length (int_num, &num);
72
73  ecma_free_value (int_num);
74
75  TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
76  TEST_ASSERT (num == 123);
77
78  /* 1, 3 */
79  ecma_value_t error_throw = ecma_raise_type_error (ECMA_ERR_MSG ("I'm an error"));
80
81  result = ecma_op_to_length (error_throw, &num);
82
83  jcontext_release_exception ();
84
85  TEST_ASSERT (ECMA_IS_VALUE_ERROR (result));
86
87  /* zero */
88  ecma_value_t zero = ecma_make_int32_value (0);
89
90  result = ecma_op_to_length (zero, &num);
91
92  ecma_free_value (zero);
93
94  TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
95  TEST_ASSERT (num == 0);
96
97  /* negative */
98  ecma_value_t negative = ecma_make_number_value (-26.5973f);
99
100  result = ecma_op_to_length (negative, &num);
101
102  ecma_free_value (negative);
103
104  TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
105#if ENABLED (JERRY_ES2015)
106  TEST_ASSERT (num == 4294967270);
107#else /* !ENABLED (JERRY_ES2015) */
108  TEST_ASSERT (num == 0);
109#endif /* ENABLED (JERRY_ES2015) */
110
111  /* +infinity */
112  ecma_value_t positive_infinity = ecma_make_number_value (ecma_number_make_infinity (false));
113
114  result = ecma_op_to_length (positive_infinity, &num);
115
116  ecma_free_value (positive_infinity);
117
118  TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
119#if ENABLED (JERRY_ES2015)
120  TEST_ASSERT (num == 0);
121#else /* !ENABLED (JERRY_ES2015) */
122  TEST_ASSERT (num == UINT32_MAX);
123#endif /* ENABLED (JERRY_ES2015) */
124
125  /* -infinity */
126  ecma_value_t negative_infinity = ecma_make_number_value (ecma_number_make_infinity (true));
127
128  result = ecma_op_to_length (negative_infinity, &num);
129
130  ecma_free_value (negative_infinity);
131
132  TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
133  TEST_ASSERT (num == 0);
134
135  /* NaN */
136  ecma_value_t nan = ecma_make_nan_value ();
137
138  result = ecma_op_to_length (nan, &num);
139
140  ecma_free_value (nan);
141
142  TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
143  TEST_ASSERT (num == 0);
144
145  ecma_finalize ();
146  jmem_finalize ();
147  free(ctx_p);
148  return;
149}
150