1 /*
2  * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ecmascript/builtins/builtins_segmenter.h"
17 #include "ecmascript/builtins/builtins_segments.h"
18 #include "ecmascript/builtins/builtins_segment_iterator.h"
19 
20 #include "ecmascript/global_env.h"
21 #include "ecmascript/js_segmenter.h"
22 #include "ecmascript/tests/test_helper.h"
23 
24 using namespace panda::ecmascript;
25 using namespace panda::ecmascript::builtins;
26 namespace panda::test {
27 class BuiltinsSegmenterTest : public BaseTestWithScope<true> {
28 };
29 
JSSegmenterCreateWithLocaleTest(JSThread *thread, JSHandle<JSTaggedValue> &locale)30 static JSTaggedValue JSSegmenterCreateWithLocaleTest(JSThread *thread, JSHandle<JSTaggedValue> &locale)
31 {
32     JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
33     JSHandle<JSFunction> newTarget(env->GetSegmenterFunction());
34 
35     auto ecmaRuntimeCallInfo =
36         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*newTarget), 6); // 6 means 1 call args
37     ecmaRuntimeCallInfo->SetFunction(newTarget.GetTaggedValue());
38     ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
39     ecmaRuntimeCallInfo->SetCallArg(0, locale.GetTaggedValue());
40 
41     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
42     JSTaggedValue result = BuiltinsSegmenter::SegmenterConstructor(ecmaRuntimeCallInfo);
43     EXPECT_TRUE(result.IsJSSegmenter());
44     TestHelper::TearDownFrame(thread, prev);
45     return result;
46 }
47 
JSSegmenterCreateWithLocaleAndOptionsTest(JSThread *thread, JSHandle<JSTaggedValue> &locale, JSHandle<JSTaggedValue> &granularity)48 static JSTaggedValue JSSegmenterCreateWithLocaleAndOptionsTest(JSThread *thread, JSHandle<JSTaggedValue> &locale,
49                                                                JSHandle<JSTaggedValue> &granularity)
50 {
51     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
52     JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
53     JSHandle<JSFunction> newTarget(env->GetSegmenterFunction());
54     JSHandle<JSTaggedValue> objFun = env->GetObjectFunction();
55 
56     JSHandle<JSTaggedValue> granularityKey = thread->GlobalConstants()->GetHandledGranularityString();
57     JSHandle<JSObject> optionsObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(objFun), objFun);
58     JSObject::SetProperty(thread, optionsObj, granularityKey, granularity);
59 
60     auto ecmaRuntimeCallInfo =
61         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*newTarget), 8); // 8 means 2 call args
62     ecmaRuntimeCallInfo->SetFunction(newTarget.GetTaggedValue());
63     ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
64     ecmaRuntimeCallInfo->SetCallArg(0, locale.GetTaggedValue());
65     ecmaRuntimeCallInfo->SetCallArg(1, optionsObj.GetTaggedValue());
66 
67     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
68     JSTaggedValue result = BuiltinsSegmenter::SegmenterConstructor(ecmaRuntimeCallInfo);
69     EXPECT_TRUE(result.IsJSSegmenter());
70     TestHelper::TearDownFrame(thread, prev);
71     return result;
72 }
73 
JSSegmentsCreateTest(JSThread *thread, JSHandle<JSTaggedValue> &locale, JSHandle<JSTaggedValue> &granularity, JSHandle<JSTaggedValue> &stringValue)74 static JSTaggedValue JSSegmentsCreateTest(JSThread *thread, JSHandle<JSTaggedValue> &locale,
75                                           JSHandle<JSTaggedValue> &granularity, JSHandle<JSTaggedValue> &stringValue)
76 {
77     JSHandle<JSSegmenter> jsSegmenter =
78         JSHandle<JSSegmenter>(thread, JSSegmenterCreateWithLocaleAndOptionsTest(thread, locale, granularity));
79     auto ecmaRuntimeCallInfo =
80         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);  // 6 means 1 call args
81     ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
82     ecmaRuntimeCallInfo->SetThis(jsSegmenter.GetTaggedValue());
83     ecmaRuntimeCallInfo->SetCallArg(0, stringValue.GetTaggedValue());
84 
85     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
86     JSTaggedValue segments = BuiltinsSegmenter::Segment(ecmaRuntimeCallInfo);
87     EXPECT_TRUE(segments.IsJSSegments());
88     TestHelper::TearDownFrame(thread, prev);
89     return segments;
90 }
91 
92 // new  Intl.Segmenter ( [ locales [ , options ] ] )
HWTEST_F_L0(BuiltinsSegmenterTest, SegmenterConstructor)93 HWTEST_F_L0(BuiltinsSegmenterTest, SegmenterConstructor)
94 {
95     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
96     JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
97     JSHandle<JSFunction> newTarget(env->GetSegmenterFunction());
98 
99     JSHandle<JSTaggedValue> localesString(factory->NewFromASCII("en-US"));
100     auto ecmaRuntimeCallInfo =
101         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*newTarget), 6); // 6 means 1 call args
102     ecmaRuntimeCallInfo->SetFunction(newTarget.GetTaggedValue());
103     ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
104     ecmaRuntimeCallInfo->SetCallArg(0, localesString.GetTaggedValue());
105 
106     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
107     JSTaggedValue result = BuiltinsSegmenter::SegmenterConstructor(ecmaRuntimeCallInfo);
108     TestHelper::TearDownFrame(thread, prev);
109 
110     EXPECT_TRUE(result.IsJSSegmenter());
111 }
112 
113 // Intl.Segmenter.prototype.segment ( string )
HWTEST_F_L0(BuiltinsSegmenterTest, segment)114 HWTEST_F_L0(BuiltinsSegmenterTest, segment)
115 {
116     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
117     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("zh-cn"));
118     JSHandle<JSTaggedValue> granularity(factory->NewFromASCII("word"));
119     JSHandle<JSTaggedValue> stringValue(factory->NewFromUtf8("这句话是中文"));
120     JSHandle<JSSegmenter> jsSegmenter =
121         JSHandle<JSSegmenter>(thread, JSSegmenterCreateWithLocaleAndOptionsTest(thread, locale, granularity));
122     auto ecmaRuntimeCallInfo =
123         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);  // 6 means 1 call args
124     ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
125     ecmaRuntimeCallInfo->SetThis(jsSegmenter.GetTaggedValue());
126     ecmaRuntimeCallInfo->SetCallArg(0, stringValue.GetTaggedValue());
127 
128     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
129     JSTaggedValue result = BuiltinsSegmenter::Segment(ecmaRuntimeCallInfo);
130     TestHelper::TearDownFrame(thread, prev);
131     EXPECT_TRUE(result.IsJSSegments());
132 }
133 
134 // SupportedLocalesOf("lookup")
HWTEST_F_L0(BuiltinsSegmenterTest, SupportedLocalesOf)135 HWTEST_F_L0(BuiltinsSegmenterTest, SupportedLocalesOf)
136 {
137     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
138     JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
139     JSHandle<JSTaggedValue> objFun = env->GetObjectFunction();
140 
141     JSHandle<JSTaggedValue> localeMatcherKey = thread->GlobalConstants()->GetHandledLocaleMatcherString();
142     JSHandle<JSTaggedValue> localeMatcherValue(factory->NewFromASCII("lookup"));
143     JSHandle<JSObject> optionsObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(objFun), objFun);
144     JSObject::SetProperty(thread, optionsObj, localeMatcherKey, localeMatcherValue);
145     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("id-u-co-pinyin-de-ID"));
146 
147     auto ecmaRuntimeCallInfo =
148         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8); // 8 means 2 call args
149     ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
150     ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
151     ecmaRuntimeCallInfo->SetCallArg(0, locale.GetTaggedValue());
152     ecmaRuntimeCallInfo->SetCallArg(1, optionsObj.GetTaggedValue());
153 
154     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
155     JSTaggedValue resultArr = BuiltinsSegmenter::SupportedLocalesOf(ecmaRuntimeCallInfo);
156     TestHelper::TearDownFrame(thread, prev);
157 
158     JSHandle<JSArray> resultHandle(thread, resultArr);
159     JSHandle<TaggedArray> elements(thread, resultHandle->GetElements());
160     EXPECT_EQ(elements->GetLength(), 1U);
161     JSHandle<EcmaString> handleEcmaStr(thread, elements->Get(0));
162     EXPECT_STREQ("id-u-co-pinyin-de-id", EcmaStringAccessor(handleEcmaStr).ToCString().c_str());
163 }
164 
165 // Intl.Segmenter.prototype.resolvedOptions
HWTEST_F_L0(BuiltinsSegmenterTest, ResolvedOptions)166 HWTEST_F_L0(BuiltinsSegmenterTest, ResolvedOptions)
167 {
168     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
169     auto globalConst = thread->GlobalConstants();
170     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("de-DE"));
171     JSHandle<JSSegmenter> jsSegmenter =
172         JSHandle<JSSegmenter>(thread, JSSegmenterCreateWithLocaleTest(thread, locale));
173     auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
174     ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
175     ecmaRuntimeCallInfo->SetThis(jsSegmenter.GetTaggedValue());
176 
177     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
178     JSTaggedValue result = BuiltinsSegmenter::ResolvedOptions(ecmaRuntimeCallInfo);
179     TestHelper::TearDownFrame(thread, prev);
180 
181     JSHandle<JSTaggedValue> resultObj =
182         JSHandle<JSTaggedValue>(thread, JSTaggedValue(static_cast<JSTaggedType>(result.GetRawData())));
183     // judge whether the properties of the object are the same as those of jsdatetimeformat tag
184     JSHandle<JSTaggedValue> localeKey = globalConst->GetHandledLocaleString();
185     EXPECT_EQ(JSTaggedValue::SameValue(
186         JSObject::GetProperty(thread, resultObj, localeKey).GetValue(), locale), true);
187     JSHandle<JSTaggedValue> granularityKey = globalConst->GetHandledGranularityString();
188     JSHandle<JSTaggedValue> defaultGranularityValue(factory->NewFromASCII("grapheme"));
189     EXPECT_EQ(JSTaggedValue::SameValue(
190         JSObject::GetProperty(thread, resultObj, granularityKey).GetValue(), defaultGranularityValue), true);
191 }
192 
SegmentsPrototypeCommon(JSThread *thread, JSHandle<JSTaggedValue> &result, std::vector<JSHandle<JSTaggedValue>> &values)193 void SegmentsPrototypeCommon(JSThread *thread, JSHandle<JSTaggedValue> &result,
194                              std::vector<JSHandle<JSTaggedValue>> &values)
195 {
196     auto globalConst = thread->GlobalConstants();
197     JSHandle<JSTaggedValue> segmentKey = globalConst->GetHandledSegmentString();
198     JSHandle<JSTaggedValue> indexKey = globalConst->GetHandledIndexString();
199     JSHandle<JSTaggedValue> inputKey = globalConst->GetHandledInputString();
200     JSHandle<JSTaggedValue> isWordLikeKey = globalConst->GetHandledIsWordLikeString();
201     JSHandle<JSTaggedValue> segmentValue(JSObject::GetProperty(thread, result, segmentKey).GetValue());
202     JSHandle<JSTaggedValue> indexValue(JSObject::GetProperty(thread, result, indexKey).GetValue());
203     JSHandle<JSTaggedValue> inputValue(JSObject::GetProperty(thread, result, inputKey).GetValue());
204     JSHandle<JSTaggedValue> isWordLikeValue(JSObject::GetProperty(thread, result, isWordLikeKey).GetValue());
205     values.push_back(segmentValue);
206     values.push_back(indexValue);
207     values.push_back(inputValue);
208     values.push_back(isWordLikeValue);
209 }
210 
211 // %SegmentsPrototype%.containing ( index )
HWTEST_F_L0(BuiltinsSegmenterTest, SegmentsPrototypeContaining_001)212 HWTEST_F_L0(BuiltinsSegmenterTest, SegmentsPrototypeContaining_001)
213 {
214     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
215     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("zh-cn"));
216     JSHandle<JSTaggedValue> granularity(factory->NewFromASCII("sentence"));
217     JSHandle<JSTaggedValue> stringValue(factory->NewFromUtf8("这句话是中文。这句还是中文!"));
218     JSHandle<JSTaggedValue> segments(thread, JSSegmentsCreateTest(thread, locale, granularity, stringValue));
219 
220     std::vector<JSTaggedValue> args{ JSTaggedValue(static_cast<double>(3))};
221     auto ecmaRuntimeCallInfo =
222         TestHelper::CreateEcmaRuntimeCallInfo(thread, args, 6, segments.GetTaggedValue());  // 6 means 1 call args
223 
224     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
225     JSHandle<JSTaggedValue> result(thread, BuiltinsSegments::Containing(ecmaRuntimeCallInfo));
226     TestHelper::TearDownFrame(thread, prev);
227     EXPECT_TRUE(result->IsJSObject());
228     std::vector<JSHandle<JSTaggedValue>> outValues;
229     SegmentsPrototypeCommon(thread, result, outValues);
230 
231     EXPECT_STREQ(EcmaStringAccessor(JSHandle<EcmaString>::Cast(outValues[0])).ToCString().c_str(),
232                  "这句话是中文。");
233     EXPECT_EQ(outValues[1]->GetRawData(), JSTaggedValue(0).GetRawData());   // 1:index value
234     EXPECT_STREQ(EcmaStringAccessor(JSHandle<EcmaString>::Cast(outValues[2])).ToCString().c_str(), // 2: input value
235                  "这句话是中文。这句还是中文!");
236     EXPECT_TRUE(outValues[3]->IsUndefined()); // 2: word link value
237 }
238 
HWTEST_F_L0(BuiltinsSegmenterTest, SegmentsPrototypeContaining_002)239 HWTEST_F_L0(BuiltinsSegmenterTest, SegmentsPrototypeContaining_002)
240 {
241     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
242     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("fr"));
243     JSHandle<JSTaggedValue> granularity(factory->NewFromASCII("word"));
244     JSHandle<JSTaggedValue> stringValue(factory->NewFromUtf8("Que ma joie demeure"));
245     JSHandle<JSTaggedValue> segments(thread, JSSegmentsCreateTest(thread, locale, granularity, stringValue));
246 
247     std::vector<JSTaggedValue> args{ JSTaggedValue(static_cast<double>(10))};
248     auto ecmaRuntimeCallInfo =
249         TestHelper::CreateEcmaRuntimeCallInfo(thread, args, 6, segments.GetTaggedValue());  // 6 means 1 call args
250 
251     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
252     JSHandle<JSTaggedValue> result(thread, BuiltinsSegments::Containing(ecmaRuntimeCallInfo));
253     TestHelper::TearDownFrame(thread, prev);
254     EXPECT_TRUE(result->IsJSObject());
255 
256     std::vector<JSHandle<JSTaggedValue>> outValues;
257     SegmentsPrototypeCommon(thread, result, outValues);
258     EXPECT_STREQ(EcmaStringAccessor(JSHandle<EcmaString>::Cast(outValues[0])).ToCString().c_str(),
259                  "joie");
260     EXPECT_EQ(outValues[1]->GetRawData(), JSTaggedValue(7).GetRawData());
261     EXPECT_STREQ(EcmaStringAccessor(JSHandle<EcmaString>::Cast(outValues[2])).ToCString().c_str(),
262                  "Que ma joie demeure");
263     EXPECT_EQ(outValues[3]->GetRawData(), JSTaggedValue::True().GetRawData());
264 }
265 
HWTEST_F_L0(BuiltinsSegmenterTest, SegmentsPrototypeContaining_003)266 HWTEST_F_L0(BuiltinsSegmenterTest, SegmentsPrototypeContaining_003)
267 {
268     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
269     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("fr"));
270     JSHandle<JSTaggedValue> granularity(factory->NewFromASCII("word"));
271     JSHandle<JSTaggedValue> stringValue(factory->NewFromUtf8("Que ma joie demeure"));
272     JSHandle<JSTaggedValue> segments(thread, JSSegmentsCreateTest(thread, locale, granularity, stringValue));
273 
274     std::vector<JSTaggedValue> args{ JSTaggedValue(static_cast<double>(-10))};
275     auto ecmaRuntimeCallInfo =
276         TestHelper::CreateEcmaRuntimeCallInfo(thread, args, 6, segments.GetTaggedValue());  // 6 means 1 call args
277 
278     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
279     JSHandle<JSTaggedValue> result(thread, BuiltinsSegments::Containing(ecmaRuntimeCallInfo));
280     TestHelper::TearDownFrame(thread, prev);
281     EXPECT_TRUE(result->IsUndefined());
282 }
283 
284 // %SegmentsPrototype% [ @@iterator ] ( )
HWTEST_F_L0(BuiltinsSegmenterTest, GetSegmentIterator)285 HWTEST_F_L0(BuiltinsSegmenterTest, GetSegmentIterator)
286 {
287     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
288     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("fr"));
289     JSHandle<JSTaggedValue> granularity(factory->NewFromASCII("word"));
290     JSHandle<JSTaggedValue> stringValue(factory->NewFromUtf8("Que ma joie demeure"));
291     JSHandle<JSTaggedValue> segments(thread, JSSegmentsCreateTest(thread, locale, granularity, stringValue));
292 
293     auto ecmaRuntimeCallInfo =
294         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);  // 4 means 0 call args
295     ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
296     ecmaRuntimeCallInfo->SetThis(segments.GetTaggedValue());
297 
298     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
299     JSTaggedValue result = BuiltinsSegments::GetSegmentIterator(ecmaRuntimeCallInfo);
300     TestHelper::TearDownFrame(thread, prev);
301     EXPECT_TRUE(result.IsJSSegmentIterator());
302 }
303 
304 // %SegmentIteratorPrototype%.next ( )
HWTEST_F_L0(BuiltinsSegmenterTest, SegmentIteratorNext)305 HWTEST_F_L0(BuiltinsSegmenterTest, SegmentIteratorNext)
306 {
307     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
308     JSHandle<JSTaggedValue> locale(factory->NewFromASCII("fr"));
309     JSHandle<JSTaggedValue> granularity(factory->NewFromASCII("sentence"));
310     JSHandle<JSTaggedValue> stringValue(factory->NewFromUtf8("Que ma joie demeure."));
311     JSHandle<JSTaggedValue> segments(thread, JSSegmentsCreateTest(thread, locale, granularity, stringValue));
312 
313     auto ecmaRuntimeCallInfo =
314         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);  // 4 means 0 call args
315     ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
316     ecmaRuntimeCallInfo->SetThis(segments.GetTaggedValue());
317 
318     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
319     JSHandle<JSTaggedValue> iterator(thread, BuiltinsSegments::GetSegmentIterator(ecmaRuntimeCallInfo));
320     TestHelper::TearDownFrame(thread, prev);
321     EXPECT_TRUE(iterator->IsJSSegmentIterator());
322 
323     auto ecmaRuntimeCallInfo1 =
324         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);  // 4 means 0 call args
325     ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
326     ecmaRuntimeCallInfo1->SetThis(iterator.GetTaggedValue());
327 
328     [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
329     JSHandle<JSTaggedValue> result1(thread, BuiltinsSegmentIterator::Next(ecmaRuntimeCallInfo1));
330     TestHelper::TearDownFrame(thread, prev1);
331     EXPECT_TRUE(result1->IsJSObject());
332     auto globalConst = thread->GlobalConstants();
333     JSHandle<JSTaggedValue> valueKey = globalConst->GetHandledValueString();
334     JSHandle<JSTaggedValue> doneKey = globalConst->GetHandledDoneString();
335     JSHandle<JSTaggedValue> value1(JSObject::GetProperty(thread, result1, valueKey).GetValue());
336     JSHandle<JSTaggedValue> done1(JSObject::GetProperty(thread, result1, doneKey).GetValue());
337     EXPECT_TRUE(value1->IsJSObject());
338     JSHandle<JSTaggedValue> segmentKey = globalConst->GetHandledSegmentString();
339     JSHandle<JSTaggedValue> segmentValue(JSObject::GetProperty(thread, value1, segmentKey).GetValue());
340     EXPECT_STREQ(EcmaStringAccessor(JSHandle<EcmaString>::Cast(segmentValue)).ToCString().c_str(),
341                  "Que ma joie demeure.");
342     EXPECT_FALSE(done1->ToBoolean());
343 
344     auto ecmaRuntimeCallInfo2 =
345         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);  // 4 means 0 call args
346     ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
347     ecmaRuntimeCallInfo2->SetThis(iterator.GetTaggedValue());
348 
349     [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
350     JSHandle<JSTaggedValue> result2(thread, BuiltinsSegmentIterator::Next(ecmaRuntimeCallInfo2));
351     TestHelper::TearDownFrame(thread, prev2);
352     EXPECT_TRUE(result2->IsJSObject());
353     JSHandle<JSTaggedValue> value2(JSObject::GetProperty(thread, result2, valueKey).GetValue());
354     JSHandle<JSTaggedValue> done2(JSObject::GetProperty(thread, result2, doneKey).GetValue());
355     EXPECT_TRUE(value2->IsUndefined());
356     EXPECT_TRUE(done2->ToBoolean());
357 }
358 }
359