• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device 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 <optional>
17 #include <utility>
18 
19 #include "gtest/gtest.h"
20 
21 #include "base/memory/ace_type.h"
22 #include "base/memory/referenced.h"
23 
24 #define private public
25 #define protected public
26 #include "mock_lazy_for_each_actuator.h"
27 #include "mock_lazy_for_each_builder.h"
28 #include "test/mock/core/pipeline/mock_pipeline_context.h"
29 
30 #include "core/components_ng/base/view_stack_processor.h"
31 #include "core/components_ng/syntax/lazy_for_each_model_ng.h"
32 #include "core/components_ng/syntax/lazy_for_each_node.h"
33 #include "core/components_ng/syntax/lazy_layout_wrapper_builder.h"
34 #undef private
35 #undef protected
36 
37 using namespace testing;
38 using namespace testing::ext;
39 
40 namespace OHOS::Ace::NG {
41 namespace {
42 const std::list<std::optional<std::string>> LAZY_FOR_EACH_NODE_IDS = { "0", "1", "2", "3", "4", "5", "6" };
43 const std::list<std::optional<std::string>> DEFAULT_LAZY_FOR_EACH_NODE_IDS = {};
44 const std::list<std::optional<int32_t>> LAZY_FOR_EACH_NODE_IDS_INT = { 0, 1, 2, 3, 4, 5, 6 };
45 const std::unordered_map<int32_t, std::optional<std::string>> LAZY_FOR_EACH_CACHED_ITEMS = { { 0, "0" }, { 1, "1" } };
46 const std::list<int32_t> LAZY_FOR_EACH_ITEMS = { 0, 1, 2, 3, 4, 5 };
47 constexpr int32_t INDEX_8 = 8;
48 constexpr int32_t INDEX_1 = 1;
49 constexpr int32_t INDEX_3 = 3;
50 constexpr int32_t INDEX_0 = 0;
51 constexpr int32_t INDEX_GREATER_THAN_END_INDEX = 20;
52 constexpr int32_t INDEX_EQUAL_WITH_START_INDEX = 1;
53 } // namespace
54 
55 class LazyForEachSyntaxTestNg : public testing::Test {
56 public:
57     void SetUp() override;
58     void TearDown() override;
59 
60     RefPtr<FrameNode> CreateNode(const std::string& tag);
61 
UpdateItems(const RefPtr<LazyForEachNode> & lazyForEachNode,const RefPtr<LazyForEachActuator> & mockLazyForEachActuator)62     static void UpdateItems(
63         const RefPtr<LazyForEachNode>& lazyForEachNode, const RefPtr<LazyForEachActuator>& mockLazyForEachActuator)
64     {
65         /**
66          * @tc.steps: step1. Add child found in generatedItem_.
67          */
68         auto ids = LAZY_FOR_EACH_NODE_IDS;
69         auto builder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
70         for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
71             builder->GetChildByIndex(iter.value_or(0), true);
72         }
73     }
74 
CreateLazyForEachNode()75     static RefPtr<LazyForEachNode> CreateLazyForEachNode()
76     {
77         /**
78          * @tc.steps: step1. Create Text and push it to view stack processor.
79          * @tc.expected: Make Text as LazyForEach parent.
80          */
81         auto pattern = AceType::MakeRefPtr<Pattern>();
82         auto frameNode = AceType::MakeRefPtr<FrameNode>(V2::TEXT_ETS_TAG, -1, pattern);
83         pattern->AttachToFrameNode(frameNode);
84         ViewStackProcessor::GetInstance()->Push(frameNode);
85 
86         /**
87          * @tc.steps: step2. Invoke lazyForEach Create function.
88          * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
89          */
90         LazyForEachModelNG lazyForEach;
91         const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
92             AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
93         lazyForEach.Create(mockLazyForEachActuator);
94         auto lazyForEachNode = AceType::DynamicCast<LazyForEachNode>(ViewStackProcessor::GetInstance()->Finish());
95         /**
96          * @tc.steps: step3. Add children items to lazyForEachNode.
97          */
98         UpdateItems(lazyForEachNode, mockLazyForEachActuator);
99         return lazyForEachNode;
100     }
101 
CreateLazyForEachBuilder(bool deleteExpiringItemImmediately=false)102     static RefPtr<LazyForEachBuilder> CreateLazyForEachBuilder(bool deleteExpiringItemImmediately = false)
103     {
104         /**
105          * @tc.steps: step1. Create Text and push it to view stack processor.
106          * @tc.expected: Make Text as LazyForEach parent.
107          */
108         auto pattern = AceType::MakeRefPtr<Pattern>();
109         if (!pattern) {
110             return nullptr;
111         }
112         auto frameNode = AceType::MakeRefPtr<FrameNode>(V2::TEXT_ETS_TAG, -1, pattern);
113         if (!frameNode) {
114             return nullptr;
115         }
116         pattern->AttachToFrameNode(frameNode);
117         ViewStackProcessor::GetInstance()->Push(frameNode);
118 
119         /**
120          * @tc.steps: step2. Invoke lazyForEach Create function.
121          * @tc.expected: Create lazyForEachBuilder and can be pop from ViewStackProcessor.
122          */
123         LazyForEachModelNG lazyForEach;
124         const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
125             AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>(deleteExpiringItemImmediately);
126         if (!mockLazyForEachActuator) {
127             return nullptr;
128         }
129         lazyForEach.Create(mockLazyForEachActuator);
130         auto lazyForEachNode = AceType::DynamicCast<LazyForEachNode>(ViewStackProcessor::GetInstance()->Finish());
131         auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
132         /**
133          * @tc.steps: step3. Add children items to lazyForEachNode.
134          */
135         UpdateItems(lazyForEachNode, mockLazyForEachActuator);
136         return lazyForEachBuilder;
137     }
138 };
139 
SetUp()140 void LazyForEachSyntaxTestNg::SetUp()
141 {
142     MockPipelineContext::SetUp();
143 }
144 
TearDown()145 void LazyForEachSyntaxTestNg::TearDown()
146 {
147     MockPipelineContext::TearDown();
148 }
149 
CreateNode(const std::string & tag)150 RefPtr<FrameNode> LazyForEachSyntaxTestNg::CreateNode(const std::string& tag)
151 {
152     auto pattern = AceType::MakeRefPtr<Pattern>();
153     auto frameNode = AceType::MakeRefPtr<FrameNode>(tag, -1, pattern);
154     pattern->AttachToFrameNode(frameNode);
155     ViewStackProcessor::GetInstance()->Push(frameNode);
156     return frameNode;
157 }
158 
159 /**
160  * @tc.name: LazyForEachOnDataBulkChangedTest001
161  * @tc.desc: Create LazyForEach.
162  * @tc.type: FUNC
163  */
164 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOnDataBulkChangedTest001, TestSize.Level1)
165 {
166     /**
167      * @tc.steps: step1. Create Text and push it to view stack processor.
168      * @tc.expected: Make Text as LazyForEach parent.
169      */
170     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
171 
172     /**
173      * @tc.steps: step2. Invoke lazyForEach Create function.
174      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
175      */
176     LazyForEachModelNG lazyForEach;
177     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
178         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
179     lazyForEach.Create(mockLazyForEachActuator);
180     auto lazyForEachNode = AceType::DynamicCast<LazyForEachNode>(ViewStackProcessor::GetInstance()->Finish());
181     ASSERT_NE(lazyForEachNode, nullptr);
182     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
183     ASSERT_NE(lazyForEachBuilder, nullptr);
184 
185     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
186         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
187     }
188 
189     lazyForEachNode->OnDataAdded(INDEX_GREATER_THAN_END_INDEX);
190     lazyForEachNode->OnDataBulkChanged(INDEX_EQUAL_WITH_START_INDEX, INDEX_GREATER_THAN_END_INDEX);
191 
192     lazyForEachNode->builder_ = nullptr;
193     lazyForEachNode->OnDataAdded(INDEX_EQUAL_WITH_START_INDEX);
194     lazyForEachNode->OnDataBulkChanged(INDEX_EQUAL_WITH_START_INDEX, INDEX_GREATER_THAN_END_INDEX);
195 }
196 
197 /**
198  * @tc.name: LazyForEachOnDataMoveToNewPlaceTest001
199  * @tc.desc: Create LazyForEach.
200  * @tc.type: FUNC
201  */
202 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOnDataMoveToNewPlaceTest001, TestSize.Level1)
203 {
204     /**
205      * @tc.steps: step1. Create Text and push it to view stack processor.
206      * @tc.expected: Make Text as LazyForEach parent.
207      */
208     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
209 
210     /**
211      * @tc.steps: step2. Invoke lazyForEach Create function.
212      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
213      */
214     LazyForEachModelNG lazyForEach;
215     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
216         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
217     lazyForEach.Create(mockLazyForEachActuator);
218     auto lazyForEachNode = AceType::DynamicCast<LazyForEachNode>(ViewStackProcessor::GetInstance()->Finish());
219     ASSERT_NE(lazyForEachNode, nullptr);
220     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
221     ASSERT_NE(lazyForEachBuilder, nullptr);
222 
223     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
224         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
225     }
226 
227     lazyForEachNode->OnDataAdded(INDEX_GREATER_THAN_END_INDEX);
228     lazyForEachNode->OnDataMoveToNewPlace(INDEX_EQUAL_WITH_START_INDEX, INDEX_GREATER_THAN_END_INDEX);
229     lazyForEachNode->OnDataMoveToNewPlace(INDEX_EQUAL_WITH_START_INDEX, INDEX_EQUAL_WITH_START_INDEX);
230     lazyForEachNode->OnDataMoveToNewPlace(INDEX_GREATER_THAN_END_INDEX, INDEX_EQUAL_WITH_START_INDEX);
231     lazyForEachNode->OnDataMoveToNewPlace(INDEX_GREATER_THAN_END_INDEX, INDEX_GREATER_THAN_END_INDEX);
232 
233     lazyForEachNode->builder_ = nullptr;
234     lazyForEachNode->OnDataAdded(INDEX_EQUAL_WITH_START_INDEX);
235     lazyForEachNode->OnDataMoveToNewPlace(INDEX_EQUAL_WITH_START_INDEX, INDEX_GREATER_THAN_END_INDEX);
236     lazyForEachNode->OnDataMoveToNewPlace(INDEX_EQUAL_WITH_START_INDEX, INDEX_EQUAL_WITH_START_INDEX);
237 }
238 
239 /**
240  * @tc.name: LazyForEachOnDatasetChangeTest001
241  * @tc.desc: Create LazyForEach.
242  * @tc.type: FUNC
243  */
244 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOnDatasetChangeTest001, TestSize.Level1)
245 {
246     /**
247      * @tc.steps: step1. Create Text and push it to view stack processor.
248      * @tc.expected: Make Text as LazyForEach parent.
249      */
250     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
251 
252     /**
253      * @tc.steps: step2. Invoke lazyForEach Create function.
254      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
255      */
256     LazyForEachModelNG lazyForEach;
257     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
258         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
259     lazyForEach.Create(mockLazyForEachActuator);
260     auto lazyForEachNode = AceType::DynamicCast<LazyForEachNode>(ViewStackProcessor::GetInstance()->Finish());
261     ASSERT_NE(lazyForEachNode, nullptr);
262     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
263     ASSERT_NE(lazyForEachBuilder, nullptr);
264 
265     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
266         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
267     }
268     lazyForEachBuilder->OnDataAdded(INDEX_0);
269     std::list<V2::Operation> DataOperations;
270     V2::Operation operation1 = {.type = "text"};
271     DataOperations.push_back(operation1);
272     UpdateItems(lazyForEachNode, mockLazyForEachActuator);
273     lazyForEachNode->OnDataAdded(INDEX_GREATER_THAN_END_INDEX);
274     lazyForEachNode->OnDatasetChange(DataOperations);
275     lazyForEachNode->builder_ = nullptr;
276     lazyForEachNode->OnDatasetChange(DataOperations);
277 }
278 
279 /**
280  * @tc.name: LazyForEachGetFrameChildByIndexTest001
281  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
282  * @tc.type: FUNC
283  */
284 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachGetFrameChildByIndexTest001, TestSize.Level1)
285 {
286     /**
287      * @tc.steps: step1. Create Text and push it to view stack processor.
288      * @tc.expected: Make Text as LazyForEach parent.
289      */
290     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
291 
292     /**
293      * @tc.steps: step2. Invoke lazyForEach Create function.
294      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
295      */
296     LazyForEachModelNG lazyForEach;
297     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
298         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
299     lazyForEach.Create(mockLazyForEachActuator);
300     auto lazyForEachNode = AceType::DynamicCast<LazyForEachNode>(ViewStackProcessor::GetInstance()->Finish());
301     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
302     ASSERT_NE(lazyForEachBuilder, nullptr);
303     EXPECT_TRUE(lazyForEachNode != nullptr && lazyForEachNode->GetTag() == V2::JS_LAZY_FOR_EACH_ETS_TAG);
304 
305     UpdateItems(lazyForEachNode, mockLazyForEachActuator);
306 
307     lazyForEachNode->GetFrameChildByIndex(0, true, true);
308     EXPECT_TRUE(lazyForEachNode->ids_.empty());
309 }
310 
311 /**
312  * @tc.name: LazyForEachOnDataBulkChangedTest002
313  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
314  * @tc.type: FUNC
315  */
316 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOnDataBulkChangedTest002, TestSize.Level1)
317 {
318     /**
319      * @tc.steps: step1. Create Text and push it to view stack processor.
320      * @tc.expected: Make Text as LazyForEach parent.
321      */
322     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
323 
324     /**
325      * @tc.steps: step2. Invoke lazyForEach Create function.
326      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
327      */
328     LazyForEachModelNG lazyForEach;
329     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
330         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
331     lazyForEach.Create(mockLazyForEachActuator);
332     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
333     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
334         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
335     }
336     EXPECT_EQ(lazyForEachBuilder->OnGetTotalCount(), 7);
337     lazyForEachBuilder->OnDataBulkChanged(0, 5);
338     EXPECT_EQ(lazyForEachBuilder->OnGetTotalCount(), 2);
339     lazyForEachBuilder->OnDataBulkChanged(10, 20);
340     EXPECT_EQ(lazyForEachBuilder->OnGetTotalCount(), 2);
341 }
342 
343 /**
344  * @tc.name: LazyForEachCollectIndexChangedCountTest001
345  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
346  * @tc.type: FUNC
347  */
348 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachCollectIndexChangedCountTest001, TestSize.Level1)
349 {
350     /**
351      * @tc.steps: step1. Create Text and push it to view stack processor.
352      * @tc.expected: Make Text as LazyForEach parent.
353      */
354     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
355 
356     /**
357      * @tc.steps: step2. Invoke lazyForEach Create function.
358      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
359      */
360     LazyForEachModelNG lazyForEach;
361     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
362         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
363     lazyForEach.Create(mockLazyForEachActuator);
364     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
365     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
366         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
367     }
368 
369     std::map<int32_t, OperationInfo> operationList;
370     OperationInfo itemInfo;
371     operationList[7] = itemInfo;
372     operationList[8] = itemInfo;
373 
374     std::map<int32_t, int32_t> indexChangedMap;
375     indexChangedMap[1] = 1;
376     indexChangedMap[2] = 2;
377     indexChangedMap[3] = 3;
378     indexChangedMap[4] = 4;
379     indexChangedMap[5] = 5;
380     indexChangedMap[6] = 6;
381 
382     lazyForEachBuilder->operationList_ = operationList;
383     EXPECT_EQ(indexChangedMap.size(), 6);
384     lazyForEachBuilder->CollectIndexChangedCount(indexChangedMap);
385     EXPECT_EQ(indexChangedMap.size(), 8);
386 }
387 
388 /**
389  * @tc.name: LazyForEachOperateDeleteTest001
390  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
391  * @tc.type: FUNC
392  */
393 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOperateDeleteTest001, TestSize.Level1)
394 {
395     /**
396      * @tc.steps: step1. Create Text and push it to view stack processor.
397      * @tc.expected: Make Text as LazyForEach parent.
398      */
399     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
400 
401     /**
402      * @tc.steps: step2. Invoke lazyForEach Create function.
403      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
404      */
405     LazyForEachModelNG lazyForEach;
406     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
407         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
408     lazyForEach.Create(mockLazyForEachActuator);
409     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
410     ASSERT_NE(lazyForEachBuilder, nullptr);
411     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
412         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
413     }
414 
415     V2::Operation operation1 = {.type = "delete", .index = INDEX_0, .count = INDEX_8};
416     int32_t num;
417     num = 1;
418     lazyForEachBuilder->OperateDelete(operation1, num);
419 
420     V2::Operation operation2 = {.type = "delete", .index = INDEX_8, .count = INDEX_8};
421     lazyForEachBuilder->OperateDelete(operation2, num);
422 }
423 
424 /**
425  * @tc.name: LazyForEachOperateChangeTest001
426  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
427  * @tc.type: FUNC
428  */
429 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOperateChangeTest001, TestSize.Level1)
430 {
431     /**
432      * @tc.steps: step1. Create Text and push it to view stack processor.
433      * @tc.expected: Make Text as LazyForEach parent.
434      */
435     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
436 
437     /**
438      * @tc.steps: step2. Invoke lazyForEach Create function.
439      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
440      */
441     LazyForEachModelNG lazyForEach;
442     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
443         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
444     lazyForEach.Create(mockLazyForEachActuator);
445     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
446     ASSERT_NE(lazyForEachBuilder, nullptr);
447     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
448         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
449     }
450 
451     std::list<V2::Operation> DataOperations;
452     V2::Operation operation1 = {.type = "change", .index = INDEX_0, .count = INDEX_8};
453     DataOperations.push_back(operation1);
454     lazyForEachBuilder->OnDatasetChange(DataOperations);
455 }
456 
457 /**
458  * @tc.name: LazyForEachOperateMoveTest001
459  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
460  * @tc.type: FUNC
461  */
462 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOperateMoveTest001, TestSize.Level1)
463 {
464     /**
465      * @tc.steps: step1. Create Text and push it to view stack processor.
466      * @tc.expected: Make Text as LazyForEach parent.
467      */
468     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
469 
470     /**
471      * @tc.steps: step2. Invoke lazyForEach Create function.
472      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
473      */
474     LazyForEachModelNG lazyForEach;
475     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
476         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
477     lazyForEach.Create(mockLazyForEachActuator);
478     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
479     ASSERT_NE(lazyForEachBuilder, nullptr);
480     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
481         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
482     }
483 
484     std::list<V2::Operation> DataOperations;
485     V2::Operation operation1 = {.type = "move", .index = INDEX_0, .count = INDEX_8, .coupleIndex = std::pair(8, 8)};
486     DataOperations.push_back(operation1);
487     lazyForEachBuilder->OnDatasetChange(DataOperations);
488 
489     std::list<V2::Operation> DataOperations1;
490     V2::Operation operation2 = {.type = "move", .index = INDEX_0, .count = INDEX_8, .coupleIndex = std::pair(0, 8)};
491     DataOperations1.push_back(operation2);
492     lazyForEachBuilder->OnDatasetChange(DataOperations1);
493 
494     std::list<V2::Operation> DataOperations2;
495     V2::Operation operation3 = {.type = "move", .index = INDEX_3, .key = "", .coupleIndex = std::pair(0, 1)};
496     DataOperations2.push_back(operation3);
497     lazyForEachBuilder->OnDatasetChange(DataOperations2);
498 }
499 
500 /**
501  * @tc.name: LazyForEachOperateExchangeTest001
502  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
503  * @tc.type: FUNC
504  */
505 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOperateExchangeTest001, TestSize.Level1)
506 {
507     /**
508      * @tc.steps: step1. Create Text and push it to view stack processor.
509      * @tc.expected: Make Text as LazyForEach parent.
510      */
511     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
512 
513     /**
514      * @tc.steps: step2. Invoke lazyForEach Create function.
515      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
516      */
517     LazyForEachModelNG lazyForEach;
518     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
519         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
520     lazyForEach.Create(mockLazyForEachActuator);
521     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
522     ASSERT_NE(lazyForEachBuilder, nullptr);
523     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
524         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
525     }
526 
527     std::list<V2::Operation> DataOperations;
528     V2::Operation operation1 = {.type = "exchange", .index = INDEX_0, .count = INDEX_8,
529      .coupleIndex = std::pair(1, 3)};
530     DataOperations.push_back(operation1);
531     lazyForEachBuilder->OnDatasetChange(DataOperations);
532 
533     std::list<V2::Operation> DataOperations1;
534     V2::Operation operation2 = {.type = "exchange", .index = INDEX_0, .count = INDEX_8,
535      .coupleIndex = std::pair(20, 3)};
536     DataOperations1.push_back(operation2);
537     lazyForEachBuilder->OnDatasetChange(DataOperations1);
538 
539     std::list<V2::Operation> DataOperations2;
540     V2::Operation operation3 = {.type = "exchange", .index = INDEX_3, .coupleKey = std::pair("", ""),
541      .coupleIndex = std::pair(0, 20)};
542     DataOperations2.push_back(operation3);
543     lazyForEachBuilder->OnDatasetChange(DataOperations2);
544 
545     std::list<V2::Operation> DataOperations3;
546     V2::Operation operation4 = {.type = "exchange", .index = INDEX_3, .coupleKey = std::pair("1", "1"),
547      .coupleIndex = std::pair(0, 20)};
548     DataOperations3.push_back(operation4);
549     lazyForEachBuilder->OnDatasetChange(DataOperations3);
550 }
551 
552 /**
553  * @tc.name: LazyForEachOperateReloadTest001
554  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
555  * @tc.type: FUNC
556  */
557 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachOperateReloadTest001, TestSize.Level1)
558 {
559     /**
560      * @tc.steps: step1. Create Text and push it to view stack processor.
561      * @tc.expected: Make Text as LazyForEach parent.
562      */
563     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
564 
565     /**
566      * @tc.steps: step2. Invoke lazyForEach Create function.
567      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
568      */
569     LazyForEachModelNG lazyForEach;
570     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
571         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
572     lazyForEach.Create(mockLazyForEachActuator);
573     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
574     ASSERT_NE(lazyForEachBuilder, nullptr);
575     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
576         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
577     }
578 
579     EXPECT_EQ(lazyForEachBuilder->OnGetTotalCount(), 7);
580     std::list<V2::Operation> DataOperations;
581     V2::Operation operation1 = {.type = "reload", .index = INDEX_0, .count = INDEX_8, .coupleIndex = std::pair(1, 3)};
582     DataOperations.push_back(operation1);
583     lazyForEachBuilder->OnDatasetChange(DataOperations);
584     EXPECT_EQ(lazyForEachBuilder->OnGetTotalCount(), 0);
585 }
586 
587 /**
588  * @tc.name: LazyForEachThrowRepeatOperationErrorTest001
589  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
590  * @tc.type: FUNC
591  */
592 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachThrowRepeatOperationErrorTest001, TestSize.Level1)
593 {
594     /**
595      * @tc.steps: step1. Create Text and push it to view stack processor.
596      * @tc.expected: Make Text as LazyForEach parent.
597      */
598     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
599 
600     /**
601      * @tc.steps: step2. Invoke lazyForEach Create function.
602      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
603      */
604     LazyForEachModelNG lazyForEach;
605     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
606         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
607     lazyForEach.Create(mockLazyForEachActuator);
608     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
609     ASSERT_NE(lazyForEachBuilder, nullptr);
610     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
611         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
612     }
613 
614     lazyForEachBuilder->ThrowRepeatOperationError(INDEX_0);
615 }
616 
617 /**
618  * @tc.name: LazyForEachRecycleChildByIndexTest001
619  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
620  * @tc.type: FUNC
621  */
622 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachRecycleChildByIndexTest001, TestSize.Level1)
623 {
624     /**
625      * @tc.steps: step1. Create Text and push it to view stack processor.
626      * @tc.expected: Make Text as LazyForEach parent.
627      */
628     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
629 
630     /**
631      * @tc.steps: step2. Invoke lazyForEach Create function.
632      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
633      */
634     LazyForEachModelNG lazyForEach;
635     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
636         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
637     lazyForEach.Create(mockLazyForEachActuator);
638     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
639     ASSERT_NE(lazyForEachBuilder, nullptr);
640     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
641         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
642     }
643 
644     std::list<V2::Operation> DataOperations;
645     V2::Operation operation1 = {.type = "add", .index = INDEX_0, .count = INDEX_8, .coupleIndex = std::pair(1, 3)};
646     DataOperations.push_back(operation1);
647     lazyForEachBuilder->OnDatasetChange(DataOperations);
648     lazyForEachBuilder->OnDataAdded(INDEX_GREATER_THAN_END_INDEX);
649 
650     lazyForEachBuilder->RecycleChildByIndex(INDEX_1);
651 
652     lazyForEachBuilder->RecycleChildByIndex(8);
653 }
654 
655 /**
656  * @tc.name: LazyForEachRecordOutOfBoundaryNodesTest001
657  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
658  * @tc.type: FUNC
659  */
660 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachRecordOutOfBoundaryNodesTest001, TestSize.Level1)
661 {
662     /**
663      * @tc.steps: step1. Create Text and push it to view stack processor.
664      * @tc.expected: Make Text as LazyForEach parent.
665      */
666     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
667 
668     /**
669      * @tc.steps: step2. Invoke lazyForEach Create function.
670      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
671      */
672     LazyForEachModelNG lazyForEach;
673     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
674         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
675     lazyForEach.Create(mockLazyForEachActuator);
676     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
677     ASSERT_NE(lazyForEachBuilder, nullptr);
678     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
679         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
680     }
681 
682     EXPECT_EQ(lazyForEachBuilder->outOfBoundaryNodes_.size(), 0);
683     lazyForEachBuilder->RecordOutOfBoundaryNodes(INDEX_0);
684     EXPECT_EQ(lazyForEachBuilder->outOfBoundaryNodes_.size(), 1);
685 }
686 
687 /**
688  * @tc.name: LazyForEachRecycleItemsOutOfBoundaryTest001
689  * @tc.desc: Create LazyForEach, update its Items and invoke :GetFrameChildByIndex function.
690  * @tc.type: FUNC
691  */
692 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachRecycleItemsOutOfBoundaryTest001, TestSize.Level1)
693 {
694     /**
695      * @tc.steps: step1. Create Text and push it to view stack processor.
696      * @tc.expected: Make Text as LazyForEach parent.
697      */
698     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
699 
700     /**
701      * @tc.steps: step2. Invoke lazyForEach Create function.
702      * @tc.expected: Create LazyForEachNode and can be pop from ViewStackProcessor.
703      */
704     LazyForEachModelNG lazyForEach;
705     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
706         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
707     lazyForEach.Create(mockLazyForEachActuator);
708     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
709     ASSERT_NE(lazyForEachBuilder, nullptr);
710     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
711         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
712     }
713 
714     lazyForEachBuilder->outOfBoundaryNodes_ = LAZY_FOR_EACH_ITEMS;
715     EXPECT_EQ(lazyForEachBuilder->outOfBoundaryNodes_.size(), LAZY_FOR_EACH_ITEMS.size());
716     lazyForEachBuilder->RecycleItemsOutOfBoundary();
717     EXPECT_EQ(lazyForEachBuilder->outOfBoundaryNodes_.size(), 0);
718 }
719 
720 /**
721  * @tc.name: LazyForEachBuilder01
722  * @tc.desc: LazyForEachBuilder::GetChildByIndex
723  * @tc.type: FUNC
724  */
725 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder01, TestSize.Level1)
726 {
727     LazyForEachModelNG lazyForEach;
728     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
729         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
730     lazyForEach.Create(mockLazyForEachActuator);
731     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
732 
733     /**
734      * @tc.steps: step1. iter->second.second == nullptr;
735      */
736     std::string str0 = "0";
737     lazyForEachBuilder->cachedItems_[0] = LazyForEachChild(str0, nullptr);
738     auto step1 = lazyForEachBuilder->GetChildByIndex(0, true);
739     EXPECT_EQ(step1.first.size(), 1);
740 
741     /**
742      * @tc.steps: step2. keyIter != expiringItem_.end(), keyIter->second.second == nullptr;
743      */
744     std::string str1 = "1";
745     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str1, nullptr);
746     lazyForEachBuilder->expiringItem_[str1] = LazyForEachCacheChild(1, nullptr);
747     auto step2 = lazyForEachBuilder->GetChildByIndex(1, true);
748     EXPECT_EQ(step2.first.size(), 1);
749 
750     /**
751      * @tc.steps: step3. keyIter != expiringItem_.end(), keyIter->second.second != nullptr;
752      */
753     auto iter02 = lazyForEachBuilder->cachedItems_.find(0);
754     std::string str2 = "2";
755     lazyForEachBuilder->cachedItems_[2] = LazyForEachChild(str2, nullptr);
756     lazyForEachBuilder->expiringItem_[str2] = LazyForEachCacheChild(2, iter02->second.second);
757     auto step3 = lazyForEachBuilder->GetChildByIndex(2, true);
758     EXPECT_EQ(step3.first.size(), 1);
759 
760     /**
761      * @tc.steps: step4. isCache == true;
762      */
763     auto iter03 = lazyForEachBuilder->cachedItems_.find(0);
764     std::string str3 = "3";
765     lazyForEachBuilder->cachedItems_[3] = LazyForEachChild(str3, nullptr);
766     lazyForEachBuilder->expiringItem_[str3] = LazyForEachCacheChild(3, iter03->second.second);
767     auto step4 = lazyForEachBuilder->GetChildByIndex(3, true, true);
768     EXPECT_EQ(step4.first.size(), 1);
769 
770     /**
771      * @tc.steps: step5. needBuild == false;
772      */
773     std::string str4 = "4";
774     lazyForEachBuilder->cachedItems_[4] = LazyForEachChild(str4, nullptr);
775     auto step5 = lazyForEachBuilder->GetChildByIndex(4, false);
776     EXPECT_EQ(step5.first.size(), 0);
777 
778     /**
779      * @tc.steps: step6. useNewInterface_ == true, isCache == true;
780      */
781     std::string str5 = "5";
782     lazyForEachBuilder->cachedItems_[5] = LazyForEachChild(str5, nullptr);
783     lazyForEachBuilder->useNewInterface_ = true;
784     auto step6 = lazyForEachBuilder->GetChildByIndex(5, true, true);
785     EXPECT_EQ(step6.first.size(), 1);
786 }
787 
788 /**
789  * @tc.name: LazyForEachBuilder02
790  * @tc.desc: LazyForEachBuilder::ConvertFormToIndex
791  * @tc.type: FUNC
792  */
793 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder02, TestSize.Level1)
794 {
795     LazyForEachModelNG lazyForEach;
796     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
797         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
798     lazyForEach.Create(mockLazyForEachActuator);
799     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
800 
801     /**
802      * @tc.steps: step1. !moveFromTo_;
803      */
804     auto step1 = lazyForEachBuilder->ConvertFormToIndex(0);
805     EXPECT_EQ(step1, 0);
806 
807     /**
808      * @tc.steps: step2. (1, 1);
809      */
810     lazyForEachBuilder->moveFromTo_.emplace(1, 1);
811     auto step2 = lazyForEachBuilder->ConvertFormToIndex(0);
812     EXPECT_EQ(step2, 0);
813 
814     /**
815      * @tc.steps: step3. moveFromTo_.value().second == index;
816      */
817     lazyForEachBuilder->moveFromTo_.value().second = 0;
818     auto step3 = lazyForEachBuilder->ConvertFormToIndex(0);
819     EXPECT_EQ(step3, 1);
820 
821     /**
822      * @tc.steps: step4. (0, 0);
823      */
824     lazyForEachBuilder->moveFromTo_.value().first = 0;
825     lazyForEachBuilder->moveFromTo_.value().second = 0;
826     auto step4 = lazyForEachBuilder->ConvertFormToIndex(1);
827     EXPECT_EQ(step4, 1);
828 
829     /**
830      * @tc.steps: step5. (0, 2);
831      */
832     lazyForEachBuilder->moveFromTo_.value().first = 0;
833     lazyForEachBuilder->moveFromTo_.value().second = 2;
834     auto step5 = lazyForEachBuilder->ConvertFormToIndex(1);
835     EXPECT_EQ(step5, 2);
836 
837     /**
838      * @tc.steps: step6. (2, 0);
839      */
840     lazyForEachBuilder->moveFromTo_.value().first = 2;
841     lazyForEachBuilder->moveFromTo_.value().second = 0;
842     auto step6 = lazyForEachBuilder->ConvertFormToIndex(1);
843     EXPECT_EQ(step6, 0);
844 }
845 
846 /**
847  * @tc.name: LazyForEachBuilder03
848  * @tc.desc: LazyForEachBuilder::PreBuild
849  * @tc.type: FUNC
850  */
851 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder03, TestSize.Level1)
852 {
853     LazyForEachModelNG lazyForEach;
854     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
855         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
856     lazyForEach.Create(mockLazyForEachActuator);
857     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
858     ASSERT_NE(lazyForEachBuilder, nullptr);
859     auto lazyForEachNode = AceType::DynamicCast<LazyForEachNode>(ViewStackProcessor::GetInstance()->Finish());
860     EXPECT_TRUE(lazyForEachNode != nullptr && lazyForEachNode->GetTag() == V2::JS_LAZY_FOR_EACH_ETS_TAG);
861     UpdateItems(lazyForEachNode, mockLazyForEachActuator);
862 
863     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
864         lazyForEachBuilder->expiringItem_.try_emplace(node.first, LazyForEachCacheChild(-1, std::move(node.second)));
865     }
866     LayoutConstraintF layoutConstraint;
867 
868     /**
869      * @tc.steps: step1. all == false;
870      */
871     auto step1 = lazyForEachBuilder->PreBuild(10, layoutConstraint, true);
872     EXPECT_TRUE(step1);
873 
874     /**
875      * @tc.steps: step2. itemConstraint, startIndex_ != -1;
876      */
877     layoutConstraint.parentIdealSize = OptionalSizeF(768, 1024);
878     layoutConstraint.selfIdealSize = OptionalSizeF(480, 960);
879     lazyForEachBuilder->startIndex_ = 3;
880     auto step2 = lazyForEachBuilder->PreBuild(10, layoutConstraint, true);
881     EXPECT_TRUE(step2);
882 
883     /**
884      * @tc.steps: step3. startIndex_ != -1 && endIndex_ != -1;
885      */
886     lazyForEachBuilder->endIndex_ = 1;
887     auto step3 = lazyForEachBuilder->PreBuild(10, layoutConstraint, true);
888     EXPECT_TRUE(step3);
889 
890     /**
891      * @tc.steps: step4. !canRunLongPredictTask;
892      */
893     auto step4 = lazyForEachBuilder->PreBuild(10, layoutConstraint, false);
894     EXPECT_FALSE(step4);
895 
896     /**
897      * @tc.steps: step5. Set cacheCount_ is 7 and check PreBuild fuction;
898      */
899     lazyForEachBuilder->SetCacheCount(7);
900     auto step5 = lazyForEachBuilder->PreBuild(10, layoutConstraint, true);
901     EXPECT_FALSE(step5);
902 
903     /**
904      * @tc.steps: step6. Set cacheCount_ is 7 and check PreBuild fuction;
905      */
906     lazyForEachBuilder->preBuildingIndex_ = 0;
907     auto step6 = lazyForEachBuilder->PreBuild(10, layoutConstraint, true);
908     EXPECT_FALSE(step6);
909 }
910 
911 /**
912  * @tc.name: LazyForEachBuilder04
913  * @tc.desc: LazyForEachBuilder::OnDataBulkChanged
914  * @tc.type: FUNC
915  */
916 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder04, TestSize.Level1)
917 {
918     LazyForEachModelNG lazyForEach;
919     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
920         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
921     lazyForEach.Create(mockLazyForEachActuator);
922     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
923 
924     /**
925      * @tc.steps: step1. cachedItems_.empty();
926      */
927     auto step1 = lazyForEachBuilder->OnDataBulkChanged(0, 0);
928     EXPECT_EQ(step1.size(), 0);
929 
930     /**
931      * @tc.steps: step1. node.first;
932      */
933     std::string str0 = "0";
934     lazyForEachBuilder->cachedItems_[0] = LazyForEachChild(str0, nullptr);
935     lazyForEachBuilder->expiringItem_[str0] = LazyForEachCacheChild(2, nullptr);
936     std::string str1 = "1";
937     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str1, nullptr);
938     lazyForEachBuilder->expiringItem_[str1] = LazyForEachCacheChild(7, nullptr);
939     std::string str2 = "2";
940     lazyForEachBuilder->cachedItems_[2] = LazyForEachChild(str2, nullptr);
941     lazyForEachBuilder->expiringItem_[str2] = LazyForEachCacheChild(0, nullptr);
942     lazyForEachBuilder->OnDataBulkChanged(1, 5);
943     EXPECT_EQ(lazyForEachBuilder->expiringItem_[str0].first, -1);
944     EXPECT_EQ(lazyForEachBuilder->expiringItem_[str1].first, 7);
945     EXPECT_EQ(lazyForEachBuilder->expiringItem_[str2].first, 0);
946 }
947 
948 /**
949  * @tc.name: LazyForEachBuilder05
950  * @tc.desc: LazyForEachBuilder::RecycleChildByIndex
951  * @tc.type: FUNC
952  */
953 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder05, TestSize.Level1)
954 {
955     LazyForEachModelNG lazyForEach;
956     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
957         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
958     lazyForEach.Create(mockLazyForEachActuator);
959     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
960 
961     /**
962      * @tc.steps: step1. !iter->second.second;
963      */
964     std::string str0 = "0";
965     lazyForEachBuilder->cachedItems_[0] = LazyForEachChild(str0, nullptr);
966     lazyForEachBuilder->RecycleChildByIndex(0);
967     EXPECT_EQ(lazyForEachBuilder->cachedItems_.size(), 1);
968 
969     /**
970      * @tc.steps: step2. !dummyNode;
971      */
972     std::string str1 = "1";
973     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str1, nullptr);
974     lazyForEachBuilder->GetChildByIndex(1, true);
975     lazyForEachBuilder->RecycleChildByIndex(1);
976     EXPECT_EQ(lazyForEachBuilder->cachedItems_.size(), 2);
977 
978     /**
979      * @tc.steps: step3. dummyNode;
980      */
981     std::string str2 = "2";
982     lazyForEachBuilder->cachedItems_[2] = LazyForEachChild(str2, nullptr);
983     lazyForEachBuilder->GetChildByIndex(2, true);
984     auto iter = lazyForEachBuilder->cachedItems_.find(2);
985     iter->second.second->SetNeedCallChildrenUpdate(true);
986     iter->second.second->debugLine_ = str2;
987     lazyForEachBuilder->RecycleChildByIndex(2);
988     EXPECT_EQ(lazyForEachBuilder->cachedItems_.size(), 3);
989 }
990 
991 /**
992  * @tc.name: LazyForEachBuilder06
993  * @tc.desc: LazyForEachBuilder::OnDataBulkDeleted
994  * @tc.type: FUNC
995  */
996 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder06, TestSize.Level1)
997 {
998     LazyForEachModelNG lazyForEach;
999     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
1000         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
1001     lazyForEach.Create(mockLazyForEachActuator);
1002     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
1003 
1004     /**
1005      * @tc.steps: step1. Override the branch of the judgment expiringItem_;
1006      */
1007     std::string str1 = "1";
1008     std::string str2 = "3";
1009     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str1, nullptr);
1010     lazyForEachBuilder->expiringItem_[str1] = LazyForEachCacheChild(1, nullptr);
1011     lazyForEachBuilder->expiringItem_[str2] = LazyForEachCacheChild(3, nullptr);
1012     lazyForEachBuilder->OnDataBulkDeleted(2, 5);
1013     EXPECT_EQ(lazyForEachBuilder->nodeList_.size(), 0);
1014 
1015     /**
1016      * @tc.steps: step1. Override the branch of the judgment cachedItems_;
1017      */
1018     lazyForEachBuilder->cachedItems_[3] = LazyForEachChild(str2, nullptr);
1019     lazyForEachBuilder->OnDataBulkDeleted(2, 5);
1020     EXPECT_NE(lazyForEachBuilder->nodeList_.size(), 0);
1021 }
1022 
1023 /**
1024  * @tc.name: LazyForEachBuilder07
1025  * @tc.desc: LazyForEachBuilder::OnDataBulkDeleted
1026  * @tc.type: FUNC
1027  */
1028 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder07, TestSize.Level1)
1029 {
1030     LazyForEachModelNG lazyForEach;
1031     const RefPtr<LazyForEachActuator> mockLazyForEachActuator =
1032         AceType::MakeRefPtr<OHOS::Ace::Framework::MockLazyForEachBuilder>();
1033     lazyForEach.Create(mockLazyForEachActuator);
1034     auto lazyForEachBuilder = AceType::DynamicCast<LazyForEachBuilder>(mockLazyForEachActuator);
1035 
1036     /**
1037      * @tc.steps: step1. operation.index >= totalCountOfOriginalDataset_;
1038      */
1039     V2::Operation operation;
1040     operation.index = 0;
1041     int32_t initialIndex = 0;
1042     std::map<int32_t, LazyForEachChild> cachedTemp;
1043     std::map<int32_t, LazyForEachChild> expiringTemp;
1044     lazyForEachBuilder->OperateChange(operation, initialIndex, cachedTemp, expiringTemp);
1045     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 0);
1046 
1047     /**
1048      * @tc.steps: step2. !indexExist == operationList_.end();
1049      */
1050     lazyForEachBuilder->totalCountOfOriginalDataset_ = 1;
1051     OperationInfo operationinfo;
1052     lazyForEachBuilder->operationList_[1] = operationinfo;
1053     lazyForEachBuilder->OperateChange(operation, initialIndex, cachedTemp, expiringTemp);
1054     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 1);
1055 
1056     /**
1057      * @tc.steps: step3. !operation.key.empty();
1058      */
1059     std::string str0 = "0";
1060     expiringTemp[0] = LazyForEachChild(str0, nullptr);
1061     cachedTemp[0] = LazyForEachChild(str0, nullptr);
1062     operation.key = "0";
1063     lazyForEachBuilder->OperateChange(operation, initialIndex, cachedTemp, expiringTemp);
1064     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 2);
1065 
1066     /**
1067      * @tc.steps: step4. !indexExist == operationList_.end();
1068      */
1069     lazyForEachBuilder->operationList_[0] = operationinfo;
1070     lazyForEachBuilder->OperateChange(operation, initialIndex, cachedTemp, expiringTemp);
1071     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 2);
1072 }
1073 
1074 /**
1075  * @tc.name: LazyForEachBuilder08
1076  * @tc.desc: LazyForEachBuilder::GetAllItems
1077  * @tc.type: FUNC
1078  */
1079 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder08, TestSize.Level1)
1080 {
1081     /**
1082      * @tc.steps: step1. Create LazyForEachBuilder
1083      * @tc.expected: Create LazyForEachBuilder success.
1084      */
1085     auto lazyForEachBuilder = CreateLazyForEachBuilder();
1086     ASSERT_NE(lazyForEachBuilder, nullptr);
1087     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
1088         lazyForEachBuilder->expiringItem_.try_emplace(node.first, LazyForEachCacheChild(-1, std::move(node.second)));
1089     }
1090     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
1091         lazyForEachBuilder->nodeList_.emplace_back(node.first, node.second);
1092     }
1093 
1094     /**
1095      * @tc.steps: step2. LazyForEachBuilder::GetAllItems(std::vector<UINode*>& items)
1096      */
1097     std::vector<UINode*> children;
1098     lazyForEachBuilder->GetAllItems(children);
1099     EXPECT_EQ(lazyForEachBuilder->cachedItems_.size(), 7);
1100     EXPECT_EQ(lazyForEachBuilder->expiringItem_.size(), 7);
1101     EXPECT_EQ(lazyForEachBuilder->nodeList_.size(), 7);
1102 
1103     /**
1104      * @tc.steps: step3. Mock the UINode of expiringItem_ is nullptr and the other is not nullptr
1105      */
1106     std::list<std::pair<std::string, RefPtr<UINode>>> childList;
1107     lazyForEachBuilder->needTransition = true;
1108     lazyForEachBuilder->expiringItem_["0"].second = nullptr;
1109     lazyForEachBuilder->expiringItem_["1"].second->GetFrameChildByIndex(0, true)->onMainTree_ = true;
1110     lazyForEachBuilder->Transit(childList);
1111     EXPECT_EQ(childList.size(), 1);
1112 
1113     /**
1114      * @tc.steps: step4. !node.second
1115      */
1116     childList.clear();
1117     lazyForEachBuilder->cachedItems_[0].second = nullptr;
1118     lazyForEachBuilder->GetItems(childList);
1119     EXPECT_EQ(childList.size(), 0);
1120 
1121     /**
1122      * @tc.steps: step5. iter->first < index
1123      */
1124     std::list<V2::Operation> DataOperations;
1125     V2::Operation operation = { .type = "change", .index = INDEX_0, .count = INDEX_3 };
1126     DataOperations.push_back(operation);
1127     lazyForEachBuilder->expiringItem_["2"].first = 2;
1128     lazyForEachBuilder->OnDatasetChange(DataOperations);
1129     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 0);
1130 
1131     /**
1132      * @tc.steps: step6. info.moveIn || info.isExchange
1133      */
1134     std::list<V2::Operation> DataOperations1;
1135     V2::Operation operation1 = { .type = "move", .index = INDEX_0, .count = INDEX_8, .coupleIndex = std::pair(8, 8) };
1136     DataOperations1.push_back(operation1);
1137     lazyForEachBuilder->OnDatasetChange(DataOperations1);
1138     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 0);
1139 }
1140 
1141 /**
1142  * @tc.name: LazyForEachBuilder09
1143  * @tc.desc: LazyForEachBuilder::OnDatasetChange
1144  * @tc.type: FUNC
1145  */
1146 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder09, TestSize.Level1)
1147 {
1148     /**
1149      * @tc.steps: step1. Create LazyForEachBuilder
1150      * @tc.expected: Create LazyForEachBuilder success.
1151      */
1152     auto lazyForEachBuilder = CreateLazyForEachBuilder();
1153     ASSERT_NE(lazyForEachBuilder, nullptr);
1154     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
1155         lazyForEachBuilder->expiringItem_.try_emplace(node.first, LazyForEachCacheChild(-1, std::move(node.second)));
1156     }
1157     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
1158         lazyForEachBuilder->nodeList_.emplace_back(node.first, node.second);
1159     }
1160 
1161     /**
1162      * @tc.steps: step2. cacheChild.first > -1
1163      */
1164     std::list<V2::Operation> DataOperations;
1165     V2::Operation operation = { .type = "change", .index = INDEX_0, .count = INDEX_8 };
1166     DataOperations.push_back(operation);
1167     lazyForEachBuilder->expiringItem_["0"].first = 0;
1168     lazyForEachBuilder->OnDatasetChange(DataOperations);
1169     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 0);
1170 
1171     /**
1172      * @tc.steps: step3. indexChangedMap can not find the node
1173      */
1174     std::list<V2::Operation> DataOperations1;
1175     V2::Operation operation1 = { .type = "add", .index = INDEX_8, .count = INDEX_8, .coupleIndex = std::pair(1, 3) };
1176     DataOperations1.push_back(operation1);
1177     lazyForEachBuilder->OnDatasetChange(DataOperations1);
1178     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 0);
1179 
1180     /**
1181      * @tc.steps: step4. !operation.key.empty()
1182      */
1183     std::list<V2::Operation> DataOperations2;
1184     V2::Operation operation2 = { .type = "add", .index = INDEX_0, .count = INDEX_8, .coupleIndex = std::pair(1, 3) };
1185     operation2.key = "0";
1186     DataOperations2.push_back(operation2);
1187     lazyForEachBuilder->OnDatasetChange(DataOperations2);
1188     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 0);
1189 
1190     /**
1191      * @tc.steps: step5. operation.keyList.size() >= static_cast<size_t>(1)
1192      */
1193     std::list<V2::Operation> DataOperations3;
1194     V2::Operation operation3 = { .type = "add", .index = INDEX_0, .count = INDEX_8, .coupleIndex = std::pair(1, 3) };
1195     std::list<std::string> keyList;
1196     keyList.push_back("0");
1197     operation3.keyList = keyList;
1198     DataOperations3.push_back(operation3);
1199     lazyForEachBuilder->OnDatasetChange(DataOperations3);
1200     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 0);
1201 }
1202 
1203 /**
1204  * @tc.name: LazyForEachBuilder10
1205  * @tc.desc: LazyForEachBuilder::OperateMove
1206  * @tc.type: FUNC
1207  */
1208 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder10, TestSize.Level1)
1209 {
1210     /**
1211      * @tc.steps: step1. Create LazyForEachBuilder
1212      * @tc.expected: Create LazyForEachBuilder success.
1213      */
1214     auto lazyForEachBuilder = CreateLazyForEachBuilder();
1215     ASSERT_NE(lazyForEachBuilder, nullptr);
1216 
1217     /**
1218      * @tc.steps: step2. !ValidateIndex(operation.coupleIndex.first, operation.type)
1219      */
1220     V2::Operation operation;
1221     operation.index = 0;
1222     operation.type = "move";
1223     operation.count = 8;
1224     operation.coupleIndex = std::pair(8, 8);
1225     int32_t initialIndex = 0;
1226     lazyForEachBuilder->totalCountOfOriginalDataset_ = 9;
1227     std::map<int32_t, LazyForEachChild> cachedTemp;
1228     std::map<int32_t, LazyForEachChild> expiringTemp;
1229     lazyForEachBuilder->OperateMove(operation, initialIndex, cachedTemp, expiringTemp);
1230     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 1);
1231 
1232     /**
1233      * @tc.steps: step3. fromIndexExist == operationList_.end()
1234      */
1235     std::string str0 = "0";
1236     expiringTemp[0] = LazyForEachChild(str0, nullptr);
1237     cachedTemp[0] = LazyForEachChild(str0, nullptr);
1238     OperationInfo operationinfo;
1239     lazyForEachBuilder->operationList_[0] = operationinfo;
1240     lazyForEachBuilder->OperateMove(operation, initialIndex, cachedTemp, expiringTemp);
1241     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 2);
1242 }
1243 
1244 /**
1245  * @tc.name: LazyForEachBuilder11
1246  * @tc.desc: LazyForEachBuilder::OperateExchange
1247  * @tc.type: FUNC
1248  */
1249 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder11, TestSize.Level1)
1250 {
1251     /**
1252      * @tc.steps: step1. Create LazyForEachBuilder
1253      * @tc.expected: Create LazyForEachBuilder success.
1254      */
1255     auto lazyForEachBuilder = CreateLazyForEachBuilder();
1256     ASSERT_NE(lazyForEachBuilder, nullptr);
1257 
1258     /**
1259      * @tc.steps: step2. !ValidateIndex(operation.coupleIndex.first, operation.type)
1260      */
1261     V2::Operation operation;
1262     operation.index = 0;
1263     operation.type = "exchange";
1264     operation.count = 8;
1265     operation.coupleIndex = std::pair(1, 3);
1266     int32_t initialIndex = 0;
1267     lazyForEachBuilder->totalCountOfOriginalDataset_ = 9;
1268     std::map<int32_t, LazyForEachChild> cachedTemp;
1269     std::map<int32_t, LazyForEachChild> expiringTemp;
1270     lazyForEachBuilder->OperateExchange(operation, initialIndex, cachedTemp, expiringTemp);
1271     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 2);
1272 
1273     /**
1274      * @tc.steps: step3. fromIndexExist == operationList_.end()
1275      */
1276     std::string str0 = "0";
1277     expiringTemp[0] = LazyForEachChild(str0, nullptr);
1278     cachedTemp[0] = LazyForEachChild(str0, nullptr);
1279     OperationInfo operationinfo;
1280     lazyForEachBuilder->operationList_[0] = operationinfo;
1281     lazyForEachBuilder->OperateExchange(operation, initialIndex, cachedTemp, expiringTemp);
1282     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 3);
1283 
1284     /**
1285      * @tc.steps: step4. moveFromTo_ is not null
1286      */
1287     lazyForEachBuilder->moveFromTo_ = { 1, 3 };
1288     lazyForEachBuilder->UpdateMoveFromTo(2, 4);
1289     EXPECT_EQ(lazyForEachBuilder->moveFromTo_.value().second, 4);
1290 }
1291 
1292 /**
1293  * @tc.name: LazyForEachBuilder12
1294  * @tc.desc: Create LazyForEach, invoke OnDatasetChange function.
1295  * @tc.type: FUNC
1296  */
1297 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder12, TestSize.Level1)
1298 {
1299     /**
1300      * @tc.steps: step1. Create LazyForEachNode
1301      * @tc.expected: Create LazyForEachNode success.
1302      */
1303     auto lazyForEachNode = CreateLazyForEachNode();
1304     ASSERT_NE(lazyForEachNode, nullptr);
1305 
1306     std::list<V2::Operation> DataOperations;
1307     V2::Operation operation1 = { .type = "add", .index = INDEX_0, .count = 1 };
1308     DataOperations.push_back(operation1);
1309 
1310     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1311         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1312     }
1313     lazyForEachNode->builder_->OnDatasetChange(DataOperations);
1314     lazyForEachNode->OnDatasetChange(DataOperations);
1315     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 7);
1316     EXPECT_EQ(lazyForEachNode->builder_->operationList_.size(), 0);
1317 
1318     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1319         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1320     }
1321     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 9);
1322     EXPECT_EQ(lazyForEachNode->builder_->operationList_.size(), 0);
1323 }
1324 
1325 /**
1326  * @tc.name: LazyForEachBuilder13
1327  * @tc.desc: Create LazyForEach, update its Items and invoke InitDragManager function.
1328  * @tc.type: FUNC
1329  */
1330 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder13, TestSize.Level1)
1331 {
1332     /**
1333      * @tc.steps: step1. Create LazyForEachNode
1334      * @tc.expected: Create LazyForEachNode success.
1335      */
1336     auto lazyForEachNode = CreateLazyForEachNode();
1337     ASSERT_NE(lazyForEachNode, nullptr);
1338 
1339     /**
1340      * @tc.steps: step2. parentNode->GetTag() != V2::LIST_ETS_TAG.
1341      * @tc.expected: LazyForEachNode ids_ will be cleared.
1342      */
1343     auto parentNode = CreateNode(V2::TEXT_ETS_TAG);
1344     lazyForEachNode->SetParent(parentNode);
1345     auto frameChild = AceType::DynamicCast<FrameNode>(lazyForEachNode->GetFrameChildByIndex(0, true));
1346     lazyForEachNode->InitDragManager(frameChild);
1347     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1348 
1349     /**
1350      * @tc.steps: step3. Invoke NotifyCountChange.
1351      * @tc.expected: LazyForEachNode ids_ will be cleared.
1352      */
1353     parentNode = CreateNode(V2::LIST_ETS_TAG);
1354     lazyForEachNode->SetParent(parentNode);
1355     lazyForEachNode->InitDragManager(frameChild);
1356     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1357 }
1358 
1359 /**
1360  * @tc.name: LazyForEachBuilder14
1361  * @tc.desc: Create LazyForEach, update its Items and invoke GetFrameChildByIndex function.
1362  * @tc.type: FUNC
1363  */
1364 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder14, TestSize.Level1)
1365 {
1366     /**
1367      * @tc.steps: step1. Create LazyForEachNode
1368      * @tc.expected: Create LazyForEachNode success.
1369      */
1370     auto lazyForEachNode = CreateLazyForEachNode();
1371     ASSERT_NE(lazyForEachNode, nullptr);
1372 
1373     /**
1374      * @tc.steps: step2. Invoke GetFrameChildByIndex.
1375      * @tc.expected: LazyForEachNode ids_ will be cleared.
1376      */
1377     lazyForEachNode->needPredict_ = false;
1378     EXPECT_NE(lazyForEachNode->GetFrameChildByIndex(0, true, true), nullptr);
1379 
1380     lazyForEachNode->needPredict_ = false;
1381     EXPECT_NE(lazyForEachNode->GetFrameChildByIndex(0, true, true, true), nullptr);
1382 
1383     lazyForEachNode->needPredict_ = false;
1384     EXPECT_NE(lazyForEachNode->GetFrameChildByIndex(0, true, false, true), nullptr);
1385 
1386     /**
1387      * @tc.steps: step3. Invoke GetFrameChildByIndex.
1388      * @tc.expected: LazyForEachNode ids_ will be cleared.
1389      */
1390     lazyForEachNode->needPredict_ = true;
1391     EXPECT_NE(lazyForEachNode->GetFrameChildByIndex(0, false, true), nullptr);
1392 
1393     lazyForEachNode->needPredict_ = true;
1394     EXPECT_NE(lazyForEachNode->GetFrameChildByIndex(0, false, true, true), nullptr);
1395 
1396     lazyForEachNode->needPredict_ = true;
1397     EXPECT_NE(lazyForEachNode->GetFrameChildByIndex(0, false, false, true), nullptr);
1398 
1399     /**
1400      * @tc.steps: step4. Invoke GetFrameChildByIndex.
1401      * @tc.expected: LazyForEachNode ids_ will be cleared.
1402      */
1403     lazyForEachNode->onMainTree_ = true;
__anon642dcef90202(int32_t a, int32_t b) 1404     std::function<void(int32_t, int32_t)> lambda = [](int32_t a, int32_t b) {};
1405     lazyForEachNode->onMoveEvent_ = std::move(lambda);
1406     lazyForEachNode->needPredict_ = true;
1407     lazyForEachNode->GetFrameChildByIndex(0, false);
1408     EXPECT_NE(lazyForEachNode->GetFrameChildByIndex(0, false), nullptr);
1409 }
1410 
1411 /**
1412  * @tc.name: LazyForEachBuilder15
1413  * @tc.desc: Create LazyForEach, update its Items and invoke GetIndexByUINode function.
1414  * @tc.type: FUNC
1415  */
1416 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder15, TestSize.Level1)
1417 {
1418     /**
1419      * @tc.steps: step1. Create LazyForEachNode
1420      * @tc.expected: Create LazyForEachNode success.
1421      */
1422     auto lazyForEachNode = CreateLazyForEachNode();
1423     ASSERT_NE(lazyForEachNode, nullptr);
1424 
1425     /**
1426      * @tc.steps: step2. Invoke GetIndexByUINode.
1427      * @tc.expected: LazyForEachNode ids_ will be cleared.
1428      */
1429     lazyForEachNode->needPredict_ = true;
1430     auto& node = lazyForEachNode->builder_->cachedItems_[0].second;
1431     EXPECT_GE(lazyForEachNode->GetIndexByUINode(node), 0);
1432 }
1433 
1434 /**
1435  * @tc.name: LazyForEachBuilder16
1436  * @tc.desc: Create LazyForEach, update its Items and invoke :OnDataBulkDeleted function.
1437  * @tc.type: FUNC
1438  */
1439 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder16, TestSize.Level1)
1440 {
1441     /**
1442      * @tc.steps: step1. Create LazyForEachNode
1443      * @tc.expected: Create LazyForEachNode success.
1444      */
1445     auto lazyForEachNode = CreateLazyForEachNode();
1446     ASSERT_NE(lazyForEachNode, nullptr);
1447     auto lazyForEachBuilder = lazyForEachNode->builder_;
1448     ASSERT_NE(lazyForEachBuilder, nullptr);
1449 
1450     lazyForEachBuilder->OnDataBulkDeleted(INDEX_0, INDEX_0);
1451     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1452         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
1453     }
1454     lazyForEachBuilder->OnDataChanged(INDEX_1);
1455     lazyForEachBuilder->cachedItems_[INDEX_1].second = nullptr;
1456     lazyForEachBuilder->OnDataChanged(INDEX_1);
1457     lazyForEachNode->OnDataBulkDeleted(INDEX_0, INDEX_1);
1458 }
1459 
1460 /**
1461  * @tc.name: LazyForEachBuilder17
1462  * @tc.desc: Create LazyForEach, update its Items and invoke OnConfigurationUpdate function.
1463  * @tc.type: FUNC
1464  */
1465 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder17, TestSize.Level1)
1466 {
1467     /**
1468      * @tc.steps: step1. Create LazyForEachNode
1469      * @tc.expected: Create LazyForEachNode success.
1470      */
1471     ConfigurationChange configurationChange;
1472     auto lazyForEachNode = CreateLazyForEachNode();
1473     ASSERT_NE(lazyForEachNode, nullptr);
1474 
1475     /**
1476      * @tc.steps: step2. Invoke colorModeUpdate = true and UINode is not null
1477      */
1478     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
1479     lazyForEachNode->builder_->expiringItem_["0"] = LazyForEachCacheChild(0, frameNode);
1480     configurationChange.colorModeUpdate = true;
1481     lazyForEachNode->OnConfigurationUpdate(configurationChange);
1482     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1483 
1484     /**
1485      * @tc.steps: step3. colorModeUpdate = false and UINode is not null
1486      */
1487     configurationChange.colorModeUpdate = false;
1488     lazyForEachNode->OnConfigurationUpdate(configurationChange);
1489     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1490 
1491     /**
1492      * @tc.steps: step4. Invoke OnConfigurationUpdate and UINode is null
1493      */
1494     lazyForEachNode->builder_->expiringItem_["0"] = LazyForEachCacheChild(0, nullptr);
1495     configurationChange.colorModeUpdate = true;
1496     lazyForEachNode->OnConfigurationUpdate(configurationChange);
1497     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1498 }
1499 
1500 /**
1501  * @tc.name: LazyForEachBuilder18
1502  * @tc.desc: Create LazyForEach, update its Items and invoke UpdateChildrenFreezeState function.
1503  * @tc.type: FUNC
1504  */
1505 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder18, TestSize.Level1)
1506 {
1507     /**
1508      * @tc.steps: step1. Create LazyForEachNode
1509      * @tc.expected: Create LazyForEachNode success.
1510      */
1511     auto lazyForEachNode = CreateLazyForEachNode();
1512     ASSERT_NE(lazyForEachNode, nullptr);
1513 
1514     /**
1515      * @tc.steps: step2. Invoke UpdateChildrenFreezeState.
1516      * @tc.expected: LazyForEachNode ids_ will be cleared.
1517      */
1518     lazyForEachNode->UpdateChildrenFreezeState(true);
1519     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1520 
1521     /**
1522      * @tc.steps: step3. Invoke UpdateChildrenFreezeState.
1523      * @tc.expected: LazyForEachNode ids_ will be cleared.
1524      */
1525     lazyForEachNode->builder_ = nullptr;
1526     lazyForEachNode->UpdateChildrenFreezeState(true);
1527     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1528 }
1529 
1530 /**
1531  * @tc.name: LazyForEachBuilder19
1532  * @tc.desc: Create LazyForEach, update its Items and invoke InitDragManager function.
1533  * @tc.type: FUNC
1534  */
1535 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder19, TestSize.Level1)
1536 {
1537     /**
1538      * @tc.steps: step1. Create LazyForEachNode
1539      * @tc.expected: Create LazyForEachNode success.
1540      */
1541     auto lazyForEachNode = CreateLazyForEachNode();
1542     ASSERT_NE(lazyForEachNode, nullptr);
1543 
1544     /**
1545      * @tc.steps: step2. Invoke InitAllChilrenDragManager.
1546      * @tc.expected: LazyForEachNode ids_ will be cleared.
1547      */
1548     auto parentNode = CreateNode(V2::TEXT_ETS_TAG);
1549     lazyForEachNode->SetParent(parentNode);
1550     lazyForEachNode->InitAllChilrenDragManager(true);
1551     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1552 
1553     /**
1554      * @tc.steps: step3. Invoke InitAllChilrenDragManager.
1555      * @tc.expected: LazyForEachNode ids_ will be cleared.
1556      */
1557     parentNode = CreateNode(V2::LIST_ETS_TAG);
1558     lazyForEachNode->SetParent(parentNode);
1559     lazyForEachNode->InitAllChilrenDragManager(true);
1560     EXPECT_TRUE(lazyForEachNode->ids_.empty());
1561 }
1562 
1563 /**
1564  * @tc.name: LazyForEachBuilder20
1565  * @tc.desc: Create LazyForEach.
1566  * @tc.type: FUNC
1567  */
1568 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder20, TestSize.Level1)
1569 {
1570     /**
1571      * @tc.steps: step1. Create LazyForEachNode
1572      * @tc.expected: Create LazyForEachNode success.
1573      */
1574     auto lazyForEachNode = CreateLazyForEachNode();
1575     ASSERT_NE(lazyForEachNode, nullptr);
1576     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1577         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1578     }
1579 
1580     /**
1581      * @tc.steps: step2. Invoke OnDatasetChange function.
1582      * @tc.expected: Create reload operation and Invoke OnDatasetChange function.
1583      */
1584     std::list<V2::Operation> DataOperations;
1585     V2::Operation operation1 = { .type = "reload" };
1586     DataOperations.push_back(operation1);
1587     lazyForEachNode->OnDatasetChange(DataOperations);
1588     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 0);
1589     EXPECT_EQ(lazyForEachNode->builder_->operationList_.size(), 0);
1590     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1591         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1592     }
1593     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 7);
1594 }
1595 
1596 /**
1597  * @tc.name: LazyForEachBuilder21
1598  * @tc.desc: Create LazyForEach.
1599  * @tc.type: FUNC
1600  */
1601 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder21, TestSize.Level1)
1602 {
1603     /**
1604      * @tc.steps: step1. Create LazyForEachNode
1605      * @tc.expected: Create LazyForEachNode success.
1606      */
1607     auto lazyForEachNode = CreateLazyForEachNode();
1608     ASSERT_NE(lazyForEachNode, nullptr);
1609 
1610     /**
1611      * @tc.steps: step2. Invoke OnDatasetChange function.
1612      * @tc.expected: Create add operation and Invoke OnDatasetChange function.
1613      */
1614     std::list<V2::Operation> DataOperations;
1615     V2::Operation operation1 = { .type = "add", .index = INDEX_0, .count = 1 };
1616     DataOperations.push_back(operation1);
1617     lazyForEachNode->OnDatasetChange(DataOperations);
1618     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1619         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1620     }
1621     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 8);
1622     EXPECT_EQ(lazyForEachNode->builder_->operationList_.size(), 0);
1623 
1624     /**
1625      * @tc.steps: step3. Invoke OnDatasetChange function.
1626      * @tc.expected: Create add operation and Invoke OnDatasetChange function.
1627      */
1628     DataOperations.clear();
1629     V2::Operation operation2 = { .type = "add", .index = INDEX_0, .count = 2 };
1630     DataOperations.push_back(operation2);
1631     lazyForEachNode->OnDatasetChange(DataOperations);
1632     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1633         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1634     }
1635     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 10);
1636     EXPECT_EQ(lazyForEachNode->builder_->operationList_.size(), 0);
1637 }
1638 
1639 /**
1640  * @tc.name: LazyForEachBuilder22
1641  * @tc.desc: Create LazyForEach.
1642  * @tc.type: FUNC
1643  */
1644 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder22, TestSize.Level1)
1645 {
1646     /**
1647      * @tc.steps: step1. Create LazyForEachNode
1648      * @tc.expected: Create LazyForEachNode success.
1649      */
1650     auto lazyForEachNode = CreateLazyForEachNode();
1651     ASSERT_NE(lazyForEachNode, nullptr);
1652     auto lazyForEachBuilder = lazyForEachNode->builder_;
1653     ASSERT_NE(lazyForEachBuilder, nullptr);
1654     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1655         lazyForEachBuilder->GetChildByIndex(iter.value_or(0), true);
1656     }
1657 
1658     /**
1659      * @tc.steps: step2. Invoke OnDatasetChange function.
1660      * @tc.expected: Create delete operation and Invoke OnDatasetChange function.
1661      */
1662     lazyForEachBuilder->UpdateHistoricalTotalCount(lazyForEachBuilder->GetTotalCount());
1663     std::list<V2::Operation> DataOperations;
1664     V2::Operation operation1 = { .type = "delete", .index = INDEX_0, .count = 1 };
1665     DataOperations.push_back(operation1);
1666     lazyForEachNode->OnDatasetChange(DataOperations);
1667     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 6);
1668     EXPECT_EQ(lazyForEachNode->builder_->operationList_.size(), 0);
1669 
1670     /**
1671      * @tc.steps: step3. Invoke OnDatasetChange function.
1672      * @tc.expected: Create delete operation and Invoke OnDatasetChange function.
1673      */
1674     DataOperations.clear();
1675     lazyForEachBuilder->UpdateHistoricalTotalCount(lazyForEachBuilder->GetTotalCount());
1676     V2::Operation operation2 = { .type = "delete", .index = INDEX_0, .count = 2 };
1677     DataOperations.push_back(operation2);
1678     lazyForEachNode->OnDatasetChange(DataOperations);
1679     EXPECT_EQ(lazyForEachNode->builder_->cachedItems_.size(), 4);
1680     EXPECT_EQ(lazyForEachNode->builder_->operationList_.size(), 0);
1681 }
1682 
1683 /**
1684  * @tc.name: LazyForEachBuilder23
1685  * @tc.desc: Create LazyForEach.
1686  * @tc.type: FUNC
1687  */
1688 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder23, TestSize.Level1)
1689 {
1690     /**
1691      * @tc.steps: step1. Create LazyForEachNode
1692      * @tc.expected: Create LazyForEachNode success.
1693      */
1694     auto lazyForEachNode = CreateLazyForEachNode();
1695     ASSERT_NE(lazyForEachNode, nullptr);
1696     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1697         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1698     }
1699 
1700     /**
1701      * @tc.steps: step3. Invoke OnDatasetChange function.
1702      * @tc.expected: Create change operation and Invoke OnDatasetChange function.
1703      */
1704     std::list<V2::Operation> DataOperations;
1705     V2::Operation operation1 = { .type = "change", .index = INDEX_0 };
1706     DataOperations.push_back(operation1);
1707     lazyForEachNode->OnDatasetChange(DataOperations);
1708     EXPECT_EQ(lazyForEachNode->builder_->OnGetTotalCount(), 7);
1709 }
1710 
1711 /**
1712  * @tc.name: LazyForEachBuilder24
1713  * @tc.desc: Create LazyForEach.
1714  * @tc.type: FUNC
1715  */
1716 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder24, TestSize.Level1)
1717 {
1718     /**
1719      * @tc.steps: step1. Create LazyForEachNode
1720      * @tc.expected: Create LazyForEachNode success.
1721      */
1722     auto lazyForEachNode = CreateLazyForEachNode();
1723     ASSERT_NE(lazyForEachNode, nullptr);
1724     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1725         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1726     }
1727 
1728     /**
1729      * @tc.steps: step2. Invoke OnDatasetChange function.
1730      * @tc.expected: Create move operation and Invoke OnDatasetChange function.
1731      */
1732     std::list<V2::Operation> DataOperations;
1733     V2::Operation operation1 = { .type = "move", .coupleIndex = std::pair(0, 2) };
1734     DataOperations.push_back(operation1);
1735     lazyForEachNode->OnDatasetChange(DataOperations);
1736     EXPECT_EQ(lazyForEachNode->builder_->OnGetTotalCount(), 7);
1737 }
1738 
1739 /**
1740  * @tc.name: LazyForEachBuilder25
1741  * @tc.desc: Create LazyForEach.
1742  * @tc.type: FUNC
1743  */
1744 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder25, TestSize.Level1)
1745 {
1746     /**
1747      * @tc.steps: step1. Create LazyForEachNode
1748      * @tc.expected: Create LazyForEachNode success.
1749      */
1750     auto lazyForEachNode = CreateLazyForEachNode();
1751     ASSERT_NE(lazyForEachNode, nullptr);
1752     for (auto iter : LAZY_FOR_EACH_NODE_IDS_INT) {
1753         lazyForEachNode->builder_->GetChildByIndex(iter.value_or(0), true);
1754     }
1755 
1756     /**
1757      * @tc.steps: step2. Invoke OnDatasetChange function.
1758      * @tc.expected: Create exchange operation and Invoke OnDatasetChange function.
1759      */
1760     std::list<V2::Operation> DataOperations;
1761     V2::Operation operation1 = { .type = "exchange", .coupleIndex = std::pair(1, 3) };
1762     DataOperations.push_back(operation1);
1763     lazyForEachNode->OnDatasetChange(DataOperations);
1764     EXPECT_EQ(lazyForEachNode->builder_->OnGetTotalCount(), 7);
1765 }
1766 
1767 /**
1768  * @tc.name: LazyForEachBuilder26
1769  * @tc.desc: test the founction of OnDataAdded in LazyForEachBuilder.
1770  * @tc.type: FUNC
1771  */
1772 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder26, TestSize.Level1)
1773 {
1774     auto lazyForEachBuilder = CreateLazyForEachBuilder();
1775     ASSERT_NE(lazyForEachBuilder, nullptr);
1776     /**
1777      * @tc.expected: No cachedItems_ is added in index > static_cast<size_t>(cachedItems_.rbegin()->first).
1778      */
1779     EXPECT_EQ(lazyForEachBuilder->cachedItems_.size(), 7);
1780     lazyForEachBuilder->OnDataAdded(9);
1781     EXPECT_EQ(lazyForEachBuilder->cachedItems_.size(), 7);
1782     /**
1783      * @tc.expected: node.first++ in static_cast<size_t>(node.first) >= index && node.first != -1.
1784      */
1785     lazyForEachBuilder->expiringItem_["6"] = LazyForEachCacheChild(6, nullptr);
1786     lazyForEachBuilder->OnDataAdded(6);
1787     EXPECT_EQ(lazyForEachBuilder->expiringItem_["6"].first, 7);
1788     /**
1789      * @tc.expected: node.first dont change in node.first == -1.
1790      */
1791     lazyForEachBuilder->expiringItem_["6"] = LazyForEachCacheChild(-1, nullptr);
1792     lazyForEachBuilder->OnDataAdded(-1);
1793     EXPECT_EQ(lazyForEachBuilder->expiringItem_["6"].first, -1);
1794 }
1795 
1796 /**
1797  * @tc.name: LazyForEachBuilder27
1798  * @tc.desc: test the founction of OnDataBulkAdded in LazyForEachBuilder.
1799  * @tc.type: FUNC
1800  */
1801 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder27, TestSize.Level1)
1802 {
1803     auto lazyForEachBuilder = CreateLazyForEachBuilder();
1804     ASSERT_NE(lazyForEachBuilder, nullptr);
1805     /**
1806      * @tc.expected: node.first + count in static_cast<size_t>(node.first) >= index && node.first != -1.
1807      */
1808     lazyForEachBuilder->expiringItem_["6"] = LazyForEachCacheChild(6, nullptr);
1809     lazyForEachBuilder->OnDataBulkAdded(6, 3);
1810     EXPECT_EQ(lazyForEachBuilder->expiringItem_["6"].first, 9);
1811     /**
1812      * @tc.expected: node.first dont change in node.first == -1.
1813      */
1814     lazyForEachBuilder->expiringItem_["6"] = LazyForEachCacheChild(-1, nullptr);
1815     lazyForEachBuilder->OnDataAdded(-1);
1816     EXPECT_EQ(lazyForEachBuilder->expiringItem_["6"].first, -1);
1817 }
1818 
1819 /**
1820  * @tc.name: LazyForEachBuilder28
1821  * @tc.desc: test the founction of OnDataDeleted in LazyForEachBuilder.
1822  * @tc.type: FUNC
1823  */
1824 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder28, TestSize.Level1)
1825 {
1826     auto lazyForEachBuilder = CreateLazyForEachBuilder();
1827     ASSERT_NE(lazyForEachBuilder, nullptr);
1828     /**
1829      * @tc.expected: child.first = -1 in static_cast<size_t>(child.first) == index.
1830      */
1831     lazyForEachBuilder->expiringItem_["6"] = LazyForEachCacheChild(6, nullptr);
1832     lazyForEachBuilder->OnDataDeleted(6);
1833     EXPECT_EQ(lazyForEachBuilder->expiringItem_["6"].first, -1);
1834     /**
1835      * @tc.expected: return node nullptr in static_cast<size_t>(child.first) < index.
1836      */
1837     lazyForEachBuilder->expiringItem_["6"] = LazyForEachCacheChild(6, nullptr);
1838     ASSERT_EQ(lazyForEachBuilder->OnDataDeleted(10), nullptr);
1839 }
1840 
1841 /**
1842  * @tc.name: LazyForEachBuilder29
1843  * @tc.desc: test the founction of OnDataBulkDeleted in LazyForEachBuilder.
1844  * @tc.type: FUNC
1845  */
1846 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder29, TestSize.Level1)
1847 {
1848     auto lazyForEachBuilder = CreateLazyForEachBuilder(true);
1849     ASSERT_NE(lazyForEachBuilder, nullptr);
1850     lazyForEachBuilder->expiringItem_["-1"] = LazyForEachCacheChild(-1, nullptr);
1851     lazyForEachBuilder->expiringItem_["5"] = LazyForEachCacheChild(5, nullptr);
1852     lazyForEachBuilder->expiringItem_["7"] = LazyForEachCacheChild(7, nullptr);
1853     lazyForEachBuilder->expiringItem_["10"] = LazyForEachCacheChild(10, nullptr);
1854     lazyForEachBuilder->OnDataBulkDeleted(6, 2);
1855     /**
1856      * @tc.expected: child.first -= count when static_cast<size_t>(child.first) >= index + count.
1857      */
1858     EXPECT_EQ(lazyForEachBuilder->expiringItem_.find("10")->second.first, 8);
1859     /**
1860      * @tc.expected: child.first no change when child.first < index and child.first>0.
1861      */
1862     EXPECT_EQ(lazyForEachBuilder->expiringItem_.find("5")->second.first, 5);
1863     bool negativeFlag = false;
1864     bool normalLimitFlag = false;
1865     for (const auto& item : lazyForEachBuilder->nodeList_) {
1866         if (item.first == "-1") {
1867             negativeFlag = true;
1868         } else if (item.first == "7") {
1869             normalLimitFlag = true;
1870         }
1871     }
1872     /**
1873      * @tc.expected: nodeList_ contains -1 when child.first < 0.
1874      */
1875     EXPECT_TRUE(negativeFlag);
1876     /**
1877      * @tc.expected: nodeList_ contains 7 when child.first >= index && child.first < index + count.
1878      */
1879     EXPECT_TRUE(normalLimitFlag);
1880 }
1881 
1882 /**
1883  * @tc.name: LazyForEachBuilder30
1884  * @tc.desc: test the founction of GetItems in LazyForEachBuilder.
1885  * @tc.type: FUNC
1886  */
1887 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder30, TestSize.Level1)
1888 {
1889     auto lazyForEachBuilder = CreateLazyForEachBuilder(true);
1890     ASSERT_NE(lazyForEachBuilder, nullptr);
1891     std::list<std::pair<std::string, RefPtr<UINode>>> childList;
1892     lazyForEachBuilder->isLoop_ = true;
1893     auto node = AceType::MakeRefPtr<NG::FrameNode>(V2::TEXT_ETS_TAG, 666, AceType::MakeRefPtr<NG::Pattern>());
1894     node->isActive_ = true;
1895     lazyForEachBuilder->cachedItems_ = { { 1, { "1", node } }, { 3, { "3", node } }, { 5, { "5", node } } };
1896     lazyForEachBuilder->GetItems(childList);
1897     /**
1898      * @tc.expected: startIndex_ = 3 and endIndex_ = 1 when lastIndex > -1 && index - lastIndex > 1.
1899      */
1900     EXPECT_EQ(lazyForEachBuilder->startIndex_, 3);
1901     EXPECT_EQ(lazyForEachBuilder->endIndex_, 1);
1902     /**
1903      * @tc.expected: startIndex_ = 1 and endIndex_ = 3 when index - lastIndex <= 1.
1904      */
1905     lazyForEachBuilder->cachedItems_ = { { 1, { "1", node } }, { 2, { "2", node } }, { 3, { "3", node } } };
1906     lazyForEachBuilder->GetItems(childList);
1907     EXPECT_EQ(lazyForEachBuilder->startIndex_, 1);
1908     EXPECT_EQ(lazyForEachBuilder->endIndex_, 3);
1909 }
1910 
1911 /**
1912  * @tc.name: LazyForEachBuilder31
1913  * @tc.desc: test the founction of RepairDatasetItems in LazyForEachBuilder.
1914  * @tc.type: FUNC
1915  */
1916 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder31, TestSize.Level1)
1917 {
1918     auto lazyForEachBuilder = CreateLazyForEachBuilder(true);
1919     ASSERT_NE(lazyForEachBuilder, nullptr);
1920     std::map<int32_t, LazyForEachChild> cachedTemp = {
1921         { 1, { "1", nullptr } },
1922         { 2, { "2", nullptr } },
1923     };
1924     std::map<int32_t, int32_t> indexChangedMap;
1925     std::map<int32_t, LazyForEachChild> expiringTempItem;
1926     OperationInfo operationinfo;
1927     lazyForEachBuilder->operationList_[0] = operationinfo;
1928     lazyForEachBuilder->RepairDatasetItems(cachedTemp, expiringTempItem, indexChangedMap);
1929     /**
1930      * @tc.expected: key = 1 when OperationInfo default & indexChangedMap.empty().
1931      */
1932     EXPECT_TRUE(expiringTempItem.find(1) != expiringTempItem.end());
1933     lazyForEachBuilder->operationList_.clear();
1934     expiringTempItem.clear();
1935     indexChangedMap = {
1936         { 1, 3 },
1937     };
1938     operationinfo.isChanged = true;
1939     lazyForEachBuilder->operationList_[0] = operationinfo;
1940     lazyForEachBuilder->RepairDatasetItems(cachedTemp, expiringTempItem, indexChangedMap);
1941     /**
1942      * @tc.expected: key = 4 when OperationInfo isChanged.
1943      */
1944     EXPECT_TRUE(expiringTempItem.find(4) != expiringTempItem.end());
1945 }
1946 
1947 /**
1948  * @tc.name: LazyForEachBuilder32
1949  * @tc.desc: test the founction of RepairMoveOrExchange in LazyForEachBuilder.
1950  * @tc.type: FUNC
1951  */
1952 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder32, TestSize.Level1)
1953 {
1954     auto lazyForEachBuilder = CreateLazyForEachBuilder(true);
1955     ASSERT_NE(lazyForEachBuilder, nullptr);
1956     auto node = AceType::MakeRefPtr<NG::FrameNode>(V2::TEXT_ETS_TAG, 666, AceType::MakeRefPtr<NG::Pattern>());
1957     std::map<int32_t, LazyForEachChild> cachedTemp = {
1958         { 0, { "0", node } },
1959         { 1, { "1", nullptr } },
1960     };
1961     std::map<int32_t, LazyForEachChild> expiringTempItem;
1962     OperationInfo operationinfo;
1963     operationinfo.isExchange = true;
1964     lazyForEachBuilder->RepairMoveOrExchange(expiringTempItem, operationinfo, cachedTemp[0], 1, 0);
1965     /**
1966      * @tc.expected: nodeList size = 1 when info.node == nullptr && child.second != nullptr.
1967      */
1968     EXPECT_EQ(lazyForEachBuilder->nodeList_.size(), 1);
1969     EXPECT_EQ(expiringTempItem.size(), 0);
1970     lazyForEachBuilder->nodeList_.clear();
1971     /**
1972      * @tc.expected: nodeList expiringTempItem size = 0 when info.node == nullptr && child.second == nullptr.
1973      */
1974     lazyForEachBuilder->RepairMoveOrExchange(expiringTempItem, operationinfo, cachedTemp[1], 1, 0);
1975     EXPECT_EQ(lazyForEachBuilder->nodeList_.size(), 0);
1976     EXPECT_EQ(expiringTempItem.size(), 0);
1977     /**
1978      * @tc.expected: expiringTempItem size = 1 when info.node != nullptrr.
1979      */
1980     operationinfo.node = node;
1981     lazyForEachBuilder->RepairMoveOrExchange(expiringTempItem, operationinfo, cachedTemp[0], 1, 0);
1982     EXPECT_EQ(lazyForEachBuilder->nodeList_.size(), 0);
1983     EXPECT_EQ(expiringTempItem.size(), 1);
1984     operationinfo.isExchange = false;
1985     operationinfo.moveIn = true;
1986     operationinfo.fromDiffTo = 1;
1987     operationinfo.key = "6";
1988     expiringTempItem.clear();
1989     lazyForEachBuilder->RepairMoveOrExchange(expiringTempItem, operationinfo, cachedTemp[0], 1, 1);
1990     /**
1991      * @tc.expected: expiringTempItem size = 2 when fromDiffTo > 0.
1992      */
1993     EXPECT_EQ(expiringTempItem.size(), 2);
1994 }
1995 
1996 /**
1997  * @tc.name: LazyForEachBuilderRemoveAllChild001
1998  * @tc.desc: Create LazyForEach.
1999  * @tc.type: FUNC
2000  */
2001 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilderRemoveAllChild001, TestSize.Level1)
2002 {
2003     /**
2004      * @tc.steps: step1. Create CreateLazyForEachBuilder
2005      * @tc.expected: Create CreateLazyForEachBuilder success.
2006      */
2007     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2008     ASSERT_NE(lazyForEachBuilder, nullptr);
2009 
2010     /**
2011      * @tc.steps: step2. Invoke RemoveAllChild function.
2012      * @tc.expected: Mock cachedItems_ to RemoveAllChild success.
2013      */
2014     std::string str1 = "1";
2015     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str1, nullptr);
2016     lazyForEachBuilder->RemoveAllChild();
2017     EXPECT_EQ(lazyForEachBuilder->expiringItem_.size(), 6);
2018 }
2019 
2020 /**
2021  * @tc.name: LazyForEachBuilderSetActiveChildRange001
2022  * @tc.desc: Create LazyForEach.
2023  * @tc.type: FUNC
2024  */
2025 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilderSetActiveChildRange001, TestSize.Level1)
2026 {
2027     /**
2028      * @tc.steps: step1. Create CreateLazyForEachBuilder
2029      * @tc.expected: Create CreateLazyForEachBuilder success.
2030      */
2031     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2032     ASSERT_NE(lazyForEachBuilder, nullptr);
2033     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
2034         lazyForEachBuilder->expiringItem_.try_emplace(node.first, LazyForEachCacheChild(-1, std::move(node.second)));
2035     }
2036 
2037     /**
2038      * @tc.steps: step2. Invoke SetActiveChildRange function.
2039      * @tc.expected: Mock cachedItems_ to SetActiveChildRange success.
2040      */
2041     std::string str0 = "0";
2042     lazyForEachBuilder->cachedItems_[0] = LazyForEachChild(str0, nullptr);
2043     std::string str9 = "9";
2044     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str9, nullptr);
2045     auto ret = lazyForEachBuilder->SetActiveChildRange(0, 1);
2046     EXPECT_EQ(lazyForEachBuilder->expiringItem_.size(), 6);
2047     EXPECT_TRUE(ret);
2048 }
2049 
2050 /**
2051  * @tc.name: LazyForEachBuilderGetChildIndex001
2052  * @tc.desc: Create LazyForEach.
2053  * @tc.type: FUNC
2054  */
2055 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilderGetChildIndex001, TestSize.Level1)
2056 {
2057     /**
2058      * @tc.steps: step1. Create CreateLazyForEachBuilder
2059      * @tc.expected: Create CreateLazyForEachBuilder success.
2060      */
2061     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2062     ASSERT_NE(lazyForEachBuilder, nullptr);
2063     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
2064         lazyForEachBuilder->expiringItem_.try_emplace(node.first, LazyForEachCacheChild(-1, std::move(node.second)));
2065     }
2066     /**
2067      * @tc.steps: step2. Invoke GetChildIndex function.
2068      * @tc.expected: Mock cachedItems_ and expiringItem_ to GetChildIndex success.
2069      */
2070     std::string str0 = "0";
2071     lazyForEachBuilder->cachedItems_[0] = LazyForEachChild(str0, nullptr);
2072     lazyForEachBuilder->expiringItem_["0"] = LazyForEachCacheChild(0, nullptr);
2073     auto frameNode = CreateNode(V2::TEXT_ETS_TAG);
2074     lazyForEachBuilder->expiringItem_["2"] = LazyForEachCacheChild(2, frameNode);
2075     auto ret = lazyForEachBuilder->GetChildIndex(frameNode);
2076     EXPECT_NE(ret, -1);
2077 
2078     /**
2079      * @tc.steps: step3. Invoke GetChildIndex function.
2080      * @tc.expected: Mock cachedItems_ and expiringItem_ to GetChildIndex failed and return default value.
2081      */
2082     auto listNode = CreateNode(V2::LIST_ETS_TAG);
2083     ret = lazyForEachBuilder->GetChildIndex(listNode);
2084     EXPECT_EQ(ret, -1);
2085 }
2086 
2087 /**
2088  * @tc.name: LazyForEachBuilderCacheItem001
2089  * @tc.desc: Create LazyForEach.
2090  * @tc.type: FUNC
2091  */
2092 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilderCacheItem001, TestSize.Level1)
2093 {
2094     /**
2095      * @tc.steps: step1. Create CreateLazyForEachBuilder
2096      * @tc.expected: Create CreateLazyForEachBuilder success.
2097      */
2098     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2099     ASSERT_NE(lazyForEachBuilder, nullptr);
2100     for (auto& [index, node] : lazyForEachBuilder->cachedItems_) {
2101         lazyForEachBuilder->expiringItem_.try_emplace(node.first, LazyForEachCacheChild(-1, std::move(node.second)));
2102     }
2103     /**
2104      * @tc.steps: step2. Invoke GetChildIndex function.
2105      * @tc.expected: Mock cachedItems_ and expiringItem_ to GetChildIndex success.
2106      */
2107     LayoutConstraintF layoutConstraint;
2108     layoutConstraint.parentIdealSize = OptionalSizeF(768, 1024);
2109     layoutConstraint.selfIdealSize = OptionalSizeF(480, 960);
2110     std::unordered_map<std::string, LazyForEachCacheChild> cache;
2111     bool isTimeout = false;
2112     auto ret = lazyForEachBuilder->CacheItem(0, cache, layoutConstraint, 10, isTimeout);
2113     EXPECT_EQ(ret->GetId(), -1);
2114 }
2115 
2116 /**
2117  * @tc.name: LazyForEachBuilderOperateReload001
2118  * @tc.desc: LazyForEachBuilder::OperateReload
2119  * @tc.type: FUNC
2120  */
2121 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilderOperateReload001, TestSize.Level1)
2122 {
2123     /**
2124      * @tc.steps: step1. Create LazyForEachBuilder
2125      * @tc.expected: Create LazyForEachBuilder success.
2126      */
2127     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2128     ASSERT_NE(lazyForEachBuilder, nullptr);
2129 
2130     /**
2131      * @tc.steps: step2. Mock expiringTemp
2132      * @tc.expected: the count of expiringItem_ add the count of expiringTemp.
2133      */
2134     std::map<int32_t, LazyForEachChild> expiringTemp;
2135     expiringTemp.emplace(8, LazyForEachChild("8", nullptr));
2136     lazyForEachBuilder->OperateReload(expiringTemp);
2137     EXPECT_EQ(lazyForEachBuilder->expiringItem_.size(), 8);
2138 }
2139 
2140 /**
2141  * @tc.name: LazyForEachBuilderFindItem001
2142  * @tc.desc: LazyForEachBuilder::FindItem
2143  * @tc.type: FUNC
2144  */
2145 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilderFindItem001, TestSize.Level1)
2146 {
2147     /**
2148      * @tc.steps: step1. Create LazyForEachBuilder
2149      * @tc.expected: Create LazyForEachBuilder success.
2150      */
2151     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2152     ASSERT_NE(lazyForEachBuilder, nullptr);
2153 
2154     /**
2155      * @tc.steps: step2. Mock cachedTemp
2156      * @tc.expected: Find the node success.
2157      */
2158     std::map<int32_t, LazyForEachChild> cachedTemp;
2159     std::map<int32_t, LazyForEachChild> expiringTemp;
2160     cachedTemp.emplace(8, LazyForEachChild("8", CreateNode(V2::TEXT_ETS_TAG)));
2161     auto iter = lazyForEachBuilder->FindItem(8, cachedTemp, expiringTemp);
2162     EXPECT_EQ(iter->first, 8);
2163 }
2164 
2165 /**
2166  * @tc.name: LazyForEachBuilderOperateExchange001
2167  * @tc.desc: LazyForEachBuilder::OperateExchange
2168  * @tc.type: FUNC
2169  */
2170 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilderOperateExchange001, TestSize.Level1)
2171 {
2172     /**
2173      * @tc.steps: step1. Create LazyForEachBuilder
2174      * @tc.expected: Create LazyForEachBuilder success.
2175      */
2176     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2177     ASSERT_NE(lazyForEachBuilder, nullptr);
2178 
2179     /**
2180      * @tc.steps: step2. Mock cachedTemp and expiringTemp to Invoke OperateExchange Function
2181      * @tc.expected: Invoke OperateExchange success.
2182      */
2183     std::map<int32_t, LazyForEachChild> cachedTemp;
2184     std::map<int32_t, LazyForEachChild> expiringTemp;
2185     V2::Operation operation;
2186     operation.index = 0;
2187     operation.type = "exchange";
2188     operation.count = 8;
2189     operation.coupleIndex = std::pair(1, 3);
2190     int32_t initialIndex = 0;
2191     lazyForEachBuilder->totalCountOfOriginalDataset_ = 9;
2192     cachedTemp.emplace(1, LazyForEachChild("1", CreateNode(V2::TEXT_ETS_TAG)));
2193     expiringTemp.emplace(3, LazyForEachChild("3", CreateNode(V2::TEXT_ETS_TAG)));
2194     lazyForEachBuilder->OperateExchange(operation, initialIndex, cachedTemp, expiringTemp);
2195     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 2);
2196     EXPECT_TRUE(lazyForEachBuilder->operationList_.find(3) != lazyForEachBuilder->operationList_.end());
2197     /**
2198      * @tc.steps: step3. Set coupleKey Invoke OperateExchange Function
2199      * @tc.expected: Invoke OperateExchange success.
2200      */
2201     lazyForEachBuilder->operationList_.clear();
2202     operation.coupleKey = std::pair("1", "3");
2203     lazyForEachBuilder->OperateExchange(operation, initialIndex, cachedTemp, expiringTemp);
2204     EXPECT_EQ(lazyForEachBuilder->operationList_.size(), 2);
2205     EXPECT_TRUE(lazyForEachBuilder->operationList_.find(1) != lazyForEachBuilder->operationList_.end());
2206 }
2207 
2208 /**
2209  * @tc.name: CheckCacheIndex01
2210  * @tc.desc: Test the CheckCacheIndex function.
2211  * @tc.type: FUNC
2212  */
2213 HWTEST_F(LazyForEachSyntaxTestNg, CheckCacheIndex01, TestSize.Level1)
2214 {
2215     /**
2216      * @tc.steps: step1. Create ForEachBuilder and make count = 0.
2217      * @tc.expected: Create lazyForEachBuilder success and Invoke CheckCacheIndex function.
2218      */
2219     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2220     ASSERT_NE(lazyForEachBuilder, nullptr);
2221     std::set<int32_t> idleIndexes;
2222     lazyForEachBuilder->CheckCacheIndex(idleIndexes, 0);
2223     EXPECT_EQ(idleIndexes.size(), 0);
2224     /**
2225      * @tc.steps: step2. Create ForEachBuilder and make isLoop = true.
2226      * @tc.expected: make (startIndex_ <= endIndex_ && endIndex_ + i < count) = true.
2227      */
2228     idleIndexes.clear();
2229     lazyForEachBuilder->isLoop_ = true;
2230     lazyForEachBuilder->cacheCount_ = 3;
2231     lazyForEachBuilder->startIndex_ = 1;
2232     lazyForEachBuilder->endIndex_ = 1;
2233     lazyForEachBuilder->CheckCacheIndex(idleIndexes, 5);
2234     EXPECT_EQ(idleIndexes.count(2), 1);
2235     /**
2236      * @tc.steps: step3. Create ForEachBuilder and make isLoop = true.
2237      * @tc.expected: Create lazyForEachBuilder success and startIndex_ > endIndex_ + i.
2238      */
2239     idleIndexes.clear();
2240     lazyForEachBuilder->isLoop_ = true;
2241     lazyForEachBuilder->cacheCount_ = 2;
2242     lazyForEachBuilder->startIndex_ = 4;
2243     lazyForEachBuilder->endIndex_ = 1;
2244     lazyForEachBuilder->CheckCacheIndex(idleIndexes, 5);
2245     EXPECT_EQ(idleIndexes.count(2), 1);
2246     EXPECT_EQ(idleIndexes.count(3), 1);
2247 }
2248 
2249 /**
2250  * @tc.name: CheckCacheIndex02
2251  * @tc.desc: Test the CheckCacheIndex function.
2252  * @tc.type: FUNC
2253  */
2254 HWTEST_F(LazyForEachSyntaxTestNg, CheckCacheIndex02, TestSize.Level1)
2255 {
2256     /**
2257      * @tc.steps: step1. Create ForEachBuilder and make isLoop = true.
2258      * @tc.expected: Create lazyForEachBuilder success and (endIndex_ + i) % count < startIndex_.
2259      */
2260     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2261     ASSERT_NE(lazyForEachBuilder, nullptr);
2262     lazyForEachBuilder->isLoop_ = true;
2263     lazyForEachBuilder->cacheCount_ = 3;
2264     lazyForEachBuilder->startIndex_ = 2;
2265     lazyForEachBuilder->endIndex_ = 4;
2266     std::set<int32_t> idleIndexes;
2267     lazyForEachBuilder->CheckCacheIndex(idleIndexes, 5);
2268     EXPECT_EQ(idleIndexes.count(1), 1);
2269     /**
2270      * @tc.steps: step2. Create ForEachBuilder and make isLoop = true.
2271      * @tc.expected: Create lazyForEachBuilder success and (startIndex_ <= endIndex_ && startIndex_ >= i).
2272      */
2273     idleIndexes.clear();
2274     lazyForEachBuilder->cacheCount_ = 3;
2275     lazyForEachBuilder->startIndex_ = 2;
2276     lazyForEachBuilder->endIndex_ = 3;
2277     lazyForEachBuilder->CheckCacheIndex(idleIndexes, 5);
2278     EXPECT_EQ(idleIndexes.count(1), 1);
2279     /**
2280      * @tc.steps: step3. Create ForEachBuilder and make isLoop = true.
2281      * @tc.expected: Create lazyForEachBuilder success and startIndex_ > endIndex_ + i.
2282      */
2283     idleIndexes.clear();
2284     lazyForEachBuilder->cacheCount_ = 3;
2285     lazyForEachBuilder->startIndex_ = 3;
2286     lazyForEachBuilder->endIndex_ = 1;
2287     lazyForEachBuilder->CheckCacheIndex(idleIndexes, 5);
2288     EXPECT_EQ(idleIndexes.count(2), 1);
2289     /**
2290      * @tc.steps: step4. Create ForEachBuilder and make isLoop = true.
2291      * @tc.expected: Create lazyForEachBuilder success and (startIndex_ - i + count) % count > endIndex_.
2292      */
2293     idleIndexes.clear();
2294     lazyForEachBuilder->cacheCount_ = 3;
2295     lazyForEachBuilder->startIndex_ = 5;
2296     lazyForEachBuilder->endIndex_ = 1;
2297     lazyForEachBuilder->CheckCacheIndex(idleIndexes, 6);
2298     EXPECT_EQ(idleIndexes.count(2), 1);
2299 }
2300 
2301 /**
2302  * @tc.name: PreBuildByIndex01
2303  * @tc.desc: Test the PreBuildByIndex function.
2304  * @tc.type: FUNC
2305  */
2306 HWTEST_F(LazyForEachSyntaxTestNg, PreBuildByIndex01, TestSize.Level1)
2307 {
2308     /**
2309      * @tc.steps: make GetSysTimestamp() > deadline make canRunLongPredictTask to false.
2310      * @tc.expected: Create lazyForEachBuilder success and make isTimeout to false.
2311      */
2312     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2313     ASSERT_NE(lazyForEachBuilder, nullptr);
2314     int32_t index = 0;
2315     std::unordered_map<std::string, LazyForEachCacheChild> cache;
2316     int64_t deadline = GetSysTimestamp() + 10000;
2317     auto itemConstraint = LayoutConstraintF();
2318     bool canRunLongPredictTask = false;
2319     bool result = lazyForEachBuilder->PreBuildByIndex(index, cache, deadline, itemConstraint, canRunLongPredictTask);
2320     EXPECT_EQ(result, false);
2321 }
2322 
2323 /**
2324  * @tc.name: PreBuildByIndex02
2325  * @tc.desc: Test the PreBuildByIndex function.
2326  * @tc.type: FUNC
2327  */
2328 HWTEST_F(LazyForEachSyntaxTestNg, PreBuildByIndex02, TestSize.Level1)
2329 {
2330     /**
2331      * @tc.steps: make GetSysTimestamp() > deadline and canRunLongPredictTask to true.
2332      * @tc.expected: Create lazyForEachBuilder success and isTimeout to false.
2333      */
2334     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2335     ASSERT_NE(lazyForEachBuilder, nullptr);
2336     int32_t index = 0;
2337     std::unordered_map<std::string, LazyForEachCacheChild> cache;
2338     int64_t deadline = GetSysTimestamp() + 10000;
2339     std::optional<LayoutConstraintF> itemConstraint;
2340     bool canRunLongPredictTask = true;
2341     bool result = lazyForEachBuilder->PreBuildByIndex(index, cache, deadline, itemConstraint, canRunLongPredictTask);
2342     EXPECT_EQ(result, true);
2343 }
2344 /**
2345  * @tc.name: LazyForEachBuilder33
2346  * @tc.desc: Test the ProcessOffscreenNode function.
2347  * @tc.type: FUNC
2348  */
2349 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder33, TestSize.Level1)
2350 {
2351     /**
2352      * @tc.steps: step1. Invoke lazyForEach Create function.
2353      * @tc.expected: Create lazyForEachBuilder.
2354      */
2355     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2356     ASSERT_NE(lazyForEachBuilder, nullptr);
2357     /**
2358      * @tc.steps: step2. Invoke lazyForEach CacheItem function.
2359      * @tc.expected: Create uiNode.
2360      */
2361     LayoutConstraintF layoutConstraint;
2362     layoutConstraint.parentIdealSize = OptionalSizeF(768, 1024);
2363     layoutConstraint.selfIdealSize = OptionalSizeF(480, 960);
2364     std::unordered_map<std::string, LazyForEachCacheChild> cache;
2365     bool isTimeout = false;
2366     auto uiNode = lazyForEachBuilder->CacheItem(0, cache, layoutConstraint, 10, isTimeout);
2367     /**
2368      * @tc.steps: step3. Invoke ProcessOffscreenNode function.
2369      * @tc.expected: Create ProcessOffscreenNode.
2370      */
2371     lazyForEachBuilder->ProcessOffscreenNode(uiNode, false);
2372     EXPECT_NE(uiNode, nullptr);
2373 }
2374 
2375 /**
2376  * @tc.name: LazyForEachBuilder34
2377  * @tc.desc: Test the ProcessCachedIndex function.
2378  * @tc.type: FUNC
2379  */
2380 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder34, TestSize.Level1)
2381 {
2382     /**
2383      * @tc.steps: step1. Invoke lazyForEach Create function.
2384      * @tc.expected: Create lazyForEachBuilder.
2385      */
2386     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2387     ASSERT_NE(lazyForEachBuilder, nullptr);
2388     /**
2389      * @tc.steps: step2. Create node and lazyForEach expiringItem_ and idleIndexes.
2390      */
2391     auto node = AceType::MakeRefPtr<NG::FrameNode>(V2::TEXT_ETS_TAG, 666, AceType::MakeRefPtr<NG::Pattern>());
2392     std::unordered_map<std::string, LazyForEachCacheChild> cache;
2393     std::set<int32_t> idleIndexes;
2394     idleIndexes.insert(1);
2395     idleIndexes.insert(2);
2396     idleIndexes.insert(3);
2397     idleIndexes.insert(4);
2398     lazyForEachBuilder->expiringItem_["0"].second = node;
2399     lazyForEachBuilder->expiringItem_["1"].second = node;
2400     lazyForEachBuilder->expiringItem_["2"].second = node;
2401     lazyForEachBuilder->expiringItem_["0"].first = 1;
2402     lazyForEachBuilder->expiringItem_["1"].first = 2;
2403     lazyForEachBuilder->expiringItem_["2"].first = 3;
2404     /**
2405      * @tc.steps: step3. Invoke the ProcessCachedIndex function.
2406      * @tc.expected: Create ProcessCachedIndex.
2407      */
2408     lazyForEachBuilder->ProcessCachedIndex(cache, idleIndexes);
2409     EXPECT_EQ(lazyForEachBuilder->expiringItem_["0"].first, 1);
2410     EXPECT_EQ(lazyForEachBuilder->expiringItem_["1"].first, 2);
2411     EXPECT_EQ(lazyForEachBuilder->expiringItem_["2"].first, 3);
2412 }
2413 
2414 /**
2415  * @tc.name: LazyForEachBuilder35
2416  * @tc.desc: Test the SetJSViewActive function.
2417  * @tc.type: FUNC
2418  */
2419 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder35, TestSize.Level1)
2420 {
2421     /**
2422      * @tc.steps: step1. Invoke lazyForEach Create function.
2423      * @tc.expected: Create lazyForEachBuilder.
2424      */
2425     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2426     /**
2427      * @tc.steps: step2. Create node and lazyForEach expiringItem_ and cachedItems_.
2428      */
2429     auto node = AceType::MakeRefPtr<NG::FrameNode>(V2::TEXT_ETS_TAG, 666, AceType::MakeRefPtr<NG::Pattern>());
2430     std::string str0 = "0";
2431     lazyForEachBuilder->cachedItems_[0] = LazyForEachChild(str0, nullptr);
2432     std::string str1 = "1";
2433     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str1, nullptr);
2434     std::string str2 = "2";
2435     lazyForEachBuilder->cachedItems_[2] = LazyForEachChild(str2, nullptr);
2436     lazyForEachBuilder->expiringItem_["1"] = LazyForEachCacheChild(-1, nullptr);
2437     lazyForEachBuilder->expiringItem_["2"] = LazyForEachCacheChild(5, nullptr);
2438     lazyForEachBuilder->expiringItem_["3"] = LazyForEachCacheChild(7, node);
2439     /**
2440      * @tc.steps: step3. Invoke the SetJSViewActive function.
2441      * @tc.expected:  Set active to true.
2442      */
2443     lazyForEachBuilder->SetJSViewActive(true);
2444     EXPECT_EQ(lazyForEachBuilder->expiringItem_.size(), 3);
2445 }
2446 
2447 /**
2448  * @tc.name: LazyForEachBuilder36
2449  * @tc.desc: Test the PaintDebugBoundaryTreeAll function.
2450  * @tc.type: FUNC
2451  */
2452 HWTEST_F(LazyForEachSyntaxTestNg, LazyForEachBuilder36, TestSize.Level1)
2453 {
2454     /**
2455      * @tc.steps: step1. Invoke lazyForEach Create function.
2456      * @tc.expected: Create lazyForEachBuilder.
2457      */
2458     auto lazyForEachBuilder = CreateLazyForEachBuilder();
2459     /**
2460      * @tc.steps: step2. Create node and lazyForEach expiringItem_ and cachedItems_.
2461      */
2462     auto node = AceType::MakeRefPtr<NG::FrameNode>(V2::TEXT_ETS_TAG, 666, AceType::MakeRefPtr<NG::Pattern>());
2463     std::string str0 = "0";
2464     lazyForEachBuilder->cachedItems_[0] = LazyForEachChild(str0, nullptr);
2465     std::string str1 = "1";
2466     lazyForEachBuilder->cachedItems_[1] = LazyForEachChild(str1, nullptr);
2467     std::string str2 = "2";
2468     lazyForEachBuilder->cachedItems_[2] = LazyForEachChild(str2, nullptr);
2469     lazyForEachBuilder->expiringItem_["1"] = LazyForEachCacheChild(-1, nullptr);
2470     lazyForEachBuilder->expiringItem_["2"] = LazyForEachCacheChild(5, nullptr);
2471     lazyForEachBuilder->expiringItem_["3"] = LazyForEachCacheChild(7, node);
2472     /**
2473      * @tc.steps: step3. Invoke the PaintDebugBoundaryTreeAll function.
2474      * @tc.expected:  Set condition to true.
2475      */
2476     lazyForEachBuilder->PaintDebugBoundaryTreeAll(true);
2477     EXPECT_EQ(lazyForEachBuilder->expiringItem_.size(), 3);
2478 }
2479 } // namespace OHOS::Ace::NG