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