From ebdfc6aab34bb6ecb0c68cfbde416d535746213c Mon Sep 17 00:00:00 2001 From: bayanxing Date: Sat, 24 Sep 2022 21:13:49 +0800 Subject: [PATCH] =?UTF-8?q?attr=20api=20=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bayanxing --- arkui/BUILD.gn | 1 + .../entry/src/main/config.json | 3 + .../ets/MainAbility/pages/focusControl.ets | 278 ++++++++ .../src/main/ets/MainAbility/pages/global.ets | 59 ++ .../main/ets/MainAbility/pages/list_item.ets | 97 +-- .../main/ets/MainAbility/pages/pageRoute.ets | 95 +++ .../src/main/ets/MainAbility/pages/panel.ets | 60 +- .../main/ets/MainAbility/pages/sideBar.ets | 1 + .../main/ets/test/FocusControlJsunit.test.ets | 187 ++++++ .../entry/src/main/ets/test/List.test.ets | 5 + .../entry/src/main/ets/test/global.test.ets | 93 +++ .../src/main/ets/test/list_item.test.ets | 13 + .../src/main/ets/test/pageRoute.test.ets | 71 ++ .../entry/src/main/ets/test/panel.test.ets | 164 +---- .../entry/src/main/ets/test/sideBar.test.ets | 16 + arkui/ace_ets_component_attrlack/BUILD.gn | 36 + arkui/ace_ets_component_attrlack/Test.json | 19 + .../entry/src/main/config.json | 137 ++++ .../entry/src/main/ets/MainAbility/app.ets | 33 + .../src/main/ets/MainAbility/common/Log.ets | 38 ++ .../src/main/ets/MainAbility/common/Utils.ets | 118 ++++ .../src/main/ets/MainAbility/common/bg1.png | Bin 0 -> 186448 bytes .../src/main/ets/MainAbility/common/bg2.png | Bin 0 -> 14842 bytes .../MainAbility/common/plugin_component.js | 98 +++ .../pages/PluginProviderExample.ets | 51 ++ .../ets/MainAbility/pages/alertDialog.ets | 146 ++++ .../MainAbility/pages/animate_play_mode.ets | 125 ++++ .../main/ets/MainAbility/pages/animator.ets | 53 ++ .../src/main/ets/MainAbility/pages/app.ets | 73 ++ .../ets/MainAbility/pages/attr_animate.ets | 267 ++++++++ .../main/ets/MainAbility/pages/calendar.ets | 91 +++ .../src/main/ets/MainAbility/pages/canvas.ets | 71 ++ .../main/ets/MainAbility/pages/checkBox.ets | 76 +++ .../ets/MainAbility/pages/checkBoxGroup.ets | 109 +++ .../src/main/ets/MainAbility/pages/common.ets | 577 ++++++++++++++++ .../main/ets/MainAbility/pages/copyOption.ets | 70 ++ .../src/main/ets/MainAbility/pages/curves.ets | 262 ++++++++ .../main/ets/MainAbility/pages/datePicker.ets | 74 +++ .../main/ets/MainAbility/pages/edgeEffect.ets | 59 ++ .../src/main/ets/MainAbility/pages/enums.ets | 624 ++++++++++++++++++ .../ets/MainAbility/pages/featureAbility.ets | 402 +++++++++++ .../main/ets/MainAbility/pages/fill_mode.ets | 111 ++++ .../main/ets/MainAbility/pages/gesture.ets | 101 +++ .../main/ets/MainAbility/pages/gridCol.ets | 96 +++ .../main/ets/MainAbility/pages/gridRow.ets | 186 ++++++ .../ets/MainAbility/pages/hoverEffect.ets | 70 ++ .../src/main/ets/MainAbility/pages/index.ets | 39 ++ .../main/ets/MainAbility/pages/keysource.ets | 42 ++ .../main/ets/MainAbility/pages/listtest.ets | 149 +++++ .../ets/MainAbility/pages/loadingProgress.ets | 70 ++ .../main/ets/MainAbility/pages/onFrame.ets | 126 ++++ .../src/main/ets/MainAbility/pages/page1.ets | 66 ++ .../src/main/ets/MainAbility/pages/page2.ets | 66 ++ .../main/ets/MainAbility/pages/progress.ets | 74 +++ .../src/main/ets/MainAbility/pages/radio.ets | 70 ++ .../main/ets/MainAbility/pages/refresh.ets | 126 ++++ .../ets/MainAbility/pages/remoteWindow.ets | 61 ++ .../ets/MainAbility/pages/responseType.ets | 88 +++ .../src/main/ets/MainAbility/pages/router.ets | 126 ++++ .../ets/MainAbility/pages/scroll_edge.ets | 73 ++ .../main/ets/MainAbility/pages/sidebar.ets | 82 +++ .../src/main/ets/MainAbility/pages/slider.ets | 95 +++ .../ets/MainAbility/pages/stateManagement.ets | 52 ++ .../ets/MainAbility/pages/stepperItem.ets | 92 +++ .../src/main/ets/MainAbility/pages/swiper.ets | 112 ++++ .../main/ets/MainAbility/pages/text_input.ets | 55 ++ .../ets/MainAbility/pages/uiAppearance.ets | 113 ++++ .../src/main/ets/MainAbility/pages/units.ets | 178 +++++ .../src/main/ets/MainAbility/pages/web.ets | 100 +++ .../entry/src/main/ets/TestAbility/app.ets | 33 + .../src/main/ets/TestAbility/pages/index.ets | 50 ++ .../ets/TestRunner/OpenHarmonyTestRunner.ts | 78 +++ .../entry/src/main/ets/test/List.test.ets | 76 +++ .../entry/src/main/ets/test/Utils.ets | 118 ++++ .../src/main/ets/test/alertDialog.test.ets | 75 +++ .../main/ets/test/animate_play_mode.test.ets | 94 +++ .../entry/src/main/ets/test/animator.test.ets | 202 ++++++ .../entry/src/main/ets/test/app.test.ets | 70 ++ .../entry/src/main/ets/test/canvas.test.ets | 109 +++ .../entry/src/main/ets/test/checkBox.test.ets | 65 ++ .../src/main/ets/test/checkBoxGroup.test.ets | 88 +++ .../entry/src/main/ets/test/common.test.ets | 170 +++++ .../src/main/ets/test/copyOption.test.ets | 82 +++ .../entry/src/main/ets/test/curves.test.ets | 262 ++++++++ .../src/main/ets/test/datePicker.test.ets | 65 ++ .../entry/src/main/ets/test/enums.test.ets | 65 ++ .../src/main/ets/test/fill_mode.test.ets | 65 ++ .../entry/src/main/ets/test/gesture.test.ets | 65 ++ .../entry/src/main/ets/test/gridCol.test.ets | 82 +++ .../entry/src/main/ets/test/gridRow.test.ets | 65 ++ .../src/main/ets/test/hoverEffect.test.ets | 83 +++ .../entry/src/main/ets/test/listtest.test.ets | 66 ++ .../main/ets/test/loadingProgress.test.ets | 90 +++ .../main/ets/test/pluginComponent.test.ets | 65 ++ .../entry/src/main/ets/test/progress.test.ets | 82 +++ .../entry/src/main/ets/test/radio.test.ets | 71 ++ .../entry/src/main/ets/test/refresh.test.ets | 101 +++ .../src/main/ets/test/remoteWindow.test.ets | 220 ++++++ .../src/main/ets/test/responseType.test.ets | 83 +++ .../entry/src/main/ets/test/router.test.ets | 95 +++ .../src/main/ets/test/scrollEdge.test.ets | 61 ++ .../entry/src/main/ets/test/sidebar.test.ets | 65 ++ .../entry/src/main/ets/test/slider.test.ets | 70 ++ .../main/ets/test/stateManagement.test.ets | 66 ++ .../src/main/ets/test/stepperItem.test.ets | 65 ++ .../entry/src/main/ets/test/swiper.test.ets | 65 ++ .../src/main/ets/test/text_input.test.ets | 65 ++ .../src/main/ets/test/uiAppearance.test.ets | 101 +++ .../entry/src/main/ets/test/units.test.ets | 137 ++++ .../entry/src/main/ets/test/web.test.ets | 49 ++ .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/float.json | 12 + .../main/resources/base/element/string.json | 36 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../entry/src/main/resources/rawfile/bg3.png | Bin 0 -> 27724 bytes .../entry/src/main/resources/rawfile/bg4.png | Bin 0 -> 21596 bytes .../entry/src/main/resources/rawfile/test.png | Bin 0 -> 6790 bytes .../signature/openharmony_sx.p7b | Bin 0 -> 3437 bytes 118 files changed, 10874 insertions(+), 236 deletions(-) create mode 100644 arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/focusControl.ets create mode 100644 arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/global.ets create mode 100644 arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/pageRoute.ets create mode 100644 arkui/ace_ets_component_apilack/entry/src/main/ets/test/FocusControlJsunit.test.ets create mode 100644 arkui/ace_ets_component_apilack/entry/src/main/ets/test/global.test.ets create mode 100644 arkui/ace_ets_component_apilack/entry/src/main/ets/test/pageRoute.test.ets create mode 100644 arkui/ace_ets_component_attrlack/BUILD.gn create mode 100644 arkui/ace_ets_component_attrlack/Test.json create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/config.json create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/app.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Log.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Utils.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/bg1.png create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/bg2.png create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/plugin_component.js create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/PluginProviderExample.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/alertDialog.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animate_play_mode.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animator.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/app.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/attr_animate.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/calendar.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/canvas.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBox.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBoxGroup.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/common.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/copyOption.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/curves.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/datePicker.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/edgeEffect.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/enums.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/featureAbility.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/fill_mode.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gesture.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridCol.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridRow.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/hoverEffect.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/keysource.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/listtest.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/loadingProgress.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/onFrame.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page1.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page2.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/progress.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/radio.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/refresh.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/remoteWindow.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/responseType.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/router.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/scroll_edge.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/sidebar.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/slider.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stateManagement.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stepperItem.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/swiper.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/text_input.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/uiAppearance.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/units.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/web.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/app.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/pages/index.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/TestRunner/OpenHarmonyTestRunner.ts create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/List.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/Utils.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/alertDialog.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animate_play_mode.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animator.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/app.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/canvas.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBox.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBoxGroup.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/common.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/copyOption.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/curves.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/datePicker.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/enums.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/fill_mode.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gesture.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridCol.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridRow.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/hoverEffect.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/listtest.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/loadingProgress.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/pluginComponent.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/progress.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/radio.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/refresh.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/remoteWindow.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/responseType.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/router.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/scrollEdge.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/sidebar.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/slider.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stateManagement.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stepperItem.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/swiper.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/text_input.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/uiAppearance.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/units.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/ets/test/web.test.ets create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/color.json create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/float.json create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/string.json create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/resources/base/media/icon.png create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/resources/rawfile/bg3.png create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/resources/rawfile/bg4.png create mode 100644 arkui/ace_ets_component_attrlack/entry/src/main/resources/rawfile/test.png create mode 100644 arkui/ace_ets_component_attrlack/signature/openharmony_sx.p7b diff --git a/arkui/BUILD.gn b/arkui/BUILD.gn index eb91b3627..4c26fdd49 100644 --- a/arkui/BUILD.gn +++ b/arkui/BUILD.gn @@ -16,6 +16,7 @@ group("arkui") { deps = [ "ace_ets_component:ActsAceEtsComponentTest", "ace_ets_component_apilack:ActsAceEtsApiLackTest", + "ace_ets_component_attrlack:ActsAceEtsAttrLackTest", "ace_ets_component_five:ActsAceEtsComponentFiveTest", "ace_ets_component_four:ActsAceEtsComponentFourTest", "ace_ets_component_three:ActsAceEtsComponentThreeTest", diff --git a/arkui/ace_ets_component_apilack/entry/src/main/config.json b/arkui/ace_ets_component_apilack/entry/src/main/config.json index fdd020d71..97af9a51a 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/config.json +++ b/arkui/ace_ets_component_apilack/entry/src/main/config.json @@ -81,8 +81,10 @@ "pages/curves", "pages/ellipse", "pages/featureAbility", + "pages/focusControl", "pages/form_component", "pages/gauge", + "pages/global", "pages/grid", "pages/grid_col", "pages/grid_row", @@ -95,6 +97,7 @@ "pages/mediaQuery", "pages/navigator", "pages/page1", + "pages/pageRoute", "pages/page_transition", "pages/panel", "pages/path", diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/focusControl.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/focusControl.ets new file mode 100644 index 000000000..b3cedb8d7 --- /dev/null +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/focusControl.ets @@ -0,0 +1,278 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import events_emitter from '@ohos.events.emitter'; + +@Entry +@Component +struct FocusControlExample { + @State inputValue: string = '' + @State touchOnFocusName: string = 'OnTouchGrpBtn' + @State touchOnFocusName1: string = 'OnTouchBtn1' + @State touchOnFocusName2: string = 'OnTouchBtn2' + @State touchOnFocusName3: string = 'OnTouchBtn3' + @State touchOnFocusName4: string = 'OnTouchBtn4' + + build() { + Scroll() { + Row({ space: 20 }) { + Column({ space: 20 }) { + Column({ space: 5 }) { + Button(this.touchOnFocusName) + .width(165) + .height(40) + .key('OnTouchGrpBtn') + .fontColor(Color.White) + .focusable(true) + .onFocus(() => { + try { + this.touchOnFocusName = 'Focus' + this.touchOnFocusName + console.info("onFocus value changed " + this.touchOnFocusName) + var eventData = { + data: { + "value": this.touchOnFocusName, + } + } + var event = { + eventId: 60232, + priority: events_emitter.EventPriority.LOW + } + console.info("OnTouchGrpBtn start to emit action state") + events_emitter.emit(event, eventData) + } catch (err) { + console.info("OnTouchGrpBtn emit action state err: " + JSON.stringify(err.message)) + } + }) + .focusOnTouch(true) //该Button组件点击后可获焦 + Row({ space: 5 }) { + Button(this.touchOnFocusName1) + .width(80) + .height(40) + .key('OnTouchBtn1') + .fontColor(Color.White) + .focusable(true) + .onFocus(() => { + try { + this.touchOnFocusName1 = 'Focus' + this.touchOnFocusName1 + console.info("onFocus value changed " + this.touchOnFocusName1) + var eventData = { + data: { + "value": this.touchOnFocusName1, + } + } + var event = { + eventId: 60233, + priority: events_emitter.EventPriority.LOW + } + console.info("OnTouchBtn1 start to emit action state") + events_emitter.emit(event, eventData) + } catch (err) { + console.info("OnTouchBtn1 emit action state err: " + JSON.stringify(err.message)) + } + }) + .focusOnTouch(true) + Button(this.touchOnFocusName2) + .width(80) + .height(40) + .key('OnTouchBtn2') + .fontColor(Color.White) + .focusable(true) + .onFocus(() => { + try { + this.touchOnFocusName2 = 'Focus' + this.touchOnFocusName2 + console.info("onFocus value changed " + this.touchOnFocusName2) + var eventData = { + data: { + "value": this.touchOnFocusName2, + } + } + var event = { + eventId: 60234, + priority: events_emitter.EventPriority.LOW + } + console.info("OnTouchBtn2 start to emit action state") + events_emitter.emit(event, eventData) + } catch (err) { + console.info("OnTouchBtn2 emit action state err: " + JSON.stringify(err.message)) + } + }) + .focusOnTouch(true) //该Button组件点击后可获焦 + } + Row({ space: 5 }) { + Button(this.touchOnFocusName3) + .width(80) + .height(40) + .key('OnTouchBtn3') + .fontColor(Color.White) + .focusable(true) + .onFocus(() => { + this.touchOnFocusName3 = 'Focus' + this.touchOnFocusName3 + console.info("onFocus value changed " + this.touchOnFocusName3) + }) + .onClick(() => { + try { + var eventData = { + data: { + "value": this.touchOnFocusName3, + } + } + var event = { + eventId: 60235, + priority: events_emitter.EventPriority.LOW + } + console.info("OnTouchBtn3 start to emit action state") + events_emitter.emit(event, eventData) + } catch (err) { + console.info("OnTouchBtn3 emit action state err: " + JSON.stringify(err.message)) + } + }) + + Button(this.touchOnFocusName4) + .width(80) + .height(40) + .key('OnTouchBtn4') + .fontColor(Color.White) + .focusable(true) + .onFocus(() => { + this.touchOnFocusName4 = 'Focus' + this.touchOnFocusName4 + console.info("onFocus value changed " + this.touchOnFocusName4) + }) + .onClick(() => { + try { + console.info("onClick event " + this.touchOnFocusName4) + var eventData = { + data: { + "value": this.touchOnFocusName4, + } + } + var event = { + eventId: 60236, + priority: events_emitter.EventPriority.LOW + } + console.info("OnTouchBtn4 start to emit action state") + events_emitter.emit(event, eventData) + } catch (err) { + console.info("OnTouchBtn4 emit action state err: " + JSON.stringify(err.message)) + } + }) + } + }.borderWidth(2).borderColor(Color.Red).borderStyle(BorderStyle.Dashed) + .tabIndex(1) //该Column组件为按TAB键走焦的第一个获焦的组件 + Column({ space: 5 }) { + Button('Group2') + .width(165) + .height(40) + .fontColor(Color.White) + Row({ space: 5 }) { + Button() + .width(80) + .height(40) + .fontColor(Color.White) + Button() + .width(80) + .height(40) + .fontColor(Color.White) + .groupDefaultFocus(true) //该Button组件上级Column组件获焦时获焦 + } + Row({ space: 5 }) { + Button() + .width(80) + .height(40) + .fontColor(Color.White) + Button() + .width(80) + .height(40) + .fontColor(Color.White) + } + }.borderWidth(2).borderColor(Color.Green).borderStyle(BorderStyle.Dashed) + .tabIndex(2) //该Column组件为按TAB键走焦的第二个获焦的组件 + } + Column({ space: 5 }) { + TextInput({placeholder: 'input', text: this.inputValue}) + .onChange((value: string) => { + this.inputValue = value + }) + .fontColor(Color.Blue) + .focusable(true) + .key('defaultFocusText') + .onFocus(() => { + try { + this.inputValue = 'defaultFocus' + console.info("onFocus value changed " + this.inputValue) + var eventData = { + data: { + "value": this.inputValue, + } + } + var event = { + eventId: 60237, + priority: events_emitter.EventPriority.LOW + } + console.info("defaultFocus test start to emit action start") + events_emitter.emit(event, eventData) + } catch (err) { + console.info("defaultFocus test emit action state err: " + JSON.stringify(err.message)) + } + }) + .defaultFocus(true) //该TextInput组件为页面的初始默认焦点 + Button('Group3') + .width(165) + .height(40) + .fontColor(Color.White) + Row({ space: 5 }) { + Button() + .width(80) + .height(40) + .fontColor(Color.White) + Button() + .width(80) + .height(40) + .fontColor(Color.White) + } + Button() + .width(165) + .height(40) + .fontColor(Color.White) + Row({ space: 5 }) { + Button() + .width(80) + .height(40) + .fontColor(Color.White) + Button() + .width(80) + .height(40) + .fontColor(Color.White) + } + Button() + .width(165) + .height(40) + .fontColor(Color.White) + Row({ space: 5 }) { + Button() + .width(80) + .height(40) + .fontColor(Color.White) + Button() + .width(80) + .height(40) + .fontColor(Color.White) + } + }.borderWidth(2).borderColor(Color.Orange).borderStyle(BorderStyle.Dashed) + .tabIndex(3) //该Column组件为按TAB键走焦的第三个获焦的组件 + }.alignItems(VerticalAlign.Top) + } + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/global.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/global.ets new file mode 100644 index 000000000..ea6537e9e --- /dev/null +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/global.ets @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct GlobalLack { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear GlobalLack start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear GlobalLack end`) + } + + build() { + Column() { + Button("Click2").fontSize(50) + .onClick(() => { + console.info("Click2" + JSON.stringify(sendEventByKey("Del", 10, ""))); + }).key("Click2") + List({space:10}) { + ListItem() { + Text("Hello world") { + } + .width('100%') + .height(100) + .fontSize(16) + .textAlign(TextAlign.Center) + .borderRadius(10) + .backgroundColor(0xFFFFFF) + } + .key("ListItem") + .sticky(Sticky.None) + .selectable(false) + .editable(true) + } + } + .padding(10) + .backgroundColor(0xDCDCDC) + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/list_item.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/list_item.ets index 81c1b49db..e6c3fc94a 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/list_item.ets +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/list_item.ets @@ -21,10 +21,6 @@ import events_emitter from '@ohos.events.emitter'; @Component export default struct List_itemOnSelect { - @State selectIndex:boolean = false - @State arr: string[] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"] - @State alignListItem: ListItemAlign = ListItemAlign.Start - aboutToAppear() { Log.showInfo(TAG, `aboutToAppear List_itemOnSelect start`) } @@ -33,70 +29,41 @@ struct List_itemOnSelect { Log.showInfo(TAG, `aboutToDisAppear List_itemOnSelect end`) } - build(){ - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ - - Text("list_item-OnSelect") - .width(100) - .height(70) - .fontSize(20) - .opacity(1) - .align(Alignment.TopStart) - .fontColor(0xCCCCCC) - .lineHeight(25) - .border({ width: 1 }) - .padding(10) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .key("onSelectText") - - List({ space: 20, initialIndex: 0 }) { - ForEach(this.arr, (item) => { - ListItem() { - Text('' + item) - .width('100%') - .height(100) - .fontSize(16) + @Builder itemEnd() { + Row () { + Button("Del").margin("4vp").key("Del") + Button("Set").margin("4vp").key("Set") + }.padding("4vp").justifyContent(FlexAlign.SpaceEvenly) + } + build() { + Column() { + Button("Click2").fontSize(50) + .onClick(() => { + console.info("Click2" + JSON.stringify(sendEventByKey("Del", 10, ""))); + }).key("Click2") + List({space:10}) { + ListItem() { + Text("Hello world") { } - .editable(true) - .sticky(Sticky.None) - .selectable(true) - .key("ListItem") - .onClick(()=> { - console.info("ListItem onClick") - }) - .border({ width: 2, color: Color.Green }) - .onSelect((index:boolean)=>{ - console.info("Select: " + index) - this.selectIndex = index - try { - var backData = { - data: { - "selectIndex": this.selectIndex - } - } - let backEvent = { - eventId: 60217, - priority: events_emitter.EventPriority.LOW - } - console.info("listItemOnSelect start to emit action state") - events_emitter.emit(backEvent, backData) - } catch (err) { - console.info("listItemOnSelect emit action state err: " + JSON.stringify(err.message)) - } - }) - }, item => item) + .width('100%') + .height(100) + .fontSize(16) + .textAlign(TextAlign.Center) + .borderRadius(10) + .backgroundColor(0xFFFFFF) + } + .key("ListItem") + .sticky(Sticky.None) + .selectable(false) + .editable(true) + .swipeAction({ end:this.itemEnd}) } - .height(300) - .width("90%") - .editMode(true) - .border({ width: 3, color: Color.Red }) - .lanes({ minLength: 40, maxLength: 60 }) - //lanes(5) - .alignListItem(this.alignListItem) - - }.width("100%").height("100%") + } + .padding(10) + .backgroundColor(0xDCDCDC) + .width('100%') + .height('100%') } } diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/pageRoute.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/pageRoute.ets new file mode 100644 index 000000000..b98d8a6f1 --- /dev/null +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/pageRoute.ets @@ -0,0 +1,95 @@ +// @ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import router from '@system.router'; +import events_emitter from '@ohos.events.emitter'; + +@Entry +@Component +struct PageRouteExample { + @State private angle:number = 1; + @State private imageSize:number = 2; + @State private speed:number = 5; + @State private interval:number = 0; + @State private state:string = ''; + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) + { + Image($rawfile('test.png')) + .width(100).height(100).objectFit(ImageFit.Contain) + .margin({top:50,bottom:150,right:10}) + .rotate({ x: 0, y: 0, z: 2, angle:this.angle}) // 组件以(1,1,1)为旋转轴,中心点顺时针旋转 300度 + .scale({ x: this.imageSize, y: this.imageSize }) + Text('speed '+ this.speed) + .fontSize(20).fontWeight(FontWeight.Bold) + Slider({ + value: this.speed, + min: 1, + max: 50, + step: 1, + style: SliderStyle.OutSet + }) + .blockColor(Color.Orange) + .onChange((value: number) => { + this.speed = value + }) + Button('Next', { type: ButtonType.Capsule, stateEffect: true }) + .backgroundColor(0x317aff) + .width(90) + .key('next') + .onClick(() => { + console.info('to next page') + router.push({ + uri:'pages/index' + }) + }) + } + .width('100%') + .height('100%') + } + speedChange(){ + var that = this + this.interval = setInterval(function(){ + that.angle += that.speed + },15) + } + + onPageHide() { + console.info('current page will be hidden, value changed') + this.state = 'onPageHide' + try { + var eventData = { + data: { + "value": this.state, + } + } + var event = { + eventId: 10, + priority: events_emitter.EventPriority.LOW + } + console.info("page start to emit action state") + events_emitter.emit(event, eventData) + } catch(err) { + console.info("page emit action state err: " + JSON.stringify(err.message)) + } + } + + onPageShow(){ + this.speedChange() + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/panel.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/panel.ets index e2f8f320d..4aeb79f58 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/panel.ets +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/panel.ets @@ -13,14 +13,14 @@ * limitations under the License. */ +import events_emitter from '@ohos.events.emitter'; import Log from '../common/Log.ets'; const TAG = 'ets_apiLack_add'; @Entry @Component export default struct PanelBackgroundMask { - @State show1: boolean = false - @State show2: boolean = false + @State mode: PanelMode = PanelMode.Full aboutToAppear() { Log.showInfo(TAG, `aboutToAppear PanelBackgroundMask start`) @@ -31,24 +31,7 @@ export default struct PanelBackgroundMask { } build() { - // Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { Column() { - Text("panel-BackgroundMask") - .width(100) - .height(70) - .fontSize(20) - .opacity(1) - .align(Alignment.TopStart) - .fontColor(0xCCCCCC) - .lineHeight(25) - .border({ width: 1 }) - .padding(10) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .key("backgroundMaskText") - .onClick(() => { - this.show1 = !this.show1 - }) Text("panel-OnHeightChange") .width(100) @@ -64,40 +47,43 @@ export default struct PanelBackgroundMask { .textOverflow({ overflow: TextOverflow.None }) .key("onHeightChangeText") .onClick(() => { - this.show2 = !this.show2 + this.mode = PanelMode.Half }) - Panel(this.show1) { + Panel(true) { Column() { Text("panel-BackgroundMask").fontSize(30) } } + .key("panel") + .mode(this.mode) .backgroundColor('green') .type(PanelType.Foldable) - .mode(PanelMode.Half) .dragBar(false) .halfHeight(300) .onChange((width: number, height: number, mode: PanelMode) => { Log.showInfo(TAG, `width:${width},height:${height},mode:${mode}`) }) .backgroundMask('red') - - Panel(this.show2) { - Column() { - Text("panel-OnHeightChange").fontSize(30) - } - } - .backgroundColor('red') - .type(PanelType.Foldable) - .mode(PanelMode.Half) - .dragBar(false) - .halfHeight(300) - .onChange((width: number, height: number, mode: PanelMode) => { - console.log(`width:${width},height:${height},mode:${mode}`) - }) .onHeightChange((value: number) => { Log.showInfo(TAG, 'onHeightChange: ' + value) - }) + try { + var backData = { + data: { + "result":"success" + } + } + let backEvent = { + eventId: 10111, + priority: events_emitter.EventPriority.LOW + } + console.info("onHeightChange start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("testpanelOnHeightChange0002 emit action state err: " + JSON.stringify(err.message)) + } + }) + }.width("100%").height("100%") } } diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/sideBar.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/sideBar.ets index 6af90e0db..10fb672b2 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/sideBar.ets +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/MainAbility/pages/sideBar.ets @@ -65,6 +65,7 @@ struct SideBarShowSideBar { .showSideBar(true) .autoHide(false) .sideBarWidth(240) + .sideBarPosition(SideBarPosition.End) .minSideBarWidth(210) .maxSideBarWidth(260) .onChange((value: boolean) => { diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/FocusControlJsunit.test.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/FocusControlJsunit.test.ets new file mode 100644 index 000000000..1a2d6bd3d --- /dev/null +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/FocusControlJsunit.test.ets @@ -0,0 +1,187 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import router from '@system.router'; +import events_emitter from '@ohos.events.emitter' +import Utils from './Utils'; + +export default function focusControlJsunit() { + describe('focusControlTest', function () { + beforeEach(async function (done) { + console.info("focusControlTest beforeEach start"); + let options = { + uri: 'pages/focusControl', + } + let result; + try { + router.clear(); + let pages = router.getState(); + console.info("get focus state pages: " + JSON.stringify(pages)); + if (!("focusControl" == pages.name)) { + console.info("get focus state pages.name: " + JSON.stringify(pages.name)); + result = await router.push(options); + await Utils.sleep(2000); + console.info("push focus page result: " + JSON.stringify(result)); + } + } catch (err) { + console.error("push focus page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("focus after each called"); + }) + + it('testFocusOnTouch01', 0, async function (done) { + console.info('[testFocusOnTouch01] START'); + await Utils.sleep(1000); + var callback = (eventData) => { + if (eventData != null) { + console.info("[testFocusOnTouch01] get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.value).assertEqual('FocusOnTouchGrpBtn') + done() + } + } + var innerEvent = { + eventId: 60232, + priority: events_emitter.EventPriority.LOW + } + try { + console.info("testFocusOnTouch01 click result is: " + JSON.stringify(sendEventByKey('OnTouchGrpBtn', 10, ""))); + events_emitter.on(innerEvent, callback) + } catch (err) { + console.info("[testFocusOnTouch01] on events_emitter err : " + JSON.stringify(err)); + } + console.info('[testFocusOnTouch01] testSendTouchEvent END'); + }); + + it('testFocusOnTouch02', 0, async function (done) { + console.info('[testFocusOnTouch02] START'); + await Utils.sleep(1000); + var callback = (eventData) => { + if (eventData != null) { + console.info("[testFocusOnTouch02] get event state result is: " + JSON.stringify(eventData)) + expect(eventData.data.value).assertEqual('FocusOnTouchBtn1') + done() + } + } + var innerEvent = { + eventId: 60233, + priority: events_emitter.EventPriority.LOW + } + try { + console.info("testFocusOnTouch02 click result is: " + JSON.stringify(sendEventByKey('OnTouchBtn1', 10, ""))); + events_emitter.on(innerEvent, callback) + } catch (err) { + console.info("[testFocusOnTouch02] on events_emitter err : " + JSON.stringify(err)); + } + console.info('[testFocusOnTouch02] testSendTouchEvent END'); + }); + + it('testFocusOnTouch03', 0, async function (done) { + console.info('[testFocusOnTouch03] START'); + await Utils.sleep(1000); + var callback = (eventData) => { + if (eventData != null) { + console.info("[testFocusOnTouch03] get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.value).assertEqual('FocusOnTouchBtn2') + done() + } + } + var innerEvent = { + eventId: 60234, + priority: events_emitter.EventPriority.LOW + } + try { + console.info("testFocusOnTouch03 click result is: " + JSON.stringify(sendEventByKey('OnTouchBtn2', 10, ""))); + events_emitter.on(innerEvent, callback) + } catch (err) { + console.info("[testFocusOnTouch03] on events_emitter err : " + JSON.stringify(err)); + } + console.info('[testFocusOnTouch03] testSendTouchEvent END'); + }); + + it('testFocusOnTouch04', 0, async function (done) { + console.info('[testFocusOnTouch04] START'); + await Utils.sleep(1000); + var callback = (eventData) => { + if (eventData != null) { + console.info("[testFocusOnTouch04] get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.value).assertEqual('OnTouchBtn3') + done() + } + } + var innerEvent = { + eventId: 60235, + priority: events_emitter.EventPriority.LOW + } + try { + console.info("testFocusOnTouch04 click result is: " + JSON.stringify(sendEventByKey('OnTouchBtn3', 10, ""))); + events_emitter.on(innerEvent, callback) + } catch (err) { + console.info("[testFocusOnTouch04] on events_emitter err : " + JSON.stringify(err)); + } + console.info('[testFocusOnTouch04] testSendTouchEvent END'); + }); + + it('testFocusOnTouch05', 0, async function (done) { + console.info('[testFocusOnTouch05] START'); + await Utils.sleep(1000); + var callback = (eventData) => { + if (eventData != null) { + console.info("[testFocusOnTouch05] get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.value).assertEqual('OnTouchBtn4') + done() + } + } + var innerEvent = { + eventId: 60236, + priority: events_emitter.EventPriority.LOW + } + try { + console.info("testFocusOnTouch05 click result is: " + JSON.stringify(sendEventByKey('OnTouchBtn4', 10, ""))); + events_emitter.on(innerEvent, callback) + } catch (err) { + console.info("[testFocusOnTouch05] on events_emitter err : " + JSON.stringify(err)); + } + console.info('[testFocusOnTouch05] testSendTouchEvent END'); + }); + + it('testDefaultFocus06', 0, async function (done) { + console.info('[testDefaultFocus06] START'); + await Utils.sleep(1000); + var callback = (eventData) => { + if (eventData != null) { + console.info("[testDefaultFocus06] get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.value).assertEqual('defaultFocus') + done() + } + } + var innerEvent = { + eventId: 60237, + priority: events_emitter.EventPriority.LOW + } + try { + events_emitter.on(innerEvent, callback) + } catch (err) { + console.info("[testDefaultFocus06] on events_emitter err : " + JSON.stringify(err)); + } + console.info('[testDefaultFocus06] END'); + }); + }) +} \ No newline at end of file diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/List.test.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/List.test.ets index 98f0ec7b1..ead1df032 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/List.test.ets +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/List.test.ets @@ -21,8 +21,10 @@ import commonBackgroundBlurStyleJsunit from './common.test.ets'; import common_ts_ets_apiStaticClearJsunit from './common_ts_ets_api.test.ets'; import ellipseNeJsunit from './ellipse.test.ets'; import featureAbilityStartAbilityJsunit from './featureAbility.test.ets'; +import focusControlJsunit from './FocusControlJsunit.test.ets' import gaugeColorsJsunit from './gauge.test.ets'; import gestureSetDirectionJsunit from './gesture.test.ets'; +import globalJsunit from './global.test.ets'; import gridMaxCountJsunit from './grid.test.ets'; import gridItemOnSelectJsunit from './gridItem.test.ets'; import grid_colSpanJsunit from './grid_col.test.ets'; @@ -34,6 +36,7 @@ import listNewJsunit from './listTest.test.ets'; import list_itemOnSelectJsunit from './list_item.test.ets'; import mediaQueryOffJsunit from './mediaQuery.test.ets'; import navigatorTargetJsunit from './navigator.test.ets' +import pageRouteTest from './pageRoute.test.ets' import panelBackgroundMaskJsunit from './panel.test.ets'; import pathNewTest from './path.test.ets'; import polygonNewJsunit from './polygon.test.ets'; @@ -69,6 +72,7 @@ export default function testsuite() { featureAbilityStartAbilityJsunit() gaugeColorsJsunit() gestureSetDirectionJsunit() + globalJsunit() gridMaxCountJsunit() gridItemOnSelectJsunit() inspectorJsunit() @@ -77,6 +81,7 @@ export default function testsuite() { list_itemOnSelectJsunit() mediaQueryOffJsunit() navigatorTargetJsunit() + pageRouteTest() panelBackgroundMaskJsunit() pathNewTest() polygonNewJsunit() diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/global.test.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/global.test.ets new file mode 100644 index 000000000..5e2cbde4c --- /dev/null +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/global.test.ets @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import events_emitter from '@ohos.events.emitter'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function globalJsunit() { + describe('globalJsunit', function () { + beforeEach(async function (done) { + console.info("global beforeEach start"); + let options = { + uri: 'pages/global', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get global state pages:" + JSON.stringify(pages)); + if (!("global" == pages.name)) { + console.info("get global state pages.name:" + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push global page result:" + JSON.stringify(result)); + } + } catch (err) { + console.error("push global page error:" + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testglobal_getInspectorTree0001 + * @tc.desic aceGlobal_getInspectorTree0001 + */ + it('testglobal_getInspectorTree0001', 0, async function (done) { + console.info('testglobal_getInspectorTree0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorTree(); + console.info("[testglobal_getInspectorTree0001] strJson:" + strJson); + expect(strJson !== null).assertTrue(); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testglobal_sendKeyEvent0002 + * @tc.desic aceGlobal_sendKeyEvent0002 + */ + it('testglobal_sendKeyEvent0002', 0, async function (done) { + console.info('testglobal_sendKeyEvent0002 START'); + await Utils.sleep(2000); + let KeyEvent = {type:1,keyCode:2027,keyText:"Unknown",keySource:4,deviceId:7,metaKey:0,timestamp:5284417765376}; + let result = sendKeyEvent(KeyEvent); + console.info("[testglobal_sendKeyEvent0002] result:" + result); + expect(JSON.stringify(result)).assertEqual("true"); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0003 + * @tc.name testglobal_sendMouseEvent0003 + * @tc.desic aceGlobal_sendMouseEvent0003 + */ + it('testglobal_sendMouseEvent0003', 0, async function (done) { + console.info('testglobal_sendMouseEvent0003 START'); + await Utils.sleep(2000); + let mouseEvent = {button:0,action:3,screenX:202.66666666666666,screenY:102.66666666666667,x:34,y:34,timestamp:8261302454000,source:1, + target:{area:{position:{x:158.66666666666666,y:58.666666666666664},globalPosition:{x:168.66666666666666,y:68.66666666666666},width:142.66666666666666,height:58.666666666666664}}}; + let result = sendMouseEvent(mouseEvent); + console.info("[testglobal_sendMouseEvent0003] result:" + result); + expect(JSON.stringify(result)).assertEqual("true"); + done(); + }); + }) +} \ No newline at end of file diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/list_item.test.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/list_item.test.ets index eccce3c91..f10dc1c67 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/list_item.test.ets +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/list_item.test.ets @@ -96,5 +96,18 @@ export default function list_itemOnSelectJsunit() { console.info("[testlist_itemOnSelect0003] sticky value :" + obj.$attrs.sticky); done(); }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0004 + * @tc.name testlist_itemSwipeAction0004 + * @tc.desic acelist_itemSwipeActionEtsTest0004 + */ + it('testlist_itemSwipeAction0004', 0, async function (done) { + console.info('selectOnSelect testlist_itemSwipeAction0004 START'); + await Utils.sleep(2000); + let obj = JSON.stringify(sendEventByKey('Del', 10, "")) + expect(obj).assertEqual('false'); + done(); + }); }) } diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/pageRoute.test.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/pageRoute.test.ets new file mode 100644 index 000000000..e7507444a --- /dev/null +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/pageRoute.test.ets @@ -0,0 +1,71 @@ +// @ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium' +import router from '@system.router'; +import events_emitter from '@ohos.events.emitter' +import Utils from './Utils' + +export default function pageRouteTest() { + describe('pageRouteTest', function () { + beforeEach(async function (done) { + console.info("pageRouteTest beforeEach start"); + let options = { + uri: 'pages/pageRoute', + } + let result; + try { + router.clear(); + let pages = router.getState(); + console.info("get pageRouteTest pages: " + JSON.stringify(pages)); + if (!("pageRoute" == pages.name)) { + console.info("get pageRouteTest pages.name: " + JSON.stringify(pages.name)); + result = await router.push(options); + await Utils.sleep(2000); + console.info("pageRouteTest page result: " + JSON.stringify(result)); + } + } catch (err) { + console.error("pageRouteTest page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("pageRouteTest after each called"); + }) + + it('testOnPageHide01', 0, function () { + console.info('[testOnPageHide01] START'); + var callback = (eventData) => { + console.info("[testOnPageHide01] get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.value).assertEqual('onPageHide') + done() + } + var innerEvent = { + eventId: 10, + priority: events_emitter.EventPriority.LOW + } + try { + events_emitter.on(innerEvent, callback) + console.info("testOnPageHide01 click result is: " + JSON.stringify(sendEventByKey('next', 10, ""))); + } catch (err) { + console.info("[testOnPageHide01] on events_emitter err : " + JSON.stringify(err)); + } + console.info('[testOnPageHide01] testSendTouchEvent END'); + }); + }) +} \ No newline at end of file diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/panel.test.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/panel.test.ets index 847dfd018..07d434e17 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/panel.test.ets +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/panel.test.ets @@ -14,6 +14,7 @@ */ import router from '@system.router'; +import events_emitter from '@ohos.events.emitter'; import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" import Utils from './Utils.ets' @@ -53,149 +54,44 @@ export default function panelBackgroundMaskJsunit() { it('testpanelBackgroundMask0001', 0, async function (done) { console.info('panelBackgroundMask testpanelBackgroundMask0001 START'); await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0001] component width strJson:" + strJson); + let strJson = getInspectorByKey('panel'); let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.width).assertEqual("100.00vp"); - console.info("[testpanelBackgroundMask0001] width value :" + obj.$attrs.width); + console.info("get inspector value is: " + JSON.stringify(obj)); + console.log(JSON.stringify(obj.$type)) + expect(obj.$type).assertEqual('Panel') + console.log('Panel‘s backgroundMask is ' + JSON.stringify(obj.$attrs.backgroundMask)) + expect(obj.$attrs.backgroundMask).assertEqual('#FFFF0000'); done(); }); /* * @tc.number SUB_ACE_BASIC_ETS_API_0002 - * @tc.name testpanelBackgroundMask0002 + * @tc.name testpanelOnHeightChange0002 * @tc.desic acepanelBackgroundMaskEtsTest0002 */ - it('testpanelBackgroundMask0002', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask0002 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0002] component height strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.height).assertEqual("70.00vp"); - console.info("[testpanelBackgroundMask0002] height value :" + obj.$attrs.height); - done(); - }); - - /* - * @tc.number SUB_ACE_BASIC_ETS_API_0003 - * @tc.name testpanelBackgroundMask0003 - * @tc.desic acepanelBackgroundMaskEtsTest0003 - */ - it('testpanelBackgroundMask0003', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask0003 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0003] component fontSize strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.fontSize).assertEqual("20.00fp"); - console.info("[testpanelBackgroundMask0003] fontSize value :" + obj.$attrs.fontSize); - done(); - }); - - /* - * @tc.number SUB_ACE_BASIC_ETS_API_0004 - * @tc.name testpanelBackgroundMask0004 - * @tc.desic acepanelBackgroundMaskEtsTest0004 - */ - it('testpanelBackgroundMask0004', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask0004 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0004] component opacity strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.opacity).assertEqual(1); - console.info("[testpanelBackgroundMask0004] opacity value :" + obj.$attrs.opacity); - done(); - }); - - /* - * @tc.number SUB_ACE_BASIC_ETS_API_0005 - * @tc.name testpanelBackgroundMask0005 - * @tc.desic acepanelBackgroundMaskEtsTest0005 - */ - it('testpanelBackgroundMask0005', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask0005 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0005] component align strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.align).assertEqual("Alignment.TopStart"); - console.info("[testpanelBackgroundMask0005] align value :" + obj.$attrs.align); - done(); - }); - - /* - * @tc.number SUB_ACE_BASIC_ETS_API_0006 - * @tc.name testpanelBackgroundMask0006 - * @tc.desic acepanelBackgroundMaskEtsTest0006 - */ - it('testpanelBackgroundMask0006', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask0006 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0006] component fontColor strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.fontColor).assertEqual("#FFCCCCCC"); - console.info("[testpanelBackgroundMask0006] fontColor value :" + obj.$attrs.fontColor); - done(); - }); - - /* - * @tc.number SUB_ACE_BASIC_ETS_API_0007 - * @tc.name testpanelBackgroundMask0007 - * @tc.desic acepanelBackgroundMaskEtsTest0007 - */ - it('testpanelBackgroundMask0007', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask0007 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0007] component lineHeight strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.lineHeight).assertEqual("25.00fp"); - console.info("[testpanelBackgroundMask0007] lineHeight value :" + obj.$attrs.lineHeight); - done(); - }); - - /* - * @tc.number SUB_ACE_BASIC_ETS_API_0009 - * @tc.name testpanelBackgroundMask0009 - * @tc.desic acepanelBackgroundMaskEtsTest0009 - */ - it('testpanelBackgroundMask0009', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask009 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0009] component padding strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.padding).assertEqual("10.00vp"); - console.info("[testpanelBackgroundMask0009] padding value :" + obj.$attrs.padding); - done(); + it('testpanelOnHeightChange0002', 0, async function (done) { + console.info('panelBackgroundMask testpanelOnHeightChange0002 START'); + var panelOnHeightChangeEvent = { + eventId: 10111, + priority: events_emitter.EventPriority.LOW + } + var callback1 = (backData) => { + console.info("testpanelOnHeightChange0002 backData.data.result is: " + backData.data.result); + try{ + console.info("testpanelOnHeightChange0002 callback1 success" ); + expect(backData.data.result).assertEqual("success"); + done(); + }catch(err){ + console.info("testpanelOnHeightChange0002 on events_emitter err : " + JSON.stringify(err)); + } + } + try { + console.info("testpanelOnHeightChange0002 click result is: " + JSON.stringify(sendEventByKey('onHeightChangeText', 10, ""))); + events_emitter.on(panelOnHeightChangeEvent, callback1); + } catch (err) { + console.info("testpanelOnHeightChange0002 on events_emitter err : " + JSON.stringify(err)); + } }); - /* - * @tc.number SUB_ACE_BASIC_ETS_API_0010 - * @tc.name testpanelBackgroundMask0010 - * @tc.desic acepanelBackgroundMaskEtsTest0010 - */ - it('testpanelBackgroundMask0010', 0, async function (done) { - console.info('panelBackgroundMask testpanelBackgroundMask0010 START'); - await Utils.sleep(2000); - let strJson = getInspectorByKey('backgroundMaskText'); - console.info("[testpanelBackgroundMask0010] component textAlign strJson:" + strJson); - let obj = JSON.parse(strJson); - expect(obj.$type).assertEqual('Text'); - expect(obj.$attrs.textAlign).assertEqual("TextAlign.Left"); - console.info("[testpanelBackgroundMask0010] textAlign value :" + obj.$attrs.textAlign); - done(); - }); }) } diff --git a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/sideBar.test.ets b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/sideBar.test.ets index b25780f63..991bec94f 100644 --- a/arkui/ace_ets_component_apilack/entry/src/main/ets/test/sideBar.test.ets +++ b/arkui/ace_ets_component_apilack/entry/src/main/ets/test/sideBar.test.ets @@ -79,5 +79,21 @@ export default function sideBarShowSideBarJsunit() { done(); }); + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0003 + * @tc.name testsideBarShowSideBar0003 + * @tc.desic acesideBarShowSideBarEtsTest0003 + */ + it('testsideBarShowSideBar0003', 0, async function (done) { + console.info('sideBarShowSideBar testsideBarShowSideBar0003 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('SideBarContainer'); + console.info("[testsideBarShowSideBar0003] component autoHide strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('SideBarContainer'); + expect(obj.$attrs.sideBarPosition).assertEqual(undefined); + console.info("[testsideBarShowSideBar0003] autoHide value :" + obj.$attrs.autoHide); + done(); + }); }) } diff --git a/arkui/ace_ets_component_attrlack/BUILD.gn b/arkui/ace_ets_component_attrlack/BUILD.gn new file mode 100644 index 000000000..afada8b8f --- /dev/null +++ b/arkui/ace_ets_component_attrlack/BUILD.gn @@ -0,0 +1,36 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//test/xts/tools/build/suite.gni") + +ohos_js_hap_suite("ActsAceEtsAttrLackTest") { + hap_profile = "./entry/src/main/config.json" + deps = [ + ":ace_ets_dev_assets", + ":ace_ets_dev_resources", + ":ace_ets_dev_test_assets", + ] + ets2abc = true + certificate_profile = "./signature/openharmony_sx.p7b" + hap_name = "ActsAceEtsAttrLackTest" +} +ohos_js_assets("ace_ets_dev_assets") { + source_dir = "./entry/src/main/ets/MainAbility" +} +ohos_js_assets("ace_ets_dev_test_assets") { + source_dir = "./entry/src/main/ets/TestAbility" +} +ohos_resources("ace_ets_dev_resources") { + sources = [ "./entry/src/main/resources" ] + hap_profile = "./entry/src/main/config.json" +} diff --git a/arkui/ace_ets_component_attrlack/Test.json b/arkui/ace_ets_component_attrlack/Test.json new file mode 100644 index 000000000..7a568e735 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/Test.json @@ -0,0 +1,19 @@ +{ + "description": "Configuration for aceEtsAttrLack Tests", + "driver": { + "type": "OHJSUnitTest", + "test-timeout": "600000", + "bundle-name": "com.open.harmony.aceEtsAttrLack", + "package-name": "com.open.harmony.aceEtsAttrLack", + "shell-timeout": "600000" + }, + "kits": [ + { + "test-file-name": [ + "ActsAceEtsAttrLackTest.hap" + ], + "type": "AppInstallKit", + "cleanup-apps": true + } + ] +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/config.json b/arkui/ace_ets_component_attrlack/entry/src/main/config.json new file mode 100644 index 000000000..c1fa0bbe3 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/config.json @@ -0,0 +1,137 @@ +{ + "app": { + "bundleName": "com.open.harmony.aceEtsAttrLack", + "vendor": "open", + "version": { + "code": 1000000, + "name": "1.0.0" + }, + "apiVersion": { + "compatible": 7, + "releaseType": "Release", + "target": 8 + } + }, + "deviceConfig": {}, + "module": { + "package": "com.open.harmony.aceEtsAttrLack", + "name": ".MyApplication", + "mainAbility": "com.open.harmony.aceEtsAttrLack.MainAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "visible": true, + "srcPath": "MainAbility", + "name": ".MainAbility", + "srcLanguage": "ets", + "icon": "$media:icon", + "description": "$string:description_mainability", + "formsEnabled": false, + "label": "$string:entry_MainAbility", + "type": "page", + "launchType": "standard" + }, + { + "orientation": "unspecified", + "visible": true, + "srcPath": "TestAbility", + "name": ".TestAbility", + "srcLanguage": "ets", + "icon": "$media:icon", + "description": "$string:TestAbility_desc", + "formsEnabled": false, + "label": "$string:TestAbility_label", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index", + "pages/page1", + "pages/page2", + "pages/alertDialog", + "pages/animate_play_mode", + "pages/animator", + "pages/app", + "pages/attr_animate", + "pages/canvas", + "pages/checkBox", + "pages/checkBoxGroup", + "pages/common", + "pages/curves", + "pages/datePicker", + "pages/edgeEffect", + "pages/enums", + "pages/featureAbility", + "pages/fill_mode", + "pages/gesture", + "pages/gridCol", + "pages/gridRow", + "pages/listtest", + "pages/loadingProgress", + "pages/pluginComponent", + "pages/progress", + "pages/radio", + "pages/refresh", + "pages/router", + "pages/scroll_edge", + "pages/sidebar", + "pages/slider", + "pages/stateManagement", + "pages/stepperItem", + "pages/swiper", + "pages/text_input", + "pages/units", + "pages/web", + "pages/copyOption", + "pages/responseType", + "pages/hoverEffect" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + }, + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": ".TestAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/app.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 000000000..07722b56d --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry' +import { Hypium } from 'hypium/index' +import testsuite from '../test/List.test' + +export default { + onCreate() { + console.info('Application onCreate') + var abilityDelegator: any + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + var abilityDelegatorArguments: any + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + console.info('start run testcase!!!') + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) + }, + onDestroy() { + console.info('Application onDestroy') + }, +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Log.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Log.ets new file mode 100644 index 000000000..6dbc97e12 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Log.ets @@ -0,0 +1,38 @@ + +const TAG = 'ets_apiLack_add'; + +/** + * Basic log class + */ +export default class Log { + + /** + * print info level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showInfo(tag, log) { + console.info(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print debug level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showDebug(tag, log) { + console.debug(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print error level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showError(tag, log) { + console.error(`${TAG} tag: ${tag} --> ${log}`); + } +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Utils.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Utils.ets new file mode 100644 index 000000000..9ca8c904c --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/Utils.ets @@ -0,0 +1,118 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default class Utils { + static rect_left; + static rect_top; + static rect_right; + static rect_bottom; + static rect_value; + + static sleep(time) { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, time) + }).then(() => { + console.info(`sleep ${time} over...`) + }) + } + + static getComponentRect(key) { + let strJson = getInspectorByKey(key); + let obj = JSON.parse(strJson); + console.info("[getInspectorByKey] current component obj is: " + JSON.stringify(obj)); + let rectInfo = JSON.parse('[' + obj.$rect + ']') + console.info("[getInspectorByKey] rectInfo is: " + rectInfo); + this.rect_left = JSON.parse('[' + rectInfo[0] + ']')[0] + this.rect_top = JSON.parse('[' + rectInfo[0] + ']')[1] + this.rect_right = JSON.parse('[' + rectInfo[1] + ']')[0] + this.rect_bottom = JSON.parse('[' + rectInfo[1] + ']')[1] + return this.rect_value = { + "left": this.rect_left, "top": this.rect_top, "right": this.rect_right, "bottom": this.rect_bottom + } + } + + static async swipe(downX, downY, upX, upY, steps) { + console.info('start to swipe') + this.drags(downX, downY, upX, upY, steps, false) + } + + static async drag(downX, downY, upX, upY, steps) { + console.info('start to drag') + this.drags(downX, downY, upX, upY, steps, true) + } + + static async drags(downX, downY, upX, upY, steps, drag) { + var xStep; + var yStep; + var swipeSteps; + var ret; + xStep = 0; + yStep = 0; + ret = false; + swipeSteps = steps; + if (swipeSteps == 0) { + swipeSteps = 1; + } + xStep = (upX - downX) / swipeSteps; + yStep = (upY - downY) / swipeSteps; + console.info('move step is: ' + 'xStep: ' + xStep + ' yStep: ' + yStep) + var downPoint: TouchObject = { + id: 1, + x: downX, + y: downY, + type: TouchType.Down, + } + console.info('down touch started: ' + JSON.stringify(downPonit)) + sendTouchEvent(downPoint); + console.info('start to move') + if (drag) { + await this.sleep(500) + } + for (var i = 1;i <= swipeSteps; i++) { + var movePoint: TouchObject = { + id: 1, + x: downX + (xStep * i), + y: downY + (yStep * i), + type: TouchType.Move + } + console.info('move touch started: ' + JSON.stringify(movePoint)) + ret = sendTouchEvent(movePoint) + if (ret == false) { + break; + } + await this.sleep(5) + } + console.info('start to up') + if (drag) { + await this.sleep(100) + } + var upPoint: TouchObject = { + id: 1, + x: upX, + y: upY, + type: TouchType.Up, + } + console.info('up touch started: ' + JSON.stringify(upPoint)) + sendTouchEvent(upPoint) + await this.sleep(500) + } +} + + + + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/bg1.png b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/bg1.png new file mode 100644 index 0000000000000000000000000000000000000000..f97eae0b4cd0f7b3b2ef8c4db1af68ce861181e9 GIT binary patch literal 186448 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

{2jMUu&*F!VAcKNvh)&*|pJ8*Ss?)|4+Q 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 literal 0 HcmV?d00001 diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/plugin_component.js b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/plugin_component.js new file mode 100644 index 000000000..6a3b4ed6c --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/common/plugin_component.js @@ -0,0 +1,98 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import pluginComponentManager from '@ohos.pluginComponent' + +function onPushListener(source, template, data, extraData) { + console.log("onPushListener template.source=" + template.source) + var jsonObject = JSON.parse(data.componentTemplate.source) + console.log("request_callback1:source json object" + jsonObject) + var jsonArry = jsonObject.ExternalComponent + for (var i in jsonArry) { + console.log(jsonArry[i]) + } + console.log("onPushListener:source json object" + jsonObject) + console.log("onPushListener:source json string" + JSON.stringify(jsonObject)) + console.log("onPushListener template.ability=" + template.ability) + console.log("onPushListener data=" + JSON.stringify(data)) + console.log("onPushListener extraData=" + JSON.stringify(extraData)) +} + +function onRequestListener(source, name, data) +{ + console.log("onRequestListener name=" + name); + console.log("onRequestListener data=" + JSON.stringify(data)); + return {template:"plugintemplate", data:data}; +} + +export default { + //register listener + onListener() { + pluginComponentManager.on("push", onPushListener) + pluginComponentManager.on("request", onRequestListener) + }, + Push() { + // 组件提供方主动发送事件 + pluginComponentManager.push( + { + want: { + bundleName: "com.example.myapplication", + abilityName: "com.example.myapplication.MainAbility", + }, + name: "plugintemplate", + data: { + "key_1": "plugin component test", + "key_2": 34234 + }, + extraData: { + "extra_str": "this is push event" + }, + jsonPath: "", + }, + (err, data) => { + console.log("push_callback: push ok!"); + } + ) + }, + Request() { + // 组件使用方主动发送事件 + pluginComponentManager.request({ + want: { + bundleName: "com.example.myapplication", + abilityName: "com.example.myapplication.MainAbility", + }, + name: "plugintemplate", + data: { + "key_1": "plugin component test", + "key_2": 34234 + }, + jsonPath: "", + }, + (err, data) => { + console.log("request_callback: componentTemplate.ability=" + data.componentTemplate.ability) + console.log("request_callback: componentTemplate.source=" + data.componentTemplate.source) + var jsonObject = JSON.parse(data.componentTemplate.source) + console.log("request_callback:source json object" + jsonObject) + var jsonArry = jsonObject.ExternalComponent + for (var i in jsonArry) { + console.log(jsonArry[i]) + } + console.log("request_callback:source json string" + JSON.stringify(jsonObject)) + console.log("request_callback: data=" + JSON.stringify(data.data)) + console.log("request_callback: extraData=" + JSON.stringify(data.extraData)) + } + ) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/PluginProviderExample.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/PluginProviderExample.ets new file mode 100644 index 000000000..6a97a6fb4 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/PluginProviderExample.ets @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import plugin from "plugin_component.js" + +@Entry +@Component +struct PluginProviderExample { + @State message: string = 'no click!' + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Button('Register Push Listener') + .fontSize(30) + .width(400) + .height(100) + .margin({top:20}) + .onClick(()=>{ + plugin.onListener() + console.log("Button('Register Push Listener')") + }) + Button('Push') + .fontSize(30) + .width(400) + .height(100) + .margin({top:20}) + .onClick(()=>{ + plugin.Push() + this.message = "Button('Push')" + console.log("Button('Push')") + }) + Text(this.message) + .height(150) + .fontSize(30) + .padding(5) + .margin(5) + }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 }) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/alertDialog.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/alertDialog.ets new file mode 100644 index 000000000..56667c896 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/alertDialog.ets @@ -0,0 +1,146 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +import events_emitter from '@ohos.events.emitter'; +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct AlertDialogCenterStart { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear AlertDialogCenterStart start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear AlertDialogCenterStart end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("alertDialog-CenterStart") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("CenterStartText") + + Text("alertDialog-CenterEnd") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("CenterEndText") + + Button('one button dialog') + .key("CenterStartButton") + .onClick(() => { + AlertDialog.show( + { + title: 'title', + message: 'text', + confirm: { + value: 'button', + action: () => { + console.info('Button-clicking callback') + } + }, + cancel: () => { + console.info('Closed callbacks') + }, + alignment:DialogAlignment.CenterStart + } + ) + try { + var backData = { + data: { + "Result": true + } + } + let backEvent = { + eventId: 81601, + priority: events_emitter.EventPriority.LOW + } + console.info("CenterStart start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("CenterStart emit action state err: " + JSON.stringify(err.message)) + } + }) + .backgroundColor(0x317aff) + + Button('two button dialog') + .key("CenterEndButton") + .onClick(() => { + AlertDialog.show( + { + title: 'title', + message: 'text', + primaryButton: { + value: 'cancel', + action: () => { + console.info('Callback when the first button is clicked') + } + }, + secondaryButton: { + value: 'ok', + action: () => { + console.info('Callback when the second button is clicked') + } + }, + cancel: () => { + console.info('Closed callbacks') + }, + alignment:DialogAlignment.CenterEnd + } + ) + try { + var backData = { + data: { + "Result": true + } + } + let backEvent = { + eventId: 81602, + priority: events_emitter.EventPriority.LOW + } + console.info("CenterEnd start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("CenterEnd emit action state err: " + JSON.stringify(err.message)) + } + }).backgroundColor(0x317aff) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animate_play_mode.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animate_play_mode.ets new file mode 100644 index 000000000..fb499e084 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animate_play_mode.ets @@ -0,0 +1,125 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct AttrAnimationExample { + @State widthSize: number = 200 + @State heightSize: number = 100 + @State flag: boolean = true + + @State widthSizeAlternate: number = 200 + @State heightSizeAlternate: number = 100 + @State flagAlternate: boolean = true + @State widthSizeNormal: number = 200 + @State heightSizeNormal: number = 100 + @State flagNormal: boolean = true + + @State widthSizeAlternateReverse: number = 200 + @State heightSizeAlternateReverse: number = 100 + @State flagAlternateReverse: boolean = true + + build() { + Column() { + Button('PlayMode.Reverse') + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 200 + this.heightSize = 100 + } + this.flag = !this.flag + }) + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .key("Reverse") + .animation({ + duration: 3000, // 动画时长 + curve: Curve.EaseOut, // 动画曲线 + delay: 1000, // 动画延迟 + iterations: 1, // 播放次数 + playMode: PlayMode.Reverse // 动画模式 + }) // 对Button组件的宽高属性进行动画配置 + + Button('PlayMode.Alternate') + .onClick((event: ClickEvent) => { + if (this.flagAlternate) { + this.widthSizeAlternate = 100 + this.heightSizeAlternate = 50 + } else { + this.widthSizeAlternate = 200 + this.heightSizeAlternate = 100 + } + this.flagAlternate = !this.flagAlternate + }) + .width(this.widthSizeAlternate).height(this.heightSizeAlternate).backgroundColor(0x317aff) + .key("Alternate") + .animation({ + duration: 3000, + curve: Curve.EaseOut, + delay: 1000, + iterations: 1, + playMode: PlayMode.Alternate + }) + + Button('PlayMode.Normal') + .onClick((event: ClickEvent) => { + if (this.flagNormal) { + this.widthSizeNormal = 100 + this.heightSizeNormal = 50 + } else { + this.widthSizeNormal = 200 + this.heightSizeNormal = 100 + } + this.flagNormal = !this.flagNormal + }) + .width(this.widthSizeNormal).height(this.heightSizeNormal).backgroundColor(0x317aff) + .key("Normal") + .animation({ + duration: 3000, + curve: Curve.EaseOut, + delay: 1000, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('PlayMode.AlternateReverse') + .onClick((event: ClickEvent) => { + if (this.flagAlternateReverse) { + this.widthSizeAlternateReverse = 100 + this.heightSizeAlternateReverse = 50 + } else { + this.widthSizeAlternateReverse = 200 + this.heightSizeAlternateReverse = 100 + } + this.flagAlternateReverse = !this.flagAlternateReverse + }) + .width(this.widthSizeAlternateReverse).height(this.heightSizeAlternateReverse).backgroundColor(0x317aff) + .key("AlternateReverse") + .animation({ + duration: 3000, + curve: Curve.EaseOut, + delay: 1000, + iterations: 1, + playMode: PlayMode.AlternateReverse + }) + }.width('100%').margin({ top: 5 }) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animator.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animator.ets new file mode 100644 index 000000000..7bb0c726a --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/animator.ets @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct AnimatorOnframe { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear AnimatorOnframe start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear AnimatorOnframe end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("animator-Onframe") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("onframeText") + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/app.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/app.ets new file mode 100644 index 000000000..48ea77693 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/app.ets @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import app from '@system.app'; +import events_emitter from '@ohos.events.emitter'; + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct AppVersionCode { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear AppVersionCode start:`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear AppVersionCode end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("app-VersionCode") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("versionCodeText") + .onClick(()=>{ + app.getInfo().versionCode = 1 + try { + var backData = { + data: { + "Code": app.getInfo().versionCode + } + } + let backEvent = { + eventId: 60302, + priority: events_emitter.EventPriority.LOW + } + console.info("versionCode start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("versionCode emit action state err: " + JSON.stringify(err.message)) + } + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/attr_animate.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/attr_animate.ets new file mode 100644 index 000000000..c1a2014a7 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/attr_animate.ets @@ -0,0 +1,267 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct AttrAnimationExample { + @State widthSize: number = 200 + @State heightSize: number = 80 + @State flag: boolean = true + + @State widthSizeEaseOut: number = 200 + @State heightSizeEaseOut: number = 80 + @State flagEaseOut: boolean = true + + @State widthSizeFastOutSlowIn: number = 200 + @State heightSizeFastOutSlowIn: number = 80 + @State flagFastOutSlowIn: boolean = true + + @State widthSizeLinearOutSlowIn: number = 200 + @State heightSizeLinearOutSlowIn: number = 80 + @State flagLinearOutSlowIn: boolean = true + + @State widthSizeFastOutLinearIn: number = 200 + @State heightSizeFastOutLinearIn: number = 80 + @State flagFastOutLinearIn: boolean = true + + @State widthSizeExtremeDeceleration: number = 200 + @State heightSizeExtremeDeceleration: number = 80 + @State flagExtremeDeceleration: boolean = true + + @State widthSizeSharp: number = 200 + @State heightSizeSharp: number = 80 + @State flagSharp: boolean = true + + @State widthSizeRhythm: number = 200 + @State heightSizeRhythm: number = 80 + @State flagRhythm: boolean = true + + @State widthSizeSmooth: number = 200 + @State heightSizeSmooth: number = 80 + @State flagSmooth: boolean = true + + @State widthSizeFriction: number = 200 + @State heightSizeFriction: number = 80 + @State flagFriction: boolean = true + + build() { + Column() { + Button('EaseInOut') + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 200 + this.heightSize = 80 + } + this.flag = !this.flag + }) + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 2000, // 动画时长 + curve: Curve.EaseInOut, // 动画曲线 + delay: 500, // 动画延迟 + iterations: 1, // 播放次数 + playMode: PlayMode.Normal // 动画模式 + }) + + Button('Curve.EaseOut') + .onClick((event: ClickEvent) => { + if (this.flagEaseOut) { + this.widthSizeEaseOut = 100 + this.heightSizeEaseOut = 50 + } else { + this.widthSizeEaseOut = 200 + this.heightSizeEaseOut = 80 + } + this.flagEaseOut = !this.flagEaseOut + }) + .width(this.widthSizeEaseOut).height(this.heightSizeEaseOut).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.EaseOut, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('FastOutSlowIn') + .onClick((event: ClickEvent) => { + if (this.flagFastOutSlowIn) { + this.widthSizeFastOutSlowIn = 100 + this.heightSizeFastOutSlowIn = 50 + } else { + this.widthSizeFastOutSlowIn = 200 + this.heightSizeFastOutSlowIn = 80 + } + this.flagFastOutSlowIn = !this.flagFastOutSlowIn + }) + .width(this.widthSizeFastOutSlowIn).height(this.heightSizeFastOutSlowIn).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.FastOutSlowIn, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('LinearOutSlowIn') + .onClick((event: ClickEvent) => { + if (this.flagLinearOutSlowIn) { + this.widthSizeLinearOutSlowIn = 100 + this.heightSizeLinearOutSlowIn = 50 + } else { + this.widthSizeLinearOutSlowIn = 200 + this.heightSizeLinearOutSlowIn = 80 + } + this.flagLinearOutSlowIn = !this.flagLinearOutSlowIn + }) + .width(this.widthSizeLinearOutSlowIn).height(this.heightSizeLinearOutSlowIn).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.LinearOutSlowIn, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('FastOutLinearIn') + .onClick((event: ClickEvent) => { + if (this.flagFastOutLinearIn) { + this.widthSizeFastOutLinearIn = 100 + this.heightSizeFastOutLinearIn = 50 + } else { + this.widthSizeFastOutLinearIn = 200 + this.heightSizeFastOutLinearIn = 80 + } + this.flagFastOutLinearIn = !this.flagFastOutLinearIn + }) + .width(this.widthSizeFastOutLinearIn).height(this.heightSizeFastOutLinearIn).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.FastOutLinearIn, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('ExtremeDeceleration') + .onClick((event: ClickEvent) => { + if (this.flagExtremeDeceleration) { + this.widthSizeExtremeDeceleration = 100 + this.heightSizeExtremeDeceleration = 50 + } else { + this.widthSizeExtremeDeceleration = 200 + this.heightSizeExtremeDeceleration = 80 + } + this.flagExtremeDeceleration = !this.flagExtremeDeceleration + }) + .width(this.widthSizeExtremeDeceleration).height(this.heightSizeExtremeDeceleration).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.ExtremeDeceleration, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('Sharp') + .onClick((event: ClickEvent) => { + if (this.flagSharp) { + this.widthSizeSharp = 100 + this.heightSizeSharp = 50 + } else { + this.widthSizeSharp = 200 + this.heightSizeSharp = 80 + } + this.flagSharp = !this.flagSharp + }) + .width(this.widthSizeSharp).height(this.heightSizeSharp).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.Sharp, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('Rhythm') + .onClick((event: ClickEvent) => { + if (this.flagRhythm) { + this.widthSizeRhythm = 100 + this.heightSizeRhythm = 50 + } else { + this.widthSizeRhythm = 200 + this.heightSizeRhythm = 80 + } + this.flagRhythm = !this.flagRhythm + }) + .width(this.widthSizeRhythm).height(this.heightSizeRhythm).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.Rhythm, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('Smooth') + .onClick((event: ClickEvent) => { + if (this.flagSmooth) { + this.widthSizeSmooth = 100 + this.heightSizeSmooth = 50 + } else { + this.widthSizeSmooth = 200 + this.heightSizeSmooth = 80 + } + this.flagSmooth = !this.flagSmooth + }) + .width(this.widthSizeSmooth).height(this.heightSizeSmooth).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.Smooth, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('Friction') + .onClick((event: ClickEvent) => { + if (this.flagFriction) { + this.widthSizeFriction = 100 + this.heightSizeFriction = 50 + } else { + this.widthSizeFriction = 200 + this.heightSizeFriction = 80 + } + this.flagFriction = !this.flagFriction + }) + .width(this.widthSizeFriction).height(this.heightSizeFriction).backgroundColor(0x317aff) + .animation({ + duration: 2000, + curve: Curve.Friction, + delay: 500, + iterations: 1, + playMode: PlayMode.Normal + }) + + }.width('100%').margin({ top: 5 }) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/calendar.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/calendar.ets new file mode 100644 index 000000000..7be4f5545 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/calendar.ets @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct calendar { + @State curMonth: MonthData = { year: 0, month: 0, data: [] }; + @State preMonth: MonthData = { year: 0, month: 0, data: [] }; + @State nextMonth: MonthData = { year: 0, month: 0, data: [] } + @State year: number = 0 + @State month: number = 0 + Controller: CalendarController = new CalendarController(); + private lunarMonthDays: string[] = [ + '初一', '初二', '初三', '初四', '初五', '初六', '初七', '初八', '初九', '初十', + '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', + '廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '三十'] + private lunarMonthNames: string[] = ['正月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '冬月', '腊月'] + + build() { + Calendar({ + date: { year: 2021, month: 8, day: 35 }, + currentData: this.curMonth, + preData: this.preMonth, + nextData: this.nextMonth, + controller: this.Controller + }) + .showLunar(true) + .showHoliday(true) + .needSlide(true) + .offDays(Week.Fri | Week.Sat | Week.Mon | Week.Thur) + .startOfWeek(Week.Sun) + .direction(Axis.Horizontal) + .currentDayStyle({ + dayColor: Color.Black, + lunarColor: Color.Gray, + markLunarColor: Color.Black, + dayFontSize: 15, + lunarDayFontSize: 10, + boundaryColOffset: 10, + }) + .nonCurrentDayStyle({ + nonCurrentMonthDayColor: Color.Black, + nonCurrentMonthLunarColor: Color.Gray, + nonCurrentMonthWorkDayMarkColor: Color.Green, + nonCurrentMonthOffDayMarkColor: Color.Brown, + }) + .todayStyle({ + focusedDayColor: Color.Red, + focusedLunarColor: Color.Orange, + focusedAreaBackgroundColor: Color.Blue, + focusedAreaRadius: 20 + }) + .weekStyle({ + weekColor: Color.Black, + weekendDayColor: Color.Orange, + weekendLunarColor: Color.Blue, + weekFontSize: 20, + weekHeight: 5, + weekWidth: 48, + }) + .workStateStyle({ + workDayMarkColor: Color.Red, + offDayMarkColor: Color.Orange, + workDayMarkSize: 10, + offDayMarkSize: 2, + workStateWidth: 12, + workStateHorizontalMovingDistance: 0, + workStateVerticalMovingDistance: 12, + }) + .onSelectChange((request) => { + this.year = request.year; + this.month = request.month; + console.info('On Select change: ' + this.year + '/' + this.month) + }) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/canvas.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/canvas.ets new file mode 100644 index 000000000..2e2e4affc --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/canvas.ets @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct CanvasActualBoundingBoxAscent { + + private settings: RenderingContextSettings = new RenderingContextSettings(true)//antialias:boolean + private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings) + + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear CanvasActualBoundingBoxAscent start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear CanvasActualBoundingBoxAscent end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Canvas(this.context) + .key('Canvas') + .width('100%') + .height('100%') + .backgroundColor('#ffff00') + .position({x:3,y:5}) + .align(Alignment.Center) + .onReady(() =>{ + this.context.font = '50px sans-serif' + this.context.fillText("Hello World!", 20, 100) + this.context.textBaseline = 'top' + this.context.fillText("width:" + this.context.measureText("Hello World!").width, 20, 150) + this.context.fillText("actualBoundingBoxAscent:" + this.context.measureText("Hello World!").actualBoundingBoxAscent, 20, 200) + this.context.fillText("actualBoundingBoxDescent:" + this.context.measureText("Hello World!").actualBoundingBoxDescent, 20, 250) + this.context.fillText("actualBoundingBoxLeft:" + this.context.measureText("Hello World!").actualBoundingBoxLeft, 20, 300) + this.context.fillText("actualBoundingBoxRight:" + this.context.measureText("Hello World!").actualBoundingBoxRight, 20, 350) + this.context.fillText("alphabeticBaseline:" + this.context.measureText("Hello World!").alphabeticBaseline, 20, 400) + this.context.fillText("emHeightAscent:" + this.context.measureText("Hello World!").emHeightAscent, 20, 450) + this.context.fillText("emHeightDescent:" + this.context.measureText("Hello World!").emHeightDescent, 20, 500) + this.context.fillText("fontBoundingBoxAscent:" + this.context.measureText("Hello World!").fontBoundingBoxAscent, 20, 550) + this.context.fillText("fontBoundingBoxDescent:" + this.context.measureText("Hello World!").fontBoundingBoxDescent, 20, 600) + this.context.fillText("hangingBaseline:" + this.context.measureText("Hello World!").hangingBaseline, 20, 650) + this.context.fillText("ideographicBaseline" + this.context.measureText("Hello World!").ideographicBaseline, 20, 700) + //this.context.fillText("antialias" + this.context.measureText("Hello World!").antialias, 20, 700) + }) + } + .width('100%') + .height('100%') + + + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBox.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBox.ets new file mode 100644 index 000000000..a5e30c374 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBox.ets @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct CheckBoxGroup { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear CheckBoxGroup start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear CheckBoxGroup end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("checkBox-Group") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("groupText") + + Row() { + CheckboxGroup({group : 'checkboxGroup'}) + .selectedColor(0xed6f21) + .key('CheckboxGroup') + .onChange((itemName:CheckboxGroupResult) => { + console.info("TextPicker::dialogResult is" + JSON.stringify(itemName)) + }) + Text('select all').fontSize(20) + Checkbox({name: 'checkbox1', group: 'checkboxGroup'}) + .key('Checkbox1') + .select(true) + .selectedColor(0xed6f21) + .onChange((value: boolean) => { + console.info('Checkbox1 change is'+ value) + }) + Checkbox({name: 'checkbox2', group: 'checkboxGroup'}) + .key('Checkbox2') + .select(false) + .selectedColor(0x39a2db) + .onChange((value: boolean) => { + console.info('Checkbox2 change is'+ value) + }) + } + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBoxGroup.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBoxGroup.ets new file mode 100644 index 000000000..025f99e48 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/checkBoxGroup.ets @@ -0,0 +1,109 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +import events_emitter from '@ohos.events.emitter'; +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct CheckBoxGroupPart { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear CheckBoxGroupPart start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear CheckBoxGroupPart end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("checkBoxGroup-Part") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("PartText") + + Text("checkBoxGroup-Group") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("groupText") + + CheckboxGroup({group : 'checkboxGroup'}) + .key('CheckboxGroup') + .selectedColor(0xed6f21) + .onChange((itemName:CheckboxGroupResult) => { + console.info("TextPicker::dialogResult is" + JSON.stringify(itemName)) + try { + var backData = { + data: { + "STATUS": itemName.status + } + } + let backEvent = { + eventId: 60301, + priority: events_emitter.EventPriority.LOW + } + console.info("Part start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("Part emit action state err: " + JSON.stringify(err.message)) + } + }) + Text('select all').fontSize(20) + Checkbox({name: 'checkbox1', group: 'checkboxGroup'}) + .key('Checkbox1') + .select(true) + .selectedColor(0xed6f21) + .onChange((value: boolean) => { + console.info('Checkbox1 change is'+ value) + }) + Checkbox({name: 'checkbox2', group: 'checkboxGroup'}) + .key('Checkbox2') + .select(false) + .selectedColor(0x39a2db) + .onChange((value: boolean) => { + console.info('Checkbox2 change is'+ value) + }) + + + }.width("100%").height("100%") + + + + + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/common.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/common.ets new file mode 100644 index 000000000..b413cc63f --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/common.ets @@ -0,0 +1,577 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct CommonColorMode { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear CommonColorMode start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear CommonColorMode end`) + } + + @Styles normalStyles() { + .backgroundColor("#0A59F7") + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("common-FontScale") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("fontScaleText") + + Text("common-OnFinish") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("onFinishText") + .animation({ + onFinish: () => { + Log.showInfo(TAG, 'animation onFinish success') + } + }) + + Text("common-MotionPath") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("motionPathText") + .sharedTransition('motionPathText', { + motionPath: { + path: '' + } + }) + + Text("common-Middle") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("middleText") + .alignRules({ + middle: { anchor: 'string', align: HorizontalAlign.Center } + }) + + Text("common-Area") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("areaText") + .onClick((event) => { + Log.showInfo(TAG, 'area: ' + JSON.stringify(event.target.area)) + }) + Text("common-Repeat") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("RepeatText") + .borderImage({ + source: { angle: 90, + direction: GradientDirection.Left, + colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]] + }, + slice: { top: 10, bottom: 10, left: 10, right: 10 }, + width: { top: "10px", bottom: "10px", left: "10px", right: "10px" }, + repeat: RepeatMode.Repeat, + fill: false + }); + + Text("common-Space") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("SpaceText") + .borderImage({ + source: { angle: 90, + direction: GradientDirection.Left, + colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]] + }, + slice: { top: 10, bottom: 10, left: 10, right: 10 }, + width: { top: "10px", bottom: "10px", left: "10px", right: "10px" }, + repeat: RepeatMode.Space, + fill: false + }); + + Text("common-Thin") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ThinText") + .backgroundBlurStyle(BlurStyle.Thin) + + Text("common-Thick") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ThickText") + .backgroundBlurStyle(BlurStyle.Thick) + + Text("common-Slice") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("sliceText") + .borderImage({ + source: { angle: 90, + direction: GradientDirection.Left, + colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]] + }, + slice: { top: 10, bottom: 10, left: 10, right: 10 }, + width: { top: "10px", bottom: "10px", left: "10px", right: "10px" }, + repeat: RepeatMode.Stretch, + fill: false + }); + + Text("common-Outset") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("outsetText") + .borderImage({ + source: { angle: 90, + direction: GradientDirection.Left, + colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]] + }, + slice: { top: 10, bottom: 10, left: 10, right: 10 }, + width: { top: "10px", bottom: "10px", left: "10px", right: "10px" }, + repeat: RepeatMode.Stretch, + fill: false, + outset: 2 + }); + + + Text("common-Touches") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("touchesText") + .onTouch((event) => { + Log.showInfo(TAG, 'touches: ' + JSON.stringify(event.touches)) + }) + + Text("common-ChangedTouches") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("changedTouchesText") + .onTouch((event) => { + Log.showInfo(TAG, 'changedTouches: ' + JSON.stringify(event.changedTouches)) + }) + + Text("common-KeyCode") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("keyCodeText") + .onKeyEvent((event) => { + Log.showInfo(TAG, 'keyCode: ' + event.keyCode) + }) + + Text("common-KeyText") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("keyTextText") + .onKeyEvent((event) => { + Log.showInfo(TAG, 'keyText: ' + event.keyText) + }) + + Text("common-KeySource") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("keySourceText") + .onKeyEvent((event) => { + Log.showInfo(TAG, 'keySource: ' + event.keySource) + }) + + Text("common-DeviceId") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("deviceIdText") + .onKeyEvent((event) => { + Log.showInfo(TAG, 'deviceId: ' + event.deviceId) + }) + + Text("common-MetaKey") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("metaKeyText") + .onKeyEvent((event) => { + Log.showInfo(TAG, 'metaKey: ' + event.metaKey) + }) + + Text("common-Normal") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("normalText") + .stateStyles({ normal: this.normalStyles }) + + Text("common-Pressed") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("pressedText") + .stateStyles({ pressed: this.normalStyles }) + + Text("common-Focused") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("focusedText") + .stateStyles({ focused: this.normalStyles }) + + Text("common-Clicked") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("clickedText") + .stateStyles({ clicked: this.normalStyles }) + + }.width("100%").height("100%") + } +} + +@Preview({ + locale: 'locale' +}) +@Component +struct PreviewParamsLocale { + build() { + Flex() { + Text("common-locale") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("LocaleText") + } + } +} + +@Preview({ + colorMode: 'red', +}) +@Component +struct PreviewParamsColorMode { + build() { + Flex() { + Text("common-colorMode") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ColorModeText") + } + } +} + +@Preview({ + deviceType: 'phone' +}) +@Component +struct PreviewParamsDeviceType { + build() { + Flex() { + Text("common-deviceType") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("DeviceTypeText") + } + } +} + +@Preview({ + dpi: 160 +}) +@Component +struct PreviewParamsDpi { + build() { + Flex() { + Text("common-dpi") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("DpiText") + } + } +} + +@Preview({ + orientation: '' +}) +@Component +struct PreviewParamsOrientation { + build() { + Flex() { + Text("common-orientation") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("OrientationText") + } + } +} + +@Preview({ + roundScreen: true +}) +@Component +struct PreviewParamsRoundScreen { + build() { + Flex() { + Text("common-roundScreen") + .width(320) + .height(40) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("RoundScreenText") + } + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/copyOption.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/copyOption.ets new file mode 100644 index 000000000..e96d89fe9 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/copyOption.ets @@ -0,0 +1,70 @@ +// @ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct CopyOption { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear CopyOption start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear CopyOption end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + Text("copyOption-InApp") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("InAppText") + .copyOption(CopyOption.InApp) + .visibility(Visibility.None) + + Text("copyOption-LocalDevice") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("LocalDeviceText") + .copyOption(CopyOption.LocalDevice) + .visibility(Visibility.None) + + }.width("100%").height("100%") + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/curves.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/curves.ets new file mode 100644 index 000000000..234d01e3e --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/curves.ets @@ -0,0 +1,262 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct CurvesEaseOut { + @State widthSize: number = 400 + @State heightSize: number = 200 + @State flag: boolean = true + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear CurvesEaseOut start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear CurvesEaseOut end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("EaseOutText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, // 动画时长 + curve: Curve.EaseOut, // 动画曲线:以低速结束 + delay: 100, // 动画延迟 + iterations: 1, // 播放次数 + playMode: PlayMode.Normal // 动画模式 + }) // 对Button组件的宽高属性进行动画配置 + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("EaseInOutText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.EaseInOut, //以低速开始和结束 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("FastOutSlowInText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.FastOutSlowIn, //标准曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("LinearOutSlowInText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.LinearOutSlowIn, //减速曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("FastOutLinearInText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.FastOutLinearIn, //加速曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("ExtremeDecelerationText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.ExtremeDeceleration, //急缓曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("SharpText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.Sharp, //锐利曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("RhythmText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.Rhythm, //节奏曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("SmoothText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.Smooth, //平滑曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + Button('click me') + .align(Alignment.Center) + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 400 + this.heightSize = 200 + } + this.flag = !this.flag + }) + .key("FrictionText") + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 1000, + curve: Curve.Friction, //阻尼曲线 + delay: 100, + iterations: 1, + playMode: PlayMode.Normal + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/datePicker.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/datePicker.ets new file mode 100644 index 000000000..558b73166 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/datePicker.ets @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct DatePickerLunar { + private selectedDate: Date = new Date('2021-08-08') + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear DatePickerLunar start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear DatePickerLunar end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("datePicker-Lunar") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("lunarText") + + DatePicker({ + start: new Date('1970-1-1'), + end: new Date('2100-1-1'), + selected: this.selectedDate, + }) + .key("DatePicker") + .lunar(true) + .onChange((date: DatePickerResult) => { + Log.showInfo(TAG, 'select current date is: ' + JSON.stringify(date)) + }) + + DatePicker({ + start: new Date('1970-1-1'), + end: new Date('2100-1-1'), + selected: this.selectedDate, + }) + .lunar(false) + .onChange((date: DatePickerResult) => { + Log.showInfo(TAG, 'select current date is: ' + JSON.stringify(date)) + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/edgeEffect.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/edgeEffect.ets new file mode 100644 index 000000000..6f5db3980 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/edgeEffect.ets @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import events_emitter from '@ohos.events.emitter'; + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct ListExample { + private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + @State edgeEffect: EdgeEffect = EdgeEffect.Fade + + build() { + Stack({ alignContent: Alignment.TopStart }) { + Column() { + List({ space: 20, initialIndex: 0 }) { + ForEach(this.arr, (item) => { + ListItem() { + Text('' + item) + .width('100%').height(100).fontSize(16) + .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) + }.editable(true) + }, item => item) + } + .key('list') + .listDirection(Axis.Vertical) // 排列方向 + .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线 + .edgeEffect(this.edgeEffect) // 滑动到边缘无效果 + .chainAnimation(false) // 联动特效关闭 + .onScrollIndex((firstIndex: number, lastIndex: number) => { + console.info('first' + firstIndex) + console.info('last' + lastIndex) + }) + .onItemDelete((index: number) => { + console.info(this.arr[index] + 'Delete') + this.arr.splice(index, 1) + console.info(JSON.stringify(this.arr)) + return true + }).width('90%') + }.width('100%') + + }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 }) + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/enums.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/enums.ets new file mode 100644 index 000000000..b29688e27 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/enums.ets @@ -0,0 +1,624 @@ +// @ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct EnumsCancel { + + @State widthSize: number = 200 + @State heightSize: number = 100 + @State flag: boolean = true + + @State state: AnimationStatus = AnimationStatus.Initial + @State reverse: boolean = false + @State iterations: number = 1 + + @State value: string = '' + @State text: string = '' + @State eventType: string = '' + + @State mouseText: string = 'MouseText' + + @Styles pressedStyles() { + .backgroundColor('red') + .opacity(1) + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear EnumsCancel start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear EnumsCancel end`) + } + + @State responseTypeClick: ResponseType = ResponseType.RightClick; + @State responseTypePress: ResponseType = ResponseType.LongPress; + @Builder ContextMenuBuilder() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text('text3') + .fontSize(20) + .width(100) + .height(50) + .textAlign(TextAlign.Center) + Divider().height(10) + } + } + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("enums-Cancel") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("CancelText") + .visibility(Visibility.None) + + Text("enums-Middle") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("MiddleText") + .visibility(Visibility.None) + + Text("enums-Forward") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ForwardText") + .visibility(Visibility.None) + + Text("enums-Press") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("PressText") + .visibility(Visibility.None) + + Text("enums-EaseOut") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("EaseOutText") + .visibility(Visibility.None) + + Text("enums-EaseInOut") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("EaseInOutText") + .visibility(Visibility.None) + + Text("enums-FastOutSlowIn") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FastOutSlowInText") + .visibility(Visibility.None) + + Text("enums-LinearOutSlowIn") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("LinearOutSlowInText") + .visibility(Visibility.None) + + Text("enums-FastOutLinearIn") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FastOutLinearInText") + .visibility(Visibility.None) + + Text("enums-ExtremeDeceleration") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ExtremeDecelerationText") + .visibility(Visibility.None) + + Text("enums-Sharp") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("SharpText") + .visibility(Visibility.None) + + Text("enums-Rhythm") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("RhythmText") + .visibility(Visibility.None) + + Text("enums-Smooth") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("SmoothText") + .visibility(Visibility.None) + + Text("enums-Friction") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FrictionText") + .visibility(Visibility.None) + + Text("enums-Forwards") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ForwardsText") + .visibility(Visibility.None) + + Text("enums-Reverse") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ReverseText") + .visibility(Visibility.None) + + Text("enums-Alternate") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("AlternateText") + .visibility(Visibility.None) + + Text("enums-Keyboard") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("KeyboardText") + .visibility(Visibility.None) + + Text("enums-Middle") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("MiddleText") + .visibility(Visibility.None) + + Text("enums-Mon") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("MonText") + .visibility(Visibility.None) + + Text("enums-Thur") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ThurText") + .visibility(Visibility.None) + + Text("enums-Fri") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FriText") + .visibility(Visibility.None) + + Text("enums-Sat") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("SatText") + .visibility(Visibility.None) + + Text("enums-Fade") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FadeText") + .visibility(Visibility.None) + + Text("enums-FILL") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FILLText") + .visibility(Visibility.None) + + Text("enums-FIT") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FITText") + .visibility(Visibility.None) + + Text("enums-RightClick") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("RightClickText") + .bindContextMenu(this.ContextMenuBuilder(), this.responseTypeClick) + .visibility(Visibility.None) + + Text("enums-LongPress") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("LongPressText") + .bindContextMenu(this.ContextMenuBuilder(), this.responseTypePress) + .visibility(Visibility.None) + + Text("enums-Scale") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ScaleText") + .hoverEffect(HoverEffect.Scale) + .visibility(Visibility.None) + + Text("enums-Highlight") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("HighlightText") + .hoverEffect(HoverEffect.Highlight) + .visibility(Visibility.None) + + Text("enums-InApp") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("InAppText") + .copyOption(CopyOptions.InApp) + .visibility(Visibility.None) + + Text("enums-LocalDevice") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("LocalDeviceText") + .copyOption(CopyOptions.LocalDevice) + .visibility(Visibility.None) + Text("enums-CrossDevice") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("CrossDeviceText") + .copyOption(CopyOption.CrossDevice) + .visibility(Visibility.None) + + Button('Touch').backgroundColor(0x2788D9).height(40).width(80) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down' + } + if (event.type === TouchType.Up) { + this.eventType = 'Up' + } + if (event.type === TouchType.Move) { + this.eventType = 'Move' + } + if (event.type === TouchType.Cancel) { + this.eventType = 'Cancel' + } + console.info(this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: ' + + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\ncomponent globalPos:(' + + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:' + + event.target.area.width + '\nheight:' + event.target.area.height) + }) + Text(this.text) + + Button(this.mouseText) + .onMouse((event: MouseEvent) => { + if (MouseAction.Press || MouseButton.Middle) { + console.log(this.mouseText = 'onMouse:\nButton = ' + event.button + + '\nAction = ' + event.action + '\nlocalXY=(' + event.x + ',' + event.y + ')' + + '\nscreenXY=(' + event.screenX + ',' + event.screenY + ')') + } + else if (MouseAction.Press && MouseButton.Forward) { + console.log(this.mouseText = 'onMouse:\nButton = ' + event.button + + '\nAction = ' + event.action + '\nlocalXY=(' + event.x + ',' + event.y + ')' + + '\nscreenXY=(' + event.screenX + ',' + event.screenY + ')') + } + else if (MouseAction.Press) { + console.info("pressed") + } + }) + + Text("enums-FillMode") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FillModeText") + .visibility(Visibility.None) + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/featureAbility.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/featureAbility.ets new file mode 100644 index 000000000..f8c72d5fc --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/featureAbility.ets @@ -0,0 +1,402 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct FeatureAbilityAbilityName { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear FeatureAbilityAbilityName start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear FeatureAbilityAbilityName end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("featureAbility-SubscribeMessageResponse-DeviceId") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("subscribeMessageResponseDeviceIdText") + .onClick(() => { + FeatureAbility.subscribeMsg({ + success: (data) => { + console.log(`deviceId: ${data.deviceId}`) + }, + fail: (data, code) => { + console.log(`data: ${data} code: ${code}`) + } + }) + }) + + Text("featureAbility-SubscribeMessageResponse-AbilityName") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("subscribeMessageResponseAbilityNameText") + .onClick(() => { + FeatureAbility.subscribeMsg({ + success: (data) => { + console.log(`deviceId: ${data.abilityName}`) + }, + fail: (data, code) => { + console.log(`data: ${data} code: ${code}`) + } + }) + }) + + Text("featureAbility-CallAbilityParam-AbilityName") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("callAbilityParamAbilityNameText") + .onClick(() => { + FeatureAbility.callAbility({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1001, + data: { + firstNum: 1024, + secondNum: 2048 + }, + abilityType: 0, + syncOption: 0 + }) + }) + + Text("featureAbility-CallAbilityParam-MessageCode") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("callAbilityParamMessageCodeText") + .onClick(() => { + FeatureAbility.callAbility({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1001, + data: { + firstNum: 1024, + secondNum: 2048 + }, + abilityType: 0, + syncOption: 0 + }) + }) + + Text("featureAbility-CallAbilityParam-AbilityType") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("callAbilityParamAbilityTypeText") + .onClick(() => { + FeatureAbility.callAbility({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1001, + data: { + firstNum: 1024, + secondNum: 2048 + }, + abilityType: 0, + syncOption: 0 + }) + }) + + Text("featureAbility-CallAbilityParam-SyncOption") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("callAbilityParamSyncOptionText") + .onClick(() => { + FeatureAbility.callAbility({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1001, + data: { + firstNum: 1024, + secondNum: 2048 + }, + abilityType: 0, + syncOption: 0 + }) + }) + + Text("featureAbility-SubscribeAbilityEventParam-AbilityName") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("subscribeAbilityEventParamAbilityNameText") + .onClick(() => { + FeatureAbility.subscribeAbilityEvent({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1005, + abilityType: 0, + syncOption: 0 + }, (callbackData) => { + var callbackJson = JSON.parse(callbackData); + console.info('eventData is: ' + JSON.stringify(callbackJson.data)); + }) + }) + + Text("featureAbility-SubscribeAbilityEventParam-MessageCode") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("subscribeAbilityEventParammessageCodeText") + .onClick(() => { + FeatureAbility.subscribeAbilityEvent({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1005, + abilityType: 0, + syncOption: 0 + }, (callbackData) => { + var callbackJson = JSON.parse(callbackData); + console.info('eventData is: ' + JSON.stringify(callbackJson.data)); + }) + }) + + Text("featureAbility-SubscribeAbilityEventParam-AbilityType") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("subscribeAbilityEventParamAbilityTypeText") + .onClick(() => { + FeatureAbility.subscribeAbilityEvent({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1005, + abilityType: 0, + syncOption: 0 + }, (callbackData) => { + var callbackJson = JSON.parse(callbackData); + console.info('eventData is: ' + JSON.stringify(callbackJson.data)); + }) + }) + + Text("featureAbility-SubscribeAbilityEventParam-SyncOption") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("subscribeAbilityEventParamSyncOptionText") + .onClick(() => { + FeatureAbility.subscribeAbilityEvent({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + messageCode: 1005, + abilityType: 0, + syncOption: 0 + }, (callbackData) => { + var callbackJson = JSON.parse(callbackData); + console.info('eventData is: ' + JSON.stringify(callbackJson.data)); + }) + }) + + + Text("featureAbility-SendMessageOptions-DeviceId") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("sendMessageOptionsDeviceIdText") + .onClick(() => { + FeatureAbility.sendMsg({ + deviceId: '1001', + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility' + }) + }) + + Text("featureAbility-SendMessageOptions-AbilityName") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("sendMessageOptionsAbilityNameText") + .onClick(() => { + FeatureAbility.sendMsg({ + deviceId: '1001', + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility' + }) + }) + + Text("featureAbility-RequestParams-AbilityName") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("requestParamsAbilityNameText") + .onClick(() => { + FeatureAbility.startAbility({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility' + }) + }) + + Text("featureAbility-Entities") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("entitiesText") + .onClick(() => { + FeatureAbility.startAbility({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + entities: ["this is a test"] + }) + }) + + Text("featureAbility-DeviceType") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("deviceTypeText") + .onClick(() => { + FeatureAbility.startAbility({ + bundleName: 'com.example.hiaceservice', + abilityName: 'com.example.hiaceservice.ComputeServiceAbility', + deviceType: 1001 + }) + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/fill_mode.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/fill_mode.ets new file mode 100644 index 000000000..57eb7a70f --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/fill_mode.ets @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct ImageAnimatorExample { + @State state: AnimationStatus = AnimationStatus.Initial + @State reverse: boolean = false + @State iterations: number = 1 + + build() { + Column({ space:5 }) { + ImageAnimator() + .images([ + { + src: '/comment/bg1.png', + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + }, + { + src: '/comment/bg2.png', + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + }, + { + src: $rawfile('bg3.png'), + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + }, + { + src: $rawfile('bg4.png'), + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + } + ]) + .key("ImageAnimator") + .state(this.state).reverse(this.reverse).fixedSize(false).preDecode(2) + .fillMode(FillMode.Forwards) + .iterations(this.iterations) + .width(325) + .height(210) + .margin({top:100}) + .onStart(() => { // 当帧动画开始播放后触发 + console.info('Start') + }) + .onPause(() => { + console.info('Pause') + }) + .onRepeat(() => { + console.info('Repeat') + }) + .onCancel(() => { + console.info('Cancel') + }) + .onFinish(() => { // 当帧动画播放完成后触发 + this.state = AnimationStatus.Stopped + console.info('Finish') + }) + Row() { + Button('start').width(100).padding(5).onClick(() => { + this.state = AnimationStatus.Running + }) + Button('pause').width(100).padding(5).onClick(() => { + this.state = AnimationStatus.Paused + }) + Button('stop').width(100).padding(5).onClick(() => { + this.state = AnimationStatus.Stopped + }) + } + Row() { + Button('reverse').width(100).padding(5).onClick(() => { + this.reverse = !this.reverse + }) + Button('once').width(100).padding(5).onClick(() => { + this.iterations = 1 + }) + Button('iteration').width(100).padding(5).onClick(() => { + this.iterations = -1 + }) + } + }.width('100%').height('100%').backgroundColor(0xF1F3F5) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gesture.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gesture.ets new file mode 100644 index 000000000..b9a951d76 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gesture.ets @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct GestureParallel { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear GestureParallel start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear GestureParallel end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("gesture-Parallel") + .width(320) + .height(120) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ParallelText") + .gesture( + GestureGroup(GestureMode.Parallel, + LongPressGesture({ repeat: true }) + .onAction((event: GestureEvent) => { + Log.showInfo(TAG, `LongPress onAction`) + }) + .onActionEnd(() => { + Log.showInfo(TAG, `LongPress end`) + }), + PanGesture({}) + .onActionStart(() => { + Log.showInfo(TAG, `onActionStart`) + }) + .onActionUpdate((event: GestureEvent) => { + Log.showInfo(TAG, `onActionUpdate`) + }) + ) + ) + + Text("gesture-Exclusive") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ExclusiveText") + .gesture( + GestureGroup(GestureMode.Exclusive, + LongPressGesture({ repeat: true }) + .onAction((event: GestureEvent) => { + Log.showInfo(TAG, `LongPress onAction`) + }) + .onActionEnd(() => { + Log.showInfo(TAG, `LongPress end`) + }), + PanGesture({}) + .onActionStart(() => { + Log.showInfo(TAG, `onActionStart`) + }) + .onActionUpdate((event: GestureEvent) => { + Log.showInfo(TAG, `onActionUpdate`) + }) + ) + ) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridCol.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridCol.ets new file mode 100644 index 000000000..0d949160c --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridCol.ets @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct GridColXl { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear GridColXl start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear GridColXl end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + GridRow(){ + GridCol({ span: { xl: 2 } }){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol({ span: { xl: 2 } }){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("xlText") + + GridRow(){ + GridCol({ span: { xxl: 2 } }){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol({ span: { xxl: 2 } }){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("xxlText") + + GridRow(){ + GridCol({ span: { xl: 2 } }){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .key("GridCol") + .order({xl: 10}) + .backgroundColor(Color.Green) + GridCol({ span: { xl: 2 } }){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .order(10) + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("orderText") + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridRow.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridRow.ets new file mode 100644 index 000000000..95ca6fdff --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/gridRow.ets @@ -0,0 +1,186 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct GridRowXl { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear GridRowXl start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear GridRowXl end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + + GridRow({columns: {xl: 2}}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + } + .backgroundColor(Color.Red) + .key("GridRowColumnOption——xl") + + GridRow({columns: {xxl: 2}}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("GridRowColumnOption——xxl") + + GridRow({gutter:{x: {xl: 2}}}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("GridRowSizeOption——xl") + + GridRow({gutter:{x: {xxl: 2}}}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("GridRowSizeOption——xxl") + + GridRow({breakpoints: { reference: BreakpointsReference.WindowSize }}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("WindowSizeText") + + GridRow({breakpoints: { reference: BreakpointsReference.ComponentSize }}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("ComponentSizeText") + + GridRow({breakpoints: { reference: BreakpointsReference.ComponentSize }}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("referenceText") + + GridRow({breakpoints: { reference: BreakpointsReference.ComponentSize }}){ + GridCol(){ + Text('Hello') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Green) + GridCol(){ + Text('World') + .width(100) + .height(70) + .align(Alignment.Center) + } + .backgroundColor(Color.Blue) + }.backgroundColor(Color.Red) + .key("breakpointsText") + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/hoverEffect.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/hoverEffect.ets new file mode 100644 index 000000000..28aec9fab --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/hoverEffect.ets @@ -0,0 +1,70 @@ +//@ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct HoverEffect { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear HoverEffect start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear HoverEffect end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + Text("hoverEffect-Scale") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ScaleText") + .hoverEffect(HoverEffect.Scale) + .visibility(Visibility.None) + + Text("hoverEffect-Highlight") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("HighlightText") + .hoverEffect(HoverEffect.Highlight) + .visibility(Visibility.None) + + }.width("100%").height("100%") + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/index.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 000000000..3a6b007e1 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct MyComponent { + aboutToAppear() { + } + + build() { + Flex({ + direction: FlexDirection.Column, + alignItems: ItemAlign.Center, + justifyContent: FlexAlign.Center + }) { + Text('ace AttrLack ets test') + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/keysource.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/keysource.ets new file mode 100644 index 000000000..fe91c2bb2 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/keysource.ets @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct KeyEventExample { + @State text: string = '' + @State eventType: string = '' + + build() { + Column() { + Button('KeyEvent').backgroundColor(0x2788D9) + .onKeyEvent((event: KeyEvent) => { + if (event.type === KeyType.Down) { + this.eventType = 'Down' + } + if (event.type === KeyType.Up) { + this.eventType = 'Up' + } + console.info(this.text = 'KeyType:' + this.eventType + '\nkeyCode:' + event.keyCode + '\nkeyText:' + event.keyText + + '\nKeyboard:' + event.keySource.Keyboard) + }) + Text(this.text).padding(15) + }.height(300).width('100%').padding(35) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/listtest.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/listtest.ets new file mode 100644 index 000000000..855f724d5 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/listtest.ets @@ -0,0 +1,149 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +import events_emitter from '@ohos.events.emitter'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct ListIdle { + private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + @State editFlag: boolean = false + private scroller: Scroller = new Scroller() + @State onScroll: boolean = false + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear ListIdle start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear ListIdle end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("list-Idle") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("IdleText") + + Text("list-Scroll") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ScrollText") + + Text("list-Fling") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("FlingText") + + Stack({ alignContent: Alignment.TopStart }) { + Scroll(this.scroller) { + List({ space: 20, initialIndex: 0 }) { + ForEach(this.arr, (item) => { + ListItem() { + Text('' + item) + .width('100%').height(100).fontSize(16) + .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) + }.editable(true) + }, item => item) + + } + .editMode(true) + .key("ScrollList") + .listDirection(Axis.Vertical) // 排列方向 + .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线 + .edgeEffect(EdgeEffect.None) // 滑动到边缘无效果 + .chainAnimation(false) // 联动特效关闭 + .onScroll((scrollOffset: 5, scrollState:ScrollState) => { + console.info('scrollOffset' + scrollOffset) + console.info('scrollState ' + scrollState) + }) + .onClick(()=>{ + try { + var backData = { + data: { + "State": this.onScroll + } + } + let backEvent = { + eventId: 60303, + priority: events_emitter.EventPriority.LOW + } + console.info("Scroll start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("Scroll emit action state err: " + JSON.stringify(err.message)) + } + try { + this.scroller.scrollPage({ next: true }) + this.onScroll = true + } catch (err) { + console.info("Scroll emit action state err: " + JSON.stringify(err.message)) + } + }) + } + .scrollable(ScrollDirection.Vertical) + .scrollBar(BarState.On) + .scrollBarColor(Color.Gray) + .scrollBarWidth(30) + .onScroll((xOffset: number, yOffset: number) => { + console.info(xOffset + ' ' + yOffset) + }) + .onScrollEdge((side: Edge) => { + console.info('To the edge') + }) + .onScrollEnd(() => { + console.info('Scroll Stop') + }) + } + }.width("100%").height("100%") + + + + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/loadingProgress.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/loadingProgress.ets new file mode 100644 index 000000000..1353d00b7 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/loadingProgress.ets @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct LoadingProgressCircular { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear LoadingProgressCircular start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear LoadingProgressCircular end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("loadingProgress-Circular") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("CircularText") + + Text("loadingProgress-Orbital") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("OrbitalText") + + Text('Orbital LoadingProgress ').fontSize(9).fontColor(0xCCCCCC).width('100%') + LoadingProgress() + .color(Color.Blue) + }.width("100%").height("100%") + } +} + + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/onFrame.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/onFrame.ets new file mode 100644 index 000000000..4fd2052f3 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/onFrame.ets @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import animator from '@ohos.animator'; +import prompt from '@system.prompt'; + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct ColumnExample { + @State divWidth: number = 120; + @State divHeight: number = 120; + @State animation: AnimatorResult = animator.createAnimator({ + duration: 3000, + fill: 'forwards', + direction: "normal", + begin: 200, + end: 270 + }); + + onPageShow() { + this.animation.onrepeat(() => { + var repeatoptions = { + duration: 2000, + iterations: 1, + direction: 'alternate', + begin: 180, + end: 240 + }; + this.animation.update(repeatoptions); + this.animation.play(); + }); + } + + playAnimation() { + var _this = this; + this.animation.onframe = function(value) { + _this.translateVal= value + }; + this.animation.play(); + } + + build() { + Column() { + Column() { + Column() { + Column().width(this.divWidth).height(this.divHeight).backgroundColor(0xAFEEEE) + }.width('100%') + }.width('100%').padding({ top: 5 }) + + Column() { + Row() { + Button('play') + .borderRadius(8) + .backgroundColor(0x317aff) + .width(90) + .key("button1") + .onClick(() => { + this.animation.onframe((value) => { + this.divWidth = value + this.divHeight = value + }); + this.animation.play(); + }); + Button('update').borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() => { + var newoptions = { + duration: 5000, + iterations: 2, + begin: 120, + end: 180 + }; + this.animation.update(newoptions); + this.animation.play(); + }); + }.margin({ top: 5 }) + + Row() { + Button('pause').borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() => { + this.animation.pause(); + }); + Button('finish').borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() => { + this.animation.onfinish(() => { + prompt.showToast({ + message: 'finish' + }) + }); + this.animation.finish(); + }); + }.margin({ top: 5 }) + + Row() { + Button('cancel').borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() => { + this.animation.cancel(); + }); + Button('reverse').borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() => { + this.animation.reverse(); + }); + }.margin({ top: 5 }) + + Row() { + Button('onframe') + .key("button1") + .borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() => { + this.playAnimation() + }); + }.margin({ top: 5 }) + }.margin({ top: 30 }) + } + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page1.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page1.ets new file mode 100644 index 000000000..0a3cea52a --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page1.ets @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//在second页面中接收传递过来的参数 +import router from '@ohos.router' +import events_emitter from '@ohos.events.emitter'; +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct Second { + private content: string = "这是第二页" + @State text: string = router.getParams()['text'] + @State data: any = router.getParams()['data'] + @State secondData : string = '' + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(`${this.content}`) + .fontSize(50) + .fontWeight(FontWeight.Bold) + Text(this.text) + .fontSize(30) + .key("DataText") + .onClick(()=>{ + this.secondData = (this.data.array[1]).toString() + try { + var backData = { + data: { + "ArrayData": this.secondData + } + } + let backEvent = { + eventId: 101, + priority: events_emitter.EventPriority.LOW + } + console.info("page1 start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("page1 emit action state err: " + JSON.stringify(err.message)) + } + }) + .margin({top:20}) + Text('第一页传来的数值是' + ' ' + this.secondData) + .fontSize(20) + .margin({top:20}) + .backgroundColor('red') + } + .width('100%') + .height('100%') + } +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page2.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page2.ets new file mode 100644 index 000000000..72be9f573 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/page2.ets @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//在second页面中接收传递过来的参数 +import router from '@ohos.router' +import events_emitter from '@ohos.events.emitter'; +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct Second { + private content: string = "这是第二页" + @State text: string = router.getParams()['text'] + @State data: any = router.getParams()['data'] + @State secondData : string = '' + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(`${this.content}`) + .fontSize(50) + .fontWeight(FontWeight.Bold) + Text(this.text) + .fontSize(30) + .key("SingleDataText") + .onClick(()=>{ + this.secondData = (this.data.array[1]).toString() + try { + var backData = { + data: { + "ArrayData": this.secondData + } + } + let backEvent = { + eventId: 102, + priority: events_emitter.EventPriority.LOW + } + console.info("page1 start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("page1 emit action state err: " + JSON.stringify(err.message)) + } + }) + .margin({top:20}) + Text('第一页传来的数值是' + ' ' + this.secondData) + .fontSize(20) + .margin({top:20}) + .backgroundColor('red') + } + .width('100%') + .height('100%') + } +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/progress.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/progress.ets new file mode 100644 index 000000000..057015c5f --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/progress.ets @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct ProgressScaleCount { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear ProgressScaleCount start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear ProgressScaleCount end`) + } + + build() { + Column({ space: 15 }) { + Text('Linear Progress').fontSize(9).fontColor(0xCCCCCC).width('90%') + Progress({ value: 10, type: ProgressType.Linear }).width(200) + Progress({ value: 20, total: 150, type: ProgressType.Linear }).color(Color.Grey).value(50).width(200) + + Text('Eclipse Progress').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row({ space: 40 }) { + Progress({ value: 10, type: ProgressType.Eclipse }).width(100) + Progress({ value: 20, total: 150, type: ProgressType.Eclipse }).color(Color.Grey).value(50).width(100) + } + + Text('ScaleRing Progress').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row({ space: 40 }) { + Progress({ value: 10, type: ProgressType.ScaleRing }).width(100) + Progress({ value: 20, total: 150, type: ProgressType.ScaleRing }) + .key("progressStyleOptions") + .color(Color.Grey).value(50).width(100) + .style({ strokeWidth: 15, scaleCount: 15, scaleWidth: 5 }) + } + + Text('Ring Progress').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row({ space: 40 }) { + Progress({ value: 10, type: ProgressType.Ring }).width(100) + Progress({ value: 20, total: 150, type: ProgressType.Ring }) + .color(Color.Grey).value(50).width(100) + .style({ strokeWidth: 20, scaleCount: 30, scaleWidth: 20 }) + } + + Text('Capsule Progress').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row({ space: 40 }) { + Progress({ value: 10, type: ProgressType.Capsule }).width(100).height(50) + Progress({ value: 20, total: 150, type: ProgressType.Capsule }) + .color(Color.Grey) + .value(50) + .width(100) + .height(50) + } + }.width('100%').margin({ top: 30 }) + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/radio.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/radio.ets new file mode 100644 index 000000000..17dab9a83 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/radio.ets @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct RadioGroup { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear RadioGroup start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear RadioGroup end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("radio-Group") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("groupText") + + Radio({ value: 'Radio1', group: 'radioGroup' }) + .checked(true) + .key("RadioOne") + .height(50) + .width(50) + .onChange((value: boolean) => { + console.log('Radio1 status is ' + value) + }) + Radio({ value: 'Radio2', group: 'radioGroup' }) + .checked(false) + .key("RadioTwo") + .height(50) + .width(50) + .onChange((value: boolean) => { + console.log('Radio2 status is ' + value) + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/refresh.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/refresh.ets new file mode 100644 index 000000000..ec2dc2d18 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/refresh.ets @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +import Utils from '../common/Utils.ets'; +import events_emitter from '@ohos.events.emitter'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct RefreshDrag { + dragRefresh() { + var rect = Utils.getComponentRect("Refresh") + Utils.drag(rect["left"],rect["top"],rect["right"],rect["bottom"],20) + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear RefreshDrag start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear RefreshDrag end`) + } + + @State isRefreshing: boolean = false + @State counter: number = 0 + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("refresh-Drag") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("DragText") + + Text("refresh-Refresh") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("RefreshText") + + + Refresh({refreshing: this.isRefreshing, offset: 120, friction: 100}) { + Text('Pull Down and refresh: ' + this.counter) + .fontSize(30) + .margin(10) + } + .key("Refresh") + .onClick(()=>{ + this.dragRefresh() + }) + .onStateChange((refreshStatus: RefreshStatus) => { + console.info('Refresh onStatueChange state is ' + refreshStatus) + try { + var backDataTwo = { + data: { + "Result": true + } + } + let backEventTwo = { + eventId: 60305, + priority: events_emitter.EventPriority.LOW + } + console.info("Refresh start to emit action state") + events_emitter.emit(backEventTwo, backDataTwo) + } catch (err) { + console.info("Refresh emit action state err: " + JSON.stringify(err.message)) + } + }) + .onRefreshing(() => { + setTimeout(() => { + this.counter++ + this.isRefreshing = false + }, 1000) + console.log('onRefreshing test') + try { + var backData = { + data: { + "Result": true + } + } + let backEvent = { + eventId: 60304, + priority: events_emitter.EventPriority.LOW + } + console.info("Drag start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("Drag emit action state err: " + JSON.stringify(err.message)) + } + }) + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/remoteWindow.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/remoteWindow.ets new file mode 100644 index 000000000..5d1fae1d3 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/remoteWindow.ets @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct FormComponentFormDimension { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Dimension start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear Dimension end`) + } + + build() { + Row() { + Column({ space: 10 }) { + Text("formComponent-FormDimension-WindowBounds") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("formComponentFormDimensionWindowBoundsText") + + RemoteWindow(this.target) + .translate({ x: 100, y: 200 }) + .scale({ x: 0.5, y: 0.5 }) + .opacity(0.8) + .position({ x: px2vp(this.target?.windowBounds.left), y: px2vp(this.target?.windowBounds.top) }) + .width(px2vp(this.target?.windowBounds.width)) + .height(px2vp(this.target?.windowBounds.height)) + + } + .width('100%') + } + .height('100%') + } +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/responseType.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/responseType.ets new file mode 100644 index 000000000..d892d7305 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/responseType.ets @@ -0,0 +1,88 @@ +//@ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct ResponseType { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear ResponseType start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear ResponseType end`) + } + + @Builder ContextMenuBuilder() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text('text3') + .fontSize(20) + .width(100) + .height(50) + .textAlign(TextAlign.Center) + Divider().height(10) + } +} + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + Text("responseType-RightClick") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("RightClickText") + .bindContextMenu(this.ContextMenuBuilder(), ResponseType.RightClick) + .visibility(Visibility.None) + + Text("responseType-LongPress") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("LongPressText") + .bindContextMenu(this.ContextMenuBuilder(), ResponseType.LongPress) + .visibility(Visibility.None) + + Column() { + Text('rightclick for menu') + } + .key("TestColumn") + .width('100%') + .margin({ top: 5 }) + .bindContextMenu(this.MenuBuilder, ResponseType.RightClick) + + }.width("100%").height("100%") + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/router.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/router.ets new file mode 100644 index 000000000..eb1ee2087 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/router.ets @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@ohos.router' +import uiAppearance from '@ohos.uiAppearance'; + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct RouterStandard { + + + async routePage() { + let options = { + url: 'pages/page1', + params: { + text: '这是第一页的值', + data: { + array: [12, 45, 78] + } + } + } + try { + await router.push(options,router.RouterMode.Standard) + } catch (err) { + console.info(`Standard Page fail callback, code: ${err.code}, msg: ${err.msg}`) + } + } + + async routeSinglePage() { + let options = { + url: 'pages/page2', + params: { + text: '这是第二页的值', + data: { + array: [13, 46, 79] + } + } + } + try { + await router.push(options,router.RouterMode.Single) + } catch (err) { + console.info(`Single Page fail callback, code: ${err.code}, msg: ${err.msg}`) + } + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear RouterStandard start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear RouterStandard end`) + } + + build(){ + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("router-Standard") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("StandardText") + .onClick(() => { + this.routePage() + }) + + Text("router-Single") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("SingleText") + .onClick(() => { + this.routeSinglePage() + }) + + Text('这是第一页') + .fontSize(50) + .fontWeight(FontWeight.Bold) + Button() { + Text('next page') + .fontSize(25) + .fontWeight(FontWeight.Bold) + }.type(ButtonType.Capsule) + .margin({ top: 20 }) + .backgroundColor('#ccc') + .onClick(() => { + this.routePage() + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/scroll_edge.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/scroll_edge.ets new file mode 100644 index 000000000..8b9cc0077 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/scroll_edge.ets @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +import events_emitter from '@ohos.events.emitter'; +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +struct ScrollExample { + scroller: Scroller = new Scroller() + private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + build() { + Stack({ alignContent: Alignment.TopStart }) { + Scroll(this.scroller) { + Column() { + ForEach(this.arr, (item) => { + Text(item.toString()) + .width('90%').height(150).backgroundColor(0xFFFFFF) + .borderRadius(15).fontSize(16).textAlign(TextAlign.Center) + .margin({ top: 10 }) + }, item => item) + }.width('100%') + } + .scrollable(ScrollDirection.Vertical).scrollBar(BarState.On) + .scrollBarColor(Color.Gray).scrollBarWidth(30) + .onScroll((xOffset: number, yOffset: number) => { + console.info(xOffset + ' ' + yOffset) + }) + .onScrollEdge((side: Edge) => { + console.info('To the edge') + }) + .onScrollEnd(() => { + console.info('Scroll Stop') + }) + Button('back Middle') + .key("MiddleText") + .onClick(() => { // 点击后回到顶部 + this.scroller.scrollEdge(Edge.Middle) + var result=(this.scroller.scrollEdge(Edge.Middle)!=null) + try { + var backData = { + data: { + "STATUS": result + } + } + let backEvent = { + eventId: 60306, + priority: events_emitter.EventPriority.LOW + } + console.info("onRequestPopupData start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("onRequestPopupData emit action state err: " + JSON.stringify(err.message)) + } + }) + .margin({ top: 60, left: 20 }) + }.width('100%').height('100%').backgroundColor(0xDCDCDC) + } +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/sidebar.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/sidebar.ets new file mode 100644 index 000000000..ee12737a8 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/sidebar.ets @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct SidebarIcons { + @State arr: number[] = [1, 2] + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear SidebarIcons start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear SidebarIcons end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("sidebar-Icons") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("iconsText") + + SideBarContainer(SideBarContainerType.Embed) { + Column() { + ForEach(this.arr, (item, index) => { + Column({ space: 5 }) { + Text("Index0" + item) + .fontSize(20) + } + }, item => item) + }.width('100%') + .justifyContent(FlexAlign.SpaceEvenly) + .backgroundColor('#19000000') + + RowSplit() { + Column() { + Text('Split page').fontSize(30) + } + }.width('100%') + } + .key("SideBarContainer") + .sideBarWidth(240) + .minSideBarWidth(210) + .maxSideBarWidth(260) + .controlButton({ + icons: { + shown: $r("app.media.icon"), + hidden: $r("app.media.icon") + } + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/slider.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/slider.ets new file mode 100644 index 000000000..91ee60b8f --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/slider.ets @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +import Utils from '../common/Utils.ets'; +import events_emitter from '@ohos.events.emitter'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct SliderMoving { + @State outSetValue: number = 40 + slide() { + var rect = Utils.getComponentRect("Slider") + Utils.drag(rect["left"],rect["top"],rect["right"],rect["bottom"],20) + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear SliderMoving start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear SliderMoving end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("slider-Moving") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("MovingText") + + Slider({ + value: this.outSetValue, + min: 0, + max: 100, + step: 1, + style: SliderStyle.OutSet + }) + .key("Slider") + .blockColor(Color.Blue) + .trackColor(Color.Gray) + .selectedColor(Color.Blue) + .showSteps(true) + .showTips(true) + .onChange((value: number, mode: SliderChangeMode) => { + Log.showInfo(TAG, 'SliderChangeMode.Moving: ' + SliderChangeMode.Moving.toString()) + Log.showInfo(TAG, 'value:' + value + 'mode:' + mode.toString()) + try { + var backData = { + data: { + "Mode": (mode==0)||(mode==1)||(mode==2) + } + } + let backEvent = { + eventId: 60307, + priority: events_emitter.EventPriority.LOW + } + console.info("Slider start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("Slider emit action state err: " + JSON.stringify(err.message)) + } + }) + .onClick(() => { + this.slide() + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stateManagement.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stateManagement.ets new file mode 100644 index 000000000..99b385c02 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stateManagement.ets @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct StateManagementDARK { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear StateManagementDARK start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear StateManagementDARK end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("stateManagement-DARK") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .backgroundColor(ColorMode.DARK) + .key("DARKText") + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stepperItem.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stepperItem.ets new file mode 100644 index 000000000..fd55e9512 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/stepperItem.ets @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct StepperItemDisabled { + @State currentIndex: number = 0 + @State firstState: ItemState = ItemState.Normal + @State secondState: ItemState = ItemState.Normal + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear StepperItemDisabled start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear StepperItemDisabled end`) + } + + build() { + Row() { + Column({ space: 10 }) { + Text('message') + .fontSize(50) + .fontWeight(FontWeight.Bold) + + Stepper({ + index: this.currentIndex + }) { + StepperItem() { + Text('Page One') + .fontSize(35) + .fontColor(Color.Blue) + .width(200) + .lineHeight(50) + .margin({ top: 250 }) + } + .nextLabel('') + .position({ x: '35%', y: 0 }) + + StepperItem() { + Text('Page Two') + .fontSize(35) + .fontColor(Color.Blue) + .width(200) + .lineHeight(50) + .margin({ top: 250 }) + .onClick(() => { + this.firstState = this.firstState === ItemState.Skip ? ItemState.Normal : ItemState.Skip + }) + } + .key("StepperItem") + .nextLabel('Finish') + .prevLabel('Previous') + .status(this.firstState) + .position({ x: '35%', y: 0 }) + .status(ItemState.Disabled) + } + .onFinish(() => { + Log.showInfo(TAG, 'onFinish') + }) + .onSkip(() => { + Log.showInfo(TAG, 'onSkip') + }) + .onChange((prevIndex: number, index: number) => { + this.currentIndex = index + }) + .align(Alignment.Center) + .height('50%') + + } + .width('100%') + } + .height('100%') + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/swiper.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/swiper.ets new file mode 100644 index 000000000..2d10b8c60 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/swiper.ets @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct SwiperMask { + private swiperController: SwiperController = new SwiperController() + private data: MyDataSource = new MyDataSource([]) + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear SwiperMask start`) + let list = [] + for (var i = 1; i <= 5; i++) { + list.push(i.toString()); + } + this.data = new MyDataSource(list) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear SwiperMask end`) + } + + build() { + Row() { + Column({ space: 10 }) { + Text("swiper-Mask") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("maskText") + + Swiper(this.swiperController) { + LazyForEach(this.data, (item: string) => { + Text(item) + .width('90%') + .height(160) + .backgroundColor(0xAFEEEE) + .textAlign(TextAlign.Center) + .fontSize(20) + }, item => item) + } + .cachedCount(2) + .index(1) + .autoPlay(true) + .interval(4000) + .indicator(true) // 默认开启指示点 + .loop(false) // 默认开启循环播放 + .duration(1000) + .vertical(false) // 默认横向切换 + .itemSpace(0) + .curve(Curve.Linear) // 动画曲线 + .key("maskSwiper") + .indicatorStyle({ + mask: false + }) + + } + .width('100%') + } + .height('100%') + } +} + + +class MyDataSource implements IDataSource { + private list: number[] = [] + private listener: DataChangeListener + + constructor(list: number[]) { + this.list = list + } + + totalCount(): number { + return this.list.length + } + + getData(index: number): any { + return this.list[index] + } + + registerDataChangeListener(listener: DataChangeListener): void { + this.listener = listener + } + + unregisterDataChangeListener() { + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/text_input.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/text_input.ets new file mode 100644 index 000000000..784b28a6a --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/text_input.ets @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct Text_inputPhoneNumber { + @State text: string = '' + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Text_inputPhoneNumber start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear Text_inputPhoneNumber end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + TextInput({ placeholder: 'input your word' }) + .key("PhoneNumberText") + .placeholderColor("rgb(0,0,225)") + .placeholderFont({ size: 30, weight: 100, family: 'cursive', style: FontStyle.Italic }) + .caretColor(Color.Blue) + .height(50) + .fontSize(30) + .fontWeight(FontWeight.Bold) + .fontFamily("sans-serif") + .fontStyle(FontStyle.Normal) + .fontColor(Color.Red) + .type(InputType.PhoneNumber) + .onChange((value: string) => { + this.text = value + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/uiAppearance.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/uiAppearance.ets new file mode 100644 index 000000000..3e5c60eb2 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/uiAppearance.ets @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import uiAppearance from '@ohos.uiAppearance'; +import Log from '../common/Log.ets'; +import events_emitter from '@ohos.events.emitter'; + +const TAG = 'ets_apiLack_add'; +uiAppearance.DarkMode.ALWAYS_DARK + +@Entry +@Component +export default +struct UiAppearanceALWAYS_DARK { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear UiAppearanceALWAYS_DARK start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear UiAppearanceALWAYS_DARK end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + + Text("uiAppearance-ALWAYS_DARK") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ALWAYS_DARKText") + .onClick(()=>{ + uiAppearance.setDarkMode(uiAppearance.DarkMode.ALWAYS_DARK, (err) => { + console.info(`${err}`); + }) + let darkMode = uiAppearance.getDarkMode(); + try{ + var backData = { + data: { + "Mode": darkMode + } + } + let backEvent = { + eventId: 60308, + priority: events_emitter.EventPriority.LOW + } + console.info("AlwaysDark start to emit action state") + events_emitter.emit(backEvent, backData) + } catch(err) { + console.info("AlwaysDark emit action state err: " + JSON.stringify(err.message)) + } + }) + + Text("uiAppearance-ALWAYS_LIGHT") + .width(100) + .height(70) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("ALWAYS_LIGHTText") + .onClick(()=>{ + uiAppearance.setDarkMode(uiAppearance.DarkMode.ALWAYS_LIGHT, (err) => { + console.info(`${err}`); + }) + let darkMode = uiAppearance.getDarkMode(); + try{ + var backData = { + data: { + "Mode": darkMode + } + } + let backEvent = { + eventId: 60309, + priority: events_emitter.EventPriority.LOW + } + console.info("AlwaysLight start to emit action state") + events_emitter.emit(backEvent, backData) + } catch(err) { + console.info("AlwaysLight emit action state err: " + JSON.stringify(err.message)) + } + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/units.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/units.ets new file mode 100644 index 000000000..3c0c96356 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/units.ets @@ -0,0 +1,178 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; +import events_emitter from '@ohos.events.emitter'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default struct UnitsModuleName { + @State textHeight: number = 50 + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear UnitsModuleName start`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear UnitsModuleName end`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + Text("units-ModuleName") + .width(320) + .height(this.textHeight) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("moduleNameText") + .onClick(() => { + console.log($r('app.string.MainAbility_label').bundleName) + try { + var backData = { + data: { + "ModuleName": ($r('app.string.MainAbility_label').bundleName != null) + } + } + let backEvent = { + eventId: 60310, + priority: events_emitter.EventPriority.LOW + } + console.info("ModuleName start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("ModuleName emit action state err: " + JSON.stringify(err.message)) + } + }) + + Text("units-GlobalPosition") + .width(320) + .height(this.textHeight) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("globalPositionText") + .onClick(() => { + this.textHeight = 100 + }) + .onAreaChange((oldValue: Area, newValue: Area) => { + console.info(`oldValue.globalPosition: ${JSON.stringify(oldValue.globalPosition)}`) + console.info(`newValue.globalPosition: ${JSON.stringify(newValue.globalPosition)}`) + try { + var backData = { + data: { + "Result": true + } + } + let backEvent = { + eventId: 60311, + priority: events_emitter.EventPriority.LOW + } + console.info("GlobalPosition start to emit action state") + events_emitter.emit(backEvent, backData) + } catch (err) { + console.info("GlobalPosition emit action state err: " + JSON.stringify(err.message)) + } + }) + + + Text("units-MinWidth") + .width(100) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("minWidthText") + .constraintSize({ + minWidth: 200 + }) + + Text("units-MaxWidth") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("maxWidthText") + .constraintSize({ + maxWidth: 200 + }) + + Text("units-MinHeight") + .width(320) + .height(50) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("minHeightText") + + .constraintSize({ + minHeight: 100 + }) + + Text("units-MaxHeight") + .width(320) + .height(200) + .fontSize(20) + .opacity(1) + .align(Alignment.TopStart) + .fontColor(0xCCCCCC) + .lineHeight(25) + .border({ width: 1 }) + .padding(10) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .key("maxHeightText") + .constraintSize({ + maxHeight: 100 + }) + + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/web.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/web.ets new file mode 100644 index 000000000..b48af9231 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/MainAbility/pages/web.ets @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Log from '../common/Log.ets'; + +const TAG = 'ets_apiLack_add'; + +@Entry +@Component +export default +struct WebEditText { + controller: WebController = new WebController(); + webResourceResponse: WebResourceResponse = new WebResourceResponse(); + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear WebEditText start`) + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear WebEditText end`) + } + + build(){ + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,justifyContent:FlexAlign.Center }){ + Web({ src:'www.baidu.com', controller:this.controller }) + .javaScriptAccess(true) + .height(500) + .padding(20) + .blur(2) + .fileFromUrlAccess(true) + .initialScale(2) + .webDebuggingAccess(true) + .onRenderExited((event) => { + console.info('onRenderExited getAcceptType: ', event.renderExitReason); + }) + .onShowFileSelector((event) => { + console.info('onShowFileSelector getAcceptType: ', event.fileSelector.getAcceptType()); + console.info('onShowFileSelector getTitle: ', event.fileSelector.getTitle()); + console.info('onShowFileSelector getMode: ', event.fileSelector.getMode()); + console.info('onShowFileSelector isCapture: ', event.fileSelector.isCapture()); + event.result.handleFileList(["D:\DevEcoStudioProjects","D:\DevEcoStudioProjects"]) + return true; + }) + .onInterceptRequest((event) => { + console.info('onInterceptRequest getRequestUrl: ', event.request.getRequestUrl()); + console.info('onInterceptRequest isMainFrame: ', event.request.isMainFrame()); + console.info('onInterceptRequest isRedirect: ', event.request.isRedirect()); + console.info('onInterceptRequest isRequestGesture: ', event.request.isRequestGesture()); + let result = event.request.getRequestHeader(); + console.log('The request header result size is ' + result.length); + for (let i of result) { + console.log('The request header key is : ' + i.headerKey + ' , value is : ' + i.headerValue); + } + return this.webResourceResponse; + }) + .onPermissionRequest((event) => { + AlertDialog.show({ + title: 'title', + message: 'text', + confirm: { + value: 'onConfirm', + action: () => { + event.request.grant(event.request.getAccessibleResource()); + } + }, + cancel: () => { + event.request.deny(); + } + }) + }) + .onHttpErrorReceive((event) => { + console.log('setResponseHeader:' + event.response.setResponseHeader([])); + console.log('web getExtra:' + this.controller.getHitTestValue().getExtra()); + console.log('web getType:' + this.controller.getHitTestValue().getType()); + let result = event.request.getRequestHeader(); + console.log('The request header result size is ' + result.length); + for (let i of result) { + console.log('The request header key is : ' + i.headerKey + ' , value is : ' + i.headerValue); + } + let resph = event.response.getResponseHeader(); + console.log('The response header result size is ' + resph.length); + for (let i of resph) { + console.log('The response header key is : ' + i.headerKey + ' , value is : ' + i.headerValue); + } + }) + }.width("100%").height("100%") + } +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/app.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/app.ets new file mode 100644 index 000000000..6b29cb804 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/app.ets @@ -0,0 +1,33 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry' +import { Hypium } from 'hypium/index' +import testsuite from '../test/List.test' + +export default { + onCreate() { + console.info('Application onCreate') + var abilityDelegator: any + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + var abilityDelegatorArguments: any + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + console.info('start run testcase!!!') + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) + }, + onDestroy() { + console.info('Application onDestroy') + }, +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/pages/index.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/pages/index.ets new file mode 100644 index 000000000..0d0efe0a8 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestAbility/pages/index.ets @@ -0,0 +1,50 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import router from '@system.router'; + +@Entry +@Component +struct Index { + aboutToAppear() { + console.info('TestAbility index aboutToAppear') + } + + @State message: string = 'Hello World' + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + Button() { + Text('next page') + .fontSize(20) + .fontWeight(FontWeight.Bold) + }.type(ButtonType.Capsule) + .margin({ + top: 20 + }) + .backgroundColor('#0D9FFB') + .width('35%') + .height('5%') + .onClick(()=>{ + }) + } + .width('100%') + } + .height('100%') + } + } \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestRunner/OpenHarmonyTestRunner.ts b/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestRunner/OpenHarmonyTestRunner.ts new file mode 100644 index 000000000..07cb0b784 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/TestRunner/OpenHarmonyTestRunner.ts @@ -0,0 +1,78 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import TestRunner from '@ohos.application.testRunner' +import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry' + +var abilityDelegator = undefined +var abilityDelegatorArguments = undefined + +function translateParamsToString(parameters) { + const keySet = new Set([ + '-s class', '-s notClass', '-s suite', '-s itName', + '-s level', '-s testType', '-s size', '-s timeout', + '-s package' + ]) + let targetParams = ''; + for (const key in parameters) { + if (keySet.has(key)) { + targetParams += ' ' + key + ' ' + parameters[key] + } + } + return targetParams.trim() +} + +async function onAbilityCreateCallback() { + console.log('onAbilityCreateCallback'); +} + +async function addAbilityMonitorCallback(err: any) { + console.info('addAbilityMonitorCallback : ' + JSON.stringify(err)) +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + console.info('OpenHarmonyTestRunner OnPrepare') + } + + onRun() { + console.log('OpenHarmonyTestRunner onRun run') + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + + let lMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + }; + var testAbilityName = abilityDelegatorArguments.parameters['-p'] + '.MainAbility' + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) + var cmd = 'aa start -d 0 -a ' + testAbilityName + ' -b ' + abilityDelegatorArguments.bundleName + cmd += ' '+translateParamsToString(abilityDelegatorArguments.parameters) + console.info('cmd : '+cmd) + abilityDelegator.executeShellCommand(cmd, + (err: any, d: any) => { + console.info('executeShellCommand : err : ' + JSON.stringify(err)); + console.info('executeShellCommand : data : ' + d.stdResult); + console.info('executeShellCommand : data : ' + d.exitCode); + }) + console.info('OpenHarmonyTestRunner onRun call abilityDelegator.getAppContext') + var context = abilityDelegator.getAppContext() + console.info('getAppContext : ' + JSON.stringify(context)) + console.info('OpenHarmonyTestRunner onRun end') + } +}; \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/List.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/List.test.ets new file mode 100644 index 000000000..45ccbfd33 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/List.test.ets @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import animatorOnframeJsunit from './animator.test.ets'; +import curvesEaseOutJsunit from './curves.test.ets'; +import routerStandardJsunit from './router.test.ets'; +import uiAppearanceALWAYS_DARKJsunit from './uiAppearance.test.ets'; +import appVersionCodeJsunit from './app.test.ets'; +import alertDialogCenterStartJsunit from './alertDialog.test.ets'; +import canvasActualBoundingBoxAscentJsunit from './canvas.test.ets'; +import checkBoxGroupJsunit from './checkBox.test.ets'; +import checkBoxGroupPartJsunit from './checkBoxGroup.test.ets'; +import commonColorModeJsunit from './common.test.ets'; +import datePickerLunarJsunit from './datePicker.test.ets'; +import enumsCancelJsunit from './enums.test.ets'; +import gestureParallelJsunit from './gesture.test.ets'; +import listtestIdleJsunit from './listtest.test.ets'; +import loadingProgressCircularJsunit from './loadingProgress.test.ets'; +import progressScaleCountJsunit from './progress.test.ets'; +import radioGroupJsunit from './radio.test.ets'; +import refreshDragJsunit from './refresh.test.ets'; +import sidebarIconsJsunit from './sidebar.test.ets'; +import sliderMovingJsunit from './slider.test.ets'; +import stateManagementDARKJsunit from './stateManagement.test.ets'; +import stepperItemDisabledJsunit from './stepperItem.test.ets'; +import swiperMaskJsunit from './swiper.test.ets'; +import text_inputPhoneNumberJsunit from './text_input.test.ets'; +import unitsModuleNameJsunit from './units.test.ets'; +import webEditTextJsunit from './web.test.ets'; +import hoverEffectJsunit from './hoverEffect.test.ets'; +import responseTypeJsunit from './responseType.test.ets'; +import copyOptionJsunit from './copyOption.test.ets'; + +export default function testsuite() { + animatorOnframeJsunit() + curvesEaseOutJsunit() + routerStandardJsunit() + uiAppearanceALWAYS_DARKJsunit() + appVersionCodeJsunit() + alertDialogCenterStartJsunit() + canvasActualBoundingBoxAscentJsunit() + checkBoxGroupJsunit() + checkBoxGroupPartJsunit() + commonColorModeJsunit() + datePickerLunarJsunit() + enumsCancelJsunit() + gestureParallelJsunit() + listtestIdleJsunit() + loadingProgressCircularJsunit() + progressScaleCountJsunit() + radioGroupJsunit() + refreshDragJsunit() + sidebarIconsJsunit() + sliderMovingJsunit() + stateManagementDARKJsunit() + stepperItemDisabledJsunit() + swiperMaskJsunit() + text_inputPhoneNumberJsunit() + unitsModuleNameJsunit() + webEditTextJsunit() + hoverEffectJsunit() + responseTypeJsunit() + copyOptionJsunit() +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/Utils.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/Utils.ets new file mode 100644 index 000000000..aa94fe4f7 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/Utils.ets @@ -0,0 +1,118 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default class Utils { + static rect_left; + static rect_top; + static rect_right; + static rect_bottom; + static rect_value; + + static sleep(time) { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, time) + }).then(() => { + console.info(`sleep ${time} over...`) + }) + } + + static getComponentRect(key) { + let strJson = getInspectorByKey(key); + let obj = JSON.parse(strJson); + console.info("[getInspectorByKey] current component obj is: " + JSON.stringify(obj)); + let rectInfo = JSON.parse('[' + obj.$rect + ']') + console.info("[getInspectorByKey] rectInfo is: " + rectInfo); + this.rect_left = JSON.parse('[' + rectInfo[0] + ']')[0] + this.rect_top = JSON.parse('[' + rectInfo[0] + ']')[1] + this.rect_right = JSON.parse('[' + rectInfo[1] + ']')[0] + this.rect_bottom = JSON.parse('[' + rectInfo[1] + ']')[1] + return this.rect_value = { + "left": this.rect_left, "top": this.rect_top, "right": this.rect_right, "bottom": this.rect_bottom + } + } + + static async swipe(downX, downY, upX, upY, steps) { + console.info('start to swipe') + this.drags(downX, downY, upX, upY, steps, false) + } + + static async drag(downX, downY, upX, upY, steps) { + console.info('start to drag') + this.drags(downX, downY, upX, upY, steps, true) + } + + static async drags(downX, downY, upX, upY, steps, drag) { + var xStep; + var yStep; + var swipeSteps; + var ret; + xStep = 0; + yStep = 0; + ret = false; + swipeSteps = steps; + if (swipeSteps == 0) { + swipeSteps = 1; + } + xStep = (upX - downX) / swipeSteps; + yStep = (upY - downY) / swipeSteps; + console.info('move step is: ' + 'xStep: ' + xStep + ' yStep: ' + yStep) + var downPonit: TouchObject = { + id: 1, + x: downX, + y: downY, + type: TouchType.Down, + } + console.info('down touch started: ' + JSON.stringify(downPonit)) + sendTouchEvent(downPonit); + console.info('start to move') + if (drag) { + await this.sleep(500) + } + for (var i = 1;i <= swipeSteps; i++) { + var movePoint: TouchObject = { + id: 1, + x: downX + (xStep * i), + y: downY + (yStep * i), + type: TouchType.Move + } + console.info('move touch started: ' + JSON.stringify(movePoint)) + ret = sendTouchEvent(movePoint) + if (ret == false) { + break; + } + await this.sleep(5) + } + console.info('start to up') + if (drag) { + await this.sleep(100) + } + var upPoint: TouchObject = { + id: 1, + x: upX, + y: upY, + type: TouchType.Up, + } + console.info('up touch started: ' + JSON.stringify(upPoint)) + sendTouchEvent(upPoint) + await this.sleep(500) + } +} + + + + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/alertDialog.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/alertDialog.test.ets new file mode 100644 index 000000000..2dca5c993 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/alertDialog.test.ets @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +import events_emitter from '@ohos.events.emitter'; + +export default function alertDialogCenterStartJsunit() { + describe('alertDialogCenterStartTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/alertDialog', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get alertDialog state success " + JSON.stringify(pages)); + if (!("alertDialog" == pages.name)) { + console.info("get alertDialog state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push alertDialog page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push alertDialog page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("alertDialogCenterStart after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testalertDialogCenterStart0001 + * @tc.desic acealertDialogCenterStartEtsTest0001 + */ + it('testalertDialogCenterStart0001', 0, async function (done) { + console.info('alertDialogCenterStart testalertDialogCenterStart0011 START'); + await Utils.sleep(2000); + try { + var event = { + eventId: 81601, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testalertDialogCenterStart0001 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.Result).assertEqual(true); + console.info('testalertDialogCenterStart0011 END'); + done(); + } + console.info("testalertDialogCenterStart0001 click result is: " + JSON.stringify(sendEventByKey('CenterStartButton', 10, ""))); + events_emitter.on(event, callback); + } catch (err) { + console.info("testalertDialogCenterStart0001 on events_emitter err : " + JSON.stringify(err)); + } + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animate_play_mode.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animate_play_mode.test.ets new file mode 100644 index 000000000..d27f16274 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animate_play_mode.test.ets @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +export default function playModeReverseJsunit() { + describe('playModeReverseTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/animate_play_mode', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get animate_play_mode state success " + JSON.stringify(pages)); + if (!("PlayModeReverse" == pages.name)) { + console.info("get animate_play_mode state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push animate_play_mode page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push animate_play_mode page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("playModeReverse after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testPlayModeReverse0001 + * @tc.desic acePlayModeReverseEtsTest0001 + */ + it('testPlayModeReverse0001', 0, async function (done) { + console.info('PlayModeReverse testPlayModeReverse0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('Reverse'); + console.info("[testradioGroup0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.animation).assertEqual({ + duration: 3000, // 动画时长 + curve: Curve.EaseOut, // 动画曲线 + delay: 1000, // 动画延迟 + iterations: 1, // 播放次数 + playMode: PlayMode.Reverse // 动画模式 + }); + console.info("[testPlayModeReverse0001] width value :" + obj.$attrs.animation); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testPlayModeAlternate0001 + * @tc.desic acePlayModeAlternateEtsTest0009 + */ + it('testPlayModeAlternate0001', 0, async function (done) { + console.info('radioGroup testPlayModeAlternate0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('Alternate'); + console.info("[testPlayModeAlternate0001] component padding strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.animation).assertEqual({ + duration: 3000, + curve: Curve.EaseOut, + delay: 1000, + iterations: 1, + playMode: PlayMode.Alternate + }); + console.info("[testPlayModeAlternate0001] padding value :" + obj.$attrs.animation); + done(); + }); + + }) +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animator.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animator.test.ets new file mode 100644 index 000000000..24f65f9b3 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/animator.test.ets @@ -0,0 +1,202 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function animatorOnframeJsunit() { + describe('animatorOnframeTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/animator', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get animator state success " + JSON.stringify(pages)); + if (!("animator" == pages.name)) { + console.info("get animator state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push animator page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push animator page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("animatorOnframe after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testanimatorOnframe0001 + * @tc.desic aceanimatorOnframeEtsTest0001 + */ + it('testanimatorOnframe0001', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.width).assertEqual("100.00vp"); + console.info("[testanimatorOnframe0001] width value :" + obj.$attrs.width); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testanimatorOnframe0002 + * @tc.desic aceanimatorOnframeEtsTest0002 + */ + it('testanimatorOnframe0002', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0002] component height strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.height).assertEqual("70.00vp"); + console.info("[testanimatorOnframe0002] height value :" + obj.$attrs.height); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0003 + * @tc.name testanimatorOnframe0003 + * @tc.desic aceanimatorOnframeEtsTest0003 + */ + it('testanimatorOnframe0003', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0003 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0003] component fontSize strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.fontSize).assertEqual("20.00fp"); + console.info("[testanimatorOnframe0003] fontSize value :" + obj.$attrs.fontSize); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0004 + * @tc.name testanimatorOnframe0004 + * @tc.desic aceanimatorOnframeEtsTest0004 + */ + it('testanimatorOnframe0004', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0004 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0004] component opacity strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.opacity).assertEqual(1); + console.info("[testanimatorOnframe0004] opacity value :" + obj.$attrs.opacity); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0005 + * @tc.name testanimatorOnframe0005 + * @tc.desic aceanimatorOnframeEtsTest0005 + */ + it('testanimatorOnframe0005', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0005 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0005] component align strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.align).assertEqual("Alignment.TopStart"); + console.info("[testanimatorOnframe0005] align value :" + obj.$attrs.align); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0006 + * @tc.name testanimatorOnframe0006 + * @tc.desic aceanimatorOnframeEtsTest0006 + */ + it('testanimatorOnframe0006', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0006 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0006] component fontColor strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.fontColor).assertEqual("#FFCCCCCC"); + console.info("[testanimatorOnframe0006] fontColor value :" + obj.$attrs.fontColor); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0007 + * @tc.name testanimatorOnframe0007 + * @tc.desic aceanimatorOnframeEtsTest0007 + */ + it('testanimatorOnframe0007', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0007 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0007] component lineHeight strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.lineHeight).assertEqual("25.00fp"); + console.info("[testanimatorOnframe0007] lineHeight value :" + obj.$attrs.lineHeight); + done(); + }); + + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0009 + * @tc.name testanimatorOnframe0009 + * @tc.desic aceanimatorOnframeEtsTest0009 + */ + it('testanimatorOnframe0009', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe009 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0009] component padding strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.padding).assertEqual("10.00vp"); + console.info("[testanimatorOnframe0009] padding value :" + obj.$attrs.padding); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0010 + * @tc.name testanimatorOnframe0010 + * @tc.desic aceanimatorOnframeEtsTest0010 + */ + it('testanimatorOnframe0010', 0, async function (done) { + console.info('animatorOnframe testanimatorOnframe0010 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('onframeText'); + console.info("[testanimatorOnframe0010] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.textAlign).assertEqual("TextAlign.Left"); + console.info("[testanimatorOnframe0010] textAlign value :" + obj.$attrs.textAlign); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/app.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/app.test.ets new file mode 100644 index 000000000..d1d4b2271 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/app.test.ets @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import events_emitter from '@ohos.events.emitter'; +import Utils from './Utils.ets' + +export default function appVersionCodeJsunit() { + describe('appVersionCodeTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/app', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get app state success " + JSON.stringify(pages)); + if (!("app" == pages.name)) { + console.info("get app state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push app page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push app page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("appVersionCode after each called"); + }); + + it('testappVersionCode0011', 0, async function (done) { + console.info('appVersionCode testappVersionCode0011 START'); + await Utils.sleep(1000); + try { + var innerEvent = { + eventId: 60302, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testappVersionCode_0011 get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.Code).assertEqual("1"); + } + console.info("testappVersion click result is: " + JSON.stringify(sendEventByKey('versionCodeText', 10, ""))); + events_emitter.on(innerEvent, callback); + } catch (err) { + console.info("testappVersionCode_0011 on events_emitter err : " + JSON.stringify(err)); + } + console.info('testappVersionCode_0011 END'); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/canvas.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/canvas.test.ets new file mode 100644 index 000000000..27e88fa4f --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/canvas.test.ets @@ -0,0 +1,109 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function canvasActualBoundingBoxAscentJsunit() { + describe('canvasActualBoundingBoxAscentTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/canvas', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get canvas state success " + JSON.stringify(pages)); + if (!("canvas" == pages.name)) { + console.info("get canvas state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push canvas page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push canvas page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("canvasActualBoundingBoxAscent after each called"); + }); + + it('testcanvasAttributes0001', 0, async function (done) { + console.info('canvasAttributes0001 testcanvasAttributes0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('Canvas'); + console.info("[testcanvasAttributes0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Canvas'); + expect(obj.$attrs.width).assertEqual("100.00%"); + console.info("[testcanvasAttributes0001] width value :" + obj.$attrs.width); + done(); + }); + + it('testcanvasAttributes0002', 0, async function (done) { + console.info('canvasAttributes0002 testcanvasAttributes0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('Canvas'); + console.info("[testcanvasAttributes0002] component height strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Canvas'); + expect(obj.$attrs.height).assertEqual("100.00%"); + console.info("[testcanvasAttributes0002] height value :" + obj.$attrs.height); + done(); + }); + + it('testcanvasAttributes0003', 0, async function (done) { + console.info('canvasAttributes0003 testcanvasAttributes0003 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('Canvas'); + console.info("[testcanvasAttributes0003] component backgroundColor strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Canvas'); + expect(obj.$attrs.backgroundColor).assertEqual("#FFFFFF00"); + console.info("[testcanvasAttributes0003] backgroundColor value :" + obj.$attrs.backgroundColor); + done(); + }); + + it('testcanvasAttributes0004', 0, async function (done) { + console.info('canvasAttributes0003 testcanvasAttributes0004 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('Canvas'); + console.info("[testcanvasAttributes0004] component position strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Canvas'); + expect(obj.$attrs.position.x).assertEqual("3.00vp"); + console.info("[testcanvasAttributes0004] position value :" + obj.$attrs.position); + done(); + }); + + it('testcanvasAttributes0005', 0, async function (done) { + console.info('canvasAttributes0005 testcanvasAttributes0004 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('Canvas'); + console.info("[testcanvasAttributes0005] component align strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Canvas'); + expect(obj.$attrs.align).assertEqual("Alignment.Center"); + console.info("[testcanvasAttributes0005] align value :" + obj.$attrs.align); + done(); + }); + + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBox.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBox.test.ets new file mode 100644 index 000000000..753af21a4 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBox.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function checkBoxGroupJsunit() { + describe('checkBoxGroupTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/checkBox', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get checkBox state success " + JSON.stringify(pages)); + if (!("checkBox" == pages.name)) { + console.info("get checkBox state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push checkBox page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push checkBox page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("checkBoxGroup after each called"); + }); + + it('testcheckBoxGroup001', 0, async function (done) { + console.info('checkBoxGroup testcheckBoxGroup001 START'); + await Utils.sleep(2000); + try { + console.info("testcheckBoxGroup_0011 click result is: " + JSON.stringify(sendEventByKey('CheckboxGroup', 10, ""))); + let strJson = getInspectorByKey('Checkbox2'); + console.info("[testcheckBoxGroup001] component select strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Checkbox'); + expect(obj.$attrs.select).assertEqual("false"); + } catch (err) { + console.info("testcheckBoxGroup_0011 on click err : " + JSON.stringify(err)); + } + console.info('testcheckBoxGroup001 END'); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBoxGroup.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBoxGroup.test.ets new file mode 100644 index 000000000..55765c385 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/checkBoxGroup.test.ets @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import events_emitter from '@ohos.events.emitter'; +import Utils from './Utils.ets' + +export default function checkBoxGroupPartJsunit() { + describe('checkBoxGroupPartTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/checkBoxGroup', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get checkBoxGroup state success " + JSON.stringify(pages)); + if (!("checkBoxGroup" == pages.name)) { + console.info("get checkBoxGroup state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push checkBoxGroup page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push checkBoxGroup page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("checkBoxGroupPart after each called"); + }); + + it('testcheckBoxGroupPart0011', 0, async function (done) { + console.info('checkBoxGroupPart testcheckBoxGroupPart0011 START'); + await Utils.sleep(2000); + try { + console.info("testcheckBoxGroupPart_0011 click result is: " + JSON.stringify(sendEventByKey('CheckboxGroup', 10, ""))); + let strJson = getInspectorByKey('Checkbox2'); + console.info("[testcheckBoxGroupPart0011] component select strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Checkbox'); + expect(obj.$attrs.select).assertEqual("false"); + } catch (err) { + console.info("testcheckBoxGroupPart_0011 on click err : " + JSON.stringify(err)); + } + console.info('testcheckBoxGroupPart0011 END'); + done(); + }); + + it('testcheckBoxGroup0001', 0, async function (done) { + console.info('checkBoxGroup testcheckBoxGroup0001 START'); + await Utils.sleep(2000); + try { + console.info("testcheckBoxGroup0001 click result is: " + JSON.stringify(sendEventByKey('CheckboxGroup', 10, ""))); + var innerEvent = { + eventId: 60301, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testcheckBoxGroup0001 get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.STATUS).assertEqual(2); + done(); + } + events_emitter.on(innerEvent, callback); + } catch (err) { + console.info("testcheckBoxGroup0001 on click err : " + JSON.stringify(err)); + } + console.info('testcheckBoxGroup0001 END'); + }) + }) +} + diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/common.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/common.test.ets new file mode 100644 index 000000000..5d22eb6ec --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/common.test.ets @@ -0,0 +1,170 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function commonColorModeJsunit() { + describe('commonColorModeTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/common', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get common state success " + JSON.stringify(pages)); + if (!("common" == pages.name)) { + console.info("get common state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push common page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push common page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("commonColorMode after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0011 + * @tc.name testcommonColorMode0011 + * @tc.desic acecommonColorModeEtsTest0011 + */ + it('testcommonColorMode0011', 0, async function (done) { + console.info('commonColorMode testcommonColorMode0011 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('ThinText'); + console.info("[testcommonColorMode0011] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.backgroundBlurStyle).assertEqual(undefined); + console.info("[testcommonColorMode0011] backgroundBlurStyle value :" + obj.$attrs.backgroundBlurStyle); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0012 + * @tc.name testcommonColorMode0012 + * @tc.desic acecommonColorModeEtsTest0012 + */ + it('testcommonColorMode0012', 0, async function (done) { + console.info('commonColorMode testcommonColorMode0012 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('ThickText'); + console.info("[testcommonColorMode0012] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.backgroundBlurStyle).assertEqual(undefined); + console.info("[testcommonColorMode0012] backgroundBlurStyle value :" + obj.$attrs.backgroundBlurStyle); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_00017 + * @tc.name testcommonMiddle0001 + * @tc.desic acecommonMiddleEtsTest0001 + */ + it('testcommonMiddle0001', 0, async function (done) { + console.info('commonMiddle testcommonMiddle0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('middleText'); + console.info("[testcommonMiddle0001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + console.info("[testcommonMiddle0001] alignRules value :" + obj.$attrs.alignRules); + expect(obj.$attrs.alignRules).assertEqual(undefined); + console.info("[testcommonMiddle0001] alignRules value :" + obj.$attrs.alignRules); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_00018 + * @tc.name testcommonOutset0001 + * @tc.desic acecommonOutsetEtsTest0001 + */ + it('testcommonOutset0001', 0, async function (done) { + console.info('commonOutset testcommonOutset0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('outsetText'); + console.info("[testcommonOutset0001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + console.info("[testcommonOutset0001] borderImage value :" + obj.$attrs.borderImage); + expect(obj.$attrs.borderImage).assertEqual(undefined); + console.info("[testcommonOutset0001] borderImage value :" + obj.$attrs.borderImage); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_00019 + * @tc.name testcommonRepeat0001 + * @tc.desic acecommonRepeatEtsTest0001 + */ + it('testcommonRepeat0001', 0, async function (done) { + console.info('commonRepeat testcommonRepeat0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('RepeatText'); + console.info("[testcommonRepeat0001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.borderImage).assertEqual(undefined); + console.info("[testcommonOutset0001] borderImage value :" + obj.$attrs.borderImage); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_00020 + * @tc.name testcommonSpace0001 + * @tc.desic acecommonSpaceEtsTest0001 + */ + it('testcommonSpace0001', 0, async function (done) { + console.info('commonSpace testcommonSpace0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('SpaceText'); + console.info("[testcommonSpace0001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.borderImage).assertEqual(undefined); + console.info("[testcommonSpace0001] borderImage value :" + obj.$attrs.borderImage); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_00021 + * @tc.name testcommonSlice0001 + * @tc.desic acecommonSliceEtsTest0001 + */ + it('testcommonSlice0001', 0, async function (done) { + console.info('commonSlice testcommonSlice0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('sliceText'); + console.info("[testcommonSlice0001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + console.info("[testcommonSlice0001] borderImage value :" + obj.$attrs.borderImage); + expect(obj.$attrs.borderImage).assertEqual(undefined); + console.info("[testcommonSlice0001] borderImage value :" + obj.$attrs.borderImage); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/copyOption.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/copyOption.test.ets new file mode 100644 index 000000000..b12cd1d32 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/copyOption.test.ets @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function copyOptionJsunit() { + describe('copyOptionTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/copyOption', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get copyOption state success " + JSON.stringify(pages)); + if (!("copyOption" == pages.name)) { + console.info("get copyOption state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push copyOption page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push copyOption page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("copyOption after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testcopyOption0001 + * @tc.desic acecopyOptionEtsTest0001 + */ + it('testcopyOption0001', 0, async function (done) { + console.info('hoverEffect testcopyOption0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('InAppText'); + console.info("[testcopyOption0001] component copyOption strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.copyOption).assertEqual(undefined); + console.info("[testcopyOption0001] copyOption value :" + obj.$attrs.copyOption); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testcopyOption0002 + * @tc.desic acecopyOptionEtsTest0002 + */ + it('testcopyOption0002', 0, async function (done) { + console.info('hoverEffect testcopyOption0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('LocalDeviceText'); + console.info("[testcopyOption0002] component copyOption strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.copyOption).assertEqual(undefined); + console.info("[testcopyOption0002] copyOption value :" + obj.$attrs.copyOption); + done(); + }); + }) +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/curves.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/curves.test.ets new file mode 100644 index 000000000..677aeb0f4 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/curves.test.ets @@ -0,0 +1,262 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function curvesEaseOutJsunit() { + describe('curvesEaseOutTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/curves', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get curves state success " + JSON.stringify(pages)); + if (!("curves" == pages.name)) { + console.info("get curves state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(1000); + console.info("push curves page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push curves page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("curvesEaseOut after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testeaseOutText0001 + * @tc.desic aceeaseOutTextEtsTest0001 + */ + it('testeaseOutText0001', 0, async function (done){ + console.info('easeOutText testeaseOutText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('EaseOutText') + console.info("[testeaseOutText0001] component EaseOutText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testeaseOutText0001] width value :" + obj.$attrs.width); + console.info("[testeaseOutText0001] height value :" + obj.$attrs.height); + console.info("[testeaseOutText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testeaseInOutText0001 + * @tc.desic aceeaseInOutTextEtsTest0001 + */ + it('testeaseInOutText0001', 0, async function (done){ + console.info('easeInOutText testeaseInOutText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('EaseInOutText') + console.info("[testeaseInOutText0001] component EaseInOutText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testeaseInOutText0001] width value :" + obj.$attrs.width); + console.info("[testeaseInOutText0001] height value :" + obj.$attrs.height); + console.info("[testeaseInOutText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + console.info("[testeaseInOutText0001] animation value :" + obj.$attrs.animation); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testfastOutSlowInText0001 + * @tc.desic acefastOutSlowInTextEtsTest0001 + */ + it('testfastOutSlowInText0001', 0, async function (done){ + console.info('fastOutSlowInText testfastOutSlowInText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('FastOutSlowInText') + console.info("[testfastOutSlowInText0001] component fastOutSlowInText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testfastOutSlowInText0001] width value :" + obj.$attrs.width); + console.info("[testfastOutSlowInText0001] height value :" + obj.$attrs.height); + console.info("[testfastOutSlowInText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + console.info("[testfastOutSlowInText0001] animation value :" + obj.$attrs.animation); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testlinearOutSlowInText0001 + * @tc.desic acelinearOutSlowInTextEtsTest0001 + */ + it('testlinearOutSlowInText0001', 0, async function (done){ + console.info('linearOutSlowInText testlinearOutSlowInText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('LinearOutSlowInText') + console.info("[testlinearOutSlowInText0001] component linearOutSlowInText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testlinearOutSlowInText0001] width value :" + obj.$attrs.width); + console.info("[testlinearOutSlowInText0001] height value :" + obj.$attrs.height); + console.info("[testlinearOutSlowInText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + console.info("[testlinearOutSlowInText0001] animation value :" + obj.$attrs.animation); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testfastOutLinearInText0001 + * @tc.desic acefastOutLinearInTextEtsTest0001 + */ + it('testfastOutLinearInText0001', 0, async function (done){ + console.info('fastOutLinearInText testfastOutLinearInText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('fastOutLinearInText') + console.info("[testfastOutLinearInText0001] component fastOutLinearInText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testfastOutLinearInText0001] width value :" + obj.$attrs.width); + console.info("[testfastOutLinearInText0001] height value :" + obj.$attrs.height); + console.info("[testfastOutLinearInText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testextremeDecelerationText0001 + * @tc.desic aceextremeDecelerationTextEtsTest0001 + */ + it('testextremeDecelerationText0001', 0, async function (done){ + console.info('extremeDecelerationText testextremeDecelerationText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('ExtremeDecelerationText') + console.info("[testextremeDecelerationText0001] component extremeDecelerationText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testextremeDecelerationText0001] width value :" + obj.$attrs.width); + console.info("[testextremeDecelerationText0001] height value :" + obj.$attrs.height); + console.info("[testextremeDecelerationText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + console.info("[testextremeDecelerationText0001] animation value :" + obj.$attrs.animation); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testsharpText0001 + * @tc.desic acesharpTextEtsTest0001 + */ + it('testsharpText0001', 0, async function (done){ + console.info('sharpText testsharpText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('SharpText') + console.info("[testSharpText0001] component sharpText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testsharpText0001] width value :" + obj.$attrs.width); + console.info("[testsharpText0001] height value :" + obj.$attrs.height); + console.info("[testsharpText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testrhythmText0001 + * @tc.desic acerhythmTextEtsTest0001 + */ + it('testrhythmText0001', 0, async function (done){ + console.info('rhythmText testrhythmText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('RhythmText'); + console.info("[testrhythmText0001] component rhythmText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testrhythmText0001] width value :" + obj.$attrs.width); + console.info("[testrhythmText0001] height value :" + obj.$attrs.height); + console.info("[testrhythmText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testsmoothText0001 + * @tc.desic acesmoothTextEtsTest0001 + */ + it('testsmoothText0001', 0, async function (done){ + console.info('smoothText testsmoothText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('SmoothText'); + console.info("[testsmoothText0001] component smoothText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testsmoothText0001] width value :" + obj.$attrs.width); + console.info("[testsmoothText0001] height value :" + obj.$attrs.height); + console.info("[testsmoothText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testfrictionText0001 + * @tc.desic acefrictionTextEtsTest0001 + */ + it('testfrictionText0001', 0, async function (done){ + console.info('frictionText testfrictionText0001 START'); + await Utils.sleep(1000); + let strJson = getInspectorByKey('FrictionText'); + console.info("[testfrictionText0001] component frictionText strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Button'); + expect(obj.$attrs.width).assertEqual("400.00vp"); + expect(obj.$attrs.height).assertEqual("200.00vp"); + expect(obj.$attrs.backgroundColor).assertEqual("#FF317AFF"); + expect(obj.$attrs.animation).assertEqual(undefined); + console.info("[testfrictionText0001] width value :" + obj.$attrs.width); + console.info("[testfrictionText0001] height value :" + obj.$attrs.height); + console.info("[testfrictionText0001] backgroundColor value :" + obj.$attrs.backgroundColor); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/datePicker.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/datePicker.test.ets new file mode 100644 index 000000000..c95903484 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/datePicker.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function datePickerLunarJsunit() { + describe('datePickerLunarTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/datePicker', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get datePicker state success " + JSON.stringify(pages)); + if (!("datePicker" == pages.name)) { + console.info("get datePicker state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push datePicker page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push datePicker page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("datePickerLunar after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_001 + * @tc.name testdatePickerLunar001 + * @tc.desic acedatePickerLunarEtsTest001 + */ + it('testdatePickerLunar001', 0, async function (done) { + console.info('datePickerLunar testdatePickerLunar001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('DatePicker'); + console.info("[testdatePickerLunar001] component lunar strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('DatePicker'); + expect(obj.$attrs.lunar).assertEqual("true"); + console.info("[testdatePickerLunar001] lunar value :" + obj.$attrs.lunar); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/enums.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/enums.test.ets new file mode 100644 index 000000000..daf073cbe --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/enums.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function enumsCancelJsunit() { + describe('enumsCancelTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/enums', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get enums state success " + JSON.stringify(pages)); + if (!("enums" == pages.name)) { + console.info("get enums state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push enums page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push enums page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("enumsCancel after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testenumsCancel0001 + * @tc.desic aceenumsCancelEtsTest0001 + */ + it('testenumsCancel0001', 0, async function (done) { + console.info('enumsCancel testenumsCancel0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('HighlightText'); + console.info("[testenumsCancel0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.hoverEffect).assertEqual("HoverEffect.Highlight"); + console.info("[testenumsCancel0001] hoverEffect value :" + obj.$attrs.hoverEffect); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/fill_mode.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/fill_mode.test.ets new file mode 100644 index 000000000..c2985a5ce --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/fill_mode.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function fillModeForwardJsunit() { + describe('fillModeForwardTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/fill_mode', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get fill_mode state success " + JSON.stringify(pages)); + if (!("fill_mode" == pages.name)) { + console.info("get fill_mode state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push fill_mode page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push fill_mode page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("fillModeForward after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testfillModeForward0001 + * @tc.desic acefillModeForwardEtsTest0001 + */ + it('testfillModeForward0001', 0, async function (done) { + console.info('fillModeForward testfillModeForward0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('ImageAnimator'); + console.info("[testfillModeForward0001] component fillMode strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('ImageAnimator'); + expect(obj.$attrs.fillMode).assertEqual("FillMode.Forwards"); + console.info("[testfillModeForward0001] fillMode value :" + obj.$attrs.fillMode); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gesture.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gesture.test.ets new file mode 100644 index 000000000..5cc59adc0 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gesture.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function gestureParallelJsunit() { + describe('gestureParallelTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/gesture', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get gesture state success " + JSON.stringify(pages)); + if (!("gesture" == pages.name)) { + console.info("get gesture state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push gesture page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push gesture page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("gestureParallel after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testgestureParallel0001 + * @tc.desic acegestureParallelEtsTest0001 + */ + it('testgestureParallel0001', 0, async function (done) { + console.info('gestureParallel testgestureParallel0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('ParallelText'); + console.info("[testgestureParallel0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.width).assertEqual("320.00vp"); + console.info("[testgestureParallel0001] width value :" + obj.$attrs.width); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridCol.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridCol.test.ets new file mode 100644 index 000000000..a63d57bea --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridCol.test.ets @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function gridColXlJsunit() { + describe('gridColXlTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/gridCol', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get gridCol state success " + JSON.stringify(pages)); + if (!("gridCol" == pages.name)) { + console.info("get gridCol state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push gridCol page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push gridCol page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("gridColXl after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testgridColXl0001 + * @tc.desic acegridColXlEtsTest0001 + */ + it('testgridColXl0001', 0, async function (done) { + console.info('gridColXl testgridColXl0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('GridCol'); + console.info("[testgridColXl0001] component order strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('GridCol'); + expect(obj.$attrs.order).assertEqual("{xl: 10}"); + console.info("[testgridColXl0001] order value :" + obj.$attrs.order); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testgridColXl0002 + * @tc.desic acegridColXlEtsTest0002 + */ + it('testgridColXl0002', 0, async function (done) { + console.info('gridColXl testgridColXl0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('GridCol'); + console.info("[testgridColXl0002] component backgroundColor strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Color.Green'); + expect(obj.$attrs.backgroundColor).assertEqual("Color.Green"); + console.info("[testgridColXl0002] backgroundColor value :" + obj.$attrs.backgroundColor); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridRow.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridRow.test.ets new file mode 100644 index 000000000..e330facb7 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/gridRow.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function gridRowXlJsunit() { + describe('gridRowXlTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/gridRow', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get gridRow state success " + JSON.stringify(pages)); + if (!("gridRow" == pages.name)) { + console.info("get gridRow state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push gridRow page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push gridRow page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("gridRowXl after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testgridRowXl0001 + * @tc.desic acegridRowXlEtsTest0001 + */ + it('testgridRowXl0001', 0, async function (done) { + console.info('gridRowXl testgridRowXl0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('GridRowColumnOption——xl'); + console.info("[testgridRowXl0001] component backgroundColor strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('GridRow'); + expect(obj.$attrs.backgroundColor).assertEqual("Color.Red"); + console.info("[testgridRowXl0001] backgroundColor value :" + obj.$attrs.backgroundColor); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/hoverEffect.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/hoverEffect.test.ets new file mode 100644 index 000000000..7a321fdd9 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/hoverEffect.test.ets @@ -0,0 +1,83 @@ +//@ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function hoverEffectJsunit() { + describe('hoverEffectTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/hoverEffect', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get hoverEffect state success " + JSON.stringify(pages)); + if (!("hoverEffect" == pages.name)) { + console.info("get hoverEffect state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push hoverEffect page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push hoverEffect page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("hoverEffect after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testhoverEffect0001 + * @tc.desic acehoverEffectEtsTest0001 + */ + it('testhoverEffect0001', 0, async function (done) { + console.info('hoverEffect testhoverEffect0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('ScaleText'); + console.info("[testhoverEffect0001] component hoverEffect strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.hoverEffect).assertEqual(undefined); + console.info("[testhoverEffect0001] hoverEffect value :" + obj.$attrs.hoverEffect); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testhoverEffect0002 + * @tc.desic acehoverEffectEtsTest0002 + */ + it('testhoverEffect0002', 0, async function (done) { + console.info('hoverEffect testhoverEffect0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('HighlightText'); + console.info("[testhoverEffect0002] component hoverEffect strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.hoverEffect).assertEqual(undefined); + console.info("[testhoverEffect0002] hoverEffect value :" + obj.$attrs.hoverEffect); + done(); + }); + }) +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/listtest.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/listtest.test.ets new file mode 100644 index 000000000..adad4c0d0 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/listtest.test.ets @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +import events_emitter from '@ohos.events.emitter'; + +export default function listtestIdleJsunit() { + describe('listtestIdleTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/listtest', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get listtest state success " + JSON.stringify(pages)); + if (!("listtest" == pages.name)) { + console.info("get listtestI state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push listtest page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push listtest page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("listtestIdle after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testlisttestIdle0001 + * @tc.desic acelisttestIdleEtsTest0001 + */ + it('testlisttestIdle0001', 0, async function (done) { + console.info('listtestIdle testlisttestIdle0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('ScrollList'); + console.info("[testlisttestIdle0001] component controlButton strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('List'); + expect(obj.$attrs.editMode).assertEqual("true"); + console.info("[testlisttestIdle0001] editMode value :" + obj.$attrs.editMode); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/loadingProgress.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/loadingProgress.test.ets new file mode 100644 index 000000000..cea401c98 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/loadingProgress.test.ets @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function loadingProgressCircularJsunit() { + describe('loadingProgressCircularTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/loadingProgress', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get loadingProgress state success " + JSON.stringify(pages)); + if (!("loadingProgress" == pages.name)) { + console.info("get loadingProgress state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push loadingProgress page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push loadingProgress page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("loadingProgressCircular after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0011 + * @tc.name testloadingProgressCircular0011 + * @tc.desic aceloadingProgressCircularEtsTest0011 + */ + it('testloadingProgressCircular0011', 0, async function (done) { + console.info('loadingProgressCircular testloadingProgressCircular0010 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('CircularText'); + console.info("[testloadingProgressCircular0011] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.color).assertEqual(undefined); + expect(obj.$attrs.width).assertEqual('100.00vp'); + expect(obj.$attrs.margin).assertEqual('0.00px'); + console.info("[testloadingProgressCircular0011] color value :" + obj.$attrs.color); + console.info("[testloadingProgressCircular0011] width value :" + obj.$attrs.width); + console.info("[testloadingProgressCircular0011] margin value :" + obj.$attrs.margin); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testloadingProgressCircular0001 + * @tc.desic aceloadingProgressCircularEtsTest0011 + */ + it('testloadingProgressOrbital0001', 0, async function (done) { + console.info('loadingProgressOrbital testloadingProgressCircular0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('OrbitalText'); + console.info("[testloadingProgressOrbital0001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.color).assertEqual(undefined); + expect(obj.$attrs.width).assertEqual('100.00vp'); + expect(obj.$attrs.margin).assertEqual('0.00px'); + console.info("[testloadingProgressOrbital0001] color value :" + obj.$attrs.color); + console.info("[testloadingProgressOrbital0001] width value :" + obj.$attrs.width); + console.info("[testloadingProgressOrbital0001] margin value :" + obj.$attrs.margin); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/pluginComponent.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/pluginComponent.test.ets new file mode 100644 index 000000000..7ab1af399 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/pluginComponent.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function pluginComponentKVObjectJsunit() { + describe('pluginComponentKVObjectTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/pluginComponent', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get pluginComponent state success " + JSON.stringify(pages)); + if (!("pluginComponent" == pages.name)) { + console.info("get pluginComponent state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push pluginComponent page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push pluginComponent page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("pluginComponentKVObject after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testpluginComponentKVObject0001 + * @tc.desic acepluginComponentKVObjectEtsTest0001 + */ + it('testpluginComponentKVObject0001', 0, async function (done) { + console.info('pluginComponentKVObject testpluginComponentKVObject0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('pluginComponent'); + console.info("[testpluginComponentKVObject0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('PluginComponent'); + expect(obj.$attrs.size.width).assertEqual('500.00vp'); + console.info("[testpluginComponentKVObject0001] size.width value :" + obj.$attrs.size.width); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/progress.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/progress.test.ets new file mode 100644 index 000000000..ed59e82d5 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/progress.test.ets @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function progressScaleCountJsunit() { + describe('progressScaleCountTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/progress', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get progress state success " + JSON.stringify(pages)); + if (!("progress" == pages.name)) { + console.info("get progress state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push progress page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push progress page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("progressScaleCount after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testprogressScaleCount0001 + * @tc.desic aceprogressScaleCountEtsTest0001 + */ + it('testprogressScaleCount0001', 0, async function (done) { + console.info('progressScaleCount testprogressScaleCount0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('progressStyleOptions'); + console.info("[testprogressScaleCount0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Progress'); + expect(obj.$attrs.style.scaleCount).assertEqual("15"); + console.info("[testprogressScaleCount0001] style.scaleCount value :" + obj.$attrs.style.scaleCount); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testprogressScaleCount0002 + * @tc.desic aceprogressScaleCountEtsTest0002 + */ + it('testprogressScaleCount0002', 0, async function (done) { + console.info('progressScaleCount testprogressScaleCount0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('progressStyleOptions'); + console.info("[testprogressScaleCount0002] component height strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Progress'); + expect(obj.$attrs.style.scaleWidth).assertEqual('5.00vp'); + console.info("[testprogressScaleCount0002] style.scaleWidth value :" + obj.$attrs.style.scaleWidth); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/radio.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/radio.test.ets new file mode 100644 index 000000000..9413f4ab7 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/radio.test.ets @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function radioGroupJsunit() { + describe('radioGroupTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/radio', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get radio state success " + JSON.stringify(pages)); + if (!("radio" == pages.name)) { + console.info("get radio state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push radio page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push radio page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("radioGroup after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_001 + * @tc.name testradioGroup001 + * @tc.desic aceradioGroupEtsTest001 + */ + it('testradioGroup001', 0, async function (done) { + console.info('radioGroup testradioGroup001 START'); + await Utils.sleep(2000); + try { + console.info("testradioGroup_0011 click result is: " + JSON.stringify(sendEventByKey('RadioTwo', 10, ""))); + let strJson = getInspectorByKey('RadioOne'); + console.info("[testradioGroup001] component checked strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Radio'); + expect(obj.$attrs.checked).assertEqual("true"); + console.info("[testradioGroup001] checked value :" + obj.$attrs.checked); + } catch (err) { + console.info("testradioGroup_0011 on click err : " + JSON.stringify(err)); + } + console.info('testradioGroup001 END'); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/refresh.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/refresh.test.ets new file mode 100644 index 000000000..d8eeefd2e --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/refresh.test.ets @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +import events_emitter from '@ohos.events.emitter'; + +export default function refreshDragJsunit() { + describe('refreshDragTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/refresh', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get refresh state success " + JSON.stringify(pages)); + if (!("refresh" == pages.name)) { + console.info("get refresh state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push refresh page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push refresh page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("refreshDrag after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0011 + * @tc.name testrefreshDrag0011 + * @tc.desic acerefreshDragEtsTest0011 + */ + it('testrefreshDrag0011', 0, async function (done) { + console.info('refreshDrag testrefreshDrag0011 START'); + await Utils.sleep(2000); + try { + var event = { + eventId: 60304, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testrefreshDrag0011 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.Result).assertEqual(true); + done(); + } + console.info("testrefreshDrag0011 click result is: " + JSON.stringify(sendEventByKey('Refresh', 10, ""))); + events_emitter.on(event, callback); + } catch (err) { + console.info("testrefreshDrag0011 on events_emitter err : " + JSON.stringify(err)); + } + console.info('testrefreshDrag0011 END'); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0012 + * @tc.name testrefreshRefresh0001 + * @tc.desic acerefreshRefreshEtsTest0001 + */ + it('testrefreshRefresh0001', 0, async function (done) { + console.info('refreshDrag testrefreshRefresh0001 START'); + await Utils.sleep(2000); + try { + var eventTwo = { + eventId: 60305, + priority: events_emitter.EventPriority.LOW + } + var callbackTwo = (eventData) => { + console.info("testrefreshRefresh0001 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.Result).assertEqual(true); + done(); + } + console.info("testrefreshRefresh0001 click result is: " + JSON.stringify(sendEventByKey('Refresh', 10, ""))); + events_emitter.on(eventTwo, callbackTwo); + } catch (err) { + console.info("testrefreshRefresh0001 on events_emitter err : " + JSON.stringify(err)); + } + console.info('testrefreshRefresh0001 END'); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/remoteWindow.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/remoteWindow.test.ets new file mode 100644 index 000000000..1dc2d8ac0 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/remoteWindow.test.ets @@ -0,0 +1,220 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function remoteWindowJsunit() { + describe('remoteWindowTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/remoteWindow', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get remoteWindow state success " + JSON.stringify(pages)); + if (!("remoteWindow" == pages.name)) { + console.info("get RemoteWindow state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push remoteWindow page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push remoteWindow page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("remoteWindow after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testremoteWindow0001 + * @tc.desic acesremoteWindowEtsTest0001 + */ + it('testRemoteWindow0001', 0, async function (done) { + console.info('remoteWindow testRemoteWindow0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0001] component width strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.width).assertEqual('100.00vp'); + console.info("[testRemoteWindow0001] width value :" + obj.$attrs.width); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testRemoteWindow0002 + * @tc.desic aceRemoteWindowEtsTest0002 + */ + it('testRemoteWindow0002', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0002] component height strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.height).assertEqual('70.00vp'); + console.info("[testRemoteWindow0002] height value :" + obj.$attrs.height); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0003 + * @tc.name testRemoteWindow0003 + * @tc.desic aceRemoteWindowEtsTest0003 + */ + it('testRemoteWindow0003', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0003 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0003] component fontSize strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.fontSize).assertEqual('20.00fp'); + console.info("[testRemoteWindow0003] fontSize value :" + obj.$attrs.fontSize); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0004 + * @tc.name testRemoteWindow0004 + * @tc.desic aceRemoteWindowEtsTest0004 + */ + it('testRemoteWindow0004', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0004 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0004] component opacity strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.opacity).assertEqual(1); + console.info("[testRemoteWindow0004] opacity value :" + obj.$attrs.opacity); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0005 + * @tc.name testRemoteWindow0005 + * @tc.desic aceRemoteWindowEtsTest0005 + */ + it('testRemoteWindow0005', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0005 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0005] component align strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.align).assertEqual('Alignment.TopStart'); + console.info("[testRemoteWindow0005] align value :" + obj.$attrs.align); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0006 + * @tc.name testRemoteWindow0006 + * @tc.desic aceRemoteWindowEtsTest0006 + */ + it('testRemoteWindow0006', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0006 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0006] component fontColor strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.fontColor).assertEqual('#FFCCCCCC'); + console.info("[testRemoteWindow0006] fontColor value :" + obj.$attrs.fontColor); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0007 + * @tc.name testRemoteWindow0007 + * @tc.desic aceRemoteWindowEtsTest0007 + */ + it('testRemoteWindow0007', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0007 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0007] component lineHeight strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.lineHeight).assertEqual('25.00fp'); + console.info("[testRemoteWindow0007] lineHeight value :" + obj.$attrs.lineHeight); + done(); + }); + + + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0009 + * @tc.name testRemoteWindow0009 + * @tc.desic aceRemoteWindowEtsTest0009 + */ + it('testRemoteWindow0009', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow009 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0009] component padding strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.padding).assertEqual('10.00vp'); + console.info("[testRemoteWindow0009] padding value :" + obj.$attrs.padding); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0010 + * @tc.name testRemoteWindow0010 + * @tc.desic aceRemoteWindowEtsTest0010 + */ + it('testRemoteWindow0010', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0010 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0010] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.textAlign).assertEqual('TextAlign.Left'); + console.info("[testRemoteWindow0010] textAlign value :" + obj.$attrs.textAlign); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0011 + * @tc.name testRemoteWindow0011 + * @tc.desic aceRemoteWindowEtsTest0011 + */ + it('testRemoteWindow0011', 0, async function (done) { + console.info('RemoteWindow testRemoteWindow0011 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('formComponentFormDimensionWindowBoundsText'); + console.info("[testRemoteWindow0011] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Swiper'); + expect(obj.$attrs.indicatorStyle).assertEqual({ mask: false }); + console.info("[testRemoteWindow0011] indicatorStyle value :" + obj.$attrs.indicatorStyle); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/responseType.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/responseType.test.ets new file mode 100644 index 000000000..2722356a1 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/responseType.test.ets @@ -0,0 +1,83 @@ +//@ts-nocheck +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function responseTypeJsunit() { + describe('responseTypeTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/responseType', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get responseType state success " + JSON.stringify(pages)); + if (!("responseType" == pages.name)) { + console.info("get responseType state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push responseType page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push responseType page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("responseType after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testresponseType0002 + * @tc.desic acehoverEffectEtsTest0002 + */ + it('testresponseType0002', 0, async function (done) { + console.info('responseType testresponseType0002 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('RightClickText'); + console.info("[testresponseType0002] component bindContextMenu strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.bindContextMenu).assertEqual("ResponseType.LongPress"); + console.info("[testresponseType0002] bindContextMenu value :" + obj.$attrs.bindContextMenu); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0003 + * @tc.name testhoverEffect0003 + * @tc.desic acehoverEffectEtsTest0003 + */ + it('testresponseType0003', 0, async function (done) { + console.info('responseType testresponseType0003 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('LongPressText'); + console.info("[testresponseType0003] component bindContextMenu strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.bindContextMenu).assertEqual("ResponseType.LongPress"); + console.info("[testresponseType0003] bindContextMenu value :" + obj.$attrs.bindContextMenu); + done(); + }); + }) +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/router.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/router.test.ets new file mode 100644 index 000000000..955c82893 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/router.test.ets @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +import events_emitter from '@ohos.events.emitter'; + +export default function routerStandardJsunit() { + describe('routerStandardTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/router', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get router state success " + JSON.stringify(pages)); + if (!("router" == pages.name)) { + console.info("get router state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push router page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push router page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("routerStandard after each called"); + }); + + it('testrouterStandard0011', 0, async function (done) { + console.info('routerStandard testrouterStandard0011 START'); + await Utils.sleep(2000); + try { + var standardEvent = { + eventId: 101, + priority: events_emitter.EventPriority.LOW + } + var callback1 = (eventData) => { + console.info("testrouterStandard_0011 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.ArrayData).assertEqual("45"); + done(); + } + console.info("testrouterStandard_0011 click result1 is: " + JSON.stringify(sendEventByKey('StandardText', 10, ""))); + await Utils.sleep(2000); + console.info("testrouterStandard_0011 click result2 is: " + JSON.stringify(sendEventByKey('DataText', 10, ""))); + events_emitter.on(standardEvent, callback1); + } catch (err) { + console.info("testrouterStandard_0011 on events_emitter err : " + JSON.stringify(err)); + } + console.info('testrouterStandard0011 END'); + }); + + it('testrouterSingle0001', 0, async function (done) { + console.info('routerSingle testrouterSingle0001 START'); + await Utils.sleep(2000); + try { + var singleEvent = { + eventId: 102, + priority: events_emitter.EventPriority.LOW + } + var callback2 = (eventData) => { + console.info("testrouterSingle_0001 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.ArrayData).assertEqual("46"); + done(); + } + console.info("testrouterSingle_0001 click result1 is: " + JSON.stringify(sendEventByKey('SingleText', 10, ""))); + await Utils.sleep(2000); + console.info("testrouterSingle_0001 click result2 is: " + JSON.stringify(sendEventByKey('SingleDataText', 10, ""))); + events_emitter.on(singleEvent, callback2); + } catch (err) { + console.info("testrouterSingle_0001 on events_emitter err : " + JSON.stringify(err)); + } + console.info('testrouterSingle_0001 END'); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/scrollEdge.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/scrollEdge.test.ets new file mode 100644 index 000000000..a14e5555c --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/scrollEdge.test.ets @@ -0,0 +1,61 @@ +import router from '@system.router'; +import events_emitter from '@ohos.events.emitter'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function ScrollExampleJsunit() { + describe('ScrollExampleTest', function () { + beforeAll(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/scroll_edge', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get scroll_edge state success " + JSON.stringify(pages)); + if (!("ScrollExample" == pages.name)) { + console.info("get scroll_edge state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push scroll_edge page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push scroll_edge page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("ScrollExample after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testscrollEdgeMiddle0001 + * @tc.desic acescrollEdgeMiddleEtsTest0001 + */ + it('testscrollEdgeMiddle0001', 0, async function (done) { + console.info('scrollEdgeMiddle testscrollEdgeMiddle0001 START'); + + await Utils.sleep(2000); + try { + var innerEventOne = { + eventId: 60306, + priority: events_emitter.EventPriority.LOW + } + var callback1 = (eventData) => { + console.info("testscrollEdgeMiddle0001 get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.STATUS).assertEqual(true); + done(); + } + console.info("onSelect_0012 click result is: " + JSON.stringify(sendEventByKey('MiddleText', 10, ""))); + events_emitter.on(innerEventOne, callback1); + } catch (err) { + console.info("testscrollEdgeMiddle0001 on events_emitter err : " + JSON.stringify(err)); + } + console.info('testscrollEdgeMiddle0001 END'); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/sidebar.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/sidebar.test.ets new file mode 100644 index 000000000..ec91cfaa0 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/sidebar.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function sidebarIconsJsunit() { + describe('sidebarIconsTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/sidebar', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get sidebar state success " + JSON.stringify(pages)); + if (!("sidebarIcons" == pages.name)) { + console.info("get sidebar state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push sidebar page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push sidebar page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("sidebarIcons after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0011 + * @tc.name testsidebarIcons0011 + * @tc.desic acesidebarIconsEtsTest0011 + */ + it('testsidebarIcons0011', 0, async function (done) { + console.info('sidebarIcons testsidebarIcons0011 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('SideBarContainer'); + console.info("[testsidebarIcons0011] component controlButton strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('SideBarContainer'); + expect(obj.$attrs.controlButton.icons).assertEqual(undefined); + console.info("[testsidebarIcons0011] controlButton value :" + obj.$attrs.controlButton); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/slider.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/slider.test.ets new file mode 100644 index 000000000..4fc8e17b0 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/slider.test.ets @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +import events_emitter from '@ohos.events.emitter'; + +export default function sliderMovingJsunit() { + describe('sliderMovingTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/slider', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get slider state success " + JSON.stringify(pages)); + if (!("sliderMoving" == pages.name)) { + console.info("get slider state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push slider page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push slider page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("sliderMoving after each called"); + }); + + it('testsliderMoving0011', 0, async function (done) { + console.info('sliderMoving testsliderMoving0011 START'); + await Utils.sleep(2000); + try { + var event = { + eventId: 60307, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testsliderMoving0011 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.Mode).assertEqual(false); + done(); + } + console.info("testsliderMoving0011 click result is: " + JSON.stringify(sendEventByKey('Slider', 10, ""))); + events_emitter.on(event, callback); + } catch (err) { + console.info("testsliderMoving0011 on events_emitter err : " + JSON.stringify(err)); + } + console.info('testsliderMoving0011 END'); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stateManagement.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stateManagement.test.ets new file mode 100644 index 000000000..3da471d3e --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stateManagement.test.ets @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function stateManagementDARKJsunit() { + describe('stateManagementDARKTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/stateManagement', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get stateManagement state success " + JSON.stringify(pages)); + if (!("stateManagement" == pages.name)) { + console.info("get stateManagement state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push stateManagement page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push stateManagement page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("stateManagementDARK after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_001 + * @tc.name teststateManagementDARK001 + * @tc.desic acestateManagementDARKEtsTest001 + */ + it('teststateManagementDARK001', 0, async function (done) { + console.info('stateManagementDARK teststateManagementDARK001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('DARKText'); + console.info("[teststateManagementDARK001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.backgroundColor).assertEqual('#FF000001'); + console.info("[teststateManagementDARK001] backgroundColor value :" + obj.$attrs.backgroundColor); + done(); + }); + + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stepperItem.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stepperItem.test.ets new file mode 100644 index 000000000..806c0a2a2 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/stepperItem.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function stepperItemDisabledJsunit() { + describe('stepperItemDisabledTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/stepperItem', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get stepperItem state success " + JSON.stringify(pages)); + if (!("stepperItem" == pages.name)) { + console.info("get stepperItem state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push stepperItem page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push stepperItem page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("stepperItemDisabled after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name teststepperItemDisabled0001 + * @tc.desic acestepperItemDisabledEtsTest0001 + */ + it('teststepperItemDisabled0001', 0, async function (done) { + console.info('stepperItemDisabled teststepperItemDisabled0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('StepperItem'); + console.info("[teststepperItemDisabled0001] component status strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('StepperItem'); + expect(obj.$attrs.status).assertEqual("ItemState.Disabled"); + console.info("[teststepperItemDisabled0001] status value :" + obj.$attrs.status); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/swiper.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/swiper.test.ets new file mode 100644 index 000000000..8e1e908a5 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/swiper.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function swiperMaskJsunit() { + describe('swiperMaskTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/swiper', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get swiper state success " + JSON.stringify(pages)); + if (!("swiper" == pages.name)) { + console.info("get swiper state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push swiper page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push swiper page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("swiperMask after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_001 + * @tc.name testswiperMask001 + * @tc.desic aceswiperMaskEtsTest001 + */ + it('testswiperMask001', 0, async function (done) { + console.info('swiperMask testswiperMask001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('maskSwiper'); + console.info("[testswiperMask001] component textAlign strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Swiper'); + expect(obj.$attrs.indicatorStyle.mask).assertEqual(undefined); + console.info("[testswiperMask001] indicatorStyle value :" + obj.$attrs.indicatorStyle.mask); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/text_input.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/text_input.test.ets new file mode 100644 index 000000000..71523e4c4 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/text_input.test.ets @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function text_inputPhoneNumberJsunit() { + describe('text_inputPhoneNumberTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/text_input', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get text_input state success " + JSON.stringify(pages)); + if (!("text_input" == pages.name)) { + console.info("get text_input state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push text_input page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push text_input page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("text_inputPhoneNumber after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testtext_inputPhoneNumber0001 + * @tc.desic acetext_inputPhoneNumberEtsTest0001 + */ + it('testtext_inputPhoneNumber0001', 0, async function (done) { + console.info('text_inputPhoneNumber testtext_inputPhoneNumber0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('PhoneNumberText'); + console.info("[testtext_inputPhoneNumber0001] component type strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('TextInput'); + expect(obj.$attrs.type).assertEqual('InputType.Normal'); + console.info("[testtext_inputPhoneNumber0001] type value :" + obj.$attrs.type); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/uiAppearance.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/uiAppearance.test.ets new file mode 100644 index 000000000..444381d88 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/uiAppearance.test.ets @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +import events_emitter from '@ohos.events.emitter'; + +export default function uiAppearanceALWAYS_DARKJsunit() { + describe('uiAppearanceALWAYS_DARKTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/uiAppearance', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get uiAppearance state success " + JSON.stringify(pages)); + if (!("uiAppearance" == pages.name)) { + console.info("get uiAppearance state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push uiAppearance page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push uiAppearance page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("uiAppearanceALWAYS_DARK after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testuiAppearanceALWAYS_DARK0001 + * @tc.desic aceuiAppearanceALWAYS_DARKEtsTest0001 + */ + it('testuiAppearanceALWAYS_DARK0001', 0, async function (done) { + console.info('uiAppearanceALWAYS_DARK testuiAppearanceALWAYS_DARK0001 START'); + await Utils.sleep(2000); + try { + var event = { + eventId: 60308, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testuiAppearanceALWAYS_DARK0001 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.Mode).assertEqual(0); + console.info('testuiAppearanceALWAYS_DARK0001 END'); + done(); + } + console.info("testuiAppearanceALWAYS_DARK0001 click result is: " + JSON.stringify(sendEventByKey('ALWAYS_DARKText', 10, ""))); + events_emitter.on(event, callback); + } catch (err) { + console.info("testuiAppearanceALWAYS_DARK0001 on events_emitter err : " + JSON.stringify(err)); + } + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testuiAppearanceALWAYS_LIGHT0001 + * @tc.desic aceuiAppearanceALWAYS_LIGHTEtsTest0001 + */ + it('testuiAppearanceALWAYS_LIGHT0001', 0, async function (done) { + console.info('uiAppearanceALWAYS_LIGHT testuiAppearanceALWAYS_LIGHT0001 START'); + await Utils.sleep(2000); + try { + var event = { + eventId: 60309, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testuiAppearanceALWAYS_LIGHT0001 get event data is: " + JSON.stringify(eventData)); + expect(eventData.data.Mode).assertEqual(1); + console.info('testuiAppearanceALWAYS_LIGHT0001 END'); + done(); + } + console.info("testuiAppearanceALWAYS_LIGHT0001 click result is: " + JSON.stringify(sendEventByKey('ALWAYS_LIGHTText', 10, ""))); + events_emitter.on(event, callback); + } catch (err) { + console.info("testuiAppearanceALWAYS_LIGHT0001 on events_emitter err : " + JSON.stringify(err)); + } + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/units.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/units.test.ets new file mode 100644 index 000000000..c0520d73d --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/units.test.ets @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' +import events_emitter from '@ohos.events.emitter'; + +export default function unitsModuleNameJsunit() { + describe('unitsModuleNameTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/units', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get units state success " + JSON.stringify(pages)); + if (!("units" == pages.name)) { + console.info("get units state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push units page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push units page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("unitsModuleName after each called"); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0001 + * @tc.name testunitsModuleName0001 + * @tc.desic aceunitsModuleNameEtsTest0001 + */ + it('testunitsModuleName0001', 0, async function (done) { + console.info('unitsModuleName testunitsModuleName0001 START'); + await Utils.sleep(2000); + try { + console.info("testunitsModuleName0001 click result is: " + JSON.stringify(sendEventByKey('moduleNameText', 10, ""))); + var innerEvent = { + eventId: 60310, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testunitsModuleName0001 get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.ModuleName).assertEqual(true); + } + events_emitter.on(innerEvent, callback); + } catch (err) { + console.info("testunitsModuleName0001 on click err : " + JSON.stringify(err)); + } + console.info('testunitsModuleName0001 END'); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testunitsGlobalPosition0001 + * @tc.desic aceunitsGlobalPositionEtsTest0001 + */ + it('testunitsGlobalPosition0001', 0, async function (done) { + console.info('unitsModuleName testunitsGlobalPosition0001 START'); + await Utils.sleep(2000); + try { + console.info("testunitsGlobalPosition0001 click result is: " + JSON.stringify(sendEventByKey('globalPositionText', 10, ""))); + var innerEvent = { + eventId: 60311, + priority: events_emitter.EventPriority.LOW + } + var callback = (eventData) => { + console.info("testunitsGlobalPosition0001 get event state result is: " + JSON.stringify(eventData)); + expect(eventData.data.Result).assertEqual(true); + } + events_emitter.on(innerEvent, callback); + } catch (err) { + console.info("testunitsGlobalPosition0001 on click err : " + JSON.stringify(err)); + } + console.info('testunitsGlobalPosition0001 END'); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0003 + * @tc.name testunitsMinWidth0001 + * @tc.desic aceunitsMinWidthEtsTest0001 + */ + it('testunitsMinWidth0001', 0, async function (done) { + console.info('unitsModuleName testunitsMinWidth0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('minWidthText'); + console.info("[testunitsMinWidth0001] component constraintSize strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + expect(obj.$attrs.constraintSize).assertEqual('{"minWidth":"200.00vp","minHeight":"0.00vp","maxWidth":"119846208990821053862485980936868943386622755140025217957449185986963312195176500631099345318391471397553524277795258607297703698567960268420438325781003880454605934667138922450849236563878474354509650486846713237047577973081895276546573889957650195146049445629577007136228474373133005395361920118602782998528.00vp","maxHeight":"0.00vp"}'); + console.info("[testunitsMinWidth0001] constraintSize value :" + obj.$attrs.constraintSize); + done(); + }); + + /* + * @tc.number SUB_ACE_BASIC_ETS_API_0002 + * @tc.name testunitsMinWidth0002 + * @tc.desic aceunitsMinWidthEtsTest0002 + */ + it('testunitsMinWidth0002', 0, async function (done) { + console.info('unitsModuleName testunitsMinWidth0001 START'); + await Utils.sleep(2000); + let strJson = getInspectorByKey('minWidthText'); + console.info("[testunitsMinWidth0002] component constraintSize strJson:" + strJson); + let obj = JSON.parse(strJson); + expect(obj.$type).assertEqual('Text'); + let constraintSize = JSON.parse(obj.$attrs.constraintSize); + console.info("[testunitsMinWidth0002] constraintSize is : " + constraintSize); + expect(obj.$attrs.constraintSize.minWidth).assertEqual(undefined); + console.info("[testunitsMinWidth0002] constraintSize value :" + obj.$attrs.constraintSize); + done(); + }); + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/web.test.ets b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/web.test.ets new file mode 100644 index 000000000..7c0517d01 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/ets/test/web.test.ets @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@system.router'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from "hypium/index" +import Utils from './Utils.ets' + +export default function webEditTextJsunit() { + describe('webEditTextTest', function () { + beforeEach(async function (done) { + console.info("flex beforeEach start"); + let options = { + uri: 'pages/web', + } + try { + router.clear(); + let pages = router.getState(); + console.info("get web state success " + JSON.stringify(pages)); + if (!("web" == pages.name)) { + console.info("get web state success " + JSON.stringify(pages.name)); + let result = await router.push(options); + await Utils.sleep(2000); + console.info("push web page success " + JSON.stringify(result)); + } + } catch (err) { + console.error("push web page error: " + err); + } + done() + }); + + afterEach(async function () { + await Utils.sleep(1000); + console.info("webEditText after each called"); + }); + + }) +} diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/color.json b/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/color.json new file mode 100644 index 000000000..68f8331ba --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "color_hello", + "value": "#ffff0000" + }, + { + "name": "color_world", + "value": "#ff0000ff" + } + ] +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/float.json b/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/float.json new file mode 100644 index 000000000..f26020ff0 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/float.json @@ -0,0 +1,12 @@ +{ + "float":[ + { + "name":"font_hello", + "value":"28.0fp" + }, + { + "name":"font_world", + "value":"20.0fp" + } + ] +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/string.json b/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/string.json new file mode 100644 index 000000000..fa13b27d7 --- /dev/null +++ b/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/element/string.json @@ -0,0 +1,36 @@ +{ + "string": [ + { + "name": "entry_MainAbility", + "value": "entry_MainAbility" + }, + { + "name": "MainAbility_label", + "value": "MainAbility_label" + }, + { + "name": "description_mainability", + "value": "ETS_Empty Ability" + }, + { + "name": "TestAbility_desc", + "value": "description" + }, + { + "name": "TestAbility_label", + "value": "label" + }, + { + "name":"string_hello", + "value":"Hello" + }, + { + "name":"string_world", + "value":"World" + }, + { + "name":"message_arrive", + "value":"We will arrive at %s." + } + ] +} \ No newline at end of file diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/media/icon.png b/arkui/ace_ets_component_attrlack/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 X_dWkWF{lQ(0EB|b00c$@>J~r%p=MPk literal 0 HcmV?d00001 diff --git a/arkui/ace_ets_component_attrlack/entry/src/main/resources/rawfile/bg4.png b/arkui/ace_ets_component_attrlack/entry/src/main/resources/rawfile/bg4.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f11a8f4f8296e2532f5a37bafd0d2f39bd2c17 GIT binary patch literal 21596 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

f#n9oiKZazuPS~m3jRW*|TAo4L;$Mvf{Ht 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 literal 0 HcmV?d00001 -- GitLab