diff --git a/package-lock.json b/package-lock.json index 7703e2ba..2a173d30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@next2d/player", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@next2d/player", - "version": "2.1.0", + "version": "2.1.1", "license": "MIT", "workspaces": [ "packages/*" @@ -22,9 +22,9 @@ "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.2", - "@types/node": "^22.13.11", - "@typescript-eslint/eslint-plugin": "^8.27.0", - "@typescript-eslint/parser": "^8.27.0", + "@types/node": "^22.13.13", + "@typescript-eslint/eslint-plugin": "^8.28.0", + "@typescript-eslint/parser": "^8.28.0", "@vitest/web-worker": "^3.0.9", "eslint": "^9.23.0", "eslint-plugin-unused-imports": "^4.1.4", @@ -33,7 +33,7 @@ "rollup": "^4.37.0", "tslib": "^2.8.1", "typescript": "^5.8.2", - "vite": "^6.2.2", + "vite": "^6.2.3", "vitest": "^3.0.9", "vitest-webgl-canvas-mock": "^1.1.0" }, @@ -1394,9 +1394,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", + "version": "22.13.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz", + "integrity": "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1411,17 +1411,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.27.0.tgz", - "integrity": "sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.28.0.tgz", + "integrity": "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/type-utils": "8.27.0", - "@typescript-eslint/utils": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/type-utils": "8.28.0", + "@typescript-eslint/utils": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1441,16 +1441,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.27.0.tgz", - "integrity": "sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.28.0.tgz", + "integrity": "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/typescript-estree": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/typescript-estree": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4" }, "engines": { @@ -1466,14 +1466,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.27.0.tgz", - "integrity": "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.28.0.tgz", + "integrity": "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0" + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1484,14 +1484,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.27.0.tgz", - "integrity": "sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.28.0.tgz", + "integrity": "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.27.0", - "@typescript-eslint/utils": "8.27.0", + "@typescript-eslint/typescript-estree": "8.28.0", + "@typescript-eslint/utils": "8.28.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -1508,9 +1508,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.27.0.tgz", - "integrity": "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.28.0.tgz", + "integrity": "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==", "dev": true, "license": "MIT", "engines": { @@ -1522,14 +1522,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.27.0.tgz", - "integrity": "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.28.0.tgz", + "integrity": "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1575,16 +1575,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.27.0.tgz", - "integrity": "sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.28.0.tgz", + "integrity": "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/typescript-estree": "8.27.0" + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/typescript-estree": "8.28.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1599,13 +1599,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.27.0.tgz", - "integrity": "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.28.0.tgz", + "integrity": "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -4082,9 +4082,9 @@ } }, "node_modules/vite": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", - "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", + "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 69569d04..0f901845 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@next2d/player", - "version": "2.1.0", + "version": "2.1.1", "description": "Experience the fast and beautiful anti-aliased rendering of WebGL. You can create rich, interactive graphics, cross-platform applications and games without worrying about browser or device compatibility.", "author": "Toshiyuki Ienaga (https://github.com/ienaga/)", "license": "MIT", @@ -51,9 +51,9 @@ "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.2", - "@types/node": "^22.13.11", - "@typescript-eslint/eslint-plugin": "^8.27.0", - "@typescript-eslint/parser": "^8.27.0", + "@types/node": "^22.13.13", + "@typescript-eslint/eslint-plugin": "^8.28.0", + "@typescript-eslint/parser": "^8.28.0", "@vitest/web-worker": "^3.0.9", "eslint": "^9.23.0", "eslint-plugin-unused-imports": "^4.1.4", @@ -62,7 +62,7 @@ "rollup": "^4.37.0", "tslib": "^2.8.1", "typescript": "^5.8.2", - "vite": "^6.2.2", + "vite": "^6.2.3", "vitest": "^3.0.9", "vitest-webgl-canvas-mock": "^1.1.0" }, diff --git a/packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.test.ts b/packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.test.ts new file mode 100644 index 00000000..5a096546 --- /dev/null +++ b/packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.test.ts @@ -0,0 +1,32 @@ +import { execute } from "./CanvasPointerDownEventUseCase"; +import { describe, expect, it, vi } from "vitest"; +import { $hitObject } from "../../CoreUtil"; +import { DisplayObject } from "@next2d/display"; + +describe("CanvasPointerDownEventUseCase.js test", () => +{ + it("execute test case1", () => + { + const canvas = document.createElement("canvas"); + + let pointerId = 0; + canvas.setPointerCapture = vi.fn((pointer_id) => pointerId = pointer_id); + + let preventDefault = false; + const mockEvent = { + "target": canvas, + "pointerId": 1, + "preventDefault": vi.fn(() => preventDefault = true) + } as unknown as PointerEvent; + + expect(preventDefault).toBe(false); + expect(pointerId).toBe(0); + + $hitObject.hit = new DisplayObject(); + execute(mockEvent); + + expect(preventDefault).toBe(true); + expect(pointerId).toBe(1); + $hitObject.hit = null; + }); +}); \ No newline at end of file diff --git a/packages/core/src/Canvas/usecase/CanvasPointerLeaveEventUseCase.test.ts b/packages/core/src/Canvas/usecase/CanvasPointerLeaveEventUseCase.test.ts new file mode 100644 index 00000000..549861bc --- /dev/null +++ b/packages/core/src/Canvas/usecase/CanvasPointerLeaveEventUseCase.test.ts @@ -0,0 +1,32 @@ +import { execute } from "./CanvasPointerLeaveEventUseCase"; +import { describe, expect, it, vi } from "vitest"; +import { $setRollOverDisplayObject } from "../../CoreUtil"; +import type { DisplayObject } from "@next2d/display"; +import { PointerEvent as Next2D_PointerEvent } from "@next2d/events"; + +describe("CanvasPointerLeaveEventUseCase.js test", () => +{ + it("execute test case1", () => + { + const mockDisplayObject = { + "willTrigger": vi.fn(() => true), + "dispatchEvent": vi.fn((event) => + { + expect(event.type).toBe(Next2D_PointerEvent.POINTER_LEAVE); + }) + } as unknown as DisplayObject; + + let preventDefault = false; + const mockEvent = { + "preventDefault": vi.fn(() => preventDefault = true) + } as unknown as PointerEvent; + + expect(preventDefault).toBe(false); + + $setRollOverDisplayObject(mockDisplayObject); + execute(mockEvent); + + expect(preventDefault).toBe(true); + $setRollOverDisplayObject(null); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Canvas/usecase/CanvasPointerMoveEventUseCase.test.ts b/packages/core/src/Canvas/usecase/CanvasPointerMoveEventUseCase.test.ts new file mode 100644 index 00000000..b120d7af --- /dev/null +++ b/packages/core/src/Canvas/usecase/CanvasPointerMoveEventUseCase.test.ts @@ -0,0 +1,55 @@ +import { execute } from "./CanvasPointerMoveEventUseCase"; +import { describe, expect, it, vi } from "vitest"; +import type { DisplayObject } from "@next2d/display"; +import { PointerEvent as Next2D_PointerEvent } from "@next2d/events"; +import { $hitObject } from "../../CoreUtil"; + +describe("CanvasPointerMoveEventUseCase.js test", () => +{ + it("execute test case1", () => + { + let pointerMove = false; + let pointerOver = false; + + const mockDisplayObject = { + "willTrigger": vi.fn(() => true), + "dispatchEvent": vi.fn((event) => + { + switch (event.type) { + + case Next2D_PointerEvent.POINTER_MOVE: + pointerMove = true; + break; + + case Next2D_PointerEvent.POINTER_OVER: + pointerOver = true; + break; + + default: + throw new Error("Unknown event type."); + + } + }) + } as unknown as DisplayObject; + + const canvas = document.createElement("canvas"); + + let preventDefault = false; + const mockEvent = { + "target": canvas, + "preventDefault": vi.fn(() => preventDefault = true) + } as unknown as PointerEvent; + + expect(preventDefault).toBe(false); + expect(pointerMove).toBe(false); + expect(pointerOver).toBe(false); + + $hitObject.hit = mockDisplayObject; + execute(mockEvent); + + expect(preventDefault).toBe(true); + expect(pointerMove).toBe(true); + expect(pointerOver).toBe(true); + $hitObject.hit = null; + }); +}); \ No newline at end of file diff --git a/packages/core/src/Canvas/usecase/CanvasPointerUpEventUseCase.test.ts b/packages/core/src/Canvas/usecase/CanvasPointerUpEventUseCase.test.ts new file mode 100644 index 00000000..db8db717 --- /dev/null +++ b/packages/core/src/Canvas/usecase/CanvasPointerUpEventUseCase.test.ts @@ -0,0 +1,23 @@ +import { execute } from "./CanvasPointerUpEventUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("CanvasPointerUpEventUseCase.js test", () => +{ + it("execute test case1", () => + { + + const canvas = document.createElement("canvas"); + + let pointerId = 0; + canvas.releasePointerCapture = vi.fn((pointer_id) => pointerId = pointer_id); + + const mockEvent = { + "target": canvas, + "pointerId": 100 + } as unknown as PointerEvent; + + expect(pointerId).toBe(0); + execute(mockEvent); + expect(pointerId).toBe(100); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Canvas/usecase/CanvasWheelEventUseCase.test.ts b/packages/core/src/Canvas/usecase/CanvasWheelEventUseCase.test.ts new file mode 100644 index 00000000..0704c6c5 --- /dev/null +++ b/packages/core/src/Canvas/usecase/CanvasWheelEventUseCase.test.ts @@ -0,0 +1,28 @@ +import type { DisplayObject } from "@next2d/display"; +import { execute } from "./CanvasWheelEventUseCase"; +import { describe, expect, it, vi } from "vitest"; +import { $hitObject } from "../../CoreUtil"; + +describe("CanvasWheelEventUseCase.js test", () => +{ + it("execute test case1", () => + { + const mockDisplayObject = { + "isText": true, + "scrollEnabled": true + } as unknown as DisplayObject; + + let preventDefault = false; + const mockEvent = { + "preventDefault": vi.fn(() => preventDefault = true), + } as unknown as WheelEvent; + + expect(preventDefault).toBe(false); + + $hitObject.hit = mockDisplayObject; + execute(mockEvent); + + expect(preventDefault).toBe(true); + $hitObject.hit = null; + }); +}); \ No newline at end of file diff --git a/packages/core/src/Next2D/service/VideoSyncService.test.ts b/packages/core/src/Next2D/service/VideoSyncService.test.ts new file mode 100644 index 00000000..adbb021e --- /dev/null +++ b/packages/core/src/Next2D/service/VideoSyncService.test.ts @@ -0,0 +1,62 @@ +import { execute } from "./VideoSyncService"; +import { describe, expect, it, vi } from "vitest"; +import type { Video } from "@next2d/media"; +import type { DisplayObjectContainer } from "@next2d/display"; + +describe("VideoSyncService.js test", () => +{ + it("execute test case1", async () => + { + let play = false; + let pause = false; + let seek = 100; + const mockDisplayObject = { + "isVideo": true, + "muted": false, + "loaded": true, + "play": vi.fn(async () => play = true), + "pause": vi.fn(() => pause = true), + "seek": vi.fn((time)=> seek = time), + } as unknown as Video; + + expect(play).toBe(false); + expect(pause).toBe(false); + expect(seek).toBe(100); + + await execute(mockDisplayObject); + + expect(play).toBe(true); + expect(pause).toBe(true); + expect(seek).toBe(0); + }); + + it("execute test case2", async () => + { + let play = false; + let pause = false; + let seek = 100; + const mockDisplayObject = { + "isVideo": true, + "muted": false, + "loaded": true, + "play": vi.fn(async () => play = true), + "pause": vi.fn(() => pause = true), + "seek": vi.fn((time)=> seek = time), + } as unknown as Video; + + const mockDisplayObjectContainer = { + "isContainerEnabled": true, + "children": [mockDisplayObject], + } as unknown as DisplayObjectContainer; + + expect(play).toBe(false); + expect(pause).toBe(false); + expect(seek).toBe(100); + + await execute(mockDisplayObjectContainer); + + expect(play).toBe(true); + expect(pause).toBe(true); + expect(seek).toBe(0); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Next2D/service/VideoSyncService.ts b/packages/core/src/Next2D/service/VideoSyncService.ts index cd01740a..41db8361 100644 --- a/packages/core/src/Next2D/service/VideoSyncService.ts +++ b/packages/core/src/Next2D/service/VideoSyncService.ts @@ -1,4 +1,5 @@ import type { DisplayObject, DisplayObjectContainer } from "@next2d/display"; +import type { Video } from "@next2d/media"; /** * @description DisplayObject の子要素に Video が含まれている場合、ロードが完了するまで待機します。 @@ -14,6 +15,28 @@ export const execute = async (display_object: D): Prom switch (true) { case display_object.isVideo: + { + const muted = (display_object as unknown as Video).muted; + (display_object as unknown as Video).muted = true; + + await (display_object as unknown as Video).play(); + (display_object as unknown as Video).pause(); + (display_object as unknown as Video).muted = muted; + + await new Promise((resolve) => + { + const wait = async (): Promise => + { + if ((display_object as unknown as Video).loaded) { + (display_object as unknown as Video).seek(0); + resolve(); + } else { + requestAnimationFrame(wait); + } + }; + requestAnimationFrame(wait); + }); + } break; case display_object.isContainerEnabled: @@ -26,33 +49,13 @@ export const execute = async (display_object: D): Prom continue; } - if (displayObject.isVideo) { - - const muted = displayObject.muted; - displayObject.muted = true; - - await displayObject.play(); - displayObject.pause(); - displayObject.muted = muted; - - await new Promise((resolve) => - { - const wait = async (): Promise => - { - if (displayObject.loaded) { - displayObject.seek(0); - resolve(); - } else { - requestAnimationFrame(wait); - } - }; - requestAnimationFrame(wait); - }); + if (!displayObject.isVideo + && !displayObject.isContainerEnabled + ) { + continue; } - if (displayObject.isContainerEnabled) { - await execute(displayObject as DisplayObjectContainer); - } + await execute(displayObject); } } break; diff --git a/packages/core/src/Player/service/PlayerPointerMoveEventService.test.ts b/packages/core/src/Player/service/PlayerPointerMoveEventService.test.ts new file mode 100644 index 00000000..6ebc64f3 --- /dev/null +++ b/packages/core/src/Player/service/PlayerPointerMoveEventService.test.ts @@ -0,0 +1,55 @@ +import { execute } from "./PlayerPointerMoveEventService"; +import { PointerEvent } from "@next2d/events"; +import { describe, expect, it, vi } from "vitest"; +import { + $hitObject, + $setRollOverDisplayObject, + $getRollOverDisplayObject +} from "../../CoreUtil"; + +describe("PlayerPointerMoveEventService.js test", () => +{ + it("execute test case1", () => + { + let pointerMove = false; + let pointerOver = false; + const mockDisplayObject = { + "willTrigger": () => true, + "dispatchEvent": vi.fn((event) => + { + switch (event.type) { + + case PointerEvent.POINTER_MOVE: + pointerMove = true; + break; + + case PointerEvent.POINTER_OVER: + pointerOver = true; + break; + + default: + throw new Error("Invalid event type"); + + } + }) + }; + + $hitObject.hit = mockDisplayObject; + + expect(pointerMove).toBe(false); + expect(pointerOver).toBe(false); + + $setRollOverDisplayObject(null); + expect($getRollOverDisplayObject()).toBeNull(); + + execute(); + + expect(pointerMove).toBe(true); + expect(pointerOver).toBe(true); + + expect($getRollOverDisplayObject()).not.toBeNull(); + $setRollOverDisplayObject(null); + + $hitObject.hit = null; + }); +}); \ No newline at end of file diff --git a/packages/core/src/Player/service/PlayerPointerUpEventService.test.ts b/packages/core/src/Player/service/PlayerPointerUpEventService.test.ts new file mode 100644 index 00000000..2ec4579e --- /dev/null +++ b/packages/core/src/Player/service/PlayerPointerUpEventService.test.ts @@ -0,0 +1,36 @@ +import { execute } from "./PlayerPointerUpEventService"; +import { PointerEvent } from "@next2d/events"; +import { describe, expect, it, vi } from "vitest"; +import { $hitObject } from "../../CoreUtil"; + +describe("PlayerPointerUpEventService.js test", () => +{ + it("execute test case1", () => + { + let pointerUp = false; + const mockDisplayObject = { + "willTrigger": () => true, + "dispatchEvent": vi.fn((event) => + { + switch (event.type) { + + case PointerEvent.POINTER_UP: + pointerUp = true; + break; + + default: + throw new Error("Invalid event type"); + + } + }) + }; + + $hitObject.hit = mockDisplayObject; + expect(pointerUp).toBe(false); + + execute(); + + expect(pointerUp).toBe(true); + $hitObject.hit = null; + }); +}); \ No newline at end of file diff --git a/packages/core/src/Player/service/PlayerStopService.test.ts b/packages/core/src/Player/service/PlayerStopService.test.ts new file mode 100644 index 00000000..6c341d21 --- /dev/null +++ b/packages/core/src/Player/service/PlayerStopService.test.ts @@ -0,0 +1,20 @@ +import { execute } from "./PlayerStopService"; +import { $player } from "../../Player"; +import { describe, expect, it } from "vitest"; + +describe("PlayerStopService.js test", () => +{ + it("execute test case1", () => + { + $player.timerId = 1; + $player.stopFlag = false; + + expect($player.stopFlag).toBe(false); + expect($player.timerId).toBe(1); + + execute(); + + expect($player.stopFlag).toBe(true); + expect($player.timerId).toBe(-1); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Player/usecase/PlayerPlayUseCase.test.ts b/packages/core/src/Player/usecase/PlayerPlayUseCase.test.ts new file mode 100644 index 00000000..7f2e7504 --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerPlayUseCase.test.ts @@ -0,0 +1,18 @@ +import { execute } from "./PlayerPlayUseCase"; +import { describe, expect, it } from "vitest"; +import { $player } from "../../Player"; + +describe("PlayerPlayUseCase.js test", () => +{ + it("execute test case", () => + { + $player.stopFlag = true; + $player.timerId = -1; + + expect($player.stopFlag).toBe(true); + expect($player.timerId).toBe(-1); + execute(); + expect($player.stopFlag).toBe(false); + expect($player.timerId).not.toBe(-1); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts new file mode 100644 index 00000000..e40ecdc9 --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts @@ -0,0 +1,21 @@ +import { execute } from "./PlayerReadyCompleteUseCase"; +import { describe, expect, it, vi } from "vitest"; +import { stage } from "@next2d/display"; +import { $player } from "../../Player"; + +describe("PlayerReadyCompleteUseCase.js test", () => +{ + it("execute test case", () => + { + stage.changed = false; + $player.stopFlag = true; + + expect(stage.changed).toBe(false); + expect($player.stopFlag).toBe(true); + + execute(); + + expect(stage.changed).toBe(true); + expect($player.stopFlag).toBe(false); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts index 098f69f0..33250bec 100644 --- a/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts +++ b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts @@ -5,6 +5,10 @@ import { execute as playerRenderingPostMessageService } from "../service/PlayerR /** * @description Playerの起動準備完了時のユースーケース * Use case when Player is ready to start + * + * @return {void} + * @method + * @protected */ export const execute = (): void => { diff --git a/packages/core/src/Player/usecase/PlayerRegisterEventUseCase.test.ts b/packages/core/src/Player/usecase/PlayerRegisterEventUseCase.test.ts new file mode 100644 index 00000000..35b87674 --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerRegisterEventUseCase.test.ts @@ -0,0 +1,35 @@ +import { execute } from "./PlayerRegisterEventUseCase"; +import { describe, expect, it, vi } from "vitest"; +import { KeyboardEvent } from "@next2d/events"; + +describe("PlayerRegisterEventUseCase.js test", () => +{ + it("execute test case", () => + { + let keyDown = false; + let keyUp = false; + window.addEventListener = vi.fn((type) => + { + switch (type) { + + case KeyboardEvent.KEY_DOWN: + keyDown = true; + break; + + case KeyboardEvent.KEY_UP: + keyUp = true; + break; + + default: + break; + + } + }); + + expect(keyDown).toBe(false); + expect(keyUp).toBe(false); + execute(); + expect(keyDown).toBe(true); + expect(keyUp).toBe(true); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Player/usecase/PlayerResizeEventUseCase.test.ts b/packages/core/src/Player/usecase/PlayerResizeEventUseCase.test.ts new file mode 100644 index 00000000..0b962e0d --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerResizeEventUseCase.test.ts @@ -0,0 +1,71 @@ +import { execute } from "./PlayerResizeEventUseCase"; +import { describe, expect, it, vi } from "vitest"; +import { + $renderMatrix, + $setMainElement +} from "../../CoreUtil"; +import { stage } from "@next2d/display"; +import { $player } from "../../Player"; + +describe("PlayerResizeEventUseCase.js test", () => +{ + it("execute test case", () => + { + const parent = document.createElement("div"); + const element = document.createElement("div"); + parent.appendChild(element); + $setMainElement(element); + + stage.rendererScale = 10; + stage.changed = false; + stage.stageWidth = 100; + stage.stageHeight = 100; + $player.rendererWidth = 100; + $player.rendererHeight = 100; + $player.screenWidth = 100; + $player.screenHeight = 100; + + expect(element.style.width).toBe(""); + expect(element.style.height).toBe(""); + + expect(stage.stageWidth).toBe(100); + expect(stage.stageHeight).toBe(100); + expect(stage.changed).toBe(false); + expect(stage.rendererScale).toBe(10); + + expect($player.rendererWidth).toBe(100); + expect($player.rendererHeight).toBe(100); + expect($player.screenWidth).toBe(100); + expect($player.screenHeight).toBe(100); + + expect($renderMatrix[0]).toBe(1); + expect($renderMatrix[1]).toBe(0); + expect($renderMatrix[2]).toBe(0); + expect($renderMatrix[3]).toBe(1); + expect($renderMatrix[4]).toBe(0); + expect($renderMatrix[5]).toBe(0); + + execute(); + + expect(element.style.width).toBe("0px"); + expect(element.style.height).toBe("0px"); + + expect(stage.changed).toBe(true); + expect(stage.rendererScale).toBe(0); + + expect($player.screenWidth).toBe(0); + expect($player.screenHeight).toBe(0); + + expect($renderMatrix[0]).toBe(0); + expect($renderMatrix[1]).toBe(0); + expect($renderMatrix[2]).toBe(0); + expect($renderMatrix[3]).toBe(0); + expect($renderMatrix[4]).toBe(0); + expect($renderMatrix[5]).toBe(0); + + expect(stage.rendererWidth).toBe(0); + expect(stage.rendererHeight).toBe(0); + expect($player.rendererWidth).toBe(0); + expect($player.rendererHeight).toBe(0); + }); +}); \ No newline at end of file diff --git a/packages/core/src/Player/usecase/PlayerResizeRegisterUseCase.test.ts b/packages/core/src/Player/usecase/PlayerResizeRegisterUseCase.test.ts new file mode 100644 index 00000000..a10526dc --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerResizeRegisterUseCase.test.ts @@ -0,0 +1,20 @@ +import { execute } from "./PlayerResizeRegisterUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("PlayerResizeRegisterUseCase.js test", () => +{ + it("execute test case", () => + { + let resizeEvent = false; + window.addEventListener = vi.fn((type) => + { + if ("resize" === type) { + resizeEvent = true; + } + }); + + expect(resizeEvent).toBe(false); + execute(); + expect(resizeEvent).toBe(true); + }); +}); \ No newline at end of file diff --git a/packages/media/src/Sound/service/SoundDecodeService.ts b/packages/media/src/Sound/service/SoundDecodeService.ts index af730b4c..d975b271 100644 --- a/packages/media/src/Sound/service/SoundDecodeService.ts +++ b/packages/media/src/Sound/service/SoundDecodeService.ts @@ -19,7 +19,7 @@ export const execute = async (array_buffer: ArrayBuffer): Promise +{ + it("execute test case1", () => + { + const job = { + "hasEventListener": () => true, + "dispatchEvent": vi.fn((event) => { + expect(event.type).toBe(JobEvent.STOP); + }), + "entries": {}, + "stopFlag": false, + } as unknown as Job; + + expect(job.stopFlag).toBe(false); + expect(job.entries).not.toBeNull(); + + execute(job); + + expect(job.stopFlag).toBe(true); + expect(job.entries).toBe(null); + }); +}); \ No newline at end of file diff --git a/packages/ui/src/Job/usecase/JobBootUseCase.test.ts b/packages/ui/src/Job/usecase/JobBootUseCase.test.ts new file mode 100644 index 00000000..630c5220 --- /dev/null +++ b/packages/ui/src/Job/usecase/JobBootUseCase.test.ts @@ -0,0 +1,36 @@ +import { execute } from "./JobBootUseCase"; +import { describe, expect, it } from "vitest"; +import type { Job } from "../../Job"; + +describe("JobBootUseCase.js test", () => +{ + it("execute test case1", () => + { + const job = { + "hasEventListener": () => false, + "startTime": 0, + "$timerId": 0, + "target": { + "test": 0 + }, + "from": { + "test": 100 + }, + "to": { + "test": 0 + }, + "entries": null, + "stopFlag": false, + } as unknown as Job; + + expect(job.startTime).toBe(0); + expect(job.$timerId).toBe(0); + expect(job.entries).toBe(null); + + execute(job); + + expect(job.entries).not.toBeNull(); + expect(job.$timerId).not.toBe(0); + expect(job.startTime).not.toBe(0); + }); +}); \ No newline at end of file diff --git a/packages/ui/src/Job/usecase/JobStartUseCase.test.ts b/packages/ui/src/Job/usecase/JobStartUseCase.test.ts new file mode 100644 index 00000000..9bcaa6d2 --- /dev/null +++ b/packages/ui/src/Job/usecase/JobStartUseCase.test.ts @@ -0,0 +1,32 @@ +import { execute } from "./JobStartUseCase"; +import { describe, expect, it } from "vitest"; +import type { Job } from "../../Job"; + +describe("JobStartUseCase.js test", () => +{ + it("execute test case1", () => + { + const job = { + "hasEventListener": () => false, + "startTime": 0, + "$timerId": 0, + "target": { + "test": 0 + }, + "from": { + "test": 100 + }, + "to": { + "test": 0 + }, + "entries": null, + "stopFlag": true, + } as unknown as Job; + + expect(job.stopFlag).toBe(true); + + execute(job); + + expect(job.stopFlag).toBe(false); + }); +}); \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index c1c2a050..52a4515a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Next2D } from "@next2d/core"; if (!("next2d" in window)) { - console.log("%c Next2D Player %c 2.0.3 %c https://next2d.app", + console.log("%c Next2D Player %c 2.1.1 %c https://next2d.app", "color: #fff; background: #5f5f5f", "color: #fff; background: #4bc729", "");