From a80f30d2917f28123f76d0671e1003d415072a4d Mon Sep 17 00:00:00 2001 From: Roman Sedaikin Date: Fri, 21 Feb 2025 16:32:22 +0300 Subject: [PATCH 1/4] EtsHarness run v8 Signed-off-by: Roman Sedaikin --- arkoala-arkts/ets-harness/package.json | 15 ++- arkoala-arkts/ets-harness/src/AppControl.ts | 17 +++ .../ets-harness/src/ets/etsconfig-node.json | 27 +++++ arkoala-arkts/ets-harness/src/loader_node.ts | 41 +++++++ .../src/{loader.ts => loader_panda.ts} | 14 +-- arkoala-arkts/ets-harness/src/test_entry.ts | 2 +- .../ets-harness/tsconfig-node-unmemoize.json | 51 +++++++++ arkoala-arkts/ets-harness/tsconfig-node.json | 51 +++++++++ .../ets-harness/tsconfig-unmemoize.json | 3 +- arkoala-arkts/ets-harness/tsconfig.json | 5 +- .../ets-harness/webpack.config.node.js | 4 +- .../ets-harness/webpack.config.panda.js | 105 ++++++++++++++++++ arkoala/arkui-types/index-test.d.ts | 27 +++++ arkoala/arkui/src/ArkTestComponent.ts | 83 ++++++++++++++ arkoala/arkui/src/index.ts | 2 + .../arkui/src/peers/ArkTestComponentPeer.ts | 50 +++++++++ arkoala/arkui/tsconfig.json | 2 +- arkoala/framework/src/PeerNode.ts | 6 + 18 files changed, 484 insertions(+), 21 deletions(-) create mode 100644 arkoala-arkts/ets-harness/src/AppControl.ts create mode 100644 arkoala-arkts/ets-harness/src/ets/etsconfig-node.json create mode 100644 arkoala-arkts/ets-harness/src/loader_node.ts rename arkoala-arkts/ets-harness/src/{loader.ts => loader_panda.ts} (93%) create mode 100644 arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json create mode 100644 arkoala-arkts/ets-harness/tsconfig-node.json create mode 100644 arkoala-arkts/ets-harness/webpack.config.panda.js create mode 100644 arkoala/arkui-types/index-test.d.ts create mode 100644 arkoala/arkui/src/ArkTestComponent.ts create mode 100644 arkoala/arkui/src/peers/ArkTestComponentPeer.ts diff --git a/arkoala-arkts/ets-harness/package.json b/arkoala-arkts/ets-harness/package.json index 5aed1296ac..bf118e8069 100644 --- a/arkoala-arkts/ets-harness/package.json +++ b/arkoala-arkts/ets-harness/package.json @@ -13,14 +13,21 @@ "compile": "npm run compile:all", "compile:plugin": "cd ../../arkoala/ets-plugin && npm run compile", "compile:ets": "npm run compile:plugin && cd src/ets && ets-tsc -p ./etsconfig.json", + "compile:ets:node": "npm run compile:plugin && cd src/ets && ets-tsc -b ./etsconfig-node.json", "compile:unmemoize": "ets-tsc -p ./tsconfig-unmemoize.json", - "compile:loader": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.node.js", + "compile:unmemoize:node": "ets-tsc -p ./tsconfig-node-unmemoize.json", + "compile:loader:panda": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.panda.js", + "compile:loader:node": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.node.js", "compile:abc": "fast-arktsc --input-files ./arktsconfig.json --output-dir ./build --compiler ../../incremental/tools/panda/arkts/arktsc --link-name ets-harness && ninja ${NINJA_OPTIONS} -f build/build.ninja", - "compile:all": "npm run compile:ets && npm run compile:unmemoize && npm run compile:loader && npm run compile:abc", - "test:compile": "npm run compile:all && cp -r build/ets-harness.abc ../build/", + "compile:all:panda": "npm run compile:ets && npm run compile:unmemoize && npm run compile:loader:panda && npm run compile:abc", + "compile:all:node": "npm run compile:ets:node && npm run compile:unmemoize:node && npm run compile:loader:node", + "test:compile:node": "npm run compile:all:node", + "test:compile": "npm run compile:all:panda && cp -r build/ets-harness.abc ../build/", "run:pure": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk bash ../../incremental/tools/panda/arkts/ark build/ets-harness.abc --ark-boot-files ../build/arkoala.abc:../../incremental/harness/build/harness.abc --ark-entry-point @koalaui.ets-harness.build.unmemoized.src.loader.ETSGLOBAL::main", "run": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js panda:EtsHarness", - "test:run": "npm run test:compile && npm run run" + "run:node": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js", + "test:run": "npm run test:compile && npm run run", + "test:run:node": "npm run test:compile:node && npm run run:node" }, "keywords": [], "dependencies": { diff --git a/arkoala-arkts/ets-harness/src/AppControl.ts b/arkoala-arkts/ets-harness/src/AppControl.ts new file mode 100644 index 0000000000..31fc2c9087 --- /dev/null +++ b/arkoala-arkts/ets-harness/src/AppControl.ts @@ -0,0 +1,17 @@ +import { int32 } from "@koalaui/compat" + +export enum TaskType { + OnChange = 1, + StartLog = 2, + StopLog = 3, + GetLog = 4, +} + +export interface AppControl { + getLog(): string + emitTask(type: int32, target: int32, arg1?: int32, arg2?: int32): AppControl + start(): AppControl + stop(): AppControl + nextFrame(): AppControl + loadPage(page: string): AppControl +} diff --git a/arkoala-arkts/ets-harness/src/ets/etsconfig-node.json b/arkoala-arkts/ets-harness/src/ets/etsconfig-node.json new file mode 100644 index 0000000000..e33cab81fe --- /dev/null +++ b/arkoala-arkts/ets-harness/src/ets/etsconfig-node.json @@ -0,0 +1,27 @@ +{ + "extends": "@koalaui/arkui-common/config/tsconfig.base.json", + "include": [ + "./**/*.ets" + ], + "compilerOptions": { + "types": [], + "baseUrl": ".", + "rootDirs": [ + "." + ], + "outDir": "../../build/ets-junk", + "plugins": [ + { + "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", + "destination": "../../build/generated", + "arkui": "@koalaui/arkoala-arkui" + } + ], + "paths": { + "#arkcompat": ["../../../../arkola/arkui-common/src/typescript"], + "#arkcompat/*": ["../../../../arkola/arkui-common/src/typescript/*"], + "#common/wrappers/*": ["../../../../interop/src/napi/wrappers/*", "../../../../interop/src/wasm/wrappers/*"], + "#platform": ["../../../../incremental/compat/src/typescript"] + } + } +} diff --git a/arkoala-arkts/ets-harness/src/loader_node.ts b/arkoala-arkts/ets-harness/src/loader_node.ts new file mode 100644 index 0000000000..ba2e4a4999 --- /dev/null +++ b/arkoala-arkts/ets-harness/src/loader_node.ts @@ -0,0 +1,41 @@ +import { entry } from "./test_entry" +import { EtsHarnessApplication } from "./EtsHarnessApplication" +import { EtsHarness } from "./Page" +import { AppControl, TaskType } from "./AppControl" + +type int32 = number + +export class AppControlImpl implements AppControl { + constructor(public app: EtsHarnessApplication) {} + getLog(): string { + return this.app.emitEvent(TaskType.GetLog, -1, 0, 0) + } + emitTask(type: int32, target: int32, arg1: int32 = 0, arg2: int32 = 0): AppControl { + this.app.emitEvent(type, target, arg1, arg2) + return this + } + start(): AppControl { + this.app.emitEvent(TaskType.StartLog, -1, 0, 0) + return this + } + stop(): AppControl { + this.app.emitEvent(TaskType.StopLog, -1, 0, 0) + return this + } + nextFrame(): AppControl { + this.app.enter(0, 0) + return this + } + loadPage(page: string): AppControl { + this.app.restartWith(page) + return this + } +} + +export function loadVM(): void { + const userView = new EtsHarness("Case1") + const control = new AppControlImpl(new EtsHarnessApplication("EtsHarness", userView , false)) + entry(control) +} + +loadVM() diff --git a/arkoala-arkts/ets-harness/src/loader.ts b/arkoala-arkts/ets-harness/src/loader_panda.ts similarity index 93% rename from arkoala-arkts/ets-harness/src/loader.ts rename to arkoala-arkts/ets-harness/src/loader_panda.ts index d5754d526b..a1058d193b 100644 --- a/arkoala-arkts/ets-harness/src/loader.ts +++ b/arkoala-arkts/ets-harness/src/loader_panda.ts @@ -1,5 +1,5 @@ -import { int8Array } from "@koalaui/compat" import { entry } from "./test_entry" +import { AppControl, TaskType } from "./AppControl" type int32 = number type int64 = number @@ -46,14 +46,7 @@ export function nativeModule(): NativeControl { return theModule } -export enum TaskType { - OnChange = 1, - StartLog = 2, - StopLog = 3, - GetLog = 4, -} - -export class AppControl { +export class AppControlImpl implements AppControl { getLog(): string { return nativeModule()._EmitEvent(TaskType.GetLog, -1, 0, 0) } @@ -86,11 +79,12 @@ let app = "EtsHarness" let params = "Case1" export function loadVM(variant: string, app: string, params: string, loopIterations?: number): void { + const control = new AppControlImpl() + let classPath = __dirname let nativePath = __dirname let vmKind = 2 // panda - const control = new AppControl() const result = nativeModule()._LoadVirtualMachine(vmKind, classPath, nativePath) if (result == 0) { diff --git a/arkoala-arkts/ets-harness/src/test_entry.ts b/arkoala-arkts/ets-harness/src/test_entry.ts index 47cd0f1566..8c898a26df 100644 --- a/arkoala-arkts/ets-harness/src/test_entry.ts +++ b/arkoala-arkts/ets-harness/src/test_entry.ts @@ -1,5 +1,5 @@ import { Assert } from "@koalaui/harness" -import { AppControl, TaskType } from "./loader" +import { AppControl, TaskType } from "./AppControl" export function entry(control: AppControl) { suite("Case1", () => { diff --git a/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json b/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json new file mode 100644 index 0000000000..5f64728a1e --- /dev/null +++ b/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json @@ -0,0 +1,51 @@ +{ + "extends": "@koalaui/build-common/tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "module": "CommonJS", + "plugins": [ + { + "transform": "@koalaui/compiler-plugin/build/lib/src/koala-transformer.js", + "trace": false, + "only_unmemoize": true, + "unmemoizeDir": "./build/unmemoized" + } + ], + "outDir": "./build/lib", + "baseUrl": ".", + "paths": { + "#common/wrappers/*": ["../interop/src/napi/wrappers/*", "../interop/src/wasm/wrappers/*"], + "#arkcompat": ["../../arkoala/arkui-common/src/typescript"], + "#arkcompat/*": ["../../arkoala/arkui-common/src/typescript/*"], + "@koalaui/arkui-common": ["../../arkoala/arkui-common/src/typescript"], + "@koalaui/runtime": [ + "../../incremental/runtime" + ], + "@koalaui/harness": [ + "../../incremental/harness" + ], + "#components": [ + "../../arkoala/framework" + ], + } + }, + "include": [ + "./build/generated", + "./src/Page.ts", + "./src/EtsHarnessApplication.ts" + ], + "exclude": [ + ], + "references": [ + { "path": "../../incremental/common" }, + { "path": "../../incremental/compiler-plugin" }, + { "path": "../../incremental/runtime" }, + { "path": "../../incremental/harness" }, + { "path": "../../arkoala/framework" }, + { "path": "../../arkoala/framework/tsconfig-unmemoize.json" }, + { "path": "../../arkoala/arkui-common" }, + { "path": "../../arkoala/arkui" }, + { "path": "../../arkoala/arkui-common/tsconfig-unmemoize-ts.json" }, + { "path": "../../arkoala/arkui/tsconfig-unmemoize.json" }, + ] +} diff --git a/arkoala-arkts/ets-harness/tsconfig-node.json b/arkoala-arkts/ets-harness/tsconfig-node.json new file mode 100644 index 0000000000..3a27d860b5 --- /dev/null +++ b/arkoala-arkts/ets-harness/tsconfig-node.json @@ -0,0 +1,51 @@ +{ + "compilerOptions": { + "target": "es2017", + "moduleResolution": "node", + "composite": true, + "incremental": true, + "declarationMap": true, + "sourceMap": true, + "declaration": true, + "noEmitOnError": true, + "strict": true, + "skipLibCheck": true, + "removeComments": false, + "outDir": "./build/lib", + "baseUrl": ".", + "paths": { + "#common/wrappers/*": ["../interop/src/napi/wrappers/*", "../interop/src/wasm/wrappers/*"], + "#arkcompat": ["../../arkoala/arkui-common/src/typescript"], + "#arkcompat/*": ["../../arkoala/arkui-common/src/typescript/*"], + "@koalaui/arkui-common": ["../../arkoala/arkui-common/src/typescript"], + "@koalaui/runtime": [ + "../../incremental/runtime" + ], + "@koalaui/harness": [ + "../../incremental/harness" + ], + "#components": [ + "../../arkoala/framework" + ], + } + }, + "include": [ + "./build/generated", + "src/loader_node.ts", + "src/test_entry.ts", + "src/EtsHarnessApplication.ts", + "src/Page.ts" + ], + "references": [ + { "path": "../../incremental/common" }, + { "path": "../../incremental/compiler-plugin" }, + { "path": "../../incremental/runtime" }, + { "path": "../../incremental/harness" }, + { "path": "../../arkoala/framework" }, + { "path": "../../arkoala/framework/tsconfig-unmemoize.json" }, + { "path": "../../arkoala/arkui-common" }, + { "path": "../../arkoala/arkui" }, + { "path": "../../arkoala/arkui-common/tsconfig-unmemoize-ts.json" }, + { "path": "../../arkoala/arkui/tsconfig-unmemoize.json" }, + ] +} diff --git a/arkoala-arkts/ets-harness/tsconfig-unmemoize.json b/arkoala-arkts/ets-harness/tsconfig-unmemoize.json index d0290c7541..3eeacd6190 100644 --- a/arkoala-arkts/ets-harness/tsconfig-unmemoize.json +++ b/arkoala-arkts/ets-harness/tsconfig-unmemoize.json @@ -39,7 +39,8 @@ }, "include": [ "./build/generated", - "./src/Page.ts" + "./src/Page.ts", + "./src/EtsHarnessApplication.ts" ], "exclude": [ ], diff --git a/arkoala-arkts/ets-harness/tsconfig.json b/arkoala-arkts/ets-harness/tsconfig.json index 98d0c0fbba..cb94d05a51 100644 --- a/arkoala-arkts/ets-harness/tsconfig.json +++ b/arkoala-arkts/ets-harness/tsconfig.json @@ -14,7 +14,8 @@ "outDir": "build", }, "include": [ - "src/loader.ts", - "src/test_entry.ts" + "src/loader_panda.ts", + "src/test_entry.ts", + "src/AppControl.ts" ] } diff --git a/arkoala-arkts/ets-harness/webpack.config.node.js b/arkoala-arkts/ets-harness/webpack.config.node.js index 15b095fd30..b2f09f8cf7 100644 --- a/arkoala-arkts/ets-harness/webpack.config.node.js +++ b/arkoala-arkts/ets-harness/webpack.config.node.js @@ -22,7 +22,7 @@ const minimize = !process.env.WEBPACK_NO_MINIMIZE /** @returns {import("webpack").WebpackOptionsNormalized} */ const makeConfig = ({ os, arch, tsconfig }) => ({ target: "node", - entry: `./src/loader.ts`, + entry: `./src/loader_node.ts`, output: { filename: `index.js`, path: path.resolve(__dirname, `../build`), @@ -39,7 +39,7 @@ const makeConfig = ({ os, arch, tsconfig }) => ({ loader: "ts-loader", options: { "projectReferences": true, - configFile: tsconfig, + configFile: "tsconfig-node.json", compiler: "@koalaui/ets-tsc" } }, diff --git a/arkoala-arkts/ets-harness/webpack.config.panda.js b/arkoala-arkts/ets-harness/webpack.config.panda.js new file mode 100644 index 0000000000..e098e04368 --- /dev/null +++ b/arkoala-arkts/ets-harness/webpack.config.panda.js @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2022-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. + */ + +const path = require("path") +const CopyPlugin = require("copy-webpack-plugin") +const DefinePlugin = require("webpack").DefinePlugin + +const minimize = !process.env.WEBPACK_NO_MINIMIZE + +/** @returns {import("webpack").WebpackOptionsNormalized} */ +const makeConfig = ({ os, arch, tsconfig }) => ({ + target: "node", + entry: `./src/loader_panda.ts`, + output: { + filename: `index.js`, + path: path.resolve(__dirname, `../build`), + libraryTarget: "commonjs2", + }, + resolve: { + extensions: [".ts", ".node", "..."] + }, + + module: { + rules: [ + { + test: /\.tsx?$/, + loader: "ts-loader", + options: { + "projectReferences": true, + configFile: tsconfig, + compiler: "@koalaui/ets-tsc" + } + }, + ] + }, + + plugins: [ + new CopyPlugin({ + patterns: copyPluginPatterns(os, arch) + }), + new DefinePlugin({ + 'LOAD_NATIVE': `require("./ArkoalaLoader.node")` + }) + ], + + mode: minimize ? "production" : "development", + devtool: minimize ? false : "inline-source-map" +}) + +function getExt(os) { + switch (os) { + case "linux": return "so" + case "windows": return "dll" + case "macos": return "dylib" + default: return "so" + } +} + +function copyPluginPatterns(os, arch) { + const patterns = [] + patterns.push({ + from: path.resolve(`../../arkoala/framework/native/build-node-host-vmloader/ArkoalaLoader.node`), + to: "." + }) + patterns.push({ + from: path.resolve(`../../arkoala/framework/native/build-node-host-vmloader/libvmloader.${ getExt(os) }`), + to: "." + }) + patterns.push({ + from: path.resolve(`../../arkoala/framework/native/build-panda-host/libArkoalaNative_${os}_${arch}_ark.${ getExt(os) }`), + to: `./libArkoalaNative_ark.${ getExt(os) }` + }) + patterns.push({ + from: path.resolve(`../../arkoala/framework/native/build-panda-host/libace_compatible_mock.${ getExt(os) }`), + to: `./libace_compatible_mock.${ getExt(os) }` + }) + return patterns +} + +module.exports = env => { + const oses = { + 'win32': 'windows', + 'darwin': 'macos', + } + + const os = env.os || oses[process.platform] || process.platform + const arch = (env.arch || process.arch) + + const tsconfig = env.tsconfig || "" + throw new Error(">>>" + env.tsconfig) + + return makeConfig({os, arch, tsconfig}) +} diff --git a/arkoala/arkui-types/index-test.d.ts b/arkoala/arkui-types/index-test.d.ts new file mode 100644 index 0000000000..1a192fbe69 --- /dev/null +++ b/arkoala/arkui-types/index-test.d.ts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024-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. + */ + +declare interface TestComponentOptions { + id?: (number); +} +declare interface TestComponentInterface { + (options?: TestComponentOptions): TestComponentAttribute; +} +declare class TestComponentAttribute extends CommonMethod { + onChange(callback: () => void): TestComponentAttribute; + log(message: string): TestComponentAttribute; +} +declare const TestComponent: TestComponentInterface +declare const TestComponentInstance: TestComponentAttribute diff --git a/arkoala/arkui/src/ArkTestComponent.ts b/arkoala/arkui/src/ArkTestComponent.ts new file mode 100644 index 0000000000..5862e76163 --- /dev/null +++ b/arkoala/arkui/src/ArkTestComponent.ts @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2024-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 { NodeAttach, remember } from "@koalaui/runtime" +import { ArkCommonMethodComponent } from "./generated/ArkCommon" +import { ArkTestComponentPeer } from "./peers/ArkTestComponentPeer" +import { CommonMethod } from "./generated/ArkCommonInterfaces" + +/** @memo:stable */ +export class ArkTestComponentComponent extends ArkCommonMethodComponent { + getPeer(): ArkTestComponentPeer { + return (this.peer as ArkTestComponentPeer) + } + /** @memo */ + setTestComponentOptions(options?: TestComponentOptions): this { + if (this.checkPriority("setColumnOptions")) { + const options_casted = options as (TestComponentOptions | undefined) + this.getPeer()?.setTestComponentOptionsAttribute(options_casted) + return this + } + return this + } + /** @memo */ + onChange(value: () => void): this { + if (this.checkPriority("onChange")) { + this.getPeer()?.onChangeAttribute(value) + return this + } + return this + } + /** @memo */ + log(message: string): this { + if (this.checkPriority("log")) { + this.getPeer()?.logAttribute(message) + return this + } + return this + } + public applyAttributesFinish(): void { + // we calls this function outside of class, so need to make it public + super.applyAttributesFinish() + } +} + +/** @memo */ +export function ArkTestComponent( + /** @memo */ + style: ((attributes: ArkTestComponentComponent) => void) | undefined, + /** @memo */ + content_: (() => void) | undefined, + options?: TestComponentOptions | undefined +) { + const receiver = remember(() => { + return new ArkTestComponentComponent() + }) + NodeAttach((): ArkTestComponentPeer => ArkTestComponentPeer.create(receiver), (_: ArkTestComponentPeer) => { + receiver.setTestComponentOptions(options) + style?.(receiver) + content_?.() + receiver.applyAttributesFinish() + }) +} + +export interface TestComponentOptions { + id?: number; +} +export type TestComponentInterface = (options?: TestComponentOptions) => TestComponentAttribute; +export interface TestComponentAttribute extends CommonMethod { + onChange?: () => void; + log?: string +} diff --git a/arkoala/arkui/src/index.ts b/arkoala/arkui/src/index.ts index 7d1a2f060c..8a93a05082 100644 --- a/arkoala/arkui/src/index.ts +++ b/arkoala/arkui/src/index.ts @@ -142,6 +142,8 @@ export * from "./generated/ArkSubTabBarStyleBuilder" export * from "./generated/ArkBottomTabBarStyleBuilder" export * from "./generated/ArkIndicatorBuilder" export * from "./ArkNavigation" +export * from "./ArkTestComponent" +export * from "./peers/ArkTestComponentPeer" export { Attach } from "./ComponentBase" export * from "./generated/ArkNavPathStackMaterialized" diff --git a/arkoala/arkui/src/peers/ArkTestComponentPeer.ts b/arkoala/arkui/src/peers/ArkTestComponentPeer.ts new file mode 100644 index 0000000000..5e573c401c --- /dev/null +++ b/arkoala/arkui/src/peers/ArkTestComponentPeer.ts @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2024-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 { int32 } from "@koalaui/common" +import { InteropNativeModule, KPointer } from "@koalaui/interop" +import { ArkCommonMethodAttributes, ArkCommonMethodPeer } from "../generated/peers/ArkCommonPeer" +import { ComponentBase } from "../ComponentBase" +import { PeerNode } from "@koalaui/arkoala" +import { ArkUIGeneratedNativeModule } from "../generated/ArkUIGeneratedNativeModule" +import { TestComponentOptions } from "../ArkTestComponent" + +export class ArkTestComponentPeer extends ArkCommonMethodPeer { + protected constructor(peerPtr: KPointer, id: int32, name: string = "", flags: int32 = 0) { + super(peerPtr, id, name, flags) + } + public static create(component?: ComponentBase, flags: int32 = 0): ArkTestComponentPeer { + const peerId = PeerNode.nextId() + const _peerPtr = ArkUIGeneratedNativeModule._Blank_construct(peerId, flags) + const _peer = new ArkTestComponentPeer(_peerPtr, peerId, "Blank", flags) + component?.setPeer(_peer) + return _peer + } + setTestComponentOptionsAttribute(option?: TestComponentOptions): void { + if (option !== undefined) { + this.setId(option!.id! as int32) + } + } + onChangeCallback: (() => void) | undefined = undefined + onChangeAttribute(callback: () => void): void { + this.onChangeCallback = callback + } + logAttribute(message: string): void { + InteropNativeModule._AppendGroupedLog(0, message + "\n") + } +} +export interface ArkTestComponentAttributes extends ArkCommonMethodAttributes { + onChange?: () => void +} diff --git a/arkoala/arkui/tsconfig.json b/arkoala/arkui/tsconfig.json index f5c2b5e3da..e97ca0f82b 100644 --- a/arkoala/arkui/tsconfig.json +++ b/arkoala/arkui/tsconfig.json @@ -23,7 +23,7 @@ { "transform": "@koalaui/compiler-plugin/build/lib/src/koala-transformer.js", "trace": false } ] }, - "include": ["src/**/*", ], + "include": ["src/**/*", "../arkui-types/index-test.d.ts", ], "exclude": ["src/NativeModuleRecorder.ts"], "references": [ { "path": "../../incremental/compiler-plugin" }, diff --git a/arkoala/framework/src/PeerNode.ts b/arkoala/framework/src/PeerNode.ts index 7f0a2c144c..807da17789 100644 --- a/arkoala/framework/src/PeerNode.ts +++ b/arkoala/framework/src/PeerNode.ts @@ -238,6 +238,12 @@ export class PeerNode extends IncrementalNode implements CustomizableNode { private insertMark: pointer = nullptr private insertDirection: int32 = 0 + setId(id: int32) { + PeerNode.peerNodeMap.delete(this.id) + this.id = id + PeerNode.peerNodeMap.set(this.id, this) + } + setInsertMark(mark: pointer, upDirection: boolean) { // console.log(`setInsertMark 0x${mark.toString(16)} ${upDirection ? "up" : "down"}`) this.insertMark = mark -- Gitee From fbb55e68278d61a2e0b1ebbbc8695039a1c0c851 Mon Sep 17 00:00:00 2001 From: Roman Sedaikin Date: Wed, 5 Mar 2025 11:52:56 +0300 Subject: [PATCH 2/4] Split to panda-node build configs. Signed-off-by: Roman Sedaikin --- arkoala-arkts/ets-harness/arktsconfig.json | 7 +----- arkoala-arkts/ets-harness/package.json | 24 ++++++++++--------- .../{etsconfig.json => etsconfig-panda.json} | 6 ++++- ...ize.json => tsconfig-panda-unmemoize.json} | 16 ++++++++++--- .../ets-harness/webpack.config.panda.js | 5 +++- 5 files changed, 36 insertions(+), 22 deletions(-) rename arkoala-arkts/ets-harness/src/ets/{etsconfig.json => etsconfig-panda.json} (69%) rename arkoala-arkts/ets-harness/{tsconfig-unmemoize.json => tsconfig-panda-unmemoize.json} (79%) diff --git a/arkoala-arkts/ets-harness/arktsconfig.json b/arkoala-arkts/ets-harness/arktsconfig.json index e58b649585..403eece198 100644 --- a/arkoala-arkts/ets-harness/arktsconfig.json +++ b/arkoala-arkts/ets-harness/arktsconfig.json @@ -17,13 +17,8 @@ "@koalaui/harness": ["../../incremental/harness/src/arkts"] } }, - "exclude": [ - "build/unmemoized/src/loader.ts", - "build/unmemoized/src/test_entry.ts" - ], "include": [ "src/EtsHarnessApplication.ts", - "build/unmemoized/src/*.ts", - "build/unmemoized/build/generated/pages/*.ts" + "build/unmemoized/**/*.ts" ] } diff --git a/arkoala-arkts/ets-harness/package.json b/arkoala-arkts/ets-harness/package.json index bf118e8069..a22ffea0b2 100644 --- a/arkoala-arkts/ets-harness/package.json +++ b/arkoala-arkts/ets-harness/package.json @@ -9,25 +9,27 @@ "build/lib/**/*.d.ts" ], "scripts": { + "run:pure": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk bash ../../incremental/tools/panda/arkts/ark build/ets-harness.abc --ark-boot-files ../build/arkoala.abc:../../incremental/harness/build/harness.abc --ark-entry-point @koalaui.ets-harness.build.unmemoized.src.loader.ETSGLOBAL::main", "clean": "rimraf build", "compile": "npm run compile:all", "compile:plugin": "cd ../../arkoala/ets-plugin && npm run compile", - "compile:ets": "npm run compile:plugin && cd src/ets && ets-tsc -p ./etsconfig.json", - "compile:ets:node": "npm run compile:plugin && cd src/ets && ets-tsc -b ./etsconfig-node.json", - "compile:unmemoize": "ets-tsc -p ./tsconfig-unmemoize.json", - "compile:unmemoize:node": "ets-tsc -p ./tsconfig-node-unmemoize.json", + + "compile:ets:panda": "npm run compile:plugin && cd src/ets && ets-tsc -p ./etsconfig-panda.json", + "compile:unmemoize:panda": "ets-tsc -p ./tsconfig-panda-unmemoize.json", "compile:loader:panda": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.panda.js", - "compile:loader:node": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.node.js", "compile:abc": "fast-arktsc --input-files ./arktsconfig.json --output-dir ./build --compiler ../../incremental/tools/panda/arkts/arktsc --link-name ets-harness && ninja ${NINJA_OPTIONS} -f build/build.ninja", - "compile:all:panda": "npm run compile:ets && npm run compile:unmemoize && npm run compile:loader:panda && npm run compile:abc", + "compile:all:panda": "npm run compile:ets:panda && npm run compile:unmemoize:panda && npm run compile:loader:panda && npm run compile:abc", + "test:compile:panda": "npm run compile:all:panda && cp -r build/ets-harness.abc ../build/", + "run:panda": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js", + "test:panda": "npm run test:compile:panda && npm run run:panda", + + "compile:unmemoize:node": "ets-tsc -p ./tsconfig-node-unmemoize.json", + "compile:loader:node": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.node.js", + "compile:ets:node": "npm run compile:plugin && cd src/ets && ets-tsc -b ./etsconfig-node.json", "compile:all:node": "npm run compile:ets:node && npm run compile:unmemoize:node && npm run compile:loader:node", "test:compile:node": "npm run compile:all:node", - "test:compile": "npm run compile:all:panda && cp -r build/ets-harness.abc ../build/", - "run:pure": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk bash ../../incremental/tools/panda/arkts/ark build/ets-harness.abc --ark-boot-files ../build/arkoala.abc:../../incremental/harness/build/harness.abc --ark-entry-point @koalaui.ets-harness.build.unmemoized.src.loader.ETSGLOBAL::main", - "run": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js panda:EtsHarness", "run:node": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js", - "test:run": "npm run test:compile && npm run run", - "test:run:node": "npm run test:compile:node && npm run run:node" + "test:node": "npm run test:compile:node && npm run run:node" }, "keywords": [], "dependencies": { diff --git a/arkoala-arkts/ets-harness/src/ets/etsconfig.json b/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json similarity index 69% rename from arkoala-arkts/ets-harness/src/ets/etsconfig.json rename to arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json index bf870ef432..f46fefcdfa 100644 --- a/arkoala-arkts/ets-harness/src/ets/etsconfig.json +++ b/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json @@ -14,7 +14,11 @@ { "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", "destination": "../../build/generated", - "arkui": "@koalaui/arkts-arkui" + "arkui": "@koalaui/arkts-arkui", + "applicationInfo": { + "bundleName": "com.ets-harness.application", + "moduleName": "entry" + } } ] } diff --git a/arkoala-arkts/ets-harness/tsconfig-unmemoize.json b/arkoala-arkts/ets-harness/tsconfig-panda-unmemoize.json similarity index 79% rename from arkoala-arkts/ets-harness/tsconfig-unmemoize.json rename to arkoala-arkts/ets-harness/tsconfig-panda-unmemoize.json index 3eeacd6190..762e6f1234 100644 --- a/arkoala-arkts/ets-harness/tsconfig-unmemoize.json +++ b/arkoala-arkts/ets-harness/tsconfig-panda-unmemoize.json @@ -34,15 +34,25 @@ ], "#components": [ "../arkui/src/generated/ts" - ], + ] } }, + "files": [ + "../../incremental/tools/panda/arkts/std-lib/global.d.ts" + ], "include": [ "./build/generated", - "./src/Page.ts", - "./src/EtsHarnessApplication.ts" + "./src/Page.ts" ], "exclude": [ + "../arkui/src/generated/arkts", + "../arkui/src/generated/common.ts", + "../arkui/src/generated/test_utils.ts", + "../arkui/src/generated/main.ts", + "./src/loader_panda.ts", + "./src/loader_node.ts", + "./src/test_entry.ts", + "./src/AppControl.ts" ], "references": [ { "path": "../arkui" }, diff --git a/arkoala-arkts/ets-harness/webpack.config.panda.js b/arkoala-arkts/ets-harness/webpack.config.panda.js index e098e04368..cb91c555a5 100644 --- a/arkoala-arkts/ets-harness/webpack.config.panda.js +++ b/arkoala-arkts/ets-harness/webpack.config.panda.js @@ -82,6 +82,10 @@ function copyPluginPatterns(os, arch) { from: path.resolve(`../../arkoala/framework/native/build-panda-host/libArkoalaNative_${os}_${arch}_ark.${ getExt(os) }`), to: `./libArkoalaNative_ark.${ getExt(os) }` }) + patterns.push({ + from: path.resolve(`../../arkoala/framework/native/build-panda-ani-host/libArkoalaNative_${os}_${arch}_ani.${ getExt(os) }`), + to: `./libArkoalaNative_ani.${ getExt(os) }` + }) patterns.push({ from: path.resolve(`../../arkoala/framework/native/build-panda-host/libace_compatible_mock.${ getExt(os) }`), to: `./libace_compatible_mock.${ getExt(os) }` @@ -99,7 +103,6 @@ module.exports = env => { const arch = (env.arch || process.arch) const tsconfig = env.tsconfig || "" - throw new Error(">>>" + env.tsconfig) return makeConfig({os, arch, tsconfig}) } -- Gitee From e19f41631165d31e837a8f7449112b77c5d51dc2 Mon Sep 17 00:00:00 2001 From: Roman Sedaikin Date: Wed, 5 Mar 2025 15:42:19 +0300 Subject: [PATCH 3/4] v8 config. Signed-off-by: Roman Sedaikin --- arkoala-arkts/ets-harness/package.json | 9 +++--- .../ets-harness/src/ets/etsconfig-panda.json | 4 +-- ...etsconfig-node.json => tsconfig-node.json} | 29 ++++++++++--------- .../ets-harness/tsconfig-node-unmemoize.json | 11 +++++-- arkoala-arkts/ets-harness/tsconfig.json | 1 + .../ets-harness/webpack.config.node.js | 2 +- arkoala-arkts/package.json | 3 +- .../ets-plugin/test/ets/tsconfig.arkoala.json | 1 + 8 files changed, 34 insertions(+), 26 deletions(-) rename arkoala-arkts/ets-harness/src/ets/{etsconfig-node.json => tsconfig-node.json} (41%) diff --git a/arkoala-arkts/ets-harness/package.json b/arkoala-arkts/ets-harness/package.json index a22ffea0b2..0a89a6e394 100644 --- a/arkoala-arkts/ets-harness/package.json +++ b/arkoala-arkts/ets-harness/package.json @@ -25,7 +25,7 @@ "compile:unmemoize:node": "ets-tsc -p ./tsconfig-node-unmemoize.json", "compile:loader:node": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.node.js", - "compile:ets:node": "npm run compile:plugin && cd src/ets && ets-tsc -b ./etsconfig-node.json", + "compile:ets:node": "npm run compile:plugin && cd src/ets && ets-tsc -p tsconfig-node.json", "compile:all:node": "npm run compile:ets:node && npm run compile:unmemoize:node && npm run compile:loader:node", "test:compile:node": "npm run compile:all:node", "run:node": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js", @@ -38,14 +38,13 @@ "@koalaui/harness": "1.5.8+devel" }, "devDependencies": { - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.0", + "@koalaui/ets-tsc": "4.9.5-r4", "@typescript-eslint/eslint-plugin": "^5.20.0", "@typescript-eslint/parser": "^5.20.0", - "chai": "^4.3.6", "eslint": "^8.13.0", "eslint-plugin-unused-imports": "^2.0.0", "mocha": "^9.2.2", - "source-map-support": "^0.5.21" + "source-map-support": "^0.5.21", + "@types/arkoala-arkui": "file:../../arkoala/arkui-types" } } diff --git a/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json b/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json index f46fefcdfa..5bd2fe7d10 100644 --- a/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json +++ b/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json @@ -6,9 +6,7 @@ "compilerOptions": { "types": [], "baseUrl": ".", - "rootDirs": [ - "." - ], + "rootDirs": [ "." ], "outDir": "../../build/ets-junk", "plugins": [ { diff --git a/arkoala-arkts/ets-harness/src/ets/etsconfig-node.json b/arkoala-arkts/ets-harness/src/ets/tsconfig-node.json similarity index 41% rename from arkoala-arkts/ets-harness/src/ets/etsconfig-node.json rename to arkoala-arkts/ets-harness/src/ets/tsconfig-node.json index e33cab81fe..accfe8d356 100644 --- a/arkoala-arkts/ets-harness/src/ets/etsconfig-node.json +++ b/arkoala-arkts/ets-harness/src/ets/tsconfig-node.json @@ -1,27 +1,28 @@ { "extends": "@koalaui/arkui-common/config/tsconfig.base.json", - "include": [ - "./**/*.ets" + "exclude": ["node_modules", "js_output", "dependencies"], + "include": [ "./**/*.ets"], + "files": [ + "../../../../arkoala/arkui-types/index-test.d.ts" ], "compilerOptions": { - "types": [], "baseUrl": ".", - "rootDirs": [ - "." - ], + "rootDirs": [ "." ], "outDir": "../../build/ets-junk", + "paths": { + "@kit.AbilityKit": [ + "arkoala-ability/@kit.AbilityKit" + ], + "@ohos.app.ability.UIAbility": [ + "arkoala-ability/@ohos.app.ability.UIAbility" + ] + }, "plugins": [ { "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", + "arkui": "@koalaui/arkoala-arkui", "destination": "../../build/generated", - "arkui": "@koalaui/arkoala-arkui" } - ], - "paths": { - "#arkcompat": ["../../../../arkola/arkui-common/src/typescript"], - "#arkcompat/*": ["../../../../arkola/arkui-common/src/typescript/*"], - "#common/wrappers/*": ["../../../../interop/src/napi/wrappers/*", "../../../../interop/src/wasm/wrappers/*"], - "#platform": ["../../../../incremental/compat/src/typescript"] - } + ] } } diff --git a/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json b/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json index 5f64728a1e..9a31f89adf 100644 --- a/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json +++ b/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json @@ -29,12 +29,19 @@ ], } }, + "files": [ + "../../incremental/tools/panda/arkts/std-lib/global.d.ts" + ], "include": [ "./build/generated", - "./src/Page.ts", - "./src/EtsHarnessApplication.ts" + "./src/Page.ts" ], "exclude": [ + "./src/EtsHarnessApplication.ts", + "./src/loader_panda.ts", + "./src/loader_node.ts", + "./src/test_entry.ts", + "./src/AppControl.ts" ], "references": [ { "path": "../../incremental/common" }, diff --git a/arkoala-arkts/ets-harness/tsconfig.json b/arkoala-arkts/ets-harness/tsconfig.json index cb94d05a51..a56f389a66 100644 --- a/arkoala-arkts/ets-harness/tsconfig.json +++ b/arkoala-arkts/ets-harness/tsconfig.json @@ -14,6 +14,7 @@ "outDir": "build", }, "include": [ + "src/EtsHarnessApplication.ts", "src/loader_panda.ts", "src/test_entry.ts", "src/AppControl.ts" diff --git a/arkoala-arkts/ets-harness/webpack.config.node.js b/arkoala-arkts/ets-harness/webpack.config.node.js index b2f09f8cf7..37eeac7569 100644 --- a/arkoala-arkts/ets-harness/webpack.config.node.js +++ b/arkoala-arkts/ets-harness/webpack.config.node.js @@ -71,7 +71,7 @@ function getExt(os) { function copyPluginPatterns(os, arch) { const patterns = [] patterns.push({ - from: path.resolve(`../../arkoala/framework/native/build-node-host-vmloader/ArkoalaLoader.node`), + from: path.resolve(`./src/loader.js`), to: "." }) patterns.push({ diff --git a/arkoala-arkts/package.json b/arkoala-arkts/package.json index faa9cc4ca6..e9f55674d1 100644 --- a/arkoala-arkts/package.json +++ b/arkoala-arkts/package.json @@ -7,9 +7,10 @@ "./memo-plugin", "./loader", "./har", + "./ets-harness", "../arkoala/arkui-common", "../arkoala/ets-plugin", - "./ets-harness", + "../arkoala/arkui", "../incremental/build-common", "../incremental/compiler-plugin", "../incremental/common", diff --git a/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json b/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json index 1df10a8750..96871cdb5b 100644 --- a/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json +++ b/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json @@ -1,5 +1,6 @@ { "extends": "@koalaui/arkui-common/config/tsconfig.base.json", + "exclude": ["node_modules", "js_output", "dependencies"], "include": [ "./**/*.ets" ], -- Gitee From d1e761ac425bb963e17913371302397ba8a2a7d5 Mon Sep 17 00:00:00 2001 From: Roman Sedaikin Date: Fri, 7 Mar 2025 18:06:07 +0300 Subject: [PATCH 4/4] v8 support Signed-off-by: Roman Sedaikin --- .../etsconfig-panda.json => etsconfig.json} | 4 +- arkoala-arkts/ets-harness/package.json | 28 +-- .../ets-harness/src/EtsHarnessApplication.ts | 35 +++- arkoala-arkts/ets-harness/src/Page.ts | 2 +- .../src/{loader_panda.ts => loader.ts} | 3 +- ...unmemoize.json => tsconfig-unmemoize.json} | 34 +--- arkoala-arkts/ets-harness/tsconfig.json | 5 +- .../ets-harness/webpack.config.panda.js | 30 +-- arkoala-arkts/package.json | 2 +- .../arkui-common/config/tsconfig.base.json | 10 +- arkoala/arkui/src/root_construct.ts | 6 +- arkoala/ets-harness/.mocharc.json | 4 + .../ets-harness/etsconfig.json | 4 +- arkoala/ets-harness/package.json | 42 ++++ .../ets-harness/src/EtsHarnessApplication.ts | 179 ++++++++++++++++++ arkoala/ets-harness/src/Page.ts | 59 ++++++ .../ets-harness/src/loader.ts | 7 +- .../ets-harness/tsconfig-unmemoize.json | 28 ++- .../ets-harness/tsconfig.json | 47 +++-- .../ets-harness/webpack.config.node.js | 30 +-- .../ets-plugin/test/ets/tsconfig.arkoala.json | 1 - arkoala/package.json | 2 + ets-tests/README.md | 170 +++++++++++++++++ .../src => ets-tests}/ets/pages/case1.ets | 0 .../src => ets-tests}/ets/pages/case2.ets | 0 ets-tests/package.json | 31 +++ .../src/AppControl.ts | 0 .../test_entry.ts => ets-tests/src/entry.ts | 0 ets-tests/src/index.ts | 2 + ets-tests/tsconfig.json | 25 +++ interop/src/cpp/vmloader.cc | 6 +- 31 files changed, 650 insertions(+), 146 deletions(-) rename arkoala-arkts/ets-harness/{src/ets/etsconfig-panda.json => etsconfig.json} (82%) rename arkoala-arkts/ets-harness/src/{loader_panda.ts => loader.ts} (97%) rename arkoala-arkts/ets-harness/{tsconfig-panda-unmemoize.json => tsconfig-unmemoize.json} (60%) create mode 100644 arkoala/ets-harness/.mocharc.json rename arkoala-arkts/ets-harness/src/ets/tsconfig-node.json => arkoala/ets-harness/etsconfig.json (86%) create mode 100644 arkoala/ets-harness/package.json create mode 100644 arkoala/ets-harness/src/EtsHarnessApplication.ts create mode 100644 arkoala/ets-harness/src/Page.ts rename arkoala-arkts/ets-harness/src/loader_node.ts => arkoala/ets-harness/src/loader.ts (87%) rename arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json => arkoala/ets-harness/tsconfig-unmemoize.json (74%) rename arkoala-arkts/ets-harness/tsconfig-node.json => arkoala/ets-harness/tsconfig.json (40%) rename {arkoala-arkts => arkoala}/ets-harness/webpack.config.node.js (75%) create mode 100644 ets-tests/README.md rename {arkoala-arkts/ets-harness/src => ets-tests}/ets/pages/case1.ets (100%) rename {arkoala-arkts/ets-harness/src => ets-tests}/ets/pages/case2.ets (100%) create mode 100644 ets-tests/package.json rename {arkoala-arkts/ets-harness => ets-tests}/src/AppControl.ts (100%) rename arkoala-arkts/ets-harness/src/test_entry.ts => ets-tests/src/entry.ts (100%) create mode 100644 ets-tests/src/index.ts create mode 100644 ets-tests/tsconfig.json diff --git a/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json b/arkoala-arkts/ets-harness/etsconfig.json similarity index 82% rename from arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json rename to arkoala-arkts/ets-harness/etsconfig.json index 5bd2fe7d10..2109cee083 100644 --- a/arkoala-arkts/ets-harness/src/ets/etsconfig-panda.json +++ b/arkoala-arkts/ets-harness/etsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../arkoala-arkts/arkui/config/etsconfig-base.json", + "extends": "../arkui/config/etsconfig-base.json", "include": [ "./**/*.ets" ], @@ -7,7 +7,7 @@ "types": [], "baseUrl": ".", "rootDirs": [ "." ], - "outDir": "../../build/ets-junk", + "outDir": "./build/ets-junk", "plugins": [ { "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", diff --git a/arkoala-arkts/ets-harness/package.json b/arkoala-arkts/ets-harness/package.json index 0a89a6e394..d0594342b2 100644 --- a/arkoala-arkts/ets-harness/package.json +++ b/arkoala-arkts/ets-harness/package.json @@ -14,28 +14,21 @@ "compile": "npm run compile:all", "compile:plugin": "cd ../../arkoala/ets-plugin && npm run compile", - "compile:ets:panda": "npm run compile:plugin && cd src/ets && ets-tsc -p ./etsconfig-panda.json", - "compile:unmemoize:panda": "ets-tsc -p ./tsconfig-panda-unmemoize.json", - "compile:loader:panda": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.panda.js", + "compile:ets": "mkdir -p build/ets && cp -r ../../ets-tests/ets build && npm run compile:plugin && cd build/ets && ets-tsc -p ../../etsconfig.json", + "compile:unmemoize": "ets-tsc -p ./tsconfig-unmemoize.json", + "compile:loader": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.panda.js", "compile:abc": "fast-arktsc --input-files ./arktsconfig.json --output-dir ./build --compiler ../../incremental/tools/panda/arkts/arktsc --link-name ets-harness && ninja ${NINJA_OPTIONS} -f build/build.ninja", - "compile:all:panda": "npm run compile:ets:panda && npm run compile:unmemoize:panda && npm run compile:loader:panda && npm run compile:abc", - "test:compile:panda": "npm run compile:all:panda && cp -r build/ets-harness.abc ../build/", - "run:panda": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js", - "test:panda": "npm run test:compile:panda && npm run run:panda", - - "compile:unmemoize:node": "ets-tsc -p ./tsconfig-node-unmemoize.json", - "compile:loader:node": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.node.js", - "compile:ets:node": "npm run compile:plugin && cd src/ets && ets-tsc -p tsconfig-node.json", - "compile:all:node": "npm run compile:ets:node && npm run compile:unmemoize:node && npm run compile:loader:node", - "test:compile:node": "npm run compile:all:node", - "run:node": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js", - "test:node": "npm run test:compile:node && npm run run:node" + "compile:all": "npm run compile:ets && npm run compile:unmemoize && npm run compile:loader && npm run compile:abc", + "test:compile": "npm run compile:all && cp -r build/ets-harness.abc ../build/", + "run": "ACE_LIBRARY_PATH=../build PANDA_HOME=../../incremental/tools/panda/node_modules/@panda/sdk mocha ../build/index.js", + "test:run": "npm run test:compile && npm run run" }, "keywords": [], "dependencies": { "@koalaui/common": "1.5.8+devel", "@koalaui/compat": "1.5.8+devel", - "@koalaui/harness": "1.5.8+devel" + "@koalaui/harness": "1.5.8+devel", + "@koalaui/ets-harness-tests": "1.5.8+devel" }, "devDependencies": { "@koalaui/ets-tsc": "4.9.5-r4", @@ -44,7 +37,6 @@ "eslint": "^8.13.0", "eslint-plugin-unused-imports": "^2.0.0", "mocha": "^9.2.2", - "source-map-support": "^0.5.21", - "@types/arkoala-arkui": "file:../../arkoala/arkui-types" + "source-map-support": "^0.5.21" } } diff --git a/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts b/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts index 117bab74ff..09f6df51a8 100644 --- a/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts +++ b/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts @@ -72,14 +72,16 @@ export class EtsHarnessApplication { this.appId = app } - static createApplication(app: string, page: string, useNativeLog: boolean): EtsHarnessApplication { - registerNativeModuleLibraryName("InteropNativeModule", "ArkoalaNative_ark") - registerNativeModuleLibraryName("ArkUINativeModule", "ArkoalaNative_ark") - registerNativeModuleLibraryName("ArkUIGeneratedNativeModule", "ArkoalaNative_ark") - registerNativeModuleLibraryName("TestNativeModule", "ArkoalaNative_ark") + static createApplication(app: string, page: string, useNativeLog: boolean, vmKind: int32): EtsHarnessApplication { + let suffix = vmKind == 4 ? "_ani" : "_ets" + registerNativeModuleLibraryName("InteropNativeModule", `ArkoalaNative${suffix}`) + registerNativeModuleLibraryName("ArkUINativeModule", `ArkoalaNative${suffix}`) + registerNativeModuleLibraryName("ArkUIGeneratedNativeModule", `ArkoalaNative${suffix}`) + registerNativeModuleLibraryName("TestNativeModule", `ArkoalaNative${suffix}`) const userView = ArkUINativeModule._LoadUserView(app, page) if (userView == undefined) throw new Error("Cannot load user view"); - return new EtsHarnessApplication(app, userView as UserView, useNativeLog) + const instance = new EtsHarnessApplication(app, userView as UserView, useNativeLog) + return instance } restartWith(page: string) { @@ -96,7 +98,19 @@ export class EtsHarnessApplication { this.root = createMemoRoot(this.manager!, content) } - start(): pointer { + restartWithView(userView: UserView) { + if (this.manager === undefined) { + return + } + this.manager!.reset() + this.userView = userView + let + /** @memo */ + content = this.userView!.getBuilder() + this.root = createMemoRoot(this.manager!, content) + } + + start(foreignContext: pointer): pointer { this.manager = GlobalStateManager.instance this.timer = createAnimationTimer(this.manager!) let @@ -106,7 +120,7 @@ export class EtsHarnessApplication { return this.root!.value.peer.ptr } - enter(arg0: int32, arg1: int32): boolean { + enter(arg0: int32, arg1: int32, foreignContext: pointer): boolean { this.timer!.value = Date.now() as int64 checkEvents() this.updateStates(this.manager!, this.root!) @@ -121,7 +135,10 @@ export class EtsHarnessApplication { case 1: { if (node != undefined) { const peer = node as ArkTestComponentPeer - peer.onChangeCallback?.() + const cb = peer.onChangeCallback + if (cb) { + (cb as () => void)() + } } break } diff --git a/arkoala-arkts/ets-harness/src/Page.ts b/arkoala-arkts/ets-harness/src/Page.ts index 36611291b4..f81aa29b49 100644 --- a/arkoala-arkts/ets-harness/src/Page.ts +++ b/arkoala-arkts/ets-harness/src/Page.ts @@ -1,6 +1,6 @@ +import { UserView, UserViewBuilder } from "@koalaui/arkts-arkui" import { Case1 } from "../build/generated/pages/case1" import { Case2 } from "../build/generated/pages/case2" -import { UserView, UserViewBuilder } from "@koalaui/arkts-arkui" export class EtsHarness extends UserView { private params: String diff --git a/arkoala-arkts/ets-harness/src/loader_panda.ts b/arkoala-arkts/ets-harness/src/loader.ts similarity index 97% rename from arkoala-arkts/ets-harness/src/loader_panda.ts rename to arkoala-arkts/ets-harness/src/loader.ts index a1058d193b..44c4eb34fc 100644 --- a/arkoala-arkts/ets-harness/src/loader_panda.ts +++ b/arkoala-arkts/ets-harness/src/loader.ts @@ -1,5 +1,4 @@ -import { entry } from "./test_entry" -import { AppControl, TaskType } from "./AppControl" +import { AppControl, TaskType, entry } from "@koalaui/ets-harness-tests" type int32 = number type int64 = number diff --git a/arkoala-arkts/ets-harness/tsconfig-panda-unmemoize.json b/arkoala-arkts/ets-harness/tsconfig-unmemoize.json similarity index 60% rename from arkoala-arkts/ets-harness/tsconfig-panda-unmemoize.json rename to arkoala-arkts/ets-harness/tsconfig-unmemoize.json index 762e6f1234..cc7d47e3b6 100644 --- a/arkoala-arkts/ets-harness/tsconfig-panda-unmemoize.json +++ b/arkoala-arkts/ets-harness/tsconfig-unmemoize.json @@ -14,27 +14,13 @@ "outDir": "./build/lib", "baseUrl": ".", "paths": { - "@koalaui/arkui-common": [ - "../../arkoala/arkui-common/src/arkts" - ], - "@koalaui/runtime": [ - "../../incremental/runtime/src" - ], - "@koalaui/harness": [ - "../../incremental/harness" - ], - "@koalaui/arkts-arkui": [ - "../arkui/src" - ], - "@koalaui/arkts-arkui/ohos.router": [ - "../arkui/src/ohos.router.ts" - ], - "#arkcompat": [ - "../../arkoala/arkui-common/src/arkts" - ], - "#components": [ - "../arkui/src/generated/ts" - ] + "@koalaui/arkui-common": ["../../arkoala/arkui-common/src/arkts"], + "@koalaui/runtime": ["../../incremental/runtime/src"], + "@koalaui/harness": ["../../incremental/harness"], + "@koalaui/arkts-arkui": ["../arkui/src"], + "@koalaui/arkts-arkui/ohos.router": ["../arkui/src/ohos.router.ts"], + "#arkcompat": ["../../arkoala/arkui-common/src/arkts"], + "#components": ["../arkui/src/generated/ts"], } }, "files": [ @@ -42,17 +28,13 @@ ], "include": [ "./build/generated", - "./src/Page.ts" + "./src/Page.ts", ], "exclude": [ "../arkui/src/generated/arkts", "../arkui/src/generated/common.ts", "../arkui/src/generated/test_utils.ts", "../arkui/src/generated/main.ts", - "./src/loader_panda.ts", - "./src/loader_node.ts", - "./src/test_entry.ts", - "./src/AppControl.ts" ], "references": [ { "path": "../arkui" }, diff --git a/arkoala-arkts/ets-harness/tsconfig.json b/arkoala-arkts/ets-harness/tsconfig.json index a56f389a66..4a62bb3f23 100644 --- a/arkoala-arkts/ets-harness/tsconfig.json +++ b/arkoala-arkts/ets-harness/tsconfig.json @@ -14,9 +14,6 @@ "outDir": "build", }, "include": [ - "src/EtsHarnessApplication.ts", - "src/loader_panda.ts", - "src/test_entry.ts", - "src/AppControl.ts" + "src/loader.ts", ] } diff --git a/arkoala-arkts/ets-harness/webpack.config.panda.js b/arkoala-arkts/ets-harness/webpack.config.panda.js index cb91c555a5..96a8e16a2e 100644 --- a/arkoala-arkts/ets-harness/webpack.config.panda.js +++ b/arkoala-arkts/ets-harness/webpack.config.panda.js @@ -20,9 +20,9 @@ const DefinePlugin = require("webpack").DefinePlugin const minimize = !process.env.WEBPACK_NO_MINIMIZE /** @returns {import("webpack").WebpackOptionsNormalized} */ -const makeConfig = ({ os, arch, tsconfig }) => ({ +const makeConfig = ({ os, arch, isAni, tsconfig }) => ({ target: "node", - entry: `./src/loader_panda.ts`, + entry: `./src/loader.ts`, output: { filename: `index.js`, path: path.resolve(__dirname, `../build`), @@ -48,7 +48,7 @@ const makeConfig = ({ os, arch, tsconfig }) => ({ plugins: [ new CopyPlugin({ - patterns: copyPluginPatterns(os, arch) + patterns: copyPluginPatterns(os, arch, isAni) }), new DefinePlugin({ 'LOAD_NATIVE': `require("./ArkoalaLoader.node")` @@ -68,7 +68,7 @@ function getExt(os) { } } -function copyPluginPatterns(os, arch) { +function copyPluginPatterns(os, arch, isAni) { const patterns = [] patterns.push({ from: path.resolve(`../../arkoala/framework/native/build-node-host-vmloader/ArkoalaLoader.node`), @@ -78,14 +78,17 @@ function copyPluginPatterns(os, arch) { from: path.resolve(`../../arkoala/framework/native/build-node-host-vmloader/libvmloader.${ getExt(os) }`), to: "." }) - patterns.push({ - from: path.resolve(`../../arkoala/framework/native/build-panda-host/libArkoalaNative_${os}_${arch}_ark.${ getExt(os) }`), - to: `./libArkoalaNative_ark.${ getExt(os) }` - }) - patterns.push({ - from: path.resolve(`../../arkoala/framework/native/build-panda-ani-host/libArkoalaNative_${os}_${arch}_ani.${ getExt(os) }`), - to: `./libArkoalaNative_ani.${ getExt(os) }` - }) + if (!isAni) { + patterns.push({ + from: path.resolve(`../../arkoala/framework/native/build-panda-host/libArkoalaNative_${os}_${arch}_ets.${ getExt(os) }`), + to: `./libArkoalaNative_ets.${ getExt(os) }` + }) + } else { + patterns.push({ + from: path.resolve(`../../arkoala/framework/native/build-panda-ani-host/libArkoalaNative_${os}_${arch}_ani.${ getExt(os) }`), + to: `./libArkoalaNative_ani.${ getExt(os) }` + }) + } patterns.push({ from: path.resolve(`../../arkoala/framework/native/build-panda-host/libace_compatible_mock.${ getExt(os) }`), to: `./libace_compatible_mock.${ getExt(os) }` @@ -101,8 +104,9 @@ module.exports = env => { const os = env.os || oses[process.platform] || process.platform const arch = (env.arch || process.arch) + const isAni = env.isAni const tsconfig = env.tsconfig || "" - return makeConfig({os, arch, tsconfig}) + return makeConfig({os, arch, isAni, tsconfig}) } diff --git a/arkoala-arkts/package.json b/arkoala-arkts/package.json index e9f55674d1..f1fad58948 100644 --- a/arkoala-arkts/package.json +++ b/arkoala-arkts/package.json @@ -8,9 +8,9 @@ "./loader", "./har", "./ets-harness", + "../ets-tests", "../arkoala/arkui-common", "../arkoala/ets-plugin", - "../arkoala/arkui", "../incremental/build-common", "../incremental/compiler-plugin", "../incremental/common", diff --git a/arkoala/arkui-common/config/tsconfig.base.json b/arkoala/arkui-common/config/tsconfig.base.json index 3cd542a1e3..01621564f7 100644 --- a/arkoala/arkui-common/config/tsconfig.base.json +++ b/arkoala/arkui-common/config/tsconfig.base.json @@ -217,7 +217,8 @@ "SaveButton", "UIExtensionComponent", "RichEditor", - "CachedImage" + "CachedImage", + "TestComponent" ], "extend": { "decorator": [ @@ -779,7 +780,12 @@ "name": "CachedImage", "type": "CachedImageAttribute", "instance": "CachedImageInstance" - } + }, + { + "name": "TestComponent", + "type": "TestComponentAttribute", + "instance": "TestComponentInstance" + } ] }, "styles": { diff --git a/arkoala/arkui/src/root_construct.ts b/arkoala/arkui/src/root_construct.ts index 4bc42c5c8c..b09e7b22ac 100644 --- a/arkoala/arkui/src/root_construct.ts +++ b/arkoala/arkui/src/root_construct.ts @@ -1,4 +1,6 @@ import { ArkRootPeer } from "./generated/peers/ArkStaticComponentsPeer" -import { setRootConstruct } from "@koalaui/arkoala" +import { PeerNode, setRootConstruct } from "@koalaui/arkoala" -setRootConstruct(() => ArkRootPeer.create()) \ No newline at end of file +setRootConstruct(() => ArkRootPeer.create()) + +export const rootConstructFun: () => PeerNode = () => { return ArkRootPeer.create() } \ No newline at end of file diff --git a/arkoala/ets-harness/.mocharc.json b/arkoala/ets-harness/.mocharc.json new file mode 100644 index 0000000000..1235551ee3 --- /dev/null +++ b/arkoala/ets-harness/.mocharc.json @@ -0,0 +1,4 @@ +{ + "ui": "tdd", + "spec": "../build/index.js" +} \ No newline at end of file diff --git a/arkoala-arkts/ets-harness/src/ets/tsconfig-node.json b/arkoala/ets-harness/etsconfig.json similarity index 86% rename from arkoala-arkts/ets-harness/src/ets/tsconfig-node.json rename to arkoala/ets-harness/etsconfig.json index accfe8d356..0e2fceee52 100644 --- a/arkoala-arkts/ets-harness/src/ets/tsconfig-node.json +++ b/arkoala/ets-harness/etsconfig.json @@ -3,7 +3,7 @@ "exclude": ["node_modules", "js_output", "dependencies"], "include": [ "./**/*.ets"], "files": [ - "../../../../arkoala/arkui-types/index-test.d.ts" + "../arkui-types/index-test.d.ts" ], "compilerOptions": { "baseUrl": ".", @@ -21,7 +21,7 @@ { "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", "arkui": "@koalaui/arkoala-arkui", - "destination": "../../build/generated", + "destination": "../../build/generated" } ] } diff --git a/arkoala/ets-harness/package.json b/arkoala/ets-harness/package.json new file mode 100644 index 0000000000..b03e156fb5 --- /dev/null +++ b/arkoala/ets-harness/package.json @@ -0,0 +1,42 @@ +{ + "name": "@koalaui/ets-harness", + "version": "1.5.8+devel", + "description": "", + "main": "./build/lib/src/launcher.js", + "types": "./build/lib/src/launcher.d.ts", + "files": [ + "build/lib/**/*.js", + "build/lib/**/*.d.ts" + ], + "scripts": { + "clean": "rimraf build", + "compile:plugin": "cd ../ets-plugin && npm run compile", + + "compile:ets": "mkdir -p build/ets && cp -r ../../ets-tests/ets build && npm run compile:plugin && cd build/ets && ets-tsc -p ../../etsconfig.json", + "compile:unmemoize": "ets-tsc -p ./tsconfig-unmemoize.json", + "compile:loader": "WEBPACK_NO_MINIMIZE=true webpack --config webpack.config.node.js", + "compile:all": "npm run compile:ets && npm run compile:unmemoize && npm run compile:loader", + "test:compile": "npm run compile:all", + "run": "export ACE_LIBRARY_PATH=../build && mocha ../build/index.js", + "test:run": "npm run test:compile && npm run run" + }, + "keywords": [], + "dependencies": { + "@koalaui/arkoala-arkui": "1.5.8+devel", + "@koalaui/common": "1.5.8+devel", + "@koalaui/compat": "1.5.8+devel", + "@koalaui/harness": "1.5.8+devel", + "@koalaui/ets-harness-tests": "1.5.8+devel" + }, + "devDependencies": { + "@koalaui/ets-tsc": "4.9.5-r4", + "@typescript-eslint/eslint-plugin": "^5.20.0", + "@typescript-eslint/parser": "^5.20.0", + "eslint": "^8.13.0", + "eslint-plugin-unused-imports": "^2.0.0", + "mocha": "^9.2.2", + "source-map-support": "^0.5.21", + "@types/arkoala-arkui": "file:../arkui-types", + "@types/arkoala-runtime": "file:../runtime-types" + } +} \ No newline at end of file diff --git a/arkoala/ets-harness/src/EtsHarnessApplication.ts b/arkoala/ets-harness/src/EtsHarnessApplication.ts new file mode 100644 index 0000000000..ca9cadd2ba --- /dev/null +++ b/arkoala/ets-harness/src/EtsHarnessApplication.ts @@ -0,0 +1,179 @@ +import { int64 } from "@koalaui/common" +import { InteropNativeModule, KPointer, loadInteropNativeModule, pointer, registerNativeModuleLibraryName } from "@koalaui/interop" +import { callScheduledCallbacks, ComputableState, createAnimationTimer, GlobalStateManager, IncrementalNode, memoEntry, memoRoot, MutableState, State, StateContext, StateManager } from "@koalaui/runtime" +import { int32 } from "@koalaui/common" +import { checkEvents, PeerNode, setCustomEventsChecker } from "@koalaui/arkoala" +import { ArkTestComponentPeer, checkArkoalaCallbacks, rootConstructFun } from "@koalaui/arkoala-arkui" +import { EtsHarness, UserView } from "./Page" + +setCustomEventsChecker(checkArkoalaCallbacks) +let rootConstruct: () => PeerNode = rootConstructFun + +class PartialUpdateRecord { + public update: () => void + public context: Object + public callback: (before: boolean) => void + + constructor(update: () => void, context: Object, callback: (before: boolean) => void) { + this.callback = callback + this.context = context + this.update = update + } +} + +let partialUpdates = new Array() +let _currentPartialUpdateContext: Object | undefined = undefined + +/** + * Provide partial update lambda and context. + * + * @param update - function that performs state update + * @param context - context available to UI code when state update effect happens + */ +export function addPartialUpdate(update: () => void, context: T, callback: (before: boolean) => void): void { + partialUpdates.push(new PartialUpdateRecord(update, context as Object, callback)) +} + +/** + * Current partial update context or undefined. + * + * @returns current partial update context + */ +export function currentPartialUpdateContext(): T | undefined { + return _currentPartialUpdateContext as (T | undefined) +} + +let detachedRoots: Map> = new Map>() + +/** @memo */ +function withContent( + /** @memo */ + content: () => void +) { + content() +} + +function createMemoRoot( + /** @memo */ + ui: () => void +): ComputableState { + const node = rootConstruct() + const root: ComputableState = + memoRoot(node!, + () => withContent(ui) + ) + root.value + return root +} + +const NATIVE_LIBRARY_NAME: string = "./ArkoalaNative.node" + +export class EtsHarnessApplication { + private manager: StateManager | undefined = undefined + private root: ComputableState | undefined = undefined + private timer: MutableState | undefined = undefined + private userView: UserView | undefined = undefined + private appId: string = "EtsHarness" + + constructor(app: string, userView: UserView, useNativeLog: boolean) { + this.userView = userView + this.appId = app + this.start(0) + } + + restartWith(page: string) { + if (this.manager === undefined) { + return + } + this.manager!.reset() + this.userView = new EtsHarness(page) + this.root = createMemoRoot(this.userView!.getBuilder()) + } + + start(foreignContext: pointer): pointer { + registerNativeModuleLibraryName("InteropNativeModule", NATIVE_LIBRARY_NAME) + registerNativeModuleLibraryName("ArkUINativeModule", NATIVE_LIBRARY_NAME) + registerNativeModuleLibraryName("ArkUIGeneratedNativeModule", NATIVE_LIBRARY_NAME) + registerNativeModuleLibraryName("TestNativeModule", NATIVE_LIBRARY_NAME) + loadInteropNativeModule() + this.manager = GlobalStateManager.instance + this.timer = createAnimationTimer(this.manager!) + this.root = createMemoRoot(this.userView!.getBuilder()) + return (this.root!.value as PeerNode).peer.ptr + } + + enter(arg0: int32, arg1: int32, foreignContext: pointer): boolean { + this.timer!.value = Date.now() as int64 + checkEvents() + this.updateStates(this.manager!, this.root!) + callScheduledCallbacks() + return true + } + + emitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string { + const node = PeerNode.findPeerByNativeId(target) + let result = "0" + switch (type) { + case 1: { + if (node != undefined) { + const peer = node as ArkTestComponentPeer + peer.onChangeCallback?.() + } + break + } + case 2: { + UserView.startNativeLog(0) + break; + } + case 3: { + UserView.stopNativeLog(0) + break; + } + case 4: { + result = UserView.getNativeLog(0) + break; + } + default: { + InteropNativeModule._NativeLog(">>> Unsupported event type: " + type) + break; + } + } + return result + } + + updateStates(manager: StateManager, root: State): void { + // Ensure all current state updates took effect. + manager.syncChanges() + manager.updateSnapshot() + root.value + for (const detachedRoot of detachedRoots.values()) + detachedRoot.value + if (partialUpdates.length > 0) { + // If there are pending partial updates - we apply them one by one and provide update context. + for (let update of partialUpdates) { + // Set the context available via currentPartialUpdateContext() to @memo code. + _currentPartialUpdateContext = update.context + // Update states. + update.update() + // Propagate changes. + manager.updateSnapshot() + // Notify subscriber. + update.callback(true) + // Compute new tree state + try { + root.value + for (const detachedRoot of detachedRoots.values()) + detachedRoot.value + } catch (error) { + console.error('has error in partialUpdates') + } + // Notify subscriber. + update.callback(false) + // Clear context. + _currentPartialUpdateContext = undefined + } + // Clear partial updates list. + partialUpdates.splice(0, partialUpdates.length) + } + } +} diff --git a/arkoala/ets-harness/src/Page.ts b/arkoala/ets-harness/src/Page.ts new file mode 100644 index 0000000000..8a07b8ee5e --- /dev/null +++ b/arkoala/ets-harness/src/Page.ts @@ -0,0 +1,59 @@ +import { int32 } from "@koalaui/compat"; +import { InteropNativeModule } from "@koalaui/interop"; +import { Case1 } from "../build/generated/pages/case1" +import { Case2 } from "../build/generated/pages/case2" + +export class UserView { + constructor() {} + getBuilder(): + /** @memo */ + () => void + { + throw new Error("User must override this method"); + } + static startNativeLog(group: int32) { + InteropNativeModule._StartGroupedLog(group) + } + + static stopNativeLog(group: int32) { + InteropNativeModule._StopGroupedLog(group) + } + + static getNativeLog(group: int32): string { + let ptr = InteropNativeModule._GetGroupedLog(group) + let length = InteropNativeModule._StringLength(ptr) + let data = new Uint8Array(length); + InteropNativeModule._StringData(ptr, data, length) + InteropNativeModule._InvokeFinalizer(ptr, InteropNativeModule._GetStringFinalizer()) + + let result = "" + for (let i = 0; i < length; i++) { + result += String.fromCharCode(data[i]) // Attention. This code causes native crash in arm64. + } + return result.toString() + } +} + +export class EtsHarness extends UserView { + private params: String + constructor(params: String) { + super() + this.params = params + } + getBuilder(): + /** @memo */ + () => void + { + switch (this.params) { + case "Case1": { + return Case1 + } + case "Case2": { + return Case2 + } + default: { + throw new Error("No test case provided!") + } + } + } +} diff --git a/arkoala-arkts/ets-harness/src/loader_node.ts b/arkoala/ets-harness/src/loader.ts similarity index 87% rename from arkoala-arkts/ets-harness/src/loader_node.ts rename to arkoala/ets-harness/src/loader.ts index ba2e4a4999..e5d8376a42 100644 --- a/arkoala-arkts/ets-harness/src/loader_node.ts +++ b/arkoala/ets-harness/src/loader.ts @@ -1,7 +1,6 @@ -import { entry } from "./test_entry" +import { AppControl, TaskType, entry } from "@koalaui/ets-harness-tests" import { EtsHarnessApplication } from "./EtsHarnessApplication" import { EtsHarness } from "./Page" -import { AppControl, TaskType } from "./AppControl" type int32 = number @@ -23,11 +22,13 @@ export class AppControlImpl implements AppControl { return this } nextFrame(): AppControl { - this.app.enter(0, 0) + this.app.enter(0, 0, 0) return this } loadPage(page: string): AppControl { this.app.restartWith(page) + this.nextFrame() + this.nextFrame() return this } } diff --git a/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json b/arkoala/ets-harness/tsconfig-unmemoize.json similarity index 74% rename from arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json rename to arkoala/ets-harness/tsconfig-unmemoize.json index 9a31f89adf..9a72f3151f 100644 --- a/arkoala-arkts/ets-harness/tsconfig-node-unmemoize.json +++ b/arkoala/ets-harness/tsconfig-unmemoize.json @@ -14,34 +14,28 @@ "outDir": "./build/lib", "baseUrl": ".", "paths": { - "#common/wrappers/*": ["../interop/src/napi/wrappers/*", "../interop/src/wasm/wrappers/*"], + "#components": ["../../arkoala/framework"], + "#common/wrappers/*": ["../../interop/src/napi/wrappers/*", "../../interop/src/wasm/wrappers/*"], "#arkcompat": ["../../arkoala/arkui-common/src/typescript"], "#arkcompat/*": ["../../arkoala/arkui-common/src/typescript/*"], "@koalaui/arkui-common": ["../../arkoala/arkui-common/src/typescript"], - "@koalaui/runtime": [ - "../../incremental/runtime" - ], - "@koalaui/harness": [ - "../../incremental/harness" - ], - "#components": [ - "../../arkoala/framework" - ], + "@koalaui/runtime": ["../../incremental/runtime"], + "@koalaui/harness": ["../../incremental/harness"], + "@koalaui/arkoala-arkui": ["../../arkoala/arkui"], } }, "files": [ - "../../incremental/tools/panda/arkts/std-lib/global.d.ts" + "../../incremental/tools/panda/arkts/std-lib/global.d.ts", + "../../arkoala/arkui-types/index-test.d.ts" ], "include": [ "./build/generated", - "./src/Page.ts" + "./src/EtsHarnessApplication.ts", + "./src/Page.ts", ], "exclude": [ - "./src/EtsHarnessApplication.ts", - "./src/loader_panda.ts", - "./src/loader_node.ts", - "./src/test_entry.ts", - "./src/AppControl.ts" + "../../arkoala/arkui/src/NativeModuleRecorder.ts", + "./src/loader.ts", ], "references": [ { "path": "../../incremental/common" }, diff --git a/arkoala-arkts/ets-harness/tsconfig-node.json b/arkoala/ets-harness/tsconfig.json similarity index 40% rename from arkoala-arkts/ets-harness/tsconfig-node.json rename to arkoala/ets-harness/tsconfig.json index 3a27d860b5..4057b61b51 100644 --- a/arkoala-arkts/ets-harness/tsconfig-node.json +++ b/arkoala/ets-harness/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2017", + "target": "es2020", "moduleResolution": "node", "composite": true, "incremental": true, @@ -11,41 +11,38 @@ "strict": true, "skipLibCheck": true, "removeComments": false, - "outDir": "./build/lib", + "outDir": "build", "baseUrl": ".", + "types": ["arkoala-arkui", "arkoala-runtime"], + "plugins": [ + { "transform": "@koalaui/compiler-plugin/build/lib/src/koala-transformer.js", "trace": false } + ], "paths": { "#common/wrappers/*": ["../interop/src/napi/wrappers/*", "../interop/src/wasm/wrappers/*"], - "#arkcompat": ["../../arkoala/arkui-common/src/typescript"], - "#arkcompat/*": ["../../arkoala/arkui-common/src/typescript/*"], - "@koalaui/arkui-common": ["../../arkoala/arkui-common/src/typescript"], - "@koalaui/runtime": [ - "../../incremental/runtime" - ], - "@koalaui/harness": [ - "../../incremental/harness" - ], - "#components": [ - "../../arkoala/framework" - ], + "@ohos.*": ["./arkui-common/ohos-sdk-ets/HarmonyOS-NEXT-DB1/openharmony/ets/api/@ohos.*"], + "#arkcompat": ["../arkui-common/src/typescript"], + "#arkcompat/*": ["../arkui-common/src/typescript/*"], + "@koalaui/arkui-common": ["../arkui-common/src/typescript"] } }, + "files": [ + "../arkui-types/index-test.d.ts" + ], "include": [ - "./build/generated", - "src/loader_node.ts", - "src/test_entry.ts", + "build/generated/pages/*.ts", + "src/Page.ts", "src/EtsHarnessApplication.ts", - "src/Page.ts" + "src/loader.ts" + ], + "exclude": [ + "../../arkoala/arkui/src/NativeModuleRecorder.ts", ], "references": [ { "path": "../../incremental/common" }, { "path": "../../incremental/compiler-plugin" }, { "path": "../../incremental/runtime" }, - { "path": "../../incremental/harness" }, - { "path": "../../arkoala/framework" }, - { "path": "../../arkoala/framework/tsconfig-unmemoize.json" }, - { "path": "../../arkoala/arkui-common" }, - { "path": "../../arkoala/arkui" }, - { "path": "../../arkoala/arkui-common/tsconfig-unmemoize-ts.json" }, - { "path": "../../arkoala/arkui/tsconfig-unmemoize.json" }, + { "path": "../framework" }, + { "path": "../arkui-common" }, + { "path": "../arkui" }, ] } diff --git a/arkoala-arkts/ets-harness/webpack.config.node.js b/arkoala/ets-harness/webpack.config.node.js similarity index 75% rename from arkoala-arkts/ets-harness/webpack.config.node.js rename to arkoala/ets-harness/webpack.config.node.js index 37eeac7569..7f04fa6ac6 100644 --- a/arkoala-arkts/ets-harness/webpack.config.node.js +++ b/arkoala/ets-harness/webpack.config.node.js @@ -16,13 +16,14 @@ const path = require("path") const CopyPlugin = require("copy-webpack-plugin") const DefinePlugin = require("webpack").DefinePlugin +const ProvidePlugin = require("webpack").ProvidePlugin const minimize = !process.env.WEBPACK_NO_MINIMIZE /** @returns {import("webpack").WebpackOptionsNormalized} */ const makeConfig = ({ os, arch, tsconfig }) => ({ target: "node", - entry: `./src/loader_node.ts`, + entry: `./src/loader.ts`, output: { filename: `index.js`, path: path.resolve(__dirname, `../build`), @@ -39,10 +40,15 @@ const makeConfig = ({ os, arch, tsconfig }) => ({ loader: "ts-loader", options: { "projectReferences": true, - configFile: "tsconfig-node.json", + configFile: tsconfig, compiler: "@koalaui/ets-tsc" } }, + { test: /\.node$/, loader: "node-loader", + options: { + name: "[name].[ext]", + } + }, ] }, @@ -51,8 +57,10 @@ const makeConfig = ({ os, arch, tsconfig }) => ({ patterns: copyPluginPatterns(os, arch) }), new DefinePlugin({ - 'LOAD_NATIVE': `require("./ArkoalaLoader.node")` - }) + 'LOAD_NATIVE': `require("./ArkoalaNative.node")`, + 'NATIVE_LIBRARY_NAME': `"./ArkoalaNative.node"`, + "process.env.KOALAUI_SELF_PROFILE": "false", + }), ], mode: minimize ? "production" : "development", @@ -71,21 +79,13 @@ function getExt(os) { function copyPluginPatterns(os, arch) { const patterns = [] patterns.push({ - from: path.resolve(`./src/loader.js`), - to: "." + from: path.resolve(`../framework/build/ArkoalaNative_${os}_${arch}.node`), + to: "./ArkoalaNative.node" }) patterns.push({ - from: path.resolve(`../../arkoala/framework/native/build-node-host-vmloader/libvmloader.${ getExt(os) }`), + from: path.resolve(`../framework/build/libace_compatible_mock.${ getExt(os) }`), to: "." }) - patterns.push({ - from: path.resolve(`../../arkoala/framework/native/build-panda-host/libArkoalaNative_${os}_${arch}_ani.${ getExt(os) }`), - to: `./libArkoalaNative_ani.${ getExt(os) }` - }) - patterns.push({ - from: path.resolve(`../../arkoala/framework/native/build-panda-host/libace_compatible_mock.${ getExt(os) }`), - to: `./libace_compatible_mock.${ getExt(os) }` - }) return patterns } diff --git a/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json b/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json index 96871cdb5b..1df10a8750 100644 --- a/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json +++ b/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json @@ -1,6 +1,5 @@ { "extends": "@koalaui/arkui-common/config/tsconfig.base.json", - "exclude": ["node_modules", "js_output", "dependencies"], "include": [ "./**/*.ets" ], diff --git a/arkoala/package.json b/arkoala/package.json index 45b62727c2..05145b5c6e 100644 --- a/arkoala/package.json +++ b/arkoala/package.json @@ -13,6 +13,8 @@ "ohos-sdk", "extension-component", "arkts-loader", + "ets-harness", + "../ets-tests", "../incremental/build-common", "../incremental/compat", "../incremental/common", diff --git a/ets-tests/README.md b/ets-tests/README.md new file mode 100644 index 0000000000..07a62d7022 --- /dev/null +++ b/ets-tests/README.md @@ -0,0 +1,170 @@ +### Structure +``` +// v8 +/arkoala/ets-harness + +// ArkTS:Panda +/arkoala-arkts/ets-harness + +// tests and test cases +/ets-tests +/ets-tests/ets/pages // contains test cases +/ets-test/src/entry.ts // contains tests +``` + +### For v8 +#### Preparations +We need to build all dependencies. +``` +npm i +cd arkoala/loader +npm run test:loader +``` +if you see exceptions with incremental runtime, try to rebuild it. +``` +cd incremental +npm run all:clean +cd runtime +npm run build:incremental:inc + +cd ../../interop +npm run build:interop:inc +``` + +Then you could try to run command `npm run test:loader` from `arkoala/loader` again. + +#### Running tests +``` +cd arkoala/ets-harness +npm run clean && npm run test:run +``` +### For ArkTs:Panda +#### Preparations +We need to build all dependencies. +``` +npm i +cd arkoala-arkts +npm run trivial:all:node +``` +if you see exceptions with incremental runtime, try to rebuild it. +``` +cd incremental +npm run all:clean +cd runtime +npm run build:incremental:inc + +cd ../../interop +npm run build:interop:inc +``` + +Then you could try to run command `npm run trivial:all:node` from `arkoala-arkts` again. + +#### Running tests +``` +cd arkoala-arkts/ets-harness +npm run clean && npm run test:run +``` + +### How to write tests +We have custom component `TestComponent` for testing incremental runtime, implementations you could find in: +``` +// v8 +arkoala/arkui/src/ArkTestComponent.ts +arkoala/arkui/src/peers/ArkTestComponentPeer.ts + +// ArkTS:Panda +arkoala-arkts/arkui/src/ArkTestComponent.ts +arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts +``` +`TestComponent` contains following methods: +- `onChange(value: () => void)` - register callback where we can change state of the `StateManager` +- `log(message: string)` - record log where we can describe current state of the `StateManager`, every time when `StateManager` changes `log` method is called +- `setTestComponentOptions(options?: TestComponentOptions)` - set specified `id` for current `TestComponent` (needed to call `onChange` callback on correct component): +``` +interface TestComponentOptions { + id?: number; +} +``` +Example of the test case page (could be found `ets-tests/ets/pages/case1.ets`): +``` +//@Entry +@Component +struct Case1 { + @State x:number = 0 + build() { + TestComponent({ id: 42 }).onChange(() => { + this.x++ + }) + .log("Case1 - value:" + this.x) + } +} +``` +Here we set `id` for `TestComponent`, increment state (in `onChange` callback) `this.x` and record log after each state changes. +Let's look at the test (can be found `ets-tests/src/entry.ts`): +``` +suite("Case1", () => { + test("StateChange:Increment", () => { + const expected = "Case1 - value:1\nCase1 - value:2\nCase1 - value:3\n" + const componentId = 42 // id from Case1.TestComponent + // onChange + const actual = control + .loadPage("Case1") + .start() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .stop() + .getLog() + Assert.equal(expected, actual, "StateChange: Case1 test is failed!") + }) +}) +``` +Here we can send following commands to test environment via `control`: +- `loadPage(page: string)` - load case page, see entry struct name in presented test page and argument of the `loadPage` method in test case +- `start()` - start logging +- `stop()` - stop logging +- `getLog(): string` - get recorded log +- `nextFrame()` - go to the next loop iteration (should be called after `emitTask` that changes states) +- `emitTask(type: int32, target: int32, arg1?: int32, arg2?: int32)` - send command to the test environment. + +`type: int` - command type, here we send `TaskType.OnChange` that calls `TestComponent.onChange` callback +`target: int32` - id of the `TestComponent` we want to send the command to +`arg1?: int32, arg2?: int32` - extra arguments (not used for now) + +### Register case pages +Every case page we should register in `EtsHarness.getBuilder()` `switch-case` operator. Could be found in: +``` +// v8 +arkoala/ets-harness/src/Page.ts + +// ArkTS:Panda +arkoala-arkts/ets-harness/src/Page.ts +``` + +For example (ArkTS:Panda) +``` +import { Case1 } from "../build/generated/pages/case1" + +export class EtsHarness extends UserView { + private params: String + constructor(params: String) { + super() + this.params = params + } + getBuilder(): UserViewBuilder { + switch (this.params) { + // here we load case page [Case1] via [loadPage("Case1")] + case "Case1": { + /** @memo */ + const wrapper = () => { Case1() } + return wrapper + } + default: { + throw new Error("No test case provided!") + } + } + } +} +``` + +**REMARK**: Do not forget to add case page in `arkoala/ets-harness/src/Page.ts` \ No newline at end of file diff --git a/arkoala-arkts/ets-harness/src/ets/pages/case1.ets b/ets-tests/ets/pages/case1.ets similarity index 100% rename from arkoala-arkts/ets-harness/src/ets/pages/case1.ets rename to ets-tests/ets/pages/case1.ets diff --git a/arkoala-arkts/ets-harness/src/ets/pages/case2.ets b/ets-tests/ets/pages/case2.ets similarity index 100% rename from arkoala-arkts/ets-harness/src/ets/pages/case2.ets rename to ets-tests/ets/pages/case2.ets diff --git a/ets-tests/package.json b/ets-tests/package.json new file mode 100644 index 0000000000..df41475ece --- /dev/null +++ b/ets-tests/package.json @@ -0,0 +1,31 @@ +{ + "name": "@koalaui/ets-harness-tests", + "version": "1.5.8+devel", + "description": "", + "main": "build/src/index.js", + "files": [ + "src/AppControl.ts", + "src/entry.ts" + ], + "scripts": { + "compile": "ets-tsc -p ." + }, + "keywords": [], + "dependencies": { + "@koalaui/common": "1.5.8+devel", + "@koalaui/compat": "1.5.8+devel", + "@koalaui/harness": "1.5.8+devel" + }, + "devDependencies": { + "@koalaui/ets-tsc": "4.9.5-r4", + "@typescript-eslint/eslint-plugin": "^5.20.0", + "@typescript-eslint/parser": "^5.20.0", + "eslint": "^8.13.0", + "eslint-plugin-unused-imports": "^2.0.0", + "mocha": "^9.2.2", + "@types/mocha": "^9.1.0", + "source-map-support": "^0.5.21", + "chai": "^4.3.6", + "@types/chai": "^4.3.1" + } +} \ No newline at end of file diff --git a/arkoala-arkts/ets-harness/src/AppControl.ts b/ets-tests/src/AppControl.ts similarity index 100% rename from arkoala-arkts/ets-harness/src/AppControl.ts rename to ets-tests/src/AppControl.ts diff --git a/arkoala-arkts/ets-harness/src/test_entry.ts b/ets-tests/src/entry.ts similarity index 100% rename from arkoala-arkts/ets-harness/src/test_entry.ts rename to ets-tests/src/entry.ts diff --git a/ets-tests/src/index.ts b/ets-tests/src/index.ts new file mode 100644 index 0000000000..8dcf858165 --- /dev/null +++ b/ets-tests/src/index.ts @@ -0,0 +1,2 @@ +export * from "./AppControl" +export * from "./entry" \ No newline at end of file diff --git a/ets-tests/tsconfig.json b/ets-tests/tsconfig.json new file mode 100644 index 0000000000..a74fb33f4f --- /dev/null +++ b/ets-tests/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "es2017", + "moduleResolution": "node", + "composite": true, + "incremental": true, + "declarationMap": true, + "sourceMap": true, + "declaration": true, + "noEmitOnError": true, + "strict": true, + "skipLibCheck": true, + "removeComments": false, + "outDir": "build", + "rootDir": ".", + }, + "exclude": [ + "ets/pages/*.ets" + ], + "include": [ + "src/entry.ts", + "src/AppControl.ts", + "src/index.ts" + ], +} diff --git a/interop/src/cpp/vmloader.cc b/interop/src/cpp/vmloader.cc index 768667effb..c76c085912 100644 --- a/interop/src/cpp/vmloader.cc +++ b/interop/src/cpp/vmloader.cc @@ -350,11 +350,11 @@ const AppInfo pandaAppInfo = { const AppInfo harnessAppInfo = { "@koalaui/ets-harness/src/EtsHarnessApplication/EtsHarnessApplication", "createApplication", - "Lstd/core/String;Lstd/core/String;Z:L@koalaui/ets-harness/src/EtsHarnessApplication/EtsHarnessApplication;", + "Lstd/core/String;Lstd/core/String;ZI:L@koalaui/ets-harness/src/EtsHarnessApplication/EtsHarnessApplication;", "start", - ":J", + "J:J", "enter", - "II:Z", + "IIJ:Z", "emitEvent", "IIII:Lstd/core/String;", "restartWith", -- Gitee