diff --git a/code/Project/Test/README_zh.md b/code/Project/Test/README_zh.md index a463a83d0a691e0a98881a5531b5be51c4f17750..f05fbf0e787a35a4d85478b2ec261e5b007ca5b9 100644 --- a/code/Project/Test/README_zh.md +++ b/code/Project/Test/README_zh.md @@ -22,6 +22,7 @@ Test |-----jsunit 单元测试框架示例 |-----uitest UI测试框架示例 + |-----perftest 性能测试示例 ``` ## 具体实现 @@ -35,6 +36,9 @@ Test > 相关功能实现,请查看具体代码实现 +### perftest性能测试内容 +- perftest性能测试使用示例。 + ## 相关权限 不涉及 diff --git a/code/Project/Test/perftest/AppScope/app.json5 b/code/Project/Test/perftest/AppScope/app.json5 new file mode 100644 index 0000000000000000000000000000000000000000..108e88ed678d848185803f443c663e01c16f078b --- /dev/null +++ b/code/Project/Test/perftest/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2025 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. + */ + +{ + "app": { + "bundleName": "com.samples.test.perftest", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:layered_image", + "label": "$string:app_name" + } +} diff --git a/code/Project/Test/perftest/AppScope/resources/base/element/string.json b/code/Project/Test/perftest/AppScope/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..45f81d0b80e63aa06d3a42b9807bbab7ba951df0 --- /dev/null +++ b/code/Project/Test/perftest/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "perftest" + } + ] +} diff --git a/code/Project/Test/perftest/AppScope/resources/base/media/background.png b/code/Project/Test/perftest/AppScope/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f Binary files /dev/null and b/code/Project/Test/perftest/AppScope/resources/base/media/background.png differ diff --git a/code/Project/Test/perftest/AppScope/resources/base/media/foreground.png b/code/Project/Test/perftest/AppScope/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..97014d3e10e5ff511409c378cd4255713aecd85f Binary files /dev/null and b/code/Project/Test/perftest/AppScope/resources/base/media/foreground.png differ diff --git a/code/Project/Test/perftest/AppScope/resources/base/media/layered_image.json b/code/Project/Test/perftest/AppScope/resources/base/media/layered_image.json new file mode 100644 index 0000000000000000000000000000000000000000..fb49920440fb4d246c82f9ada275e26123a2136a --- /dev/null +++ b/code/Project/Test/perftest/AppScope/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/code/Project/Test/perftest/README_zh.md b/code/Project/Test/perftest/README_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..eec327f7bb84085a25a3352ef2b76f2a2622189d --- /dev/null +++ b/code/Project/Test/perftest/README_zh.md @@ -0,0 +1,68 @@ +# 测试框架 +### 介绍 +本示例展示测试框架中白盒性能测试框架的使用示例。 + +测试框架arkxtest的详细介绍请[参考](https://docs.openharmony.cn/pages/v5.1/zh-cn/application-dev/application-test/arkxtest-guidelines.md) 。 + +本实例需要引入PerfTest接口[@ohos.test.PerfTest](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-test-kit/js-apis-perftest.md) 。 + +### 效果预览 +不涉及 + +使用说明 +- 将perftest目录下的项目工程整体导入到DevEco Studio开发工具中。 +- 查看ohosTest目录下的测试代码实现。 +- 在DevEco Studio中执行测试用例代码查看执行效果,执行方式请[参考](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-openharmony-test-framework-0000001263160453) + +### 工程目录 + +``` +perfTest +|-----entry + |-----src/main/pages + |-----index.ets // 页面组件 + |-----ohosTest // 自动化测试用例 + |-----ets/test + |-----PerfTest.test.ets // 自动化测试脚本,其中it()就是一个测试用例 +|-----AppScope + |-----app.json5 // 定义应用唯一的包名:"bundleName": "com.samples.test.perftest", +``` + 须知 + +* 前提:引入PerfTest依赖:import { PerfMetric, PerfTest, PerfTestStrategy, PerfMeasureResult } from '@ohos.test.PerfTest'; + +### 具体实现 + +#### PerfTest测试框架示例内容 +* 1)测试函数执行期间的应用性能。 +* 2)在ohosTest的test/PerfTest.test.ets中it()定义一条测试用例,支持三个参数:用例名称,过滤参数和用例函数。用例操作的行为以异步的形式编写。 +* 3)指定唯一的ability即entry:通过want()中指定bundleName和abilityName:EntryAbility。 +* 4)启动指定ability(相当于手动运行hap):通过abilityDelegatorRegistry.getAbilityDelegator.startAbility(want)。 +* 5)获取当前应用最顶层的ability对象:通过abilityDelegatorRegistry.getAbilityDelegator.getCurrentTopAbility().then((ability)=>{}) 。 +* 6)引入PerfTest类作为白盒性能测试框架的总入口,提供基于代码段的白盒性能测试能力。 +* 7)断言性能指标测试数据是否符合预期。 +* 8)结束事件done()。 + + +### 相关权限 +不涉及 + +### 依赖 +不涉及 + +### 约束与限制 +1.本示例仅支持标准系统上运行。 + +2.本示例从API version 20版本SDK起开始支持,SDK版本号(API Version 20),镜像版本号6.0.0.37)。 + +### 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo code/Project/Test/perftest > .git/info/sparse-checkout +git remote add origin https://gitee.com/openharmony/applications_app_samples.git +git pull origin master +``` \ No newline at end of file diff --git a/code/Project/Test/perftest/build-profile.json5 b/code/Project/Test/perftest/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..8cd5b406bbd26f9daaedf4834107d0d8a2070ef0 --- /dev/null +++ b/code/Project/Test/perftest/build-profile.json5 @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2025 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. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": 20, + "compileSdkVersion": 20, + "runtimeOS": "OpenHarmony", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/build-profile.json5 b/code/Project/Test/perftest/entry/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..9c0be1984ddd7b7afd9e4098cb0bca86752addcb --- /dev/null +++ b/code/Project/Test/perftest/entry/build-profile.json5 @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2025 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. + */ + +{ + "apiType": "stageMode", + "buildOption": { + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/hvigorfile.ts b/code/Project/Test/perftest/entry/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff665e0e60cddbf67efc3ca3b0a2fe8301810a51 --- /dev/null +++ b/code/Project/Test/perftest/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2025 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 { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/code/Project/Test/perftest/entry/obfuscation-rules.txt b/code/Project/Test/perftest/entry/obfuscation-rules.txt new file mode 100644 index 0000000000000000000000000000000000000000..272efb6ca3f240859091bbbfc7c5802d52793b0b --- /dev/null +++ b/code/Project/Test/perftest/entry/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/oh-package.json5 b/code/Project/Test/perftest/entry/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..039481c6b500270f016b336c8b62de5f48a97179 --- /dev/null +++ b/code/Project/Test/perftest/entry/oh-package.json5 @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2025 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. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": {} +} + diff --git a/code/Project/Test/perftest/entry/src/main/ets/entryability/EntryAbility.ets b/code/Project/Test/perftest/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000000000000000000000000000000000000..97af31c429883a11fe60790a534dd603a846edc8 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2025 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 { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +const DOMAIN = 0x0000; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/ets/pages/Index.ets b/code/Project/Test/perftest/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..fc7edf6c890933a56c56f443318ac56c33e56637 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2025 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 '@kit.ArkUI' + +@Entry +@Component +struct Index { + build() { + Row() { + Column() { + Button($r('app.string.ListPage_label')) + .fontSize(25) + .fontWeight(FontWeight.Bold) + .onClick(async () => { + await router.pushUrl({ url: "pages/PageListPage"}) + }) + Button() { + Text($r('app.string.navigation_label')) + .fontSize(25) + .fontWeight(FontWeight.Bold) + } + .key('my-key2') + .type(ButtonType.Capsule) + .margin({ top: 20 }) + .onClick(() => { + router.pushUrl({url: "pages/navigationPage"}) + }) + } + .width('100%') + } + .height('100%') + } +} + diff --git a/code/Project/Test/perftest/entry/src/main/ets/pages/PageListPage.ets b/code/Project/Test/perftest/entry/src/main/ets/pages/PageListPage.ets new file mode 100644 index 0000000000000000000000000000000000000000..14a4e66542bbfc3538cdd3dc235bb4b28b9e41e3 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/ets/pages/PageListPage.ets @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2025 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. + */ + +@Entry +@Component +struct ListPage { + scroller: Scroller = new Scroller() + private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + + build() { + Row() { + Column() { + Scroll(this.scroller) { + Column() { + ForEach(this.arr, (item: number) => { + Text(item.toString()) + .width('90%') + .height('40%') + .backgroundColor(0xDCDCDC) + .fontSize(80) + .textAlign(TextAlign.Center) + .margin({ top: 10 }) + }, (item: string) => item) + } + } + .id('verticalScroll') + .width('100%') + .height('100%') + .scrollable(ScrollDirection.Vertical) + .scrollBar(BarState.On) + .scrollBarColor(Color.Gray) + } + .width('100%') + } + .height('100%') + } +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/ets/pages/navigationPage.ets b/code/Project/Test/perftest/entry/src/main/ets/pages/navigationPage.ets new file mode 100644 index 0000000000000000000000000000000000000000..23bdac0fb283ceba45790c21585e665b7a116127 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/ets/pages/navigationPage.ets @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2025 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. + */ + +@Component +struct Page01 { + + @Consume('pageInfos') pageInfos: NavPathStack; + + build() { + NavDestination() { + Button($r('app.string.Page01_label')) + .width('80%') + .onClick(() => { + this.pageInfos.pushPathByName('Page01', ''); + }) + .margin({top: 10, bottom: 10}) + Button($r('app.string.Dialog01_label')) + .width('80%') + .onClick(() => { + this.pageInfos.pushPathByName('Dialog01', ''); + }) + .margin({top: 10, bottom: 10}) + } + .title($r('app.string.Page01')) + } +} + +@Component +struct Dialog01 { + @Consume('pageInfos') pageInfos: NavPathStack; + + build() { + NavDestination() { + Stack() { + Column() + .width('100%') + .height('100%') + .backgroundColor(Color.Gray) + .opacity(0.1) + .onClick(() => { + this.pageInfos.pop(); + }) + Column() { + Text($r('app.string.Dialog01')) + .fontSize(30) + .fontWeight(2) + Button($r('app.string.Page01_label')) + .width('80%') + .onClick(() => { + this.pageInfos.pushPathByName('Page01', ''); + }) + .margin({top: 10, bottom: 10}) + Button($r('app.string.Dialog01_label')) + .width('80%') + .onClick(() => { + this.pageInfos.pushPathByName('Dialog01', ''); + }) + .margin({top: 10, bottom: 10}) + Button($r('app.string.pop')) + .width('80%') + .onClick(() => { + this.pageInfos.pop(); + }) + .margin({top: 10, bottom: 10}) + } + .padding(10) + .width(250) + .backgroundColor(Color.White) + .borderRadius(10) + } + } + .hideTitleBar(true) + .mode(NavDestinationMode.DIALOG) + } +} + +@Entry +@Component +struct Index { + @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack() + + @Builder + PagesMap(name: string) { + if (name == 'Page01') { + Page01() + } else if (name == 'Dialog01') { + Dialog01() + } + } + + build() { + Navigation(this.pageInfos) { + Button($r('app.string.Page01_label')) + .width('80%') + .onClick(() => { + this.pageInfos.pushPathByName('Page01', ''); + }) + } + .mode(NavigationMode.Stack) + .titleMode(NavigationTitleMode.Mini) + .title($r('app.string.title')) + .navDestination(this.PagesMap) + } +} diff --git a/code/Project/Test/perftest/entry/src/main/ets/utils/PerfUtils.ets b/code/Project/Test/perftest/entry/src/main/ets/utils/PerfUtils.ets new file mode 100644 index 0000000000000000000000000000000000000000..f250de0b9d588cf05e89676c5d5ac5ea0d7b5e02 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/ets/utils/PerfUtils.ets @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2025 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 class PerfUtils { + public static CalculateTest() { + let num: number = 0 + for (let index = 0; index < 100000; index++) { + num += index + } + } +} + diff --git a/code/Project/Test/perftest/entry/src/main/module.json5 b/code/Project/Test/perftest/entry/src/main/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..4e6270b9993a1d7a5faa96888a9d029f6c53e9dc --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/module.json5 @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2025 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. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "launchType": "multiton", + "visible": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/element/color.json b/code/Project/Test/perftest/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/element/float.json b/code/Project/Test/perftest/entry/src/main/resources/base/element/float.json new file mode 100644 index 0000000000000000000000000000000000000000..a0a93dd91fd48f08f3a9532c76e9b26e68d4c034 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/element/string.json b/code/Project/Test/perftest/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..4e87e281b9f52775d0892cf6f1d28868623e8988 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/resources/base/element/string.json @@ -0,0 +1,48 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "perftest" + }, + { + "name": "ListPage_label", + "value": "ListPage" + }, + { + "name": "navigation_label", + "value": "navigation" + }, + { + "name": "Page01_label", + "value": "push Page01" + }, + { + "name": "Dialog01_label", + "value": "push Dialog01" + }, + { + "name": "Page01", + "value": "Page01" + }, + { + "name": "Dialog01", + "value": "Dialog01" + }, + { + "name": "pop", + "value": "pop" + }, + { + "name": "title", + "value": "title" + } + ] +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/media/background.png b/code/Project/Test/perftest/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f Binary files /dev/null and b/code/Project/Test/perftest/entry/src/main/resources/base/media/background.png differ diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/media/foreground.png b/code/Project/Test/perftest/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..97014d3e10e5ff511409c378cd4255713aecd85f Binary files /dev/null and b/code/Project/Test/perftest/entry/src/main/resources/base/media/foreground.png differ diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/media/layered_image.json b/code/Project/Test/perftest/entry/src/main/resources/base/media/layered_image.json new file mode 100644 index 0000000000000000000000000000000000000000..fb49920440fb4d246c82f9ada275e26123a2136a --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/media/startIcon.png b/code/Project/Test/perftest/entry/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..205ad8b5a8a42e8762fbe4899b8e5e31ce822b8b Binary files /dev/null and b/code/Project/Test/perftest/entry/src/main/resources/base/media/startIcon.png differ diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/profile/backup_config.json b/code/Project/Test/perftest/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000000000000000000000000000000000000..78f40ae7c494d71e2482278f359ec790ca73471a --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/resources/base/profile/main_pages.json b/code/Project/Test/perftest/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..afa3b20630851290fd4311b998a3cadc390fc4d7 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,7 @@ +{ + "src": [ + "pages/Index", + "pages/PageListPage", + "pages/navigationPage" + ] +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/main/resources/dark/element/color.json b/code/Project/Test/perftest/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000000000000000000000000000000000000..79b11c2747aec33e710fd3a7b2b3c94dd9965499 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/ohosTest/ets/test/List.test.ets b/code/Project/Test/perftest/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..63f639114fd514ee0d33cd5bb169dbebc5dc3325 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2025 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 perfTestTest from './PerfTest.test' +export default function testsuite() { + perfTestTest() +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/ohosTest/ets/test/PerfTest.test.ets b/code/Project/Test/perftest/entry/src/ohosTest/ets/test/PerfTest.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..76802710d5d89f06753b5ad251232810079d4bbf --- /dev/null +++ b/code/Project/Test/perftest/entry/src/ohosTest/ets/test/PerfTest.test.ets @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2025 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, it, expect, TestType, Level, Size } from '@ohos/hypium'; +import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; +import { Driver, ON } from '@ohos.UiTest' +import { PerfMetric, PerfTest, PerfTestStrategy } from '@kit.TestKit'; +import { BusinessError, Callback } from '@kit.BasicServicesKit'; +import { PerfUtils } from '../../../main/ets/utils/PerfUtils'; + +const delegator = abilityDelegatorRegistry.getAbilityDelegator(); + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} + +export default function PerfTestTest() { + describe('PerfTestTest', () => { + + /* + * @tc.name: testPerfTestCalculate + * @tc.desc: Test the performance of computing scenarios + */ + it('testPerfTestCalculate', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async (done: Function) => { + let metrics: Array = [PerfMetric.DURATION, PerfMetric.CPU_LOAD, PerfMetric.CPU_USAGE, PerfMetric.MEMORY_RSS, PerfMetric.MEMORY_PSS] + let actionCode = async (finish: Callback) => { + PerfUtils.CalculateTest(); + finish(true) + } + let perfTestStrategy: PerfTestStrategy = { + metrics: metrics, + actionCode: actionCode, + iterations: 5, + timeout: 30000, + } + let perfTest: PerfTest = PerfTest.create(perfTestStrategy) + await perfTest.run() + let res1 = perfTest.getMeasureResult(PerfMetric.DURATION) + let res2 = perfTest.getMeasureResult(PerfMetric.CPU_LOAD) + let res3 = perfTest.getMeasureResult(PerfMetric.CPU_USAGE) + let res4 = perfTest.getMeasureResult(PerfMetric.MEMORY_RSS) + let res5 = perfTest.getMeasureResult(PerfMetric.MEMORY_PSS) + perfTest.destroy() + expect(res1.metric).assertEqual(PerfMetric.DURATION) + expect(res1.average).assertLargerOrEqual(0) + expect(res1.maximum).assertLargerOrEqual(0) + expect(res1.minimum).assertLargerOrEqual(0) + expect(res1.roundValues.length).assertLargerOrEqual(5) + expect(res2.average).assertLargerOrEqual(0) + expect(res3.average).assertLargerOrEqual(0) + expect(res4.average).assertLargerOrEqual(0) + expect(res5.average).assertLargerOrEqual(0) + done() + }) + + /* + * @tc.name: testPerfTestPageSwitch + * @tc.desc: Test the performance of page swipe scenarios + */ + it('testPerfTestPageSwitch', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async (done: Function) => { + await startAbility('com.samples.test.perftest', 'EntryAbility'); + let driver = Driver.create() + await driver.delayMs(3000) + let metrics: Array = [PerfMetric.PAGE_SWITCH_COMPLETE_TIME] + let actionCode = async (finish: Callback) => { + let button = await driver.findComponent(ON.text('ListPage')) + await driver.delayMs(1000) + await button.click() + await driver.delayMs(1000) + finish(true) + } + let resetCode = async (finish: Callback) => { + await driver.pressBack() + await driver.delayMs(1000) + finish(true) + } + let perfTestStrategy: PerfTestStrategy = { + metrics: metrics, + actionCode: actionCode, + resetCode: resetCode, + timeout: 50000, + iterations: 1, + bundleName: "com.samples.test.perftest" + } + let perfTest: PerfTest = PerfTest.create(perfTestStrategy) + await perfTest.run() + let res1 = perfTest.getMeasureResult(PerfMetric.PAGE_SWITCH_COMPLETE_TIME) + perfTest.destroy() + expect(res1.average).assertLargerOrEqual(0) + done() + }) + + /* + * @tc.name: testPerfTestListSwipe + * @tc.desc: Test the performance of list swipe scenarios + */ + it('testPerfTestListSwipe', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async (done: Function) => { + await startAbility('com.samples.test.perftest', 'EntryAbility'); + let driver = Driver.create() + await driver.delayMs(3000) + let button = await driver.findComponent(ON.text('ListPage')) + await driver.delayMs(1000) + await button.click() + await driver.delayMs(1000) + let metrics: Array = [PerfMetric.LIST_SWIPE_FPS] + let actionCode = async (finish: Callback) => { + let scroll = await driver.findComponent(ON.type('Scroll')) + await driver.delayMs(1000) + let center = await scroll.getBoundsCenter() + await driver.delayMs(1000) + await driver.fling({x: center.x, y: Math.floor(center.y * 3 / 2)}, {x: center.x, y: Math.floor(center.y / 2)}, 50, 20000) + await driver.delayMs(3000) + finish(true) + } + let resetCode = async (finish: Callback) => { + let scroll = await driver.findComponent(ON.type('Scroll')) + await driver.delayMs(1000) + await scroll.scrollToTop(40000) + await driver.delayMs(1000) + finish(true) + } + let perfTestStrategy: PerfTestStrategy = { + metrics: metrics, + actionCode: actionCode, + resetCode: resetCode, + iterations: 1, + timeout: 50000, + } + let perfTest: PerfTest = PerfTest.create(perfTestStrategy) + await perfTest.run() + let res1 = perfTest.getMeasureResult(PerfMetric.LIST_SWIPE_FPS) + perfTest.destroy() + expect(res1.average).assertLargerOrEqual(0) + done() + }) + + /* + * @tc.name: testPerfTest_Keep + * @tc.desc: Test the performance of Page keep + */ + it('testPerfTest_Keep', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async (done: Function) => { + await startAbility('com.samples.test.perftest', 'EntryAbility'); + let driver = Driver.create() + await driver.delayMs(3000) + let metrics: Array = [PerfMetric.DURATION, PerfMetric.MEMORY_RSS, PerfMetric.MEMORY_PSS] + let actionCode = async (finish: Callback) => { + let driver = Driver.create() + await driver.delayMs(1000) + finish(true) + } + let perfTestStrategy: PerfTestStrategy = { + metrics: metrics, + actionCode: actionCode, + iterations: 2, + timeout: 50000, + bundleName: "com.samples.test.perftest" + } + let perfTest: PerfTest = PerfTest.create(perfTestStrategy) + await perfTest.run() + let res1 = perfTest.getMeasureResult(PerfMetric.DURATION) + let res4 = perfTest.getMeasureResult(PerfMetric.MEMORY_RSS) + let res5 = perfTest.getMeasureResult(PerfMetric.MEMORY_PSS) + perfTest.destroy() + expect(res1.average).assertLargerOrEqual(0) + expect(res4.average).assertLargerOrEqual(0) + expect(res5.average).assertLargerOrEqual(0) + done() + }) + + /* + * @tc.name: testPerfTest_Navigationchange + * @tc.desc: Test the performance of Page switching(Navigation) + */ + it('testPerfTest_Navigationchange', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async (done: Function) => { + await startAbility('com.samples.test.perftest', 'EntryAbility'); + let driver = Driver.create() + await driver.delayMs(3000) + let textCom = await driver.findComponent(ON.text('navigation')) + await driver.delayMs(1000) + let center = await textCom.getBoundsCenter() + await driver.delayMs(1000) + await driver.click(center.x, center.y) + await driver.delayMs(1000) + let metrics: Array = [PerfMetric.DURATION, PerfMetric.MEMORY_RSS, PerfMetric.MEMORY_PSS, PerfMetric.PAGE_SWITCH_COMPLETE_TIME] + let actionCode = async (finish: Callback) => { + let driver = Driver.create() + await driver.delayMs(1000) + let textCom1 = await driver.findComponent(ON.text('push Page01')) + await driver.delayMs(1000) + let center1 = await textCom1.getBoundsCenter() + await driver.delayMs(1000) + await driver.click(center1.x, center1.y) + await driver.delayMs(1000) + finish(true) + } + let resetCode = async (finish: Callback) => { + let driver = Driver.create() + await driver.delayMs(1000) + await driver.pressBack() + await driver.delayMs(1000) + finish(true) + } + let perfTestStrategy: PerfTestStrategy = { + metrics: metrics, + actionCode: actionCode, + iterations: 1, + resetCode: resetCode, + timeout: 50000, + bundleName: "com.samples.test.perftest" + } + let perfTest: PerfTest = PerfTest.create(perfTestStrategy) + await perfTest.run() + let res1 = perfTest.getMeasureResult(PerfMetric.DURATION) + let res4 = perfTest.getMeasureResult(PerfMetric.MEMORY_RSS) + let res5 = perfTest.getMeasureResult(PerfMetric.MEMORY_PSS) + let res6 = perfTest.getMeasureResult(PerfMetric.PAGE_SWITCH_COMPLETE_TIME) + perfTest.destroy() + expect(res1.average).assertLargerOrEqual(0) + expect(res4.average).assertLargerOrEqual(0) + expect(res5.average).assertLargerOrEqual(0) + expect(res6.average).assertLargerOrEqual(0) + done() + }) + + /* + * @tc.name: testPerfTest_Start + * @tc.desc: Test the performance of App launch + */ + it('testPerfTest_Start', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async (done: Function) => { + let driver = Driver.create() + let metrics: Array = [PerfMetric.DURATION, PerfMetric.APP_START_RESPONSE_TIME, PerfMetric.APP_START_COMPLETE_TIME] + let actionCode = async (finish: Callback) => { + await startAbility("com.samples.test.perftest", "EntryAbility"); + await driver.delayMs(1000) + finish(true) + } + let resetCode = async (finish: Callback) => { + finish(true) + } + let perfTestStrategy: PerfTestStrategy = { + metrics: metrics, + actionCode: actionCode, + resetCode: resetCode, + timeout: 50000, + iterations: 1, + } + let perfTest: PerfTest = PerfTest.create(perfTestStrategy) + await perfTest.run() + let res1 = perfTest.getMeasureResult(PerfMetric.DURATION) + let res6 = perfTest.getMeasureResult(PerfMetric.APP_START_RESPONSE_TIME) + let res7 = perfTest.getMeasureResult(PerfMetric.APP_START_COMPLETE_TIME) + perfTest.destroy() + expect(res1.average).assertLargerOrEqual(0) + expect(res6.average).assertLargerOrEqual(0) + expect(res7.average).assertLargerOrEqual(0) + done() + }) + }) +} \ No newline at end of file diff --git a/code/Project/Test/perftest/entry/src/ohosTest/module.json5 b/code/Project/Test/perftest/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..f7a4b8b08e9044fcde4ed2640793e5a6ba588d67 --- /dev/null +++ b/code/Project/Test/perftest/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2025 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. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/code/Project/Test/perftest/hvigor/hvigor-config.json5 b/code/Project/Test/perftest/hvigor/hvigor-config.json5 new file mode 100644 index 0000000000000000000000000000000000000000..25332ee504834d3b90985e2d6ddb78e97a485ff0 --- /dev/null +++ b/code/Project/Test/perftest/hvigor/hvigor-config.json5 @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2025 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. + */ + +{ + "modelVersion": "5.0.4", + "dependencies": { + + } +} diff --git a/code/Project/Test/perftest/hvigorfile.ts b/code/Project/Test/perftest/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..a0f009bae5417588742497bf2a233184406aa2f4 --- /dev/null +++ b/code/Project/Test/perftest/hvigorfile.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2025 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 { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/code/Project/Test/perftest/oh-package.json5 b/code/Project/Test/perftest/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..e1f33cdddf2b9ffc3c7f56753923d37f368d2fa8 --- /dev/null +++ b/code/Project/Test/perftest/oh-package.json5 @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2025 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. + */ + +{ + "modelVersion": "5.0.4", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.21", + "@ohos/hamock": "1.0.0" + } +} diff --git a/code/Project/Test/perftest/ohosTest.md b/code/Project/Test/perftest/ohosTest.md new file mode 100644 index 0000000000000000000000000000000000000000..d34f7e26c83a9079c1603ccd5c34136e41d90cdd --- /dev/null +++ b/code/Project/Test/perftest/ohosTest.md @@ -0,0 +1,11 @@ +# PerfTest测试用例 + +## 用例表 + +| 用例名称 | 测试功能 |预置条件|输入| 预期输出 |测试结果| +|------|----------------------------------|--------------------------------|--------------------------------|------------------------------|--------------------------------| +| testPerfTestCalculate | PerfTest接口测试函数执行时性能测试。 | 设备正常运行| | PerfTest接口正确返回性能测试数据,用例执行通过。 |Pass| +| testPerfTestPageSwitch | PerfTest接口测试页面切换时性能测试。 | 设备正常运行| | PerfTest接口正确返回性能测试数据,用例执行通过。 |Pass| +| testPerfTestListSwipe | PerfTest接口测试页面滑动时性能测试。 | 设备正常运行| | PerfTest接口正确返回性能测试数据,用例执行通过。 |Pass| +| testPerfTest_Navigationchange | PerfTest接口测试Navigation组件跳转时性能测试。 | 设备正常运行| | PerfTest接口正确返回性能测试数据,用例执行通过。 |Pass| +| testPerfTest_Start | PerfTest接口测试拉起应用时性能测试。 | 设备正常运行| | PerfTest接口正确返回性能测试数据,用例执行通过。 |Pass| \ No newline at end of file diff --git a/code/Project/Test/uitest/README_zh.md b/code/Project/Test/uitest/README_zh.md index 5a737a4a593cdea8ae9c577c0294ca2162d59cbd..14045d357f4610797be897bb8b57e173a09613f7 100644 --- a/code/Project/Test/uitest/README_zh.md +++ b/code/Project/Test/uitest/README_zh.md @@ -53,6 +53,7 @@ uitest * 例如本案例中需要检验是否可以有back键能力:通过driver.pressBack()。 * 检验是否可以定时1s后执行能力:通过driver.delayMs(1000)。 * 日志打印:建议用例名称中的包名和日志中的包名单独用常量表示,方便包名变更整改,例如:hilog.info(DOMAIN, TAG, BUNDLE + "StartAbility_001, begin"),日志打印格式[参考](https://gitee.com/openharmony/applications_app_samples/blob/master/CodeCommitChecklist.md#ui%E8%87%AA%E5%8A%A8%E5%8C%96%E7%94%A8%E4%BE%8B%E7%BC%96%E5%86%99%E8%A7%84%E8%8C%83) 。 +* 7)断言性能指标测试数据是否符合预期. * 8)结束事件done(); diff --git a/code/Project/Test/uitest/build-profile.json5 b/code/Project/Test/uitest/build-profile.json5 index 889a6652ed137714e551d5961a5b7dfcaf30520a..31296264c3c0f21d421d7bd73b0823c2ad11d8e0 100644 --- a/code/Project/Test/uitest/build-profile.json5 +++ b/code/Project/Test/uitest/build-profile.json5 @@ -20,7 +20,7 @@ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 12, + "compileSdkVersion": 20, "compatibleSdkVersion": 12, "runtimeOS": "OpenHarmony" } diff --git a/code/Project/Test/uitest/entry/src/main/ets/demoability/DemoAbility.ets b/code/Project/Test/uitest/entry/src/main/ets/demoability/DemoAbility.ets new file mode 100644 index 0000000000000000000000000000000000000000..1880e30e3ee68ca5aaf73a9978c8cbe433bbad66 --- /dev/null +++ b/code/Project/Test/uitest/entry/src/main/ets/demoability/DemoAbility.ets @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2025 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 { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import Logger from '../util/Logger'; +import { window } from '@kit.ArkUI'; + +export default class DemoAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + Logger.info('%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + Logger.info('%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + Logger.info('%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/demoPage', (err) => { + if (err.code) { + Logger.error('Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + Logger.info('Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + Logger.info('%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + Logger.info('%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + Logger.info('%{public}s', 'Ability onBackground'); + } +} diff --git a/code/Project/Test/uitest/entry/src/main/ets/pages/Click.ets b/code/Project/Test/uitest/entry/src/main/ets/pages/Click.ets index e405fa6487ee5f2a12ed19ac8603bdb2625b4cca..1c511a98bfd855b3778e28236cc0cff4906eb9c5 100644 --- a/code/Project/Test/uitest/entry/src/main/ets/pages/Click.ets +++ b/code/Project/Test/uitest/entry/src/main/ets/pages/Click.ets @@ -45,11 +45,18 @@ struct Click { router.pushUrl({ url: 'pages/Third' }); }) ) + Button() { + Text('LongClick') + .fontSize(25) + .fontWeight(FontWeight.Bold) + } + .type(ButtonType.Capsule) + .margin({ top: 20 }) .gesture( - LongPressGesture({ repeat: false }) - .onAction(() => { - router.pushUrl({ url: 'pages/Fourth' }); - }) + LongPressGesture({ repeat: false }) + .onAction(() => { + router.pushUrl({ url: 'pages/Fourth' }); + }) ) } .width('100%') diff --git a/code/Project/Test/uitest/entry/src/main/ets/pages/Mouse.ets b/code/Project/Test/uitest/entry/src/main/ets/pages/Mouse.ets index 4657f70de1d585f7e6d066c966762e0b7fad37aa..3362c92f8b60459c3ed7f0342843bd9ddbb7b385 100644 --- a/code/Project/Test/uitest/entry/src/main/ets/pages/Mouse.ets +++ b/code/Project/Test/uitest/entry/src/main/ets/pages/Mouse.ets @@ -96,6 +96,19 @@ struct Mouse { }); }) ) + Button() { + Text('Click twice') + .fontSize(25) + .fontWeight(FontWeight.Bold) + } + .type(ButtonType.Capsule) + .margin({ top: 20 }) + .gesture( + TapGesture({ count: 2 }) + .onAction(() => { + router.pushUrl({ url: 'pages/Third' }); + }) + ) Column(){ Scroll(this.scroller) { Flex({ direction: FlexDirection.Column }) { diff --git a/code/Project/Test/uitest/entry/src/main/ets/pages/demoPage.ets b/code/Project/Test/uitest/entry/src/main/ets/pages/demoPage.ets new file mode 100644 index 0000000000000000000000000000000000000000..8401dda0abdac8ec2e3c492723eca8eb0a643cfd --- /dev/null +++ b/code/Project/Test/uitest/entry/src/main/ets/pages/demoPage.ets @@ -0,0 +1,196 @@ +/** + * Copyright (c) 2025 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'; +import promptAction from '@ohos.promptAction'; + +@Entry +@Component +struct ScrollExample { + scroller: Scroller = new Scroller() + private arr: number[] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + @State hoverText : string = 'jump' + @State pressure : number = 0.0 + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text('MainPage') + .fontSize(50) + .fontWeight(FontWeight.Bold) + Stack({ alignContent: Alignment.TopStart }) { + Scroll(this.scroller) { + Column() { + Button('toast').fontSize(25).fontWeight(FontWeight.Bold) + .onClick(() => { + try { + promptAction.showToast({ + message: 'toastShow', + duration: 60000 + }); + } catch (error) { + }; + }) + Button('dialog').fontSize(25).fontWeight(FontWeight.Bold) + .onClick(() => { + AlertDialog.show( + { + title: '', + message: 'dialogShow', + alignment: DialogAlignment.Bottom, + confirm: { + value: 'close', + action: () => { + } + } + } + ) + }) + Button() { + Text('next page') + .fontSize(25) + .fontWeight(FontWeight.Bold) + } + .key('my-key') + .type(ButtonType.Capsule) + .margin({ top: 20 }) + .onClick(() => { + router.push({ uri: 'pages/second' }) + }) + .gesture( + LongPressGesture({ repeat: false }) + .onAction((event: GestureEvent) => { + router.push({ uri: 'pages/Fourth' }) + }) + ) + .gesture( + LongPressGesture({ repeat: false, duration: 1800 }) + .onAction((event: GestureEvent) => { + router.push({ uri: 'pages/fourth' }) + }) + ) + Button() { + Text('Click twice') + .fontSize(25) + .fontWeight(FontWeight.Bold) + } + .type(ButtonType.Capsule) + .margin({ top: 20 }) + .gesture( + TapGesture({ count: 1 }) + .onAction(() => { + router.push({ uri: 'pages/Third' }) + }) + ) + .gesture( + LongPressGesture({ repeat: false }) + .onAction((event: GestureEvent) => { + router.push({ uri: 'pages/wearList' }) + }) + ) + Button() { + Text(this.hoverText) + .fontSize(25) + .fontWeight(FontWeight.Bold) + } + .type(ButtonType.Capsule) + .key('jump') + .margin({ top: 20 }) + .onHover((isHover: boolean) => { + if (isHover) { + this.hoverText = 'hover' + } + }) + .onMouse((event: MouseEvent) => { + switch (event.button) { + case MouseButton.Left : + this.hoverText = 'left' + break + case MouseButton.Right : + this.hoverText = 'right' + break + case MouseButton.Middle : + this.hoverText = 'middle' + break + } + }) + .onClick(() => { + router.push({ uri: 'pages/Pinch' }) + }) + .gesture( + LongPressGesture({ repeat: false }) + .onAction((event: GestureEvent) => { + router.push({ uri: 'pages/Drag' }) + }) + ) + Button() { + Text('scroll') + .fontSize(25) + .fontWeight(FontWeight.Bold) + } + .type(ButtonType.Capsule) + .margin({ top: 20 }) + .onClick(() => { + router.push({ uri: 'pages/scroll' }) + }) + Checkbox({ name: 'hi' }) + .size({ width: 30, height: 30 }) + TextInput({ placeholder: 'welcome', text: 'Hello World' }) + .type(InputType.Normal) + .width(300) + .height(50) + .fontSize(40) + .enabled(true) + .margin({ top: 20 }) + ForEach(this.arr, (item:number) => { + Text(item.toString()) + .width('100%') + .height('30%') + .backgroundColor(0xFFFFFF) + .borderRadius(75) + .fontSize(80) + .textAlign(TextAlign.Center) + .margin({ top: 10 }) + }, (item:string) => item) + Button() { + Text('bottom') + .fontSize(25) + .fontWeight(FontWeight.Bold) + }.type(ButtonType.Capsule) + .margin({ + top: 20, left: 150 + }) + .onClick(() => { + router.push({ uri: 'pages/second' }) + }) + }.width('100%') + } + .scrollable(ScrollDirection.Vertical) + .scrollBar(BarState.On) + .scrollBarColor(Color.Gray) + .scrollBarWidth(30) + .onScroll((xOffset: number, yOffset: number) => { + }) + }.width('100%').height('100%').backgroundColor(0xDCDCDC) + .onTouch((event) => { + this.pressure = event.pressure; + }) + Text(this.pressure.toFixed(1)) + .id('pressure') + .fontSize(20) + Text('MainPage_End') + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + } +} + diff --git a/code/Project/Test/uitest/entry/src/main/ets/pages/second.ets b/code/Project/Test/uitest/entry/src/main/ets/pages/second.ets new file mode 100644 index 0000000000000000000000000000000000000000..e9168d7c4aaeb51556b5375f7fad5bc530c09a58 --- /dev/null +++ b/code/Project/Test/uitest/entry/src/main/ets/pages/second.ets @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2025 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 Second { + private content: string = "Second Page" + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(`${this.content}`) + .fontSize(50) + .fontWeight(FontWeight.Bold) + Button() { + Text('back to index') + .fontSize(20) + .fontWeight(FontWeight.Bold) + }.type(ButtonType.Capsule) + .margin({ + top: 20 + }) + .backgroundColor('#0D9FFB') + .onClick(() => { + router.back() + }) + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/main/ets/pages/wearList.ets b/code/Project/Test/uitest/entry/src/main/ets/pages/wearList.ets new file mode 100644 index 0000000000000000000000000000000000000000..550974547739bc46f6e7433e5aba93e9a641176d --- /dev/null +++ b/code/Project/Test/uitest/entry/src/main/ets/pages/wearList.ets @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2025 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'; +import promptAction from '@ohos.promptAction'; + +@Entry +@Component +struct WearList { + @State message: string = 'Hello World'; + private arr: number[] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + + build() { + Column() { + List({space: 20, initialIndex: 0}) { + ForEach(this.arr, (item: number) => { + ListItem() { + Button('' + item) + .height(100) + .width('100%') + .fontSize(16) + .onClick(() => {}) + } + }, (item: string) => item) + } + .focusable(true) + .defaultFocus(true) + .focusOnTouch(true) + .width('90%') + .height('100%') + } + .height('100%') + .width('100%') + .padding({top: 5}) + } +} \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/main/module.json5 b/code/Project/Test/uitest/entry/src/main/module.json5 index 255e8aadde8ff44561a4b753f4a1aff17046c9d6..7657b21a5058a3721d6b23dccc07cd30de31c1e7 100644 --- a/code/Project/Test/uitest/entry/src/main/module.json5 +++ b/code/Project/Test/uitest/entry/src/main/module.json5 @@ -1,18 +1,3 @@ -/* -* Copyright (c) 2023-2024 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. -*/ - { "module": { "name": "entry", @@ -147,6 +132,17 @@ "startWindowIcon": "$media:icon", "startWindowBackground": "$color:start_window_background", "visible": true + }, + { + "name": "DemoAbility", + "srcEntry": "./ets/demoability/DemoAbility.ets", + "description": "$string:DemoAbility_desc", + "icon": "$media:layered_image", + "label": "$string:DemoAbility_label", + "visible": true, + "startWindowIcon": "$media:startIcon", + "launchType": "multiton", + "startWindowBackground": "$color:start_window_background" } ] } diff --git a/code/Project/Test/uitest/entry/src/main/resources/base/element/float.json b/code/Project/Test/uitest/entry/src/main/resources/base/element/float.json new file mode 100644 index 0000000000000000000000000000000000000000..a0a93dd91fd48f08f3a9532c76e9b26e68d4c034 --- /dev/null +++ b/code/Project/Test/uitest/entry/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/main/resources/base/element/string.json b/code/Project/Test/uitest/entry/src/main/resources/base/element/string.json index 873999245575101c099a81e6295f8ae101ab8ffc..69e9bd3a8775244149f83422df2f4913916e2262 100644 --- a/code/Project/Test/uitest/entry/src/main/resources/base/element/string.json +++ b/code/Project/Test/uitest/entry/src/main/resources/base/element/string.json @@ -111,6 +111,14 @@ { "name": "test", "value": "测试内容" + }, + { + "name": "DemoAbility_desc", + "value": "description" + }, + { + "name": "DemoAbility_label", + "value": "label" } ] } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/main/resources/base/media/background.png b/code/Project/Test/uitest/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f Binary files /dev/null and b/code/Project/Test/uitest/entry/src/main/resources/base/media/background.png differ diff --git a/code/Project/Test/uitest/entry/src/main/resources/base/media/foreground.png b/code/Project/Test/uitest/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..97014d3e10e5ff511409c378cd4255713aecd85f Binary files /dev/null and b/code/Project/Test/uitest/entry/src/main/resources/base/media/foreground.png differ diff --git a/code/Project/Test/uitest/entry/src/main/resources/base/media/layered_image.json b/code/Project/Test/uitest/entry/src/main/resources/base/media/layered_image.json new file mode 100644 index 0000000000000000000000000000000000000000..fb49920440fb4d246c82f9ada275e26123a2136a --- /dev/null +++ b/code/Project/Test/uitest/entry/src/main/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/main/resources/base/media/startIcon.png b/code/Project/Test/uitest/entry/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..205ad8b5a8a42e8762fbe4899b8e5e31ce822b8b Binary files /dev/null and b/code/Project/Test/uitest/entry/src/main/resources/base/media/startIcon.png differ diff --git a/code/Project/Test/uitest/entry/src/main/resources/base/profile/main_pages.json b/code/Project/Test/uitest/entry/src/main/resources/base/profile/main_pages.json index 20e67a764a476d575b40ab9e168be62bf4496f5c..5a4cfc3eeb3ccda435021966c96b08e4dd9ab283 100644 --- a/code/Project/Test/uitest/entry/src/main/resources/base/profile/main_pages.json +++ b/code/Project/Test/uitest/entry/src/main/resources/base/profile/main_pages.json @@ -12,6 +12,9 @@ "pages/Scroller", "pages/Drag", "pages/five", - "pages/Web" + "pages/Web", + "pages/wearList", + "pages/demoPage", + "pages/second" ] } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/List.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/List.test.ets index e5192b33e028a9d49b2bde79ef5cf187dec973aa..d5067f10bfec553c2f37bbb3b00caa8b606adfa2 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/List.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/List.test.ets @@ -30,7 +30,8 @@ import windowAttr from './operationExampleTest/window/WindowAttr.test'; import monitorEventTest from './operationExampleTest/ui/MonitorEvent.test'; import webOperateTest from './operationExampleTest/web/webOperate.test'; import findWindowExampleTest from './findCommentExampleTest/window/findWindowExample.test'; - +import otherEvent from './operationExampleTest/ui/OtherEvent.test' +import wearAbleEventTest from './operationExampleTest/ui/WearAbleEvent.test' export default function testsuite() { basicExampleTest(); findTest(); @@ -49,4 +50,6 @@ export default function testsuite() { windowAttr(); monitorEventTest(); webOperateTest(); + wearAbleEventTest(); + otherEvent() } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/findCommentExampleTest/Component/findCommentExample.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/findCommentExampleTest/Component/findCommentExample.test.ets index 601eedf0497a842c2b711bda87faf005808638b4..a63dd76473910a4a46fae6e0bedab21def05d677 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/findCommentExampleTest/Component/findCommentExample.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/findCommentExampleTest/Component/findCommentExample.test.ets @@ -40,15 +40,23 @@ * */ - - -import { describe, it, expect, TestType, beforeAll } from '@ohos/hypium'; -import { abilityDelegatorRegistry, Driver, MatchPattern, ON } from '@kit.TestKit'; +import { describe, it, expect, TestType, beforeAll, Level, Size } from '@ohos/hypium'; +import { abilityDelegatorRegistry, DisplayRotation, Driver, MatchPattern, ON } from '@kit.TestKit'; import { Want } from '@kit.AbilityKit'; +import { BusinessError } from '@ohos.base'; +import { display } from '@kit.ArkUI'; + const delegator = abilityDelegatorRegistry.getAbilityDelegator(); const bundleName = abilityDelegatorRegistry.getArguments().bundleName; const DELAYMS = 1000; const arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; +const waitUiReadyMs : number = 1000; +const TestTag = 'findExampleTest'; + + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} export default function findExampleTest() { describe('findExampleTest', () => { beforeAll(async () => { @@ -60,7 +68,6 @@ export default function findExampleTest() { }) /** - * @tc.number:findExampleTest_001 * @tc.name: findComponent_On_ID * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 使用ON.id 获取单个组件 @@ -75,7 +82,6 @@ export default function findExampleTest() { }) /** - * @tc.number:findExampleTest_002 * @tc.name: findComponents_On_ID * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 使用ON.id 获取多个组件 @@ -93,7 +99,6 @@ export default function findExampleTest() { }) /** - * @tc.number:findExampleTest_003 * @tc.name: findComponents_On_isBefore * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 使用ON.isBefore 获取单个组件 @@ -108,7 +113,6 @@ export default function findExampleTest() { }) /** - * @tc.number:findExampleTest_004 * @tc.name: findComponents_On_isBefore_1 * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 使用ON.isAfter 获取单个组件 @@ -124,7 +128,6 @@ export default function findExampleTest() { /** - * @tc.number:findExampleTest_005 * @tc.name: testMatchPattern * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 使用不同的匹配模式获取控件对象 @@ -139,7 +142,6 @@ export default function findExampleTest() { }) /** - * @tc.number:findExampleTest_006 * @tc.name: findComponents_scrollSearch * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 使用ScrollSearch 获取单个组件 @@ -149,14 +151,13 @@ export default function findExampleTest() { await dr.delayMs(DELAYMS); let scrollBar = await dr.findComponent(ON.type('Scroll')); await dr.delayMs(DELAYMS); - let button = await scrollBar.scrollSearch(ON.text('5')); + let button = await scrollBar.scrollSearch(ON.text('1')); await dr.delayMs(DELAYMS); - expect(await button.getText()).assertEqual("5"); + expect(await button.getText()).assertEqual("1"); done(); }) /** - * @tc.number:findExampleTest_007 * @tc.name: testDescription * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 验证组件的description属性 @@ -170,7 +171,6 @@ export default function findExampleTest() { }) /** - * @tc.number:findExampleTest_008 * @tc.name: testWithIn * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 验证组件的description属性 @@ -188,5 +188,94 @@ export default function findExampleTest() { expect(bounds1.left < bounds2.right).assertTrue(); expect(bounds1.right > bounds2.right).assertTrue(); }) + + /** + * @tc.name: testBelongingDisplay + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 多屏获取组件对象,该接口从api20开始支持使用。 + */ + it('testBelongingDisplay', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(1000); + let disPlay = display.getDefaultDisplaySync(); + try { + let mainPage = await driver.findComponent(ON.belongingDisplay(disPlay.id).text('MainPage')); + let msg = await mainPage.getText(); + expect(msg).assertEqual('MainPage') + } catch (error) { + expect().assertFail(); + } + }) + + + /* + * @tc.name: testGetDisplayId + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 组件获取displayId,该接口从api20开始支持使用。 + */ + it('testGetDisplayId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(1000); + let disPlay = display.getDefaultDisplaySync(); + try { + let mainPage = await driver.findComponent(ON.belongingDisplay(disPlay.id).text('MainPage')); + let disId = await mainPage.getDisplayId(); + expect(disId).assertEqual(disPlay.id) + } catch (error) { + expect().assertFail(); + } + }) + + /* + * @tc.name: testGetDisplaySizeWithId + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 组件获取屏幕大小,该接口从api20开始支持使用。 + */ + it('testGetDisplaySizeWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + let s = await driver.getDisplaySize(disPlay.id) + expect(s.x != 0).assertTrue() + expect(s.y != 0).assertTrue() + }) + + + /* + * @tc.name: testGetDisplayDensityWithId + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 组件获取屏幕密度,该接口从api20开始支持使用。 + */ + it('testGetDisplayDensityWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + let s = await driver.getDisplayDensity(disPlay.id) + expect(s.x != 0).assertTrue() + expect(s.y != 0).assertTrue() + }) + + /* + * @tc.name: testGetDisplayRotationWithId + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 组件获取屏幕方向,该接口从api20开始支持使用。 + */ + it('testGetDisplayRotationWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + await driver.setDisplayRotation(DisplayRotation.ROTATION_0) + await driver.delayMs(waitUiReadyMs) + let rotation = await driver.getDisplayRotation(disPlay.id) + expect(rotation == DisplayRotation.ROTATION_0 + || rotation == DisplayRotation.ROTATION_90 + || rotation == DisplayRotation.ROTATION_180 + || rotation == DisplayRotation.ROTATION_270).assertTrue(); + }) }) } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/FlingEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/FlingEvent.test.ets index a795cf66df77c9cdd126856fb09c463bf65df597..4a4810e5a2e140d08de23c45a2c5191f940022c1 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/FlingEvent.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/FlingEvent.test.ets @@ -13,13 +13,22 @@ * limitations under the License. */ -import { describe, it, expect, TestType, beforeAll } from '@ohos/hypium'; +import { describe, it, expect, TestType, beforeAll, Level, Size } from '@ohos/hypium'; import { abilityDelegatorRegistry, Driver, ON, UiDirection } from '@kit.TestKit'; import { Want } from '@kit.AbilityKit'; -const delegator = abilityDelegatorRegistry.getAbilityDelegator(); -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +import { BusinessError } from '@ohos.base'; +import display from '@ohos.display'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; + +const delegator : AbilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName : string = abilityDelegatorRegistry.getArguments().bundleName; +const waitUiReadyMs : number = 1000; const WAIT_UI_READYMS = 1000; +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} + export default function FlingEventTest() { describe('FlingEvent', () => { beforeAll(async () => { @@ -86,5 +95,42 @@ export default function FlingEventTest() { expect(text !== null).assertTrue(); done(); }) + + /** + * @tc.name: FlingEvent_WithId + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测uitest fling 垂直滑动功能 坐标点仅支持RK3568 + */ + it('FlingEvent_WithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + if (disPlay.id == 999) { + return + } + let window = await driver.findWindow({bundleName: bundleName}) + try { + await window.maximize() + await driver.delayMs(500) + } catch (error) { + } + await driver.fling(UiDirection.DOWN, 39000, disPlay.id) + await driver.delayMs(waitUiReadyMs) + let button = await driver.findComponents(ON.belongingDisplay(disPlay.id).text('next page')) + expect (button).assertNull() + await driver.fling(UiDirection.LEFT, 39000, disPlay.id) + await driver.delayMs(waitUiReadyMs) + let text = await driver.findComponents(ON.belongingDisplay(disPlay.id).text('1')) + expect (text).assertNull() + await driver.fling(UiDirection.RIGHT, 39000, disPlay.id) + await driver.delayMs(waitUiReadyMs) + let text2 = await driver.findComponents(ON.belongingDisplay(disPlay.id).text('1')) + expect (text2).assertNull() + await driver.fling(UiDirection.UP, 39000, disPlay.id) + await driver.delayMs(2000) + let button2 = await driver.findComponents(ON.belongingDisplay(disPlay.id).text('bottom')) + expect (button2 == null).assertTrue() + }) }) } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/InputEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/InputEvent.test.ets index ed3a37b4e90382ce2637a60b76fbaf8a6ac3f649..29101f7ece41c896241e4af1c475c7a0847274a3 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/InputEvent.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/InputEvent.test.ets @@ -13,24 +13,36 @@ * limitations under the License. */ -import { describe, it, expect, TestType, beforeAll } from '@ohos/hypium'; +import { describe, it, expect, TestType, beforeAll, Level, Size } from '@ohos/hypium'; import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; -import { UIAbility, Want } from '@kit.AbilityKit'; +import { Want } from '@kit.AbilityKit'; +import { BusinessError } from '@ohos.base'; +import { display } from '@kit.ArkUI'; + const delegator = abilityDelegatorRegistry.getAbilityDelegator(); const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - const WAIT_UI_READYMS = 1000; -let ab: UIAbility; let test: string = '中文测试'; +const waitUiReadyMs : number = 1000; +const TestTag = 'InputEventTest'; + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} + +async function exitInputMethod() { + let driver = Driver.create() + let softKeyBoard = await driver.findComponent(ON.type('Canvas')) + if (softKeyBoard != null) { + await driver.pressBack() + } +} export default function InputEventTest() { describe('InputEventTest', () => { beforeAll(async () => { await delegator.addAbilityMonitor({ abilityName: 'InputAbility', moduleName: bundleName, - onAbilityCreate(ability : UIAbility) { - ab = ability; - } }); let want: Want = { @@ -97,12 +109,11 @@ export default function InputEventTest() { }) /** - * @tc.number:InputEventTest_003 - * @tc.name: clickEventTest_Input_zh + * @tc.name: InputEventTest_ClearText * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest clear text */ - it('testClearText', TestType.FUNCTION, async () => { + it('InputEventTest_ClearText', TestType.FUNCTION, async () => { let driver = Driver.create(); await driver.delayMs(WAIT_UI_READYMS); let input1 = await driver.findComponent(ON.type('TextInput')); @@ -116,5 +127,97 @@ export default function InputEventTest() { console.info("testClearText result :" + text); expect(text).assertEqual(''); }) + + /* + * @tc.name: InputEventTest_InputText + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: enter '123',the values of both paste and addition are false,该接口从api20开始支持使用。 + */ + it('InputEventTest_InputText', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + console.log(TestTag, 'InputEventTest_InputText start'); + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(2000) + let text = await driver.findComponent(ON.type('TextInput')) + if (text == null) { + let scorll = await driver.findComponent(ON.type('Scroll')) + text = await scorll.scrollSearch(ON.type('TextInput')) + } + let center = await text.getBoundsCenter() + await text.clearText(); + await driver.delayMs(2000); + await driver.inputText(center, '123', {paste:false, addition:false}) + await driver.delayMs(2000); + let text1 = await driver.findComponent(ON.type('TextInput')) + expect(await text1.getText() == '123').assertTrue() + console.log(TestTag, 'InputEventTest_InputText over'); + }) + + /* + * @tc.name: InputEventTest_InputText2 + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: enter '123',the values of paste is true,the values of addition is false,该接口从api20开始支持使用。 + */ + it('InputEventTest_InputText2', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + console.log(TestTag, 'InputEventTest_InputText2 start'); + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(2000) + let text = await driver.findComponent(ON.type('TextInput')) + if (text == null) { + let scorll = await driver.findComponent(ON.type('Scroll')) + text = await scorll.scrollSearch(ON.type('TextInput')) + } + await text.clearText() + await driver.delayMs(2000) + await exitInputMethod() + let center = await text.getBoundsCenter() + await driver.inputText(center, '123', {paste:true, addition:false}) + await driver.delayMs(2000) + await exitInputMethod() + await driver.delayMs(2000) + let text1 = await driver.findComponent(ON.type('TextInput')) + expect(await text1.getText() == '123').assertTrue() + console.log(TestTag, 'InputEventTest_InputText2 over'); + }) + + /* + * @tc.name: InputEventTest_TriggerCombineKeysWithId + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 多屏下,triggerCombineKeys test,该接口从api20开始支持使用。 + */ + it('InputEventTest_TriggerCombineKeysWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + console.log(TestTag, 'InputEventTest_TriggerCombineKeysWithId start'); + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + console.log(`${TestTag}, InputEventTest_TriggerCombineKeysWithId disPlay is: ${JSON.stringify(disPlay)}`); + await driver.delayMs(1000) + let text = await driver.findComponent(ON.belongingDisplay(disPlay.id).type('TextInput')) + if (text == null) { + let scorll = await driver.findComponent(ON.belongingDisplay(disPlay.id).type('Scroll')) + text = await scorll.scrollSearch(ON.belongingDisplay(disPlay.id).type('TextInput')) + } + let center = await text.getBoundsCenter() + // set pasteBoard data + await text.inputText('123') + await driver.delayMs(1000) + await driver.click(center.x, center.y) + await driver.delayMs(waitUiReadyMs) + await driver.triggerCombineKeys(2072, 2017, 0, disPlay.id) + await driver.delayMs(waitUiReadyMs) + await driver.triggerCombineKeys(2072, 2019, 0, disPlay.id) + await driver.delayMs(waitUiReadyMs) + // clear and paste + let text2 = await driver.findComponent(ON.belongingDisplay(disPlay.id).type('TextInput')) + await text2.clearText() + await driver.delayMs(waitUiReadyMs) + await driver.triggerCombineKeys(2072, 2038, 0, disPlay.id) + await driver.delayMs(1000) + let text3 = await driver.findComponent(ON.belongingDisplay(disPlay.id).type('TextInput')) + expect(await text3.getText() == '123').assertTrue() + console.log(TestTag, 'InputEventTest_TriggerCombineKeysWithId over'); + }) }) } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/MouseEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/MouseEvent.test.ets index 8a90c1afc441d34b79cd321051bb156347ee2d30..ab63b510d6944072406da7372a3627364b37b4d7 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/MouseEvent.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/MouseEvent.test.ets @@ -13,13 +13,21 @@ * limitations under the License. */ -import { describe, it, expect, TestType, beforeAll } from '@ohos/hypium'; +import { describe, it, expect, TestType, beforeAll, Size, Level } from '@ohos/hypium'; import { abilityDelegatorRegistry, Driver, ON, MouseButton } from '@kit.TestKit'; import { Want } from '@kit.AbilityKit'; +import { BusinessError } from '@ohos.base'; const delegator = abilityDelegatorRegistry.getAbilityDelegator(); const bundleName = abilityDelegatorRegistry.getArguments().bundleName; const WAIT_UI_READYMS = 1000; +const waitUiReadyMs : number = 1000; +const TestTag = 'UiTest_API16'; + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} + export default function MouseEventTest() { describe('MouseEventTest', () => { beforeAll(async () => { @@ -56,9 +64,13 @@ export default function MouseEventTest() { it('testMouseDoubleClick_left', TestType.FUNCTION, async (done: Function) => { let driver = Driver.create(); await driver.delayMs(WAIT_UI_READYMS); - let button = await driver.findComponent(ON.id('mouse_test')); - let point = await button.getBoundsCenter(); - await driver.mouseDoubleClick(point, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); + let Button = await driver.findComponent(ON.text('Click twice')) + if (Button == null) { + let scorll = await driver.findComponent(ON.type('Scroll')) + Button = await scorll.scrollSearch(ON.text('Click twice')) + } + let center = await Button.getBoundsCenter() + await driver.mouseDoubleClick(center, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); let newButton = await driver.findComponent(ON.text('doubleClick')); let text = await newButton.getText(); expect(text === 'doubleClick').assertTrue(); @@ -87,7 +99,6 @@ export default function MouseEventTest() { /** - * @tc.number:MouseEventTest_002 * @tc.name: testMouseClick2 * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest 模拟鼠标右键点击 功能 @@ -104,7 +115,6 @@ export default function MouseEventTest() { }) /** - * @tc.number:MouseEventTest_003 * @tc.name: testMouseClick3 * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest 模拟鼠标中间点击 功能 @@ -122,7 +132,6 @@ export default function MouseEventTest() { }) /** - * @tc.number:MouseEventTest_004 * @tc.name: testMouseMoveTo * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest 模拟鼠标滚轮向下滑动功能 @@ -141,7 +150,6 @@ export default function MouseEventTest() { /** - * @tc.number:MouseEventTest_005 * @tc.name: testMouseScroll * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest 模拟鼠标滚轮向下滑动功能 @@ -158,7 +166,6 @@ export default function MouseEventTest() { }) /** - * @tc.number:MouseEventTest_005 * @tc.name: testMouseScroll_with * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest 模拟鼠标滚轮向下滑动与Ctrl + 删除键组合使用。 @@ -176,7 +183,6 @@ export default function MouseEventTest() { }) /** - * @tc.number:MouseEventTest_005 * @tc.name: testMouseScroll * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest 模拟移动鼠标光标 坐标点仅支持RK3568 @@ -195,19 +201,94 @@ export default function MouseEventTest() { * @tc.desc: 检测uitest 模拟移动鼠标光标 坐标点仅支持RK3568 */ it('testMouseDragTest', TestType.FUNCTION, async (done: Function) => { - let driver = Driver.create(); - await driver.delayMs(WAIT_UI_READYMS); - let toMouseDragBtn = await driver.findComponent(ON.id('toMouseDrag')); - await toMouseDragBtn.click(); - let appleBtn = await driver.findComponent(ON.id('apple')); - let appPoint = await appleBtn.getBoundsCenter(); - await driver.mouseLongClick(appPoint, MouseButton.MOUSE_BUTTON_LEFT); - await driver.delayMs(WAIT_UI_READYMS); - await driver.mouseDrag(appPoint, {x: 500, y: 500}); - await driver.delayMs(WAIT_UI_READYMS); - let appleBtn1 = await driver.findComponent(ON.id('apple')); - expect(appleBtn1=== null).assertTrue(); + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(waitUiReadyMs) + let button = await driver.findComponent(ON.id('jump')) + let center = await button.getBoundsCenter(); + await driver.mouseLongClick(center, MouseButton.MOUSE_BUTTON_LEFT, 0, 2072, 3000) + await driver.delayMs(waitUiReadyMs) + let text1 = await driver.findComponent(ON.text('one')) + let text2 = await driver.findComponent(ON.text('two')) + let point1 = await text1.getBoundsCenter() + let point2 = await text2.getBoundsCenter() + await driver.mouseDrag(point1, point2, 600) + await driver.delayMs(2000) + let text = await driver.findComponent(ON.text('one').isBefore(ON.text('two'))) + expect(text == null).assertTrue() done(); }) + + /* + * @tc.name: testNewMouseDrag + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测uitest 鼠标拖拽操作, 该API从20开始支持使用。 + */ + it('testNewMouseDrag', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + console.log(TestTag, 'testNewMouseDrag start'); + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(waitUiReadyMs) + let button = await driver.findComponent(ON.id('jump')) + let center = await button.getBoundsCenter(); + await driver.mouseLongClick(center, MouseButton.MOUSE_BUTTON_LEFT, 0, 2072, 3000) + console.log(TestTag, 'mouseLongClick successful'); + await driver.delayMs(waitUiReadyMs) + let text1 = await driver.findComponent(ON.text('one')) + let text2 = await driver.findComponent(ON.text('two')) + let point1 = await text1.getBoundsCenter() + let point2 = await text2.getBoundsCenter() + await driver.mouseDrag(point1, point2, 600, 3000) + await driver.delayMs(2000) + let text = await driver.findComponent(ON.text('one').isBefore(ON.text('two'))) + expect(text == null).assertTrue() + console.log(TestTag, 'testNewMouseDrag over'); + }) + + /* + * @tc.name: testNewMouseLongClick + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测uitest 鼠标长按操作, 该接口从20开始支持使用. + */ + it('testNewMouseLongClick', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + console.log(TestTag, 'testNewMouseLongClick start'); + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(1000); + let Button = await driver.findComponent(ON.text('next page')) + let center = await Button.getBoundsCenter() + await driver.mouseLongClick(center, MouseButton.MOUSE_BUTTON_LEFT, 0, 0, 3000) + await driver.delayMs(waitUiReadyMs) + let newButton = await driver.findComponent(ON.text('longClick')) + let text = await newButton.getText() + expect(text == 'longClick').assertTrue() + console.log(TestTag, 'testNewMouseLongClick over'); + }) + + + /* + * @tc.number: uiTest_20025 + * @tc.name: testDragBetween + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测uitest拖拽操作, 该接口从20开始支持使用. + */ + it('testDragBetween', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + console.log(TestTag, 'testDragBetween start'); + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let button = await driver.findComponent(ON.id('jump')) + await button.longClick() + await driver.delayMs(waitUiReadyMs) + let text1 = await driver.findComponent(ON.text('one')) + let text2 = await driver.findComponent(ON.text('two')) + let center1 = await text1.getBoundsCenter() + let center2 = await text2.getBoundsCenter() + await driver.dragBetween(center1, center2, 3000, 3000) + await driver.delayMs(waitUiReadyMs) + let text = await driver.findComponent(ON.text('one').isBefore(ON.text('two'))) + expect(text == null).assertTrue() + console.log(TestTag, 'testDragBetween over'); + }) }) } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/OtherEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/OtherEvent.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..29d8af712ea065f87220f8ffb723a170d7e6aa5c --- /dev/null +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/OtherEvent.test.ets @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2025 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, it, expect, TestType, beforeAll, Level, Size } from '@ohos/hypium'; +import abilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'; +import { Driver, ON} from '@ohos.UiTest' +import { BusinessError } from '@ohos.base'; +import display from '@ohos.display'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; + +const delegator : AbilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName : string = abilityDelegatorRegistry.getArguments().bundleName; +const waitUiReadyMs : number = 1000; + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} + +export default function otherEvent() { + describe('otherEvent', () => { + beforeAll(async () => { + }) + + /* + * @tc.name: testPressBackWithId + * @tc.desc: pressBack test,该接口从api20开始支持使用。 + */ + it('testPressBackWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + let button = await driver.findComponent(ON.belongingDisplay(disPlay.id).text('next page')) + await button.click() + await driver.delayMs(waitUiReadyMs) + await driver.pressBack(disPlay.id) + await driver.delayMs(waitUiReadyMs) + let button_ori = await driver.findComponent(ON.belongingDisplay(disPlay.id).text('next page')) + expect(await button_ori.getText() == 'next page').assertTrue() + }) + + /* + * @tc.name: testTriggerKeyWithId + * @tc.desc: triggerKey test,该接口从api20开始支持使用。 + */ + it('testTriggerKeyWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + await driver.delayMs(waitUiReadyMs) + let button = await driver.findComponent(ON.belongingDisplay(disPlay.id).text('next page')) + await button.click() + await driver.delayMs(waitUiReadyMs) + let keyBack = 2 + await driver.triggerKey(keyBack, disPlay.id) + await driver.delayMs(waitUiReadyMs) + let button_ori = await driver.findComponent(ON.belongingDisplay(disPlay.id).text('next page')) + expect(await button_ori.getText() == 'next page').assertTrue() + }) + + + /* + * @tc.name: testPressHomeWithId + * @tc.desc: pressHome test,该接口从api20开始支持使用。 + */ + it('testPressHomeWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + await driver.pressHome(disPlay.id) + await driver.delayMs(1000) + let button = await driver.findComponent(ON.belongingDisplay(disPlay.id).text('next page')) + expect(button == null).assertTrue() + }) + + }) +} \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/ScreenCapEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/ScreenCapEvent.test.ets index 268551890806b6f7f38eae85270d58b1265bc532..e47ec903a4c11104f84b2cb52d5496fbde289bc5 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/ScreenCapEvent.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/ScreenCapEvent.test.ets @@ -13,9 +13,20 @@ * limitations under the License. */ -import { describe, it, expect, TestType } from '@ohos/hypium'; -import { Driver } from '@kit.TestKit'; +import { describe, it, expect, TestType, Level, Size } from '@ohos/hypium'; +import { abilityDelegatorRegistry, Driver } from '@kit.TestKit'; +import { BusinessError } from '@ohos.base'; +import display from '@ohos.display'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; + +const delegator : AbilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName : string = abilityDelegatorRegistry.getArguments().bundleName; +const waitUiReadyMs : number = 1000; const WAIT_UI_READYMS = 1000; + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} export default function ScreenCapEventTest() { describe('ScreenCapEvent', () => { @@ -36,7 +47,7 @@ export default function ScreenCapEventTest() { /** * @tc.number:ScreenCapEventTest_001 - * @tc.name: testScreenCap + * @tc.name: testScreenCap * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest screenCapture 指定大小截图功能 */ @@ -48,5 +59,21 @@ export default function ScreenCapEventTest() { expect(success === true).assertTrue(); done(); }) + + /** + * @tc.name: testScreenCapWithId + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测多屏下 uitest screenCapture 指定大小截图功能, + */ + it('testScreenCapWithId', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + await driver.delayMs(waitUiReadyMs) + let savePath = '/data/storage/el2/base/cache/1.png' + let success = await driver.screenCap(savePath, disPlay.id) + expect(success == true).assertTrue() + }) }) } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/SwipeEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/SwipeEvent.test.ets index 69f962ca4ed705000935683e436d9b293646f955..2f2b62060c62191fc13e10fed1d4655cb3154d8d 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/SwipeEvent.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/SwipeEvent.test.ets @@ -13,13 +13,20 @@ * limitations under the License. */ -import { describe, beforeAll, it, expect, TestType } from '@ohos/hypium'; -import { Want } from '@kit.AbilityKit'; +import { describe, beforeAll, it, expect, TestType, Level, Size } from '@ohos/hypium'; import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { Want } from '@kit.AbilityKit'; +import { BusinessError } from '@ohos.base'; +import { display } from '@kit.ArkUI'; const delegator = abilityDelegatorRegistry.getAbilityDelegator(); const bundleName = abilityDelegatorRegistry.getArguments().bundleName; const WAIT_UI_READYMS = 1000; +const waitUiReadyMs : number = 1000; + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} export default function SwipeEventTest() { describe('SwipeEvent', () => { @@ -69,5 +76,26 @@ export default function SwipeEventTest() { expect(textZeroNot).assertNull(); done(); }) + + /* + * @tc.name: test_swipeBetween + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测 uitest swipe 竖着滑到功能 坐标点仅支持RK3568 + */ + it('test_swipeBetween', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + await startAbility(bundleName, 'DemoAbility') + let driver = Driver.create() + await driver.delayMs(waitUiReadyMs) + let disPlay = display.getDefaultDisplaySync(); + let scoll = await driver.findComponent(ON.type('Scroll')) + let rect = await scoll.getBounds() + let center = await scoll.getBoundsCenter() + await driver.swipeBetween({x: center.x, y: Math.floor(center.y + (rect.bottom - rect.top) / 4) + , displayId: disPlay.id}, + {x: center.x, y: Math.floor(center.y - (rect.bottom - rect.top) / 4), displayId: disPlay.id}) + await driver.delayMs(waitUiReadyMs) + let text = await driver.findComponent(ON.text('toast')) + expect(text == null).assertTrue() + }) }) } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/WearAbleEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/WearAbleEvent.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..4e5a1543b069b05b2d83cfd4763dcaf90733923c --- /dev/null +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/WearAbleEvent.test.ets @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2025 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, it, expect, TestType, beforeAll, Level, Size } from '@ohos/hypium'; +import abilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'; +import {Driver, ON} from '@ohos.UiTest' +import { BusinessError } from '@ohos.base'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; + +const delegator : AbilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName : string = abilityDelegatorRegistry.getArguments().bundleName; +const CapabilityCode = 801; + +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} + +export default function wearAbleEventTest() { + describe('wearAbleEventTest', () => { + beforeAll(async () => { + }) + /* + * @tc.name: testCrownRotate + * @tc.desc: crownRotate test,该接口从api20开始支持使用。 + */ + it('testCrownRotate', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(1000); + let btn = await driver.findComponent(ON.text('Click twice')) + if (btn == null) { + let scorll = await driver.findComponent(ON.type('Scroll')) + btn = await scorll.scrollSearch(ON.text('Click twice')) + } + await btn.longClick(); + try { + await driver.crownRotate(50); + await driver.delayMs(1000); + let toastBtn = await driver.findComponent(ON.text('1')); + await driver.delayMs(1000); + expect(toastBtn == null).assertTrue(); + await driver.delayMs(1000); + await driver.crownRotate(-50); + await driver.delayMs(1000); + let toastBtn1 = await driver.findComponent(ON.text('1')); + await driver.delayMs(1000); + expect(toastBtn1 != null).assertTrue(); + } catch (error) { + expect(error.code).assertEqual(CapabilityCode); + } + }) + }) +} \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/clickEvent.test.ets b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/clickEvent.test.ets index 76c54367db24671f581812ecf716e12c5106b76e..866a508a01ca734d77d8dd878aa0ccd5f06c9f3c 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/clickEvent.test.ets +++ b/code/Project/Test/uitest/entry/src/ohosTest/ets/test/operationExampleTest/ui/clickEvent.test.ets @@ -13,13 +13,19 @@ * limitations under the License. */ -import { describe, it, expect, TestType, beforeAll } from '@ohos/hypium'; +import { describe, it, expect, TestType, beforeAll, Level, Size } from '@ohos/hypium'; import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; import { Want } from '@kit.AbilityKit'; +import { BusinessError } from '@ohos.base'; + const delegator = abilityDelegatorRegistry.getAbilityDelegator(); const bundleName = abilityDelegatorRegistry.getArguments().bundleName; const WAIT_UI_READYMS = 1000; +const waitUiReadyMs : number = 1000; +async function startAbility(bundleName: string, abilityName: string) { + await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`); +} export default function clickEventTest() { describe('clickEventTest', () => { beforeAll(async () => { @@ -76,7 +82,7 @@ export default function clickEventTest() { it('clickEventTest_Long_click', TestType.FUNCTION, async (done: Function) => { let driver = Driver.create(); await driver.delayMs(WAIT_UI_READYMS); - let button = await driver.findComponent(ON.text('Click twice')); + let button = await driver.findComponent(ON.text('LongClick')); await button.longClick(); await driver.delayMs(WAIT_UI_READYMS); let newButton = await driver.findComponent(ON.text('longClick')); @@ -87,7 +93,24 @@ export default function clickEventTest() { }) /** - * @tc.number:clickEventTest_004 + * @tc.name: clickEventTest_LongClickAt + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测uitest long click 功能 该接口从API 20开始支持。 + */ + it('clickEventTest_LongClickAt', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + let driver = Driver.create() + await driver.delayMs(1000); + let button = await driver.findComponent(ON.text('LongClick')); + let center = await button.getBoundsCenter() + await driver.longClickAt(center, 3000) + await driver.delayMs(waitUiReadyMs) + let newButton = await driver.findComponent(ON.text('longClick')) + let text = await newButton.getText() + expect(text == 'longClick').assertTrue() + await newButton.click() + }) + + /** * @tc.name: clickEventTest_double_click * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 * @tc.desc: 检测uitest PressBack 功能 @@ -95,7 +118,7 @@ export default function clickEventTest() { it('clickEventTest_PressBack', TestType.FUNCTION, async (done: Function) => { let driver = Driver.create(); await driver.delayMs(WAIT_UI_READYMS); - let button = await driver.findComponent(ON.text('Click twice')); + let button = await driver.findComponent(ON.text('LongClick')); await button.longClick(); await driver.delayMs(WAIT_UI_READYMS); await driver.pressBack(); @@ -115,7 +138,7 @@ export default function clickEventTest() { it('clickEventTest_TriggerKey', TestType.FUNCTION, async (done: Function) => { let driver = Driver.create(); await driver.delayMs(WAIT_UI_READYMS); - let button = await driver.findComponent(ON.text('Click twice')); + let button = await driver.findComponent(ON.text('LongClick')); await button.longClick(); await driver.delayMs(WAIT_UI_READYMS); let keyBack = 2; // back @@ -125,5 +148,47 @@ export default function clickEventTest() { expect(await button_ori.getText() === 'Click twice').assertTrue(); done(); }) + + /** + * @tc.name: clickEventTest_ClickAt + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测uitest 点击功能,该接口从api20开始支持使用。 + */ + it('clickEventTest_ClickAt', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(waitUiReadyMs) + let Button = await driver.findComponent(ON.text('next page')) + let center = await Button.getBoundsCenter() + await driver.clickAt(center) + await driver.delayMs(waitUiReadyMs) + let newButton = await driver.findComponent(ON.text('back to index')) + let text = await newButton.getText() + expect(text == 'back to index').assertTrue() + await newButton.click() + }) + + /** + * @tc.name: clickEventTest_DoubleClickAt + * @tc.type: 0 || TestType.FUNCTION || Size.SMALLTEST || Level.LEVEL0 + * @tc.desc: 检测uitest 双击功能,该接口从api20开始支持使用。 + */ + it('clickEventTest_DoubleClickAt', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL3, async () => { + let driver = Driver.create() + await startAbility(bundleName, 'DemoAbility') + await driver.delayMs(waitUiReadyMs) + let Button = await driver.findComponent(ON.text('Click twice')) + if (Button == null) { + let scorll = await driver.findComponent(ON.type('Scroll')) + Button = await scorll.scrollSearch(ON.text('Click twice')) + } + let center = await Button.getBoundsCenter() + await driver.doubleClickAt(center) + await driver.delayMs(waitUiReadyMs) + let button = await driver.findComponent(ON.text('doubleClick')) + let text = await button.getText() + expect(text == 'doubleClick').assertTrue() + await button.click() + }) }) } \ No newline at end of file diff --git a/code/Project/Test/uitest/entry/src/ohosTest/module.json5 b/code/Project/Test/uitest/entry/src/ohosTest/module.json5 index 25d098c2f0735fdf9193fd3e5e69451ce5dc9180..8d3c12f70f029c91a0114b9fabf6bc6d8d56c0f5 100644 --- a/code/Project/Test/uitest/entry/src/ohosTest/module.json5 +++ b/code/Project/Test/uitest/entry/src/ohosTest/module.json5 @@ -21,7 +21,6 @@ "mainElement": "TestAbility", "deviceTypes": [ "default", - "tablet" ], "deliveryWithInstall": true, "installationFree": false, diff --git a/code/Project/Test/uitest/hvigor/hvigor-config.json5 b/code/Project/Test/uitest/hvigor/hvigor-config.json5 index daf43fa39fea3d8be6303e705818ee2857c80d10..1184fafb8b47dc3d75a5ea14023402cba85d3b6a 100644 --- a/code/Project/Test/uitest/hvigor/hvigor-config.json5 +++ b/code/Project/Test/uitest/hvigor/hvigor-config.json5 @@ -1,21 +1,5 @@ -/* - * Copyright (c) 2024 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. - */ - { - "hvigorVersion": "4.0.4", + "modelVersion": "5.0.4", "dependencies": { - "@ohos/hvigor-ohos-plugin": "4.0.4" }, } \ No newline at end of file diff --git a/code/Project/Test/uitest/hvigor/hvigor-wrapper.js b/code/Project/Test/uitest/hvigor/hvigor-wrapper.js deleted file mode 100644 index 372eae8eb4a124095936f9cd78df5c6756746f3f..0000000000000000000000000000000000000000 --- a/code/Project/Test/uitest/hvigor/hvigor-wrapper.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var u=require("path"),D=require("os"),e=require("fs"),t=require("crypto"),r=require("child_process"),n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i={},C={},F=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(C,"__esModule",{value:!0}),C.maxPathLength=C.isMac=C.isLinux=C.isWindows=void 0;const E=F(D),A="Windows_NT",o="Darwin";function a(){return E.default.type()===A}function c(){return E.default.type()===o}C.isWindows=a,C.isLinux=function(){return"Linux"===E.default.type()},C.isMac=c,C.maxPathLength=function(){return c()?1016:a()?259:4095},function(e){var t=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),r=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),i=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&t(D,u,e);return r(D,u),D};Object.defineProperty(e,"__esModule",{value:!0}),e.WORK_SPACE=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.PROJECT_CACHES=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const F=i(D),E=i(u),A=C;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,A.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,A.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=E.resolve(F.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=E.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.PROJECT_CACHES="project_caches",e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=E.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=E.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=E.resolve(e.HVIGOR_USER_HOME,e.PROJECT_CACHES),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_WRAPPER_HOME=E.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.WORK_SPACE="workspace"}(i);var s={},l={};Object.defineProperty(l,"__esModule",{value:!0}),l.logInfoPrintConsole=l.logErrorAndExit=void 0,l.logErrorAndExit=function(u){u instanceof Error?console.error(u.message):console.error(u),process.exit(-1)},l.logInfoPrintConsole=function(u){console.log(u)};var B=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),d=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),f=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&B(D,u,e);return d(D,u),D};Object.defineProperty(s,"__esModule",{value:!0});var _=s.executeBuild=void 0;const p=f(e),O=f(u),h=l;_=s.executeBuild=function(u){const D=O.resolve(u,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const u=p.realpathSync(D);require(u)}catch(e){(0,h.logErrorAndExit)(`Error: ENOENT: no such file ${D},delete ${u} and retry.`)}};var P={},v={};!function(u){var D=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(u,"__esModule",{value:!0}),u.hashFile=u.hash=u.createHash=void 0;const r=D(t),i=D(e);u.createHash=(u="MD5")=>r.default.createHash(u);u.hash=(D,e)=>(0,u.createHash)(e).update(D).digest("hex");u.hashFile=(D,e)=>{if(i.default.existsSync(D))return(0,u.hash)(i.default.readFileSync(D,"utf-8"),e)}}(v);var g={},m={},R={};Object.defineProperty(R,"__esModule",{value:!0}),R.Unicode=void 0;class y{}R.Unicode=y,y.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,y.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,y.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(m,"__esModule",{value:!0}),m.JudgeUtil=void 0;const I=R;m.JudgeUtil=class{static isIgnoreChar(u){return"string"==typeof u&&("\t"===u||"\v"===u||"\f"===u||" "===u||" "===u||"\ufeff"===u||"\n"===u||"\r"===u||"\u2028"===u||"\u2029"===u)}static isSpaceSeparator(u){return"string"==typeof u&&I.Unicode.SPACE_SEPARATOR.test(u)}static isIdStartChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||I.Unicode.ID_START.test(u))}static isIdContinueChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||I.Unicode.ID_CONTINUE.test(u))}static isDigitWithoutZero(u){return/[1-9]/.test(u)}static isDigit(u){return"string"==typeof u&&/[0-9]/.test(u)}static isHexDigit(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};var N=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(g,"__esModule",{value:!0}),g.parseJsonText=g.parseJsonFile=void 0;const b=N(e),S=N(D),w=N(u),H=m;var x;!function(u){u[u.Char=0]="Char",u[u.EOF=1]="EOF",u[u.Identifier=2]="Identifier"}(x||(x={}));let M,T,V,G,j,J,W="start",U=[],L=0,$=1,k=0,K=!1,z="default",q="'",Z=1;function X(u,D=!1){T=String(u),W="start",U=[],L=0,$=1,k=0,G=void 0,K=D;do{M=Q(),nu[W]()}while("eof"!==M.type);return G}function Q(){for(z="default",j="",q="'",Z=1;;){J=Y();const u=Du[z]();if(u)return u}}function Y(){if(T[L])return String.fromCodePoint(T.codePointAt(L))}function uu(){const u=Y();return"\n"===u?($++,k=0):u?k+=u.length:k++,u&&(L+=u.length),u}g.parseJsonFile=function(u,D=!1,e="utf-8"){const t=b.default.readFileSync(w.default.resolve(u),{encoding:e});try{return X(t,D)}catch(D){if(D instanceof SyntaxError){const e=D.message.split("at");if(2===e.length)throw new Error(`${e[0].trim()}${S.default.EOL}\t at ${u}:${e[1].trim()}`)}throw new Error(`${u} is not in valid JSON/JSON5 format.`)}},g.parseJsonText=X;const Du={default(){switch(J){case"/":return uu(),void(z="comment");case void 0:return uu(),eu("eof")}if(!H.JudgeUtil.isIgnoreChar(J)&&!H.JudgeUtil.isSpaceSeparator(J))return Du[W]();uu()},start(){z="value"},beforePropertyName(){switch(J){case"$":case"_":return j=uu(),void(z="identifierName");case"\\":return uu(),void(z="identifierNameStartEscape");case"}":return eu("punctuator",uu());case'"':case"'":return q=J,uu(),void(z="string")}if(H.JudgeUtil.isIdStartChar(J))return j+=uu(),void(z="identifierName");throw Eu(x.Char,uu())},afterPropertyName(){if(":"===J)return eu("punctuator",uu());throw Eu(x.Char,uu())},beforePropertyValue(){z="value"},afterPropertyValue(){switch(J){case",":case"}":return eu("punctuator",uu())}throw Eu(x.Char,uu())},beforeArrayValue(){if("]"===J)return eu("punctuator",uu());z="value"},afterArrayValue(){switch(J){case",":case"]":return eu("punctuator",uu())}throw Eu(x.Char,uu())},end(){throw Eu(x.Char,uu())},comment(){switch(J){case"*":return uu(),void(z="multiLineComment");case"/":return uu(),void(z="singleLineComment")}throw Eu(x.Char,uu())},multiLineComment(){switch(J){case"*":return uu(),void(z="multiLineCommentAsterisk");case void 0:throw Eu(x.Char,uu())}uu()},multiLineCommentAsterisk(){switch(J){case"*":return void uu();case"/":return uu(),void(z="default");case void 0:throw Eu(x.Char,uu())}uu(),z="multiLineComment"},singleLineComment(){switch(J){case"\n":case"\r":case"\u2028":case"\u2029":return uu(),void(z="default");case void 0:return uu(),eu("eof")}uu()},value(){switch(J){case"{":case"[":return eu("punctuator",uu());case"n":return uu(),tu("ull"),eu("null",null);case"t":return uu(),tu("rue"),eu("boolean",!0);case"f":return uu(),tu("alse"),eu("boolean",!1);case"-":case"+":return"-"===uu()&&(Z=-1),void(z="numerical");case".":case"0":case"I":case"N":return void(z="numerical");case'"':case"'":return q=J,uu(),j="",void(z="string")}if(void 0===J||!H.JudgeUtil.isDigitWithoutZero(J))throw Eu(x.Char,uu());z="numerical"},numerical(){switch(J){case".":return j=uu(),void(z="decimalPointLeading");case"0":return j=uu(),void(z="zero");case"I":return uu(),tu("nfinity"),eu("numeric",Z*(1/0));case"N":return uu(),tu("aN"),eu("numeric",NaN)}if(void 0!==J&&H.JudgeUtil.isDigitWithoutZero(J))return j=uu(),void(z="decimalInteger");throw Eu(x.Char,uu())},zero(){switch(J){case".":case"e":case"E":return void(z="decimal");case"x":case"X":return j+=uu(),void(z="hexadecimal")}return eu("numeric",0)},decimalInteger(){switch(J){case".":case"e":case"E":return void(z="decimal")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimal(){switch(J){case".":j+=uu(),z="decimalFraction";break;case"e":case"E":j+=uu(),z="decimalExponent"}},decimalPointLeading(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalFraction");throw Eu(x.Char,uu())},decimalFraction(){switch(J){case"e":case"E":return j+=uu(),void(z="decimalExponent")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimalExponent(){switch(J){case"+":case"-":return j+=uu(),void(z="decimalExponentSign")}if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentSign(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentInteger(){if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},hexadecimal(){if(H.JudgeUtil.isHexDigit(J))return j+=uu(),void(z="hexadecimalInteger");throw Eu(x.Char,uu())},hexadecimalInteger(){if(!H.JudgeUtil.isHexDigit(J))return eu("numeric",Z*Number(j));j+=uu()},identifierNameStartEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":break;default:if(!H.JudgeUtil.isIdStartChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},identifierName(){switch(J){case"$":case"_":case"‌":case"‍":return void(j+=uu());case"\\":return uu(),void(z="identifierNameEscape")}if(!H.JudgeUtil.isIdContinueChar(J))return eu("identifier",j);j+=uu()},identifierNameEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!H.JudgeUtil.isIdContinueChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},string(){switch(J){case"\\":return uu(),void(j+=function(){const u=Y(),D=function(){switch(Y()){case"b":return uu(),"\b";case"f":return uu(),"\f";case"n":return uu(),"\n";case"r":return uu(),"\r";case"t":return uu(),"\t";case"v":return uu(),"\v"}return}();if(D)return D;switch(u){case"0":if(uu(),H.JudgeUtil.isDigit(Y()))throw Eu(x.Char,uu());return"\0";case"x":return uu(),function(){let u="",D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());if(u+=uu(),D=Y(),!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());return u+=uu(),String.fromCodePoint(parseInt(u,16))}();case"u":return uu(),ru();case"\n":case"\u2028":case"\u2029":return uu(),"";case"\r":return uu(),"\n"===Y()&&uu(),""}if(void 0===u||H.JudgeUtil.isDigitWithoutZero(u))throw Eu(x.Char,uu());return uu()}());case'"':case"'":if(J===q){const u=eu("string",j);return uu(),u}return void(j+=uu());case"\n":case"\r":case void 0:throw Eu(x.Char,uu());case"\u2028":case"\u2029":!function(u){console.warn(`JSON5: '${Fu(u)}' in strings is not valid ECMAScript; consider escaping.`)}(J)}j+=uu()}};function eu(u,D){return{type:u,value:D,line:$,column:k}}function tu(u){for(const D of u){if(Y()!==D)throw Eu(x.Char,uu());uu()}}function ru(){let u="",D=4;for(;D-- >0;){const D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());u+=uu()}return String.fromCodePoint(parseInt(u,16))}const nu={start(){if("eof"===M.type)throw Eu(x.EOF);iu()},beforePropertyName(){switch(M.type){case"identifier":case"string":return V=M.value,void(W="afterPropertyName");case"punctuator":return void Cu();case"eof":throw Eu(x.EOF)}},afterPropertyName(){if("eof"===M.type)throw Eu(x.EOF);W="beforePropertyValue"},beforePropertyValue(){if("eof"===M.type)throw Eu(x.EOF);iu()},afterPropertyValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforePropertyName");case"}":Cu()}},beforeArrayValue(){if("eof"===M.type)throw Eu(x.EOF);"punctuator"!==M.type||"]"!==M.value?iu():Cu()},afterArrayValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforeArrayValue");case"]":Cu()}},end(){}};function iu(){const u=function(){let u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}return u}();if(K&&"object"==typeof u&&(u._line=$,u._column=k),void 0===G)G=u;else{const D=U[U.length-1];Array.isArray(D)?K&&"object"!=typeof u?D.push({value:u,_line:$,_column:k}):D.push(u):D[V]=K&&"object"!=typeof u?{value:u,_line:$,_column:k}:u}!function(u){if(u&&"object"==typeof u)U.push(u),W=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}}(u)}function Cu(){U.pop();const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}function Fu(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return`\\x${`00${D}`.substring(D.length)}`}return u}function Eu(u,D){let e="";switch(u){case x.Char:e=void 0===D?`JSON5: invalid end of input at ${$}:${k}`:`JSON5: invalid character '${Fu(D)}' at ${$}:${k}`;break;case x.EOF:e=`JSON5: invalid end of input at ${$}:${k}`;break;case x.Identifier:k-=5,e=`JSON5: invalid identifier character at ${$}:${k}`}const t=new Au(e);return t.lineNumber=$,t.columnNumber=k,t}class Au extends SyntaxError{}var ou={},au=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),cu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),su=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&au(D,u,e);return cu(D,u),D},lu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(ou,"__esModule",{value:!0}),ou.isFileExists=ou.offlinePluginConversion=ou.executeCommand=ou.getNpmPath=ou.hasNpmPackInPaths=void 0;const Bu=r,du=lu(e),fu=su(u),_u=i,pu=l;ou.hasNpmPackInPaths=function(u,D){try{return require.resolve(u,{paths:[...D]}),!0}catch(u){return!1}},ou.getNpmPath=function(){const u=process.execPath;return fu.join(fu.dirname(u),_u.NPM_TOOL)},ou.executeCommand=function(u,D,e){0!==(0,Bu.spawnSync)(u,D,e).status&&(0,pu.logErrorAndExit)(`Error: ${u} ${D} execute failed.See above for details.`)},ou.offlinePluginConversion=function(u,D){return D.startsWith("file:")||D.endsWith(".tgz")?fu.resolve(u,_u.HVIGOR,D.replace("file:","")):D},ou.isFileExists=function(u){return du.default.existsSync(u)&&du.default.statSync(u).isFile()};var Ou=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),hu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),Pu=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&Ou(D,u,e);return hu(D,u),D},vu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(P,"__esModule",{value:!0});var gu=P.initProjectWorkSpace=void 0;const mu=Pu(e),Ru=vu(D),yu=Pu(u),Iu=v,Nu=i,bu=g,Su=l,wu=ou;let Hu,xu,Mu;function Tu(u,D,e){return void 0!==e.dependencies&&(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,D.dependencies[u])===yu.normalize(e.dependencies[u])}function Vu(){const u=yu.join(Mu,Nu.WORK_SPACE);if((0,Su.logInfoPrintConsole)("Hvigor cleaning..."),!mu.existsSync(u))return;const D=mu.readdirSync(u);if(!D||0===D.length)return;const e=yu.resolve(Mu,"node_modules","@ohos","hvigor","bin","hvigor.js");mu.existsSync(e)&&(0,wu.executeCommand)(process.argv[0],[e,"--stop-daemon"],{});try{D.forEach((D=>{mu.rmSync(yu.resolve(u,D),{recursive:!0})}))}catch(D){(0,Su.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${u}.`)}}gu=P.initProjectWorkSpace=function(){if(Hu=function(){const u=yu.resolve(Nu.HVIGOR_PROJECT_WRAPPER_HOME,Nu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);mu.existsSync(u)||(0,Su.logErrorAndExit)(`Error: Hvigor config file ${u} does not exist.`);return(0,bu.parseJsonFile)(u)}(),Mu=function(u){let D;D=function(u){let D=u.hvigorVersion;if(D.startsWith("file:")||D.endsWith(".tgz"))return!1;const e=u.dependencies,t=Object.getOwnPropertyNames(e);for(const u of t){const D=e[u];if(D.startsWith("file:")||D.endsWith(".tgz"))return!1}if(1===t.length&&"@ohos/hvigor-ohos-plugin"===t[0])return D>"2.5.0";return!1}(u)?function(u){let D=`${Nu.HVIGOR_ENGINE_PACKAGE_NAME}@${u.hvigorVersion}`;const e=u.dependencies;if(e){Object.getOwnPropertyNames(e).sort().forEach((u=>{D+=`,${u}@${e[u]}`}))}return(0,Iu.hash)(D)}(u):(0,Iu.hash)(process.cwd());return yu.resolve(Ru.default.homedir(),".hvigor","project_caches",D)}(Hu),xu=function(){const u=yu.resolve(Mu,Nu.WORK_SPACE,Nu.DEFAULT_PACKAGE_JSON);return mu.existsSync(u)?(0,bu.parseJsonFile)(u):{dependencies:{}}}(),!(0,wu.hasNpmPackInPaths)(Nu.HVIGOR_ENGINE_PACKAGE_NAME,[yu.join(Mu,Nu.WORK_SPACE)])||(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion)!==xu.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function u(u){const D=null==u?void 0:u.dependencies;return void 0===D?0:Object.getOwnPropertyNames(D).length}const D=u(Hu),e=u(xu);if(D+1!==e)return!1;for(const u in null==Hu?void 0:Hu.dependencies)if(!(0,wu.hasNpmPackInPaths)(u,[yu.join(Mu,Nu.WORK_SPACE)])||!Tu(u,Hu,xu))return!1;return!0}()){Vu();try{!function(){(0,Su.logInfoPrintConsole)("Hvigor installing...");for(const u in Hu.dependencies)Hu.dependencies[u]&&(Hu.dependencies[u]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.dependencies[u]));const u={dependencies:{...Hu.dependencies}};u.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion);const D=yu.join(Mu,Nu.WORK_SPACE);try{mu.mkdirSync(D,{recursive:!0});const e=yu.resolve(D,Nu.DEFAULT_PACKAGE_JSON);mu.writeFileSync(e,JSON.stringify(u))}catch(u){(0,Su.logErrorAndExit)(u)}(function(){const u=["config","set","store-dir",Nu.HVIGOR_PNPM_STORE_PATH],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)})(),function(){const u=["install"],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)}(),(0,Su.logInfoPrintConsole)("Hvigor install success.")}()}catch(u){Vu()}}return Mu};var Gu={};!function(t){var C=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),F=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),E=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&C(D,u,e);return F(D,u),D},A=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(t,"__esModule",{value:!0}),t.executeInstallPnpm=t.isPnpmInstalled=t.environmentHandler=t.checkNpmConifg=t.PNPM_VERSION=void 0;const o=r,a=E(e),c=A(D),s=E(u),B=i,d=l,f=ou;t.PNPM_VERSION="7.30.0",t.checkNpmConifg=function(){const u=s.resolve(B.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),D=s.resolve(c.default.homedir(),".npmrc");if((0,f.isFileExists)(u)||(0,f.isFileExists)(D))return;const e=(0,f.getNpmPath)(),t=(0,o.spawnSync)(e,["config","get","prefix"],{cwd:B.HVIGOR_PROJECT_ROOT_DIR});if(0!==t.status||!t.stdout)return void(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const r=s.resolve(`${t.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,f.isFileExists)(r)||(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},t.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},t.isPnpmInstalled=function(){return!!a.existsSync(B.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,f.hasNpmPackInPaths)("pnpm",[B.HVIGOR_WRAPPER_TOOLS_HOME])},t.executeInstallPnpm=function(){(0,d.logInfoPrintConsole)(`Installing pnpm@${t.PNPM_VERSION}...`);const u=(0,f.getNpmPath)();!function(){const u=s.resolve(B.HVIGOR_WRAPPER_TOOLS_HOME,B.DEFAULT_PACKAGE_JSON);try{a.existsSync(B.HVIGOR_WRAPPER_TOOLS_HOME)||a.mkdirSync(B.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const D={dependencies:{}};D.dependencies[B.PNPM]=t.PNPM_VERSION,a.writeFileSync(u,JSON.stringify(D))}catch(D){(0,d.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${u} failed.`)}}(),(0,f.executeCommand)(u,["install","pnpm"],{cwd:B.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,d.logInfoPrintConsole)("Pnpm install success.")}}(Gu),function(){Gu.checkNpmConifg(),Gu.environmentHandler(),Gu.isPnpmInstalled()||Gu.executeInstallPnpm();const D=gu();_(u.join(D,i.WORK_SPACE))}(); \ No newline at end of file diff --git a/code/Project/Test/uitest/hvigorw b/code/Project/Test/uitest/hvigorw deleted file mode 100644 index 4956d4f1d061a6445f025266489d8b42e56a8d98..0000000000000000000000000000000000000000 --- a/code/Project/Test/uitest/hvigorw +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------ -# Copyright (c) 2023 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. -# ---------------------------------------------------------------------------- -# ---------------------------------------------------------------------------- -# Hvigor startup script, version 1.0.0 -# -# Required ENV vars: -# ------------------ -# NODE_HOME - location of a Node home dir -# or -# Add /usr/local/nodejs/bin to the PATH environment variable -# ---------------------------------------------------------------------------- - -HVIGOR_APP_HOME=$(dirname $(readlink -f $0)) -HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js -warn() { - echo "" - echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" -} - -error() { - echo "" - echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" -} - -fail() { - error "$@" - exit 1 -} - -# Determine node to start hvigor wrapper script -if [ -n "${NODE_HOME}" ];then - EXECUTABLE_NODE="${NODE_HOME}/bin/node" - if [ ! -x "$EXECUTABLE_NODE" ];then - fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed" - fi -else - EXECUTABLE_NODE="node" - which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path" -fi - -# Check hvigor wrapper script -if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then - fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}" -fi - -# start hvigor-wrapper script -exec "${EXECUTABLE_NODE}" \ - "${HVIGOR_WRAPPER_SCRIPT}" "$@" diff --git a/code/Project/Test/uitest/hvigorw.bat b/code/Project/Test/uitest/hvigorw.bat deleted file mode 100644 index aca2a36cd2bb95ebe868abb8f367310384828612..0000000000000000000000000000000000000000 --- a/code/Project/Test/uitest/hvigorw.bat +++ /dev/null @@ -1,70 +0,0 @@ -:: Copyright (c) 2023 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. - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Hvigor startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js -set NODE_EXE=node.exe - -goto start - -:start -@rem Find node.exe -if defined NODE_HOME goto findNodeFromNodeHome - -%NODE_EXE% --version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. -echo. -echo Please set the NODE_HOME variable in your environment to match the -echo location of your NodeJs installation. - -goto fail - -:findNodeFromNodeHome -set NODE_HOME=%NODE_HOME:"=% -set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE% - -if exist "%NODE_EXE_PATH%" goto execute -echo. -echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. -echo. -echo Please set the NODE_HOME variable in your environment to match the -echo location of your NodeJs installation. - -goto fail - -:execute -@rem Execute hvigor -"%NODE_EXE%" %WRAPPER_MODULE_PATH% %* - -:fail -exit /b 1 diff --git a/code/Project/Test/uitest/oh-package.json5 b/code/Project/Test/uitest/oh-package.json5 index c99418b4c9d1ef20b7de69e015549179537ea54f..9fa420de7187213440b8b5910a2805e3730b9171 100644 --- a/code/Project/Test/uitest/oh-package.json5 +++ b/code/Project/Test/uitest/oh-package.json5 @@ -1,19 +1,5 @@ -/* -* Copyright (c) 2023 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. -*/ - { + "modelVersion": "5.0.4", "license": "ISC", "devDependencies": { "@ohos/hypium": "1.0.18" @@ -23,4 +9,4 @@ "repository": {}, "version": "1.0.0", "dependencies": {} -} +} \ No newline at end of file diff --git a/code/Project/Test/uitest/ohosTest.md b/code/Project/Test/uitest/ohosTest.md index a09e5f9a3461a2990207e3063cd60be87bfe861c..2710ce221a071aed9bcc5f2db27af24e5ab025a0 100644 --- a/code/Project/Test/uitest/ohosTest.md +++ b/code/Project/Test/uitest/ohosTest.md @@ -2,9 +2,11 @@ ## 用例表 -|测试功能|预置条件|输入|预期输出|测试结果| -|--------------------------------|--------------------------------|--------------------------------|--------------------------------|--------------------------------| -|UI操作点击指定按钮后,界面变化是否符合预期| 设备正常运行| |UI操作点击指定按钮后,界面变化符合预期|Pass| -|move window对象, window变好是否符合预期| 设备正常运行| |window变化符合预期|Pass| -|resize window对象, window变好是否符合预期| 设备正常运行| |window变化符合预期|Pass| -|获取window对象属性, 获取对象与预期一致| 设备正常运行| |获取属性与预期一致|Pass| \ No newline at end of file +| 测试功能 |预置条件|输入|预期输出|测试结果| +|---------------------------------|--------------------------------|--------------------------------|--------------------------------|--------------------------------| +| UI操作点击指定按钮后,界面变化是否符合预期 | 设备正常运行| |UI操作点击指定按钮后,界面变化符合预期|Pass| +| move window对象, window变好是否符合预期 | 设备正常运行| |window变化符合预期|Pass| +| resize window对象, window变好是否符合预期 | 设备正常运行| |window变化符合预期|Pass| +| 获取window对象属性, 获取对象与预期一致 | 设备正常运行| |获取属性与预期一致|Pass| +| 获取window对象属性, 获取对象与预期一致 | 设备正常运行| |获取属性与预期一致|Pass| +| 多屏下相关接口执行,相关结果是否与预期一致。 | 设备正常运行| |多屏下相关接口执行,相关结果是否与预期一致。 |Pass| \ No newline at end of file