1 /*
2  * Copyright (c) 2022-2023 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 <type_traits>
17 #include "gtest/gtest.h"
18 
19 #define private public
20 #define protected public
21 
22 #include "test/mock/core/common/mock_theme_manager.h"
23 #include "test/mock/core/pipeline/mock_pipeline_context.h"
24 #include "test/mock/core/render/mock_render_context.h"
25 #include "test/mock/core/rosen/mock_canvas.h"
26 #include "test/mock/core/rosen/testing_canvas.h"
27 
28 #include "core/components/common/layout/constants.h"
29 #include "core/components/common/layout/grid_system_manager.h"
30 #include "core/components/common/properties/shadow_config.h"
31 #include "core/components/container_modal/container_modal_constants.h"
32 #include "core/components/select/select_theme.h"
33 #include "core/components/theme/shadow_theme.h"
34 #include "core/components_ng/base/view_stack_processor.h"
35 #include "core/components_ng/pattern/image/image_layout_property.h"
36 #include "core/components_ng/pattern/image/image_pattern.h"
37 #include "core/components_ng/pattern/menu/menu_item/menu_item_model_ng.h"
38 #include "core/components_ng/pattern/menu/menu_item/menu_item_pattern.h"
39 #include "core/components_ng/pattern/menu/menu_item_group/menu_item_group_pattern.h"
40 #include "core/components_ng/pattern/menu/menu_item_group/menu_item_group_view.h"
41 #include "core/components_ng/pattern/menu/menu_model_ng.h"
42 #include "core/components_ng/pattern/menu/menu_pattern.h"
43 #include "core/components_ng/pattern/menu/menu_theme.h"
44 #include "core/components_ng/pattern/menu/menu_view.h"
45 #include "core/components_ng/pattern/menu/multi_menu_layout_algorithm.h"
46 #include "core/components_ng/pattern/menu/preview/menu_preview_layout_algorithm.h"
47 #include "core/components_ng/pattern/menu/preview/menu_preview_pattern.h"
48 #include "core/components_ng/pattern/menu/sub_menu_layout_algorithm.h"
49 #include "core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h"
50 #include "core/components_ng/pattern/pattern.h"
51 #include "core/components_ng/pattern/root/root_pattern.h"
52 #include "core/components_ng/pattern/scroll/scroll_pattern.h"
53 #include "core/components_ng/pattern/text/text_layout_property.h"
54 #include "core/components_ng/pattern/text/text_pattern.h"
55 #include "core/components_ng/property/border_property.h"
56 #include "core/components_ng/property/measure_property.h"
57 #include "core/components_ng/syntax/lazy_for_each_model.h"
58 #include "core/components_ng/syntax/lazy_layout_wrapper_builder.h"
59 #include "core/event/touch_event.h"
60 
61 using namespace testing;
62 using namespace testing::ext;
63 using namespace OHOS::Ace::Framework;
64 
65 namespace OHOS::Ace::NG {
66 namespace {
67 const InspectorFilter filter;
68 constexpr int32_t TARGET_ID = 3;
69 constexpr MenuType TYPE = MenuType::MENU;
70 const std::string EMPTY_TEXT = "";
71 const std::string TEXT_TAG = "text";
72 const std::string MENU_TAG = "menu";
73 const std::string MENU_ITEM_TEXT = "menuItem";
74 const std::string MENU_ITEM_GROUP_TEXT = "menuItemGroup";
75 const std::string MENU_TOUCH_EVENT_TYPE = "1";
76 const DirtySwapConfig configDirtySwap = { false, false, false, false, true, false };
77 const std::string IMAGE_SRC_URL = "file://data/data/com.example.test/res/example.svg";
78 
79 constexpr float FULL_SCREEN_WIDTH = 720.0f;
80 constexpr float FULL_SCREEN_HEIGHT = 1136.0f;
81 constexpr float POSITION_OFFSET = 100.0f;
82 constexpr float TARGET_SIZE_WIDTH = 100.0f;
83 constexpr float TARGET_SIZE_HEIGHT = 100.0f;
84 
85 constexpr float OFFSET_FIRST = 20.0f;
86 constexpr float OFFSET_SECOND = 5.0f;
87 constexpr float OFFSET_FORTH = 300.0f;
88 const SizeF FULL_SCREEN_SIZE(FULL_SCREEN_WIDTH, FULL_SCREEN_HEIGHT);
89 constexpr float GREATER_WINDOW_MENU_HEIGHT = 1190.0f;
90 constexpr double DIP_SCALE = 1.5;
91 const std::vector<std::string> FONT_FAMILY_VALUE = {"cursive"};
92 constexpr double CONST_DOUBLE_ZREO = 0.0;
93 constexpr float PAN_MAX_VELOCITY = 2000.0f;
94 const std::vector<SelectParam> CREATE_VALUE = { { "content1", "icon1" }, { "content2", "" },
95     { "", "icon3" }, { "", "" } };
96 const std::vector<SelectParam> CREATE_VALUE_NEW = { { "content1_new", "" }, { "", "icon4_new" },
97     { "", "" }, { "", "icon4_new" } };
98 const V2::ItemDivider ITEM_DIVIDER = { Dimension(5.f), Dimension(10), Dimension(20), Color(0x000000) };
99 constexpr double MENU_OFFSET_X = 10.0;
100 constexpr double MENU_OFFSET_Y = 10.0;
101 constexpr float MENU_SIZE_WIDTH = 100.0f;
102 constexpr float MENU_SIZE_HEIGHT = 50.0f;
103 constexpr double CONST_NEAR_ZREO = 0.0001;
104 constexpr double CONST_LESS_NEAR_ZREO = 0.00001;
105 constexpr float PAN_GREATER_MAX_VELOCITY = 2100.0f;
106 } // namespace
107 class MenuPattern1TestNg : public testing::Test {
108 public:
109     static void SetUpTestCase();
110     static void TearDownTestCase();
111     void SetUp() override;
112     void TearDown() override;
113     void InitMenuPattern1TestNg();
114     void InitMenuItemTestNg();
115     PaintWrapper* GetPaintWrapper(RefPtr<MenuPaintProperty> paintProperty);
116     RefPtr<FrameNode> GetPreviewMenuWrapper(
117         SizeF itemSize = SizeF(0.0f, 0.0f), std::optional<MenuPreviewAnimationOptions> scaleOptions = std::nullopt);
118     RefPtr<FrameNode> menuFrameNode_;
119     RefPtr<MenuAccessibilityProperty> menuAccessibilityProperty_;
120     RefPtr<FrameNode> menuItemFrameNode_;
121     RefPtr<MenuItemPattern> menuItemPattern_;
122     RefPtr<MenuItemAccessibilityProperty> menuItemAccessibilityProperty_;
123 };
124 
SetUpTestCase()125 void MenuPattern1TestNg::SetUpTestCase() {}
126 
TearDownTestCase()127 void MenuPattern1TestNg::TearDownTestCase() {}
128 
SetUp()129 void MenuPattern1TestNg::SetUp()
130 {
131     MockPipelineContext::SetUp();
132     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
133     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
134     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr<SelectTheme>()));
135 }
136 
TearDown()137 void MenuPattern1TestNg::TearDown()
138 {
139     MockPipelineContext::TearDown();
140     menuFrameNode_ = nullptr;
141     menuAccessibilityProperty_ = nullptr;
142     menuItemFrameNode_ = nullptr;
143     menuItemPattern_ = nullptr;
144     menuItemAccessibilityProperty_ = nullptr;
145     SystemProperties::SetDeviceType(DeviceType::PHONE);
146     ScreenSystemManager::GetInstance().dipScale_ = 1.0;
147     SystemProperties::orientation_ = DeviceOrientation::PORTRAIT;
148 }
149 
InitMenuPattern1TestNg()150 void MenuPattern1TestNg::InitMenuPattern1TestNg()
151 {
152     menuFrameNode_ = FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(),
153         []() { return AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE); });
154     ASSERT_NE(menuFrameNode_, nullptr);
155 
156     menuAccessibilityProperty_ = menuFrameNode_->GetAccessibilityProperty<MenuAccessibilityProperty>();
157     ASSERT_NE(menuAccessibilityProperty_, nullptr);
158 }
159 
InitMenuItemTestNg()160 void MenuPattern1TestNg::InitMenuItemTestNg()
161 {
162     menuItemFrameNode_ = FrameNode::GetOrCreateFrameNode(V2::MENU_ITEM_ETS_TAG,
163         ViewStackProcessor::GetInstance()->ClaimNodeId(), []() { return AceType::MakeRefPtr<MenuItemPattern>(); });
164     ASSERT_NE(menuItemFrameNode_, nullptr);
165 
166     menuItemPattern_ = menuItemFrameNode_->GetPattern<MenuItemPattern>();
167     ASSERT_NE(menuItemPattern_, nullptr);
168 
169     menuItemAccessibilityProperty_ = menuItemFrameNode_->GetAccessibilityProperty<MenuItemAccessibilityProperty>();
170     ASSERT_NE(menuItemAccessibilityProperty_, nullptr);
171 }
172 
GetPaintWrapper(RefPtr<MenuPaintProperty> paintProperty)173 PaintWrapper* MenuPattern1TestNg::GetPaintWrapper(RefPtr<MenuPaintProperty> paintProperty)
174 {
175     WeakPtr<RenderContext> renderContext;
176     RefPtr<GeometryNode> geometryNode = AceType::MakeRefPtr<GeometryNode>();
177     PaintWrapper* paintWrapper = new PaintWrapper(renderContext, geometryNode, paintProperty);
178     return paintWrapper;
179 }
180 
GetPreviewMenuWrapper(SizeF itemSize,std::optional<MenuPreviewAnimationOptions> scaleOptions)181 RefPtr<FrameNode> MenuPattern1TestNg::GetPreviewMenuWrapper(
182     SizeF itemSize, std::optional<MenuPreviewAnimationOptions> scaleOptions)
183 {
184     auto rootNode = FrameNode::CreateFrameNode(
185         V2::ROOT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<RootPattern>());
186     CHECK_NULL_RETURN(rootNode, nullptr);
187     auto targetNode = FrameNode::CreateFrameNode(
188         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
189     CHECK_NULL_RETURN(targetNode, nullptr);
190     auto textNode = FrameNode::CreateFrameNode(
191         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
192     CHECK_NULL_RETURN(textNode, nullptr);
193     if (!(LessOrEqual(itemSize.Width(), 0.0) || LessOrEqual(itemSize.Height(), 0.0))) {
194         auto itemGeometryNode = textNode->GetGeometryNode();
195         CHECK_NULL_RETURN(itemGeometryNode, nullptr);
196         itemGeometryNode->SetFrameSize(itemSize);
197     }
198     targetNode->MountToParent(rootNode);
199     MenuParam menuParam;
200     menuParam.type = MenuType::CONTEXT_MENU;
201     menuParam.previewMode = MenuPreviewMode::CUSTOM;
202     if (scaleOptions != std::nullopt) {
203         menuParam.previewAnimationOptions = scaleOptions.value();
204     }
205     auto customNode = FrameNode::CreateFrameNode(
206         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
207     CHECK_NULL_RETURN(customNode, nullptr);
208     auto customGeometryNode = customNode->GetGeometryNode();
209     CHECK_NULL_RETURN(customGeometryNode, nullptr);
210     customGeometryNode->SetFrameSize(SizeF(TARGET_SIZE_WIDTH, TARGET_SIZE_HEIGHT));
211     auto menuWrapperNode =
212         MenuView::Create(textNode, targetNode->GetId(), V2::TEXT_ETS_TAG, menuParam, true, customNode);
213     return menuWrapperNode;
214 }
215 
216 /**
217  * @tc.name: MenuPatternTestNg001
218  * @tc.desc: Verify RegisterOnTouch.
219  * @tc.type: FUNC
220  */
221 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg001, TestSize.Level1)
222 {
223     RefPtr<MenuPattern> menuPattern = AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE);
224     std::string type = "1";
225     TouchEventInfo info(type);
226     menuPattern->RegisterOnTouch();
227     EXPECT_TRUE(info.GetTouches().empty());
228 }
229 
230 /**
231  * @tc.name: MenuPatternTestNg002
232  * @tc.desc: Verify RegisterOnTouch.
233  * @tc.type: FUNC
234  */
235 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg002, TestSize.Level1)
236 {
237     RefPtr<MenuPattern> menuPattern = AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE);
238     std::string type = "1";
239     TouchType touchType = TouchType::UP;
240     TouchEventInfo info(type);
241     TouchLocationInfo locationInfo(TARGET_ID);
242     Offset globalLocation(1, 1);
243     locationInfo.SetTouchType(touchType);
244     auto touchLocationInfo = locationInfo.SetGlobalLocation(globalLocation);
245     info.touches_.emplace_back(touchLocationInfo);
246     menuPattern->RegisterOnTouch();
247     EXPECT_FALSE(info.GetTouches().empty());
248     EXPECT_TRUE(info.GetTouches().front().GetTouchType() == TouchType::UP);
249 }
250 
251 /**
252  * @tc.name: MenuPatternTestNg003
253  * @tc.desc: Verify RegisterOnTouch.
254  * @tc.type: FUNC
255  */
256 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg003, TestSize.Level1)
257 {
258     RefPtr<MenuPattern> menuPattern = AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE);
259     std::string type = "1";
260     TouchType touchType = TouchType::UP;
261     TouchEventInfo info(type);
262     TouchLocationInfo locationInfo(TARGET_ID);
263     Offset globalLocation(1, 1);
264     locationInfo.SetTouchType(touchType);
265     auto touchLocationInfo = locationInfo.SetGlobalLocation(globalLocation);
266     info.touches_.emplace_back(touchLocationInfo);
267     menuPattern->type_ = MenuType::CONTEXT_MENU;
268     menuPattern->RegisterOnTouch();
269     EXPECT_FALSE(info.GetTouches().empty());
270     EXPECT_TRUE(info.GetTouches().front().GetTouchType() == TouchType::UP);
271 }
272 
273 /**
274  * @tc.name: MenuPatternTestNg004
275  * @tc.desc: Verify RegisterOnTouch.
276  * @tc.type: FUNC
277  */
278 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg004, TestSize.Level1)
279 {
280     RefPtr<MenuPattern> menuPattern = AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE);
281     std::string type = "1";
282     TouchEventInfo info(type);
283     TouchLocationInfo locationInfo(TARGET_ID);
284     Offset globalLocation(1, 1);
285     auto touchLocationInfo = locationInfo.SetGlobalLocation(globalLocation);
286     info.touches_.emplace_back(touchLocationInfo);
287     menuPattern->RegisterOnTouch();
288     EXPECT_FALSE(info.GetTouches().empty());
289     EXPECT_TRUE(info.GetTouches().front().GetTouchType() == TouchType::UNKNOWN);
290 }
291 
292 /**
293  * @tc.name: MenuPatternTestNg005
294  * @tc.desc: Verify RegisterOnTouch.
295  * @tc.type: FUNC
296  */
297 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg005, TestSize.Level1)
298 {
299     RefPtr<MenuPattern> menuPattern = AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE);
300     std::string type = "1";
301     TouchEventInfo info(type);
302     TouchType touchType = TouchType::UP;
303     TouchLocationInfo locationInfo(TARGET_ID);
304     locationInfo.SetTouchType(touchType);
305     menuPattern->RegisterOnTouch();
306     EXPECT_TRUE(info.GetTouches().empty());
307     EXPECT_FALSE(info.GetTouches().front().GetTouchType() == TouchType::UP);
308 }
309 
310 /**
311  * @tc.name: MenuPatternTestNg006
312  * @tc.desc: Verify UpdateMenuItemChildren.
313  * @tc.type: FUNC
314  */
315 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg006, TestSize.Level1)
316 {
317     MenuModelNG MneuModelInstance;
318     MneuModelInstance.Create();
319     MneuModelInstance.SetFontSize(Dimension(25.0));
320     MneuModelInstance.SetFontColor(Color::RED);
321     MneuModelInstance.SetFontWeight(FontWeight::BOLD);
322     MneuModelInstance.SetFontStyle(Ace::FontStyle::ITALIC);
323 
324     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
325     ASSERT_NE(menuNode, nullptr);
326     auto menuPattern = menuNode->GetPattern<MenuPattern>();
327     ASSERT_NE(menuPattern, nullptr);
328     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
329     ASSERT_NE(layoutProperty, nullptr);
330 
331     // call UpdateMenuItemChildren
332     menuPattern->OnModifyDone();
333 
334     ASSERT_TRUE(layoutProperty->GetFontSize().has_value());
335     EXPECT_EQ(layoutProperty->GetFontSize().value(), Dimension(25.0));
336     ASSERT_TRUE(layoutProperty->GetFontWeight().has_value());
337     EXPECT_EQ(layoutProperty->GetFontWeight().value(), FontWeight::BOLD);
338     ASSERT_TRUE(layoutProperty->GetFontColor().has_value());
339     EXPECT_EQ(layoutProperty->GetFontColor().value(), Color::RED);
340     ASSERT_TRUE(layoutProperty->GetItalicFontStyle().has_value());
341     EXPECT_EQ(layoutProperty->GetItalicFontStyle().value(), Ace::FontStyle::ITALIC);
342 }
343 
344 /**
345  * @tc.name: MenuPatternTestNg007
346  * @tc.desc: Verify UpdateMenuItemChildren.
347  * @tc.type: FUNC
348  */
349 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg007, TestSize.Level1)
350 {
351     MenuModelNG MneuModelInstance;
352     MenuItemModelNG MneuItemModelInstance;
353     MneuModelInstance.Create();
354     MneuModelInstance.SetFontSize(Dimension(25.0));
355     MneuModelInstance.SetFontColor(Color::RED);
356     MneuModelInstance.SetFontWeight(FontWeight::BOLD);
357 
358     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
359     ASSERT_NE(menuNode, nullptr);
360     auto menuPattern = menuNode->GetPattern<MenuPattern>();
361     ASSERT_NE(menuPattern, nullptr);
362     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
363     ASSERT_NE(layoutProperty, nullptr);
364 
365     MenuItemProperties itemOption;
366     itemOption.content = "content";
367     itemOption.labelInfo = "label";
368     MneuItemModelInstance.Create(itemOption);
369     auto itemNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
370     ASSERT_NE(itemNode, nullptr);
371     auto itemPattern = itemNode->GetPattern<MenuItemPattern>();
372     ASSERT_NE(itemPattern, nullptr);
373     itemPattern->OnModifyDone();
374     itemNode->MountToParent(menuNode);
375     itemNode->OnMountToParentDone();
376 
377     // call UpdateMenuItemChildren
378     menuPattern->OnModifyDone();
379 
380     auto contentNode = itemPattern->GetContentNode();
381     ASSERT_NE(contentNode, nullptr);
382     auto textProperty = contentNode->GetLayoutProperty<TextLayoutProperty>();
383     ASSERT_NE(textProperty, nullptr);
384     ASSERT_TRUE(textProperty->GetFontSize().has_value());
385     EXPECT_EQ(textProperty->GetFontSize().value(), Dimension(25.0));
386     ASSERT_TRUE(textProperty->GetFontWeight().has_value());
387     EXPECT_EQ(textProperty->GetFontWeight().value(), FontWeight::BOLD);
388     ASSERT_TRUE(textProperty->GetTextColor().has_value());
389     EXPECT_EQ(textProperty->GetTextColor().value(), Color::RED);
390 
391     auto labelNode = itemPattern->GetLabelNode();
392     ASSERT_NE(labelNode, nullptr);
393     auto labelProperty = labelNode->GetLayoutProperty<TextLayoutProperty>();
394     ASSERT_NE(labelProperty, nullptr);
395     ASSERT_TRUE(labelProperty->GetFontSize().has_value());
396     EXPECT_EQ(labelProperty->GetFontSize().value(), Dimension(25.0));
397     ASSERT_TRUE(labelProperty->GetFontWeight().has_value());
398     EXPECT_EQ(labelProperty->GetFontWeight().value(), FontWeight::BOLD);
399     ASSERT_TRUE(labelProperty->GetTextColor().has_value());
400     EXPECT_EQ(labelProperty->GetTextColor().value(), Color::RED);
401 }
402 
403 /**
404  * @tc.name: MenuPatternTestNg008
405  * @tc.desc: Verify UpdateMenuItemChildren.
406  * @tc.type: FUNC
407  */
408 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg008, TestSize.Level1)
409 {
410     MenuModelNG MneuModelInstance;
411     MenuItemModelNG MneuItemModelInstance;
412     MneuModelInstance.Create();
413     MneuModelInstance.SetFontSize(Dimension(25.0));
414     MneuModelInstance.SetFontColor(Color::RED);
415     MneuModelInstance.SetFontWeight(FontWeight::BOLD);
416 
417     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
418     ASSERT_NE(menuNode, nullptr);
419     auto menuPattern = menuNode->GetPattern<MenuPattern>();
420     ASSERT_NE(menuPattern, nullptr);
421     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
422     ASSERT_NE(layoutProperty, nullptr);
423 
424     MenuItemProperties itemOption;
425     itemOption.content = "content";
426     itemOption.labelInfo = "label";
427     MneuItemModelInstance.Create(itemOption);
428     MneuItemModelInstance.SetFontSize(Dimension(35.0));
429     MneuItemModelInstance.SetFontColor(Color::BLUE);
430     MneuItemModelInstance.SetFontWeight(FontWeight::LIGHTER);
431     MneuItemModelInstance.SetLabelFontSize(Dimension(40.0));
432     MneuItemModelInstance.SetLabelFontColor(Color::GRAY);
433     MneuItemModelInstance.SetLabelFontWeight(FontWeight::LIGHTER);
434     auto itemNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
435     ASSERT_NE(itemNode, nullptr);
436     auto itemPattern = itemNode->GetPattern<MenuItemPattern>();
437     ASSERT_NE(itemPattern, nullptr);
438     itemPattern->OnModifyDone();
439     itemNode->MountToParent(menuNode);
440     itemNode->OnMountToParentDone();
441 
442     // call UpdateMenuItemChildren
443     menuPattern->OnModifyDone();
444 
445     auto contentNode = itemPattern->GetContentNode();
446     ASSERT_NE(contentNode, nullptr);
447     auto textProperty = contentNode->GetLayoutProperty<TextLayoutProperty>();
448     ASSERT_NE(textProperty, nullptr);
449 
450     auto labelNode = itemPattern->GetLabelNode();
451     ASSERT_NE(labelNode, nullptr);
452     auto labelProperty = labelNode->GetLayoutProperty<TextLayoutProperty>();
453     ASSERT_NE(labelProperty, nullptr);
454 }
455 
456 /**
457  * @tc.name: MenuPatternTestNg009
458  * @tc.desc: Verify UpdateMenuItemChildren.
459  * @tc.type: FUNC
460  */
461 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg009, TestSize.Level1)
462 {
463     MenuModelNG MneuModelInstance;
464     MenuItemModelNG MneuItemModelInstance;
465     MneuModelInstance.Create();
466     MneuModelInstance.SetFontSize(Dimension(25.0));
467     MneuModelInstance.SetFontColor(Color::RED);
468     MneuModelInstance.SetFontWeight(FontWeight::BOLD);
469 
470     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
471     ASSERT_NE(menuNode, nullptr);
472     auto menuPattern = menuNode->GetPattern<MenuPattern>();
473     ASSERT_NE(menuPattern, nullptr);
474     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
475     ASSERT_NE(layoutProperty, nullptr);
476 
477     MenuItemGroupView::Create();
478     auto groupNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
479     MenuItemGroupView::Create();
480     auto groupNode2 = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
481     ASSERT_NE(groupNode, nullptr);
482     auto groupPattern = groupNode->GetPattern<MenuItemGroupPattern>();
483 
484     MenuItemProperties itemOption;
485     itemOption.content = "content";
486     itemOption.labelInfo = "label";
487     MneuItemModelInstance.Create(itemOption);
488     auto itemNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
489     ASSERT_NE(itemNode, nullptr);
490     auto itemPattern = itemNode->GetPattern<MenuItemPattern>();
491     ASSERT_NE(itemPattern, nullptr);
492     itemPattern->OnModifyDone();
493     itemNode->MountToParent(groupNode);
494     itemNode->OnMountToParentDone();
495     groupPattern->OnModifyDone();
496     groupNode->MountToParent(menuNode);
497     groupNode->OnMountToParentDone();
498     groupNode2->MountToParent(menuNode);
499     groupNode2->OnMountToParentDone();
500 
501     // call UpdateMenuItemChildren
502     menuPattern->OnModifyDone();
503 
504     auto contentNode = itemPattern->GetContentNode();
505     ASSERT_NE(contentNode, nullptr);
506     auto textProperty = contentNode->GetLayoutProperty<TextLayoutProperty>();
507     ASSERT_NE(textProperty, nullptr);
508     ASSERT_TRUE(textProperty->GetFontSize().has_value());
509     EXPECT_EQ(textProperty->GetFontSize().value(), Dimension(25.0));
510     ASSERT_TRUE(textProperty->GetFontWeight().has_value());
511     EXPECT_EQ(textProperty->GetFontWeight().value(), FontWeight::BOLD);
512     ASSERT_TRUE(textProperty->GetTextColor().has_value());
513     EXPECT_EQ(textProperty->GetTextColor().value(), Color::RED);
514 
515     auto labelNode = itemPattern->GetLabelNode();
516     ASSERT_NE(labelNode, nullptr);
517     auto labelProperty = labelNode->GetLayoutProperty<TextLayoutProperty>();
518     ASSERT_NE(labelProperty, nullptr);
519     ASSERT_TRUE(labelProperty->GetFontSize().has_value());
520     EXPECT_EQ(labelProperty->GetFontSize().value(), Dimension(25.0));
521     ASSERT_TRUE(labelProperty->GetFontWeight().has_value());
522     EXPECT_EQ(labelProperty->GetFontWeight().value(), FontWeight::BOLD);
523     ASSERT_TRUE(labelProperty->GetTextColor().has_value());
524     EXPECT_EQ(labelProperty->GetTextColor().value(), Color::RED);
525 }
526 
527 /**
528  * @tc.name: MenuPatternTestNg010
529  * @tc.desc: Verify UpdateMenuItemChildren.
530  * @tc.type: FUNC
531  */
532 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg010, TestSize.Level1)
533 {
534     MenuModelNG MneuModelInstance;
535     MenuItemModelNG MneuItemModelInstance;
536     MneuModelInstance.Create();
537     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
538     ASSERT_NE(menuNode, nullptr);
539     auto menuPattern = menuNode->GetPattern<MenuPattern>();
540     ASSERT_NE(menuPattern, nullptr);
541     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
542     ASSERT_NE(layoutProperty, nullptr);
543 
544     MenuItemGroupView::Create();
545     auto groupNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
546     ASSERT_NE(groupNode, nullptr);
547     auto groupPattern = groupNode->GetPattern<MenuItemGroupPattern>();
548 
549     MenuItemProperties itemOption;
550     itemOption.content = "content";
551     MneuItemModelInstance.Create(itemOption);
552     auto itemNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
553     ASSERT_NE(itemNode, nullptr);
554     auto itemPattern = itemNode->GetPattern<MenuItemPattern>();
555     ASSERT_NE(itemPattern, nullptr);
556     itemPattern->OnModifyDone();
557     itemNode->MountToParent(groupNode);
558     itemNode->OnMountToParentDone();
559     auto textNode = FrameNode::CreateFrameNode(
560         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
561     auto textPattern = textNode->GetPattern<TextPattern>();
562     textPattern->OnModifyDone();
563     textNode->MountToParent(groupNode);
564     textNode->OnMountToParentDone();
565     groupPattern->OnModifyDone();
566     groupNode->MountToParent(menuNode);
567     groupNode->OnMountToParentDone();
568 
569     // call UpdateMenuItemChildren
570     menuPattern->OnModifyDone();
571 
572     auto contentNode = itemPattern->GetContentNode();
573     ASSERT_NE(contentNode, nullptr);
574     auto textProperty = contentNode->GetLayoutProperty<TextLayoutProperty>();
575     ASSERT_NE(textProperty, nullptr);
576 
577     auto labelNode = itemPattern->GetLabelNode();
578     ASSERT_EQ(labelNode, nullptr);
579 }
580 
581 /**
582  * @tc.name: MenuPatternTestNg011
583  * @tc.desc: Verify UpdateMenuItemChildren.
584  * @tc.type: FUNC
585  */
586 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg011, TestSize.Level1)
587 {
588     MenuModelNG MneuModelInstance;
589     MenuItemModelNG MneuItemModelInstance;
590     MneuModelInstance.Create();
591     MneuModelInstance.SetFontSize(Dimension(25.0));
592     MneuModelInstance.SetFontColor(Color::RED);
593     MneuModelInstance.SetFontWeight(FontWeight::BOLD);
594     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
595     ASSERT_NE(menuNode, nullptr);
596     auto menuPattern = menuNode->GetPattern<MenuPattern>();
597     ASSERT_NE(menuPattern, nullptr);
598     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
599     ASSERT_NE(layoutProperty, nullptr);
600 
601     MenuItemProperties itemOption;
602     itemOption.content = "content";
603     MneuItemModelInstance.Create(itemOption);
604     MneuItemModelInstance.SetFontStyle(Ace::FontStyle::ITALIC);
605     auto itemNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
606     ASSERT_NE(itemNode, nullptr);
607     auto itemPattern = itemNode->GetPattern<MenuItemPattern>();
608     ASSERT_NE(itemPattern, nullptr);
609     itemPattern->OnModifyDone();
610     itemNode->MountToParent(menuNode);
611     itemNode->OnMountToParentDone();
612 
613     // call UpdateMenuItemChildren
614     menuPattern->OnModifyDone();
615     itemPattern->OnModifyDone();
616     auto labelNode = itemPattern->GetLabelNode();
617     ASSERT_EQ(labelNode, nullptr);
618 }
619 
620 /**
621  * @tc.name: MenuPatternTestNg012
622  * @tc.desc: Verify UpdateSelectParam.
623  * @tc.type: FUNC
624  */
625 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg012, TestSize.Level1)
626 {
627     auto wrapperNode = MenuView::Create(CREATE_VALUE, TARGET_ID, EMPTY_TEXT);
628     ASSERT_NE(wrapperNode, nullptr);
629     auto menuNode = AceType::DynamicCast<FrameNode>(wrapperNode->GetChildAtIndex(0));
630     ASSERT_NE(menuNode, nullptr);
631 
632     auto menuPattern = menuNode->GetPattern<MenuPattern>();
633     ASSERT_NE(menuPattern, nullptr);
634     ASSERT_EQ(menuPattern->GetOptions().size(), 4);
635     const auto& children = menuPattern->GetOptions();
636     auto childIt = children.begin();
637     for (size_t i = 0; i < children.size(); i++, childIt++) {
638         const auto& childNode = AceType::DynamicCast<FrameNode>(*childIt);
639         ASSERT_NE(childNode, nullptr);
640         auto optionPattern = childNode->GetPattern<OptionPattern>();
641         ASSERT_NE(optionPattern, nullptr);
642         ASSERT_NE(optionPattern->text_, nullptr);
643         auto textProps = optionPattern->text_->GetLayoutProperty<TextLayoutProperty>();
644         ASSERT_NE(textProps, nullptr);
645         auto param = CREATE_VALUE.at(i);
646         EXPECT_EQ(textProps->GetContent().value_or(""), param.text);
647         if (param.icon.empty()) {
648             ASSERT_EQ(optionPattern->icon_, nullptr);
649         } else {
650             ASSERT_NE(optionPattern->icon_, nullptr);
651             auto imageProps = optionPattern->icon_->GetLayoutProperty<ImageLayoutProperty>();
652             ASSERT_NE(imageProps, nullptr);
653             auto imageSrcInfo = imageProps->GetImageSourceInfo();
654             ASSERT_TRUE(imageSrcInfo.has_value());
655             ASSERT_EQ(imageSrcInfo->GetSrc(), param.icon);
656         }
657     }
658     std::vector<SelectParam> params;
659     params.clear();
660     menuPattern->UpdateSelectParam(params);
661     ASSERT_EQ(menuPattern->GetOptions().size(), 0);
662 }
663 
664 /**
665  * @tc.name: MenuPatternTestNg013
666  * @tc.desc: Verify UpdateSelectParam.
667  * @tc.type: FUNC
668  */
669 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg013, TestSize.Level1)
670 {
671     std::vector<SelectParam> params;
672     auto wrapperNode = MenuView::Create(params, TARGET_ID, EMPTY_TEXT);
673     ASSERT_NE(wrapperNode, nullptr);
674     auto menuNode = AceType::DynamicCast<FrameNode>(wrapperNode->GetChildAtIndex(0));
675     ASSERT_NE(menuNode, nullptr);
676     ASSERT_EQ(menuNode->GetChildren().size(), 1);
677 
678     auto menuPattern = menuNode->GetPattern<MenuPattern>();
679     ASSERT_NE(menuPattern, nullptr);
680     menuPattern->UpdateSelectParam(CREATE_VALUE);
681 
682     ASSERT_EQ(menuPattern->GetOptions().size(), 4);
683     const auto& children = menuPattern->GetOptions();
684     auto childIt = children.begin();
685     for (size_t i = 0; i < children.size(); i++, childIt++) {
686         const auto& childNode = AceType::DynamicCast<FrameNode>(*childIt);
687         ASSERT_NE(childNode, nullptr);
688         auto optionPattern = childNode->GetPattern<OptionPattern>();
689         ASSERT_NE(optionPattern, nullptr);
690         ASSERT_NE(optionPattern->text_, nullptr);
691         auto textProps = optionPattern->text_->GetLayoutProperty<TextLayoutProperty>();
692         ASSERT_NE(textProps, nullptr);
693         auto param = CREATE_VALUE.at(i);
694         EXPECT_EQ(textProps->GetContent().value_or(""), param.text);
695         if (param.icon.empty()) {
696             ASSERT_EQ(optionPattern->icon_, nullptr);
697         } else {
698             ASSERT_NE(optionPattern->icon_, nullptr);
699             auto imageProps = optionPattern->icon_->GetLayoutProperty<ImageLayoutProperty>();
700             ASSERT_NE(imageProps, nullptr);
701             auto imageSrcInfo = imageProps->GetImageSourceInfo();
702             ASSERT_TRUE(imageSrcInfo.has_value());
703             ASSERT_EQ(imageSrcInfo->GetSrc(), param.icon);
704         }
705     }
706 }
707 
708 /**
709  * @tc.name: MenuPatternTestNg014
710  * @tc.desc: Verify UpdateSelectParam.
711  * @tc.type: FUNC
712  */
713 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg014, TestSize.Level1)
714 {
715     std::vector<SelectParam> params;
716     auto wrapperNode = MenuView::Create(params, TARGET_ID, EMPTY_TEXT);
717     ASSERT_NE(wrapperNode, nullptr);
718     auto menuNode = AceType::DynamicCast<FrameNode>(wrapperNode->GetChildAtIndex(0));
719     ASSERT_NE(menuNode, nullptr);
720     auto menuPattern = menuNode->GetPattern<MenuPattern>();
721     ASSERT_NE(menuPattern, nullptr);
722     ASSERT_EQ(menuPattern->GetOptions().size(), 0);
723 
724     menuPattern->UpdateSelectParam(params);
725     ASSERT_EQ(menuPattern->GetOptions().size(), 0);
726 }
727 
728 /**
729  * @tc.name: MenuPatternTestNg015
730  * @tc.desc: Verify UpdateSelectParam.
731  * @tc.type: FUNC
732  */
733 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg015, TestSize.Level1)
734 {
735     auto wrapperNode = MenuView::Create(CREATE_VALUE, TARGET_ID, EMPTY_TEXT);
736     ASSERT_NE(wrapperNode, nullptr);
737     auto menuNode = AceType::DynamicCast<FrameNode>(wrapperNode->GetChildAtIndex(0));
738     ASSERT_NE(menuNode, nullptr);
739 
740     auto menuPattern = menuNode->GetPattern<MenuPattern>();
741     ASSERT_NE(menuPattern, nullptr);
742     ASSERT_EQ(menuPattern->GetOptions().size(), 4);
743 
744     menuPattern->UpdateSelectParam(CREATE_VALUE_NEW);
745     ASSERT_EQ(menuPattern->GetOptions().size(), 4);
746 
747     const auto& children = menuPattern->GetOptions();
748     auto childIt = children.begin();
749     for (size_t i = 0; i < children.size(); i++, childIt++) {
750         const auto& childNode = AceType::DynamicCast<FrameNode>(*childIt);
751         ASSERT_NE(childNode, nullptr);
752         auto optionPattern = childNode->GetPattern<OptionPattern>();
753         ASSERT_NE(optionPattern, nullptr);
754         ASSERT_NE(optionPattern->text_, nullptr);
755         auto textProps = optionPattern->text_->GetLayoutProperty<TextLayoutProperty>();
756         ASSERT_NE(textProps, nullptr);
757         auto param = CREATE_VALUE_NEW.at(i);
758         EXPECT_EQ(textProps->GetContent().value_or(""), param.text);
759         if (param.icon.empty()) {
760             ASSERT_EQ(optionPattern->icon_, nullptr);
761         } else {
762             ASSERT_NE(optionPattern->icon_, nullptr);
763             auto imageProps = optionPattern->icon_->GetLayoutProperty<ImageLayoutProperty>();
764             ASSERT_NE(imageProps, nullptr);
765             auto imageSrcInfo = imageProps->GetImageSourceInfo();
766             ASSERT_TRUE(imageSrcInfo.has_value());
767             ASSERT_EQ(imageSrcInfo->GetSrc(), param.icon);
768         }
769     }
770 }
771 
772 /**
773  * @tc.name: MenuPatternTestNg016
774  * @tc.desc: Verify UpdateSelectParam.
775  * @tc.type: FUNC
776  */
777 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg016, TestSize.Level1)
778 {
779     auto wrapperNode = MenuView::Create(CREATE_VALUE, TARGET_ID, EMPTY_TEXT);
780     ASSERT_NE(wrapperNode, nullptr);
781     auto menuNode = AceType::DynamicCast<FrameNode>(wrapperNode->GetChildAtIndex(0));
782     ASSERT_NE(menuNode, nullptr);
783 
784     auto menuPattern = menuNode->GetPattern<MenuPattern>();
785     ASSERT_NE(menuPattern, nullptr);
786     ASSERT_EQ(menuPattern->GetOptions().size(), 4);
787 
788     std::vector<SelectParam> params;
789     params.push_back({ "content1_new", "" });
790     params.push_back({ "content2_new", "icon2_new" });
791     params.push_back({ "", "" });
792     menuPattern->UpdateSelectParam(params);
793     ASSERT_EQ(menuPattern->GetOptions().size(), 3);
794 
795     const auto& children = menuPattern->GetOptions();
796     auto childIt = children.begin();
797     for (size_t i = 0; i < children.size(); i++, childIt++) {
798         const auto& childNode = AceType::DynamicCast<FrameNode>(*childIt);
799         ASSERT_NE(childNode, nullptr);
800         auto optionPattern = childNode->GetPattern<OptionPattern>();
801         ASSERT_NE(optionPattern, nullptr);
802         ASSERT_NE(optionPattern->text_, nullptr);
803         auto textProps = optionPattern->text_->GetLayoutProperty<TextLayoutProperty>();
804         ASSERT_NE(textProps, nullptr);
805         auto param = params.at(i);
806         EXPECT_EQ(textProps->GetContent().value_or(""), param.text);
807         if (param.icon.empty()) {
808             ASSERT_EQ(optionPattern->icon_, nullptr);
809         } else {
810             ASSERT_NE(optionPattern->icon_, nullptr);
811             auto imageProps = optionPattern->icon_->GetLayoutProperty<ImageLayoutProperty>();
812             ASSERT_NE(imageProps, nullptr);
813             auto imageSrcInfo = imageProps->GetImageSourceInfo();
814             ASSERT_TRUE(imageSrcInfo.has_value());
815             ASSERT_EQ(imageSrcInfo->GetSrc(), param.icon);
816         }
817     }
818 }
819 
820 /**
821  * @tc.name: MenuPatternTestNg017
822  * @tc.desc: Verify UpdateSelectParam.
823  * @tc.type: FUNC
824  */
825 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg017, TestSize.Level1)
826 {
827     std::vector<SelectParam> params;
828     params.push_back({ "content1", "icon1" });
829     params.push_back({ "content2", "" });
830     params.push_back({ "", "icon3" });
831     auto wrapperNode = MenuView::Create(params, TARGET_ID, EMPTY_TEXT);
832     ASSERT_NE(wrapperNode, nullptr);
833     auto menuNode = AceType::DynamicCast<FrameNode>(wrapperNode->GetChildAtIndex(0));
834     ASSERT_NE(menuNode, nullptr);
835 
836     auto menuPattern = menuNode->GetPattern<MenuPattern>();
837     ASSERT_NE(menuPattern, nullptr);
838     ASSERT_EQ(menuPattern->GetOptions().size(), 3);
839 
840 
841     menuPattern->UpdateSelectParam(CREATE_VALUE_NEW);
842     ASSERT_EQ(menuPattern->GetOptions().size(), 4);
843 
844     const auto& children = menuPattern->GetOptions();
845     auto childIt = children.begin();
846     for (size_t i = 0; i < children.size(); i++, childIt++) {
847         const auto& childNode = AceType::DynamicCast<FrameNode>(*childIt);
848         ASSERT_NE(childNode, nullptr);
849         auto optionPattern = childNode->GetPattern<OptionPattern>();
850         ASSERT_NE(optionPattern, nullptr);
851         ASSERT_NE(optionPattern->text_, nullptr);
852         auto textProps = optionPattern->text_->GetLayoutProperty<TextLayoutProperty>();
853         ASSERT_NE(textProps, nullptr);
854         auto param = CREATE_VALUE_NEW.at(i);
855         EXPECT_EQ(textProps->GetContent().value_or(""), param.text);
856         if (param.icon.empty()) {
857             ASSERT_EQ(optionPattern->icon_, nullptr);
858         } else {
859             ASSERT_NE(optionPattern->icon_, nullptr);
860             auto imageProps = optionPattern->icon_->GetLayoutProperty<ImageLayoutProperty>();
861             ASSERT_NE(imageProps, nullptr);
862             auto imageSrcInfo = imageProps->GetImageSourceInfo();
863             ASSERT_TRUE(imageSrcInfo.has_value());
864             ASSERT_EQ(imageSrcInfo->GetSrc(), param.icon);
865         }
866     }
867 }
868 
869 /**
870  * @tc.name: MenuPatternTestNg018
871  * @tc.desc: Verify UpdateMenuItemChildren.
872  * @tc.type: FUNC
873  */
874 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg018, TestSize.Level1)
875 {
876     MenuModelNG MneuModelInstance;
877     MneuModelInstance.Create();
878     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
879     ASSERT_NE(menuNode, nullptr);
880     auto menuPattern = menuNode->GetPattern<MenuPattern>();
881     ASSERT_NE(menuPattern, nullptr);
882 
883     ASSERT_EQ(menuPattern->GetOptions().size(), 0);
884     std::vector<SelectParam> params;
885     params.push_back({ "content1", "icon1" });
886     menuPattern->UpdateSelectParam(params);
887     ASSERT_EQ(menuPattern->GetOptions().size(), 0);
888 }
889 
890 /**
891  * @tc.name: MenuPatternTestNg019
892  * @tc.desc: Test MultiMenu and outer Menu container.
893  */
894 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg019, TestSize.Level1)
895 {
896     MockPipelineContext::GetCurrent()->SetMinPlatformVersion(static_cast<int32_t>(PlatformVersion::VERSION_ELEVEN));
897     MenuModelNG model;
898     model.Create();
899     auto multiMenu = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
900     auto menuWrapper = MenuView::Create(multiMenu, -1, EMPTY_TEXT);
901     ASSERT_NE(menuWrapper, nullptr);
902     auto outerMenu = AceType::DynamicCast<FrameNode>(menuWrapper->GetFirstChild());
903     ASSERT_NE(outerMenu, nullptr);
904 
905     // backgroundColor should be reset
906     ASSERT_EQ(outerMenu->GetRenderContext()->GetBackgroundColorValue(), Color::TRANSPARENT);
907 
908     // padding should be moved to inner multi menu
909     auto scroll = AceType::DynamicCast<FrameNode>(outerMenu->GetFirstChild());
910     ASSERT_NE(scroll, nullptr);
911     auto&& padding = scroll->GetLayoutProperty()->GetPaddingProperty();
912     // should have empty padding
913     ASSERT_EQ(padding->ToString(), PaddingProperty().ToString());
914 
915     multiMenu->GetPattern()->BeforeCreateLayoutWrapper();
916     // inner multi menu should have backgroundColor and padding set up
917     ASSERT_NE(multiMenu->GetLayoutProperty()->GetPaddingProperty()->ToString(), PaddingProperty().ToString());
918     ASSERT_NE(multiMenu->GetRenderContext()->GetBackgroundColor(), Color::TRANSPARENT);
919     // inner menu should have no shadow
920     ASSERT_EQ(multiMenu->GetRenderContext()->GetBackShadow(), ShadowConfig::NoneShadow);
921 
922     // MultiMenu should have its own layout algorithm
923     auto layoutAlgorithm = multiMenu->GetPattern<MenuPattern>()->CreateLayoutAlgorithm();
924     ASSERT_NE(AceType::DynamicCast<MultiMenuLayoutAlgorithm>(layoutAlgorithm), nullptr);
925 }
926 
927 /**
928  * @tc.name: MenuPatternTestNg020
929  * @tc.desc: Verify UpdateMenuItemChildren.
930  * @tc.type: FUNC
931  */
932 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg020, TestSize.Level1)
933 {
934     /**
935      * @tc.steps: step1. create MenuModelNG and MenuItemModelNG object and set FontStyle properties of MenuModelNG.
936      */
937     MenuModelNG MneuModelInstance;
938     MenuItemModelNG MneuItemModelInstance;
939     MneuModelInstance.Create();
940     MneuModelInstance.SetFontStyle(Ace::FontStyle::ITALIC);
941 
942     /**
943      * @tc.steps: step2. get the frameNode, MenuPattern and MenuLayoutProperty.
944      * @tc.expected: step2. check whether the objects is available.
945      */
946     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
947     ASSERT_NE(menuNode, nullptr);
948     auto menuPattern = menuNode->GetPattern<MenuPattern>();
949     ASSERT_NE(menuPattern, nullptr);
950     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
951     ASSERT_NE(layoutProperty, nullptr);
952 
953     /**
954      * @tc.steps: step3. not set FontStyle properties of MenuModelNG.
955      */
956     MenuItemProperties itemOption;
957     itemOption.content = "content";
958     itemOption.labelInfo = "label";
959     MneuItemModelInstance.Create(itemOption);
960     auto itemNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
961     ASSERT_NE(itemNode, nullptr);
962     auto itemPattern = itemNode->GetPattern<MenuItemPattern>();
963     ASSERT_NE(itemPattern, nullptr);
964     itemPattern->OnModifyDone();
965     itemNode->MountToParent(menuNode);
966     itemNode->OnMountToParentDone();
967 
968     /**
969      * @tc.steps: step4. call OnModifyDone of MenuPattern to call UpdateMenuItemChildren
970      */
971     menuPattern->OnModifyDone();
972 
973     /**
974      * @tc.steps: step5. get the FontStyle properties of menuItemLayoutProperty.
975      * @tc.expected: step5. check whether the FontStyle properties is is correct.
976      */
977     auto contentNode = itemPattern->GetContentNode();
978     ASSERT_NE(contentNode, nullptr);
979     auto textProperty = contentNode->GetLayoutProperty<TextLayoutProperty>();
980     ASSERT_NE(textProperty, nullptr);
981     ASSERT_TRUE(textProperty->GetItalicFontStyle().has_value());
982     EXPECT_EQ(textProperty->GetItalicFontStyle().value(), Ace::FontStyle::ITALIC);
983 }
984 
985 /**
986  * @tc.name: MenuPatternTest021
987  * @tc.desc: Verify RegisterOnTouch.
988  * @tc.type: FUNC
989  */
990 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg021, TestSize.Level1)
991 {
992     MenuPattern* menuPattern = new MenuPattern(TARGET_ID, "", TYPE);
993     const std::string tag = "tag";
994     int32_t nodeId = 1;
995     RefPtr<Pattern> pattern = AceType::MakeRefPtr<Pattern>();
996     bool isRoot = false;
997     RefPtr<GeometryNode> geometryNode = AceType::MakeRefPtr<GeometryNode>();
998     RefPtr<FrameNode> frameNode = AceType::MakeRefPtr<FrameNode>(tag, nodeId, pattern, isRoot);
999     const RefPtr<LayoutWrapperNode> layoutWrapper;
1000     std::string type = "1";
1001     TouchEventInfo info(type);
1002     TouchType touchType = TouchType::UP;
1003     TouchLocationInfo locationInfo(TARGET_ID);
1004     Offset globalLocation(1, 1);
1005     locationInfo.SetTouchType(touchType);
1006     auto touchLocationInfo = locationInfo.SetGlobalLocation(globalLocation);
1007     info.touches_.emplace_back(touchLocationInfo);
1008     menuPattern->OnTouchEvent(info);
1009     menuPattern->RegisterOnTouch();
1010     KeyEvent keyEvent(KeyCode::KEY_ESCAPE, KeyAction::UP);
1011     EXPECT_FALSE(menuPattern->IsMultiMenu());
1012     EXPECT_FALSE(menuPattern->OnKeyEvent(keyEvent));
1013     menuPattern->HideMenu();
1014     menuPattern->HideSubMenu();
1015     EXPECT_FALSE(menuPattern->OnDirtyLayoutWrapperSwap(layoutWrapper, configDirtySwap));
1016     menuPattern->type_ = MenuType::SUB_MENU;
1017     EXPECT_FALSE(menuPattern->OnKeyEvent(keyEvent));
1018     menuPattern->HideMenu();
1019     menuPattern->HideSubMenu();
1020     menuPattern->RemoveParentHoverStyle();
1021     delete menuPattern;
1022     menuPattern = nullptr;
1023 }
1024 
1025 /**
1026  * @tc.name: MenuPatternTestNg022
1027  * @tc.desc: Verify OnTouchEvent.
1028  * @tc.type: FUNC
1029  */
1030 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg022, TestSize.Level1)
1031 {
1032     /**
1033      * @tc.steps: step1. multi menu touch event
1034      * @tc.expected: menu type is multi
1035      */
1036     auto multiMenuPattern = AceType::MakeRefPtr<MenuPattern>(-1, "", MenuType::MULTI_MENU);
1037     TouchEventInfo multiMenuTouchEventInfo(MENU_TOUCH_EVENT_TYPE);
1038     multiMenuPattern->OnTouchEvent(multiMenuTouchEventInfo);
1039     EXPECT_TRUE(multiMenuPattern->IsMultiMenu());
1040     /**
1041      * @tc.steps: step2. select menu touch event
1042      * @tc.expected: menu options nums as expected
1043      */
1044     std::vector<SelectParam> selectParams;
1045     selectParams.push_back({ "content", "icon" });
1046     auto selectWrapperNode = MenuView::Create(selectParams, TARGET_ID, EMPTY_TEXT);
1047     ASSERT_NE(selectWrapperNode, nullptr);
1048     auto selectMenuNode = AceType::DynamicCast<FrameNode>(selectWrapperNode->GetChildAtIndex(0));
1049     ASSERT_NE(selectMenuNode, nullptr);
1050     TouchEventInfo selectMenuEventInfo(MENU_TOUCH_EVENT_TYPE);
1051     auto selectMenuPattern = selectMenuNode->GetPattern<MenuPattern>();
1052     ASSERT_NE(selectMenuPattern, nullptr);
1053     selectMenuPattern->OnTouchEvent(selectMenuEventInfo);
1054     ASSERT_EQ(selectMenuPattern->GetOptions().size(), 1);
1055     /**
1056      * @tc.steps: step3. contextMenu touch event
1057      * @tc.expected: menu type is context
1058      */
1059     auto contextMenuPattern = AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", MenuType::CONTEXT_MENU);
1060     // excute touch down event
1061     TouchEventInfo contextMenuTouchDownEventInfo(MENU_TOUCH_EVENT_TYPE);
1062     TouchLocationInfo downLocationInfo(TARGET_ID);
1063     Offset touchDownGlobalLocation(1, 1);
1064     downLocationInfo.SetTouchType(TouchType::DOWN);
1065     auto touchDownLocationInfo = downLocationInfo.SetGlobalLocation(touchDownGlobalLocation);
1066     contextMenuTouchDownEventInfo.touches_.emplace_back(touchDownLocationInfo);
1067     contextMenuPattern->OnTouchEvent(contextMenuTouchDownEventInfo);
1068     // execute touch up event
1069     TouchEventInfo contextMenuTouchUpEventInfo(MENU_TOUCH_EVENT_TYPE);
1070     TouchLocationInfo upLocationInfo(TARGET_ID);
1071     Offset touchUpGlobalLocation(3, 3);
1072     upLocationInfo.SetTouchType(TouchType::UP);
1073     auto touchUpLocationInfo = upLocationInfo.SetGlobalLocation(touchUpGlobalLocation);
1074     contextMenuTouchUpEventInfo.touches_.emplace_back(touchUpLocationInfo);
1075     contextMenuPattern->OnTouchEvent(contextMenuTouchUpEventInfo);
1076     EXPECT_TRUE(contextMenuPattern->IsContextMenu());
1077 }
1078 
1079 /**
1080  * @tc.name: MenuPatternTestNg023
1081  * @tc.desc: Verify OnKeyEvent.
1082  * @tc.type: FUNC
1083  */
1084 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg023, TestSize.Level1)
1085 {
1086     /**
1087      * @tc.steps: step1. create menu wrapper
1088      * @tc.expected: wrapper node is not null and has 1 child
1089      */
1090     std::vector<SelectParam> selectParams;
1091     selectParams.push_back({ "MenuItem1", "Icon1" });
1092     auto menuWrapperNode = MenuView::Create(std::move(selectParams), 1, EMPTY_TEXT);
1093     ASSERT_NE(menuWrapperNode, nullptr);
1094     EXPECT_EQ(menuWrapperNode->GetChildren().size(), 1);
1095     /**
1096      * @tc.steps: step2. execute OnKeyEvent
1097      * @tc.expected: result as expected
1098      */
1099     auto menuNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(0));
1100     ASSERT_NE(menuNode, nullptr);
1101     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1102     menuPattern->type_ = MenuType::SUB_MENU;
1103     KeyEvent escapeKeyEvent(KeyCode::KEY_ESCAPE, KeyAction::DOWN);
1104     EXPECT_TRUE(menuPattern->OnKeyEvent(escapeKeyEvent));
1105     KeyEvent upKeyEvent(KeyCode::KEY_PLUS, KeyAction::DOWN);
1106     EXPECT_FALSE(menuPattern->OnKeyEvent(upKeyEvent));
1107 }
1108 
1109 /**
1110  * @tc.name: MenuPatternTestNg024
1111  * @tc.desc: Verify RemoveParentHoverStyle.
1112  * @tc.type: FUNC
1113  */
1114 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg024, TestSize.Level1)
1115 {
1116     /**
1117      * @tc.steps: step1. create menuItem and menu
1118      * @tc.expected: menuItem not null
1119      */
1120     auto menuPattern = AceType::MakeRefPtr<MenuPattern>(-1, "", MenuType::MENU);
1121     auto menuItemPattern = AceType::MakeRefPtr<MenuItemPattern>();
1122     auto menuItem = AceType::MakeRefPtr<FrameNode>("", -1, menuItemPattern);
1123     ASSERT_NE(menuItem, nullptr);
1124     /**
1125      * @tc.steps: step2. execute RemoveParentHoverStyle
1126      * @tc.expected: item IsSubMenuShowed as expected
1127      */
1128     menuPattern->SetParentMenuItem(menuItem);
1129     menuPattern->RemoveParentHoverStyle();
1130     auto itemPattern = menuItem->GetPattern<MenuItemPattern>();
1131     EXPECT_FALSE(itemPattern->IsSubMenuShowed());
1132     menuPattern->type_ = MenuType::SUB_MENU;
1133     menuPattern->RemoveParentHoverStyle();
1134     EXPECT_FALSE(itemPattern->IsSubMenuShowed());
1135 }
1136 
1137 /**
1138  * @tc.name: MenuPatternTestNg025
1139  * @tc.desc: Verify MenuPattern::HideStackExpandMenu.
1140  * @tc.type: FUNC
1141  */
1142 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg025, TestSize.Level1)
1143 {
1144     /**
1145      * @tc.steps: step1. Create MENU_ETS_TAG child and mount to a menuwrapper;
1146      * @tc.expected: menu is not sub menu.
1147      */
1148     auto wrapperNode =
1149         FrameNode::CreateFrameNode(V2::MENU_WRAPPER_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1150     auto mainMenu = FrameNode::CreateFrameNode(
1151         V2::SELECT_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1152     auto menuNode =
1153         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 3, AceType::MakeRefPtr<MenuPattern>(2, "", MenuType::MENU));
1154     menuNode->GetGeometryNode()->SetFrameSize(SizeF(MENU_SIZE_WIDTH, MENU_SIZE_HEIGHT));
1155     menuNode->GetGeometryNode()->SetFrameOffset(OffsetF(MENU_OFFSET_X, MENU_OFFSET_Y));
1156     mainMenu->MountToParent(wrapperNode);
1157     menuNode->MountToParent(mainMenu);
1158     auto wrapperPattern = wrapperNode->GetPattern<MenuWrapperPattern>();
1159     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1160     ASSERT_NE(wrapperPattern, nullptr);
1161     ASSERT_NE(menuPattern, nullptr);
1162     menuPattern->type_ = MenuType::CONTEXT_MENU;
1163     auto layoutProps = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
1164     layoutProps->UpdateExpandingMode(SubMenuExpandingMode::STACK);
1165     menuPattern->HideStackExpandMenu(OffsetF(0.0f, 0.0f));
1166     EXPECT_FALSE(menuPattern->IsSubMenu());
1167     /**
1168      * @tc.steps: step1+. make menu change sub menu.
1169      */
1170     menuPattern->type_ = MenuType::SUB_MENU;
1171     menuPattern->HideStackExpandMenu(OffsetF(0.0f, 0.0f));
1172     EXPECT_TRUE(menuPattern->IsSubMenu());
1173     /**
1174      * @tc.steps: step1+. make menu change sub menu.
1175      */
1176     bool testResult = menuPattern->HideStackExpandMenu(OffsetF(0.0f, 0.0f));
1177     EXPECT_FALSE(testResult);
1178 }
1179 
1180 /**
1181  * @tc.name: MenuPatternTestNg026
1182  * @tc.desc: Verify HideSubMenu.
1183  * @tc.type: FUNC
1184  */
1185 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg026, TestSize.Level1)
1186 {
1187     /**
1188      * @tc.steps: step1. create menu wrapper
1189      * @tc.expected: wrapper node is not null and has 1 child
1190      */
1191     std::vector<SelectParam> selectParams;
1192     selectParams.push_back({ "MenuItem1", "Icon1" });
1193     auto menuWrapperNode = MenuView::Create(std::move(selectParams), 1, EMPTY_TEXT);
1194     ASSERT_NE(menuWrapperNode, nullptr);
1195     EXPECT_EQ(menuWrapperNode->GetChildren().size(), 1);
1196     /**
1197      * @tc.steps: step2. execute HideSubMenu
1198      * @tc.expected: result as expected
1199      */
1200     auto menuNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(0));
1201     ASSERT_NE(menuNode, nullptr);
1202     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1203     auto menuItemPattern = AceType::MakeRefPtr<MenuItemPattern>();
1204     auto menuItem = AceType::MakeRefPtr<FrameNode>("", -1, menuItemPattern);
1205     menuPattern->SetParentMenuItem(menuItem);
1206     menuPattern->type_ = MenuType::SUB_MENU;
1207     menuPattern->SetShowedSubMenu(menuNode);
1208     menuPattern->HideSubMenu();
1209     auto itemPattern = menuItem->GetPattern<MenuItemPattern>();
1210     EXPECT_FALSE(itemPattern->IsSubMenuShowed());
1211     ASSERT_EQ(menuPattern->GetShowedSubMenu(), nullptr);
1212 }
1213 
1214 /**
1215  * @tc.name: MenuPatternTestNg027
1216  * @tc.desc: Verify GetMenuWrapper,GetMainMenuPattern.
1217  * @tc.type: FUNC
1218  */
1219 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg027, TestSize.Level1)
1220 {
1221     /**
1222      * @tc.steps: step1. create menu wrapper and menu
1223      * @tc.expected: wrapper node is not null and has 1 child
1224      */
1225     std::vector<SelectParam> selectParams;
1226     selectParams.push_back({ "MenuItem1", "Icon1" });
1227     auto menuWrapperNode = MenuView::Create(std::move(selectParams), 1, EMPTY_TEXT);
1228     ASSERT_NE(menuWrapperNode, nullptr);
1229     EXPECT_EQ(menuWrapperNode->GetChildren().size(), 1);
1230     auto menuNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(0));
1231     ASSERT_NE(menuNode, nullptr);
1232     /**
1233      * @tc.steps: step2. create child to menu, execute GetMenuWrapper,GetMainMenuPattern,GetInnerMenuCount
1234      * @tc.expected: result as expected
1235      */
1236     auto multiMenu =
1237         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 1, AceType::MakeRefPtr<MenuPattern>(1, "", MenuType::MULTI_MENU));
1238     multiMenu->MountToParent(menuNode);
1239     auto multiPattern = multiMenu->GetPattern<MenuPattern>();
1240     ASSERT_NE(multiPattern, nullptr);
1241     ASSERT_NE(multiPattern->GetMenuWrapper(), nullptr);
1242     ASSERT_NE(multiPattern->GetMainMenuPattern(), nullptr);
1243     EXPECT_EQ(multiPattern->GetInnerMenuCount(), 0);
1244     /**
1245      * @tc.steps: step3. create cascade node
1246      * @tc.expected: wrapper node relate to child node pattern is null
1247      */
1248     auto singleMenu =
1249         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 1, AceType::MakeRefPtr<MenuPattern>(1, "", MenuType::MULTI_MENU));
1250     auto singleParentMenu =
1251         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(2, "", MenuType::MENU));
1252     singleMenu->MountToParent(singleParentMenu);
1253     auto singleMenuPattern = singleMenu->GetPattern<MenuPattern>();
1254     ASSERT_EQ(singleMenuPattern->GetMenuWrapper(), nullptr);
1255 }
1256 
1257 /**
1258  * @tc.name: MenuPatternTestNg028
1259  * @tc.desc: Verify some condition in api 11.
1260  * @tc.type: FUNC
1261  */
1262 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg028, TestSize.Level1)
1263 {
1264     /**
1265      * @tc.steps: step1. set current api 11, create menu wrapper and menu
1266      * @tc.expected: menu blurStyle meet expectations
1267      */
1268     MockPipelineContext::GetCurrent()->SetMinPlatformVersion(static_cast<int32_t>(PlatformVersion::VERSION_ELEVEN));
1269     std::vector<SelectParam> selectParams;
1270     selectParams.push_back({ "MenuItem1", "Icon1" });
1271     auto menuWrapperNode = MenuView::Create(std::move(selectParams), 1, EMPTY_TEXT);
1272     auto menuNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(0));
1273     ASSERT_NE(menuNode, nullptr);
1274     auto renderContext = menuNode->GetRenderContext();
1275     ASSERT_NE(renderContext, nullptr);
1276     /**
1277      * @tc.steps: step2. create option pattern.
1278      * @tc.expected: option bg color meet expectations
1279      */
1280     auto optionPattern = AceType::MakeRefPtr<OptionPattern>(0);
1281     EXPECT_EQ(optionPattern->GetBgColor(), Color::TRANSPARENT);
1282 }
1283 
1284 /**
1285  * @tc.name: MenuPatternTestNg029
1286  * @tc.desc: Verify UpdateFontStyle.menuProperty has FontFamily.
1287  * @tc.type: FUNC
1288  */
1289 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg029, TestSize.Level1)
1290 {
1291     /**
1292      * @tc.steps: step1. create MenuModelNG and MenuItemModelNG object and set FontStyle properties of MenuModelNG.
1293      */
1294     MenuModelNG MneuModelInstance;
1295     MenuItemModelNG MneuItemModelInstance;
1296     MneuModelInstance.Create();
1297     MneuModelInstance.SetFontStyle(Ace::FontStyle::ITALIC);
1298 
1299     /**
1300      * @tc.steps: step2. get the frameNode, MenuPattern and MenuLayoutProperty.
1301      * @tc.expected: step2. check whether the objects is available.
1302      */
1303     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
1304     ASSERT_NE(menuNode, nullptr);
1305     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1306     ASSERT_NE(menuPattern, nullptr);
1307     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
1308     ASSERT_NE(layoutProperty, nullptr);
1309 
1310     /**
1311      * @tc.steps: step3. not set FontStyle properties of MenuModelNG.
1312      */
1313     MenuItemProperties itemOption;
1314     itemOption.content = "content";
1315     itemOption.labelInfo = "label";
1316     MneuItemModelInstance.Create(itemOption);
1317     auto itemNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
1318     ASSERT_NE(itemNode, nullptr);
1319     auto itemPattern = itemNode->GetPattern<MenuItemPattern>();
1320     ASSERT_NE(itemPattern, nullptr);
1321     auto menuItemLayoutProperty = itemNode->GetLayoutProperty<MenuItemLayoutProperty>();
1322     ASSERT_NE(menuItemLayoutProperty, nullptr);
1323     itemPattern->OnModifyDone();
1324     itemNode->MountToParent(menuNode);
1325     itemNode->OnMountToParentDone();
1326     menuPattern->OnModifyDone();
1327 
1328     /**
1329      * @tc.steps: step4. call OnModifyDone of MenuPattern to call UpdateMenuItemChildren
1330      */
1331     menuItemLayoutProperty->UpdateLabelItalicFontStyle(Ace::FontStyle::ITALIC);
1332     layoutProperty->UpdateFontFamily(FONT_FAMILY_VALUE);
1333     menuPattern->OnModifyDone();
1334 
1335     /**
1336      * @tc.steps: step5. get the FontStyle properties of menuItemLayoutProperty.
1337      * @tc.expected: step5. check whether the FontStyle properties is is correct.
1338      */
1339     auto contentNode = itemPattern->GetContentNode();
1340     ASSERT_NE(contentNode, nullptr);
1341     auto textProperty = contentNode->GetLayoutProperty<TextLayoutProperty>();
1342     ASSERT_NE(textProperty, nullptr);
1343     ASSERT_TRUE(textProperty->GetItalicFontStyle().has_value());
1344     EXPECT_EQ(textProperty->GetItalicFontStyle().value(), Ace::FontStyle::ITALIC);
1345 }
1346 /**
1347  * @tc.name: MenuPatternTestNg030
1348  * @tc.desc: Verify OnTouchEvent.Extend.
1349  * @tc.type: FUNC
1350  */
1351 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg030, TestSize.Level1)
1352 {
1353     /**
1354      * @tc.steps: step1. multi menu touch event,IsMultiMenu,is ture.
1355      * @tc.expected: menu type is multi
1356      */
1357     auto multiMenuPattern = AceType::MakeRefPtr<MenuPattern>(-1, "", MenuType::MULTI_MENU);
1358     TouchEventInfo multiMenuTouchEventInfo(MENU_TOUCH_EVENT_TYPE);
1359     multiMenuPattern->SetType(MenuType::DESKTOP_MENU);
1360     multiMenuPattern->OnTouchEvent(multiMenuTouchEventInfo);
1361     EXPECT_FALSE(multiMenuPattern->IsMultiMenu());
1362     /**
1363      * @tc.steps: step2. select menu touch event,IsDesktopMenu is true
1364      * @tc.expected: menu options nums as expected
1365      */
1366     multiMenuPattern->SetType(MenuType::DESKTOP_MENU);
1367     multiMenuPattern->OnTouchEvent(multiMenuTouchEventInfo);
1368     EXPECT_TRUE(multiMenuPattern->IsDesktopMenu());
1369     /**
1370      * @tc.steps: step3. contextMenu touch event
1371      * @tc.expected: menu type is context
1372      */
1373     multiMenuPattern->type_ = MenuType::SELECT_OVERLAY_CUSTOM_MENU;
1374     multiMenuPattern->OnTouchEvent(multiMenuTouchEventInfo);
1375     EXPECT_TRUE(multiMenuPattern->IsSelectOverlayCustomMenu());
1376 }
1377 /**
1378  * @tc.name: MenuPatternTestNg031
1379  * @tc.desc: Verify HideMenu(Menu).menunode is SELECT.
1380  * @tc.type: FUNC
1381  */
1382 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg031, TestSize.Level1)
1383 {
1384     /**
1385      * @tc.steps: step1. Create wrapper and child menu
1386      * @tc.expected: wrapper pattern not null
1387      */
1388     auto wrapperNode =
1389         FrameNode::CreateFrameNode(V2::MENU_WRAPPER_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1390     auto mainMenu = FrameNode::CreateFrameNode(
1391         V2::SELECT_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1392     mainMenu->MountToParent(wrapperNode);
1393     auto wrapperPattern = wrapperNode->GetPattern<MenuWrapperPattern>();
1394     auto menuPattern = mainMenu->GetPattern<MenuPattern>();
1395     ASSERT_NE(wrapperPattern, nullptr);
1396     menuPattern->type_ = MenuType::CONTEXT_MENU;
1397 
1398     menuPattern->HideMenu();
1399     EXPECT_EQ(wrapperNode->GetChildren().size(), 1);
1400 }
1401 /**
1402  * @tc.name: MenuPatternTestNg032
1403  * @tc.desc: Verify HideMenu(Menu).wrappernode is SELECT_OVERLAY.
1404  * @tc.type: FUNC
1405  */
1406 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg032, TestSize.Level1)
1407 {
1408     /**
1409      * @tc.steps: step1. Create wrapper and child menu
1410      * @tc.expected: wrapper pattern not null
1411      */
1412     auto wrapperNode =
1413         FrameNode::CreateFrameNode(V2::SELECT_OVERLAY_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1414     auto mainMenu =
1415         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1416     mainMenu->MountToParent(wrapperNode);
1417     auto wrapperPattern = wrapperNode->GetPattern<MenuWrapperPattern>();
1418     auto menuPattern = mainMenu->GetPattern<MenuPattern>();
1419     ASSERT_NE(wrapperPattern, nullptr);
1420     menuPattern->type_ = MenuType::CONTEXT_MENU;
1421 
1422     menuPattern->HideMenu();
1423     EXPECT_EQ(wrapperNode->GetChildren().size(), 1);
1424 }
1425 /**
1426  * @tc.name: MenuPatternTestNg033
1427  * @tc.desc: Verify GetTransformCenter().
1428  * @tc.type: FUNC
1429  */
1430 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg033, TestSize.Level1)
1431 {
1432     /**
1433      * @tc.steps: step1. Create wrapper and child menu
1434      * @tc.expected: wrapper pattern not null
1435      */
1436     auto menuWrapperNode = GetPreviewMenuWrapper();
1437     ASSERT_NE(menuWrapperNode, nullptr);
1438     auto menuNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(0));
1439     ASSERT_NE(menuNode, nullptr);
1440     auto menuAlgorithmWrapper = menuNode->GetLayoutAlgorithm();
1441     auto menuGeometryNode = menuNode->GetGeometryNode();
1442     ASSERT_NE(menuGeometryNode, nullptr);
1443     menuGeometryNode->SetFrameSize(SizeF(TARGET_SIZE_WIDTH, OFFSET_FORTH));
1444     ASSERT_NE(menuAlgorithmWrapper, nullptr);
1445     auto menuAlgorithm = AceType::DynamicCast<MenuLayoutAlgorithm>(menuAlgorithmWrapper->GetLayoutAlgorithm());
1446     ASSERT_NE(menuAlgorithm, nullptr);
1447     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1448     ASSERT_NE(menuPattern, nullptr);
1449 
1450     menuAlgorithm->placement_ = Placement::BOTTOM_LEFT;
1451     auto offset = menuPattern->GetTransformCenter();
1452     menuAlgorithm->placement_ = Placement::RIGHT_TOP;
1453     offset = menuPattern->GetTransformCenter();
1454     EXPECT_EQ(offset, Offset(CONST_DOUBLE_ZREO, CONST_DOUBLE_ZREO));
1455 
1456     menuAlgorithm->placement_ = Placement::BOTTOM_RIGHT;
1457     offset = menuPattern->GetTransformCenter();
1458     menuAlgorithm->placement_ = Placement::LEFT_TOP;
1459     offset = menuPattern->GetTransformCenter();
1460     EXPECT_EQ(offset, Offset(TARGET_SIZE_WIDTH, CONST_DOUBLE_ZREO));
1461 
1462     menuAlgorithm->placement_ = Placement::TOP_LEFT;
1463     offset = menuPattern->GetTransformCenter();
1464     menuAlgorithm->placement_ = Placement::RIGHT_BOTTOM;
1465     offset = menuPattern->GetTransformCenter();
1466     EXPECT_EQ(offset, Offset(CONST_DOUBLE_ZREO, OFFSET_FORTH));
1467 
1468     menuAlgorithm->placement_ = Placement::TOP_RIGHT;
1469     offset = menuPattern->GetTransformCenter();
1470     menuAlgorithm->placement_ = Placement::LEFT_BOTTOM;
1471     offset = menuPattern->GetTransformCenter();
1472     EXPECT_EQ(offset, Offset(TARGET_SIZE_WIDTH, OFFSET_FORTH));
1473 
1474     menuAlgorithm->placement_ = Placement::BOTTOM;
1475     offset = menuPattern->GetTransformCenter();
1476     EXPECT_EQ(offset, Offset(TARGET_SIZE_WIDTH / 2, CONST_DOUBLE_ZREO));
1477     menuAlgorithm->placement_ = Placement::LEFT;
1478     offset = menuPattern->GetTransformCenter();
1479     EXPECT_EQ(offset, Offset(TARGET_SIZE_WIDTH, OFFSET_FORTH / 2));
1480     menuAlgorithm->placement_ = Placement::TOP;
1481     offset = menuPattern->GetTransformCenter();
1482     EXPECT_EQ(offset, Offset(TARGET_SIZE_WIDTH / 2, OFFSET_FORTH));
1483     menuAlgorithm->placement_ = Placement::RIGHT;
1484     offset = menuPattern->GetTransformCenter();
1485     EXPECT_EQ(offset, Offset(CONST_DOUBLE_ZREO, OFFSET_FORTH / 2));
1486     menuAlgorithm->placement_ = Placement::NONE;
1487     offset = menuPattern->GetTransformCenter();
1488     EXPECT_EQ(offset, Offset(CONST_DOUBLE_ZREO, CONST_DOUBLE_ZREO));
1489 }
1490 /**
1491  * @tc.name: MenuPatternTestNg034
1492  * @tc.desc: Test Layout with preview content
1493  * @tc.type: FUNC
1494  */
1495 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg034, TestSize.Level1)
1496 {
1497     /**
1498      * @tc.steps: step1. create menu node, preview node and menuLayoutAlgorithm, then set the initial properties
1499      * @tc.expected: menu node, preview node and menuLayoutAlgorithm are not null
1500      */
1501     ScreenSystemManager::GetInstance().dipScale_ = DIP_SCALE;
1502     ScreenSystemManager::GetInstance().screenWidth_ = FULL_SCREEN_WIDTH;
1503     auto context = PipelineBase::GetCurrentContext();
1504     if (context) {
1505         context->dipScale_ = DIP_SCALE;
1506     }
1507 
1508     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
1509     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
1510     RefPtr<MenuTheme> menuTheme = AceType::MakeRefPtr<MenuTheme>();
1511     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(menuTheme));
1512 
1513     auto menuWrapperNode = GetPreviewMenuWrapper();
1514     ASSERT_NE(menuWrapperNode, nullptr);
1515     auto menuNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(0));
1516     ASSERT_NE(menuNode, nullptr);
1517     auto menuAlgorithmWrapper = menuNode->GetLayoutAlgorithm();
1518     auto menuGeometryNode = menuNode->GetGeometryNode();
1519     ASSERT_NE(menuGeometryNode, nullptr);
1520     menuGeometryNode->SetFrameSize(SizeF(TARGET_SIZE_WIDTH, GREATER_WINDOW_MENU_HEIGHT));
1521     auto previewNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(1));
1522     auto previewGeometryNode = previewNode->GetGeometryNode();
1523     ASSERT_NE(previewGeometryNode, nullptr);
1524     previewGeometryNode->SetFrameSize(SizeF(TARGET_SIZE_WIDTH, TARGET_SIZE_HEIGHT));
1525     ASSERT_NE(menuAlgorithmWrapper, nullptr);
1526     auto menuAlgorithm = AceType::DynamicCast<MenuLayoutAlgorithm>(menuAlgorithmWrapper->GetLayoutAlgorithm());
1527     ASSERT_NE(menuAlgorithm, nullptr);
1528     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1529     ASSERT_NE(menuPattern, nullptr);
1530     menuPattern->ShowPreviewMenuAnimation();
1531     EXPECT_FALSE(menuPattern->isFirstShow_);
1532 
1533     menuPattern->isFirstShow_ = true;
1534     menuPattern->ShowPreviewMenuAnimation();
1535     EXPECT_EQ(menuPattern->previewMode_, MenuPreviewMode::CUSTOM);
1536 }
1537 /**
1538  * @tc.name: MenuPatternTest035
1539  * @tc.desc: Verify RegisterOnTouch.
1540  * @tc.type: FUNC
1541  */
1542 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg035, TestSize.Level1)
1543 {
1544     ScreenSystemManager::GetInstance().dipScale_ = DIP_SCALE;
1545     ScreenSystemManager::GetInstance().screenWidth_ = FULL_SCREEN_WIDTH;
1546     auto context = PipelineBase::GetCurrentContext();
1547     if (context) {
1548         context->dipScale_ = DIP_SCALE;
1549     }
1550     auto menuWrapperNode = GetPreviewMenuWrapper();
1551     ASSERT_NE(menuWrapperNode, nullptr);
1552     auto menuNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(0));
1553     ASSERT_NE(menuNode, nullptr);
1554     auto menuAlgorithmWrapper = menuNode->GetLayoutAlgorithm();
1555     auto menuGeometryNode = menuNode->GetGeometryNode();
1556     ASSERT_NE(menuGeometryNode, nullptr);
1557     menuGeometryNode->SetFrameSize(SizeF(TARGET_SIZE_WIDTH, GREATER_WINDOW_MENU_HEIGHT));
1558     auto previewNode = AceType::DynamicCast<FrameNode>(menuWrapperNode->GetChildAtIndex(1));
1559     auto previewGeometryNode = previewNode->GetGeometryNode();
1560     ASSERT_NE(previewGeometryNode, nullptr);
1561     previewGeometryNode->SetFrameSize(SizeF(TARGET_SIZE_WIDTH, TARGET_SIZE_HEIGHT));
1562     ASSERT_NE(menuAlgorithmWrapper, nullptr);
1563     auto menuAlgorithm = AceType::DynamicCast<MenuLayoutAlgorithm>(menuAlgorithmWrapper->GetLayoutAlgorithm());
1564     ASSERT_NE(menuAlgorithm, nullptr);
1565     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1566     ASSERT_NE(menuPattern, nullptr);
1567 
1568     menuPattern->type_ = MenuType::SUB_MENU;
1569     menuWrapperNode->skipMeasureContent_ = false;
1570     EXPECT_FALSE(menuPattern->OnDirtyLayoutWrapperSwap(menuWrapperNode, configDirtySwap));
1571 }
1572 /**
1573  * @tc.name: MenuPatternTestNg036
1574  * @tc.desc: Verify HandleDragEnd
1575  * @tc.type: FUNC
1576  */
1577 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg036, TestSize.Level1)
1578 {
1579     /**
1580      * @tc.steps: step1. Create wrapper and child menu
1581      * @tc.expected: wrapper pattern not null
1582      */
1583     auto wrapperNode =
1584         FrameNode::CreateFrameNode(V2::SELECT_OVERLAY_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1585     auto mainMenu =
1586         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1587     mainMenu->MountToParent(wrapperNode);
1588     auto wrapperPattern = wrapperNode->GetPattern<MenuWrapperPattern>();
1589     auto menuPattern = mainMenu->GetPattern<MenuPattern>();
1590     ASSERT_NE(wrapperPattern, nullptr);
1591     menuPattern->type_ = MenuType::CONTEXT_MENU;
1592 
1593     menuPattern->HandleDragEnd(OFFSET_FIRST, OFFSET_SECOND, POSITION_OFFSET);
1594     EXPECT_TRUE(LessOrEqual(POSITION_OFFSET, PAN_MAX_VELOCITY));
1595 
1596     menuPattern->HandleDragEnd(OFFSET_SECOND, OFFSET_FIRST, PAN_GREATER_MAX_VELOCITY);
1597     EXPECT_TRUE(LessOrEqual(CONST_DOUBLE_ZREO, 0.0f));
1598 }
1599 /**
1600  * @tc.name: MenuPatternTestNg037
1601  * @tc.desc: Verify HandleScrollDragEnd
1602  * @tc.type: FUNC
1603  */
1604 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg037, TestSize.Level1)
1605 {
1606     /**
1607      * @tc.steps: step1. Create wrapper and child menu
1608      * @tc.expected: wrapper pattern not null
1609      */
1610     auto wrapperNode =
1611         FrameNode::CreateFrameNode(V2::SELECT_OVERLAY_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1612     auto mainMenu =
1613         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1614     mainMenu->MountToParent(wrapperNode);
1615     auto wrapperPattern = wrapperNode->GetPattern<MenuWrapperPattern>();
1616     auto menuPattern = mainMenu->GetPattern<MenuPattern>();
1617     ASSERT_NE(wrapperPattern, nullptr);
1618     menuPattern->type_ = MenuType::CONTEXT_MENU;
1619 
1620     menuPattern->HandleScrollDragEnd(OFFSET_FIRST, OFFSET_SECOND, POSITION_OFFSET);
1621     EXPECT_TRUE(LessOrEqual(POSITION_OFFSET, PAN_MAX_VELOCITY));
1622 
1623     menuPattern->HandleScrollDragEnd(CONST_LESS_NEAR_ZREO, CONST_NEAR_ZREO, PAN_GREATER_MAX_VELOCITY);
1624     EXPECT_FALSE(!NearZero(CONST_DOUBLE_ZREO));
1625 }
1626 /**
1627  * @tc.name: MenuModelNGTestNg001
1628  * @tc.desc: Verify MenuModelNG::SetFontColor & SetFontSize
1629  * @tc.type: FUNC
1630  */
1631 HWTEST_F(MenuPattern1TestNg, MenuModelNGTestNg001, TestSize.Level1)
1632 {
1633     /**
1634      * @tc.steps: step1. Init MenuModelNG
1635      */
1636     MenuModelNG myMenuModelNG;
1637     myMenuModelNG.Create();
1638     auto frameNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
1639     ASSERT_NE(frameNode, nullptr);
1640     MenuModelNG myMenuModelNGEx;
1641     myMenuModelNGEx.Create();
1642     auto frameNodeEx = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
1643     ASSERT_NE(frameNode, nullptr);
1644     auto menuPattern = frameNode->GetPattern<MenuPattern>();
1645     ASSERT_NE(menuPattern, nullptr);
1646     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
1647     ASSERT_NE(layoutProperty, nullptr);
1648     /**
1649      * @tc.steps: step2. test SetFontColor
1650      */
1651     myMenuModelNGEx.SetFontColor(AceType::RawPtr(frameNodeEx), Color(-1));
1652     myMenuModelNG.SetFontColor(AceType::RawPtr(frameNode), Color::RED);
1653     EXPECT_EQ(layoutProperty->GetFontColor(), Color::RED);
1654     /**
1655      * @tc.steps: step3. test SetFontSize
1656      */
1657     myMenuModelNGEx.SetFontSize(AceType::RawPtr(frameNode), Dimension(0.0));
1658     myMenuModelNG.SetFontSize(AceType::RawPtr(frameNode), Dimension(25.0));
1659     EXPECT_EQ(layoutProperty->GetFontSize(), Dimension(25.0));
1660 }
1661 
1662 /**
1663  * @tc.name: MenuPatternTestNg038
1664  * @tc.desc: Verify MenuPattern::GetForEachMenuItem
1665  * @tc.type: FUNC
1666  */
1667 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg038, TestSize.Level1)
1668 {
1669     /**
1670      * @tc.steps: step1. Create JS_SYNTAX_ITEM_ETS_TAG parent and next is false;
1671      * @tc.expected: wrapper pattern not null.
1672      */
1673     RefPtr<FrameNode> menuNode =
1674         FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(),
__anonf878b6990402() 1675             []() { return AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE); });
1676     auto parentNode =
1677         FrameNode::CreateFrameNode(V2::JS_SYNTAX_ITEM_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1678     auto mainMenu =
1679         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1680     parentNode->MountToParent(menuNode);
1681     mainMenu->MountToParent(parentNode);
1682     auto menuPattern = mainMenu->GetPattern<MenuPattern>();
1683     menuPattern->type_ = MenuType::CONTEXT_MENU;
1684     auto testNode = menuPattern->GetForEachMenuItem(parentNode, false);
1685     auto forEachNode = AceType::DynamicCast<UINode>(parentNode->GetParent());
1686     auto& children = forEachNode->GetChildren();
1687     ASSERT_NE(forEachNode, nullptr);
1688     auto syntIndex = forEachNode->GetChildIndex(parentNode);
1689     EXPECT_TRUE((syntIndex >= static_cast<int32_t>(children.size() - 1)));
1690     EXPECT_EQ(testNode, nullptr);
1691     /**
1692      * @tc.steps: step1+. Create JS_SYNTAX_ITEM_ETS_TAG parent next is true;
1693      */
1694     testNode = menuPattern->GetForEachMenuItem(parentNode, true);
1695     EXPECT_EQ(testNode, nullptr);
1696     /**
1697      * @tc.steps: step1-. add a child node to parentNode;
1698      */
1699     auto parentNodeEx =
1700         FrameNode::CreateFrameNode(V2::JS_SYNTAX_ITEM_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1701     parentNodeEx->MountToParent(menuNode);
1702     menuPattern = mainMenu->GetPattern<MenuPattern>();
1703     menuPattern->type_ = MenuType::CONTEXT_MENU;
1704     testNode = menuPattern->GetForEachMenuItem(parentNodeEx, true);
1705     EXPECT_EQ(testNode, nullptr);
1706     testNode = menuPattern->GetForEachMenuItem(parentNodeEx, false);
1707     ASSERT_NE(testNode, nullptr);
1708     EXPECT_EQ(testNode->GetTag(), "Menu");
1709     /**
1710      * @tc.steps: step2. Create JS_FOR_EACH_ETS_TAG parent.
1711      * @tc.expected: wrapper pattern not null.
1712      */
1713     auto foreachNode =
1714         FrameNode::CreateFrameNode(V2::JS_FOR_EACH_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1715     auto MenuNode2 =
1716         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1717     MenuNode2->MountToParent(foreachNode);
1718     auto menuPatternEx = MenuNode2->GetPattern<MenuPattern>();
1719     menuPatternEx->type_ = MenuType::CONTEXT_MENU;
1720     testNode = menuPatternEx->GetForEachMenuItem(foreachNode, false);
1721     EXPECT_EQ(testNode, nullptr);
1722     /**
1723      * @tc.steps: step3. Create other parent.
1724      * @tc.expected: wrapper pattern not null
1725      */
1726     auto otherNode =
1727         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1728     auto otherPattern = otherNode->GetPattern<MenuPattern>();
1729     testNode = otherPattern->GetForEachMenuItem(otherNode, false);
1730     EXPECT_EQ(testNode, nullptr);
1731 }
1732 
1733 /**
1734  * @tc.name: MenuPatternTestNg039
1735  * @tc.desc: Verify MenuPattern::OnItemPressed
1736  * @tc.type: FUNC
1737  */
1738 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg039, TestSize.Level1)
1739 {
1740     /**
1741      * @tc.steps: step1. Create JS_SYNTAX_ITEM_ETS_TAG parent index > 0;
1742      */
1743     auto menuitemgroupNode = FrameNode::CreateFrameNode(
1744         V2::MENU_ITEM_GROUP_ETS_TAG, 1, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1745     auto menuitemgroupPattern = menuitemgroupNode->GetPattern<MenuPattern>();
1746     menuitemgroupPattern->OnItemPressed(menuitemgroupNode, 0, false);
1747     /**
1748      * @tc.steps: step2. Create JS_SYNTAX_ITEM_ETS_TAG parent and index < 0;
1749      * @tc.expected: wrapper pattern not null.
1750      */
1751     RefPtr<FrameNode> menuNode =
1752         FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(),
__anonf878b6990502() 1753             []() { return AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE); });
1754     auto parentNode =
1755         FrameNode::CreateFrameNode(V2::JS_SYNTAX_ITEM_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1756     auto mainMenu =
1757         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1758     parentNode->MountToParent(menuNode);
1759     mainMenu->MountToParent(parentNode);
1760     auto menuPattern = mainMenu->GetPattern<MenuPattern>();
1761     menuPattern->type_ = MenuType::CONTEXT_MENU;
1762     menuPattern->OnItemPressed(parentNode, 0, false);
1763     EXPECT_EQ(parentNode->GetTag(), V2::JS_SYNTAX_ITEM_ETS_TAG);
1764     /**
1765      * @tc.steps: step2+. Create JS_SYNTAX_ITEM_ETS_TAG parent index > 0;
1766      */
1767     menuPattern->OnItemPressed(parentNode, 1, false);
1768     EXPECT_EQ(parentNode->GetTag(), V2::JS_SYNTAX_ITEM_ETS_TAG);
1769     /**
1770      * @tc.steps: step3. Create JS_FOR_EACH_ETS_TAG parent index > 0;
1771      */
1772     auto foreachNode =
1773         FrameNode::CreateFrameNode(V2::JS_FOR_EACH_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1774     auto MenuNode2 =
1775         FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1776     auto foreachchildNode =
1777         FrameNode::CreateFrameNode(V2::JS_FOR_EACH_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1778     MenuNode2->MountToParent(foreachNode);
1779     foreachchildNode->MountToParent(foreachNode);
1780     auto menuPatternEx = MenuNode2->GetPattern<MenuPattern>();
1781     menuPatternEx->type_ = MenuType::CONTEXT_MENU;
1782     menuPatternEx->OnItemPressed(foreachNode, -1, false);
1783     EXPECT_EQ(parentNode->GetTag(), V2::JS_SYNTAX_ITEM_ETS_TAG);
1784 }
1785 
1786 /**
1787  * @tc.name: MenuPatternTestNg040
1788  * @tc.desc: Verify MenuPattern::OnItemPressed
1789  * @tc.type: FUNC
1790  */
1791 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg040, TestSize.Level1)
1792 {
1793     /**
1794      * @tc.steps: step1. Create JS_FOR_EACH_ETS_TAG parent index < 0;
1795      */
1796     auto foreachNode = FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(),
__anonf878b6990602() 1797         []() { return AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE); });
1798     auto parent = FrameNode::CreateFrameNode(
1799         V2::JS_SYNTAX_ITEM_ETS_TAG, 2, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1800     auto nextNode = FrameNode::CreateFrameNode(V2::JS_FOR_EACH_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1801     auto nextNodeEx =
1802         FrameNode::CreateFrameNode(V2::JS_FOR_EACH_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1803     parent->MountToParent(foreachNode);
1804     nextNode->MountToParent(parent);
1805     nextNodeEx->MountToParent(parent);
1806     auto menuPattern = parent->GetPattern<MenuPattern>();
1807     menuPattern->type_ = MenuType::CONTEXT_MENU;
1808     menuPattern->OnItemPressed(parent, -1, false);
1809     EXPECT_EQ(parent->GetTag(), V2::JS_SYNTAX_ITEM_ETS_TAG);
1810 }
1811 
1812 /**
1813  * @tc.name: MenuPatternTestNg040
1814  * @tc.desc: Verify MenuPattern::GetOutsideForEachMenuItem
1815  * @tc.type: FUNC
1816  */
1817 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg041, TestSize.Level1)
1818 {
1819     /**
1820      * @tc.steps: step1. Create node child one and next is false;
1821      * @tc.expected: wrapper pattern not null.
1822      */
1823     RefPtr<FrameNode> parentForEachNode =
1824         FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(),
__anonf878b6990702() 1825             []() { return AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE); });
1826     auto forEachNode =
1827         FrameNode::CreateFrameNode(V2::JS_SYNTAX_ITEM_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1828     forEachNode->MountToParent(parentForEachNode);
1829     auto menuPattern = parentForEachNode->GetPattern<MenuPattern>();
1830     menuPattern->type_ = MenuType::CONTEXT_MENU;
1831     auto testNode = menuPattern->GetOutsideForEachMenuItem(forEachNode, false);
1832     EXPECT_EQ(testNode, nullptr);
1833     /**
1834      * @tc.steps: step1+. Create JS_SYNTAX_ITEM_ETS_TAG parent next is true;
1835      */
1836     menuPattern->GetOutsideForEachMenuItem(forEachNode, true);
1837     EXPECT_EQ(testNode, nullptr);
1838     /**
1839      * @tc.steps: step2. Create node child two and next is false;
1840      */
1841     auto forEachNodeEx =
1842         FrameNode::CreateFrameNode(V2::JS_SYNTAX_ITEM_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1843     forEachNodeEx->MountToParent(parentForEachNode);
1844     menuPattern = parentForEachNode->GetPattern<MenuPattern>();
1845     menuPattern->type_ = MenuType::CONTEXT_MENU;
1846     menuPattern->GetOutsideForEachMenuItem(forEachNode, false);
1847     EXPECT_EQ(testNode, nullptr);
1848     /**
1849      * @tc.steps: step1+. Create JS_SYNTAX_ITEM_ETS_TAG parent next is true;
1850      */
1851     menuPattern->GetOutsideForEachMenuItem(forEachNode, true);
1852     EXPECT_EQ(testNode, nullptr);
1853 }
1854 /**
1855  * @tc.name: MenuPatternTestNg042
1856  * @tc.desc: Verify MenuPattern::GetMenuItemInfo
1857  * @tc.type: FUNC
1858  */
1859 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg042, TestSize.Level1)
1860 {
1861     /**
1862      * @tc.steps: step1. Create menuitem childnode and isNeedRestoreNodeId if false;
1863      */
1864     RefPtr<FrameNode> menuNode =
1865         FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(),
__anonf878b6990802() 1866             []() { return AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE); });
1867     auto child = FrameNode::CreateFrameNode(V2::MENU_ITEM_ETS_TAG, 1, AceType::MakeRefPtr<MenuItemPattern>());
1868     child->MountToParent(menuNode);
1869     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1870     menuPattern->type_ = MenuType::CONTEXT_MENU;
1871     auto menuItemPattern = child->GetPattern<MenuItemPattern>();
1872     auto testInfo = menuPattern->GetMenuItemInfo(child, false);
1873     EXPECT_FALSE(testInfo.isFindTargetId);
1874     menuItemPattern->SetClickMenuItemId(child->GetId());
1875     testInfo = menuPattern->GetMenuItemInfo(child, false);
1876     EXPECT_TRUE(testInfo.isFindTargetId);
1877     testInfo = menuPattern->GetMenuItemInfo(child, true);
1878     EXPECT_TRUE(testInfo.isFindTargetId);
1879 
1880     testInfo = menuPattern->GetMenuItemInfo(menuNode, false);
1881     EXPECT_FALSE(testInfo.isFindTargetId);
1882 }
1883 /**
1884  * @tc.name: MenuPatternTestNg043
1885  * @tc.desc: Verify MenuPattern::GetInnerMenuOffset
1886  * @tc.type: FUNC
1887  */
1888 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg043, TestSize.Level1)
1889 {
1890     /**
1891      * @tc.steps: step1. Create menuitem childnode and isNeedRestoreNodeId if false;
1892      */
1893     RefPtr<FrameNode> menuNode =
1894         FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(),
__anonf878b6990902() 1895             []() { return AceType::MakeRefPtr<MenuPattern>(TARGET_ID, "", TYPE); });
1896     auto child = FrameNode::CreateFrameNode(V2::MENU_ITEM_ETS_TAG, 1, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1897     child->MountToParent(menuNode);
1898     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1899     menuPattern->type_ = MenuType::CONTEXT_MENU;
1900     auto menuItemPattern = child->GetPattern<MenuItemPattern>();
1901     auto testInfo = menuPattern->GetInnerMenuOffset(child, false);
1902     EXPECT_FALSE(testInfo.isFindTargetId);
1903     /**
1904      * @tc.steps: step1+. test GetInnerMenuOffset and isNeedRestoreNodeId if true;
1905      */
1906     testInfo = menuPattern->GetInnerMenuOffset(child, true);
1907     EXPECT_FALSE(testInfo.isFindTargetId);
1908     /**
1909      * @tc.steps: step2. Create menuitemgroup node and isNeedRestoreNodeId if false;
1910      */
1911     auto menuitemgroupNode = FrameNode::CreateFrameNode(
1912         V2::MENU_ITEM_GROUP_ETS_TAG, 1, AceType::MakeRefPtr<MenuPattern>(1, TEXT_TAG, MenuType::MENU));
1913     auto itemchildOne =
1914         FrameNode::CreateFrameNode(V2::MENU_ITEM_ETS_TAG, 2, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1915     auto itemchildTwo =
1916         FrameNode::CreateFrameNode(V2::MENU_ITEM_ETS_TAG, 3, AceType::MakeRefPtr<MenuWrapperPattern>(1));
1917     itemchildOne->MountToParent(menuitemgroupNode);
1918     itemchildTwo->MountToParent(menuitemgroupNode);
1919     menuPattern = menuNode->GetPattern<MenuPattern>();
1920     testInfo = menuPattern->GetInnerMenuOffset(menuitemgroupNode, false);
1921     EXPECT_FALSE(testInfo.isFindTargetId);
1922     /**
1923      * @tc.steps: step2. Create menuitemgroup node and isNeedRestoreNodeId if true;
1924      */
1925     testInfo = menuPattern->GetInnerMenuOffset(menuitemgroupNode, true);
1926     EXPECT_EQ(testInfo.originOffset, OffsetF(0.0, 0.0));
1927     EXPECT_FALSE(testInfo.isFindTargetId);
1928 }
1929 
1930 /**
1931  * @tc.name: MenuPatternTestNg044
1932  * @tc.desc: Verify MneuModelInstance methods.
1933  * @tc.type: FUNC
1934  */
1935 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg044, TestSize.Level1)
1936 {
1937     MenuModelNG MneuModelInstance;
1938     MneuModelInstance.Create();
1939     MneuModelInstance.SetFontSize(Dimension(25.0));
1940     MneuModelInstance.SetFontColor(Color::RED);
1941     MneuModelInstance.SetFontWeight(FontWeight::BOLD);
1942     MneuModelInstance.SetFontStyle(Ace::FontStyle::ITALIC);
1943     MneuModelInstance.SetBorderRadius(Dimension(2));
1944     MneuModelInstance.SetWidth(Dimension(10));
1945     std::vector<std::string> myFamilies = {"Smith"};
1946     MneuModelInstance.SetFontFamily(myFamilies);
1947     MneuModelInstance.SetBorderRadius(Dimension(1), Dimension(2), Dimension(3), Dimension(4));
1948     MneuModelInstance.SetItemDivider(ITEM_DIVIDER);
1949     MneuModelInstance.SetItemGroupDivider(ITEM_DIVIDER);
1950     MneuModelInstance.SetExpandingMode(SubMenuExpandingMode::STACK);
1951 
1952     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
1953     ASSERT_NE(menuNode, nullptr);
1954     auto menuPattern = menuNode->GetPattern<MenuPattern>();
1955     ASSERT_NE(menuPattern, nullptr);
1956     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
1957     ASSERT_NE(layoutProperty, nullptr);
1958 
1959     // call UpdateMenuItemChildren
1960     menuPattern->OnModifyDone();
1961 
1962     MneuModelInstance.ResetFontFamily();
1963     MneuModelInstance.ResetBorderRadius();
1964 
1965     ASSERT_TRUE(layoutProperty->GetFontSize().has_value());
1966     EXPECT_EQ(layoutProperty->GetFontSize().value(), Dimension(25.0));
1967     ASSERT_TRUE(layoutProperty->GetFontWeight().has_value());
1968     EXPECT_EQ(layoutProperty->GetFontWeight().value(), FontWeight::BOLD);
1969     ASSERT_TRUE(layoutProperty->GetFontColor().has_value());
1970     EXPECT_EQ(layoutProperty->GetFontColor().value(), Color::RED);
1971     ASSERT_TRUE(layoutProperty->GetItalicFontStyle().has_value());
1972     EXPECT_EQ(layoutProperty->GetItalicFontStyle().value(), Ace::FontStyle::ITALIC);
1973 }
1974 
1975 /**
1976  * @tc.name: MenuPatternTestNg045
1977  * @tc.desc: Verify MneuModelInstance methods with frameNode.
1978  * @tc.type: FUNC
1979  */
1980 HWTEST_F(MenuPattern1TestNg, MenuPatternTestNg045, TestSize.Level1)
1981 {
1982     MenuModelNG MneuModelInstance;
1983     MneuModelInstance.Create();
1984 
1985     auto menuNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
1986     ASSERT_NE(menuNode, nullptr);
1987     FrameNode *frameNode = menuNode.GetRawPtr();
1988     CHECK_NULL_VOID(frameNode);
1989     MneuModelInstance.SetFontSize(frameNode, Dimension(25.0));
1990     MneuModelInstance.SetFontWeight(frameNode, FontWeight::BOLD);
1991     MneuModelInstance.SetFontColor(frameNode, Color::RED);
1992     MneuModelInstance.SetFontStyle(frameNode, Ace::FontStyle::ITALIC);
1993     MneuModelInstance.SetBorderRadius(frameNode, Dimension(2));
1994     MneuModelInstance.SetWidth(frameNode, Dimension(10));
1995     std::vector<std::string> myFamilies = {"Smith"};
1996     MneuModelInstance.SetFontFamily(frameNode, myFamilies);
1997     MneuModelInstance.SetBorderRadius(frameNode, Dimension(1), Dimension(2), Dimension(3), Dimension(4));
1998     MneuModelInstance.SetItemDivider(frameNode, ITEM_DIVIDER);
1999     MneuModelInstance.SetItemGroupDivider(frameNode, ITEM_DIVIDER);
2000     MneuModelInstance.ResetBorderRadius(frameNode);
2001 
2002     auto menuPattern = menuNode->GetPattern<MenuPattern>();
2003     ASSERT_NE(menuPattern, nullptr);
2004     auto layoutProperty = menuPattern->GetLayoutProperty<MenuLayoutProperty>();
2005     ASSERT_NE(layoutProperty, nullptr);
2006 
2007     // call UpdateMenuItemChildren
2008     menuPattern->OnModifyDone();
2009 
2010     ASSERT_TRUE(layoutProperty->GetFontSize().has_value());
2011     EXPECT_EQ(layoutProperty->GetFontSize().value(), Dimension(25.0));
2012     ASSERT_TRUE(layoutProperty->GetFontWeight().has_value());
2013     EXPECT_EQ(layoutProperty->GetFontWeight().value(), FontWeight::BOLD);
2014     ASSERT_TRUE(layoutProperty->GetFontColor().has_value());
2015     EXPECT_EQ(layoutProperty->GetFontColor().value(), Color::RED);
2016     ASSERT_TRUE(layoutProperty->GetItalicFontStyle().has_value());
2017     EXPECT_EQ(layoutProperty->GetItalicFontStyle().value(), Ace::FontStyle::ITALIC);
2018 
2019     MneuModelInstance.SetFontColor(frameNode, std::nullopt);
2020     ASSERT_FALSE(layoutProperty->GetFontColor().has_value());
2021     MneuModelInstance.SetFontSize(frameNode, Dimension(0.0));
2022     ASSERT_FALSE(layoutProperty->GetFontSize().has_value());
2023 }
2024 } // namespace OHOS::Ace::NG
2025