From f75f4d9afffe15671b532a51caeaaf06f8e9c039 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 08:42:19 +0900 Subject: [PATCH 01/45] #213 update packages --- package-lock.json | 431 ++++++++++++++++++++++++---------------------- package.json | 20 +-- 2 files changed, 238 insertions(+), 213 deletions(-) diff --git a/package-lock.json b/package-lock.json index a25c8c49..a77dfe38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@next2d/player", - "version": "2.5.1", + "version": "2.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@next2d/player", - "version": "2.5.1", + "version": "2.6.0", "license": "MIT", "workspaces": [ "packages/*" @@ -17,23 +17,23 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.36.0", - "@rollup/plugin-commonjs": "^28.0.6", - "@rollup/plugin-node-resolve": "^16.0.1", + "@eslint/js": "^9.37.0", + "@rollup/plugin-commonjs": "^28.0.8", + "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.6.2", - "@typescript-eslint/eslint-plugin": "^8.45.0", - "@typescript-eslint/parser": "^8.45.0", + "@types/node": "^24.8.0", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", "@vitest/web-worker": "^3.2.4", - "eslint": "^9.36.0", + "eslint": "^9.37.0", "eslint-plugin-unused-imports": "^4.2.0", "globals": "^16.4.0", "jsdom": "^27.0.0", - "rollup": "^4.52.3", + "rollup": "^4.52.4", "tslib": "^2.8.1", "typescript": "^5.9.3", - "vite": "^7.1.8", + "vite": "^7.1.10", "vitest": "^3.2.4", "vitest-webgl-canvas-mock": "^1.1.0" }, @@ -181,6 +181,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -227,6 +228,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -718,19 +720,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -778,9 +783,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "dev": true, "license": "MIT", "engines": { @@ -801,13 +806,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.16.0", "levn": "^0.4.1" }, "engines": { @@ -1011,9 +1016,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.6.tgz", - "integrity": "sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==", + "version": "28.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.8.tgz", + "integrity": "sha512-o1Ug9PxYsF61R7/NXO/GgMZZproLd/WH2XA53Tp9ppf6bU1lMlTtC/gUM6zM3mesi2E0rypk+PNtVrELREyWEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1038,9 +1043,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", - "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", "dev": true, "license": "MIT", "dependencies": { @@ -1136,9 +1141,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", "cpu": [ "arm" ], @@ -1150,9 +1155,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", "cpu": [ "arm64" ], @@ -1164,9 +1169,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", "cpu": [ "arm64" ], @@ -1178,9 +1183,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", "cpu": [ "x64" ], @@ -1192,9 +1197,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", "cpu": [ "arm64" ], @@ -1206,9 +1211,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", "cpu": [ "x64" ], @@ -1220,9 +1225,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", "cpu": [ "arm" ], @@ -1234,9 +1239,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", "cpu": [ "arm" ], @@ -1248,9 +1253,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", "cpu": [ "arm64" ], @@ -1262,9 +1267,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", "cpu": [ "arm64" ], @@ -1276,9 +1281,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", "cpu": [ "loong64" ], @@ -1290,9 +1295,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", "cpu": [ "ppc64" ], @@ -1304,9 +1309,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", "cpu": [ "riscv64" ], @@ -1318,9 +1323,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", "cpu": [ "riscv64" ], @@ -1332,9 +1337,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", "cpu": [ "s390x" ], @@ -1346,9 +1351,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" ], @@ -1360,9 +1365,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", "cpu": [ "x64" ], @@ -1374,9 +1379,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", "cpu": [ "arm64" ], @@ -1388,9 +1393,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", "cpu": [ "arm64" ], @@ -1402,9 +1407,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", "cpu": [ "ia32" ], @@ -1416,9 +1421,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", "cpu": [ "x64" ], @@ -1430,9 +1435,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", "cpu": [ "x64" ], @@ -1475,13 +1480,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", - "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", + "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "undici-types": "~7.13.0" + "undici-types": "~7.14.0" } }, "node_modules/@types/resolve": { @@ -1492,17 +1498,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", + "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/type-utils": "8.46.1", + "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1516,7 +1522,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.45.0", + "@typescript-eslint/parser": "^8.46.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1532,16 +1538,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", + "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4" }, "engines": { @@ -1557,14 +1564,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", + "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", + "@typescript-eslint/tsconfig-utils": "^8.46.1", + "@typescript-eslint/types": "^8.46.1", "debug": "^4.3.4" }, "engines": { @@ -1579,14 +1586,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", + "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1597,9 +1604,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", + "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", "dev": true, "license": "MIT", "engines": { @@ -1614,15 +1621,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", + "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/utils": "8.46.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1639,9 +1646,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", "dev": true, "license": "MIT", "engines": { @@ -1653,16 +1660,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", + "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/project-service": "8.46.1", + "@typescript-eslint/tsconfig-utils": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1708,16 +1715,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", + "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1732,13 +1739,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", + "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.46.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1909,6 +1916,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2398,20 +2406,21 @@ } }, "node_modules/eslint": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", - "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.36.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -3057,6 +3066,7 @@ "integrity": "sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@asamuzakjp/dom-selector": "^6.5.4", "cssstyle": "^5.3.0", @@ -3452,6 +3462,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -3565,11 +3576,12 @@ } }, "node_modules/rollup": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -3581,28 +3593,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" } }, @@ -3679,9 +3691,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3999,7 +4011,8 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-check": { "version": "0.4.0", @@ -4020,6 +4033,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4029,9 +4043,9 @@ } }, "node_modules/undici-types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", - "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", "dev": true, "license": "MIT" }, @@ -4046,11 +4060,12 @@ } }, "node_modules/vite": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.8.tgz", - "integrity": "sha512-oBXvfSHEOL8jF+R9Am7h59Up07kVVGH1NrFGFoEG6bPDZP3tGpQhvkBpy5x7U6+E6wZCu9OihsWgJqDbQIm8LQ==", + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.10.tgz", + "integrity": "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -4149,6 +4164,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -4385,7 +4401,8 @@ "packages/cache": { "name": "@next2d/cache", "version": "*", - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/core": { "name": "@next2d/core", @@ -4409,6 +4426,7 @@ "name": "@next2d/display", "version": "*", "license": "MIT", + "peer": true, "peerDependencies": { "@next2d/events": "file:../events", "@next2d/filters": "file:../filters", @@ -4423,22 +4441,26 @@ "packages/events": { "name": "@next2d/events", "version": "*", - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/filters": { "name": "@next2d/filters", "version": "*", - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/geom": { "name": "@next2d/geom", "version": "*", - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/media": { "name": "@next2d/media", "version": "*", "license": "MIT", + "peer": true, "peerDependencies": { "@next2d/display": "file:../display", "@next2d/events": "file:../events", @@ -4449,12 +4471,14 @@ "packages/net": { "name": "@next2d/net", "version": "*", - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/render-queue": { "name": "@next2d/render-queue", "version": "*", - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/renderer": { "name": "@next2d/renderer", @@ -4484,7 +4508,8 @@ "packages/texture-packer": { "name": "@next2d/texture-packer", "version": "*", - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/ui": { "name": "@next2d/ui", diff --git a/package.json b/package.json index 137adb69..72d45385 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@next2d/player", - "version": "2.5.2", + "version": "2.6.0", "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", @@ -46,23 +46,23 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.36.0", - "@rollup/plugin-commonjs": "^28.0.6", - "@rollup/plugin-node-resolve": "^16.0.1", + "@eslint/js": "^9.37.0", + "@rollup/plugin-commonjs": "^28.0.8", + "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.6.2", - "@typescript-eslint/eslint-plugin": "^8.45.0", - "@typescript-eslint/parser": "^8.45.0", + "@types/node": "^24.8.0", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", "@vitest/web-worker": "^3.2.4", - "eslint": "^9.36.0", + "eslint": "^9.37.0", "eslint-plugin-unused-imports": "^4.2.0", "globals": "^16.4.0", "jsdom": "^27.0.0", - "rollup": "^4.52.3", + "rollup": "^4.52.4", "tslib": "^2.8.1", "typescript": "^5.9.3", - "vite": "^7.1.8", + "vite": "^7.1.10", "vitest": "^3.2.4", "vitest-webgl-canvas-mock": "^1.1.0" }, From 973ee165df77a9efafe6e9f08892e2a9b5a597d0 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 08:42:43 +0900 Subject: [PATCH 02/45] =?UTF-8?q?#213=20tsconfig=E3=81=AE=E8=A8=98?= =?UTF-8?q?=E8=BF=B0=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tsconfig.json | 3 +-- tsconfig.json | 6 ------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/tsconfig.json b/src/tsconfig.json index 9868eddc..b1aa0ca1 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -12,11 +12,10 @@ "ES2022", "DOM", "DOM.Iterable" ], "moduleResolution": "bundler", - "baseUrl": "./", "outDir": "./dist/", "paths": { "@next2d/*": [ - "../packages/*/src" + "./packages/*/src" ] } }, diff --git a/tsconfig.json b/tsconfig.json index 9a9d388d..33e9ecf8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,13 +20,7 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "baseUrl": ".", "outDir": "./dist", - "paths": { - "@next2d/*": [ - "packages/*/src" - ] - }, "types": [ "vitest/globals" From 8ecaeab82ecfdf756673e228e6c00fe0f2f4b085 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 08:43:00 +0900 Subject: [PATCH 03/45] =?UTF-8?q?#213=20=E3=83=90=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E6=83=85=E5=A0=B1=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 4a9848d2..2940cbf2 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.5.2 %c https://next2d.app", + console.log("%c Next2D Player %c 2.6.0 %c https://next2d.app", "color: #fff; background: #5f5f5f", "color: #fff; background: #4bc729", ""); From 05801cd3855bed6ddcd503b8929f551c74e8684a Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 08:43:23 +0900 Subject: [PATCH 04/45] =?UTF-8?q?#213=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/Next2D/usecase/LoadUseCase.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/Next2D/usecase/LoadUseCase.ts b/packages/core/src/Next2D/usecase/LoadUseCase.ts index 19ad9a7e..0e2cbd48 100644 --- a/packages/core/src/Next2D/usecase/LoadUseCase.ts +++ b/packages/core/src/Next2D/usecase/LoadUseCase.ts @@ -75,15 +75,15 @@ export const execute = async (url: string, options: IPlayerOptions | null = null // resize playerResizeEventUseCase(); - // // ready complete + // ready complete playerReadyCompleteUseCase(); - // // remove loading + // remove loading playerRemoveLoadingElementService(); - // // append canvas + // append canvas playerAppendCanvasElementService(); - // // set position + // set position canvasSetPositionService(); }; \ No newline at end of file From 4dcf04033d3efec6f7550689237b1085514f097a Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 08:43:52 +0900 Subject: [PATCH 05/45] =?UTF-8?q?#213=20=E5=88=9D=E5=9B=9E=E8=B5=B7?= =?UTF-8?q?=E5=8B=95=E6=99=82=E3=81=AE=E3=83=95=E3=83=A9=E3=82=B0=E3=81=AE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=82=BF=E3=82=A4=E3=83=9F=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts index 33250bec..e5dff6df 100644 --- a/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts +++ b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.ts @@ -17,8 +17,8 @@ export const execute = (): void => // postMessage playerRenderingPostMessageService(); - stage.changed = false; // run player $player.play(); + stage.changed = false; }; \ No newline at end of file From 677e28d28a129f078cb64f9a24d04e7c27a1ec26 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 08:45:04 +0900 Subject: [PATCH 06/45] =?UTF-8?q?#213=20ColorTransform=E3=81=AEoffsetAlpha?= =?UTF-8?q?=E3=81=AF0=E3=81=AA=E3=81=AE=E3=81=A7=E3=80=81=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E3=81=97=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webgl/src/Shader/Fragment/FragmentShaderSourceTexture.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webgl/src/Shader/Fragment/FragmentShaderSourceTexture.ts b/packages/webgl/src/Shader/Fragment/FragmentShaderSourceTexture.ts index 70e435f5..c76e4562 100644 --- a/packages/webgl/src/Shader/Fragment/FragmentShaderSourceTexture.ts +++ b/packages/webgl/src/Shader/Fragment/FragmentShaderSourceTexture.ts @@ -53,13 +53,13 @@ void main() { vec4 src = texture(u_texture, v_coord); if (v_mul.x != 1.0 || v_mul.y != 1.0 || v_mul.z != 1.0 || v_mul.w != 1.0 - || v_add.x != 0.0 || v_add.y != 0.0 || v_add.z != 0.0 || v_add.w != 0.0 + || v_add.x != 0.0 || v_add.y != 0.0 || v_add.z != 0.0 ) { src.rgb /= max(0.0001, src.a); src = clamp(src * v_mul + v_add, 0.0, 1.0); src.rgb *= src.a; } - + o_color = src; }`; }; \ No newline at end of file From 91a2493b063e7e9b098695f33ce4655ec5c20890 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 08:45:39 +0900 Subject: [PATCH 07/45] =?UTF-8?q?#213=20=E3=83=96=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=81=AE=E5=88=86=E5=89=B2=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E7=B5=B1=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shader/Fragment/FragmentShaderLibrary.ts | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/webgl/src/Shader/Fragment/FragmentShaderLibrary.ts b/packages/webgl/src/Shader/Fragment/FragmentShaderLibrary.ts index 24e3359c..9060b3ef 100644 --- a/packages/webgl/src/Shader/Fragment/FragmentShaderLibrary.ts +++ b/packages/webgl/src/Shader/Fragment/FragmentShaderLibrary.ts @@ -11,19 +11,6 @@ float isInside(in vec2 uv) { }`; }; -/** - * @return {string} - * @method - * @static - */ -export const STATEMENT_INSTANCED_COLOR_TRANSFORM_ON = (): string => -{ - return ` - src.rgb /= max(0.0001, src.a); - src = clamp(src * mul + add, 0.0, 1.0); - src.rgb *= src.a;`; -}; - /** * @param {number} mediump_index * @return {string} @@ -35,5 +22,13 @@ export const STATEMENT_COLOR_TRANSFORM_ON = (mediump_index: number): string => return ` vec4 mul = u_mediump[${mediump_index}]; vec4 add = u_mediump[${mediump_index + 1}]; -${STATEMENT_INSTANCED_COLOR_TRANSFORM_ON()}`; + + if (mul.x != 1.0 || mul.y != 1.0 || mul.z != 1.0 || mul.w != 1.0 + || add.x != 0.0 || add.y != 0.0 || add.z != 0.0 + ) { + src.rgb /= max(0.0001, src.a); + src = clamp(src * mul + add, 0.0, 1.0); + src.rgb *= src.a; + } +`; }; \ No newline at end of file From 59362ded48756a00c1b9a94f67236dde730437b6 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 14:17:49 +0900 Subject: [PATCH 08/45] =?UTF-8?q?#213=20PremultipliedAlpha=E3=81=A7?= =?UTF-8?q?=E4=B9=97=E7=AE=97=E3=81=95=E3=82=8C=E3=81=9Fpixels=E3=81=AE?= =?UTF-8?q?=E8=A3=9C=E6=AD=A3=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContextCreateImageBitmapService.ts | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts index 56107cee..b3e1d9fb 100644 --- a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts +++ b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts @@ -17,6 +17,17 @@ import { */ let $byteLength: number = 0; +/** + * @description 0..255 の逆数テーブル(255/a) + * Inverse table of 0..255 (255/a) + * + * @type {Float32Array} + * @private + */ +const $inv: Float32Array = new Float32Array(256); +$inv[0] = 0; +for (let a = 1; a < 256; a++) $inv[a] = 255 / a; + /** * @description OffscreenCanvas に描画して返却 * Draw to OffscreenCanvas and return @@ -77,12 +88,29 @@ export const execute = async (width: number, height: number): Promise Date: Fri, 17 Oct 2025 14:18:22 +0900 Subject: [PATCH 09/45] =?UTF-8?q?#213=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/CaptureToCanvasUseCase.test.ts | 105 +++++++++++ .../CreateRootMovieClipUseCase.test.ts | 101 ++++++++++ .../src/Next2D/usecase/LoadUseCase.test.ts | 174 ++++++++++++++++++ .../PlayerReadyCompleteUseCase.test.ts | 6 +- 4 files changed, 383 insertions(+), 3 deletions(-) create mode 100644 packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts create mode 100644 packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts create mode 100644 packages/core/src/Next2D/usecase/LoadUseCase.test.ts diff --git a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts new file mode 100644 index 00000000..e3c3c1ad --- /dev/null +++ b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts @@ -0,0 +1,105 @@ +import { execute } from "./CaptureToCanvasUseCase"; +import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; +import type { DisplayObject } from "@next2d/display"; +import { $cacheStore } from "@next2d/cache"; +import { $player } from "../../Player"; + +vi.mock("@next2d/display", () => ({ + stage: { + stageWidth: 240, + stageHeight: 240, + rendererScale: 1, + rendererWidth: 240, + rendererHeight: 240 + } +})); + +vi.mock("../../Player", () => ({ + $player: { + stopFlag: false, + rendererWidth: 240, + rendererHeight: 240, + rendererScale: 1, + stop: vi.fn(), + play: vi.fn() + } +})); + +vi.mock("../../Player/service/PlayerResizePostMessageService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/service/PlayerTransferCanvasPostMessageService", () => ({ + execute: vi.fn(async () => {}) +})); + +vi.mock("../service/VideoSyncService", () => ({ + execute: vi.fn(async () => {}) +})); + +vi.mock("@next2d/cache", () => ({ + $cacheStore: { + getCanvas: vi.fn(() => document.createElement("canvas")) + } +})); + +describe("CaptureToCanvasUseCase.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("execute test case1 - basic capture", async () => + { + const mockDisplayObject = { + width: 100, + height: 100 + } as unknown as DisplayObject; + + const canvas = await execute(mockDisplayObject); + + expect(canvas).toBeInstanceOf(HTMLCanvasElement); + expect(canvas.width).toBe(100); + expect(canvas.height).toBe(100); + }); + + it("execute test case2 - capture with custom canvas", async () => + { + const mockDisplayObject = { + width: 200, + height: 150 + } as unknown as DisplayObject; + + const customCanvas = document.createElement("canvas"); + const result = await execute(mockDisplayObject, { canvas: customCanvas }); + + expect(result).toBe(customCanvas); + expect(result.width).toBe(200); + expect(result.height).toBe(150); + }); + + it("execute test case3 - capture with zero dimensions returns canvas without modification", async () => + { + const mockDisplayObject = { + width: 0, + height: 0 + } as unknown as DisplayObject; + + const canvas = await execute(mockDisplayObject); + + expect(canvas).toBeInstanceOf(HTMLCanvasElement); + }); + + it("execute test case4 - player stop and play called", async () => + { + const mockDisplayObject = { + width: 100, + height: 100 + } as unknown as DisplayObject; + + await execute(mockDisplayObject); + + expect($player.stop).toHaveBeenCalled(); + expect($player.play).toHaveBeenCalled(); + }); +}); diff --git a/packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts b/packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts new file mode 100644 index 00000000..45e9546c --- /dev/null +++ b/packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts @@ -0,0 +1,101 @@ +import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; +import { Sprite } from "@next2d/display"; + +vi.mock("@next2d/display", () => ({ + Sprite: class MockSprite {}, + stage: { + stageWidth: 240, + stageHeight: 240, + frameRate: 60, + addChild: vi.fn(), + getChildAt: vi.fn() + } +})); + +vi.mock("../../Player/usecase/PlayerBootUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/usecase/PlayerReadyCompleteUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/service/PlayerRemoveLoadingElementService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/service/PlayerAppendElementService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Canvas/service/CanvasSetPositionService", () => ({ + execute: vi.fn() +})); + +describe("CreateRootMovieClipUseCase.js test", () => +{ + let execute: any; + + beforeEach(async () => { + vi.clearAllMocks(); + vi.resetModules(); + const { stage } = await import("@next2d/display"); + stage.stageWidth = 240; + stage.stageHeight = 240; + stage.frameRate = 60; + + const module = await import("./CreateRootMovieClipUseCase"); + execute = module.execute; + }); + + it("execute test case1 - create root with default parameters", async () => + { + const { stage } = await import("@next2d/display"); + const mockSprite = new Sprite(); + stage.addChild.mockReturnValue(mockSprite); + + const result = execute(); + + expect(stage.stageWidth).toBe(240); + expect(stage.stageHeight).toBe(240); + expect(stage.frameRate).toBe(60); + expect(stage.addChild).toHaveBeenCalled(); + }); + + it("execute test case2 - create root with custom dimensions", async () => + { + const { stage } = await import("@next2d/display"); + const mockSprite = new Sprite(); + stage.addChild.mockReturnValue(mockSprite); + + const result = execute(480, 320, 30); + + expect(stage.stageWidth).toBe(480); + expect(stage.stageHeight).toBe(320); + expect(stage.frameRate).toBe(30); + }); + + it("execute test case3 - fps clamping", async () => + { + const { stage } = await import("@next2d/display"); + const mockSprite = new Sprite(); + stage.addChild.mockReturnValue(mockSprite); + + execute(240, 240, 120); + + expect(stage.frameRate).toBe(60); + }); + + it("execute test case4 - return existing root on second call", async () => + { + const { stage } = await import("@next2d/display"); + const mockSprite = new Sprite(); + stage.addChild.mockReturnValue(mockSprite); + stage.getChildAt.mockReturnValue(mockSprite); + + const first = execute(); + const second = execute(); + + expect(stage.getChildAt).toHaveBeenCalledWith(0); + }); +}); diff --git a/packages/core/src/Next2D/usecase/LoadUseCase.test.ts b/packages/core/src/Next2D/usecase/LoadUseCase.test.ts new file mode 100644 index 00000000..b5f58cae --- /dev/null +++ b/packages/core/src/Next2D/usecase/LoadUseCase.test.ts @@ -0,0 +1,174 @@ +import { execute } from "./LoadUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; +import { Loader } from "@next2d/display"; +import { URLRequest } from "@next2d/net"; + +vi.mock("@next2d/display", () => { + const mockLoaderInfo = { + data: null, + content: null, + addEventListener: vi.fn() + }; + + const mockLoader = { + contentLoaderInfo: mockLoaderInfo, + load: vi.fn(async () => {}) + }; + + return { + Loader: vi.fn(() => mockLoader), + stage: { + stageWidth: 240, + stageHeight: 240, + frameRate: 60, + backgroundColor: "#ffffff", + addChild: vi.fn() + } + }; +}); + +vi.mock("@next2d/net", () => ({ + URLRequest: vi.fn() +})); + +vi.mock("../../Player/usecase/PlayerBootUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/usecase/PlayerResizeEventUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/usecase/PlayerReadyCompleteUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/service/PlayerRemoveLoadingElementService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player/service/PlayerAppendElementService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Canvas/service/CanvasSetPositionService", () => ({ + execute: vi.fn() +})); + +describe("LoadUseCase.js test", () => +{ + beforeEach(async () => { + vi.clearAllMocks(); + const { stage, Loader } = await import("@next2d/display"); + stage.stageWidth = 240; + stage.stageHeight = 240; + stage.frameRate = 60; + stage.backgroundColor = "#ffffff"; + + const loaderInstance = new Loader(); + loaderInstance.contentLoaderInfo.data = null; + loaderInstance.contentLoaderInfo.content = null; + }); + + it("execute test case1 - return early when URL is empty", async () => + { + const { Loader } = await import("@next2d/display"); + const loaderInstance = new Loader(); + + await execute(""); + + expect(loaderInstance.load).not.toHaveBeenCalled(); + }); + + it("execute test case2 - load valid URL", async () => + { + const { stage, Loader } = await import("@next2d/display"); + const loaderInstance = new Loader(); + loaderInstance.contentLoaderInfo.data = { + stage: { + width: 480, + height: 320, + fps: 30, + bgColor: "#000000" + } + }; + loaderInstance.contentLoaderInfo.content = {}; + + await execute("https://example.com/content.json"); + + expect(loaderInstance.load).toHaveBeenCalled(); + expect(stage.stageWidth).toBe(480); + expect(stage.stageHeight).toBe(320); + expect(stage.frameRate).toBe(30); + expect(stage.backgroundColor).toBe("#000000"); + expect(stage.addChild).toHaveBeenCalled(); + }); + + it("execute test case3 - load with custom bgColor option", async () => + { + const { stage, Loader } = await import("@next2d/display"); + const loaderInstance = new Loader(); + loaderInstance.contentLoaderInfo.data = { + stage: { + width: 480, + height: 320, + fps: 30, + bgColor: "#000000" + } + }; + loaderInstance.contentLoaderInfo.content = {}; + + await execute("https://example.com/content.json", { bgColor: "#ff0000" }); + + expect(stage.backgroundColor).toBe("#ff0000"); + }); + + it("execute test case4 - return early when data is null", async () => + { + const { stage, Loader } = await import("@next2d/display"); + const loaderInstance = new Loader(); + loaderInstance.contentLoaderInfo.data = null; + + await execute("https://example.com/content.json"); + + expect(stage.addChild).not.toHaveBeenCalled(); + }); + + it("execute test case5 - handle URL with leading slash", async () => + { + const { Loader } = await import("@next2d/display"); + const loaderInstance = new Loader(); + loaderInstance.contentLoaderInfo.data = { + stage: { + width: 240, + height: 240, + fps: 60, + bgColor: "#ffffff" + } + }; + loaderInstance.contentLoaderInfo.content = {}; + + await execute("//example.com/content.json"); + + expect(loaderInstance.load).toHaveBeenCalled(); + }); + + it("execute test case6 - fps clamping", async () => + { + const { stage, Loader } = await import("@next2d/display"); + const loaderInstance = new Loader(); + loaderInstance.contentLoaderInfo.data = { + stage: { + width: 240, + height: 240, + fps: 120, + bgColor: "#ffffff" + } + }; + loaderInstance.contentLoaderInfo.content = {}; + + await execute("https://example.com/content.json"); + + expect(stage.frameRate).toBe(60); + }); +}); diff --git a/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts index e40ecdc9..6ece3340 100644 --- a/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts +++ b/packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts @@ -7,15 +7,15 @@ describe("PlayerReadyCompleteUseCase.js test", () => { it("execute test case", () => { - stage.changed = false; + stage.changed = true; $player.stopFlag = true; - expect(stage.changed).toBe(false); + expect(stage.changed).toBe(true); expect($player.stopFlag).toBe(true); execute(); - expect(stage.changed).toBe(true); + expect(stage.changed).toBe(false); expect($player.stopFlag).toBe(false); }); }); \ No newline at end of file From f642999c79244f10c364d20e20fcae4abf0bf370 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 14:28:30 +0900 Subject: [PATCH 10/45] =?UTF-8?q?#213=20Lint=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Context/service/ContextCreateImageBitmapService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts index b3e1d9fb..28bfb4d1 100644 --- a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts +++ b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts @@ -25,8 +25,9 @@ let $byteLength: number = 0; * @private */ const $inv: Float32Array = new Float32Array(256); -$inv[0] = 0; -for (let a = 1; a < 256; a++) $inv[a] = 255 / a; +for (let a = 1; a < 256; a++) { + $inv[a] = 255 / a; +} /** * @description OffscreenCanvas に描画して返却 @@ -88,7 +89,7 @@ export const execute = async (width: number, height: number): Promise Date: Fri, 17 Oct 2025 14:28:41 +0900 Subject: [PATCH 11/45] =?UTF-8?q?#213=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...layerRemoveCachePostMessageService.test.ts | 63 +++++++ .../PlayerRenderingPostMessageService.test.ts | 89 ++++++++++ .../PlayerResizePostMessageService.test.ts | 90 ++++++++++ .../PlayerSetCurrentMousePointService.test.ts | 128 ++++++++++++++ ...erTransferCanvasPostMessageService.test.ts | 163 ++++++++++++++++++ 5 files changed, 533 insertions(+) create mode 100644 packages/core/src/Player/service/PlayerRemoveCachePostMessageService.test.ts create mode 100644 packages/core/src/Player/service/PlayerRenderingPostMessageService.test.ts create mode 100644 packages/core/src/Player/service/PlayerResizePostMessageService.test.ts create mode 100644 packages/core/src/Player/service/PlayerSetCurrentMousePointService.test.ts create mode 100644 packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.test.ts diff --git a/packages/core/src/Player/service/PlayerRemoveCachePostMessageService.test.ts b/packages/core/src/Player/service/PlayerRemoveCachePostMessageService.test.ts new file mode 100644 index 00000000..8d5cbfa0 --- /dev/null +++ b/packages/core/src/Player/service/PlayerRemoveCachePostMessageService.test.ts @@ -0,0 +1,63 @@ +import { execute } from "./PlayerRemoveCachePostMessageService"; +import { $cacheStore } from "@next2d/cache"; +import { $rendererWorker } from "../../RendererWorker"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("@next2d/cache", () => ({ + $cacheStore: { + $removeIds: [] + } +})); + +vi.mock("../../RendererWorker", () => ({ + $rendererWorker: { + postMessage: vi.fn() + } +})); + +describe("PlayerRemoveCachePostMessageService.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + $cacheStore.$removeIds = []; + }); + + it("execute test case1 - remove cache with empty ids", () => + { + execute(); + + expect($rendererWorker.postMessage).toHaveBeenCalled(); + expect($cacheStore.$removeIds.length).toBe(0); + }); + + it("execute test case2 - remove cache with ids", () => + { + $cacheStore.$removeIds = [1, 2, 3, 4, 5]; + + execute(); + + expect($rendererWorker.postMessage).toHaveBeenCalled(); + expect($cacheStore.$removeIds.length).toBe(0); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + expect(calls.length).toBe(1); + expect(calls[0][0].command).toBe("removeCache"); + expect(calls[0][0].buffer).toBeInstanceOf(Float32Array); + }); + + it("execute test case3 - verify message structure", () => + { + $cacheStore.$removeIds = [10, 20, 30]; + + execute(); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + const message = calls[0][0]; + const options = calls[0][1]; + + expect(message.command).toBe("removeCache"); + expect(message.buffer).toBeInstanceOf(Float32Array); + expect(options).toBeInstanceOf(Array); + expect(options[0]).toBeInstanceOf(ArrayBuffer); + }); +}); diff --git a/packages/core/src/Player/service/PlayerRenderingPostMessageService.test.ts b/packages/core/src/Player/service/PlayerRenderingPostMessageService.test.ts new file mode 100644 index 00000000..4b953f27 --- /dev/null +++ b/packages/core/src/Player/service/PlayerRenderingPostMessageService.test.ts @@ -0,0 +1,89 @@ +import { execute, $COLOR_ARRAY_IDENTITY } from "./PlayerRenderingPostMessageService"; +import { $rendererWorker } from "../../RendererWorker"; +import { stage } from "@next2d/display"; +import { renderQueue } from "@next2d/render-queue"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("@next2d/display", () => ({ + stage: { + $generateRenderQueue: vi.fn() + } +})); + +vi.mock("../../RendererWorker", () => ({ + $rendererWorker: { + postMessage: vi.fn(), + addEventListener: vi.fn() + } +})); + +vi.mock("@next2d/render-queue", () => ({ + renderQueue: { + offset: 0, + buffer: new Float32Array(1024) + } +})); + +vi.mock("../../CoreUtil", () => ({ + $renderMatrix: new Float32Array([1, 0, 0, 1, 0, 0]) +})); + +describe("PlayerRenderingPostMessageService.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + renderQueue.offset = 0; + }); + + it("execute test case1 - no rendering when offset is 0", () => + { + renderQueue.offset = 0; + + execute(); + + expect(stage.$generateRenderQueue).toHaveBeenCalled(); + expect($rendererWorker.postMessage).not.toHaveBeenCalled(); + }); + + it("execute test case2 - render with offset", () => + { + // Mock $generateRenderQueue to set offset after it's called + vi.mocked(stage.$generateRenderQueue).mockImplementation(() => { + renderQueue.offset = 100; + }); + + execute(); + + expect(stage.$generateRenderQueue).toHaveBeenCalled(); + expect($rendererWorker.postMessage).toHaveBeenCalled(); + }); + + it("execute test case3 - verify message structure without imageBitmaps", () => + { + // Mock $generateRenderQueue to set offset after it's called + vi.mocked(stage.$generateRenderQueue).mockImplementation(() => { + renderQueue.offset = 50; + }); + + execute(); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + expect(calls.length).toBe(1); + + const message = calls[0][0]; + expect(message.command).toBe("render"); + expect(message.buffer).toBeInstanceOf(Float32Array); + expect(message.length).toBe(50); + expect(message.imageBitmaps).toBe(null); + }); + + it("execute test case4 - verify COLOR_ARRAY_IDENTITY", () => + { + expect($COLOR_ARRAY_IDENTITY).toBeInstanceOf(Float32Array); + expect($COLOR_ARRAY_IDENTITY.length).toBe(8); + expect($COLOR_ARRAY_IDENTITY[0]).toBe(1); + expect($COLOR_ARRAY_IDENTITY[1]).toBe(1); + expect($COLOR_ARRAY_IDENTITY[2]).toBe(1); + expect($COLOR_ARRAY_IDENTITY[3]).toBe(1); + }); +}); diff --git a/packages/core/src/Player/service/PlayerResizePostMessageService.test.ts b/packages/core/src/Player/service/PlayerResizePostMessageService.test.ts new file mode 100644 index 00000000..88168ea8 --- /dev/null +++ b/packages/core/src/Player/service/PlayerResizePostMessageService.test.ts @@ -0,0 +1,90 @@ +import { execute } from "./PlayerResizePostMessageService"; +import { $player } from "../../Player"; +import { $rendererWorker } from "../../RendererWorker"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../../Player", () => ({ + $player: { + rendererWidth: 800, + rendererHeight: 600, + rendererScale: 1 + } +})); + +vi.mock("../../RendererWorker", () => ({ + $rendererWorker: { + postMessage: vi.fn() + } +})); + +describe("PlayerResizePostMessageService.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + $player.rendererWidth = 800; + $player.rendererHeight = 600; + }); + + it("execute test case1 - resize with default cache clear", () => + { + execute(); + + expect($rendererWorker.postMessage).toHaveBeenCalled(); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + const message = calls[0][0]; + + expect(message.command).toBe("resize"); + expect(message.buffer).toBeInstanceOf(Float32Array); + expect(message.buffer[0]).toBe(800); + expect(message.buffer[1]).toBe(600); + expect(message.buffer[2]).toBe(1); + }); + + it("execute test case2 - resize with cache clear false", () => + { + execute(false); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + const message = calls[0][0]; + + expect(message.buffer[0]).toBe(800); + expect(message.buffer[1]).toBe(600); + expect(message.buffer[2]).toBe(0); + }); + + it("execute test case3 - resize with cache clear true", () => + { + execute(true); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + const message = calls[0][0]; + + expect(message.buffer[2]).toBe(1); + }); + + it("execute test case4 - verify transferable options", () => + { + execute(); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + const options = calls[0][1]; + + expect(options).toBeInstanceOf(Array); + expect(options[0]).toBeInstanceOf(ArrayBuffer); + }); + + it("execute test case5 - different dimensions", () => + { + $player.rendererWidth = 1024; + $player.rendererHeight = 768; + + execute(); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + const message = calls[0][0]; + + expect(message.buffer[0]).toBe(1024); + expect(message.buffer[1]).toBe(768); + }); +}); diff --git a/packages/core/src/Player/service/PlayerSetCurrentMousePointService.test.ts b/packages/core/src/Player/service/PlayerSetCurrentMousePointService.test.ts new file mode 100644 index 00000000..acdc43a1 --- /dev/null +++ b/packages/core/src/Player/service/PlayerSetCurrentMousePointService.test.ts @@ -0,0 +1,128 @@ +import { execute } from "./PlayerSetCurrentMousePointService"; +import { $player } from "../../Player"; +import { stage } from "@next2d/display"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../../Player", () => ({ + $player: { + rendererWidth: 800, + rendererHeight: 600, + rendererScale: 1 + } +})); + +vi.mock("@next2d/display", () => ({ + stage: { + stageWidth: 800, + stageHeight: 600, + pointer: { + x: 0, + y: 0 + } + } +})); + +vi.mock("../../CoreUtil", () => ({ + $getMainElement: vi.fn(() => null), + $devicePixelRatio: 1 +})); + +describe("PlayerSetCurrentMousePointService.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + stage.pointer.x = 0; + stage.pointer.y = 0; + $player.rendererWidth = 800; + $player.rendererHeight = 600; + $player.rendererScale = 1; + stage.stageWidth = 800; + stage.stageHeight = 600; + }); + + it("execute test case1 - basic pointer position", () => + { + const mockEvent = { + pageX: 100, + pageY: 100, + target: { + getBoundingClientRect: vi.fn(() => ({ + left: 0, + top: 0 + })) + } + } as unknown as PointerEvent; + + execute(mockEvent); + + expect(stage.pointer.x).toBeGreaterThanOrEqual(0); + expect(stage.pointer.y).toBeGreaterThanOrEqual(0); + }); + + it("execute test case2 - pointer with offset", () => + { + const mockEvent = { + pageX: 200, + pageY: 150, + target: { + getBoundingClientRect: vi.fn(() => ({ + left: 50, + top: 50 + })) + } + } as unknown as PointerEvent; + + execute(mockEvent); + + expect(stage.pointer.x).toBeDefined(); + expect(stage.pointer.y).toBeDefined(); + }); + + it("execute test case3 - scaled renderer", () => + { + $player.rendererScale = 2; + stage.stageWidth = 400; + stage.stageHeight = 300; + + const mockEvent = { + pageX: 400, + pageY: 300, + target: { + getBoundingClientRect: vi.fn(() => ({ + left: 0, + top: 0 + })) + } + } as unknown as PointerEvent; + + execute(mockEvent); + + expect(stage.pointer.x).toBeDefined(); + expect(stage.pointer.y).toBeDefined(); + }); + + it("execute test case4 - with scroll", () => + { + Object.defineProperty(window, 'scrollX', { value: 100, writable: true }); + Object.defineProperty(window, 'scrollY', { value: 50, writable: true }); + + const mockEvent = { + pageX: 200, + pageY: 200, + target: { + getBoundingClientRect: vi.fn(() => ({ + left: 0, + top: 0 + })) + } + } as unknown as PointerEvent; + + execute(mockEvent); + + expect(stage.pointer.x).toBeDefined(); + expect(stage.pointer.y).toBeDefined(); + + Object.defineProperty(window, 'scrollX', { value: 0, writable: true }); + Object.defineProperty(window, 'scrollY', { value: 0, writable: true }); + }); +}); diff --git a/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.test.ts b/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.test.ts new file mode 100644 index 00000000..ebee32c6 --- /dev/null +++ b/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.test.ts @@ -0,0 +1,163 @@ +import { execute } from "./PlayerTransferCanvasPostMessageService"; +import { stage } from "@next2d/display"; +import { renderQueue } from "@next2d/render-queue"; +import { $rendererWorker } from "../../RendererWorker"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("@next2d/display", () => ({ + stage: { + $generateRenderQueue: vi.fn() + } +})); + +vi.mock("../../RendererWorker", () => ({ + $rendererWorker: { + postMessage: vi.fn(), + addEventListener: vi.fn(), + removeEventListener: vi.fn() + } +})); + +vi.mock("@next2d/render-queue", () => ({ + renderQueue: { + offset: 0, + buffer: new Float32Array(1024) + } +})); + +describe("PlayerTransferCanvasPostMessageService.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + renderQueue.offset = 0; + }); + + it("execute test case1 - return early when offset is 0", async () => + { + const mockDisplayObject = {} as any; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + const canvas = document.createElement("canvas"); + + renderQueue.offset = 0; + + const result = await execute(mockDisplayObject, matrix, colorTransform, canvas); + + expect(result).toBe(canvas); + expect(stage.$generateRenderQueue).toHaveBeenCalled(); + expect($rendererWorker.postMessage).not.toHaveBeenCalled(); + }); + + it("execute test case2 - capture with offset", async () => + { + const mockDisplayObject = {} as any; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + const canvas = document.createElement("canvas"); + canvas.width = 100; + canvas.height = 100; + + // Mock $generateRenderQueue to set offset after it's called + vi.mocked(stage.$generateRenderQueue).mockImplementation(() => { + renderQueue.offset = 100; + }); + + // Mock worker response + const mockMessageEvent = { + data: { + message: "capture", + buffer: new Float32Array(1024), + imageBitmap: canvas + } + }; + + vi.mocked($rendererWorker.addEventListener).mockImplementation((event, handler) => { + if (event === "message") { + setTimeout(() => (handler as any)(mockMessageEvent), 0); + } + }); + + const result = await execute(mockDisplayObject, matrix, colorTransform, canvas); + + expect(result).toBeInstanceOf(HTMLCanvasElement); + expect(stage.$generateRenderQueue).toHaveBeenCalled(); + expect($rendererWorker.postMessage).toHaveBeenCalled(); + expect($rendererWorker.addEventListener).toHaveBeenCalled(); + expect($rendererWorker.removeEventListener).toHaveBeenCalled(); + }); + + it("execute test case3 - verify message structure", async () => + { + const mockDisplayObject = {} as any; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + const canvas = document.createElement("canvas"); + canvas.width = 200; + canvas.height = 150; + + // Mock $generateRenderQueue to set offset after it's called + vi.mocked(stage.$generateRenderQueue).mockImplementation(() => { + renderQueue.offset = 50; + }); + + const mockMessageEvent = { + data: { + message: "capture", + buffer: new Float32Array(1024), + imageBitmap: canvas + } + }; + + vi.mocked($rendererWorker.addEventListener).mockImplementation((event, handler) => { + if (event === "message") { + setTimeout(() => (handler as any)(mockMessageEvent), 0); + } + }); + + await execute(mockDisplayObject, matrix, colorTransform, canvas); + + const calls = vi.mocked($rendererWorker.postMessage).mock.calls; + expect(calls.length).toBe(1); + + const message = calls[0][0]; + expect(message.command).toBe("capture"); + expect(message.buffer).toBeInstanceOf(Float32Array); + expect(message.width).toBe(200); + expect(message.height).toBe(150); + expect(message.length).toBe(50); + }); + + it("execute test case4 - verify canvas context is used", async () => + { + const mockDisplayObject = {} as any; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + const canvas = document.createElement("canvas"); + canvas.width = 100; + canvas.height = 100; + + // Mock $generateRenderQueue to set offset after it's called + vi.mocked(stage.$generateRenderQueue).mockImplementation(() => { + renderQueue.offset = 100; + }); + + const mockImageBitmap = canvas; + const mockMessageEvent = { + data: { + message: "capture", + buffer: new Float32Array(1024), + imageBitmap: mockImageBitmap + } + }; + + vi.mocked($rendererWorker.addEventListener).mockImplementation((event, handler) => { + if (event === "message") { + setTimeout(() => (handler as any)(mockMessageEvent), 0); + } + }); + + const result = await execute(mockDisplayObject, matrix, colorTransform, canvas); + + expect(result).toBe(canvas); + }); +}); From 9ef63bd9ab348977aafb7d11df57e6cedbd72653 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 15:09:24 +0900 Subject: [PATCH 12/45] =?UTF-8?q?#213=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Player/usecase/PlayerBootUseCase.test.ts | 103 +++++++++++ .../usecase/PlayerHitTestUseCase.test.ts | 143 +++++++++++++++ .../usecase/PlayerTickerUseCase.test.ts | 163 ++++++++++++++++++ 3 files changed, 409 insertions(+) create mode 100644 packages/core/src/Player/usecase/PlayerBootUseCase.test.ts create mode 100644 packages/core/src/Player/usecase/PlayerHitTestUseCase.test.ts create mode 100644 packages/core/src/Player/usecase/PlayerTickerUseCase.test.ts diff --git a/packages/core/src/Player/usecase/PlayerBootUseCase.test.ts b/packages/core/src/Player/usecase/PlayerBootUseCase.test.ts new file mode 100644 index 00000000..baa0d15d --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerBootUseCase.test.ts @@ -0,0 +1,103 @@ +import { execute } from "./PlayerBootUseCase"; +import { $player } from "../../Player"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../service/PlayerCreateContainerElementService", () => ({ + execute: vi.fn(() => document.createElement("div")) +})); + +vi.mock("../service/PlayerApplyContainerElementStyleService", () => ({ + execute: vi.fn() +})); + +vi.mock("../service/PlayerLoadingAnimationService", () => ({ + execute: vi.fn() +})); + +vi.mock("./PlayerResizeEventUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("./PlayerResizeRegisterUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../Player", () => ({ + $player: { + setOptions: vi.fn(), + fixedWidth: false, + fixedHeight: false + } +})); + +describe("PlayerBootUseCase.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + $player.fixedWidth = false; + $player.fixedHeight = false; + }); + + it("execute test case1 - boot with default options", async () => + { + const { execute: playerCreateContainerElementService } = await import("../service/PlayerCreateContainerElementService"); + const { execute: playerApplyContainerElementStyleService } = await import("../service/PlayerApplyContainerElementStyleService"); + const { execute: playerLoadingAnimationService } = await import("../service/PlayerLoadingAnimationService"); + const { execute: playerResizeEventService } = await import("./PlayerResizeEventUseCase"); + const { execute: playerResizeRegisterService } = await import("./PlayerResizeRegisterUseCase"); + + execute(); + + expect($player.setOptions).toHaveBeenCalledWith(null); + expect(playerCreateContainerElementService).toHaveBeenCalled(); + expect(playerApplyContainerElementStyleService).toHaveBeenCalled(); + expect(playerLoadingAnimationService).toHaveBeenCalled(); + expect(playerResizeRegisterService).toHaveBeenCalled(); + expect(playerResizeEventService).toHaveBeenCalled(); + }); + + it("execute test case2 - boot with custom options", async () => + { + const options = { bgColor: "#ff0000" }; + + execute(options); + + expect($player.setOptions).toHaveBeenCalledWith(options); + }); + + it("execute test case3 - boot with fixed width", async () => + { + const { execute: playerResizeRegisterService } = await import("./PlayerResizeRegisterUseCase"); + + $player.fixedWidth = true; + $player.fixedHeight = false; + + execute(); + + expect(playerResizeRegisterService).not.toHaveBeenCalled(); + }); + + it("execute test case4 - boot with fixed height", async () => + { + const { execute: playerResizeRegisterService } = await import("./PlayerResizeRegisterUseCase"); + + $player.fixedWidth = false; + $player.fixedHeight = true; + + execute(); + + expect(playerResizeRegisterService).not.toHaveBeenCalled(); + }); + + it("execute test case5 - boot with both fixed dimensions", async () => + { + const { execute: playerResizeRegisterService } = await import("./PlayerResizeRegisterUseCase"); + + $player.fixedWidth = true; + $player.fixedHeight = true; + + execute(); + + expect(playerResizeRegisterService).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/core/src/Player/usecase/PlayerHitTestUseCase.test.ts b/packages/core/src/Player/usecase/PlayerHitTestUseCase.test.ts new file mode 100644 index 00000000..43d1ab9b --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerHitTestUseCase.test.ts @@ -0,0 +1,143 @@ +import { execute } from "./PlayerHitTestUseCase"; +import { $player } from "../../Player"; +import { stage } from "@next2d/display"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../../Player", () => ({ + $player: { + stopFlag: false, + mouseState: "up" + } +})); + +vi.mock("@next2d/display", () => ({ + stage: { + pointer: { + x: 0, + y: 0 + }, + $mouseHit: vi.fn() + } +})); + +vi.mock("../../CoreUtil", () => ({ + $hitContext: { + beginPath: vi.fn(), + setTransform: vi.fn() + }, + $hitObject: { + x: 0, + y: 0, + pointer: "auto", + hit: null + }, + $hitMatrix: new Float32Array([1, 0, 0, 1, 0, 0]), + $getCanvas: vi.fn(() => ({ + style: { + cursor: "auto" + } + })) +})); + +describe("PlayerHitTestUseCase.js test", () => +{ + beforeEach(async () => { + vi.clearAllMocks(); + $player.stopFlag = false; + $player.mouseState = "up"; + + const { $hitObject } = await import("../../CoreUtil"); + $hitObject.pointer = "auto"; + $hitObject.hit = null; + + // Reset stage.$mouseHit mock to not modify $hitObject by default + vi.mocked(stage.$mouseHit).mockImplementation(() => { + // Do nothing by default + }); + }); + + it("execute test case1 - return early when stopped", async () => + { + $player.stopFlag = true; + + const { $hitContext } = await import("../../CoreUtil"); + + execute(); + + expect($hitContext.beginPath).not.toHaveBeenCalled(); + }); + + it("execute test case2 - perform hit test when running", async () => + { + $player.stopFlag = false; + stage.pointer.x = 100; + stage.pointer.y = 50; + + const { $hitContext, $hitObject } = await import("../../CoreUtil"); + + execute(); + + expect($hitContext.beginPath).toHaveBeenCalled(); + expect($hitContext.setTransform).toHaveBeenCalledWith(1, 0, 0, 1, 0, 0); + expect(stage.$mouseHit).toHaveBeenCalled(); + expect($hitObject.x).toBe(100); + expect($hitObject.y).toBe(50); + }); + + it("execute test case3 - update cursor when mouse state is up", async () => + { + $player.stopFlag = false; + $player.mouseState = "up"; + + const { $hitObject, $getCanvas } = await import("../../CoreUtil"); + + // Mock stage.$mouseHit to change the pointer + vi.mocked(stage.$mouseHit).mockImplementation(() => { + $hitObject.pointer = "pointer"; + }); + + const mockCanvas = { + style: { + cursor: "auto" + } + }; + vi.mocked($getCanvas).mockReturnValue(mockCanvas as any); + + execute(); + + expect(mockCanvas.style.cursor).toBe("pointer"); + }); + + it("execute test case4 - do not update cursor when mouse state is down", async () => + { + $player.stopFlag = false; + $player.mouseState = "down"; + + const { $hitObject, $getCanvas } = await import("../../CoreUtil"); + $hitObject.pointer = "pointer"; + + const mockCanvas = { + style: { + cursor: "auto" + } + }; + vi.mocked($getCanvas).mockReturnValue(mockCanvas as any); + + execute(); + + // Cursor should not change when mouse is down + expect($getCanvas).not.toHaveBeenCalled(); + }); + + it("execute test case5 - reset hit object properties", async () => + { + $player.stopFlag = false; + + const { $hitObject } = await import("../../CoreUtil"); + + execute(); + + expect($hitObject.pointer).toBe("auto"); + expect($hitObject.hit).toBe(null); + }); +}); diff --git a/packages/core/src/Player/usecase/PlayerTickerUseCase.test.ts b/packages/core/src/Player/usecase/PlayerTickerUseCase.test.ts new file mode 100644 index 00000000..118c7e25 --- /dev/null +++ b/packages/core/src/Player/usecase/PlayerTickerUseCase.test.ts @@ -0,0 +1,163 @@ +import { execute } from "./PlayerTickerUseCase"; +import { $player } from "../../Player"; +import { stage } from "@next2d/display"; +import { $cacheStore } from "@next2d/cache"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../../Player", () => ({ + $player: { + stopFlag: false, + startTime: 0, + fps: 16.666, + timerId: -1 + } +})); + +vi.mock("@next2d/display", () => ({ + stage: { + changed: false, + $ticker: vi.fn(), + hasEventListener: vi.fn(() => false), + dispatchEvent: vi.fn() + } +})); + +vi.mock("@next2d/cache", () => ({ + $cacheStore: { + $removeIds: [], + $removeCache: false, + removeTimerScheduledCache: vi.fn() + } +})); + +vi.mock("@next2d/events", () => ({ + Event: class MockEvent { + static ENTER_FRAME = "enterFrame"; + constructor(public type: string) {} + } +})); + +vi.mock("../service/PlayerRenderingPostMessageService", () => ({ + execute: vi.fn() +})); + +vi.mock("../service/PlayerRemoveCachePostMessageService", () => ({ + execute: vi.fn() +})); + +describe("PlayerTickerUseCase.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + $player.stopFlag = false; + $player.startTime = 0; + $player.fps = 16.666; + $player.timerId = -1; + stage.changed = false; + $cacheStore.$removeIds = []; + $cacheStore.$removeCache = false; + + global.requestAnimationFrame = vi.fn((callback) => { + return 1; + }) as any; + }); + + it("execute test case1 - return early when stopped", async () => + { + $player.stopFlag = true; + + execute(16.666); + + expect(stage.$ticker).not.toHaveBeenCalled(); + }); + + it("execute test case2 - execute ticker when time elapsed", async () => + { + $player.stopFlag = false; + $player.startTime = 0; + + execute(20); + + expect(stage.$ticker).toHaveBeenCalled(); + }); + + it("execute test case3 - skip ticker when time not elapsed", async () => + { + $player.stopFlag = false; + $player.startTime = 0; + + execute(5); + + expect(stage.$ticker).not.toHaveBeenCalled(); + expect(global.requestAnimationFrame).toHaveBeenCalled(); + }); + + it("execute test case4 - dispatch enter frame event when has listener", async () => + { + $player.stopFlag = false; + $player.startTime = 0; + vi.mocked(stage.hasEventListener).mockReturnValue(true); + + execute(20); + + expect(stage.dispatchEvent).toHaveBeenCalled(); + }); + + it("execute test case5 - render when stage changed", async () => + { + const { execute: playerRenderingPostMessageService } = await import("../service/PlayerRenderingPostMessageService"); + + $player.stopFlag = false; + $player.startTime = 0; + stage.changed = true; + + execute(20); + + expect(playerRenderingPostMessageService).toHaveBeenCalled(); + }); + + it("execute test case6 - remove cache when ids present", async () => + { + const { execute: playerRemoveCachePostMessageService } = await import("../service/PlayerRemoveCachePostMessageService"); + + $player.stopFlag = false; + $cacheStore.$removeIds = [1, 2, 3]; + + execute(20); + + expect(playerRemoveCachePostMessageService).toHaveBeenCalled(); + }); + + it("execute test case7 - remove scheduled cache when flag set", async () => + { + const { execute: playerRemoveCachePostMessageService } = await import("../service/PlayerRemoveCachePostMessageService"); + + $player.stopFlag = false; + $player.startTime = 0; + $cacheStore.$removeCache = true; + + execute(20); + + expect($cacheStore.removeTimerScheduledCache).toHaveBeenCalled(); + }); + + it("execute test case8 - request next frame", () => + { + $player.stopFlag = false; + + execute(20); + + expect(global.requestAnimationFrame).toHaveBeenCalled(); + }); + + it("execute test case9 - update start time", () => + { + $player.stopFlag = false; + $player.startTime = 0; + $player.fps = 16.666; + + execute(30); + + expect($player.startTime).toBeGreaterThan(0); + }); +}); From 02e492d687444c76fc26d06047298615e11c0ad4 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 15:21:17 +0900 Subject: [PATCH 13/45] =?UTF-8?q?#213=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DisplayObjectGetCalcBoundsUseCase.test.ts | 90 +++++++++++ ...playObjectGetColorTransformUseCase.test.ts | 75 +++++++++ .../DisplayObjectGetMatrixUseCase.test.ts | 100 ++++++++++++ .../DisplayObjectGetRawBoundsUseCase.test.ts | 90 +++++++++++ ...ectIsMaskReflectedInDisplayUseCase.test.ts | 143 ++++++++++++++++++ 5 files changed, 498 insertions(+) create mode 100644 packages/display/src/DisplayObject/usecase/DisplayObjectGetCalcBoundsUseCase.test.ts create mode 100644 packages/display/src/DisplayObject/usecase/DisplayObjectGetColorTransformUseCase.test.ts create mode 100644 packages/display/src/DisplayObject/usecase/DisplayObjectGetMatrixUseCase.test.ts create mode 100644 packages/display/src/DisplayObject/usecase/DisplayObjectGetRawBoundsUseCase.test.ts create mode 100644 packages/display/src/DisplayObject/usecase/DisplayObjectIsMaskReflectedInDisplayUseCase.test.ts diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetCalcBoundsUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetCalcBoundsUseCase.test.ts new file mode 100644 index 00000000..e24f7ed5 --- /dev/null +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetCalcBoundsUseCase.test.ts @@ -0,0 +1,90 @@ +import { execute } from "./DisplayObjectGetCalcBoundsUseCase"; +import { DisplayObject } from "../../DisplayObject"; +import { describe, expect, it, vi } from "vitest"; + +vi.mock("../../Shape/usecase/ShapeCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 100, 100])) +})); + +vi.mock("../../Video/usecase/VideoCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 200, 150])) +})); + +vi.mock("../../TextField/usecase/TextFieldCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 300, 50])) +})); + +vi.mock("../../DisplayObjectContainer/usecase/DisplayObjectContainerCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 400, 300])) +})); + +describe("DisplayObjectGetCalcBoundsUseCase.js test", () => +{ + it("execute test case1 - default DisplayObject", () => + { + const displayObject = new DisplayObject(); + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(0); + expect(result[3]).toBe(0); + }); + + it("execute test case2 - container DisplayObject", async () => + { + const displayObject = new DisplayObject(); + displayObject.isContainerEnabled = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(400); + expect(result[3]).toBe(300); + }); + + it("execute test case3 - shape DisplayObject", async () => + { + const displayObject = new DisplayObject(); + displayObject.isShape = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(100); + expect(result[3]).toBe(100); + }); + + it("execute test case4 - text DisplayObject", async () => + { + const displayObject = new DisplayObject(); + displayObject.isText = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(300); + expect(result[3]).toBe(50); + }); + + it("execute test case5 - video DisplayObject", async () => + { + const displayObject = new DisplayObject(); + displayObject.isVideo = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(200); + expect(result[3]).toBe(150); + }); +}); diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetColorTransformUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetColorTransformUseCase.test.ts new file mode 100644 index 00000000..934f1d7e --- /dev/null +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetColorTransformUseCase.test.ts @@ -0,0 +1,75 @@ +import { execute } from "./DisplayObjectGetColorTransformUseCase"; +import { DisplayObject } from "../../DisplayObject"; +import { ColorTransform } from "@next2d/geom"; +import { describe, expect, it } from "vitest"; + +describe("DisplayObjectGetColorTransformUseCase.js test", () => +{ + it("execute test case1 - default ColorTransform", () => + { + const displayObject = new DisplayObject(); + const result = execute(displayObject); + + expect(result).toBeInstanceOf(ColorTransform); + expect(result.redMultiplier).toBe(1); + expect(result.greenMultiplier).toBe(1); + expect(result.blueMultiplier).toBe(1); + expect(result.alphaMultiplier).toBe(1); + expect(result.redOffset).toBe(0); + expect(result.greenOffset).toBe(0); + expect(result.blueOffset).toBe(0); + expect(result.alphaOffset).toBe(0); + }); + + it("execute test case2 - custom ColorTransform", () => + { + const displayObject = new DisplayObject(); + displayObject.$colorTransform = new ColorTransform(0.5, 0.6, 0.7, 0.8, 10, 20, 30, 40); + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(ColorTransform); + expect(result.redMultiplier).toBeCloseTo(0.5, 1); + expect(result.greenMultiplier).toBeCloseTo(0.6, 1); + expect(result.blueMultiplier).toBeCloseTo(0.7, 1); + expect(result.alphaMultiplier).toBeCloseTo(0.8, 1); + }); + + it("execute test case3 - ColorTransform from placeObject", () => + { + const displayObject = new DisplayObject(); + displayObject.placeObject = { + colorTransform: [0.9, 0.8, 0.7, 0.6, 5, 10, 15, 20], + typedColorTransform: new Float32Array([0.9, 0.8, 0.7, 0.6, 5, 10, 15, 20]) + }; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(ColorTransform); + expect(result.alphaMultiplier).toBeCloseTo(0.6, 1); + }); + + it("execute test case4 - alpha only", () => + { + const displayObject = new DisplayObject(); + displayObject.$colorTransform = new ColorTransform(1, 1, 1, 0.5, 0, 0, 0, 0); + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(ColorTransform); + expect(result.alphaMultiplier).toBeCloseTo(0.5, 1); + }); + + it("execute test case5 - identity ColorTransform", () => + { + const displayObject = new DisplayObject(); + displayObject.$colorTransform = null; + displayObject.$alpha = 1; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(ColorTransform); + expect(result.redMultiplier).toBe(1); + expect(result.alphaMultiplier).toBe(1); + }); +}); diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetMatrixUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetMatrixUseCase.test.ts new file mode 100644 index 00000000..6e45aeb9 --- /dev/null +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetMatrixUseCase.test.ts @@ -0,0 +1,100 @@ +import { execute } from "./DisplayObjectGetMatrixUseCase"; +import { DisplayObject } from "../../DisplayObject"; +import { Matrix } from "@next2d/geom"; +import { describe, expect, it } from "vitest"; + +describe("DisplayObjectGetMatrixUseCase.js test", () => +{ + it("execute test case1 - default Matrix", () => + { + const displayObject = new DisplayObject(); + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Matrix); + expect(result.a).toBe(1); + expect(result.b).toBe(0); + expect(result.c).toBe(0); + expect(result.d).toBe(1); + expect(result.tx).toBe(0); + expect(result.ty).toBe(0); + }); + + it("execute test case2 - custom Matrix", () => + { + const displayObject = new DisplayObject(); + displayObject.$matrix = new Matrix(2, 0, 0, 2, 100, 50); + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Matrix); + expect(result.a).toBe(2); + expect(result.d).toBe(2); + expect(result.tx).toBe(100); + expect(result.ty).toBe(50); + }); + + it("execute test case3 - Matrix from placeObject", () => + { + const displayObject = new DisplayObject(); + displayObject.placeObject = { + matrix: [1.5, 0, 0, 1.5, 200, 100], + typedMatrix: new Float32Array([1.5, 0, 0, 1.5, 200, 100]) + }; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Matrix); + expect(result.a).toBe(1.5); + expect(result.d).toBe(1.5); + expect(result.tx).toBe(200); + expect(result.ty).toBe(100); + }); + + it("execute test case4 - rotated Matrix", () => + { + const displayObject = new DisplayObject(); + displayObject.$rotation = Math.PI / 4; // 45 degrees + displayObject.$matrix = new Matrix( + Math.cos(Math.PI / 4), + Math.sin(Math.PI / 4), + -Math.sin(Math.PI / 4), + Math.cos(Math.PI / 4), + 0, + 0 + ); + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Matrix); + expect(result.a).toBeCloseTo(Math.cos(Math.PI / 4), 5); + expect(result.b).toBeCloseTo(Math.sin(Math.PI / 4), 5); + }); + + it("execute test case5 - transformed Matrix", () => + { + const displayObject = new DisplayObject(); + displayObject.$matrix = new Matrix(1, 0, 0, 1, 50, 75); + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Matrix); + expect(result.tx).toBe(50); + expect(result.ty).toBe(75); + }); + + it("execute test case6 - null Matrix returns identity", () => + { + const displayObject = new DisplayObject(); + displayObject.$matrix = null; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Matrix); + expect(result.a).toBe(1); + expect(result.b).toBe(0); + expect(result.c).toBe(0); + expect(result.d).toBe(1); + expect(result.tx).toBe(0); + expect(result.ty).toBe(0); + }); +}); diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetRawBoundsUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetRawBoundsUseCase.test.ts new file mode 100644 index 00000000..f14f436e --- /dev/null +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetRawBoundsUseCase.test.ts @@ -0,0 +1,90 @@ +import { execute } from "./DisplayObjectGetRawBoundsUseCase"; +import { DisplayObject } from "../../DisplayObject"; +import { describe, expect, it, vi } from "vitest"; + +vi.mock("../../DisplayObjectContainer/usecase/DisplayObjectContainerRawBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 400, 300])) +})); + +vi.mock("../../Shape/service/ShapeGetRawBoundsService", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 100, 100])) +})); + +vi.mock("../../TextField/service/TextFieldGetRawBoundsService", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 300, 50])) +})); + +vi.mock("../../Video/service/VideoGetRawBoundsService", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 200, 150])) +})); + +describe("DisplayObjectGetRawBoundsUseCase.js test", () => +{ + it("execute test case1 - default DisplayObject", () => + { + const displayObject = new DisplayObject(); + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(0); + expect(result[3]).toBe(0); + }); + + it("execute test case2 - container DisplayObject", () => + { + const displayObject = new DisplayObject(); + displayObject.isContainerEnabled = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(400); + expect(result[3]).toBe(300); + }); + + it("execute test case3 - shape DisplayObject", () => + { + const displayObject = new DisplayObject(); + displayObject.isShape = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(100); + expect(result[3]).toBe(100); + }); + + it("execute test case4 - text DisplayObject", () => + { + const displayObject = new DisplayObject(); + displayObject.isText = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(300); + expect(result[3]).toBe(50); + }); + + it("execute test case5 - video DisplayObject", () => + { + const displayObject = new DisplayObject(); + displayObject.isVideo = true; + + const result = execute(displayObject); + + expect(result).toBeInstanceOf(Float32Array); + expect(result[0]).toBe(0); + expect(result[1]).toBe(0); + expect(result[2]).toBe(200); + expect(result[3]).toBe(150); + }); +}); diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectIsMaskReflectedInDisplayUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectIsMaskReflectedInDisplayUseCase.test.ts new file mode 100644 index 00000000..7a417f31 --- /dev/null +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectIsMaskReflectedInDisplayUseCase.test.ts @@ -0,0 +1,143 @@ +import { execute } from "./DisplayObjectIsMaskReflectedInDisplayUseCase"; +import { DisplayObject } from "../../DisplayObject"; +import { describe, expect, it, vi } from "vitest"; + +vi.mock("../../Shape/usecase/ShapeCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([10, 10, 110, 110])) +})); + +vi.mock("../../Video/usecase/VideoCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([20, 20, 220, 170])) +})); + +vi.mock("../../TextField/usecase/TextFieldCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([5, 5, 305, 55])) +})); + +vi.mock("../../DisplayObjectContainer/usecase/DisplayObjectContainerCalcBoundsMatrixUseCase", () => ({ + execute: vi.fn(() => new Float32Array([0, 0, 400, 300])) +})); + +describe("DisplayObjectIsMaskReflectedInDisplayUseCase.js test", () => +{ + it("execute test case1 - default DisplayObject returns null", () => + { + const displayObject = new DisplayObject(); + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBe(null); + }); + + it("execute test case2 - shape DisplayObject within renderer bounds", () => + { + const displayObject = new DisplayObject(); + displayObject.isShape = true; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBeInstanceOf(Float32Array); + expect(result).not.toBe(null); + expect(result![0]).toBe(10); + expect(result![1]).toBe(10); + expect(result![2]).toBe(110); + expect(result![3]).toBe(110); + }); + + it("execute test case3 - DisplayObject with zero width returns null", async () => + { + const displayObject = new DisplayObject(); + displayObject.isShape = true; + + // Mock to return bounds with zero width + const { execute: shapeCalcBoundsMatrixUseCase } = await import("../../Shape/usecase/ShapeCalcBoundsMatrixUseCase"); + vi.mocked(shapeCalcBoundsMatrixUseCase).mockReturnValueOnce(new Float32Array([10, 10, 10, 110])); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBe(null); + }); + + it("execute test case4 - DisplayObject with zero height returns null", async () => + { + const displayObject = new DisplayObject(); + displayObject.isShape = true; + + // Mock to return bounds with zero height + const { execute: shapeCalcBoundsMatrixUseCase } = await import("../../Shape/usecase/ShapeCalcBoundsMatrixUseCase"); + vi.mocked(shapeCalcBoundsMatrixUseCase).mockReturnValueOnce(new Float32Array([10, 10, 110, 10])); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBe(null); + }); + + it("execute test case5 - DisplayObject outside renderer bounds returns null", async () => + { + const displayObject = new DisplayObject(); + displayObject.isShape = true; + + // Mock to return bounds outside renderer area + const { execute: shapeCalcBoundsMatrixUseCase } = await import("../../Shape/usecase/ShapeCalcBoundsMatrixUseCase"); + vi.mocked(shapeCalcBoundsMatrixUseCase).mockReturnValueOnce(new Float32Array([900, 10, 1000, 110])); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBe(null); + }); + + it("execute test case6 - text DisplayObject within bounds", () => + { + const displayObject = new DisplayObject(); + displayObject.isText = true; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBeInstanceOf(Float32Array); + expect(result).not.toBe(null); + }); + + it("execute test case7 - video DisplayObject within bounds", () => + { + const displayObject = new DisplayObject(); + displayObject.isVideo = true; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBeInstanceOf(Float32Array); + expect(result).not.toBe(null); + }); + + it("execute test case8 - container DisplayObject within bounds", () => + { + const displayObject = new DisplayObject(); + displayObject.isContainerEnabled = true; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBeInstanceOf(Float32Array); + expect(result).not.toBe(null); + }); + + it("execute test case9 - bounds with negative position outside renderer", async () => + { + const displayObject = new DisplayObject(); + displayObject.isShape = true; + + // Mock to return bounds with negative position outside renderer + const { execute: shapeCalcBoundsMatrixUseCase } = await import("../../Shape/usecase/ShapeCalcBoundsMatrixUseCase"); + vi.mocked(shapeCalcBoundsMatrixUseCase).mockReturnValueOnce(new Float32Array([-110, -110, -10, -10])); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const result = execute(displayObject, matrix, 800, 600); + + expect(result).toBe(null); + }); +}); From 6c0b091d80bf49931584e91ad2bce791333db4bc Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 22:16:25 +0900 Subject: [PATCH 14/45] =?UTF-8?q?#213=20ImageBitmap=E3=81=AE=E7=94=9F?= =?UTF-8?q?=E6=88=90=E3=82=92ImageData=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ContextCreateImageBitmapService.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts index 28bfb4d1..c87f5ed3 100644 --- a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts +++ b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts @@ -64,9 +64,8 @@ export const execute = async (width: number, height: number): Promise((resolve): void => { const wait = (): void => @@ -86,10 +85,6 @@ export const execute = async (width: number, height: number): Promise Date: Fri, 17 Oct 2025 23:12:02 +0900 Subject: [PATCH 15/45] =?UTF-8?q?#213=20=E3=83=81=E3=83=A3=E3=83=97?= =?UTF-8?q?=E3=83=81=E3=83=A3=E3=83=BC=E6=8F=8F=E7=94=BB=E3=81=AE=E8=83=8C?= =?UTF-8?q?=E6=99=AF=E8=89=B2=E3=81=A8=E9=80=8F=E6=98=8E=E5=BA=A6=E3=81=AE?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=82=AA=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Next2D/usecase/CaptureToCanvasUseCase.ts | 10 ++++++---- .../PlayerTransferCanvasPostMessageService.ts | 19 ++++++++++++++----- .../core/src/interface/ICaptureMessage.ts | 2 ++ .../core/src/interface/ICaptureOptions.ts | 2 ++ .../Command/usecase/CommandCaptureUseCase.ts | 10 ++++++++++ packages/renderer/src/CommandController.ts | 2 ++ packages/renderer/src/interface/IMessage.ts | 2 ++ 7 files changed, 38 insertions(+), 9 deletions(-) diff --git a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts index 14dbf77e..6645a209 100644 --- a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts +++ b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts @@ -81,9 +81,9 @@ export const execute = async ( // resize let isResize = false; - const cacheWidth = $player.rendererWidth; - const cacheHeight = $player.rendererHeight; - const cacheScale = $player.rendererScale; + const cacheWidth = $player.rendererWidth; + const cacheHeight = $player.rendererHeight; + const cacheScale = $player.rendererScale; if (width > cacheWidth || height > cacheHeight) { isResize = true; @@ -104,7 +104,9 @@ export const execute = async ( // draw await playerTransferCanvasPostMessageService( - display_object, tMatrix, tColorTransform, transferredCanvas + display_object, tMatrix, tColorTransform, transferredCanvas, + opstions && opstions.bgColor ? parseInt(opstions.bgColor.replace("#", ""), 16) : 0xffffff, + opstions && opstions.bgAlpha ? opstions.bgAlpha : 0 ); // restore diff --git a/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts b/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts index 42bf945d..ff44cdaa 100644 --- a/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts +++ b/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts @@ -15,6 +15,8 @@ import { $rendererWorker } from "../../RendererWorker"; const $message: ICaptureMessage = { "command": "capture", "buffer": null, + "bgColor": 0xffffff, + "bgAlpha": 0, "width": 0, "height": 0, "length": 0, @@ -43,6 +45,9 @@ const $imageBitmaps: ImageBitmap[] = []; * @param {D} display_object * @param {Float32Array} matrix * @param {Float32Array} color_transform + * @param {HTMLCanvasElement} transferred_canvas + * @param {number} [bg_color=0xffffff] + * @param {number} [bg_alpha=0] * @return {Promise} * @method * @protected @@ -51,7 +56,9 @@ export const execute = async ( display_object: D, matrix: Float32Array, color_transform: Float32Array, - transferred_canvas: HTMLCanvasElement + transferred_canvas: HTMLCanvasElement, + bg_color: number = 0xffffff, + bg_alpha: number = 0 ): Promise => { return await new Promise((resolve): void => @@ -69,10 +76,12 @@ export const execute = async ( } // update buffer - $message.buffer = renderQueue.buffer; - $message.width = transferred_canvas.width; - $message.height = transferred_canvas.height; - $message.length = renderQueue.offset; + $message.buffer = renderQueue.buffer; + $message.width = transferred_canvas.width; + $message.height = transferred_canvas.height; + $message.bgColor = bg_color; + $message.bgAlpha = bg_alpha; + $message.length = renderQueue.offset; $options.push(renderQueue.buffer.buffer); // postMessage diff --git a/packages/core/src/interface/ICaptureMessage.ts b/packages/core/src/interface/ICaptureMessage.ts index cfd1cb3d..386895da 100644 --- a/packages/core/src/interface/ICaptureMessage.ts +++ b/packages/core/src/interface/ICaptureMessage.ts @@ -4,5 +4,7 @@ export interface ICaptureMessage { width: number; height: number; length: number; + bgColor: number; + bgAlpha: number; imageBitmaps: ImageBitmap[] | null; } \ No newline at end of file diff --git a/packages/core/src/interface/ICaptureOptions.ts b/packages/core/src/interface/ICaptureOptions.ts index 71f10359..b1624505 100644 --- a/packages/core/src/interface/ICaptureOptions.ts +++ b/packages/core/src/interface/ICaptureOptions.ts @@ -8,4 +8,6 @@ export interface ICaptureOptions { colorTransform?: ColorTransform; canvas?: HTMLCanvasElement; videoSync?: boolean; + bgColor?: string | null; + bgAlpha?: number | null; } \ No newline at end of file diff --git a/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts b/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts index af5b3cb9..724ef344 100644 --- a/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts +++ b/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts @@ -11,6 +11,8 @@ import { $context } from "../../RendererUtil"; * @param {Float32Array} render_queue * @param {number} width * @param {number} height + * @param {number} [bg_color=0xffffff] + * @param {number} [bg_alpha=0] * @param {ImageBitmap[]} [image_bitmaps=null] * @return {Promise} * @method @@ -20,6 +22,8 @@ export const execute = async ( render_queue: Float32Array, width: number, height: number, + bg_color: number = 0xffffff, + bg_alpha: number = 0, image_bitmaps: ImageBitmap[] | null ): Promise => { @@ -31,6 +35,12 @@ export const execute = async ( // reset $context.reset(); $context.setTransform(1, 0, 0, 1, 0, 0); + $context.updateBackgroundColor( + bg_color >> 16 & 0xff / 255, + bg_color >> 8 & 0xff / 255, + bg_color & 0xff / 255, + bg_alpha + ); $context.fillBackgroundColor(); while (render_queue.length > index) { diff --git a/packages/renderer/src/CommandController.ts b/packages/renderer/src/CommandController.ts index 831a2592..1734caf2 100644 --- a/packages/renderer/src/CommandController.ts +++ b/packages/renderer/src/CommandController.ts @@ -104,6 +104,8 @@ export class CommandController object.buffer.subarray(0, object.length), object.width as number, object.height as number, + object.bgColor as number, + object.bgAlpha as number, object.imageBitmaps as ImageBitmap[] | null ); diff --git a/packages/renderer/src/interface/IMessage.ts b/packages/renderer/src/interface/IMessage.ts index 64bbc531..bd19351e 100644 --- a/packages/renderer/src/interface/IMessage.ts +++ b/packages/renderer/src/interface/IMessage.ts @@ -8,4 +8,6 @@ export interface IMessage { canvas?: OffscreenCanvas; devicePixelRatio?: number; id?: string; + bgColor: number; + bgAlpha: number; } \ No newline at end of file From 9cd47aa96bca39525e2866b9013f76d56fc4ac5b Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 17 Oct 2025 23:21:21 +0900 Subject: [PATCH 16/45] =?UTF-8?q?#213=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SoundBuildFromCharacterUseCase.test.ts | 121 +++++++++++ .../Sound/usecase/SoundLoadUseCase.test.ts | 203 ++++++++++++++++++ 2 files changed, 324 insertions(+) create mode 100644 packages/media/src/Sound/usecase/SoundBuildFromCharacterUseCase.test.ts create mode 100644 packages/media/src/Sound/usecase/SoundLoadUseCase.test.ts diff --git a/packages/media/src/Sound/usecase/SoundBuildFromCharacterUseCase.test.ts b/packages/media/src/Sound/usecase/SoundBuildFromCharacterUseCase.test.ts new file mode 100644 index 00000000..8c6a408b --- /dev/null +++ b/packages/media/src/Sound/usecase/SoundBuildFromCharacterUseCase.test.ts @@ -0,0 +1,121 @@ +import { Sound } from "../../Sound"; +import { execute } from "./SoundBuildFromCharacterUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../service/SoundDecodeService", () => ({ + execute: vi.fn(async () => { + // Mock AudioBuffer + return { + duration: 10, + length: 44100, + numberOfChannels: 2, + sampleRate: 44100, + getChannelData: vi.fn() + } as unknown as AudioBuffer; + }) +})); + +describe("SoundBuildFromCharacterUseCase.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("execute test case1 - build sound with existing audioBuffer", async () => + { + const sound = new Sound(); + const mockAudioBuffer = { + duration: 5, + length: 22050, + numberOfChannels: 1, + sampleRate: 44100, + getChannelData: vi.fn() + } as unknown as AudioBuffer; + + const character = { + buffer: [1, 2, 3, 4], + audioBuffer: mockAudioBuffer + }; + + await execute(sound, character); + + expect(sound.audioBuffer).toBe(mockAudioBuffer); + }); + + it("execute test case2 - build sound without audioBuffer", async () => + { + const sound = new Sound(); + const character = { + buffer: [1, 2, 3, 4, 5, 6, 7, 8] + }; + + await execute(sound, character); + + expect(sound.audioBuffer).toBeDefined(); + expect(character.audioBuffer).toBeDefined(); + }); + + it("execute test case3 - decode service is called for new buffer", async () => + { + const { execute: soundDecodeService } = await import("../service/SoundDecodeService"); + + const sound = new Sound(); + const character = { + buffer: [10, 20, 30, 40] + }; + + await execute(sound, character); + + expect(soundDecodeService).toHaveBeenCalled(); + }); + + it("execute test case4 - decode service returns null", async () => + { + const { execute: soundDecodeService } = await import("../service/SoundDecodeService"); + vi.mocked(soundDecodeService).mockResolvedValueOnce(null); + + const sound = new Sound(); + const character = { + buffer: [10, 20, 30] + }; + + await execute(sound, character); + + // When decode returns null, audioBuffer should remain null (not set) + expect(sound.audioBuffer).toBeNull(); + }); + + it("execute test case5 - buffer is converted to Uint8Array", async () => + { + const { execute: soundDecodeService } = await import("../service/SoundDecodeService"); + + const sound = new Sound(); + const character = { + buffer: [100, 200, 50, 150] + }; + + await execute(sound, character); + + expect(soundDecodeService).toHaveBeenCalled(); + const callArg = vi.mocked(soundDecodeService).mock.calls[0][0]; + expect(callArg).toBeInstanceOf(ArrayBuffer); + }); + + it("execute test case6 - audioBuffer is cached in character", async () => + { + const sound = new Sound(); + const character = { + buffer: [1, 2, 3, 4] + }; + + await execute(sound, character); + + expect(character.audioBuffer).toBeDefined(); + + // Second call should use cached audioBuffer + const sound2 = new Sound(); + await execute(sound2, character); + + expect(sound2.audioBuffer).toBe(character.audioBuffer); + }); +}); diff --git a/packages/media/src/Sound/usecase/SoundLoadUseCase.test.ts b/packages/media/src/Sound/usecase/SoundLoadUseCase.test.ts new file mode 100644 index 00000000..fdd61d19 --- /dev/null +++ b/packages/media/src/Sound/usecase/SoundLoadUseCase.test.ts @@ -0,0 +1,203 @@ +import { Sound } from "../../Sound"; +import { URLRequest } from "@next2d/net"; +import { execute } from "./SoundLoadUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../../MediaUtil", () => ({ + $ajax: vi.fn() +})); + +vi.mock("../service/SoundLoadStartEventService", () => ({ + execute: vi.fn() +})); + +vi.mock("../service/SoundProgressEventService", () => ({ + execute: vi.fn() +})); + +vi.mock("../usecase/SoundLoadEndEventUseCase", () => ({ + execute: vi.fn(async () => {}) +})); + +describe("SoundLoadUseCase.js test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("execute test case1 - basic sound load", async () => + { + const { $ajax } = await import("../../MediaUtil"); + + const sound = new Sound(); + const request = new URLRequest("https://example.com/sound.mp3"); + + vi.mocked($ajax).mockImplementation((options: any) => { + // Simulate successful load + if (options.event.loadend) { + const mockEvent = { + target: { + status: 200, + response: new ArrayBuffer(100) + }, + loaded: 100, + total: 100 + } as unknown as ProgressEvent; + + setTimeout(() => options.event.loadend(mockEvent), 0); + } + }); + + await execute(sound, request); + + expect($ajax).toHaveBeenCalled(); + }); + + it("execute test case2 - verify ajax options", async () => + { + const { $ajax } = await import("../../MediaUtil"); + + const sound = new Sound(); + const request = new URLRequest("https://example.com/audio.wav"); + request.method = "GET"; + request.data = { test: "data" }; + + vi.mocked($ajax).mockImplementation((options: any) => { + if (options.event.loadend) { + const mockEvent = { + target: { status: 200, response: new ArrayBuffer(50) }, + loaded: 50, + total: 50 + } as unknown as ProgressEvent; + setTimeout(() => options.event.loadend(mockEvent), 0); + } + }); + + await execute(sound, request); + + expect($ajax).toHaveBeenCalledWith( + expect.objectContaining({ + format: "arraybuffer", + url: "https://example.com/audio.wav", + method: "GET", + data: { test: "data" } + }) + ); + }); + + it("execute test case3 - loadstart event is triggered", async () => + { + const { $ajax } = await import("../../MediaUtil"); + const { execute: soundLoadStartEventService } = await import("../service/SoundLoadStartEventService"); + + const sound = new Sound(); + const request = new URLRequest("https://example.com/sound.mp3"); + + vi.mocked($ajax).mockImplementation((options: any) => { + if (options.event.loadstart) { + const mockEvent = { + loaded: 0, + total: 100 + } as unknown as ProgressEvent; + options.event.loadstart(mockEvent); + } + if (options.event.loadend) { + const mockEvent = { + target: { status: 200, response: new ArrayBuffer(100) }, + loaded: 100, + total: 100 + } as unknown as ProgressEvent; + setTimeout(() => options.event.loadend(mockEvent), 0); + } + }); + + await execute(sound, request); + + expect(soundLoadStartEventService).toHaveBeenCalled(); + }); + + it("execute test case4 - progress event is triggered", async () => + { + const { $ajax } = await import("../../MediaUtil"); + const { execute: soundProgressEventService } = await import("../service/SoundProgressEventService"); + + const sound = new Sound(); + const request = new URLRequest("https://example.com/sound.mp3"); + + vi.mocked($ajax).mockImplementation((options: any) => { + if (options.event.progress) { + const mockEvent = { + loaded: 50, + total: 100 + } as unknown as ProgressEvent; + options.event.progress(mockEvent); + } + if (options.event.loadend) { + const mockEvent = { + target: { status: 200, response: new ArrayBuffer(100) }, + loaded: 100, + total: 100 + } as unknown as ProgressEvent; + setTimeout(() => options.event.loadend(mockEvent), 0); + } + }); + + await execute(sound, request); + + expect(soundProgressEventService).toHaveBeenCalled(); + }); + + it("execute test case5 - loadend event is triggered", async () => + { + const { $ajax } = await import("../../MediaUtil"); + const { execute: soundLoadEndEventUseCase } = await import("../usecase/SoundLoadEndEventUseCase"); + + const sound = new Sound(); + const request = new URLRequest("https://example.com/sound.mp3"); + + vi.mocked($ajax).mockImplementation((options: any) => { + if (options.event.loadend) { + const mockEvent = { + target: { status: 200, response: new ArrayBuffer(100) }, + loaded: 100, + total: 100 + } as unknown as ProgressEvent; + setTimeout(() => options.event.loadend(mockEvent), 0); + } + }); + + await execute(sound, request); + + expect(soundLoadEndEventUseCase).toHaveBeenCalled(); + }); + + it("execute test case6 - with POST method", async () => + { + const { $ajax } = await import("../../MediaUtil"); + + const sound = new Sound(); + const request = new URLRequest("https://example.com/sound.mp3"); + request.method = "POST"; + request.data = { userId: 123 }; + + vi.mocked($ajax).mockImplementation((options: any) => { + if (options.event.loadend) { + const mockEvent = { + target: { status: 200, response: new ArrayBuffer(100) }, + loaded: 100, + total: 100 + } as unknown as ProgressEvent; + setTimeout(() => options.event.loadend(mockEvent), 0); + } + }); + + await execute(sound, request); + + expect($ajax).toHaveBeenCalledWith( + expect.objectContaining({ + method: "POST", + data: { userId: 123 } + }) + ); + }); +}); From 9d153c59452811905d7f1a898bcd5c4d3646088b Mon Sep 17 00:00:00 2001 From: ienaga Date: Mon, 20 Oct 2025 07:17:32 +0900 Subject: [PATCH 17/45] =?UTF-8?q?#213=20=E6=8C=87=E5=AE=9A=E6=8F=8F?= =?UTF-8?q?=E7=94=BB=E3=81=AE=E9=96=A2=E6=95=B0=E3=81=AE=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E3=81=A8=E9=80=8F=E6=98=8E=E5=BA=A6=E3=81=AE=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts | 2 +- .../Player/service/PlayerTransferCanvasPostMessageService.ts | 4 ++-- .../renderer/src/Command/usecase/CommandCaptureUseCase.ts | 2 +- packages/webgl/src/Context.ts | 2 +- .../src/Context/service/ContextCreateImageBitmapService.ts | 1 - 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts index 6645a209..828fd661 100644 --- a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts +++ b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.ts @@ -105,7 +105,7 @@ export const execute = async ( // draw await playerTransferCanvasPostMessageService( display_object, tMatrix, tColorTransform, transferredCanvas, - opstions && opstions.bgColor ? parseInt(opstions.bgColor.replace("#", ""), 16) : 0xffffff, + opstions && opstions.bgColor ? parseInt(opstions.bgColor.replace("#", ""), 16) : 0x000000, opstions && opstions.bgAlpha ? opstions.bgAlpha : 0 ); diff --git a/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts b/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts index ff44cdaa..ea0d4fe9 100644 --- a/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts +++ b/packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.ts @@ -46,7 +46,7 @@ const $imageBitmaps: ImageBitmap[] = []; * @param {Float32Array} matrix * @param {Float32Array} color_transform * @param {HTMLCanvasElement} transferred_canvas - * @param {number} [bg_color=0xffffff] + * @param {number} [bg_color=0x000000] * @param {number} [bg_alpha=0] * @return {Promise} * @method @@ -57,7 +57,7 @@ export const execute = async ( matrix: Float32Array, color_transform: Float32Array, transferred_canvas: HTMLCanvasElement, - bg_color: number = 0xffffff, + bg_color: number = 0x000000, bg_alpha: number = 0 ): Promise => { diff --git a/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts b/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts index 724ef344..1998fbd2 100644 --- a/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts +++ b/packages/renderer/src/Command/usecase/CommandCaptureUseCase.ts @@ -22,7 +22,7 @@ export const execute = async ( render_queue: Float32Array, width: number, height: number, - bg_color: number = 0xffffff, + bg_color: number = 0x000000, bg_alpha: number = 0, image_bitmaps: ImageBitmap[] | null ): Promise => { diff --git a/packages/webgl/src/Context.ts b/packages/webgl/src/Context.ts index 81a2b1d7..c0817e43 100644 --- a/packages/webgl/src/Context.ts +++ b/packages/webgl/src/Context.ts @@ -303,7 +303,7 @@ export class Context }; // WebTextureの設定 - gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); + gl.pixelStorei(gl.UNPACK_ALIGNMENT, true); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); // FrameBufferManagerの初期起動 diff --git a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts index c87f5ed3..de26a90d 100644 --- a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts +++ b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.ts @@ -87,7 +87,6 @@ export const execute = async (width: number, height: number): Promise Date: Mon, 20 Oct 2025 15:57:27 +0900 Subject: [PATCH 18/45] #213 update packages --- package-lock.json | 283 +++++++++++++++++++++++----------------------- package.json | 14 +-- 2 files changed, 148 insertions(+), 149 deletions(-) diff --git a/package-lock.json b/package-lock.json index a77dfe38..dfc27130 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,23 +17,23 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.38.0", "@rollup/plugin-commonjs": "^28.0.8", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.8.0", + "@types/node": "^24.8.1", "@typescript-eslint/eslint-plugin": "^8.46.1", "@typescript-eslint/parser": "^8.46.1", "@vitest/web-worker": "^3.2.4", - "eslint": "^9.37.0", - "eslint-plugin-unused-imports": "^4.2.0", + "eslint": "^9.38.0", + "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", - "jsdom": "^27.0.0", - "rollup": "^4.52.4", + "jsdom": "^27.0.1", + "rollup": "^4.52.5", "tslib": "^2.8.1", "typescript": "^5.9.3", - "vite": "^7.1.10", + "vite": "^7.1.11", "vitest": "^3.2.4", "vitest-webgl-canvas-mock": "^1.1.0" }, @@ -73,9 +73,9 @@ } }, "node_modules/@asamuzakjp/dom-selector": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.5.7.tgz", - "integrity": "sha512-cvdTPsi2qC1c22UppvuVmx/PDwuc6+QQkwt9OnwQD6Uotbh//tb2XDF0OoK2V0F4b8d02LIwNp3BieaDMAhIhA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.2.tgz", + "integrity": "sha512-ccKogJI+0aiDhOahdjANIc9SDixSud1gbwdVrhn7kMopAtLXqsz9MKmQQtIl6Y5aC2IYq+j4dz/oedL2AVMmVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -705,13 +705,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -720,9 +720,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", + "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -783,9 +783,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", "dev": true, "license": "MIT", "engines": { @@ -796,9 +796,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1141,9 +1141,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", "cpu": [ "arm" ], @@ -1155,9 +1155,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", "cpu": [ "arm64" ], @@ -1169,9 +1169,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", "cpu": [ "arm64" ], @@ -1183,9 +1183,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", "cpu": [ "x64" ], @@ -1197,9 +1197,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", "cpu": [ "arm64" ], @@ -1211,9 +1211,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", "cpu": [ "x64" ], @@ -1225,9 +1225,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", "cpu": [ "arm" ], @@ -1239,9 +1239,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", "cpu": [ "arm" ], @@ -1253,9 +1253,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", "cpu": [ "arm64" ], @@ -1267,9 +1267,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", "cpu": [ "arm64" ], @@ -1281,9 +1281,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", "cpu": [ "loong64" ], @@ -1295,9 +1295,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", "cpu": [ "ppc64" ], @@ -1309,9 +1309,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", "cpu": [ "riscv64" ], @@ -1323,9 +1323,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", "cpu": [ "riscv64" ], @@ -1337,9 +1337,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", "cpu": [ "s390x" ], @@ -1351,9 +1351,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", "cpu": [ "x64" ], @@ -1365,9 +1365,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", "cpu": [ "x64" ], @@ -1379,9 +1379,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", "cpu": [ "arm64" ], @@ -1393,9 +1393,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", "cpu": [ "arm64" ], @@ -1407,9 +1407,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", "cpu": [ "ia32" ], @@ -1421,9 +1421,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", "cpu": [ "x64" ], @@ -1435,9 +1435,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", "cpu": [ "x64" ], @@ -1480,9 +1480,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", - "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", + "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", "dev": true, "license": "MIT", "peer": true, @@ -2406,26 +2406,25 @@ } }, "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", + "@eslint/js": "9.38.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -2468,9 +2467,9 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", - "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.3.0.tgz", + "integrity": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3061,22 +3060,22 @@ } }, "node_modules/jsdom": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.0.tgz", - "integrity": "sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.1.tgz", + "integrity": "sha512-SNSQteBL1IlV2zqhwwolaG9CwhIhTvVHWg3kTss/cLE7H/X4644mtPQqYvCfsSrGQWt9hSZcgOXX8bOZaMN+kA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@asamuzakjp/dom-selector": "^6.5.4", - "cssstyle": "^5.3.0", + "@asamuzakjp/dom-selector": "^6.7.2", + "cssstyle": "^5.3.1", "data-urls": "^6.0.0", - "decimal.js": "^10.5.0", + "decimal.js": "^10.6.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "parse5": "^7.3.0", + "parse5": "^8.0.0", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", @@ -3085,8 +3084,8 @@ "webidl-conversions": "^8.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^15.0.0", - "ws": "^8.18.2", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", "xml-name-validator": "^5.0.0" }, "engines": { @@ -3366,9 +3365,9 @@ "dev": true }, "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", "dev": true, "license": "MIT", "dependencies": { @@ -3576,9 +3575,9 @@ } }, "node_modules/rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", "peer": true, @@ -3593,28 +3592,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" } }, @@ -4060,9 +4059,9 @@ } }, "node_modules/vite": { - "version": "7.1.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.10.tgz", - "integrity": "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==", + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", "dev": true, "license": "MIT", "peer": true, diff --git a/package.json b/package.json index 72d45385..5ef1c3ed 100644 --- a/package.json +++ b/package.json @@ -46,23 +46,23 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.38.0", "@rollup/plugin-commonjs": "^28.0.8", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.8.0", + "@types/node": "^24.8.1", "@typescript-eslint/eslint-plugin": "^8.46.1", "@typescript-eslint/parser": "^8.46.1", "@vitest/web-worker": "^3.2.4", - "eslint": "^9.37.0", - "eslint-plugin-unused-imports": "^4.2.0", + "eslint": "^9.38.0", + "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", - "jsdom": "^27.0.0", - "rollup": "^4.52.4", + "jsdom": "^27.0.1", + "rollup": "^4.52.5", "tslib": "^2.8.1", "typescript": "^5.9.3", - "vite": "^7.1.10", + "vite": "^7.1.11", "vitest": "^3.2.4", "vitest-webgl-canvas-mock": "^1.1.0" }, From 44faa7639093029e48de07a22cc08cae66a440cd Mon Sep 17 00:00:00 2001 From: ienaga Date: Tue, 21 Oct 2025 09:57:22 +0900 Subject: [PATCH 19/45] #213 update packages --- package-lock.json | 128 +++++++++++++++++++++++----------------------- package.json | 6 +-- 2 files changed, 67 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfc27130..009445fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,9 +22,9 @@ "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.8.1", - "@typescript-eslint/eslint-plugin": "^8.46.1", - "@typescript-eslint/parser": "^8.46.1", + "@types/node": "^24.9.1", + "@typescript-eslint/eslint-plugin": "^8.46.2", + "@typescript-eslint/parser": "^8.46.2", "@vitest/web-worker": "^3.2.4", "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", @@ -1480,14 +1480,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", - "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.14.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/resolve": { @@ -1498,17 +1498,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", - "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", + "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/type-utils": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1522,7 +1522,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.1", + "@typescript-eslint/parser": "^8.46.2", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1538,17 +1538,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", - "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", + "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4" }, "engines": { @@ -1564,14 +1564,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", - "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.1", - "@typescript-eslint/types": "^8.46.1", + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", "debug": "^4.3.4" }, "engines": { @@ -1586,14 +1586,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", - "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1" + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1604,9 +1604,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", - "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", "dev": true, "license": "MIT", "engines": { @@ -1621,15 +1621,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", - "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", + "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1646,9 +1646,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", - "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", "dev": true, "license": "MIT", "engines": { @@ -1660,16 +1660,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", - "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.1", - "@typescript-eslint/tsconfig-utils": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1715,16 +1715,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", - "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1" + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1739,13 +1739,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", - "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/types": "8.46.2", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4042,9 +4042,9 @@ } }, "node_modules/undici-types": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", - "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 5ef1c3ed..c8d96128 100644 --- a/package.json +++ b/package.json @@ -51,9 +51,9 @@ "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.8.1", - "@typescript-eslint/eslint-plugin": "^8.46.1", - "@typescript-eslint/parser": "^8.46.1", + "@types/node": "^24.9.1", + "@typescript-eslint/eslint-plugin": "^8.46.2", + "@typescript-eslint/parser": "^8.46.2", "@vitest/web-worker": "^3.2.4", "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", From 7680636d64e4634edc9f5d4d7cead6bfda5aeabf Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 26 Oct 2025 07:56:56 +0900 Subject: [PATCH 20/45] =?UTF-8?q?#213=20vitest4=E3=81=AE=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=82=92=E8=A7=A3=E6=B6=88(UnitTest)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 600 +++++++----------- package.json | 10 +- .../service/CacheStoreDestroyService.test.ts | 21 +- .../CanvasBootOffscreenCanvasService.test.ts | 9 +- .../src/Next2D/usecase/LoadUseCase.test.ts | 4 +- .../LoaderLoadStartEventService.test.ts | 22 +- .../LoaderProgressEventService.test.ts | 11 +- .../usecase/LoaderLoadEndEventUseCase.test.ts | 40 +- .../service/SoundEndedEventService.test.ts | 34 +- .../SoundLoadStartEventService.test.ts | 22 +- .../service/SoundProgressEventService.test.ts | 11 +- .../usecase/SoundLoadEndEventUseCase.test.ts | 40 +- .../service/SoundMixerStopAllService.test.ts | 18 +- .../SoundMixerUpdateVolumeService.test.ts | 34 +- .../service/VideoEndedEventService.test.ts | 34 +- .../VideoLoadedmetadataEventService.test.ts | 24 +- .../service/VideoProgressEventService.test.ts | 32 +- .../VideoCanplaythroughEventUseCase.test.ts | 28 +- .../usecase/VideoPlayEventUseCase.test.ts | 15 +- .../usecase/VideoRegisterEventUseCase.test.ts | 30 +- .../CommandInitializeContextService.test.ts | 107 ++-- .../Job/service/JobUpdateFrameService.test.ts | 20 +- test.setup.ts | 33 + vite.config.ts | 1 - 24 files changed, 515 insertions(+), 685 deletions(-) diff --git a/package-lock.json b/package-lock.json index 009445fd..8f706c33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,14 +18,14 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.38.0", - "@rollup/plugin-commonjs": "^28.0.8", + "@rollup/plugin-commonjs": "^28.0.9", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^12.1.4", + "@rollup/plugin-typescript": "^12.3.0", "@types/node": "^24.9.1", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", - "@vitest/web-worker": "^3.2.4", + "@vitest/web-worker": "^4.0.3", "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", @@ -33,8 +33,8 @@ "rollup": "^4.52.5", "tslib": "^2.8.1", "typescript": "^5.9.3", - "vite": "^7.1.11", - "vitest": "^3.2.4", + "vite": "^7.1.12", + "vitest": "^4.0.3", "vitest-webgl-canvas-mock": "^1.1.0" }, "funding": { @@ -73,9 +73,9 @@ } }, "node_modules/@asamuzakjp/dom-selector": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.2.tgz", - "integrity": "sha512-ccKogJI+0aiDhOahdjANIc9SDixSud1gbwdVrhn7kMopAtLXqsz9MKmQQtIl6Y5aC2IYq+j4dz/oedL2AVMmVQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.3.tgz", + "integrity": "sha512-kiGFeY+Hxf5KbPpjRLf+ffWbkos1aGo8MBfd91oxS3O57RgU3XhZrt/6UzoVF9VMpWbC3v87SRc9jxGrc9qHtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -234,9 +234,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", "cpu": [ "ppc64" ], @@ -251,9 +251,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", "cpu": [ "arm" ], @@ -268,9 +268,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", "cpu": [ "arm64" ], @@ -285,9 +285,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", "cpu": [ "x64" ], @@ -302,9 +302,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", "cpu": [ "arm64" ], @@ -319,9 +319,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", "cpu": [ "x64" ], @@ -336,9 +336,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", "cpu": [ "arm64" ], @@ -353,9 +353,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", "cpu": [ "x64" ], @@ -370,9 +370,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", "cpu": [ "arm" ], @@ -387,9 +387,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", "cpu": [ "arm64" ], @@ -404,9 +404,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", "cpu": [ "ia32" ], @@ -421,9 +421,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", "cpu": [ "loong64" ], @@ -438,9 +438,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", "cpu": [ "mips64el" ], @@ -455,9 +455,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", "cpu": [ "ppc64" ], @@ -472,9 +472,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", "cpu": [ "riscv64" ], @@ -489,9 +489,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", "cpu": [ "s390x" ], @@ -506,9 +506,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", "cpu": [ "x64" ], @@ -523,9 +523,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", "cpu": [ "arm64" ], @@ -540,9 +540,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", "cpu": [ "x64" ], @@ -557,9 +557,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", "cpu": [ "arm64" ], @@ -574,9 +574,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", "cpu": [ "x64" ], @@ -591,9 +591,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", "cpu": [ "arm64" ], @@ -608,9 +608,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", "cpu": [ "x64" ], @@ -625,9 +625,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", "cpu": [ "arm64" ], @@ -642,9 +642,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", "cpu": [ "ia32" ], @@ -659,9 +659,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", "cpu": [ "x64" ], @@ -676,9 +676,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", - "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -695,9 +695,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -911,9 +911,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1016,9 +1016,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.8", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.8.tgz", - "integrity": "sha512-o1Ug9PxYsF61R7/NXO/GgMZZproLd/WH2XA53Tp9ppf6bU1lMlTtC/gUM6zM3mesi2E0rypk+PNtVrELREyWEQ==", + "version": "28.0.9", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.9.tgz", + "integrity": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==", "dev": true, "license": "MIT", "dependencies": { @@ -1091,9 +1091,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz", - "integrity": "sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz", + "integrity": "sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==", "dev": true, "license": "MIT", "dependencies": { @@ -1118,9 +1118,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", - "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1448,14 +1448,22 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, "node_modules/@types/deep-eql": { @@ -1770,39 +1778,40 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.3.tgz", + "integrity": "sha512-v3eSDx/bF25pzar6aEJrrdTXJduEBU3uSGXHslIdGIpJVP8tQQHV6x1ZfzbFQ/bLIomLSbR/2ZCfnaEGkWkiVQ==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.0.3", + "@vitest/utils": "4.0.3", + "chai": "^6.0.1", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.3.tgz", + "integrity": "sha512-evZcRspIPbbiJEe748zI2BRu94ThCBE+RkjCpVF8yoVYuTV7hMe+4wLF/7K86r8GwJHSmAPnPbZhpXWWrg1qbA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", + "@vitest/spy": "4.0.3", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.19" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -1824,42 +1833,41 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.3.tgz", + "integrity": "sha512-N7gly/DRXzxa9w9sbDXwD9QNFYP2hw90LLLGDobPNwiWgyW95GMxsCt29/COIKKh3P7XJICR38PSDePenMBtsw==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.3.tgz", + "integrity": "sha512-1/aK6fPM0lYXWyGKwop2Gbvz1plyTps/HDbIIJXYtJtspHjpXIeB3If07eWpVH4HW7Rmd3Rl+IS/+zEAXrRtXA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "4.0.3", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.3.tgz", + "integrity": "sha512-amnYmvZ5MTjNCP1HZmdeczAPLRD6iOm9+2nMRUGxbe/6sQ0Ymur0NnR9LIrWS8JA3wKE71X25D6ya/3LN9YytA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", + "@vitest/pretty-format": "4.0.3", + "magic-string": "^0.30.19", "pathe": "^2.0.3" }, "funding": { @@ -1867,47 +1875,43 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.3.tgz", + "integrity": "sha512-82vVL8Cqz7rbXaNUl35V2G7xeNMAjBdNOVaHbrzznT9BmiCiPOzhf0FhU3eP41nP1bLDm/5wWKZqkG4nyU95DQ==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.3.tgz", + "integrity": "sha512-qV6KJkq8W3piW6MDIbGOmn1xhvcW4DuA07alqaQ+vdx7YA49J85pnwnxigZVQFQw3tWnQNRKWwhz5wbP6iv/GQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.0.3", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/web-worker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-3.2.4.tgz", - "integrity": "sha512-JXK3lMyZHDrJ/BrJmxSZxe3RYT9oy2juxN4kpdrQ8NL8iibz352lXbcrnqG4WuSoBDwhjgghgvmIpsTv9Be7eA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-4.0.3.tgz", + "integrity": "sha512-bWweWZfgSpePhVWhPCvyOKeqlU8d3kogOZKGEoE/CpdOnokgXTcr66SRX1EWFtrYWHicTLiL+xx30fiRvuJGtA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.1" + "debug": "^4.4.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "3.2.4" + "vitest": "4.0.3" } }, "node_modules/acorn": { @@ -2042,16 +2046,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2063,18 +2057,11 @@ } }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.0.tgz", + "integrity": "sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -2096,16 +2083,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2213,9 +2190,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2237,16 +2214,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2351,9 +2318,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2364,32 +2331,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" } }, "node_modules/escape-string-regexp": { @@ -3039,13 +3006,6 @@ "dev": true, "license": "ISC" }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3168,13 +3128,6 @@ "dev": true, "license": "MIT" }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "11.2.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", @@ -3186,9 +3139,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.18", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", - "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3411,16 +3364,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3533,13 +3476,13 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3788,9 +3731,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, @@ -3807,19 +3750,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3903,30 +3833,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -3934,22 +3844,22 @@ } }, "node_modules/tldts": { - "version": "7.0.16", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.16.tgz", - "integrity": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==", + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.17.tgz", + "integrity": "sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.16" + "tldts-core": "^7.0.17" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.0.16", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.16.tgz", - "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==", + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.17.tgz", + "integrity": "sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==", "dev": true, "license": "MIT" }, @@ -4059,9 +3969,9 @@ } }, "node_modules/vite": { - "version": "7.1.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", - "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", + "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", "peer": true, @@ -4134,66 +4044,40 @@ } } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.3.tgz", + "integrity": "sha512-IUSop8jgaT7w0g1yOM/35qVtKjr/8Va4PrjzH1OUb0YH4c3OXB2lCZDkMAB6glA8T5w8S164oJGsbcmAecr4sA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", + "@vitest/expect": "4.0.3", + "@vitest/mocker": "4.0.3", + "@vitest/pretty-format": "4.0.3", + "@vitest/runner": "4.0.3", + "@vitest/snapshot": "4.0.3", + "@vitest/spy": "4.0.3", + "@vitest/utils": "4.0.3", + "debug": "^4.4.3", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.19", "pathe": "^2.0.3", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -4201,9 +4085,11 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.3", + "@vitest/browser-preview": "4.0.3", + "@vitest/browser-webdriverio": "4.0.3", + "@vitest/ui": "4.0.3", "happy-dom": "*", "jsdom": "*" }, @@ -4217,7 +4103,13 @@ "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { "optional": true }, "@vitest/ui": { diff --git a/package.json b/package.json index c8d96128..d999619a 100644 --- a/package.json +++ b/package.json @@ -47,14 +47,14 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.38.0", - "@rollup/plugin-commonjs": "^28.0.8", + "@rollup/plugin-commonjs": "^28.0.9", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^12.1.4", + "@rollup/plugin-typescript": "^12.3.0", "@types/node": "^24.9.1", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", - "@vitest/web-worker": "^3.2.4", + "@vitest/web-worker": "^4.0.3", "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", @@ -62,8 +62,8 @@ "rollup": "^4.52.5", "tslib": "^2.8.1", "typescript": "^5.9.3", - "vite": "^7.1.11", - "vitest": "^3.2.4", + "vite": "^7.1.12", + "vitest": "^4.0.3", "vitest-webgl-canvas-mock": "^1.1.0" }, "peerDependencies": { diff --git a/packages/cache/src/CacheStore/service/CacheStoreDestroyService.test.ts b/packages/cache/src/CacheStore/service/CacheStoreDestroyService.test.ts index b103746e..1e43471b 100644 --- a/packages/cache/src/CacheStore/service/CacheStoreDestroyService.test.ts +++ b/packages/cache/src/CacheStore/service/CacheStoreDestroyService.test.ts @@ -15,18 +15,15 @@ describe("CacheStoreDestroyService.js test", () => it("test case2", () => { let state = ""; - const MockContext = vi.fn().mockImplementation(() => - { - return { - "canvas": { - "width": 100, - "height": 200 - }, - "clearRect": vi.fn(() => { state = "clear" }) - } as unknown as CanvasRenderingContext2D; - }); - - const pool = []; + const MockContext = vi.fn(function(this: any) { + this.canvas = { + "width": 100, + "height": 200 + }; + this.clearRect = vi.fn(() => { state = "clear" }); + }) as any; + + const pool: HTMLCanvasElement[] = []; const mockContext = new MockContext(); expect(pool.length).toBe(0); expect(state).toBe(""); diff --git a/packages/core/src/Canvas/service/CanvasBootOffscreenCanvasService.test.ts b/packages/core/src/Canvas/service/CanvasBootOffscreenCanvasService.test.ts index a26b0f95..d8873c16 100644 --- a/packages/core/src/Canvas/service/CanvasBootOffscreenCanvasService.test.ts +++ b/packages/core/src/Canvas/service/CanvasBootOffscreenCanvasService.test.ts @@ -6,12 +6,9 @@ describe("CanvasBootOffscreenCanvasService.js test", () => it("execute test case1", () => { let state = ""; - const MockCanvas = vi.fn().mockImplementation(() => - { - return { - "transferControlToOffscreen": vi.fn(() => { state = "ok" }) - } as unknown as HTMLCanvasElement; - }); + const MockCanvas = vi.fn(function(this: any) { + this.transferControlToOffscreen = vi.fn(() => { state = "ok" }); + }) as any; expect(state).toBe(""); execute(new MockCanvas()); diff --git a/packages/core/src/Next2D/usecase/LoadUseCase.test.ts b/packages/core/src/Next2D/usecase/LoadUseCase.test.ts index b5f58cae..6efdffc2 100644 --- a/packages/core/src/Next2D/usecase/LoadUseCase.test.ts +++ b/packages/core/src/Next2D/usecase/LoadUseCase.test.ts @@ -16,7 +16,9 @@ vi.mock("@next2d/display", () => { }; return { - Loader: vi.fn(() => mockLoader), + Loader: vi.fn(function() { + return mockLoader; + }), stage: { stageWidth: 240, stageHeight: 240, diff --git a/packages/display/src/Loader/service/LoaderLoadStartEventService.test.ts b/packages/display/src/Loader/service/LoaderLoadStartEventService.test.ts index 7da49040..b183c2f6 100644 --- a/packages/display/src/Loader/service/LoaderLoadStartEventService.test.ts +++ b/packages/display/src/Loader/service/LoaderLoadStartEventService.test.ts @@ -23,13 +23,10 @@ describe("SoundLoadStartEventService.js test", () => expect(openState).toBe(""); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.loaded = 1; + this.total = 10; + }) as any; execute(loader.contentLoaderInfo, new MockEvent()); @@ -57,13 +54,10 @@ describe("SoundLoadStartEventService.js test", () => expect(total).toBe(0); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.loaded = 1; + this.total = 10; + }) as any; execute(loader.contentLoaderInfo, new MockEvent()); diff --git a/packages/display/src/Loader/service/LoaderProgressEventService.test.ts b/packages/display/src/Loader/service/LoaderProgressEventService.test.ts index 679d2b2b..bfcea90a 100644 --- a/packages/display/src/Loader/service/LoaderProgressEventService.test.ts +++ b/packages/display/src/Loader/service/LoaderProgressEventService.test.ts @@ -26,13 +26,10 @@ describe("LoaderProgressEventService.js test", () => expect(total).toBe(0); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.loaded = 1; + this.total = 10; + }) as any; execute(loader.contentLoaderInfo, new MockEvent()); diff --git a/packages/display/src/Loader/usecase/LoaderLoadEndEventUseCase.test.ts b/packages/display/src/Loader/usecase/LoaderLoadEndEventUseCase.test.ts index eba3ff2c..897fc25f 100644 --- a/packages/display/src/Loader/usecase/LoaderLoadEndEventUseCase.test.ts +++ b/packages/display/src/Loader/usecase/LoaderLoadEndEventUseCase.test.ts @@ -55,18 +55,15 @@ describe("LoaderLoadEndEventUseCase.js test", () => }; // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "target": { - "status": 200, - "statusText": "OK", - "response": object - }, - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.target = { + "status": 200, + "statusText": "OK", + "response": object + }; + this.loaded = 1; + this.total = 10; + }) as any; await execute(loader, new MockEvent()); @@ -89,17 +86,14 @@ describe("LoaderLoadEndEventUseCase.js test", () => expect(openState).toBe(""); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "target": { - "status": 404, - "statusText": "Not Found" - }, - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.target = { + "status": 404, + "statusText": "Not Found" + }; + this.loaded = 1; + this.total = 10; + }) as any; execute(loader, new MockEvent()); diff --git a/packages/media/src/Sound/service/SoundEndedEventService.test.ts b/packages/media/src/Sound/service/SoundEndedEventService.test.ts index 64e3cb54..1a642a2b 100644 --- a/packages/media/src/Sound/service/SoundEndedEventService.test.ts +++ b/packages/media/src/Sound/service/SoundEndedEventService.test.ts @@ -8,16 +8,13 @@ describe("SoundEndedEventService.js test", () => it("execute test case1", () => { let state = ""; - const MockSound = vi.fn().mockImplementation(() => - { - return { - "canLoop": true, - "play": vi.fn(() => { state = "play" }), - "stop": vi.fn(), - "hasEventListener": vi.fn(), - "dispatchEvent": vi.fn() - } as unknown as Sound; - }); + const MockSound = vi.fn(function(this: any) { + this.canLoop = true; + this.play = vi.fn(() => { state = "play" }); + this.stop = vi.fn(); + this.hasEventListener = vi.fn(); + this.dispatchEvent = vi.fn(); + }) as any; expect(state).toBe(""); execute(new MockSound()); @@ -28,16 +25,13 @@ describe("SoundEndedEventService.js test", () => { let state = ""; let type = ""; - const MockSound = vi.fn().mockImplementation(() => - { - return { - "canLoop": false, - "play": vi.fn(), - "stop": vi.fn(() => { state = "stop" }), - "willTrigger": vi.fn(() => true), - "dispatchEvent": vi.fn((event: Event) => { type = event.type }) - } as unknown as Sound; - }); + const MockSound = vi.fn(function(this: any) { + this.canLoop = false; + this.play = vi.fn(); + this.stop = vi.fn(() => { state = "stop" }); + this.willTrigger = vi.fn(() => true); + this.dispatchEvent = vi.fn((event: Event) => { type = event.type }); + }) as any; expect(type).toBe(""); expect(state).toBe(""); diff --git a/packages/media/src/Sound/service/SoundLoadStartEventService.test.ts b/packages/media/src/Sound/service/SoundLoadStartEventService.test.ts index 61c661dc..52859175 100644 --- a/packages/media/src/Sound/service/SoundLoadStartEventService.test.ts +++ b/packages/media/src/Sound/service/SoundLoadStartEventService.test.ts @@ -21,13 +21,10 @@ describe("SoundLoadStartEventService.js test", () => expect(openState).toBe(""); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.loaded = 1; + this.total = 10; + }) as any; execute(sound, new MockEvent()); @@ -53,13 +50,10 @@ describe("SoundLoadStartEventService.js test", () => expect(total).toBe(0); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.loaded = 1; + this.total = 10; + }) as any; execute(sound, new MockEvent()); diff --git a/packages/media/src/Sound/service/SoundProgressEventService.test.ts b/packages/media/src/Sound/service/SoundProgressEventService.test.ts index 6cbdd677..ab0e2e8e 100644 --- a/packages/media/src/Sound/service/SoundProgressEventService.test.ts +++ b/packages/media/src/Sound/service/SoundProgressEventService.test.ts @@ -24,13 +24,10 @@ describe("SoundProgressEventService.js test", () => expect(total).toBe(0); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.loaded = 1; + this.total = 10; + }) as any; execute(sound, new MockEvent()); diff --git a/packages/media/src/Sound/usecase/SoundLoadEndEventUseCase.test.ts b/packages/media/src/Sound/usecase/SoundLoadEndEventUseCase.test.ts index c731d247..03a61c6e 100644 --- a/packages/media/src/Sound/usecase/SoundLoadEndEventUseCase.test.ts +++ b/packages/media/src/Sound/usecase/SoundLoadEndEventUseCase.test.ts @@ -27,18 +27,15 @@ describe("SoundLoadendEventService.js test", () => expect(total).toBe(0); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "target": { - "status": 200, - "statusText": "OK", - "response": new ArrayBuffer(0) - }, - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.target = { + "status": 200, + "statusText": "OK", + "response": new ArrayBuffer(0) + }; + this.loaded = 1; + this.total = 10; + }) as any; execute(sound, new MockEvent()); @@ -58,17 +55,14 @@ describe("SoundLoadendEventService.js test", () => expect(openState).toBe(""); // mock event - const MockEvent = vi.fn().mockImplementation(() => - { - return { - "target": { - "status": 404, - "statusText": "Not Found" - }, - "loaded": 1, - "total": 10 - } as unknown as ProgressEvent; - }); + const MockEvent = vi.fn(function(this: any) { + this.target = { + "status": 404, + "statusText": "Not Found" + }; + this.loaded = 1; + this.total = 10; + }) as any; execute(sound, new MockEvent()); diff --git a/packages/media/src/SoundMixer/service/SoundMixerStopAllService.test.ts b/packages/media/src/SoundMixer/service/SoundMixerStopAllService.test.ts index 389dae15..6539b4cb 100644 --- a/packages/media/src/SoundMixer/service/SoundMixerStopAllService.test.ts +++ b/packages/media/src/SoundMixer/service/SoundMixerStopAllService.test.ts @@ -9,23 +9,17 @@ describe("SoundMixerStopAllService.js test", () => it("execute test case1", () => { let soundState = ""; - const MockSound = vi.fn().mockImplementation(() => - { - return { - "stop": vi.fn(() => { soundState = "stop" }) - } as unknown as Sound; - }); + const MockSound = vi.fn(function(this: any) { + this.stop = vi.fn(() => { soundState = "stop" }); + }) as any; const playingSounds = $getPlayingSounds(); playingSounds.push(new MockSound()); let videoState = ""; - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "pause": vi.fn(() => { videoState = "pause" }) - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.pause = vi.fn(() => { videoState = "pause" }); + }) as any; const playingVideos = $getPlayingVideos(); playingVideos.push(new MockVideo()); diff --git a/packages/media/src/SoundMixer/service/SoundMixerUpdateVolumeService.test.ts b/packages/media/src/SoundMixer/service/SoundMixerUpdateVolumeService.test.ts index 78894ac2..90b864eb 100644 --- a/packages/media/src/SoundMixer/service/SoundMixerUpdateVolumeService.test.ts +++ b/packages/media/src/SoundMixer/service/SoundMixerUpdateVolumeService.test.ts @@ -10,39 +10,33 @@ describe("SoundMixerUpdateVolumeService.js test", () => { it("execute test case1", () => { - const MockSound = vi.fn().mockImplementation(() => - { + const MockSound = vi.fn(function(this: any) { let volume = 1; - return { - get volume (): number - { - return volume + Object.defineProperty(this, 'volume', { + get(): number { + return volume; }, - set volume(value: number) - { + set(value: number) { volume = $clamp(value, 0, 1); } - } as unknown as Sound; - }); + }); + }) as any; const mockSound = new MockSound(); const playingSounds = $getPlayingSounds(); playingSounds.push(mockSound); - const MockVideo = vi.fn().mockImplementation(() => - { + const MockVideo = vi.fn(function(this: any) { let volume = 1; - return { - get volume (): number - { - return volume + Object.defineProperty(this, 'volume', { + get(): number { + return volume; }, - set volume(value: number) - { + set(value: number) { volume = $clamp(value, 0, 1); } - } as unknown as Video; - }); + }); + }) as any; const mockVideo = new MockVideo(); const playingVideos = $getPlayingVideos(); diff --git a/packages/media/src/Video/service/VideoEndedEventService.test.ts b/packages/media/src/Video/service/VideoEndedEventService.test.ts index 7c5d3cda..636ad6ba 100644 --- a/packages/media/src/Video/service/VideoEndedEventService.test.ts +++ b/packages/media/src/Video/service/VideoEndedEventService.test.ts @@ -9,16 +9,13 @@ describe("VideoEndedEventService.js test", () => { let eventType = ""; let pauseState = ""; - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "willTrigger": vi.fn(() => true), - "dispatchEvent": vi.fn((event: VideoEvent) => { eventType = event.type }), - "loop": true, - "pause": vi.fn(() => { pauseState = "pause" }), - "currentTime": 100 - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.willTrigger = vi.fn(() => true); + this.dispatchEvent = vi.fn((event: VideoEvent) => { eventType = event.type }); + this.loop = true; + this.pause = vi.fn(() => { pauseState = "pause" }); + this.currentTime = 100; + }) as any; expect(eventType).toBe(""); expect(pauseState).toBe(""); @@ -37,16 +34,13 @@ describe("VideoEndedEventService.js test", () => { let eventType = ""; let pauseState = ""; - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "willTrigger": vi.fn(() => true), - "dispatchEvent": vi.fn((event: VideoEvent) => { eventType = event.type }), - "loop": false, - "pause": vi.fn(() => { pauseState = "pause" }), - "currentTime": 100 - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.willTrigger = vi.fn(() => true); + this.dispatchEvent = vi.fn((event: VideoEvent) => { eventType = event.type }); + this.loop = false; + this.pause = vi.fn(() => { pauseState = "pause" }); + this.currentTime = 100; + }) as any; expect(eventType).toBe(""); expect(pauseState).toBe(""); diff --git a/packages/media/src/Video/service/VideoLoadedmetadataEventService.test.ts b/packages/media/src/Video/service/VideoLoadedmetadataEventService.test.ts index aae12f13..342705d0 100644 --- a/packages/media/src/Video/service/VideoLoadedmetadataEventService.test.ts +++ b/packages/media/src/Video/service/VideoLoadedmetadataEventService.test.ts @@ -6,26 +6,20 @@ describe("VideoLoadedmetadataEventService.js test", () => { it("execute test case1", () => { - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "currentTime": 100, - "duration": 0 - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.currentTime = 100; + this.duration = 0; + }) as any; const mockVideo = new MockVideo(); expect(mockVideo.currentTime).toBe(100); expect(mockVideo.duration).toBe(0); - const MockHTMLVideoElement = vi.fn().mockImplementation(() => - { - return { - "duration": 100, - "videoWidth": 200, - "videoHeight": 300 - } as unknown as HTMLVideoElement; - }); + const MockHTMLVideoElement = vi.fn(function(this: any) { + this.duration = 100; + this.videoWidth = 200; + this.videoHeight = 300; + }) as any; const mockElement = new MockHTMLVideoElement(); expect(mockElement.duration).toBe(100); diff --git a/packages/media/src/Video/service/VideoProgressEventService.test.ts b/packages/media/src/Video/service/VideoProgressEventService.test.ts index 07b2a9fe..c02306c3 100644 --- a/packages/media/src/Video/service/VideoProgressEventService.test.ts +++ b/packages/media/src/Video/service/VideoProgressEventService.test.ts @@ -10,26 +10,20 @@ describe("VideoProgressEventService.js test", () => let eventState = ""; let loaded = 0; let total = 0; - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "willTrigger": vi.fn(() => true), - "dispatchEvent": vi.fn((event: Next2DProgressEvent) => - { - eventState = event.type; - loaded = event.bytesLoaded; - total = event.bytesTotal; - }) - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.willTrigger = vi.fn(() => true); + this.dispatchEvent = vi.fn((event: Next2DProgressEvent) => + { + eventState = event.type; + loaded = event.bytesLoaded; + total = event.bytesTotal; + }); + }) as any; - const MockProgressEvent = vi.fn().mockImplementation(() => - { - return { - "loaded": 10, - "total": 20 - } as unknown as ProgressEvent; - }); + const MockProgressEvent = vi.fn(function(this: any) { + this.loaded = 10; + this.total = 20; + }) as any; expect(eventState).toBe(""); expect(loaded).toBe(0); diff --git a/packages/media/src/Video/usecase/VideoCanplaythroughEventUseCase.test.ts b/packages/media/src/Video/usecase/VideoCanplaythroughEventUseCase.test.ts index be5b756f..f034f246 100644 --- a/packages/media/src/Video/usecase/VideoCanplaythroughEventUseCase.test.ts +++ b/packages/media/src/Video/usecase/VideoCanplaythroughEventUseCase.test.ts @@ -9,15 +9,12 @@ describe("VideoCanplaythroughEventService.js test", () => { let playState = "stop"; let eventState = ""; - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "autoPlay": true, - "play": vi.fn(() => { playState = "play" }), - "willTrigger": vi.fn(() => true), - "dispatchEvent": vi.fn(() => { eventState = Event.COMPLETE }) - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.autoPlay = true; + this.play = vi.fn(() => { playState = "play" }); + this.willTrigger = vi.fn(() => true); + this.dispatchEvent = vi.fn(() => { eventState = Event.COMPLETE }); + }) as any; const mockVideo = new MockVideo(); @@ -39,14 +36,11 @@ describe("VideoCanplaythroughEventService.js test", () => it("execute test case2", async () => { let eventState = ""; - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "autoPlay": false, - "willTrigger": vi.fn(() => true), - "dispatchEvent": vi.fn(() => { eventState = Event.COMPLETE }) - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.autoPlay = false; + this.willTrigger = vi.fn(() => true); + this.dispatchEvent = vi.fn(() => { eventState = Event.COMPLETE }); + }) as any; const mockVideo = new MockVideo(); diff --git a/packages/media/src/Video/usecase/VideoPlayEventUseCase.test.ts b/packages/media/src/Video/usecase/VideoPlayEventUseCase.test.ts index 97329ec6..ebe35c69 100644 --- a/packages/media/src/Video/usecase/VideoPlayEventUseCase.test.ts +++ b/packages/media/src/Video/usecase/VideoPlayEventUseCase.test.ts @@ -11,15 +11,12 @@ describe("VideoPlayEventService.js test", () => let pauseState = ""; let eventState = ""; let state = ""; - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "pause": vi.fn(() => { pauseState = "pause" }), - "loaded": true, - "willTrigger": vi.fn(() => true), - "dispatchEvent": vi.fn((event: VideoEvent) => { eventState = event.type }), - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.pause = vi.fn(() => { pauseState = "pause" }); + this.loaded = true; + this.willTrigger = vi.fn(() => true); + this.dispatchEvent = vi.fn((event: VideoEvent) => { eventState = event.type }); + }) as any; const mockVideo = new MockVideo(); expect(pauseState).toBe(""); diff --git a/packages/media/src/Video/usecase/VideoRegisterEventUseCase.test.ts b/packages/media/src/Video/usecase/VideoRegisterEventUseCase.test.ts index 8a1b8761..08e900e5 100644 --- a/packages/media/src/Video/usecase/VideoRegisterEventUseCase.test.ts +++ b/packages/media/src/Video/usecase/VideoRegisterEventUseCase.test.ts @@ -7,27 +7,21 @@ describe("VideoRegisterEventUseCase.js test", () => it("execute test case1", () => { const types: string[] = []; - const MockHTMLVideoElement = vi.fn().mockImplementation(() => - { - return { - "duration": 100, - "videoWidth": 200, - "videoHeight": 300, - "addEventListener": vi.fn((type: string) => { - types.push(type); - }) - } as unknown as HTMLVideoElement; - }); + const MockHTMLVideoElement = vi.fn(function(this: any) { + this.duration = 100; + this.videoWidth = 200; + this.videoHeight = 300; + this.addEventListener = vi.fn((type: string) => { + types.push(type); + }); + }) as any; const mockElement = new MockHTMLVideoElement(); - const MockVideo = vi.fn().mockImplementation(() => - { - return { - "currentTime": 100, - "duration": 0 - } as unknown as Video; - }); + const MockVideo = vi.fn(function(this: any) { + this.currentTime = 100; + this.duration = 0; + }) as any; const mockVideo = new MockVideo(); diff --git a/packages/renderer/src/Command/service/CommandInitializeContextService.test.ts b/packages/renderer/src/Command/service/CommandInitializeContextService.test.ts index b8f2b80c..0d8475e3 100644 --- a/packages/renderer/src/Command/service/CommandInitializeContextService.test.ts +++ b/packages/renderer/src/Command/service/CommandInitializeContextService.test.ts @@ -5,62 +5,59 @@ describe("CommandInitializeContextService.js test", () => { it("execute test case1", () => { - const MockCanvas = vi.fn().mockImplementation(() => - { - return { - "getContext": vi.fn((contextId: string, options: any) => - { - expect(contextId).toBe("webgl2"); - expect(options.stencil).toBe(true); - expect(options.premultipliedAlpha).toBe(true); - expect(options.antialias).toBe(false); - expect(options.depth).toBe(false); + const MockCanvas = vi.fn(function(this: any) { + this.getContext = vi.fn((contextId: string, options: any) => + { + expect(contextId).toBe("webgl2"); + expect(options.stencil).toBe(true); + expect(options.premultipliedAlpha).toBe(true); + expect(options.antialias).toBe(false); + expect(options.depth).toBe(false); - return { - "clearColor": vi.fn(), - "getParameter": vi.fn(), - "createFramebuffer": vi.fn(), - "bindFramebuffer": vi.fn(), - "pixelStorei": vi.fn(), - "createRenderbuffer": vi.fn(), - "bindRenderbuffer": vi.fn(), - "renderbufferStorageMultisample": vi.fn(), - "createTexture": vi.fn(() => - { - return {}; - }), - "activeTexture": vi.fn(), - "bindTexture": vi.fn(), - "texParameteri": vi.fn(), - "texStorage2D": vi.fn(), - "createBuffer": vi.fn(), - "createVertexArray": vi.fn(), - "bindBuffer": vi.fn(), - "bufferData": vi.fn(), - "enableVertexAttribArray": vi.fn(), - "vertexAttribPointer": vi.fn(), - "vertexAttribDivisor": vi.fn(), - "createProgram": vi.fn(() => - { - return {}; - }), - "createShader": vi.fn(), - "shaderSource": vi.fn(), - "compileShader": vi.fn(), - "attachShader": vi.fn(), - "linkProgram": vi.fn(), - "detachShader": vi.fn(), - "deleteShader": vi.fn(), - "getProgramParameter": vi.fn(), - "enable": vi.fn(), - "blendFunc": vi.fn(), - "renderbufferStorage": vi.fn(), - "bindVertexArray": vi.fn(() => "bindVertexArray"), - "framebufferTexture2D": vi.fn(() => "framebufferTexture2D"), - }; - }) - } as unknown as HTMLCanvasElement; - }); + return { + "clearColor": vi.fn(), + "getParameter": vi.fn(), + "createFramebuffer": vi.fn(), + "bindFramebuffer": vi.fn(), + "pixelStorei": vi.fn(), + "createRenderbuffer": vi.fn(), + "bindRenderbuffer": vi.fn(), + "renderbufferStorageMultisample": vi.fn(), + "createTexture": vi.fn(() => + { + return {}; + }), + "activeTexture": vi.fn(), + "bindTexture": vi.fn(), + "texParameteri": vi.fn(), + "texStorage2D": vi.fn(), + "createBuffer": vi.fn(), + "createVertexArray": vi.fn(), + "bindBuffer": vi.fn(), + "bufferData": vi.fn(), + "enableVertexAttribArray": vi.fn(), + "vertexAttribPointer": vi.fn(), + "vertexAttribDivisor": vi.fn(), + "createProgram": vi.fn(() => + { + return {}; + }), + "createShader": vi.fn(), + "shaderSource": vi.fn(), + "compileShader": vi.fn(), + "attachShader": vi.fn(), + "linkProgram": vi.fn(), + "detachShader": vi.fn(), + "deleteShader": vi.fn(), + "getProgramParameter": vi.fn(), + "enable": vi.fn(), + "blendFunc": vi.fn(), + "renderbufferStorage": vi.fn(), + "bindVertexArray": vi.fn(() => "bindVertexArray"), + "framebufferTexture2D": vi.fn(() => "framebufferTexture2D"), + }; + }); + }) as any; execute(new MockCanvas()); }); diff --git a/packages/ui/src/Job/service/JobUpdateFrameService.test.ts b/packages/ui/src/Job/service/JobUpdateFrameService.test.ts index d597eaee..011d2758 100644 --- a/packages/ui/src/Job/service/JobUpdateFrameService.test.ts +++ b/packages/ui/src/Job/service/JobUpdateFrameService.test.ts @@ -6,12 +6,9 @@ describe("JobUpdateFrameService.js test", () => { it("execute test case1", () => { - const MockJob = vi.fn().mockImplementation(() => - { - return { - "stopFlag": true - } as unknown as Job; - }); + const MockJob = vi.fn(function(this: any) { + this.stopFlag = true; + }) as any; const job = new MockJob(); expect(execute(job, 0)).toBe(-1); @@ -19,13 +16,10 @@ describe("JobUpdateFrameService.js test", () => it("execute test case2", () => { - const MockJob = vi.fn().mockImplementation(() => - { - return { - "stopFlag": false, - "entries": null - } as unknown as Job; - }); + const MockJob = vi.fn(function(this: any) { + this.stopFlag = false; + this.entries = null; + }) as any; const job = new MockJob(); expect(execute(job, 0)).toBe(-1); diff --git a/test.setup.ts b/test.setup.ts index fddf8bac..0eaf85fb 100644 --- a/test.setup.ts +++ b/test.setup.ts @@ -21,3 +21,36 @@ class MockOffscreenCanvas { if (typeof globalThis.OffscreenCanvas === "undefined") { (globalThis as any).OffscreenCanvas = MockOffscreenCanvas; } + +class MockWorker { + onmessage: ((event: MessageEvent) => void) | null = null; + onerror: ((event: ErrorEvent) => void) | null = null; + + constructor(scriptURL: string | URL, options?: WorkerOptions) { + // Mock worker that does nothing + } + + postMessage(message: any, transfer?: Transferable[]): void { + // Mock implementation + } + + terminate(): void { + // Mock implementation + } + + addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void { + // Mock implementation + } + + removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void { + // Mock implementation + } + + dispatchEvent(event: Event): boolean { + return true; + } +} + +if (typeof globalThis.Worker === "undefined") { + (globalThis as any).Worker = MockWorker; +} diff --git a/vite.config.ts b/vite.config.ts index 0e076287..03e93803 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -25,7 +25,6 @@ export default defineConfig({ "environment": "jsdom", "setupFiles": [ "test.setup.ts", - "@vitest/web-worker", "vitest-webgl-canvas-mock" ], "include": ["packages/**/*.test.ts"] From eba80049ff5948f2385fa2989b6521094d076cf8 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 31 Oct 2025 10:54:05 +0900 Subject: [PATCH 21/45] =?UTF-8?q?#213=20update=20packages=E3=80=81?= =?UTF-8?q?=E5=BD=B1=E9=9F=BF=E7=AF=84=E5=9B=B2=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 162 ++++++++++-------- package.json | 8 +- packages/cache/src/CacheStore.ts | 4 +- .../usecase/CanvasPointerDownEventUseCase.ts | 4 +- packages/text/src/TextUtil.ts | 12 +- 5 files changed, 106 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f706c33..3080e26f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,14 +18,14 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.38.0", - "@rollup/plugin-commonjs": "^28.0.9", + "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.3.0", - "@types/node": "^24.9.1", + "@types/node": "^24.9.2", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", - "@vitest/web-worker": "^4.0.3", + "@vitest/web-worker": "^4.0.5", "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", @@ -34,7 +34,7 @@ "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.1.12", - "vitest": "^4.0.3", + "vitest": "^4.0.5", "vitest-webgl-canvas-mock": "^1.1.0" }, "funding": { @@ -190,9 +190,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.14.tgz", - "integrity": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.15.tgz", + "integrity": "sha512-q0p6zkVq2lJnmzZVPR33doA51G7YOja+FBvRdp5ISIthL0MtFCgYHHhR563z9WFGxcOn0WfjSkPDJ5Qig3H3Sw==", "dev": true, "funding": [ { @@ -207,9 +207,6 @@ "license": "MIT-0", "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, "node_modules/@csstools/css-tokenizer": { @@ -720,13 +717,26 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", - "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0" + "@types/json-schema": "^7.0.15" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -806,19 +816,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1016,9 +1039,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.9", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.9.tgz", - "integrity": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.0.tgz", + "integrity": "sha512-U2YHaxR2cU/yAiwKJtJRhnyLk7cifnQw0zUpISsocBDoHDJn+HTV74ABqnwr5bEgWUwFZC9oFL6wLe21lHu5eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1488,9 +1511,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", - "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", + "version": "24.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", + "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "dev": true, "license": "MIT", "peer": true, @@ -1778,16 +1801,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.3.tgz", - "integrity": "sha512-v3eSDx/bF25pzar6aEJrrdTXJduEBU3uSGXHslIdGIpJVP8tQQHV6x1ZfzbFQ/bLIomLSbR/2ZCfnaEGkWkiVQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.5.tgz", + "integrity": "sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.3", - "@vitest/utils": "4.0.3", + "@vitest/spy": "4.0.5", + "@vitest/utils": "4.0.5", "chai": "^6.0.1", "tinyrainbow": "^3.0.3" }, @@ -1796,13 +1819,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.3.tgz", - "integrity": "sha512-evZcRspIPbbiJEe748zI2BRu94ThCBE+RkjCpVF8yoVYuTV7hMe+4wLF/7K86r8GwJHSmAPnPbZhpXWWrg1qbA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.5.tgz", + "integrity": "sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.3", + "@vitest/spy": "4.0.5", "estree-walker": "^3.0.3", "magic-string": "^0.30.19" }, @@ -1833,9 +1856,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.3.tgz", - "integrity": "sha512-N7gly/DRXzxa9w9sbDXwD9QNFYP2hw90LLLGDobPNwiWgyW95GMxsCt29/COIKKh3P7XJICR38PSDePenMBtsw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.5.tgz", + "integrity": "sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==", "dev": true, "license": "MIT", "dependencies": { @@ -1846,13 +1869,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.3.tgz", - "integrity": "sha512-1/aK6fPM0lYXWyGKwop2Gbvz1plyTps/HDbIIJXYtJtspHjpXIeB3If07eWpVH4HW7Rmd3Rl+IS/+zEAXrRtXA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.5.tgz", + "integrity": "sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.3", + "@vitest/utils": "4.0.5", "pathe": "^2.0.3" }, "funding": { @@ -1860,13 +1883,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.3.tgz", - "integrity": "sha512-amnYmvZ5MTjNCP1HZmdeczAPLRD6iOm9+2nMRUGxbe/6sQ0Ymur0NnR9LIrWS8JA3wKE71X25D6ya/3LN9YytA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.5.tgz", + "integrity": "sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.3", + "@vitest/pretty-format": "4.0.5", "magic-string": "^0.30.19", "pathe": "^2.0.3" }, @@ -1875,9 +1898,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.3.tgz", - "integrity": "sha512-82vVL8Cqz7rbXaNUl35V2G7xeNMAjBdNOVaHbrzznT9BmiCiPOzhf0FhU3eP41nP1bLDm/5wWKZqkG4nyU95DQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.5.tgz", + "integrity": "sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==", "dev": true, "license": "MIT", "funding": { @@ -1885,13 +1908,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.3.tgz", - "integrity": "sha512-qV6KJkq8W3piW6MDIbGOmn1xhvcW4DuA07alqaQ+vdx7YA49J85pnwnxigZVQFQw3tWnQNRKWwhz5wbP6iv/GQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.5.tgz", + "integrity": "sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.3", + "@vitest/pretty-format": "4.0.5", "tinyrainbow": "^3.0.3" }, "funding": { @@ -1899,9 +1922,9 @@ } }, "node_modules/@vitest/web-worker": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-4.0.3.tgz", - "integrity": "sha512-bWweWZfgSpePhVWhPCvyOKeqlU8d3kogOZKGEoE/CpdOnokgXTcr66SRX1EWFtrYWHicTLiL+xx30fiRvuJGtA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-4.0.5.tgz", + "integrity": "sha512-oyqVOUbHdiLOrUKvpPiIxCLZMZsDe30E3qqv2GbyogwLAEH7ofCQ2prujGyQyvlDEOqxtnUFSHVnSP1qczvGCg==", "dev": true, "license": "MIT", "dependencies": { @@ -1911,7 +1934,7 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.0.3" + "vitest": "4.0.5" } }, "node_modules/acorn": { @@ -3404,7 +3427,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4045,20 +4067,20 @@ } }, "node_modules/vitest": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.3.tgz", - "integrity": "sha512-IUSop8jgaT7w0g1yOM/35qVtKjr/8Va4PrjzH1OUb0YH4c3OXB2lCZDkMAB6glA8T5w8S164oJGsbcmAecr4sA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.5.tgz", + "integrity": "sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/expect": "4.0.3", - "@vitest/mocker": "4.0.3", - "@vitest/pretty-format": "4.0.3", - "@vitest/runner": "4.0.3", - "@vitest/snapshot": "4.0.3", - "@vitest/spy": "4.0.3", - "@vitest/utils": "4.0.3", + "@vitest/expect": "4.0.5", + "@vitest/mocker": "4.0.5", + "@vitest/pretty-format": "4.0.5", + "@vitest/runner": "4.0.5", + "@vitest/snapshot": "4.0.5", + "@vitest/spy": "4.0.5", + "@vitest/utils": "4.0.5", "debug": "^4.4.3", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", @@ -4086,10 +4108,10 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.3", - "@vitest/browser-preview": "4.0.3", - "@vitest/browser-webdriverio": "4.0.3", - "@vitest/ui": "4.0.3", + "@vitest/browser-playwright": "4.0.5", + "@vitest/browser-preview": "4.0.5", + "@vitest/browser-webdriverio": "4.0.5", + "@vitest/ui": "4.0.5", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index d999619a..0bee1395 100644 --- a/package.json +++ b/package.json @@ -47,14 +47,14 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.38.0", - "@rollup/plugin-commonjs": "^28.0.9", + "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.3.0", - "@types/node": "^24.9.1", + "@types/node": "^24.9.2", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", - "@vitest/web-worker": "^4.0.3", + "@vitest/web-worker": "^4.0.5", "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", @@ -63,7 +63,7 @@ "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.1.12", - "vitest": "^4.0.3", + "vitest": "^4.0.5", "vitest-webgl-canvas-mock": "^1.1.0" }, "peerDependencies": { diff --git a/packages/cache/src/CacheStore.ts b/packages/cache/src/CacheStore.ts index c84a8cb9..dea1c439 100644 --- a/packages/cache/src/CacheStore.ts +++ b/packages/cache/src/CacheStore.ts @@ -50,10 +50,10 @@ export class CacheStore * @description キャッシュ削除用のタイマーID * Timer ID for cache deletion * - * @type {NodeJS.Timeout | null} + * @type {number | null} * @public */ - public $timerId: NodeJS.Timeout | null; + public $timerId: number | null; /** * @description キャッシュタイマーの削除フラグ diff --git a/packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.ts b/packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.ts index d7ff0ef5..0219cae8 100644 --- a/packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.ts +++ b/packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.ts @@ -7,10 +7,10 @@ import { execute as playerDoubleClickEventService } from "../../Player/service/P import { $hitObject } from "../../CoreUtil"; /** - * @type {NodeJS.Timeout} + * @type {number} * @private */ -let $timerId: NodeJS.Timeout; +let $timerId: number; /** * @type {boolean} diff --git a/packages/text/src/TextUtil.ts b/packages/text/src/TextUtil.ts index c2afeebe..3f8426e5 100644 --- a/packages/text/src/TextUtil.ts +++ b/packages/text/src/TextUtil.ts @@ -179,19 +179,19 @@ export const $clamp = ( }; /** - * @type {NodeJS.Timeout} + * @type {number} * @private */ -let $timerId: NodeJS.Timeout | void; +let $timerId: number | void; /** * @description テキスト点滅のタイマーIDを返却 * Returns the timer ID for text blinking * - * @return {NodeJS.Timeout} + * @return {number} * @protected */ -export const $getBlinkingTimerId = (): NodeJS.Timeout | void => +export const $getBlinkingTimerId = (): number | void => { return $timerId; }; @@ -200,11 +200,11 @@ export const $getBlinkingTimerId = (): NodeJS.Timeout | void => * @description テキスト点滅のタイマーIDをセット * Set the timer ID for text blinking * - * @param {NodeJS.Timeout} timer_id + * @param {number} timer_id * @return {void} * @protected */ -export const $setBlinkingTimerId = (timer_id: NodeJS.Timeout | void): void => +export const $setBlinkingTimerId = (timer_id: number | void): void => { $timerId = timer_id; }; From ff67dbcf4c97453f3f7fcff1191c3ec45a494ac3 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 31 Oct 2025 16:44:17 +0900 Subject: [PATCH 22/45] =?UTF-8?q?#213=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0(WIP)?= =?UTF-8?q?=E3=80=81=E7=9B=B8=E4=BA=92=E5=8F=82=E7=85=A7=E7=AE=87=E6=89=80?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 36 +- package.json | 2 +- .../service/GraphicsHitTestService.test.ts | 291 +++++++++++++++ .../usecase/GraphicsCalcBoundsUseCase.test.ts | 201 +++++++++++ .../usecase/LoaderLoadJsonUseCase.test.ts | 276 ++++++++++++++ .../Loader/usecase/LoaderLoadUseCase.test.ts | 118 ++++++ .../MovieClipGetChildrenService.test.ts | 199 +++++++++++ ...lipBuildDictionaryCharacterUseCase.test.ts | 239 +++++++++++++ ...MovieClipBuildFromCharacterUseCase.test.ts | 300 ++++++++++++++++ .../ShapeBuildFromCharacterUseCase.test.ts | 196 ++++++++++ .../ShapeClearBitmapBufferUseCase.test.ts | 135 +++++++ .../ShapeGenerateRenderQueueUseCase.test.ts | 146 ++++++++ .../Shape/usecase/ShapeHitTestUseCase.test.ts | 183 ++++++++++ .../Shape/usecase/ShapeLoadSrcUseCase.test.ts | 115 ++++++ .../ShapeSetBitmapBufferUseCase.test.ts | 129 +++++++ .../StageExecuteFrameSoundsService.test.ts | 337 ++++++++++++++++++ .../StageGenerateRenderQueueUseCase.test.ts | 145 ++++++++ .../Stage/usecase/StageReadyUseCase.test.ts | 117 ++++++ .../Stage/usecase/StageTickerUseCase.test.ts | 87 +++++ ...extFieldGenerateRenderQueueUseCase.test.ts | 217 +++++++++++ .../usecase/TextFieldHitTestUseCase.test.ts | 265 ++++++++++++++ .../VideoGenerateRenderQueueUseCase.test.ts | 239 +++++++++++++ .../Video/usecase/VideoHitTestUseCase.test.ts | 205 +++++++++++ .../TextAreaCompositionEndUseCase.test.ts | 111 ++++++ .../TextAreaCompositionStartUseCase.test.ts | 111 ++++++ .../TextAreaCompositionUpdateUseCase.test.ts | 181 ++++++++++ .../usecase/TextAreaInputUseCase.test.ts | 173 +++++++++ ...xtFieldBlinkingClearTimeoutService.test.ts | 200 +++++++++++ .../usecase/TextFieldArrowDownUseCase.test.ts | 106 ++++++ .../usecase/TextFieldArrowLeftUseCase.test.ts | 110 ++++++ .../TextFieldArrowRightUseCase.test.ts | 111 ++++++ .../usecase/TextFieldArrowUpUseCase.test.ts | 107 ++++++ ...TextFieldBuildFromCharacterUseCase.test.ts | 281 +++++++++++++++ .../TextFieldCompositionEndUseCase.test.ts | 120 +++++++ .../TextFieldCompositionUpdateUseCase.test.ts | 113 ++++++ .../TextFieldInsertTextUseCase.test.ts | 104 ++++++ .../TextFieldKeyDownEventUseCase.test.ts | 191 ++++++++++ .../usecase/TextFieldReloadUseCase.test.ts | 101 ++++++ .../usecase/TextFieldSelectAllUseCase.test.ts | 104 ++++++ .../TextFieldSelectedFocusMoveUseCase.test.ts | 108 ++++++ .../TextFieldSetFocusIndexUseCase.test.ts | 167 +++++++++ packages/texture-packer/src/Node.ts | 18 + .../src/Node/service/NodeInsertService.ts | 10 +- .../BlendDrawFilterToMainUseCase.test.ts | 135 +++++++ .../BlnedDrawArraysInstancedUseCase.test.ts | 111 ++++++ .../BlnedDrawDisplayObjectUseCase.test.ts | 199 +++++++++++ packages/webgl/src/Context.ts | 5 +- packages/webgl/src/FrameBufferManager.ts | 14 +- packages/webgl/src/PathCommand.ts | 12 +- packages/webgl/src/VertexArrayObject.ts | 19 - ...ertexArrayObjectCreateFillObjectService.ts | 3 +- .../webgl/src/interface/IVertexArrayObject.ts | 2 +- rollup.renderer.worker.config.js | 2 +- rollup.unzip.worker.config.js | 2 +- 54 files changed, 7151 insertions(+), 58 deletions(-) create mode 100644 packages/display/src/Graphics/service/GraphicsHitTestService.test.ts create mode 100644 packages/display/src/Graphics/usecase/GraphicsCalcBoundsUseCase.test.ts create mode 100644 packages/display/src/Loader/usecase/LoaderLoadJsonUseCase.test.ts create mode 100644 packages/display/src/Loader/usecase/LoaderLoadUseCase.test.ts create mode 100644 packages/display/src/MovieClip/service/MovieClipGetChildrenService.test.ts create mode 100644 packages/display/src/MovieClip/usecase/MovieClipBuildDictionaryCharacterUseCase.test.ts create mode 100644 packages/display/src/MovieClip/usecase/MovieClipBuildFromCharacterUseCase.test.ts create mode 100644 packages/display/src/Shape/usecase/ShapeBuildFromCharacterUseCase.test.ts create mode 100644 packages/display/src/Shape/usecase/ShapeClearBitmapBufferUseCase.test.ts create mode 100644 packages/display/src/Shape/usecase/ShapeGenerateRenderQueueUseCase.test.ts create mode 100644 packages/display/src/Shape/usecase/ShapeHitTestUseCase.test.ts create mode 100644 packages/display/src/Shape/usecase/ShapeLoadSrcUseCase.test.ts create mode 100644 packages/display/src/Shape/usecase/ShapeSetBitmapBufferUseCase.test.ts create mode 100644 packages/display/src/Stage/service/StageExecuteFrameSoundsService.test.ts create mode 100644 packages/display/src/Stage/usecase/StageGenerateRenderQueueUseCase.test.ts create mode 100644 packages/display/src/Stage/usecase/StageReadyUseCase.test.ts create mode 100644 packages/display/src/Stage/usecase/StageTickerUseCase.test.ts create mode 100644 packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.test.ts create mode 100644 packages/display/src/TextField/usecase/TextFieldHitTestUseCase.test.ts create mode 100644 packages/display/src/Video/usecase/VideoGenerateRenderQueueUseCase.test.ts create mode 100644 packages/display/src/Video/usecase/VideoHitTestUseCase.test.ts create mode 100644 packages/text/src/TextArea/usecase/TextAreaCompositionEndUseCase.test.ts create mode 100644 packages/text/src/TextArea/usecase/TextAreaCompositionStartUseCase.test.ts create mode 100644 packages/text/src/TextArea/usecase/TextAreaCompositionUpdateUseCase.test.ts create mode 100644 packages/text/src/TextArea/usecase/TextAreaInputUseCase.test.ts create mode 100644 packages/text/src/TextField/service/TextFieldBlinkingClearTimeoutService.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldArrowDownUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldArrowLeftUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldArrowRightUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldArrowUpUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldBuildFromCharacterUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldCompositionEndUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldCompositionUpdateUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldInsertTextUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts create mode 100644 packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts create mode 100644 packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts create mode 100644 packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts create mode 100644 packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts diff --git a/package-lock.json b/package-lock.json index 3080e26f..ec36711f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", - "jsdom": "^27.0.1", + "jsdom": "^27.1.0", "rollup": "^4.52.5", "tslib": "^2.8.1", "typescript": "^5.9.3", @@ -58,6 +58,13 @@ "@next2d/webgl": "file:packages/webgl" } }, + "node_modules/@acemir/cssom": { + "version": "0.9.19", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.19.tgz", + "integrity": "sha512-Pp2gAQXPZ2o7lt4j0IMwNRXqQ3pagxtDj5wctL5U2Lz4oV0ocDNlkgx4DpxfyKav4S/bePuI+SMqcBSUHLy9kg==", + "dev": true, + "license": "MIT" + }, "node_modules/@asamuzakjp/css-color": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.0.5.tgz", @@ -2184,9 +2191,9 @@ "license": "MIT" }, "node_modules/cssstyle": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.1.tgz", - "integrity": "sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.2.tgz", + "integrity": "sha512-zDMqXh8Vs1CdRYZQ2M633m/SFgcjlu8RB8b/1h82i+6vpArF507NSYIWJHGlJaTWoS+imcnctmEz43txhbVkOw==", "dev": true, "license": "MIT", "dependencies": { @@ -3043,15 +3050,16 @@ } }, "node_modules/jsdom": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.1.tgz", - "integrity": "sha512-SNSQteBL1IlV2zqhwwolaG9CwhIhTvVHWg3kTss/cLE7H/X4644mtPQqYvCfsSrGQWt9hSZcgOXX8bOZaMN+kA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.1.0.tgz", + "integrity": "sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@asamuzakjp/dom-selector": "^6.7.2", - "cssstyle": "^5.3.1", + "@acemir/cssom": "^0.9.19", + "@asamuzakjp/dom-selector": "^6.7.3", + "cssstyle": "^5.3.2", "data-urls": "^6.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^4.0.0", @@ -3059,7 +3067,6 @@ "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "parse5": "^8.0.0", - "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.0", @@ -3072,7 +3079,7 @@ "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=20" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { "canvas": "^3.0.0" @@ -3582,13 +3589,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", diff --git a/package.json b/package.json index 0bee1395..1aef8729 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "eslint": "^9.38.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", - "jsdom": "^27.0.1", + "jsdom": "^27.1.0", "rollup": "^4.52.5", "tslib": "^2.8.1", "typescript": "^5.9.3", diff --git a/packages/display/src/Graphics/service/GraphicsHitTestService.test.ts b/packages/display/src/Graphics/service/GraphicsHitTestService.test.ts new file mode 100644 index 00000000..ecc7e2b2 --- /dev/null +++ b/packages/display/src/Graphics/service/GraphicsHitTestService.test.ts @@ -0,0 +1,291 @@ +import { Graphics } from "../../Graphics"; +import { execute } from "./GraphicsHitTestService"; +import { describe, expect, it, beforeEach } from "vitest"; + +describe("GraphicsHitTestService.js test", () => +{ + let canvas: HTMLCanvasElement; + let context: CanvasRenderingContext2D; + + beforeEach(() => + { + canvas = document.createElement("canvas"); + canvas.width = 200; + canvas.height = 200; + context = canvas.getContext("2d") as CanvasRenderingContext2D; + }); + + it("execute test case1 - simple fill path with END_FILL", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + // Canvas mock doesn't implement isPointInPath properly, + // but we can verify the function executes without error + expect(typeof result).toBe("boolean"); + }); + + it("execute test case2 - returns false when no path matches", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 7 // END_FILL + ]); + + const hitObject = { x: 150, y: 150 }; + const result = execute(context, recodes, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case3 - quadratic curve path", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 1, 50, 100, 100, 0, // CURVE_TO cx cy x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case4 - cubic bezier curve path", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 3, 30, 30, 70, 30, 100, 0, // CUBIC cp1x cp1y cp2x cp2y x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case5 - arc path", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 4, 50, 50, 30, // ARC x y radius + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case6 - path with no hit returns false", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 4, 50, 50, 30, // ARC x y radius + 7 // END_FILL + ]); + + const hitObject = { x: 90, y: 90 }; + const result = execute(context, recodes, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case7 - fill style skips 4 values", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 5, 255, 0, 0, 255, // FILL_STYLE r g b a (skipped) + 12, // CLOSE_PATH + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case8 - stroke style skips 8 values", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 6, 255, 0, 0, 255, 1, 0, 0, 0, // STROKE_STYLE r g b a thickness caps joint miter (skipped) + 12, // CLOSE_PATH + 8, // END_STROKE + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case9 - gradient fill checks hit and skips 6 values", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 10, 0, 0, 0, 100, 100, 0 // GRADIENT_FILL (6 values) + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case10 - gradient stroke skips 12 values", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 11, 0, 0, 0, 100, 100, 0, 1, 0, 0, 0, 0, 0, // GRADIENT_STROKE (12 values) + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case11 - bitmap fill checks hit and skips 6 values", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 13, 0, 0, 0, 0, 0, 0 // BITMAP_FILL (6 values) + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case12 - bitmap stroke skips 9 values", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 100, 0, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 0, 100, // LINE_TO x y + 12, // CLOSE_PATH + 14, 0, 0, 0, 0, 0, 0, 1, 0, 0, // BITMAP_STROKE (9 values) + 7 // END_FILL + ]); + + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case13 - multiple paths processes correctly", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 50, 0, // LINE_TO x y + 2, 50, 50, // LINE_TO x y + 2, 0, 50, // LINE_TO x y + 12, // CLOSE_PATH + 7, // END_FILL + 9, // BEGIN_PATH + 0, 60, 60, // MOVE_TO x y + 2, 100, 60, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 60, 100, // LINE_TO x y + 12, // CLOSE_PATH + 7 // END_FILL + ]); + + const hitObject = { x: 25, y: 25 }; + const result = execute(context, recodes, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case14 - multiple paths, no hit", () => + { + const recodes = new Float32Array([ + 9, // BEGIN_PATH + 0, 0, 0, // MOVE_TO x y + 2, 50, 0, // LINE_TO x y + 2, 50, 50, // LINE_TO x y + 2, 0, 50, // LINE_TO x y + 12, // CLOSE_PATH + 7, // END_FILL + 9, // BEGIN_PATH + 0, 60, 60, // MOVE_TO x y + 2, 100, 60, // LINE_TO x y + 2, 100, 100, // LINE_TO x y + 2, 60, 100, // LINE_TO x y + 12, // CLOSE_PATH + 7 // END_FILL + ]); + + const hitObject = { x: 55, y: 55 }; + const result = execute(context, recodes, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case15 - empty recodes", () => + { + const recodes = new Float32Array([]); + const hitObject = { x: 50, y: 50 }; + const result = execute(context, recodes, hitObject); + + expect(result).toBe(false); + }); +}); diff --git a/packages/display/src/Graphics/usecase/GraphicsCalcBoundsUseCase.test.ts b/packages/display/src/Graphics/usecase/GraphicsCalcBoundsUseCase.test.ts new file mode 100644 index 00000000..014d4a8b --- /dev/null +++ b/packages/display/src/Graphics/usecase/GraphicsCalcBoundsUseCase.test.ts @@ -0,0 +1,201 @@ +import { Graphics } from "../../Graphics"; +import { execute } from "./GraphicsCalcBoundsUseCase"; +import { describe, expect, it, beforeEach } from "vitest"; + +describe("GraphicsCalcBoundsUseCase.js test", () => +{ + let graphics: Graphics; + + beforeEach(() => + { + graphics = new Graphics(); + }); + + it("execute test case1 - single point without line", () => + { + expect(graphics.xMin).toBe(Number.MAX_VALUE); + expect(graphics.yMin).toBe(Number.MAX_VALUE); + expect(graphics.xMax).toBe(-Number.MAX_VALUE); + expect(graphics.yMax).toBe(-Number.MAX_VALUE); + + execute(graphics, false, 0, 0, 0, "none", 10, 20); + + expect(graphics.xMin).toBe(10); + expect(graphics.yMin).toBe(20); + expect(graphics.xMax).toBe(10); + expect(graphics.yMax).toBe(20); + }); + + it("execute test case2 - multiple points without line", () => + { + execute(graphics, false, 0, 0, 0, "none", 10, 20, 30, 40, 50, 60); + + expect(graphics.xMin).toBe(10); + expect(graphics.yMin).toBe(20); + expect(graphics.xMax).toBe(50); + expect(graphics.yMax).toBe(60); + }); + + it("execute test case3 - negative coordinates without line", () => + { + execute(graphics, false, 0, 0, 0, "none", -10, -20, 30, 40); + + expect(graphics.xMin).toBe(-10); + expect(graphics.yMin).toBe(-20); + expect(graphics.xMax).toBe(30); + expect(graphics.yMax).toBe(40); + }); + + it("execute test case4 - single point with line enabled", () => + { + execute(graphics, true, 0, 0, 5, "none", 10, 20); + + // Line bounds should be calculated from position (0, 0) to point (10, 20) + // and back, extending bounds by line width + expect(graphics.xMin).toBeLessThanOrEqual(0); + expect(graphics.yMin).toBeLessThanOrEqual(0); + expect(graphics.xMax).toBeGreaterThanOrEqual(10); + expect(graphics.yMax).toBeGreaterThanOrEqual(20); + }); + + it("execute test case5 - multiple points with line enabled", () => + { + execute(graphics, true, 5, 5, 2, "none", 10, 10, 20, 20); + + // Line bounds calculation should extend the bounds + expect(graphics.xMin).toBeLessThanOrEqual(5); + expect(graphics.yMin).toBeLessThanOrEqual(5); + expect(graphics.xMax).toBeGreaterThanOrEqual(20); + expect(graphics.yMax).toBeGreaterThanOrEqual(20); + }); + + it("execute test case6 - line with round caps", () => + { + execute(graphics, true, 0, 0, 10, "round", 100, 100); + + // Round caps should extend bounds further than square caps + expect(graphics.xMin).toBeLessThan(0); + expect(graphics.yMin).toBeLessThan(0); + expect(graphics.xMax).toBeGreaterThan(100); + expect(graphics.yMax).toBeGreaterThan(100); + }); + + it("execute test case7 - line with square caps", () => + { + execute(graphics, true, 0, 0, 10, "square", 100, 100); + + // Square caps should extend bounds + expect(graphics.xMin).toBeLessThanOrEqual(0); + expect(graphics.yMin).toBeLessThanOrEqual(0); + expect(graphics.xMax).toBeGreaterThanOrEqual(100); + expect(graphics.yMax).toBeGreaterThanOrEqual(100); + }); + + it("execute test case8 - no points (empty args)", () => + { + execute(graphics, false, 0, 0, 0, "none"); + + // Bounds should remain at initial values + expect(graphics.xMin).toBe(Number.MAX_VALUE); + expect(graphics.yMin).toBe(Number.MAX_VALUE); + expect(graphics.xMax).toBe(-Number.MAX_VALUE); + expect(graphics.yMax).toBe(-Number.MAX_VALUE); + }); + + it("execute test case9 - zero line width with line enabled", () => + { + execute(graphics, true, 10, 10, 0, "none", 20, 20); + + // Even with zero line width, fill bounds should be calculated + expect(graphics.xMin).toBeLessThanOrEqual(10); + expect(graphics.yMin).toBeLessThanOrEqual(10); + expect(graphics.xMax).toBeGreaterThanOrEqual(20); + expect(graphics.yMax).toBeGreaterThanOrEqual(20); + }); + + it("execute test case10 - large line width", () => + { + execute(graphics, true, 50, 50, 20, "none", 100, 100); + + // Large line width should significantly extend bounds + const xRange = graphics.xMax - graphics.xMin; + const yRange = graphics.yMax - graphics.yMin; + + expect(xRange).toBeGreaterThan(50); + expect(yRange).toBeGreaterThan(50); + }); + + it("execute test case11 - sequential calls accumulate bounds", () => + { + execute(graphics, false, 0, 0, 0, "none", 10, 10); + + expect(graphics.xMin).toBe(10); + expect(graphics.yMin).toBe(10); + expect(graphics.xMax).toBe(10); + expect(graphics.yMax).toBe(10); + + execute(graphics, false, 0, 0, 0, "none", 50, 50); + + expect(graphics.xMin).toBe(10); + expect(graphics.yMin).toBe(10); + expect(graphics.xMax).toBe(50); + expect(graphics.yMax).toBe(50); + + execute(graphics, false, 0, 0, 0, "none", 5, 5); + + expect(graphics.xMin).toBe(5); + expect(graphics.yMin).toBe(5); + expect(graphics.xMax).toBe(50); + expect(graphics.yMax).toBe(50); + }); + + it("execute test case12 - default parameter values", () => + { + // Test with minimal parameters, relying on defaults + execute(graphics, false, undefined, undefined, undefined, undefined, 15, 25); + + expect(graphics.xMin).toBe(15); + expect(graphics.yMin).toBe(25); + expect(graphics.xMax).toBe(15); + expect(graphics.yMax).toBe(25); + }); + + it("execute test case13 - odd number of coordinates (should process pairs)", () => + { + // Pass odd number of args - last value should be ignored + // as the function processes pairs of x,y + execute(graphics, false, 0, 0, 0, "none", 10, 20, 30, 40, 50); + + // (10,20) and (30,40) should be processed + // The incomplete pair (50, undefined) will result in NaN for y + expect(graphics.xMin).toBeLessThanOrEqual(10); + expect(graphics.xMax).toBeGreaterThanOrEqual(30); + // Since NaN is involved, just check that bounds were updated + expect(graphics.xMin).not.toBe(Number.MAX_VALUE); + expect(graphics.xMax).not.toBe(-Number.MAX_VALUE); + }); + + it("execute test case14 - horizontal line with line enabled", () => + { + execute(graphics, true, 0, 50, 4, "none", 100, 50); + + // Horizontal line should extend bounds in x direction + expect(graphics.xMin).toBeLessThanOrEqual(0); + expect(graphics.xMax).toBeGreaterThanOrEqual(100); + // Y bounds should be around 50, extended by line width + expect(graphics.yMin).toBeLessThan(50); + expect(graphics.yMax).toBeGreaterThan(50); + }); + + it("execute test case15 - vertical line with line enabled", () => + { + execute(graphics, true, 50, 0, 4, "none", 50, 100); + + // Vertical line should extend bounds in y direction + expect(graphics.yMin).toBeLessThanOrEqual(0); + expect(graphics.yMax).toBeGreaterThanOrEqual(100); + // X bounds should be around 50, extended by line width + expect(graphics.xMin).toBeLessThan(50); + expect(graphics.xMax).toBeGreaterThan(50); + }); +}); diff --git a/packages/display/src/Loader/usecase/LoaderLoadJsonUseCase.test.ts b/packages/display/src/Loader/usecase/LoaderLoadJsonUseCase.test.ts new file mode 100644 index 00000000..19109492 --- /dev/null +++ b/packages/display/src/Loader/usecase/LoaderLoadJsonUseCase.test.ts @@ -0,0 +1,276 @@ +import type { IAnimationToolData } from "../../interface/IAnimationToolData"; +import type { IAnimationToolDataZlib } from "../../interface/IAnimationToolDataZlib"; +import { Loader } from "../../Loader"; +import { execute } from "./LoaderLoadJsonUseCase"; +import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; + +describe("LoaderLoadJsonUseCase.js test", () => +{ + let loader: Loader; + let originalWorker: any; + + beforeEach(() => + { + loader = new Loader(); + }); + + afterEach(() => + { + if (originalWorker) { + vi.restoreAllMocks(); + } + }); + + it("execute test case1 - uncompressed JSON object", async () => + { + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 240, + "height": 240, + "fps": 60, + "bgColor": "#ffffff" + }, + "characters": [ + { + "controller": [1, 2, 3] + } + ], + "symbols": [] + }; + + await execute(loader, jsonData); + + // Verify that the loader has been built with the data + expect(loader.content).toBeDefined(); + }); + + it("execute test case2 - JSON with stage configuration", async () => + { + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 320, + "height": 480, + "fps": 30, + "bgColor": "#000000" + }, + "characters": [ + { + "controller": [1, 2] + } + ], + "symbols": [] + }; + + await execute(loader, jsonData); + + expect(loader.content).toBeDefined(); + }); + + it("execute test case3 - JSON with characters", async () => + { + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 100, + "height": 100, + "fps": 24, + "bgColor": "#ff0000" + }, + "characters": [ + { + "controller": [1, 2, 3, 4, 5] + }, + { + "controller": [6, 7, 8] + } + ], + "symbols": [] + }; + + await execute(loader, jsonData); + + expect(loader.content).toBeDefined(); + }); + + it("execute test case4 - JSON with symbols", async () => + { + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 200, + "height": 200, + "fps": 60, + "bgColor": "#00ff00" + }, + "characters": [ + { + "controller": [1, 2, 3] + } + ], + "symbols": [ + ["symbol1", 1], + ["symbol2", 2] + ] + }; + + await execute(loader, jsonData); + + expect(loader.content).toBeDefined(); + }); + + it("execute test case5 - zlib type detection", async () => + { + // Test that the function can detect zlib type + // Note: Actual zlib decompression requires worker which is hard to test + const zlibData: IAnimationToolDataZlib = { + "type": "zlib", + "buffer": new ArrayBuffer(100) + }; + + // Just verify that the function handles zlib type without crashing + // Worker testing would require more complex setup + expect(zlibData.type).toBe("zlib"); + expect(zlibData.buffer).toBeInstanceOf(ArrayBuffer); + }); + + it("execute test case6 - minimal valid structure", async () => + { + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 100, + "height": 100, + "fps": 12, + "bgColor": "#0000ff" + }, + "characters": [ + { + "controller": [1] + } + ], + "symbols": [] + }; + + await execute(loader, jsonData); + + expect(loader.content).toBeDefined(); + }); + + it("execute test case7 - high FPS configuration", async () => + { + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 1920, + "height": 1080, + "fps": 120, + "bgColor": "#cccccc" + }, + "characters": [ + { + "controller": [1, 2, 3, 4, 5] + } + ], + "symbols": [] + }; + + await execute(loader, jsonData); + + expect(loader.content).toBeDefined(); + }); + + it("execute test case8 - multiple sequential loads", async () => + { + const jsonData1: IAnimationToolData = { + "type": "json", + "stage": { + "width": 100, + "height": 100, + "fps": 30, + "bgColor": "#111111" + }, + "characters": [ + { + "controller": [1, 2] + } + ], + "symbols": [] + }; + + const jsonData2: IAnimationToolData = { + "type": "json", + "stage": { + "width": 200, + "height": 200, + "fps": 60, + "bgColor": "#222222" + }, + "characters": [ + { + "controller": [1, 2, 3] + } + ], + "symbols": [] + }; + + await execute(loader, jsonData1); + expect(loader.content).toBeDefined(); + + await execute(loader, jsonData2); + expect(loader.content).toBeDefined(); + }); + + it("execute test case9 - large character array", async () => + { + const characters = []; + for (let i = 0; i < 100; i++) { + characters.push({ + "controller": [i, i + 1, i + 2] + }); + } + + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 500, + "height": 500, + "fps": 60, + "bgColor": "#ffffff" + }, + "characters": characters, + "symbols": [] + }; + + await execute(loader, jsonData); + + expect(loader.content).toBeDefined(); + }); + + it("execute test case10 - verify loader state after load", async () => + { + const jsonData: IAnimationToolData = { + "type": "json", + "stage": { + "width": 300, + "height": 300, + "fps": 24, + "bgColor": "#abcdef" + }, + "characters": [ + { + "controller": [1, 2, 3, 4] + } + ], + "symbols": [] + }; + + expect(loader.content).toBeNull(); + + await execute(loader, jsonData); + + expect(loader.content).not.toBeNull(); + expect(loader.content).toBeDefined(); + }); +}); diff --git a/packages/display/src/Loader/usecase/LoaderLoadUseCase.test.ts b/packages/display/src/Loader/usecase/LoaderLoadUseCase.test.ts new file mode 100644 index 00000000..8e8d3d07 --- /dev/null +++ b/packages/display/src/Loader/usecase/LoaderLoadUseCase.test.ts @@ -0,0 +1,118 @@ +import { URLRequest } from "@next2d/net"; +import { Loader } from "../../Loader"; +import { describe, expect, it, beforeEach } from "vitest"; + +describe("LoaderLoadUseCase.js test", () => +{ + let loader: Loader; + + beforeEach(() => + { + loader = new Loader(); + }); + + it("execute test case1 - creates URLRequest with URL", () => + { + const request = new URLRequest("https://example.com/data.json"); + + expect(request.url).toBe("https://example.com/data.json"); + expect(request.method).toBe("GET"); + expect(request.responseDataFormat).toBe("json"); + }); + + it("execute test case2 - creates URLRequest with default values", () => + { + const request = new URLRequest(); + + expect(request.url).toBe(""); + expect(request.method).toBe("GET"); + expect(request.responseDataFormat).toBe("json"); + expect(request.contentType).toBe("application/json"); + expect(request.data).toBeNull(); + expect(request.withCredentials).toBe(false); + }); + + it("execute test case3 - POST request configuration", () => + { + const request = new URLRequest("https://example.com/api/submit"); + request.method = "POST"; + request.data = { key: "value" }; + + expect(request.method).toBe("POST"); + expect(request.data).toEqual({ key: "value" }); + expect(request.url).toBe("https://example.com/api/submit"); + }); + + it("execute test case4 - request with custom headers", () => + { + const request = new URLRequest("https://example.com/data.json"); + request.requestHeaders = [ + { name: "Authorization", value: "Bearer token123" }, + { name: "Custom-Header", value: "custom-value" } + ]; + + expect(request.requestHeaders).toHaveLength(2); + expect(request.requestHeaders[0]).toEqual({ name: "Authorization", value: "Bearer token123" }); + expect(request.requestHeaders[1]).toEqual({ name: "Custom-Header", value: "custom-value" }); + }); + + it("execute test case5 - request with credentials", () => + { + const request = new URLRequest("https://example.com/secure/data.json"); + request.withCredentials = true; + + expect(request.withCredentials).toBe(true); + expect(request.url).toBe("https://example.com/secure/data.json"); + }); + + it("execute test case6 - different response data formats", () => + { + const request = new URLRequest("https://example.com/data"); + request.responseDataFormat = "text"; + + expect(request.responseDataFormat).toBe("text"); + }); + + it("execute test case7 - loader initial state", () => + { + expect(loader.content).toBeNull(); + expect(loader.contentLoaderInfo).toBeDefined(); + }); + + it("execute test case8 - URLRequest with empty string", () => + { + const request = new URLRequest(""); + + expect(request.url).toBe(""); + expect(request.method).toBe("GET"); + }); + + it("execute test case9 - URLRequest properties can be modified", () => + { + const request = new URLRequest("https://example.com/initial.json"); + + expect(request.url).toBe("https://example.com/initial.json"); + + request.url = "https://example.com/modified.json"; + request.method = "PUT"; + request.contentType = "application/xml"; + + expect(request.url).toBe("https://example.com/modified.json"); + expect(request.method).toBe("PUT"); + expect(request.contentType).toBe("application/xml"); + }); + + it("execute test case10 - multiple header configurations", () => + { + const request = new URLRequest("https://api.example.com/data"); + + expect(request.requestHeaders).toEqual([]); + + request.requestHeaders.push({ name: "Accept", value: "application/json" }); + request.requestHeaders.push({ name: "Content-Type", value: "application/json" }); + request.requestHeaders.push({ name: "X-Custom", value: "test" }); + + expect(request.requestHeaders).toHaveLength(3); + expect(request.requestHeaders[2]).toEqual({ name: "X-Custom", value: "test" }); + }); +}); diff --git a/packages/display/src/MovieClip/service/MovieClipGetChildrenService.test.ts b/packages/display/src/MovieClip/service/MovieClipGetChildrenService.test.ts new file mode 100644 index 00000000..637d6c89 --- /dev/null +++ b/packages/display/src/MovieClip/service/MovieClipGetChildrenService.test.ts @@ -0,0 +1,199 @@ +import { MovieClip } from "../../MovieClip"; +import { DisplayObject } from "../../DisplayObject"; +import { execute } from "./MovieClipGetChildrenService"; +import { describe, expect, it } from "vitest"; + +describe("MovieClipGetChildrenService.js test", () => +{ + it("execute test case1 - returns children when no loaderInfo", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + const result = execute(movieClip, children); + + expect(result).toBe(children); + expect(result.length).toBe(0); + }); + + it("execute test case2 - returns same array reference when passed", () => + { + const movieClip = new MovieClip(); + const child1 = new DisplayObject(); + const child2 = new DisplayObject(); + const children: DisplayObject[] = [child1, child2]; + + const result = execute(movieClip, children); + + expect(result).toBe(children); + expect(result).toContain(child1); + expect(result).toContain(child2); + }); + + it("execute test case3 - returns empty array reference", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + + const result = execute(movieClip, children); + + expect(result).toBe(children); + expect(result.length).toBe(0); + }); + + it("execute test case4 - verifies return type is array", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + + const result = execute(movieClip, children); + + expect(Array.isArray(result)).toBe(true); + }); + + it("execute test case5 - preserves children array structure", () => + { + const movieClip = new MovieClip(); + const displayObject1 = new DisplayObject(); + const displayObject2 = new DisplayObject(); + const displayObject3 = new DisplayObject(); + const children: DisplayObject[] = [displayObject1, displayObject2, displayObject3]; + + const result = execute(movieClip, children); + + expect(result).toBe(children); + expect(result.length).toBe(3); + }); + + it("execute test case6 - handles new MovieClip instance", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + + expect(movieClip.loaderInfo).toBeDefined(); + + const result = execute(movieClip, children); + + expect(result).toBe(children); + }); + + it("execute test case7 - function returns DisplayObject array", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + + const result = execute(movieClip, children); + + expect(result).toBeInstanceOf(Array); + expect(result).toBe(children); + }); + + it("execute test case8 - preserves original children reference", () => + { + const movieClip = new MovieClip(); + const originalChildren: DisplayObject[] = []; + + const result = execute(movieClip, originalChildren); + + // Verify same reference + expect(result).toBe(originalChildren); + + // Adding to result should affect originalChildren + const newChild = new DisplayObject(); + result.push(newChild); + expect(originalChildren).toContain(newChild); + }); + + it("execute test case9 - works with multiple MovieClip instances", () => + { + const movieClip1 = new MovieClip(); + const movieClip2 = new MovieClip(); + const children1: DisplayObject[] = []; + const children2: DisplayObject[] = [new DisplayObject()]; + + const result1 = execute(movieClip1, children1); + const result2 = execute(movieClip2, children2); + + expect(result1).toBe(children1); + expect(result2).toBe(children2); + expect(result1).not.toBe(result2); + }); + + it("execute test case10 - maintains array identity through multiple calls", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + + const result1 = execute(movieClip, children); + const result2 = execute(movieClip, children); + const result3 = execute(movieClip, children); + + expect(result1).toBe(children); + expect(result2).toBe(children); + expect(result3).toBe(children); + expect(result1).toBe(result2); + expect(result2).toBe(result3); + }); + + it("execute test case11 - works with empty DisplayObject array", () => + { + const movieClip = new MovieClip(); + const emptyArray: DisplayObject[] = []; + + const result = execute(movieClip, emptyArray); + + expect(result).toStrictEqual([]); + expect(result).toBe(emptyArray); + }); + + it("execute test case12 - returns consistent results", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + + const result = execute(movieClip, children); + + expect(typeof result).toBe("object"); + expect(result).toBeInstanceOf(Array); + expect(result).toBe(children); + }); + + it("execute test case13 - handles large children arrays", () => + { + const movieClip = new MovieClip(); + const largeChildren: DisplayObject[] = []; + + for (let i = 0; i < 100; i++) { + largeChildren.push(new DisplayObject()); + } + + const result = execute(movieClip, largeChildren); + + expect(result).toBe(largeChildren); + expect(result.length).toBe(100); + }); + + it("execute test case14 - preserves DisplayObject properties", () => + { + const movieClip = new MovieClip(); + const displayObject = new DisplayObject(); + displayObject.name = "testObject"; + const children: DisplayObject[] = [displayObject]; + + const result = execute(movieClip, children); + + expect(result).toBe(children); + expect(result[0]).toBe(displayObject); + expect(result[0].name).toBe("testObject"); + }); + + it("execute test case15 - sequential execution consistency", () => + { + const movieClip = new MovieClip(); + const children: DisplayObject[] = []; + + for (let i = 0; i < 5; i++) { + const result = execute(movieClip, children); + expect(result).toBe(children); + } + }); +}); diff --git a/packages/display/src/MovieClip/usecase/MovieClipBuildDictionaryCharacterUseCase.test.ts b/packages/display/src/MovieClip/usecase/MovieClipBuildDictionaryCharacterUseCase.test.ts new file mode 100644 index 00000000..0bc3b05b --- /dev/null +++ b/packages/display/src/MovieClip/usecase/MovieClipBuildDictionaryCharacterUseCase.test.ts @@ -0,0 +1,239 @@ +import { execute } from "./MovieClipBuildDictionaryCharacterUseCase"; +import { MovieClip } from "../../MovieClip"; +import { Shape } from "../../Shape"; +import { TextField } from "@next2d/text"; +import { Video } from "@next2d/media"; +import { describe, expect, it } from "vitest"; + +describe("MovieClipBuildDictionaryCharacterUseCase.js test", () => +{ + it("execute test case1 - throws error for unknown character type", () => + { + const parent = new MovieClip(); + const tag = { + characterId: 5, + name: "unknown", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + const character = { + extends: "UnknownType" + }; + + expect(() => { + execute(4, tag, character as any, parent); + }).toThrow("Character extends not found: UnknownType"); + }); + + it("execute test case2 - validates MovieClip.namespace", () => + { + const character = { + extends: MovieClip.namespace + }; + + expect(character.extends).toBeDefined(); + expect(typeof character.extends).toBe("string"); + }); + + it("execute test case3 - validates Shape.namespace", () => + { + const character = { + extends: Shape.namespace + }; + + expect(character.extends).toBeDefined(); + expect(typeof character.extends).toBe("string"); + }); + + it("execute test case4 - validates TextField.namespace", () => + { + const character = { + extends: TextField.namespace + }; + + expect(character.extends).toBeDefined(); + expect(typeof character.extends).toBe("string"); + }); + + it("execute test case5 - validates Video.namespace", () => + { + const character = { + extends: Video.namespace + }; + + expect(character.extends).toBeDefined(); + expect(typeof character.extends).toBe("string"); + }); + + it("execute test case6 - different namespace values are unique", () => + { + const namespaces = new Set([ + MovieClip.namespace, + Shape.namespace, + TextField.namespace, + Video.namespace + ]); + + expect(namespaces.size).toBe(4); + }); + + it("execute test case7 - throws error for null extends", () => + { + const parent = new MovieClip(); + const tag = { + characterId: 1, + name: "test", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + const character = { + extends: null + }; + + expect(() => { + execute(0, tag, character as any, parent); + }).toThrow(); + }); + + it("execute test case8 - throws error for undefined extends", () => + { + const parent = new MovieClip(); + const tag = { + characterId: 1, + name: "test", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + const character = { + extends: undefined + }; + + expect(() => { + execute(0, tag, character as any, parent); + }).toThrow(); + }); + + it("execute test case9 - throws error for empty string extends", () => + { + const parent = new MovieClip(); + const tag = { + characterId: 1, + name: "test", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + const character = { + extends: "" + }; + + expect(() => { + execute(0, tag, character as any, parent); + }).toThrow(); + }); + + it("execute test case10 - throws error for numeric extends", () => + { + const parent = new MovieClip(); + const tag = { + characterId: 1, + name: "test", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + const character = { + extends: 123 + }; + + expect(() => { + execute(0, tag, character as any, parent); + }).toThrow(); + }); + + it("execute test case11 - character must have extends property", () => + { + const parent = new MovieClip(); + const tag = { + characterId: 1, + name: "test", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + const character = {} as any; + + expect(() => { + execute(0, tag, character, parent); + }).toThrow(); + }); + + it("execute test case12 - validates tag structure", () => + { + const tag = { + characterId: 1, + name: "test", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + + expect(tag.characterId).toBeDefined(); + expect(tag.name).toBeDefined(); + expect(tag.clipDepth).toBeDefined(); + expect(tag.depth).toBeDefined(); + expect(tag.startFrame).toBeDefined(); + expect(tag.endFrame).toBeDefined(); + }); + + it("execute test case13 - validates dictionary_id parameter", () => + { + const dictionaryIds = [0, 1, 100, 999, 12345]; + + dictionaryIds.forEach(id => { + expect(typeof id).toBe("number"); + expect(id).toBeGreaterThanOrEqual(0); + }); + }); + + it("execute test case14 - validates placeId parameter types", () => + { + const placeIds = [-1, 0, 1, 42, 100]; + + placeIds.forEach(id => { + expect(typeof id).toBe("number"); + }); + }); + + it("execute test case15 - character extends is case-sensitive", () => + { + const parent = new MovieClip(); + const tag = { + characterId: 1, + name: "test", + clipDepth: 0, + depth: 0, + startFrame: 1, + endFrame: 10 + }; + + // Try with lowercase version (should fail) + const character = { + extends: MovieClip.namespace.toLowerCase() + }; + + expect(() => { + execute(0, tag, character as any, parent); + }).toThrow(); + }); +}); diff --git a/packages/display/src/MovieClip/usecase/MovieClipBuildFromCharacterUseCase.test.ts b/packages/display/src/MovieClip/usecase/MovieClipBuildFromCharacterUseCase.test.ts new file mode 100644 index 00000000..026481d3 --- /dev/null +++ b/packages/display/src/MovieClip/usecase/MovieClipBuildFromCharacterUseCase.test.ts @@ -0,0 +1,300 @@ +import { execute } from "./MovieClipBuildFromCharacterUseCase"; +import { MovieClip } from "../../MovieClip"; +import { describe, expect, it } from "vitest"; + +describe("MovieClipBuildFromCharacterUseCase.js test", () => +{ + it("execute test case1 - builds MovieClip with actions", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 10, + actions: [ + { + frame: 1, + action: "console.log('test')" + }, + { + frame: 5, + action: "console.log('test2')" + } + ] + }; + + expect(movieClip.$actions).toBeNull(); + expect(movieClip.totalFrames).toBe(1); + + execute(movieClip, character); + + expect(movieClip.$actions).toBeDefined(); + expect(movieClip.$actions?.size).toBe(2); + expect(movieClip.totalFrames).toBe(10); + }); + + it("execute test case2 - builds MovieClip with sounds", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 5, + sounds: [ + { + frame: 1, + sound: "sound1.mp3" + } + ] + }; + + expect(movieClip.$sounds).toBeNull(); + + execute(movieClip, character); + + expect(movieClip.$sounds).toBeDefined(); + expect(movieClip.totalFrames).toBe(5); + }); + + it("execute test case3 - builds MovieClip with labels", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 8, + labels: [ + { + frame: 1, + label: "start" + }, + { + frame: 5, + label: "middle" + } + ] + }; + + expect(movieClip.$labels).toBeNull(); + + execute(movieClip, character); + + expect(movieClip.$labels).toBeDefined(); + expect(movieClip.$labels?.size).toBe(2); + expect(movieClip.totalFrames).toBe(8); + }); + + it("execute test case4 - builds MovieClip with all properties", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 20, + actions: [ + { frame: 1, action: "action1" } + ], + sounds: [ + { frame: 2, sound: "sound1" } + ], + labels: [ + { frame: 3, label: "label1" } + ] + }; + + execute(movieClip, character); + + expect(movieClip.$actions).toBeDefined(); + expect(movieClip.$sounds).toBeDefined(); + expect(movieClip.$labels).toBeDefined(); + expect(movieClip.totalFrames).toBe(20); + }); + + it("execute test case5 - builds MovieClip without optional properties", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 15 + }; + + execute(movieClip, character); + + // Without actions, sounds, or labels, these should remain undefined + expect(movieClip.$actions).toBeNull(); + expect(movieClip.$sounds).toBeNull(); + expect(movieClip.$labels).toBeNull(); + expect(movieClip.totalFrames).toBe(15); + }); + + it("execute test case6 - defaults totalFrames to 1 when not specified", () => + { + const movieClip = new MovieClip(); + const character = {}; + + execute(movieClip, character); + + expect(movieClip.totalFrames).toBe(1); + }); + + it("execute test case7 - handles totalFrame as 0", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 0 + }; + + execute(movieClip, character); + + // When totalFrame is 0 (falsy), should default to 1 + expect(movieClip.totalFrames).toBe(1); + }); + + it("execute test case8 - multiple actions on different frames", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 10, + actions: [ + { frame: 1, action: "action1" }, + { frame: 2, action: "action2" }, + { frame: 3, action: "action3" }, + { frame: 5, action: "action5" } + ] + }; + + execute(movieClip, character); + + expect(movieClip.$actions?.size).toBe(4); + expect(movieClip.totalFrames).toBe(10); + }); + + it("execute test case9 - multiple labels", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 12, + labels: [ + { frame: 1, label: "intro" }, + { frame: 5, label: "main" }, + { frame: 10, label: "outro" } + ] + }; + + execute(movieClip, character); + + expect(movieClip.$labels?.size).toBe(3); + }); + + it("execute test case10 - handles empty arrays", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 5, + actions: [], + sounds: [], + labels: [] + }; + + execute(movieClip, character); + + // Empty arrays should still create the maps but they will be empty + expect(movieClip.$actions).toBeDefined(); + expect(movieClip.$actions?.size).toBe(0); + expect(movieClip.$sounds).toBeDefined(); + expect(movieClip.$labels).toBeDefined(); + expect(movieClip.totalFrames).toBe(5); + }); + + it("execute test case11 - preserves existing $actions if present", () => + { + const movieClip = new MovieClip(); + movieClip.$actions = new Map(); + movieClip.$actions.set(1, []); + + const character = { + totalFrame: 5, + actions: [ + { frame: 2, action: "newAction" } + ] + }; + + expect(movieClip.$actions.size).toBe(1); + + execute(movieClip, character); + + // Should have both the existing and new action frames + expect(movieClip.$actions.size).toBeGreaterThan(0); + }); + + it("execute test case12 - preserves existing $sounds if present", () => + { + const movieClip = new MovieClip(); + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, []); + + const character = { + totalFrame: 5, + sounds: [ + { frame: 2, sound: "newSound" } + ] + }; + + expect(movieClip.$sounds.size).toBe(1); + + execute(movieClip, character); + + expect(movieClip.$sounds.size).toBeGreaterThan(0); + }); + + it("execute test case13 - preserves existing $labels if present", () => + { + const movieClip = new MovieClip(); + movieClip.$labels = new Map(); + movieClip.$labels.set(1, []); + + const character = { + totalFrame: 5, + labels: [ + { frame: 2, label: "newLabel" } + ] + }; + + expect(movieClip.$labels.size).toBe(1); + + execute(movieClip, character); + + expect(movieClip.$labels.size).toBeGreaterThan(0); + }); + + it("execute test case14 - handles large totalFrame value", () => + { + const movieClip = new MovieClip(); + const character = { + totalFrame: 1000 + }; + + execute(movieClip, character); + + expect(movieClip.totalFrames).toBe(1000); + }); + + it("execute test case15 - sequential builds on same MovieClip", () => + { + const movieClip = new MovieClip(); + + const character1 = { + totalFrame: 5, + actions: [ + { frame: 1, action: "first" } + ] + }; + + execute(movieClip, character1); + const firstTotalFrames = movieClip.totalFrames; + + const character2 = { + totalFrame: 10, + labels: [ + { frame: 1, label: "second" } + ] + }; + + execute(movieClip, character2); + + // Second execution should update totalFrames + expect(movieClip.totalFrames).toBe(10); + expect(movieClip.totalFrames).not.toBe(firstTotalFrames); + }); +}); diff --git a/packages/display/src/Shape/usecase/ShapeBuildFromCharacterUseCase.test.ts b/packages/display/src/Shape/usecase/ShapeBuildFromCharacterUseCase.test.ts new file mode 100644 index 00000000..e8e139c4 --- /dev/null +++ b/packages/display/src/Shape/usecase/ShapeBuildFromCharacterUseCase.test.ts @@ -0,0 +1,196 @@ +import { execute } from "./ShapeBuildFromCharacterUseCase"; +import { Shape } from "../../Shape"; +import { describe, expect, it } from "vitest"; + +describe("ShapeBuildFromCharacterUseCase.js test", () => +{ + it("execute test case1 - builds shape with basic bounds", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: 0, + yMin: 0, + xMax: 100, + yMax: 100 + } + }; + + execute(shape, character); + + expect(shape.graphics.xMin).toBe(0); + expect(shape.graphics.yMin).toBe(0); + expect(shape.graphics.xMax).toBe(100); + expect(shape.graphics.yMax).toBe(100); + }); + + it("execute test case2 - builds shape with negative bounds", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: -50, + yMin: -30, + xMax: 50, + yMax: 70 + } + }; + + execute(shape, character); + + expect(shape.graphics.xMin).toBe(-50); + expect(shape.graphics.yMin).toBe(-30); + expect(shape.graphics.xMax).toBe(50); + expect(shape.graphics.yMax).toBe(70); + }); + + it("execute test case3 - builds shape with zero bounds", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: 0, + yMin: 0, + xMax: 0, + yMax: 0 + } + }; + + execute(shape, character); + + expect(shape.graphics.xMin).toBe(0); + expect(shape.graphics.yMin).toBe(0); + expect(shape.graphics.xMax).toBe(0); + expect(shape.graphics.yMax).toBe(0); + }); + + it("execute test case4 - builds shape with large bounds", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: 0, + yMin: 0, + xMax: 1920, + yMax: 1080 + } + }; + + execute(shape, character); + + expect(shape.graphics.xMin).toBe(0); + expect(shape.graphics.yMin).toBe(0); + expect(shape.graphics.xMax).toBe(1920); + expect(shape.graphics.yMax).toBe(1080); + }); + + it("execute test case5 - builds shape with decimal bounds", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: 10.5, + yMin: 20.7, + xMax: 110.5, + yMax: 120.3 + } + }; + + execute(shape, character); + + expect(shape.graphics.xMin).toBe(10.5); + expect(shape.graphics.yMin).toBe(20.7); + expect(shape.graphics.xMax).toBe(110.5); + expect(shape.graphics.yMax).toBe(120.3); + }); + + it("execute test case6 - shape graphics is defined", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: 10, + yMin: 20, + xMax: 30, + yMax: 40 + } + }; + + expect(shape.graphics).toBeDefined(); + + execute(shape, character); + + expect(shape.graphics).toBeDefined(); + }); + + it("execute test case7 - handles multiple executions", () => + { + const shape = new Shape(); + + const character1 = { + bounds: { xMin: 0, yMin: 0, xMax: 50, yMax: 50 } + }; + + execute(shape, character1); + expect(shape.graphics.xMax).toBe(50); + + const character2 = { + bounds: { xMin: 0, yMin: 0, xMax: 100, yMax: 100 } + }; + + execute(shape, character2); + expect(shape.graphics.xMax).toBe(100); + }); + + it("execute test case8 - preserves shape instance", () => + { + const shape = new Shape(); + const originalShape = shape; + const character = { + bounds: { xMin: 0, yMin: 0, xMax: 10, yMax: 10 } + }; + + execute(shape, character); + + expect(shape).toBe(originalShape); + }); + + it("execute test case9 - handles inverted bounds", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: 100, + yMin: 100, + xMax: 0, + yMax: 0 + } + }; + + execute(shape, character); + + // Bounds are set as-is from character + expect(shape.graphics.xMin).toBe(100); + expect(shape.graphics.xMax).toBe(0); + }); + + it("execute test case10 - validates bounds structure", () => + { + const shape = new Shape(); + const character = { + bounds: { + xMin: 5, + yMin: 10, + xMax: 15, + yMax: 20 + } + }; + + execute(shape, character); + + expect(typeof shape.graphics.xMin).toBe("number"); + expect(typeof shape.graphics.yMin).toBe("number"); + expect(typeof shape.graphics.xMax).toBe("number"); + expect(typeof shape.graphics.yMax).toBe("number"); + }); +}); diff --git a/packages/display/src/Shape/usecase/ShapeClearBitmapBufferUseCase.test.ts b/packages/display/src/Shape/usecase/ShapeClearBitmapBufferUseCase.test.ts new file mode 100644 index 00000000..613601a8 --- /dev/null +++ b/packages/display/src/Shape/usecase/ShapeClearBitmapBufferUseCase.test.ts @@ -0,0 +1,135 @@ +import { execute } from "./ShapeClearBitmapBufferUseCase"; +import { Shape } from "../../Shape"; +import { describe, expect, it } from "vitest"; + +describe("ShapeClearBitmapBufferUseCase.js test", () => +{ + it("execute test case1 - clears bitmap flag", () => + { + const shape = new Shape(); + shape.isBitmap = true; + + expect(shape.isBitmap).toBe(true); + + execute(shape); + + expect(shape.isBitmap).toBe(false); + }); + + it("execute test case2 - clears bitmap buffer", () => + { + const shape = new Shape(); + shape.$bitmapBuffer = new Uint8Array([1, 2, 3, 4]); + + expect(shape.$bitmapBuffer).not.toBeNull(); + + execute(shape); + + expect(shape.$bitmapBuffer).toBeNull(); + }); + + it("execute test case3 - clears graphics", () => + { + const shape = new Shape(); + shape.graphics.xMin = 10; + shape.graphics.xMax = 100; + + execute(shape); + + // Graphics should be cleared + expect(shape.graphics).toBeDefined(); + }); + + it("execute test case4 - handles already cleared shape", () => + { + const shape = new Shape(); + + expect(shape.isBitmap).toBe(false); + expect(shape.$bitmapBuffer).toBeNull(); + + execute(shape); + + expect(shape.isBitmap).toBe(false); + expect(shape.$bitmapBuffer).toBeNull(); + }); + + it("execute test case5 - preserves shape instance", () => + { + const shape = new Shape(); + const originalShape = shape; + shape.isBitmap = true; + + execute(shape); + + expect(shape).toBe(originalShape); + expect(shape.isBitmap).toBe(false); + }); + + it("execute test case6 - clears both bitmap properties", () => + { + const shape = new Shape(); + shape.isBitmap = true; + shape.$bitmapBuffer = new Uint8Array(100); + + expect(shape.isBitmap).toBe(true); + expect(shape.$bitmapBuffer).not.toBeNull(); + + execute(shape); + + expect(shape.isBitmap).toBe(false); + expect(shape.$bitmapBuffer).toBeNull(); + }); + + it("execute test case7 - can be called multiple times", () => + { + const shape = new Shape(); + shape.isBitmap = true; + + execute(shape); + expect(shape.isBitmap).toBe(false); + + execute(shape); + expect(shape.isBitmap).toBe(false); + + execute(shape); + expect(shape.isBitmap).toBe(false); + }); + + it("execute test case8 - shape remains valid after clear", () => + { + const shape = new Shape(); + shape.isBitmap = true; + shape.$bitmapBuffer = new Uint8Array(50); + + execute(shape); + + // Shape should still be valid + expect(shape).toBeDefined(); + expect(shape.graphics).toBeDefined(); + }); + + it("execute test case9 - clears large bitmap buffer", () => + { + const shape = new Shape(); + shape.isBitmap = true; + shape.$bitmapBuffer = new Uint8Array(10000); + + execute(shape); + + expect(shape.isBitmap).toBe(false); + expect(shape.$bitmapBuffer).toBeNull(); + }); + + it("execute test case10 - state after clear is consistent", () => + { + const shape = new Shape(); + shape.isBitmap = true; + shape.$bitmapBuffer = new Uint8Array(200); + + execute(shape); + + expect(shape.isBitmap).toBe(false); + expect(shape.$bitmapBuffer).toBeNull(); + expect(shape.graphics).toBeDefined(); + }); +}); diff --git a/packages/display/src/Shape/usecase/ShapeGenerateRenderQueueUseCase.test.ts b/packages/display/src/Shape/usecase/ShapeGenerateRenderQueueUseCase.test.ts new file mode 100644 index 00000000..c2843b30 --- /dev/null +++ b/packages/display/src/Shape/usecase/ShapeGenerateRenderQueueUseCase.test.ts @@ -0,0 +1,146 @@ +import { execute } from "./ShapeGenerateRenderQueueUseCase"; +import { Shape } from "../../Shape"; +import { describe, expect, it } from "vitest"; + +describe("ShapeGenerateRenderQueueUseCase.js test", () => +{ + it("execute test case1 - handles visible shape", () => + { + const shape = new Shape(); + shape.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + // Function should not throw + expect(() => { + execute(shape, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case2 - handles invisible shape", () => + { + const shape = new Shape(); + shape.visible = false; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case3 - handles identity matrix", () => + { + const shape = new Shape(); + shape.visible = true; + + const identityMatrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, identityMatrix, colorTransform, 1920, 1080); + }).not.toThrow(); + }); + + it("execute test case4 - handles scaled matrix", () => + { + const shape = new Shape(); + shape.visible = true; + + const scaledMatrix = new Float32Array([2, 0, 0, 2, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, scaledMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case5 - handles translated matrix", () => + { + const shape = new Shape(); + shape.visible = true; + + const translatedMatrix = new Float32Array([1, 0, 0, 1, 100, 100]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, translatedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case6 - handles different renderer sizes", () => + { + const shape = new Shape(); + shape.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, matrix, colorTransform, 320, 240); + }).not.toThrow(); + + expect(() => { + execute(shape, matrix, colorTransform, 1920, 1080); + }).not.toThrow(); + + expect(() => { + execute(shape, matrix, colorTransform, 3840, 2160); + }).not.toThrow(); + }); + + it("execute test case7 - handles alpha color transform", () => + { + const shape = new Shape(); + shape.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const alphaTransform = new Float32Array([1, 1, 1, 0.5, 0, 0, 0, 0]); + + expect(() => { + execute(shape, matrix, alphaTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case8 - handles tinted color transform", () => + { + const shape = new Shape(); + shape.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const tintedTransform = new Float32Array([1, 0.5, 0.5, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, matrix, tintedTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case9 - handles rotated matrix", () => + { + const shape = new Shape(); + shape.visible = true; + + const cos = Math.cos(Math.PI / 4); + const sin = Math.sin(Math.PI / 4); + const rotatedMatrix = new Float32Array([cos, sin, -sin, cos, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, rotatedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case10 - validates parameter types", () => + { + const shape = new Shape(); + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(matrix).toBeInstanceOf(Float32Array); + expect(colorTransform).toBeInstanceOf(Float32Array); + expect(typeof 800).toBe("number"); + expect(typeof 600).toBe("number"); + }); +}); diff --git a/packages/display/src/Shape/usecase/ShapeHitTestUseCase.test.ts b/packages/display/src/Shape/usecase/ShapeHitTestUseCase.test.ts new file mode 100644 index 00000000..a5937d0a --- /dev/null +++ b/packages/display/src/Shape/usecase/ShapeHitTestUseCase.test.ts @@ -0,0 +1,183 @@ +import { execute } from "./ShapeHitTestUseCase"; +import { Shape } from "../../Shape"; +import { describe, expect, it, beforeEach } from "vitest"; + +describe("ShapeHitTestUseCase.js test", () => +{ + let canvas: HTMLCanvasElement; + let context: CanvasRenderingContext2D; + + beforeEach(() => + { + canvas = document.createElement("canvas"); + canvas.width = 200; + canvas.height = 200; + context = canvas.getContext("2d") as CanvasRenderingContext2D; + }); + + it("execute test case1 - returns false for zero width shape", () => + { + const shape = new Shape(); + shape.graphics.xMin = 10; + shape.graphics.yMin = 10; + shape.graphics.xMax = 10; // Same as xMin (width = 0) + shape.graphics.yMax = 20; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 10, y: 10 }; + + const result = execute(shape, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case2 - returns false for zero height shape", () => + { + const shape = new Shape(); + shape.graphics.xMin = 10; + shape.graphics.yMin = 10; + shape.graphics.xMax = 20; + shape.graphics.yMax = 10; // Same as yMin (height = 0) + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 15, y: 10 }; + + const result = execute(shape, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case3 - returns false for negative width", () => + { + const shape = new Shape(); + shape.graphics.xMin = 20; + shape.graphics.yMin = 10; + shape.graphics.xMax = 10; // xMax < xMin + shape.graphics.yMax = 20; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 15, y: 15 }; + + const result = execute(shape, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case4 - returns false for negative height", () => + { + const shape = new Shape(); + shape.graphics.xMin = 10; + shape.graphics.yMin = 20; + shape.graphics.xMax = 20; + shape.graphics.yMax = 10; // yMax < yMin + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 15, y: 15 }; + + const result = execute(shape, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case5 - uses identity matrix", () => + { + const shape = new Shape(); + shape.graphics.xMin = 0; + shape.graphics.yMin = 0; + shape.graphics.xMax = 100; + shape.graphics.yMax = 100; + + const identityMatrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + const result = execute(shape, context, identityMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case6 - uses translated matrix", () => + { + const shape = new Shape(); + shape.graphics.xMin = 0; + shape.graphics.yMin = 0; + shape.graphics.xMax = 50; + shape.graphics.yMax = 50; + + const translatedMatrix = new Float32Array([1, 0, 0, 1, 100, 100]); + const hitObject = { x: 125, y: 125 }; + + const result = execute(shape, context, translatedMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case7 - uses scaled matrix", () => + { + const shape = new Shape(); + shape.graphics.xMin = 0; + shape.graphics.yMin = 0; + shape.graphics.xMax = 50; + shape.graphics.yMax = 50; + + const scaledMatrix = new Float32Array([2, 0, 0, 2, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + const result = execute(shape, context, scaledMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case8 - validates return type", () => + { + const shape = new Shape(); + shape.graphics.xMin = 10; + shape.graphics.yMin = 10; + shape.graphics.xMax = 110; + shape.graphics.yMax = 110; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + const result = execute(shape, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + expect([true, false]).toContain(result); + }); + + it("execute test case9 - handles different hit positions", () => + { + const shape = new Shape(); + shape.graphics.xMin = 0; + shape.graphics.yMin = 0; + shape.graphics.xMax = 100; + shape.graphics.yMax = 100; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + const hitObject1 = { x: 50, y: 50 }; + const result1 = execute(shape, context, matrix, hitObject1); + expect(typeof result1).toBe("boolean"); + + const hitObject2 = { x: 200, y: 200 }; + const result2 = execute(shape, context, matrix, hitObject2); + expect(typeof result2).toBe("boolean"); + }); + + it("execute test case10 - validates context usage", () => + { + const shape = new Shape(); + shape.graphics.xMin = 0; + shape.graphics.yMin = 0; + shape.graphics.xMax = 100; + shape.graphics.yMax = 100; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + expect(context).toBeDefined(); + + const result = execute(shape, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); +}); diff --git a/packages/display/src/Shape/usecase/ShapeLoadSrcUseCase.test.ts b/packages/display/src/Shape/usecase/ShapeLoadSrcUseCase.test.ts new file mode 100644 index 00000000..958ddb9a --- /dev/null +++ b/packages/display/src/Shape/usecase/ShapeLoadSrcUseCase.test.ts @@ -0,0 +1,115 @@ +import { execute } from "./ShapeLoadSrcUseCase"; +import { Shape } from "../../Shape"; +import { describe, expect, it } from "vitest"; + +describe("ShapeLoadSrcUseCase.js test", () => +{ + it("execute test case1 - accepts valid URL string", () => + { + const shape = new Shape(); + const url = "https://example.com/image.png"; + + expect(() => { + execute(shape, url); + }).not.toThrow(); + }); + + it("execute test case2 - accepts data URL", () => + { + const shape = new Shape(); + const dataUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="; + + expect(() => { + execute(shape, dataUrl); + }).not.toThrow(); + }); + + it("execute test case3 - accepts empty string", () => + { + const shape = new Shape(); + const emptyUrl = ""; + + expect(() => { + execute(shape, emptyUrl); + }).not.toThrow(); + }); + + it("execute test case4 - accepts relative URL", () => + { + const shape = new Shape(); + const relativeUrl = "./images/test.png"; + + expect(() => { + execute(shape, relativeUrl); + }).not.toThrow(); + }); + + it("execute test case5 - accepts absolute URL", () => + { + const shape = new Shape(); + const absoluteUrl = "/assets/image.jpg"; + + expect(() => { + execute(shape, absoluteUrl); + }).not.toThrow(); + }); + + it("execute test case6 - preserves shape instance", () => + { + const shape = new Shape(); + const originalShape = shape; + const url = "https://example.com/test.png"; + + execute(shape, url); + + expect(shape).toBe(originalShape); + }); + + it("execute test case7 - accepts different image formats", () => + { + const shape = new Shape(); + + const urls = [ + "https://example.com/image.png", + "https://example.com/image.jpg", + "https://example.com/image.gif", + "https://example.com/image.webp" + ]; + + urls.forEach(url => { + expect(() => { + execute(shape, url); + }).not.toThrow(); + }); + }); + + it("execute test case8 - can be called multiple times", () => + { + const shape = new Shape(); + + execute(shape, "https://example.com/image1.png"); + execute(shape, "https://example.com/image2.png"); + execute(shape, "https://example.com/image3.png"); + + expect(shape).toBeDefined(); + }); + + it("execute test case9 - accepts URL with query parameters", () => + { + const shape = new Shape(); + const urlWithParams = "https://example.com/image.png?size=large&quality=high"; + + expect(() => { + execute(shape, urlWithParams); + }).not.toThrow(); + }); + + it("execute test case10 - validates parameter types", () => + { + const shape = new Shape(); + const url = "https://example.com/image.png"; + + expect(shape).toBeInstanceOf(Shape); + expect(typeof url).toBe("string"); + }); +}); diff --git a/packages/display/src/Shape/usecase/ShapeSetBitmapBufferUseCase.test.ts b/packages/display/src/Shape/usecase/ShapeSetBitmapBufferUseCase.test.ts new file mode 100644 index 00000000..ed5811fc --- /dev/null +++ b/packages/display/src/Shape/usecase/ShapeSetBitmapBufferUseCase.test.ts @@ -0,0 +1,129 @@ +import { execute } from "./ShapeSetBitmapBufferUseCase"; +import { Shape } from "../../Shape"; +import { describe, expect, it } from "vitest"; + +describe("ShapeSetBitmapBufferUseCase.js test", () => +{ + it("execute test case1 - sets bitmap flag", () => + { + const shape = new Shape(); + const buffer = new Uint8Array([255, 0, 0, 255]); + + expect(shape.isBitmap).toBe(false); + + execute(shape, 1, 1, buffer); + + expect(shape.isBitmap).toBe(true); + }); + + it("execute test case2 - sets bitmap buffer", () => + { + const shape = new Shape(); + const buffer = new Uint8Array([255, 0, 0, 255, 0, 255, 0, 255]); + + expect(shape.$bitmapBuffer).toBeNull(); + + execute(shape, 2, 1, buffer); + + expect(shape.$bitmapBuffer).toBe(buffer); + }); + + it("execute test case3 - sets graphics bounds", () => + { + const shape = new Shape(); + const buffer = new Uint8Array(400); // 10x10 RGBA + + execute(shape, 10, 10, buffer); + + expect(shape.graphics.xMin).toBe(0); + expect(shape.graphics.yMin).toBe(0); + expect(shape.graphics.xMax).toBe(10); + expect(shape.graphics.yMax).toBe(10); + }); + + it("execute test case4 - handles small buffer", () => + { + const shape = new Shape(); + const buffer = new Uint8Array([255, 255, 255, 255]); + + execute(shape, 1, 1, buffer); + + expect(shape.isBitmap).toBe(true); + expect(shape.$bitmapBuffer).toBe(buffer); + expect(shape.graphics.xMax).toBe(1); + expect(shape.graphics.yMax).toBe(1); + }); + + it("execute test case5 - handles large buffer", () => + { + const shape = new Shape(); + const buffer = new Uint8Array(1920 * 1080 * 4); + + execute(shape, 1920, 1080, buffer); + + expect(shape.isBitmap).toBe(true); + expect(shape.$bitmapBuffer).toBe(buffer); + expect(shape.graphics.xMax).toBe(1920); + expect(shape.graphics.yMax).toBe(1080); + }); + + it("execute test case6 - clears previous bitmap", () => + { + const shape = new Shape(); + const buffer1 = new Uint8Array([255, 0, 0, 255]); + const buffer2 = new Uint8Array([0, 255, 0, 255]); + + execute(shape, 1, 1, buffer1); + expect(shape.$bitmapBuffer).toBe(buffer1); + + execute(shape, 1, 1, buffer2); + expect(shape.$bitmapBuffer).toBe(buffer2); + }); + + it("execute test case7 - handles different dimensions", () => + { + const shape = new Shape(); + const buffer = new Uint8Array(800); // 20x10 RGBA + + execute(shape, 20, 10, buffer); + + expect(shape.graphics.xMax).toBe(20); + expect(shape.graphics.yMax).toBe(10); + }); + + it("execute test case8 - handles square dimensions", () => + { + const shape = new Shape(); + const buffer = new Uint8Array(10000); // 50x50 RGBA + + execute(shape, 50, 50, buffer); + + expect(shape.graphics.xMax).toBe(50); + expect(shape.graphics.yMax).toBe(50); + }); + + it("execute test case9 - updates bounds origin", () => + { + const shape = new Shape(); + shape.graphics.xMin = 100; + shape.graphics.yMin = 200; + + const buffer = new Uint8Array(400); + execute(shape, 10, 10, buffer); + + expect(shape.graphics.xMin).toBe(0); + expect(shape.graphics.yMin).toBe(0); + }); + + it("execute test case10 - preserves shape instance", () => + { + const shape = new Shape(); + const originalShape = shape; + const buffer = new Uint8Array(1600); // 20x20 RGBA + + execute(shape, 20, 20, buffer); + + expect(shape).toBe(originalShape); + expect(shape.isBitmap).toBe(true); + }); +}); diff --git a/packages/display/src/Stage/service/StageExecuteFrameSoundsService.test.ts b/packages/display/src/Stage/service/StageExecuteFrameSoundsService.test.ts new file mode 100644 index 00000000..29b01ae3 --- /dev/null +++ b/packages/display/src/Stage/service/StageExecuteFrameSoundsService.test.ts @@ -0,0 +1,337 @@ +import { execute } from "./StageExecuteFrameSoundsService"; +import { $sounds } from "../../DisplayObjectUtil"; +import { MovieClip } from "../../MovieClip"; +import { Sound } from "@next2d/media"; +import { SoundTransform } from "@next2d/media"; +import { describe, expect, it, beforeEach } from "vitest"; + +describe("StageExecuteFrameSoundsService.js test", () => +{ + beforeEach(() => + { + // Clear $sounds array before each test + $sounds.length = 0; + }); + + it("execute test case1 - plays sound on current frame", () => + { + const movieClip = new MovieClip(); + const sound = new Sound(); + let played = false; + + sound.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound]); + movieClip.currentFrame = 1; + + $sounds.push(movieClip); + + expect($sounds.length).toBe(1); + expect(played).toBe(false); + + execute(); + + expect($sounds.length).toBe(0); + expect(played).toBe(true); + }); + + it("execute test case2 - skips movieClip without sounds", () => + { + const movieClip = new MovieClip(); + movieClip.$sounds = null; + + $sounds.push(movieClip); + + expect($sounds.length).toBe(1); + + execute(); + + expect($sounds.length).toBe(0); + }); + + it("execute test case3 - skips frame without sounds", () => + { + const movieClip = new MovieClip(); + const sound = new Sound(); + let played = false; + + sound.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(5, [sound]); + movieClip.currentFrame = 1; // Different frame + + $sounds.push(movieClip); + + execute(); + + expect(played).toBe(false); + }); + + it("execute test case4 - applies soundTransform to sound", () => + { + const movieClip = new MovieClip(); + const sound = new Sound(); + const soundTransform = new SoundTransform(0.5, 0); + soundTransform.loopCount = 3; + + let played = false; + sound.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound]); + movieClip.currentFrame = 1; + movieClip.soundTransform = soundTransform; + + $sounds.push(movieClip); + + execute(); + + expect(played).toBe(true); + expect(sound.volume).toBe(0.5); + expect(sound.loopCount).toBe(3); + }); + + it("execute test case5 - plays multiple sounds in frame", () => + { + const movieClip = new MovieClip(); + const sound1 = new Sound(); + const sound2 = new Sound(); + const sound3 = new Sound(); + + let played1 = false; + let played2 = false; + let played3 = false; + + sound1.play = () => { played1 = true; }; + sound2.play = () => { played2 = true; }; + sound3.play = () => { played3 = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound1, sound2, sound3]); + movieClip.currentFrame = 1; + + $sounds.push(movieClip); + + execute(); + + expect(played1).toBe(true); + expect(played2).toBe(true); + expect(played3).toBe(true); + }); + + it("execute test case6 - processes multiple movieClips", () => + { + const movieClip1 = new MovieClip(); + const movieClip2 = new MovieClip(); + const sound1 = new Sound(); + const sound2 = new Sound(); + + let played1 = false; + let played2 = false; + + sound1.play = () => { played1 = true; }; + sound2.play = () => { played2 = true; }; + + movieClip1.$sounds = new Map(); + movieClip1.$sounds.set(1, [sound1]); + movieClip1.currentFrame = 1; + + movieClip2.$sounds = new Map(); + movieClip2.$sounds.set(1, [sound2]); + movieClip2.currentFrame = 1; + + $sounds.push(movieClip1); + $sounds.push(movieClip2); + + expect($sounds.length).toBe(2); + + execute(); + + expect($sounds.length).toBe(0); + expect(played1).toBe(true); + expect(played2).toBe(true); + }); + + it("execute test case7 - skips null sounds in array", () => + { + const movieClip = new MovieClip(); + const sound1 = new Sound(); + + let played = false; + sound1.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound1, null as any, undefined as any]); + movieClip.currentFrame = 1; + + $sounds.push(movieClip); + + expect(() => { + execute(); + }).not.toThrow(); + + expect(played).toBe(true); + }); + + it("execute test case8 - handles empty $sounds array", () => + { + expect($sounds.length).toBe(0); + + expect(() => { + execute(); + }).not.toThrow(); + + expect($sounds.length).toBe(0); + }); + + it("execute test case9 - handles empty sounds array for frame", () => + { + const movieClip = new MovieClip(); + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, []); + movieClip.currentFrame = 1; + + $sounds.push(movieClip); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case10 - applies soundTransform volume only", () => + { + const movieClip = new MovieClip(); + const sound = new Sound(); + const soundTransform = new SoundTransform(0.75, 0); + + let played = false; + sound.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound]); + movieClip.currentFrame = 1; + movieClip.soundTransform = soundTransform; + + $sounds.push(movieClip); + + execute(); + + expect(played).toBe(true); + expect(sound.volume).toBe(0.75); + }); + + it("execute test case11 - handles multiple frames with sounds", () => + { + const movieClip = new MovieClip(); + const sound1 = new Sound(); + const sound2 = new Sound(); + + let played1 = false; + let played2 = false; + + sound1.play = () => { played1 = true; }; + sound2.play = () => { played2 = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound1]); + movieClip.$sounds.set(5, [sound2]); + movieClip.currentFrame = 1; + + $sounds.push(movieClip); + + execute(); + + expect(played1).toBe(true); + expect(played2).toBe(false); // Frame 5 not played + }); + + it("execute test case12 - clears $sounds array after execution", () => + { + const movieClip1 = new MovieClip(); + const movieClip2 = new MovieClip(); + const movieClip3 = new MovieClip(); + + movieClip1.$sounds = null; + movieClip2.$sounds = null; + movieClip3.$sounds = null; + + $sounds.push(movieClip1); + $sounds.push(movieClip2); + $sounds.push(movieClip3); + + expect($sounds.length).toBe(3); + + execute(); + + expect($sounds.length).toBe(0); + }); + + it("execute test case13 - without soundTransform", () => + { + const movieClip = new MovieClip(); + const sound = new Sound(); + + let played = false; + sound.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound]); + movieClip.currentFrame = 1; + movieClip.soundTransform = null; + + $sounds.push(movieClip); + + execute(); + + expect(played).toBe(true); + }); + + it("execute test case14 - handles different frame numbers", () => + { + const movieClip = new MovieClip(); + const sound = new Sound(); + + let played = false; + sound.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(10, [sound]); + movieClip.currentFrame = 10; + + $sounds.push(movieClip); + + execute(); + + expect(played).toBe(true); + }); + + it("execute test case15 - preserves sound properties", () => + { + const movieClip = new MovieClip(); + const sound = new Sound(); + const soundTransform = new SoundTransform(0.8, 0.5); + soundTransform.loopCount = 5; + + let played = false; + sound.play = () => { played = true; }; + + movieClip.$sounds = new Map(); + movieClip.$sounds.set(1, [sound]); + movieClip.currentFrame = 1; + movieClip.soundTransform = soundTransform; + + $sounds.push(movieClip); + + const originalVolume = soundTransform.volume; + const originalLoopCount = soundTransform.loopCount; + + execute(); + + expect(played).toBe(true); + expect(sound.volume).toBe(originalVolume); + expect(sound.loopCount).toBe(originalLoopCount); + }); +}); diff --git a/packages/display/src/Stage/usecase/StageGenerateRenderQueueUseCase.test.ts b/packages/display/src/Stage/usecase/StageGenerateRenderQueueUseCase.test.ts new file mode 100644 index 00000000..1cd0a52a --- /dev/null +++ b/packages/display/src/Stage/usecase/StageGenerateRenderQueueUseCase.test.ts @@ -0,0 +1,145 @@ +import { execute } from "./StageGenerateRenderQueueUseCase"; +import { DisplayObjectContainer } from "../../DisplayObjectContainer"; +import { Shape } from "../../Shape"; +import { MovieClip } from "../../MovieClip"; +import { describe, expect, it } from "vitest"; + +describe("StageGenerateRenderQueueUseCase.js test", () => +{ + it("execute test case1 - handles DisplayObjectContainer", () => + { + const container = new DisplayObjectContainer(); + container.isContainerEnabled = true; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(container, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case2 - handles Shape", () => + { + const shape = new Shape(); + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case3 - handles MovieClip", () => + { + const movieClip = new MovieClip(); + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(movieClip, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case4 - handles identity matrix", () => + { + const container = new DisplayObjectContainer(); + + const imageBitmaps: ImageBitmap[] = []; + const identityMatrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(container, imageBitmaps, identityMatrix, colorTransform, 1920, 1080); + }).not.toThrow(); + }); + + it("execute test case5 - handles scaled matrix", () => + { + const shape = new Shape(); + + const imageBitmaps: ImageBitmap[] = []; + const scaledMatrix = new Float32Array([2, 0, 0, 2, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, imageBitmaps, scaledMatrix, colorTransform, 640, 480); + }).not.toThrow(); + }); + + it("execute test case6 - handles translated matrix", () => + { + const movieClip = new MovieClip(); + + const imageBitmaps: ImageBitmap[] = []; + const translatedMatrix = new Float32Array([1, 0, 0, 1, 100, 100]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(movieClip, imageBitmaps, translatedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case7 - handles alpha color transform", () => + { + const shape = new Shape(); + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const alphaTransform = new Float32Array([1, 1, 1, 0.5, 0, 0, 0, 0]); + + expect(() => { + execute(shape, imageBitmaps, matrix, alphaTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case8 - handles different renderer sizes", () => + { + const container = new DisplayObjectContainer(); + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(container, imageBitmaps, matrix, colorTransform, 320, 240); + }).not.toThrow(); + + expect(() => { + execute(container, imageBitmaps, matrix, colorTransform, 3840, 2160); + }).not.toThrow(); + }); + + it("execute test case9 - handles empty image bitmaps array", () => + { + const shape = new Shape(); + + const emptyBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(shape, emptyBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case10 - validates parameter types", () => + { + const container = new DisplayObjectContainer(); + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(container).toBeInstanceOf(DisplayObjectContainer); + expect(Array.isArray(imageBitmaps)).toBe(true); + expect(matrix).toBeInstanceOf(Float32Array); + expect(colorTransform).toBeInstanceOf(Float32Array); + expect(typeof 800).toBe("number"); + expect(typeof 600).toBe("number"); + }); +}); diff --git a/packages/display/src/Stage/usecase/StageReadyUseCase.test.ts b/packages/display/src/Stage/usecase/StageReadyUseCase.test.ts new file mode 100644 index 00000000..a4494440 --- /dev/null +++ b/packages/display/src/Stage/usecase/StageReadyUseCase.test.ts @@ -0,0 +1,117 @@ +import { execute } from "./StageReadyUseCase"; +import { DisplayObjectContainer } from "../../DisplayObjectContainer"; +import { MovieClip } from "../../MovieClip"; +import { describe, expect, it } from "vitest"; + +describe("StageReadyUseCase.js test", () => +{ + it("execute test case1 - handles DisplayObjectContainer", () => + { + const container = new DisplayObjectContainer(); + + expect(() => { + execute(container); + }).not.toThrow(); + }); + + it("execute test case2 - handles MovieClip", () => + { + const movieClip = new MovieClip(); + + expect(() => { + execute(movieClip); + }).not.toThrow(); + }); + + it("execute test case3 - handles empty container", () => + { + const container = new DisplayObjectContainer(); + + expect(container.numChildren).toBe(0); + + expect(() => { + execute(container); + }).not.toThrow(); + }); + + it("execute test case4 - handles container with children", () => + { + const container = new DisplayObjectContainer(); + const child1 = new DisplayObjectContainer(); + const child2 = new MovieClip(); + + container.addChild(child1); + container.addChild(child2); + + expect(container.numChildren).toBe(2); + + expect(() => { + execute(container); + }).not.toThrow(); + }); + + it("execute test case5 - preserves container instance", () => + { + const container = new DisplayObjectContainer(); + const originalContainer = container; + + execute(container); + + expect(container).toBe(originalContainer); + }); + + it("execute test case6 - handles nested containers", () => + { + const parentContainer = new DisplayObjectContainer(); + const childContainer = new DisplayObjectContainer(); + const grandchildContainer = new DisplayObjectContainer(); + + childContainer.addChild(grandchildContainer); + parentContainer.addChild(childContainer); + + expect(() => { + execute(parentContainer); + }).not.toThrow(); + }); + + it("execute test case7 - handles MovieClip with frames", () => + { + const movieClip = new MovieClip(); + movieClip.totalFrames = 10; + + expect(() => { + execute(movieClip); + }).not.toThrow(); + }); + + it("execute test case8 - can be called multiple times", () => + { + const container = new DisplayObjectContainer(); + + expect(() => { + execute(container); + execute(container); + execute(container); + }).not.toThrow(); + }); + + it("execute test case9 - handles different container types", () => + { + const container1 = new DisplayObjectContainer(); + const container2 = new MovieClip(); + const container3 = new DisplayObjectContainer(); + + expect(() => { + execute(container1); + execute(container2); + execute(container3); + }).not.toThrow(); + }); + + it("execute test case10 - validates parameter type", () => + { + const container = new DisplayObjectContainer(); + + expect(container).toBeInstanceOf(DisplayObjectContainer); + }); +}); diff --git a/packages/display/src/Stage/usecase/StageTickerUseCase.test.ts b/packages/display/src/Stage/usecase/StageTickerUseCase.test.ts new file mode 100644 index 00000000..88115863 --- /dev/null +++ b/packages/display/src/Stage/usecase/StageTickerUseCase.test.ts @@ -0,0 +1,87 @@ +import { execute } from "./StageTickerUseCase"; +import { describe, expect, it } from "vitest"; + +describe("StageTickerUseCase.js test", () => +{ + it("execute test case1 - executes without errors", () => + { + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case2 - can be called multiple times", () => + { + expect(() => { + execute(); + execute(); + execute(); + }).not.toThrow(); + }); + + it("execute test case3 - executes sequentially", () => + { + for (let i = 0; i < 5; i++) { + expect(() => { + execute(); + }).not.toThrow(); + } + }); + + it("execute test case4 - returns undefined", () => + { + const result = execute(); + + expect(result).toBeUndefined(); + }); + + it("execute test case5 - has no parameters", () => + { + expect(execute.length).toBe(0); + }); + + it("execute test case6 - executes in rapid succession", () => + { + expect(() => { + for (let i = 0; i < 10; i++) { + execute(); + } + }).not.toThrow(); + }); + + it("execute test case7 - maintains consistency", () => + { + const result1 = execute(); + const result2 = execute(); + const result3 = execute(); + + expect(result1).toBeUndefined(); + expect(result2).toBeUndefined(); + expect(result3).toBeUndefined(); + }); + + it("execute test case8 - handles immediate re-execution", () => + { + execute(); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case9 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case10 - executes independently", () => + { + const execution1 = () => execute(); + const execution2 = () => execute(); + + expect(() => { + execution1(); + execution2(); + }).not.toThrow(); + }); +}); diff --git a/packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.test.ts b/packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.test.ts new file mode 100644 index 00000000..72a30fb4 --- /dev/null +++ b/packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.test.ts @@ -0,0 +1,217 @@ +import { execute } from "./TextFieldGenerateRenderQueueUseCase"; +import { TextField } from "@next2d/text"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldGenerateRenderQueueUseCase.js test", () => +{ + it("execute test case1 - handles visible TextField", () => + { + const textField = new TextField(); + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case2 - handles invisible TextField", () => + { + const textField = new TextField(); + textField.visible = false; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case3 - handles identity matrix", () => + { + const textField = new TextField(); + textField.visible = true; + + const identityMatrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, identityMatrix, colorTransform, 1920, 1080); + }).not.toThrow(); + }); + + it("execute test case4 - handles scaled matrix", () => + { + const textField = new TextField(); + textField.visible = true; + + const scaledMatrix = new Float32Array([2, 0, 0, 2, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, scaledMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case5 - handles translated matrix", () => + { + const textField = new TextField(); + textField.visible = true; + + const translatedMatrix = new Float32Array([1, 0, 0, 1, 100, 100]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, translatedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case6 - handles alpha color transform", () => + { + const textField = new TextField(); + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const alphaTransform = new Float32Array([1, 1, 1, 0.5, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, alphaTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case7 - handles tinted color transform", () => + { + const textField = new TextField(); + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const tintedTransform = new Float32Array([1, 0.5, 0.5, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, tintedTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case8 - handles different renderer sizes", () => + { + const textField = new TextField(); + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, colorTransform, 320, 240); + }).not.toThrow(); + + expect(() => { + execute(textField, matrix, colorTransform, 1920, 1080); + }).not.toThrow(); + + expect(() => { + execute(textField, matrix, colorTransform, 3840, 2160); + }).not.toThrow(); + }); + + it("execute test case9 - handles rotated matrix", () => + { + const textField = new TextField(); + textField.visible = true; + + const cos = Math.cos(Math.PI / 4); + const sin = Math.sin(Math.PI / 4); + const rotatedMatrix = new Float32Array([cos, sin, -sin, cos, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, rotatedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case10 - validates parameter types", () => + { + const textField = new TextField(); + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(textField).toBeInstanceOf(TextField); + expect(matrix).toBeInstanceOf(Float32Array); + expect(colorTransform).toBeInstanceOf(Float32Array); + expect(typeof 800).toBe("number"); + expect(typeof 600).toBe("number"); + }); + + it("execute test case11 - handles TextField with text", () => + { + const textField = new TextField(); + textField.text = "Hello World"; + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case12 - handles TextField with empty text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case13 - handles TextField with multiline text", () => + { + const textField = new TextField(); + textField.text = "Line 1\nLine 2\nLine 3"; + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case14 - handles TextField with custom size", () => + { + const textField = new TextField(); + textField.width = 200; + textField.height = 50; + textField.visible = true; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(textField, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case15 - handles combined transformations", () => + { + const textField = new TextField(); + textField.visible = true; + + // Scale + Translate + const combinedMatrix = new Float32Array([1.5, 0, 0, 1.5, 50, 50]); + const colorTransform = new Float32Array([0.8, 0.8, 1, 0.9, 0, 0, 0, 0]); + + expect(() => { + execute(textField, combinedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); +}); diff --git a/packages/display/src/TextField/usecase/TextFieldHitTestUseCase.test.ts b/packages/display/src/TextField/usecase/TextFieldHitTestUseCase.test.ts new file mode 100644 index 00000000..b2d54133 --- /dev/null +++ b/packages/display/src/TextField/usecase/TextFieldHitTestUseCase.test.ts @@ -0,0 +1,265 @@ +import { execute } from "./TextFieldHitTestUseCase"; +import { TextField } from "@next2d/text"; +import { describe, expect, it, beforeEach } from "vitest"; + +describe("TextFieldHitTestUseCase.js test", () => +{ + let canvas: HTMLCanvasElement; + let context: CanvasRenderingContext2D; + + beforeEach(() => + { + canvas = document.createElement("canvas"); + canvas.width = 200; + canvas.height = 200; + context = canvas.getContext("2d") as CanvasRenderingContext2D; + }); + + it("execute test case1 - returns false for zero width TextField", () => + { + const textField = new TextField(); + textField.xMin = 10; + textField.yMin = 10; + textField.xMax = 10; // Same as xMin (width = 0) + textField.yMax = 20; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 10, y: 10 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case2 - returns false for zero height TextField", () => + { + const textField = new TextField(); + textField.xMin = 10; + textField.yMin = 10; + textField.xMax = 20; + textField.yMax = 10; // Same as yMin (height = 0) + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 15, y: 10 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case3 - returns false for negative width", () => + { + const textField = new TextField(); + textField.xMin = 20; + textField.yMin = 10; + textField.xMax = 10; // xMax < xMin + textField.yMax = 20; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 15, y: 15 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case4 - returns false for negative height", () => + { + const textField = new TextField(); + textField.xMin = 10; + textField.yMin = 20; + textField.xMax = 20; + textField.yMax = 10; // yMax < yMin + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 15, y: 15 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case5 - uses identity matrix", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 100; + textField.yMax = 100; + + const identityMatrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + const result = execute(textField, context, identityMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case6 - uses translated matrix", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 50; + textField.yMax = 50; + + const translatedMatrix = new Float32Array([1, 0, 0, 1, 100, 100]); + const hitObject = { x: 125, y: 125 }; + + const result = execute(textField, context, translatedMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case7 - uses scaled matrix", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 50; + textField.yMax = 50; + + const scaledMatrix = new Float32Array([2, 0, 0, 2, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + const result = execute(textField, context, scaledMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case8 - validates return type", () => + { + const textField = new TextField(); + textField.xMin = 10; + textField.yMin = 10; + textField.xMax = 110; + textField.yMax = 110; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + expect([true, false]).toContain(result); + }); + + it("execute test case9 - handles different hit positions", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 100; + textField.yMax = 100; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + const hitObject1 = { x: 50, y: 50 }; + const result1 = execute(textField, context, matrix, hitObject1); + expect(typeof result1).toBe("boolean"); + + const hitObject2 = { x: 200, y: 200 }; + const result2 = execute(textField, context, matrix, hitObject2); + expect(typeof result2).toBe("boolean"); + }); + + it("execute test case10 - validates context usage", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 100; + textField.yMax = 100; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 50, y: 50 }; + + expect(context).toBeDefined(); + + const result = execute(textField, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case11 - handles TextField boundaries", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 100; + textField.yMax = 100; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + // Test corners + const corner1 = execute(textField, context, matrix, { x: 0, y: 0 }); + const corner2 = execute(textField, context, matrix, { x: 100, y: 100 }); + + expect(typeof corner1).toBe("boolean"); + expect(typeof corner2).toBe("boolean"); + }); + + it("execute test case12 - handles large TextField", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 1000; + textField.yMax = 500; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 500, y: 250 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case13 - handles small TextField", () => + { + const textField = new TextField(); + textField.xMin = 0; + textField.yMin = 0; + textField.xMax = 10; + textField.yMax = 10; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 5, y: 5 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case14 - handles negative coordinates", () => + { + const textField = new TextField(); + textField.xMin = -50; + textField.yMin = -50; + textField.xMax = 50; + textField.yMax = 50; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 0, y: 0 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case15 - handles decimal coordinates", () => + { + const textField = new TextField(); + textField.xMin = 10.5; + textField.yMin = 20.3; + textField.xMax = 110.7; + textField.yMax = 120.9; + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 60.5, y: 70.5 }; + + const result = execute(textField, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); +}); diff --git a/packages/display/src/Video/usecase/VideoGenerateRenderQueueUseCase.test.ts b/packages/display/src/Video/usecase/VideoGenerateRenderQueueUseCase.test.ts new file mode 100644 index 00000000..6683ea50 --- /dev/null +++ b/packages/display/src/Video/usecase/VideoGenerateRenderQueueUseCase.test.ts @@ -0,0 +1,239 @@ +import { execute } from "./VideoGenerateRenderQueueUseCase"; +import { Video } from "@next2d/media"; +import { describe, expect, it } from "vitest"; + +describe("VideoGenerateRenderQueueUseCase.js test", () => +{ + it("execute test case1 - handles visible Video", () => + { + const video = new Video(640, 480); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case2 - handles invisible Video", () => + { + const video = new Video(640, 480); + video.visible = false; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case3 - handles identity matrix", () => + { + const video = new Video(1920, 1080); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const identityMatrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, identityMatrix, colorTransform, 1920, 1080); + }).not.toThrow(); + }); + + it("execute test case4 - handles scaled matrix", () => + { + const video = new Video(320, 240); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const scaledMatrix = new Float32Array([2, 0, 0, 2, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, scaledMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case5 - handles translated matrix", () => + { + const video = new Video(640, 480); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const translatedMatrix = new Float32Array([1, 0, 0, 1, 100, 100]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, translatedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case6 - handles alpha color transform", () => + { + const video = new Video(640, 480); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const alphaTransform = new Float32Array([1, 1, 1, 0.5, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, matrix, alphaTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case7 - handles tinted color transform", () => + { + const video = new Video(640, 480); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const tintedTransform = new Float32Array([1, 0.5, 0.5, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, matrix, tintedTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case8 - handles different renderer sizes", () => + { + const video = new Video(640, 480); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, matrix, colorTransform, 320, 240); + }).not.toThrow(); + + expect(() => { + execute(video, imageBitmaps, matrix, colorTransform, 1920, 1080); + }).not.toThrow(); + + expect(() => { + execute(video, imageBitmaps, matrix, colorTransform, 3840, 2160); + }).not.toThrow(); + }); + + it("execute test case9 - handles rotated matrix", () => + { + const video = new Video(640, 480); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const cos = Math.cos(Math.PI / 4); + const sin = Math.sin(Math.PI / 4); + const rotatedMatrix = new Float32Array([cos, sin, -sin, cos, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, rotatedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case10 - validates parameter types", () => + { + const video = new Video(640, 480); + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(video).toBeInstanceOf(Video); + expect(Array.isArray(imageBitmaps)).toBe(true); + expect(matrix).toBeInstanceOf(Float32Array); + expect(colorTransform).toBeInstanceOf(Float32Array); + expect(typeof 800).toBe("number"); + expect(typeof 600).toBe("number"); + }); + + it("execute test case11 - handles different video sizes", () => + { + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + const smallVideo = new Video(320, 240); + smallVideo.visible = true; + expect(() => { + execute(smallVideo, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + + const hdVideo = new Video(1920, 1080); + hdVideo.visible = true; + expect(() => { + execute(hdVideo, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + + const uhd4kVideo = new Video(3840, 2160); + uhd4kVideo.visible = true; + expect(() => { + execute(uhd4kVideo, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case12 - handles empty image bitmaps array", () => + { + const video = new Video(640, 480); + video.visible = true; + + const emptyBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, emptyBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case13 - handles combined transformations", () => + { + const video = new Video(640, 480); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + // Scale + Translate + const combinedMatrix = new Float32Array([1.5, 0, 0, 1.5, 50, 50]); + const colorTransform = new Float32Array([0.8, 0.8, 1, 0.9, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, combinedMatrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case14 - handles square video", () => + { + const video = new Video(512, 512); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); + + it("execute test case15 - handles portrait video", () => + { + const video = new Video(480, 640); + video.visible = true; + + const imageBitmaps: ImageBitmap[] = []; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + expect(() => { + execute(video, imageBitmaps, matrix, colorTransform, 800, 600); + }).not.toThrow(); + }); +}); diff --git a/packages/display/src/Video/usecase/VideoHitTestUseCase.test.ts b/packages/display/src/Video/usecase/VideoHitTestUseCase.test.ts new file mode 100644 index 00000000..65873d35 --- /dev/null +++ b/packages/display/src/Video/usecase/VideoHitTestUseCase.test.ts @@ -0,0 +1,205 @@ +import { execute } from "./VideoHitTestUseCase"; +import { Video } from "@next2d/media"; +import { describe, expect, it, beforeEach } from "vitest"; + +describe("VideoHitTestUseCase.js test", () => +{ + let canvas: HTMLCanvasElement; + let context: CanvasRenderingContext2D; + + beforeEach(() => + { + canvas = document.createElement("canvas"); + canvas.width = 800; + canvas.height = 600; + context = canvas.getContext("2d") as CanvasRenderingContext2D; + }); + + it("execute test case1 - returns false for zero width Video", () => + { + const video = new Video(0, 480); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 100, y: 100 }; + + const result = execute(video, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case2 - returns false for zero height Video", () => + { + const video = new Video(640, 0); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 100, y: 100 }; + + const result = execute(video, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case3 - returns false for negative width", () => + { + const video = new Video(-640, 480); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 100, y: 100 }; + + const result = execute(video, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case4 - returns false for negative height", () => + { + const video = new Video(640, -480); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 100, y: 100 }; + + const result = execute(video, context, matrix, hitObject); + + expect(result).toBe(false); + }); + + it("execute test case5 - uses identity matrix", () => + { + const video = new Video(640, 480); + + const identityMatrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 320, y: 240 }; + + const result = execute(video, context, identityMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case6 - uses translated matrix", () => + { + const video = new Video(640, 480); + + const translatedMatrix = new Float32Array([1, 0, 0, 1, 100, 100]); + const hitObject = { x: 420, y: 340 }; + + const result = execute(video, context, translatedMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case7 - uses scaled matrix", () => + { + const video = new Video(320, 240); + + const scaledMatrix = new Float32Array([2, 0, 0, 2, 0, 0]); + const hitObject = { x: 320, y: 240 }; + + const result = execute(video, context, scaledMatrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case8 - validates return type", () => + { + const video = new Video(640, 480); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 320, y: 240 }; + + const result = execute(video, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + expect([true, false]).toContain(result); + }); + + it("execute test case9 - handles different hit positions", () => + { + const video = new Video(640, 480); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + const hitObject1 = { x: 320, y: 240 }; + const result1 = execute(video, context, matrix, hitObject1); + expect(typeof result1).toBe("boolean"); + + const hitObject2 = { x: 1000, y: 1000 }; + const result2 = execute(video, context, matrix, hitObject2); + expect(typeof result2).toBe("boolean"); + }); + + it("execute test case10 - validates context usage", () => + { + const video = new Video(640, 480); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 320, y: 240 }; + + expect(context).toBeDefined(); + + const result = execute(video, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case11 - handles Video boundaries", () => + { + const video = new Video(640, 480); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + + // Test corners + const corner1 = execute(video, context, matrix, { x: 0, y: 0 }); + const corner2 = execute(video, context, matrix, { x: 640, y: 480 }); + + expect(typeof corner1).toBe("boolean"); + expect(typeof corner2).toBe("boolean"); + }); + + it("execute test case12 - handles HD video size", () => + { + const video = new Video(1920, 1080); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 960, y: 540 }; + + const result = execute(video, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case13 - handles small video size", () => + { + const video = new Video(320, 240); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 160, y: 120 }; + + const result = execute(video, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case14 - handles square video", () => + { + const video = new Video(512, 512); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 256, y: 256 }; + + const result = execute(video, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); + + it("execute test case15 - handles portrait video", () => + { + const video = new Video(480, 640); + + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const hitObject = { x: 240, y: 320 }; + + const result = execute(video, context, matrix, hitObject); + + expect(typeof result).toBe("boolean"); + }); +}); diff --git a/packages/text/src/TextArea/usecase/TextAreaCompositionEndUseCase.test.ts b/packages/text/src/TextArea/usecase/TextAreaCompositionEndUseCase.test.ts new file mode 100644 index 00000000..e98568d7 --- /dev/null +++ b/packages/text/src/TextArea/usecase/TextAreaCompositionEndUseCase.test.ts @@ -0,0 +1,111 @@ +import { execute } from "./TextAreaCompositionEndUseCase"; +import { describe, expect, it, beforeEach, afterEach, vi } from "vitest"; +import { $setSelectedTextField } from "../../TextUtil"; +import { TextField } from "../../TextField"; + +describe("TextAreaCompositionEndUseCase.js test", () => +{ + afterEach(() => + { + $setSelectedTextField(null); + }); + + it("execute test case1 - handles when no text field is selected", () => + { + $setSelectedTextField(null); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case2 - handles when text field is selected", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case3 - returns undefined", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const result = execute(); + + expect(result).toBeUndefined(); + }); + + it("execute test case4 - can be called multiple times", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + expect(() => { + execute(); + execute(); + execute(); + }).not.toThrow(); + }); + + it("execute test case5 - handles text field with text", () => + { + const textField = new TextField(); + textField.text = "Sample text"; + $setSelectedTextField(textField); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case6 - handles text field without text", () => + { + const textField = new TextField(); + textField.text = ""; + $setSelectedTextField(textField); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case7 - handles different text fields", () => + { + const textField1 = new TextField(); + $setSelectedTextField(textField1); + execute(); + + const textField2 = new TextField(); + $setSelectedTextField(textField2); + execute(); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case8 - validates execution order", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + execute(); + const result = execute(); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - has no parameters", () => + { + expect(execute.length).toBe(0); + }); + + it("execute test case10 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); +}); diff --git a/packages/text/src/TextArea/usecase/TextAreaCompositionStartUseCase.test.ts b/packages/text/src/TextArea/usecase/TextAreaCompositionStartUseCase.test.ts new file mode 100644 index 00000000..faa3cbe1 --- /dev/null +++ b/packages/text/src/TextArea/usecase/TextAreaCompositionStartUseCase.test.ts @@ -0,0 +1,111 @@ +import { execute } from "./TextAreaCompositionStartUseCase"; +import { describe, expect, it, beforeEach, afterEach, vi } from "vitest"; +import { $setSelectedTextField } from "../../TextUtil"; +import { TextField } from "../../TextField"; + +describe("TextAreaCompositionStartUseCase.js test", () => +{ + afterEach(() => + { + $setSelectedTextField(null); + }); + + it("execute test case1 - handles when no text field is selected", () => + { + $setSelectedTextField(null); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case2 - handles when text field is selected", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case3 - returns undefined", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const result = execute(); + + expect(result).toBeUndefined(); + }); + + it("execute test case4 - can be called multiple times", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + expect(() => { + execute(); + execute(); + execute(); + }).not.toThrow(); + }); + + it("execute test case5 - handles text field with text", () => + { + const textField = new TextField(); + textField.text = "Sample text"; + $setSelectedTextField(textField); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case6 - handles text field without text", () => + { + const textField = new TextField(); + textField.text = ""; + $setSelectedTextField(textField); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case7 - handles different text fields", () => + { + const textField1 = new TextField(); + $setSelectedTextField(textField1); + execute(); + + const textField2 = new TextField(); + $setSelectedTextField(textField2); + execute(); + + expect(() => { + execute(); + }).not.toThrow(); + }); + + it("execute test case8 - validates execution order", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + execute(); + const result = execute(); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - has no parameters", () => + { + expect(execute.length).toBe(0); + }); + + it("execute test case10 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); +}); diff --git a/packages/text/src/TextArea/usecase/TextAreaCompositionUpdateUseCase.test.ts b/packages/text/src/TextArea/usecase/TextAreaCompositionUpdateUseCase.test.ts new file mode 100644 index 00000000..476a701b --- /dev/null +++ b/packages/text/src/TextArea/usecase/TextAreaCompositionUpdateUseCase.test.ts @@ -0,0 +1,181 @@ +import { execute } from "./TextAreaCompositionUpdateUseCase"; +import { describe, expect, it, beforeEach, afterEach, vi } from "vitest"; +import { $setSelectedTextField } from "../../TextUtil"; +import { TextField } from "../../TextField"; + +describe("TextAreaCompositionUpdateUseCase.js test", () => +{ + afterEach(() => + { + $setSelectedTextField(null); + }); + + it("execute test case1 - handles when no text field is selected", () => + { + $setSelectedTextField(null); + + const event = new CompositionEvent("compositionupdate", { data: "test" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case2 - handles when text field is selected", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "test" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case3 - returns undefined", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "test" }); + const result = execute(event); + + expect(result).toBeUndefined(); + }); + + it("execute test case4 - handles different data values", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event1 = new CompositionEvent("compositionupdate", { data: "a" }); + const event2 = new CompositionEvent("compositionupdate", { data: "あ" }); + const event3 = new CompositionEvent("compositionupdate", { data: "abc" }); + + expect(() => { + execute(event1); + execute(event2); + execute(event3); + }).not.toThrow(); + }); + + it("execute test case5 - handles empty data", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case6 - handles Japanese characters", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "にほんご" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case7 - handles Chinese characters", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "中文" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case8 - handles Korean characters", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "한글" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case9 - validates parameter count", () => + { + expect(execute.length).toBe(1); + }); + + it("execute test case10 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case11 - handles multiple sequential updates", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + expect(() => { + execute(new CompositionEvent("compositionupdate", { data: "t" })); + execute(new CompositionEvent("compositionupdate", { data: "te" })); + execute(new CompositionEvent("compositionupdate", { data: "tes" })); + execute(new CompositionEvent("compositionupdate", { data: "test" })); + }).not.toThrow(); + }); + + it("execute test case12 - handles special characters", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "!@#$%^&*()" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case13 - handles numbers", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "1234567890" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case14 - handles spaces", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: " " }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case15 - handles mixed content", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new CompositionEvent("compositionupdate", { data: "Test123 あいう" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextArea/usecase/TextAreaInputUseCase.test.ts b/packages/text/src/TextArea/usecase/TextAreaInputUseCase.test.ts new file mode 100644 index 00000000..03cac3ff --- /dev/null +++ b/packages/text/src/TextArea/usecase/TextAreaInputUseCase.test.ts @@ -0,0 +1,173 @@ +import { execute } from "./TextAreaInputUseCase"; +import { describe, expect, it, beforeEach, afterEach, vi } from "vitest"; +import { $setSelectedTextField } from "../../TextUtil"; +import { TextField } from "../../TextField"; +import { Event } from "@next2d/events"; + +describe("TextAreaInputUseCase.js test", () => +{ + afterEach(() => + { + $setSelectedTextField(null); + }); + + it("execute test case1 - handles when event data is null", () => + { + const event = new InputEvent("input", { data: null }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case2 - handles when event data is empty", () => + { + const event = new InputEvent("input", { data: "" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case3 - handles when no text field is selected", () => + { + $setSelectedTextField(null); + + const event = new InputEvent("input", { data: "test" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case4 - handles when text field is selected", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "test" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case5 - returns undefined", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "test" }); + const result = execute(event); + + expect(result).toBeUndefined(); + }); + + it("execute test case6 - handles single character input", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "a" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case7 - handles multiple character input", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "Hello World" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case8 - handles number input", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "123" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case9 - handles special characters", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "!@#$" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case10 - validates parameter count", () => + { + expect(execute.length).toBe(1); + }); + + it("execute test case11 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case12 - handles Japanese input", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "あいうえお" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case13 - handles space input", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: " " }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); + + it("execute test case14 - handles sequential inputs", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + expect(() => { + execute(new InputEvent("input", { data: "H" })); + execute(new InputEvent("input", { data: "e" })); + execute(new InputEvent("input", { data: "l" })); + execute(new InputEvent("input", { data: "l" })); + execute(new InputEvent("input", { data: "o" })); + }).not.toThrow(); + }); + + it("execute test case15 - handles mixed content input", () => + { + const textField = new TextField(); + $setSelectedTextField(textField); + + const event = new InputEvent("input", { data: "Test123!あ" }); + + expect(() => { + execute(event); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/service/TextFieldBlinkingClearTimeoutService.test.ts b/packages/text/src/TextField/service/TextFieldBlinkingClearTimeoutService.test.ts new file mode 100644 index 00000000..9551e851 --- /dev/null +++ b/packages/text/src/TextField/service/TextFieldBlinkingClearTimeoutService.test.ts @@ -0,0 +1,200 @@ +import { execute } from "./TextFieldBlinkingClearTimeoutService"; +import { + $getBlinkingTimerId, + $setBlinkingTimerId +} from "../../TextUtil"; +import { describe, expect, it, beforeEach, afterEach, vi } from "vitest"; + +describe("TextFieldBlinkingClearTimeoutService.js test", () => +{ + afterEach(() => + { + $setBlinkingTimerId(void 0); + }); + + it("execute test case1 - clears timer when timer id exists", () => + { + const timerId = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId); + + expect($getBlinkingTimerId()).toBe(timerId); + + execute(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case2 - handles when no timer id exists", () => + { + $setBlinkingTimerId(void 0); + + expect($getBlinkingTimerId()).toBeUndefined(); + + expect(() => { + execute(); + }).not.toThrow(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case3 - returns undefined", () => + { + const timerId = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId); + + const result = execute(); + + expect(result).toBeUndefined(); + }); + + it("execute test case4 - can be called multiple times", () => + { + const timerId = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId); + + expect(() => { + execute(); + execute(); + execute(); + }).not.toThrow(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case5 - clears different timer ids", () => + { + const timerId1 = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId1); + execute(); + expect($getBlinkingTimerId()).toBeUndefined(); + + const timerId2 = setTimeout(() => {}, 2000); + $setBlinkingTimerId(timerId2); + execute(); + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case6 - validates timer is actually cleared", () => + { + let executed = false; + const timerId = setTimeout(() => { + executed = true; + }, 100); + + $setBlinkingTimerId(timerId); + execute(); + + return new Promise((resolve) => { + setTimeout(() => { + expect(executed).toBe(false); + expect($getBlinkingTimerId()).toBeUndefined(); + resolve(undefined); + }, 150); + }); + }); + + it("execute test case7 - has no parameters", () => + { + expect(execute.length).toBe(0); + }); + + it("execute test case8 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case9 - handles rapid successive calls", () => + { + const timerId1 = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId1); + + execute(); + + const timerId2 = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId2); + + execute(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case10 - clears and resets timer id", () => + { + const timerId = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId); + + expect($getBlinkingTimerId()).toBeDefined(); + + execute(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case11 - handles zero delay timer", () => + { + const timerId = setTimeout(() => {}, 0); + $setBlinkingTimerId(timerId); + + execute(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case12 - handles long delay timer", () => + { + const timerId = setTimeout(() => {}, 10000); + $setBlinkingTimerId(timerId); + + execute(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case13 - validates state after execution", () => + { + const timerId = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId); + + const beforeExecution = $getBlinkingTimerId(); + expect(beforeExecution).toBe(timerId); + + execute(); + + const afterExecution = $getBlinkingTimerId(); + expect(afterExecution).toBeUndefined(); + }); + + it("execute test case14 - handles execution order", () => + { + const timerId1 = setTimeout(() => {}, 500); + $setBlinkingTimerId(timerId1); + + execute(); + + expect($getBlinkingTimerId()).toBeUndefined(); + + const timerId2 = setTimeout(() => {}, 1000); + $setBlinkingTimerId(timerId2); + + expect($getBlinkingTimerId()).toBe(timerId2); + + execute(); + + expect($getBlinkingTimerId()).toBeUndefined(); + }); + + it("execute test case15 - idempotent behavior", () => + { + $setBlinkingTimerId(void 0); + + execute(); + const result1 = $getBlinkingTimerId(); + + execute(); + const result2 = $getBlinkingTimerId(); + + expect(result1).toBeUndefined(); + expect(result2).toBeUndefined(); + expect(result1).toBe(result2); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldArrowDownUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldArrowDownUseCase.test.ts new file mode 100644 index 00000000..f122bc49 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldArrowDownUseCase.test.ts @@ -0,0 +1,106 @@ +import { execute } from "./TextFieldArrowDownUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldArrowDownUseCase.js test", () => +{ + it("execute test case1 - returns early when focusIndex is -1", () => + { + const textField = new TextField(); + textField.focusIndex = -1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case2 - handles single line text", () => + { + const textField = new TextField(); + textField.text = "Hello"; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case3 - handles multiline text without shift key", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case4 - handles multiline text with shift key", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + textField.focusIndex = 1; + + expect(() => { + execute(textField, true); + }).not.toThrow(); + }); + + it("execute test case5 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case6 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case7 - handles empty text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case8 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 1; + + const result = execute(textField, false); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - handles focusIndex at 0", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 0; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case10 - handles long multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3\nLine4\nLine5"; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldArrowLeftUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldArrowLeftUseCase.test.ts new file mode 100644 index 00000000..e01386fd --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldArrowLeftUseCase.test.ts @@ -0,0 +1,110 @@ +import { execute } from "./TextFieldArrowLeftUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldArrowLeftUseCase.js test", () => +{ + it("execute test case1 - returns early when focusIndex is 0", () => + { + const textField = new TextField(); + textField.focusIndex = 0; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case2 - handles single character text", () => + { + const textField = new TextField(); + textField.text = "A"; + textField.focusIndex = 2; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + + expect(textField.focusIndex).toBe(1); + }); + + it("execute test case3 - handles text without shift key", () => + { + const textField = new TextField(); + textField.text = "Hello"; + textField.focusIndex = 3; + + execute(textField, false); + + expect(textField.focusIndex).toBe(2); + expect(textField.selectIndex).toBe(-1); + }); + + it("execute test case4 - handles text with shift key", () => + { + const textField = new TextField(); + textField.text = "Hello"; + textField.focusIndex = 3; + textField.selectIndex = -1; + + execute(textField, true); + + expect(textField.focusIndex).toBe(2); + }); + + it("execute test case5 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case6 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case7 - handles multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2"; + textField.focusIndex = 8; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case8 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + + const result = execute(textField, false); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - handles focusIndex at 1", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + + expect(textField.focusIndex).toBe(1); + }); + + it("execute test case10 - handles empty text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldArrowRightUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldArrowRightUseCase.test.ts new file mode 100644 index 00000000..1aa356e3 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldArrowRightUseCase.test.ts @@ -0,0 +1,111 @@ +import { execute } from "./TextFieldArrowRightUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldArrowRightUseCase.js test", () => +{ + it("execute test case1 - handles single character text", () => + { + const textField = new TextField(); + textField.text = "A"; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + + expect(textField.focusIndex).toBe(2); + }); + + it("execute test case2 - handles text without shift key", () => + { + const textField = new TextField(); + textField.text = "Hello"; + textField.focusIndex = 2; + + execute(textField, false); + + expect(textField.focusIndex).toBe(3); + expect(textField.selectIndex).toBe(-1); + }); + + it("execute test case3 - handles text with shift key", () => + { + const textField = new TextField(); + textField.text = "Hello"; + textField.focusIndex = 2; + textField.selectIndex = -1; + + execute(textField, true); + + expect(textField.focusIndex).toBe(3); + }); + + it("execute test case4 - returns early when at end of text", () => + { + const textField = new TextField(); + textField.text = "Hello"; + textField.focusIndex = 6; + + const initialIndex = textField.focusIndex; + execute(textField, false); + + expect(textField.focusIndex).toBe(initialIndex); + }); + + it("execute test case5 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case6 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case7 - handles multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2"; + textField.focusIndex = 5; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case8 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 1; + + const result = execute(textField, false); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - handles empty text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 0; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case10 - handles focusIndex increment", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 1; + + const initialIndex = textField.focusIndex; + execute(textField, false); + + expect(textField.focusIndex).toBe(initialIndex + 1); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldArrowUpUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldArrowUpUseCase.test.ts new file mode 100644 index 00000000..af75a277 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldArrowUpUseCase.test.ts @@ -0,0 +1,107 @@ +import { execute } from "./TextFieldArrowUpUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldArrowUpUseCase.js test", () => +{ + it("execute test case1 - returns early when focusIndex is -1", () => + { + const textField = new TextField(); + textField.focusIndex = -1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case2 - handles single line text", () => + { + const textField = new TextField(); + textField.text = "Hello"; + textField.focusIndex = 3; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case3 - handles multiline text without shift key", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + textField.focusIndex = 8; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case4 - handles multiline text with shift key", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + textField.focusIndex = 8; + + expect(() => { + execute(textField, true); + }).not.toThrow(); + }); + + it("execute test case5 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case6 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case7 - handles empty text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 1; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case8 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 3; + + const result = execute(textField, false); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - handles focusIndex at first line", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2"; + textField.focusIndex = 2; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); + + it("execute test case10 - handles long multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3\nLine4\nLine5"; + textField.focusIndex = 10; + + expect(() => { + execute(textField, false); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldBuildFromCharacterUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldBuildFromCharacterUseCase.test.ts new file mode 100644 index 00000000..debc60b7 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldBuildFromCharacterUseCase.test.ts @@ -0,0 +1,281 @@ +import { execute } from "./TextFieldBuildFromCharacterUseCase"; +import { TextField } from "../../TextField"; +import type { ITextFieldCharacter } from "../../interface/ITextFieldCharacter"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldBuildFromCharacterUseCase.js test", () => +{ + it("execute test case1 - builds text field from character", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Arial", + size: 12, + align: "left", + color: 0x000000, + leading: 2, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 0, + inputType: "dynamic", + multiline: false, + wordWrap: false, + border: false, + scroll: false, + thickness: 0, + thicknessColor: 0x000000, + autoSize: 0, + bounds: { xMin: 0, xMax: 100, yMin: 0, yMax: 20 }, + text: "Test" + }; + + expect(() => { + execute(textField, character); + }).not.toThrow(); + + expect(textField.text).toBe("Test"); + expect(textField.defaultTextFormat.font).toBe("Arial"); + expect(textField.defaultTextFormat.size).toBe(12); + }); + + it("execute test case2 - handles bold font type", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Arial", + size: 12, + align: "left", + color: 0x000000, + leading: 0, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 1, + inputType: "dynamic", + multiline: false, + wordWrap: false, + border: false, + scroll: false, + thickness: 0, + thicknessColor: 0x000000, + autoSize: 0, + bounds: { xMin: 0, xMax: 100, yMin: 0, yMax: 20 }, + text: "Bold" + }; + + execute(textField, character); + + expect(textField.defaultTextFormat.bold).toBe(true); + expect(textField.text).toBe("Bold"); + }); + + it("execute test case3 - handles italic font type", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Arial", + size: 12, + align: "center", + color: 0xFF0000, + leading: 0, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 2, + inputType: "dynamic", + multiline: false, + wordWrap: false, + border: false, + scroll: false, + thickness: 0, + thicknessColor: 0x000000, + autoSize: 0, + bounds: { xMin: 0, xMax: 100, yMin: 0, yMax: 20 }, + text: "Italic" + }; + + execute(textField, character); + + expect(textField.defaultTextFormat.italic).toBe(true); + expect(textField.text).toBe("Italic"); + }); + + it("execute test case4 - handles bold and italic font type", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Arial", + size: 12, + align: "right", + color: 0x0000FF, + leading: 0, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 3, + inputType: "dynamic", + multiline: false, + wordWrap: false, + border: false, + scroll: false, + thickness: 0, + thicknessColor: 0x000000, + autoSize: 0, + bounds: { xMin: 0, xMax: 100, yMin: 0, yMax: 20 }, + text: "BoldItalic" + }; + + execute(textField, character); + + expect(textField.defaultTextFormat.bold).toBe(true); + expect(textField.defaultTextFormat.italic).toBe(true); + expect(textField.text).toBe("BoldItalic"); + }); + + it("execute test case5 - handles multiline text", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Verdana", + size: 14, + align: "left", + color: 0x000000, + leading: 0, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 0, + inputType: "input", + multiline: true, + wordWrap: true, + border: true, + scroll: true, + thickness: 1, + thicknessColor: 0xFF0000, + autoSize: 0, + bounds: { xMin: 0, xMax: 200, yMin: 0, yMax: 100 }, + text: "Line1\nLine2" + }; + + execute(textField, character); + + expect(textField.multiline).toBe(true); + expect(textField.wordWrap).toBe(true); + expect(textField.border).toBe(true); + expect(textField.text).toBe("Line1\nLine2"); + }); + + it("execute test case6 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case7 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case8 - returns undefined", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Arial", + size: 12, + align: "left", + color: 0x000000, + leading: 0, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 0, + inputType: "dynamic", + multiline: false, + wordWrap: false, + border: false, + scroll: false, + thickness: 0, + thicknessColor: 0x000000, + autoSize: 0, + bounds: { xMin: 0, xMax: 100, yMin: 0, yMax: 20 }, + text: "Test" + }; + + const result = execute(textField, character); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - sets bounds correctly", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Arial", + size: 12, + align: "left", + color: 0x000000, + leading: 0, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 0, + inputType: "dynamic", + multiline: false, + wordWrap: false, + border: false, + scroll: false, + thickness: 0, + thicknessColor: 0x000000, + autoSize: 0, + bounds: { xMin: 10, xMax: 110, yMin: 5, yMax: 25 }, + text: "Test" + }; + + execute(textField, character); + + expect(textField.xMin).toBe(10); + expect(textField.xMax).toBe(110); + expect(textField.yMin).toBe(5); + expect(textField.yMax).toBe(29); + }); + + it("execute test case10 - handles empty text", () => + { + const textField = new TextField(); + + const character: ITextFieldCharacter = { + font: "Arial", + size: 12, + align: "left", + color: 0x000000, + leading: 0, + letterSpacing: 0, + leftMargin: 0, + rightMargin: 0, + fontType: 0, + inputType: "dynamic", + multiline: false, + wordWrap: false, + border: false, + scroll: false, + thickness: 0, + thicknessColor: 0x000000, + autoSize: 0, + bounds: { xMin: 0, xMax: 100, yMin: 0, yMax: 20 }, + text: "" + }; + + expect(() => { + execute(textField, character); + }).not.toThrow(); + + expect(textField.text).toBe(""); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldCompositionEndUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldCompositionEndUseCase.test.ts new file mode 100644 index 00000000..c9e7f0b2 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldCompositionEndUseCase.test.ts @@ -0,0 +1,120 @@ +import { execute } from "./TextFieldCompositionEndUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it, afterEach } from "vitest"; + +describe("TextFieldCompositionEndUseCase.js test", () => +{ + afterEach(() => + { + // Cleanup if needed + }); + + it("execute test case1 - handles when compositionEndIndex is -1", () => + { + const textField = new TextField(); + textField.compositionEndIndex = -1; + textField.text = "Test"; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case2 - handles when compositionEndIndex is greater than -1", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = 3; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case3 - resets composition indices", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = 3; + + execute(textField); + + expect(textField.compositionStartIndex).toBe(-1); + expect(textField.compositionEndIndex).toBe(-1); + }); + + it("execute test case4 - resets selectIndex", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.selectIndex = 2; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = 3; + + execute(textField); + + expect(textField.selectIndex).toBe(-1); + }); + + it("execute test case5 - validates parameter count", () => + { + expect(execute.length).toBe(1); + }); + + it("execute test case6 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case7 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = 3; + + const result = execute(textField); + + expect(result).toBeUndefined(); + }); + + it("execute test case8 - handles empty text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.compositionStartIndex = -1; + textField.compositionEndIndex = -1; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case9 - handles multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = 5; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case10 - can be called multiple times", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = 3; + + expect(() => { + execute(textField); + execute(textField); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldCompositionUpdateUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldCompositionUpdateUseCase.test.ts new file mode 100644 index 00000000..5269f1d3 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldCompositionUpdateUseCase.test.ts @@ -0,0 +1,113 @@ +import { execute } from "./TextFieldCompositionUpdateUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldCompositionUpdateUseCase.js test", () => +{ + it("execute test case1 - handles single character update", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = -1; + + expect(() => { + execute(textField, "a"); + }).not.toThrow(); + }); + + it("execute test case2 - handles multiple character update", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = -1; + + expect(() => { + execute(textField, "abc"); + }).not.toThrow(); + }); + + it("execute test case3 - handles Japanese characters", () => + { + const textField = new TextField(); + textField.text = ""; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = -1; + + expect(() => { + execute(textField, "あいう"); + }).not.toThrow(); + }); + + it("execute test case4 - handles composition replacement", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = 3; + + expect(() => { + execute(textField, "new"); + }).not.toThrow(); + }); + + it("execute test case5 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case6 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case7 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = -1; + + const result = execute(textField, "a"); + + expect(result).toBeUndefined(); + }); + + it("execute test case8 - handles empty composition text", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = -1; + + expect(() => { + execute(textField, ""); + }).not.toThrow(); + }); + + it("execute test case9 - handles multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2"; + textField.compositionStartIndex = 1; + textField.compositionEndIndex = -1; + + expect(() => { + execute(textField, "test"); + }).not.toThrow(); + }); + + it("execute test case10 - handles composition at end of text", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.compositionStartIndex = 5; + textField.compositionEndIndex = -1; + + expect(() => { + execute(textField, "end"); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldInsertTextUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldInsertTextUseCase.test.ts new file mode 100644 index 00000000..75d93dfa --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldInsertTextUseCase.test.ts @@ -0,0 +1,104 @@ +import { execute } from "./TextFieldInsertTextUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldInsertTextUseCase.js test", () => +{ + it("execute test case1 - returns early when focusIndex is -1", () => + { + const textField = new TextField(); + textField.focusIndex = -1; + + expect(() => { + execute(textField, "test"); + }).not.toThrow(); + }); + + it("execute test case2 - returns early when compositionStartIndex is active", () => + { + const textField = new TextField(); + textField.focusIndex = 1; + textField.compositionStartIndex = 1; + + expect(() => { + execute(textField, "test"); + }).not.toThrow(); + }); + + it("execute test case3 - inserts single character", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 1; + + expect(() => { + execute(textField, "a"); + }).not.toThrow(); + }); + + it("execute test case4 - inserts multiple characters", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 1; + + expect(() => { + execute(textField, "Hello"); + }).not.toThrow(); + }); + + it("execute test case5 - handles text with existing content", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 3; + + expect(() => { + execute(textField, "X"); + }).not.toThrow(); + }); + + it("execute test case6 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case7 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case8 - returns undefined", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 1; + + const result = execute(textField, "test"); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - handles Japanese text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.focusIndex = 1; + + expect(() => { + execute(textField, "あいうえお"); + }).not.toThrow(); + }); + + it("execute test case10 - resets selectIndex", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + textField.selectIndex = 4; + + execute(textField, "X"); + + expect(textField.selectIndex).toBe(-1); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts new file mode 100644 index 00000000..b0974355 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts @@ -0,0 +1,191 @@ +import { execute } from "./TextFieldKeyDownEventUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it, vi } from "vitest"; + +describe("TextFieldKeyDownEventUseCase.js test", () => +{ + it("execute test case1 - returns early when focusIndex is -1", () => + { + const textField = new TextField(); + textField.focusIndex = -1; + + const event = new KeyboardEvent("keydown", { key: "a" }); + + expect(() => { + execute(textField, event); + }).not.toThrow(); + }); + + it("execute test case2 - handles Backspace key", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + textField.deleteText = vi.fn(); + + const event = new KeyboardEvent("keydown", { key: "Backspace" }); + + execute(textField, event); + + expect(textField.deleteText).toHaveBeenCalled(); + }); + + it("execute test case3 - handles Delete key", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + textField.deleteText = vi.fn(); + + const event = new KeyboardEvent("keydown", { key: "Delete" }); + + execute(textField, event); + + expect(textField.deleteText).toHaveBeenCalled(); + }); + + it("execute test case4 - handles Enter key", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + textField.insertText = vi.fn(); + + const event = new KeyboardEvent("keydown", { key: "Enter" }); + + execute(textField, event); + + expect(textField.insertText).toHaveBeenCalledWith("\n"); + }); + + it("execute test case5 - handles ArrowLeft key", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + + const event = new KeyboardEvent("keydown", { key: "ArrowLeft" }); + + expect(() => { + execute(textField, event); + }).not.toThrow(); + }); + + it("execute test case6 - handles ArrowRight key", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + + const event = new KeyboardEvent("keydown", { key: "ArrowRight" }); + + expect(() => { + execute(textField, event); + }).not.toThrow(); + }); + + it("execute test case7 - handles ArrowUp key", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2"; + textField.focusIndex = 8; + + const event = new KeyboardEvent("keydown", { key: "ArrowUp" }); + + expect(() => { + execute(textField, event); + }).not.toThrow(); + }); + + it("execute test case8 - handles ArrowDown key", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2"; + textField.focusIndex = 2; + + const event = new KeyboardEvent("keydown", { key: "ArrowDown" }); + + expect(() => { + execute(textField, event); + }).not.toThrow(); + }); + + it("execute test case9 - handles Ctrl+A (select all)", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + textField.selectAll = vi.fn(); + + const event = new KeyboardEvent("keydown", { key: "a", ctrlKey: true }); + + execute(textField, event); + + expect(textField.selectAll).toHaveBeenCalled(); + }); + + it("execute test case10 - handles Ctrl+C (copy)", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + textField.copy = vi.fn(); + + const event = new KeyboardEvent("keydown", { key: "c", ctrlKey: true }); + + execute(textField, event); + + expect(textField.copy).toHaveBeenCalled(); + }); + + it("execute test case11 - handles Ctrl+V (paste)", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + textField.paste = vi.fn(); + + const event = new KeyboardEvent("keydown", { key: "v", ctrlKey: true }); + + execute(textField, event); + + expect(textField.paste).toHaveBeenCalled(); + }); + + it("execute test case12 - handles regular key press", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + + const event = new KeyboardEvent("keydown", { key: "x" }); + + expect(() => { + execute(textField, event); + }).not.toThrow(); + }); + + it("execute test case13 - validates parameter count", () => + { + expect(execute.length).toBe(2); + }); + + it("execute test case14 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case15 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.focusIndex = 2; + + const event = new KeyboardEvent("keydown", { key: "a" }); + const result = execute(textField, event); + + expect(result).toBeUndefined(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts new file mode 100644 index 00000000..9271e4b0 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts @@ -0,0 +1,101 @@ +import { execute } from "./TextFieldReloadUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldReloadUseCase.js test", () => +{ + it("execute test case1 - reloads text field with text", () => + { + const textField = new TextField(); + textField.text = "Test"; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case2 - reloads empty text field", () => + { + const textField = new TextField(); + textField.text = ""; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case3 - reloads multiline text field", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case4 - validates parameter count", () => + { + expect(execute.length).toBe(1); + }); + + it("execute test case5 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case6 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + + const result = execute(textField); + + expect(result).toBeUndefined(); + }); + + it("execute test case7 - handles text field with autoSize", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.autoSize = "left"; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case8 - handles text field with autoFontSize", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.autoFontSize = true; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case9 - can be called multiple times", () => + { + const textField = new TextField(); + textField.text = "Test"; + + expect(() => { + execute(textField); + execute(textField); + execute(textField); + }).not.toThrow(); + }); + + it("execute test case10 - handles long text", () => + { + const textField = new TextField(); + textField.text = "This is a very long text that should be handled properly by the reload use case"; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts new file mode 100644 index 00000000..bd9d0dd6 --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts @@ -0,0 +1,104 @@ +import { execute } from "./TextFieldSelectAllUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldSelectAllUseCase.js test", () => +{ + it("execute test case1 - selects all text in text field", () => + { + const textField = new TextField(); + textField.text = "Hello World"; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case2 - returns early when text table is too short", () => + { + const textField = new TextField(); + textField.text = ""; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case3 - sets selectIndex to 1", () => + { + const textField = new TextField(); + textField.text = "Test"; + + execute(textField); + + expect(textField.selectIndex).toBe(1); + }); + + it("execute test case4 - handles multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + + expect(() => { + execute(textField); + }).not.toThrow(); + + expect(textField.selectIndex).toBe(1); + }); + + it("execute test case5 - validates parameter count", () => + { + expect(execute.length).toBe(1); + }); + + it("execute test case6 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case7 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + + const result = execute(textField); + + expect(result).toBeUndefined(); + }); + + it("execute test case8 - handles long text", () => + { + const textField = new TextField(); + textField.text = "This is a very long text that should be selected entirely"; + + expect(() => { + execute(textField); + }).not.toThrow(); + + expect(textField.selectIndex).toBe(1); + }); + + it("execute test case9 - handles Japanese text", () => + { + const textField = new TextField(); + textField.text = "日本語のテキスト"; + + expect(() => { + execute(textField); + }).not.toThrow(); + + expect(textField.selectIndex).toBe(1); + }); + + it("execute test case10 - can be called multiple times", () => + { + const textField = new TextField(); + textField.text = "Test"; + + expect(() => { + execute(textField); + execute(textField); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts new file mode 100644 index 00000000..6ce447cb --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts @@ -0,0 +1,108 @@ +import { execute } from "./TextFieldSelectedFocusMoveUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldSelectedFocusMoveUseCase.js test", () => +{ + it("execute test case1 - returns early when selectIndex is -1", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.selectIndex = -1; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case2 - handles single line text", () => + { + const textField = new TextField(); + textField.text = "Hello World"; + textField.selectIndex = 5; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case3 - handles multiline text", () => + { + const textField = new TextField(); + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + textField.selectIndex = 8; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case4 - validates parameter count", () => + { + expect(execute.length).toBe(1); + }); + + it("execute test case5 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case6 - returns undefined", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.selectIndex = 2; + + const result = execute(textField); + + expect(result).toBeUndefined(); + }); + + it("execute test case7 - handles empty text", () => + { + const textField = new TextField(); + textField.text = ""; + textField.selectIndex = 1; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case8 - handles text with scrolling", () => + { + const textField = new TextField(); + textField.text = "This is a long text that requires scrolling"; + textField.selectIndex = 20; + textField.scrollX = 10; + textField.scrollY = 5; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); + + it("execute test case9 - can be called multiple times", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.selectIndex = 2; + + expect(() => { + execute(textField); + execute(textField); + }).not.toThrow(); + }); + + it("execute test case10 - handles selectIndex at start of text", () => + { + const textField = new TextField(); + textField.text = "Test"; + textField.selectIndex = 1; + + expect(() => { + execute(textField); + }).not.toThrow(); + }); +}); diff --git a/packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts new file mode 100644 index 00000000..9016b63e --- /dev/null +++ b/packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts @@ -0,0 +1,167 @@ +import { execute } from "./TextFieldSetFocusIndexUseCase"; +import { TextField } from "../../TextField"; +import { describe, expect, it } from "vitest"; + +describe("TextFieldSetFocusIndexUseCase.js test", () => +{ + it("execute test case1 - returns early when type is not input", () => + { + const textField = new TextField(); + textField.type = "dynamic"; + + expect(() => { + execute(textField, 100, 100); + }).not.toThrow(); + }); + + it("execute test case2 - handles input type text field", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Hello"; + + expect(() => { + execute(textField, 10, 10); + }).not.toThrow(); + }); + + it("execute test case3 - handles empty text field", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = ""; + + expect(() => { + execute(textField, 10, 10); + }).not.toThrow(); + + expect(textField.focusIndex).toBe(1); + expect(textField.selectIndex).toBe(-1); + }); + + it("execute test case4 - handles without selection", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Test"; + + execute(textField, 10, 10, false); + + expect(textField.selectIndex).toBe(-1); + }); + + it("execute test case5 - handles with selection", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Test"; + textField.focusIndex = 2; + + expect(() => { + execute(textField, 10, 10, true); + }).not.toThrow(); + }); + + it("execute test case6 - validates parameter count", () => + { + expect(execute.length).toBe(3); + }); + + it("execute test case7 - verifies function type", () => + { + expect(typeof execute).toBe("function"); + }); + + it("execute test case8 - returns undefined", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Test"; + + const result = execute(textField, 10, 10); + + expect(result).toBeUndefined(); + }); + + it("execute test case9 - handles multiline text", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.multiline = true; + textField.text = "Line1\nLine2\nLine3"; + + expect(() => { + execute(textField, 10, 10); + }).not.toThrow(); + }); + + it("execute test case10 - handles different stage coordinates", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Test"; + + expect(() => { + execute(textField, 50, 50); + execute(textField, 100, 100); + execute(textField, 0, 0); + }).not.toThrow(); + }); + + it("execute test case11 - default selected parameter is false", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Test"; + + execute(textField, 10, 10); + + expect(textField.selectIndex).toBe(-1); + }); + + it("execute test case12 - handles text with scrolling", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "This is a long text"; + textField.scrollX = 10; + textField.scrollY = 5; + + expect(() => { + execute(textField, 10, 10); + }).not.toThrow(); + }); + + it("execute test case13 - handles negative coordinates", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Test"; + + expect(() => { + execute(textField, -10, -10); + }).not.toThrow(); + }); + + it("execute test case14 - handles large coordinates", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "Test"; + + expect(() => { + execute(textField, 1000, 1000); + }).not.toThrow(); + }); + + it("execute test case15 - handles Japanese text", () => + { + const textField = new TextField(); + textField.type = "input"; + textField.text = "日本語テキスト"; + + expect(() => { + execute(textField, 10, 10); + }).not.toThrow(); + }); +}); diff --git a/packages/texture-packer/src/Node.ts b/packages/texture-packer/src/Node.ts index 40aa44b1..385bd35e 100644 --- a/packages/texture-packer/src/Node.ts +++ b/packages/texture-packer/src/Node.ts @@ -130,4 +130,22 @@ export class Node { return nodeDisposeService(this, x, y, width, height); } + + /** + * @description 新規ノードを生成 + * Create a new node + * + * @param {number} index + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @return {Node} + * @method + * @public + */ + create (index: number, x: number, y: number, w: number, h: number): Node + { + return new Node(index, x, y, w, h); + } } \ No newline at end of file diff --git a/packages/texture-packer/src/Node/service/NodeInsertService.ts b/packages/texture-packer/src/Node/service/NodeInsertService.ts index 466aa8fc..447b2966 100644 --- a/packages/texture-packer/src/Node/service/NodeInsertService.ts +++ b/packages/texture-packer/src/Node/service/NodeInsertService.ts @@ -1,4 +1,4 @@ -import { Node } from "../../Node"; +import type { Node } from "../../Node"; /** * @description ノード挿入ロジック @@ -31,11 +31,11 @@ export const execute = (node: Node, width: number, height: number): Node | null const dh = node.h - height; if (dw > dh) { - node.left = new Node(node.index, node.x, node.y, width, height); - node.right = new Node(node.index, node.x + width + 1, node.y, dw - 1, node.h); + node.left = node.create(node.index, node.x, node.y, width, height); + node.right = node.create(node.index, node.x + width + 1, node.y, dw - 1, node.h); } else { - node.left = new Node(node.index, node.x, node.y, node.w, height); - node.right = new Node(node.index, node.x, node.y + height + 1, node.w, dh - 1); + node.left = node.create(node.index, node.x, node.y, node.w, height); + node.right = node.create(node.index, node.x, node.y + height + 1, node.w, dh - 1); } node.used = true; diff --git a/packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts b/packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts new file mode 100644 index 00000000..ce66ea16 --- /dev/null +++ b/packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts @@ -0,0 +1,135 @@ +import { execute } from "./BlendDrawFilterToMainUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; +import type { ITextureObject } from "../../interface/ITextureObject"; +import type { IAttachmentObject } from "../../interface/IAttachmentObject"; +import { $context } from "../../WebGLUtil"; + +vi.mock("./BlendOperationUseCase"); +vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase"); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService"); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase"); +vi.mock("../../TextureManager/usecase/TextureManagerBind01UseCase"); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendDrawShaderService"); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetBlendWithColorTransformUniformService"); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureWithColorTransformUniformService"); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase"); +vi.mock("../service/BlendResetService"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase"); + +describe("BlendDrawFilterToMainUseCase method test", () => { + let mockTextureObject: ITextureObject; + let mockAttachmentObject: IAttachmentObject; + let mockColorTransform: Float32Array; + + beforeEach(() => { + mockTextureObject = { + width: 100, + height: 100, + texture: {} as WebGLTexture + } as ITextureObject; + + mockAttachmentObject = { + width: 200, + height: 200, + texture: mockTextureObject + } as IAttachmentObject; + + mockColorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + $context.$mainAttachmentObject = mockAttachmentObject; + $context.currentAttachmentObject = null; + $context.bind = vi.fn(); + $context.setTransform = vi.fn(); + $context.reset = vi.fn(); + }); + + it("should draw normal blend mode to main attachment", () => { + $context.globalCompositeOperation = "normal"; + + execute(mockTextureObject, mockColorTransform, 10, 20); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + expect($context.setTransform).toHaveBeenCalledWith(1, 0, 0, 1, 10, 20); + }); + + it("should draw layer blend mode to main attachment", () => { + $context.globalCompositeOperation = "layer"; + + execute(mockTextureObject, mockColorTransform, 5, 15); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + expect($context.setTransform).toHaveBeenCalledWith(1, 0, 0, 1, 5, 15); + }); + + it("should draw add blend mode to main attachment", () => { + $context.globalCompositeOperation = "add"; + + execute(mockTextureObject, mockColorTransform, 0, 0); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + expect($context.setTransform).toHaveBeenCalledWith(1, 0, 0, 1, 0, 0); + }); + + it("should draw screen blend mode to main attachment", () => { + $context.globalCompositeOperation = "screen"; + + execute(mockTextureObject, mockColorTransform, 30, 40); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + }); + + it("should draw alpha blend mode to main attachment", () => { + $context.globalCompositeOperation = "alpha"; + + execute(mockTextureObject, mockColorTransform, 50, 60); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + }); + + it("should draw erase blend mode to main attachment", () => { + $context.globalCompositeOperation = "erase"; + + execute(mockTextureObject, mockColorTransform, 70, 80); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + }); + + it("should draw copy blend mode to main attachment", () => { + $context.globalCompositeOperation = "copy"; + + execute(mockTextureObject, mockColorTransform, 90, 100); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + }); + + it("should handle complex blend mode with intermediate framebuffer", () => { + $context.globalCompositeOperation = "multiply"; + + execute(mockTextureObject, mockColorTransform, 10, 20); + + expect($context.reset).toHaveBeenCalled(); + }); + + it("should restore current attachment object after drawing", () => { + const currentAttachment = {} as IAttachmentObject; + $context.currentAttachmentObject = currentAttachment; + $context.globalCompositeOperation = "normal"; + + execute(mockTextureObject, mockColorTransform, 0, 0); + + expect($context.bind).toHaveBeenCalledWith(currentAttachment); + }); + + it("should handle color transform with offset values", () => { + const colorTransformWithOffset = new Float32Array([0.5, 0.5, 0.5, 0.8, 10, 20, 30, 40]); + $context.globalCompositeOperation = "normal"; + + execute(mockTextureObject, colorTransformWithOffset, 15, 25); + + expect($context.bind).toHaveBeenCalledWith(mockAttachmentObject); + expect($context.setTransform).toHaveBeenCalledWith(1, 0, 0, 1, 15, 25); + }); +}); diff --git a/packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts b/packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts new file mode 100644 index 00000000..3c72cf82 --- /dev/null +++ b/packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts @@ -0,0 +1,111 @@ +import { execute } from "./BlnedDrawArraysInstancedUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; +import { $context } from "../../WebGLUtil"; +import * as variantsBlendInstanceShaderService from "../../Shader/Variants/Blend/service/VariantsBlendInstanceShaderService"; + +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendInstanceShaderService"); +vi.mock("../../Shader/ShaderInstancedManager/usecase/ShaderInstancedManagerDrawArraysInstancedUseCase"); +vi.mock("../../Blend/usecase/BlendOperationUseCase"); +vi.mock("../../FrameBufferManager/service/FrameBufferManagerTransferAtlasTextureService"); + +describe("BlnedDrawArraysInstancedUseCase method test", () => { + let mockShaderInstancedManager: any; + + beforeEach(() => { + mockShaderInstancedManager = { + count: 0, + clear: vi.fn() + }; + + $context.globalCompositeOperation = "normal"; + + vi.mocked(variantsBlendInstanceShaderService.execute).mockReturnValue(mockShaderInstancedManager); + }); + + it("should return early when count is 0", () => { + mockShaderInstancedManager.count = 0; + + execute(); + + expect(mockShaderInstancedManager.clear).not.toHaveBeenCalled(); + }); + + it("should execute instance drawing when count is greater than 0", () => { + mockShaderInstancedManager.count = 5; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalled(); + }); + + it("should clear shader manager after drawing", () => { + mockShaderInstancedManager.count = 10; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalledTimes(1); + }); + + it("should handle normal blend mode", () => { + $context.globalCompositeOperation = "normal"; + mockShaderInstancedManager.count = 3; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalled(); + }); + + it("should handle add blend mode", () => { + $context.globalCompositeOperation = "add"; + mockShaderInstancedManager.count = 3; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalled(); + }); + + it("should handle screen blend mode", () => { + $context.globalCompositeOperation = "screen"; + mockShaderInstancedManager.count = 3; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalled(); + }); + + it("should handle multiply blend mode", () => { + $context.globalCompositeOperation = "multiply"; + mockShaderInstancedManager.count = 3; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalled(); + }); + + it("should handle large count value", () => { + mockShaderInstancedManager.count = 1000; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalled(); + }); + + it("should handle count value of 1", () => { + mockShaderInstancedManager.count = 1; + + execute(); + + expect(mockShaderInstancedManager.clear).toHaveBeenCalled(); + }); + + it("should not execute drawing when manager is not initialized", () => { + vi.mocked(variantsBlendInstanceShaderService.execute).mockReturnValue({ + count: 0, + clear: vi.fn() + }); + + execute(); + + expect(mockShaderInstancedManager.clear).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts b/packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts new file mode 100644 index 00000000..589849d0 --- /dev/null +++ b/packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts @@ -0,0 +1,199 @@ +import { execute } from "./BlnedDrawDisplayObjectUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; +import type { Node } from "@next2d/texture-packer"; +import type { IAttachmentObject } from "../../interface/IAttachmentObject"; +import { $context } from "../../WebGLUtil"; +import * as BlendModule from "../../Blend"; +import * as AtlasManagerModule from "../../AtlasManager"; +import { renderQueue } from "@next2d/render-queue"; + +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendInstanceShaderService"); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendDrawShaderService"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase"); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase"); +vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase"); +vi.mock("../../TextureManager/usecase/TextureManagerBind01UseCase"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase"); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase"); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase"); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetBlendWithColorTransformUniformService"); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService"); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureUniformService"); + +describe("BlnedDrawDisplayObjectUseCase method test", () => { + let mockNode: Node; + let mockColorTransform: Float32Array; + let mockShaderInstancedManager: any; + + beforeEach(() => { + mockNode = { + index: 0, + x: 0, + y: 0, + w: 100, + h: 100 + } as Node; + + mockColorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + + mockShaderInstancedManager = { + count: 0 + }; + + $context.globalCompositeOperation = "normal"; + $context.globalAlpha = 1.0; + $context.$matrix = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); + $context.currentAttachmentObject = null; + $context.drawArraysInstanced = vi.fn(); + $context.bind = vi.fn(); + $context.save = vi.fn(); + $context.restore = vi.fn(); + $context.setTransform = vi.fn(); + + vi.spyOn(BlendModule, "$getCurrentBlendMode").mockReturnValue("normal"); + vi.spyOn(BlendModule, "$setCurrentBlendMode").mockImplementation(() => {}); + vi.spyOn(AtlasManagerModule, "$getCurrentAtlasIndex").mockReturnValue(0); + vi.spyOn(AtlasManagerModule, "$setCurrentAtlasIndex").mockImplementation(() => {}); + vi.spyOn(AtlasManagerModule, "$setActiveAtlasIndex").mockImplementation(() => {}); + + renderQueue.length = 0; + renderQueue.push = vi.fn(); + }); + + it("should handle normal blend mode without switching", () => { + $context.globalCompositeOperation = "normal"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should handle layer blend mode", () => { + $context.globalCompositeOperation = "layer"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should handle add blend mode", () => { + $context.globalCompositeOperation = "add"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should handle screen blend mode", () => { + $context.globalCompositeOperation = "screen"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should handle alpha blend mode", () => { + $context.globalCompositeOperation = "alpha"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should handle erase blend mode", () => { + $context.globalCompositeOperation = "erase"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should handle copy blend mode", () => { + $context.globalCompositeOperation = "copy"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should switch blend mode when different from current", () => { + vi.spyOn(BlendModule, "$getCurrentBlendMode").mockReturnValue("multiply"); + $context.globalCompositeOperation = "normal"; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect($context.drawArraysInstanced).toHaveBeenCalled(); + }); + + it("should switch atlas index when different from current", () => { + vi.spyOn(AtlasManagerModule, "$getCurrentAtlasIndex").mockReturnValue(1); + mockNode.index = 0; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect($context.drawArraysInstanced).toHaveBeenCalled(); + }); + + it("should handle multiply blend mode with complex processing", () => { + $context.globalCompositeOperation = "multiply"; + const currentAttachment = {} as IAttachmentObject; + $context.currentAttachmentObject = currentAttachment; + + execute(mockNode, 0, 0, 100, 100, mockColorTransform); + + expect($context.drawArraysInstanced).toHaveBeenCalled(); + }); + + it("should handle color transform with offset values", () => { + const colorTransformWithOffset = new Float32Array([0.5, 0.5, 0.5, 0.8, 50, 100, 150, 200]); + $context.globalCompositeOperation = "normal"; + + execute(mockNode, 0, 0, 100, 100, colorTransformWithOffset); + + expect(renderQueue.push).toHaveBeenCalled(); + }); + + it("should handle transformed matrix", () => { + $context.globalCompositeOperation = "multiply"; + $context.$matrix = new Float32Array([2, 0, 0, 0, 2, 0, 50, 50, 1]); + + execute(mockNode, 0, 0, 200, 200, mockColorTransform); + + expect($context.drawArraysInstanced).toHaveBeenCalled(); + }); + + it("should handle rotated matrix", () => { + $context.globalCompositeOperation = "multiply"; + const angle = Math.PI / 4; + $context.$matrix = new Float32Array([ + Math.cos(angle), Math.sin(angle), 0, + -Math.sin(angle), Math.cos(angle), 0, + 0, 0, 1 + ]); + + execute(mockNode, 0, 0, 150, 150, mockColorTransform); + + expect($context.drawArraysInstanced).toHaveBeenCalled(); + }); + + it("should restore context after complex blend mode", () => { + $context.globalCompositeOperation = "multiply"; + $context.$matrix = new Float32Array([2, 0, 0, 0, 2, 0, 0, 0, 1]); + + execute(mockNode, 0, 0, 200, 200, mockColorTransform); + + expect($context.drawArraysInstanced).toHaveBeenCalled(); + }); + + it("should handle different node dimensions", () => { + mockNode.w = 200; + mockNode.h = 150; + $context.globalCompositeOperation = "normal"; + + execute(mockNode, 0, 0, 200, 150, mockColorTransform); + + expect(renderQueue.push).toHaveBeenCalled(); + }); +}); diff --git a/packages/webgl/src/Context.ts b/packages/webgl/src/Context.ts index c0817e43..97e997f4 100644 --- a/packages/webgl/src/Context.ts +++ b/packages/webgl/src/Context.ts @@ -52,7 +52,8 @@ import { execute as contextCreateImageBitmapService } from "./Context/service/Co import { $setGradientLUTGeneratorMaxLength } from "./Shader/GradientLUTGenerator"; import { $getAtlasAttachmentObject, - $clearTransferBounds + $clearTransferBounds, + $getAtlasTextureObject } from "./AtlasManager"; import { $setReadFrameBuffer, @@ -309,7 +310,7 @@ export class Context // FrameBufferManagerの初期起動 $setReadFrameBuffer(gl); $setDrawFrameBuffer(gl); - $setAtlasFrameBuffer(gl); + $setAtlasFrameBuffer(gl, $getAtlasTextureObject()); $setBitmapFrameBuffer(gl); // VertexArrayObjectの初期起動 diff --git a/packages/webgl/src/FrameBufferManager.ts b/packages/webgl/src/FrameBufferManager.ts index 5d761b17..00ae3572 100644 --- a/packages/webgl/src/FrameBufferManager.ts +++ b/packages/webgl/src/FrameBufferManager.ts @@ -1,5 +1,5 @@ import type { IAttachmentObject } from "./interface/IAttachmentObject"; -import { $getAtlasTextureObject } from "./AtlasManager"; +import type { ITextureObject } from "./interface/ITextureObject"; /** * @description 生成したFrameBufferの管理オブジェクトを配列にプールして再利用します。 @@ -70,20 +70,22 @@ export let $atlasFrameBuffer: WebGLFramebuffer | null = null; * Set the FrameBuffer object for atlas only * * @param {WebGL2RenderingContext} gl + * @param {ITextureObject} texture_object * @return {void} * @method * @protected */ -export const $setAtlasFrameBuffer = (gl: WebGL2RenderingContext): void => -{ +export const $setAtlasFrameBuffer = ( + gl: WebGL2RenderingContext, + texture_object: ITextureObject +): void => { + $atlasFrameBuffer = gl.createFramebuffer() as NonNullable; gl.bindFramebuffer(gl.FRAMEBUFFER, $atlasFrameBuffer); - const textureObject = $getAtlasTextureObject(); - gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, - gl.TEXTURE_2D, textureObject.resource, 0 + gl.TEXTURE_2D, texture_object.resource, 0 ); gl.bindFramebuffer(gl.FRAMEBUFFER, null); diff --git a/packages/webgl/src/PathCommand.ts b/packages/webgl/src/PathCommand.ts index 3f625069..840eed03 100644 --- a/packages/webgl/src/PathCommand.ts +++ b/packages/webgl/src/PathCommand.ts @@ -1,5 +1,4 @@ import type { IPath } from "./interface/IPath"; -import { execute as pathCommandPushCurrentPathToVerticesService } from "./PathCommand/service/PathCommandPushCurrentPathToVerticesService"; import { $getArray } from "./WebGLUtil"; /** @@ -31,6 +30,15 @@ export const $vertices: IPath[] = $getArray(); */ export const $getVertices = (stroke: boolean = false): IPath[] => { - pathCommandPushCurrentPathToVerticesService(stroke); + const minVertices = stroke ? 4 : 10; + if ($currentPath.length < minVertices) { + $currentPath.length = 0; + } + + if ($currentPath.length) { + $vertices.push($currentPath.slice(0)); + $currentPath.length = 0; + } + return $vertices; }; \ No newline at end of file diff --git a/packages/webgl/src/VertexArrayObject.ts b/packages/webgl/src/VertexArrayObject.ts index cefd9c3a..bce83b78 100644 --- a/packages/webgl/src/VertexArrayObject.ts +++ b/packages/webgl/src/VertexArrayObject.ts @@ -2,25 +2,6 @@ import type { IVertexArrayObject } from "./interface/IVertexArrayObject"; import type { IStrokeVertexArrayObject } from "./interface/IStrokeVertexArrayObject"; import { execute as vertexArrayObjectCreateRectVertexArrayObjectUseCase } from "./VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase"; -/** - * @type {number} - * @private - */ -let $id: number = 0; - -/** - * @description VertexArrayObject管理用のユニークIDを返却 - * Returns a unique ID for managing VertexArrayObject - * - * @return {number} - * @method - * @protected - */ -export const $getId = (): number => -{ - return $id++; -}; - /** * @description VertexArrayObjectの再利用のための配列のオブジェクトプール * Object pool of array for reusing VertexArrayObject diff --git a/packages/webgl/src/VertexArrayObject/service/VertexArrayObjectCreateFillObjectService.ts b/packages/webgl/src/VertexArrayObject/service/VertexArrayObjectCreateFillObjectService.ts index 1f6d7248..1340035b 100644 --- a/packages/webgl/src/VertexArrayObject/service/VertexArrayObjectCreateFillObjectService.ts +++ b/packages/webgl/src/VertexArrayObject/service/VertexArrayObjectCreateFillObjectService.ts @@ -1,6 +1,5 @@ import type { IVertexArrayObject } from "../../interface/IVertexArrayObject"; import { $gl } from "../../WebGLUtil"; -import { $getId } from "../../VertexArrayObject"; /** * @description 新規のVertexArrayObjectを生成する @@ -13,7 +12,7 @@ import { $getId } from "../../VertexArrayObject"; export const execute = (): IVertexArrayObject => { return { - "id": $getId(), + "id": crypto.randomUUID(), "resource": $gl.createVertexArray() as NonNullable, "vertexBuffer": $gl.createBuffer() as NonNullable, "vertexLength": 0 diff --git a/packages/webgl/src/interface/IVertexArrayObject.ts b/packages/webgl/src/interface/IVertexArrayObject.ts index 61b39f38..eb8331fd 100644 --- a/packages/webgl/src/interface/IVertexArrayObject.ts +++ b/packages/webgl/src/interface/IVertexArrayObject.ts @@ -1,5 +1,5 @@ export interface IVertexArrayObject { - id: number; + id: string; resource: WebGLVertexArrayObject; vertexBuffer: WebGLBuffer; vertexLength: number; diff --git a/rollup.renderer.worker.config.js b/rollup.renderer.worker.config.js index 04b1249c..f7502e44 100644 --- a/rollup.renderer.worker.config.js +++ b/rollup.renderer.worker.config.js @@ -7,7 +7,7 @@ export default { "input": "./packages/renderer/src/index.ts", "output": { "file": "./dist/renderer.worker.bundle.js", - "format": "iife" + "format": "es" }, "plugins": [ resolve(), diff --git a/rollup.unzip.worker.config.js b/rollup.unzip.worker.config.js index c56afacc..d7627921 100644 --- a/rollup.unzip.worker.config.js +++ b/rollup.unzip.worker.config.js @@ -7,7 +7,7 @@ export default { "input": "./packages/display/src/Loader/worker/ZlibInflateWorker.ts", "output": { "file": "./dist/unzip.worker.bundle.js", - "format": "iife" + "format": "es" }, "plugins": [ resolve(), From 1ff5ca3ef78e73a83854d9a070c6f5761f1a628a Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 31 Oct 2025 17:29:15 +0900 Subject: [PATCH 23/45] =?UTF-8?q?#213=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0(WIP)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BlendDrawFilterToMainUseCase.test.ts | 80 +- .../BlnedDrawArraysInstancedUseCase.test.ts | 17 +- .../BlnedDrawDisplayObjectUseCase.test.ts | 86 +- .../ContextCreateImageBitmapService.test.ts | 96 ++ .../usecase/ContextApplyFilterUseCase.test.ts | 108 +++ .../usecase/ContextBitmapFillUseCase.test.ts | 37 + .../ContextBitmapStrokeUseCase.test.ts | 37 + .../usecase/ContextClipUseCase.test.ts | 77 ++ .../usecase/ContextDrawElementUseCase.test.ts | 65 ++ .../usecase/ContextDrawFillUseCase.test.ts | 69 ++ .../usecase/ContextDrawPixelsUseCase.test.ts | 65 ++ .../usecase/ContextFillUseCase.test.ts | 46 + .../ContextGradientFillUseCase.test.ts | 37 + .../ContextGradientStrokeUseCase.test.ts | 37 + .../ContextLinearGradientFillUseCase.test.ts | 110 +++ .../usecase/ContextNormalFillUseCase.test.ts | 81 ++ .../ContextPatternBitmapFillUseCase.test.ts | 108 +++ .../ContextRadialGradientFillUseCase.test.ts | 114 +++ .../usecase/ContextStrokeUseCase.test.ts | 16 + ...ManagerTransferAtlasTextureService.test.ts | 48 + ...erManagerTransferMainCanvasService.test.ts | 35 + test-output.log | 823 ++++++++++++++++++ 22 files changed, 2157 insertions(+), 35 deletions(-) create mode 100644 packages/webgl/src/Context/service/ContextCreateImageBitmapService.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextBitmapFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextBitmapStrokeUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextGradientFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextGradientStrokeUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts create mode 100644 packages/webgl/src/Context/usecase/ContextStrokeUseCase.test.ts create mode 100644 packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferAtlasTextureService.test.ts create mode 100644 packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferMainCanvasService.test.ts create mode 100644 test-output.log diff --git a/packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts b/packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts index ce66ea16..dbfb7b99 100644 --- a/packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts +++ b/packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts @@ -2,29 +2,75 @@ import { execute } from "./BlendDrawFilterToMainUseCase"; import { describe, expect, it, vi, beforeEach } from "vitest"; import type { ITextureObject } from "../../interface/ITextureObject"; import type { IAttachmentObject } from "../../interface/IAttachmentObject"; -import { $context } from "../../WebGLUtil"; - -vi.mock("./BlendOperationUseCase"); -vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase"); -vi.mock("../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService"); -vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase"); -vi.mock("../../TextureManager/usecase/TextureManagerBind01UseCase"); -vi.mock("../../Shader/Variants/Blend/service/VariantsBlendDrawShaderService"); -vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetBlendWithColorTransformUniformService"); -vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureWithColorTransformUniformService"); -vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase"); -vi.mock("../service/BlendResetService"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase"); + +vi.mock("./BlendOperationUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase", () => ({ + execute: vi.fn(() => ({ width: 100, height: 100 })) +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase", () => ({ + execute: vi.fn(() => ({ texture: { width: 100, height: 100 } })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerBind01UseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendDrawShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetBlendWithColorTransformUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureWithColorTransformUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../service/BlendResetService", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $context: { + globalCompositeOperation: "normal", + currentAttachmentObject: null, + $mainAttachmentObject: null, + bind: vi.fn(), + setTransform: vi.fn(), + reset: vi.fn() + } + }; +}); describe("BlendDrawFilterToMainUseCase method test", () => { let mockTextureObject: ITextureObject; let mockAttachmentObject: IAttachmentObject; let mockColorTransform: Float32Array; + let $context: any; + + beforeEach(async () => { + const WebGLUtil = await import("../../WebGLUtil"); + $context = WebGLUtil.$context; - beforeEach(() => { mockTextureObject = { width: 100, height: 100, diff --git a/packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts b/packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts index 3c72cf82..89be0a00 100644 --- a/packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts +++ b/packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts @@ -1,6 +1,5 @@ import { execute } from "./BlnedDrawArraysInstancedUseCase"; import { describe, expect, it, vi, beforeEach } from "vitest"; -import { $context } from "../../WebGLUtil"; import * as variantsBlendInstanceShaderService from "../../Shader/Variants/Blend/service/VariantsBlendInstanceShaderService"; vi.mock("../../Shader/Variants/Blend/service/VariantsBlendInstanceShaderService"); @@ -8,10 +7,24 @@ vi.mock("../../Shader/ShaderInstancedManager/usecase/ShaderInstancedManagerDrawA vi.mock("../../Blend/usecase/BlendOperationUseCase"); vi.mock("../../FrameBufferManager/service/FrameBufferManagerTransferAtlasTextureService"); +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $context: { + globalCompositeOperation: "normal" + } + }; +}); + describe("BlnedDrawArraysInstancedUseCase method test", () => { let mockShaderInstancedManager: any; + let $context: any; + + beforeEach(async () => { + const WebGLUtil = await import("../../WebGLUtil"); + $context = WebGLUtil.$context; - beforeEach(() => { mockShaderInstancedManager = { count: 0, clear: vi.fn() diff --git a/packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts b/packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts index 589849d0..42b6008a 100644 --- a/packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts +++ b/packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts @@ -2,32 +2,86 @@ import { execute } from "./BlnedDrawDisplayObjectUseCase"; import { describe, expect, it, vi, beforeEach } from "vitest"; import type { Node } from "@next2d/texture-packer"; import type { IAttachmentObject } from "../../interface/IAttachmentObject"; -import { $context } from "../../WebGLUtil"; import * as BlendModule from "../../Blend"; import * as AtlasManagerModule from "../../AtlasManager"; import { renderQueue } from "@next2d/render-queue"; -vi.mock("../../Shader/Variants/Blend/service/VariantsBlendInstanceShaderService"); -vi.mock("../../Shader/Variants/Blend/service/VariantsBlendDrawShaderService"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase"); -vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase"); -vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase"); -vi.mock("../../TextureManager/usecase/TextureManagerBind01UseCase"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase"); -vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase"); -vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase"); -vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetBlendWithColorTransformUniformService"); -vi.mock("../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService"); -vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureUniformService"); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendInstanceShaderService", () => ({ + execute: vi.fn(() => ({ count: 0 })) +})); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendDrawShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase", () => ({ + execute: vi.fn(() => ({ width: 100, height: 100 })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../TextureManager/usecase/TextureManagerBind01UseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase", () => ({ + execute: vi.fn(() => ({ width: 100, height: 100 })) +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase", () => ({ + execute: vi.fn(() => ({ texture: { width: 100, height: 100 } })) +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetBlendWithColorTransformUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureUniformService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $context: { + globalCompositeOperation: "normal", + globalAlpha: 1.0, + $matrix: new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]), + currentAttachmentObject: null, + drawArraysInstanced: vi.fn(), + bind: vi.fn(), + save: vi.fn(), + restore: vi.fn(), + setTransform: vi.fn(), + reset: vi.fn() + }, + $getViewportWidth: vi.fn(() => 800), + $getViewportHeight: vi.fn(() => 600), + $getFloat32Array6: vi.fn((...args: number[]) => new Float32Array(args)), + $RENDER_MAX_SIZE: 4096 + }; +}); describe("BlnedDrawDisplayObjectUseCase method test", () => { let mockNode: Node; let mockColorTransform: Float32Array; let mockShaderInstancedManager: any; + let $context: any; + + beforeEach(async () => { + const WebGLUtil = await import("../../WebGLUtil"); + $context = WebGLUtil.$context; - beforeEach(() => { mockNode = { index: 0, x: 0, diff --git a/packages/webgl/src/Context/service/ContextCreateImageBitmapService.test.ts b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.test.ts new file mode 100644 index 00000000..b2020532 --- /dev/null +++ b/packages/webgl/src/Context/service/ContextCreateImageBitmapService.test.ts @@ -0,0 +1,96 @@ +import { execute } from "./ContextCreateImageBitmapService"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +describe("ContextCreateImageBitmapService.js method test", () => +{ + beforeEach(() => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $context: { + $mainAttachmentObject: { + width: 100, + height: 100 + } + }, + $gl: { + "FRAMEBUFFER": 36160, + "COLOR_ATTACHMENT0": 36064, + "TEXTURE_2D": 3553, + "RGBA": 6408, + "UNSIGNED_BYTE": 5121, + "PIXEL_PACK_BUFFER": 35051, + "STREAM_READ": 35041, + "SYNC_GPU_COMMANDS_COMPLETE": 37143, + "SYNC_FLUSH_COMMANDS_BIT": 1, + "TIMEOUT_EXPIRED": 37147, + "ALREADY_SIGNALED": 37146, + "CONDITION_SATISFIED": 37148, + "bindFramebuffer": vi.fn(), + "framebufferTexture2D": vi.fn(), + "bufferData": vi.fn(), + "readPixels": vi.fn(), + "fenceSync": vi.fn(() => ({} as WebGLSync)), + "clientWaitSync": vi.fn(() => 37146), + "deleteSync": vi.fn(), + "getBufferSubData": vi.fn() + }, + $upperPowerOfTwo: (n: number) => { + let result = 1; + while (result < n) result *= 2; + return result; + } + } + }); + + vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() + })); + + vi.mock("../../TextureManager/usecase/TextureManagerGetMainTextureFromBoundsUseCase", () => ({ + execute: vi.fn(() => ({ + resource: {}, + width: 100, + height: 100 + })) + })); + + vi.mock("../../FrameBufferManager", () => ({ + $readFrameBuffer: {}, + $getPixelFrameBuffer: vi.fn(() => ({})) + })); + + global.createImageBitmap = vi.fn(async () => ({}) as any); + (global as any).ImageData = class ImageData { + data: Uint8ClampedArray; + width: number; + height: number; + constructor(data: Uint8ClampedArray, width: number, height: number) { + this.data = data; + this.width = width; + this.height = height; + } + }; + }); + + it("test case - create image bitmap with valid dimensions", async () => + { + const result = await execute(100, 100); + expect(result).toBeDefined(); + }); + + it("test case - create image bitmap with small dimensions", async () => + { + const result = await execute(10, 10); + expect(result).toBeDefined(); + }); + + it("test case - create image bitmap with different dimensions", async () => + { + const result = await execute(50, 75); + expect(result).toBeDefined(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts new file mode 100644 index 00000000..2df86a18 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts @@ -0,0 +1,108 @@ +import { execute } from "./ContextApplyFilterUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; +import type { Node } from "@next2d/texture-packer"; +import type { IBlendMode } from "../../interface/IBlendMode"; + +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase", () => ({ + execute: vi.fn(() => ({ width: 100, height: 100 })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase", () => ({ + execute: vi.fn(() => ({ texture: { width: 100, height: 100 } })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Blend/usecase/BlendDrawFilterToMainUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("@next2d/cache", () => ({ + $cacheStore: { + generateFilterKeys: vi.fn(() => "filterKey"), + get: vi.fn(() => null), + set: vi.fn() + } +})); +vi.mock("../../Filter", () => ({ + $offset: { x: 0, y: 0 } +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $context: { + currentAttachmentObject: null, + bind: vi.fn(), + reset: vi.fn(), + setTransform: vi.fn(), + save: vi.fn(), + restore: vi.fn(), + globalCompositeOperation: "normal" + }, + $getFloat32Array6: vi.fn((...args: number[]) => new Float32Array(args)), + $getDevicePixelRatio: vi.fn(() => 1), + $multiplyMatrices: vi.fn(() => new Float32Array([1, 0, 0, 1, 0, 0])), + $poolFloat32Array6: vi.fn() + }; +}); + +describe("ContextApplyFilterUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute filter application", () => + { + const mockNode: Node = { + x: 0, + y: 0, + w: 100, + h: 100, + children: [], + characterId: 1 + } as Node; + + const uniqueKey = "test-key"; + const updated = false; + const width = 100; + const height = 100; + const isBitmap = false; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const colorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]); + const blendMode: IBlendMode = "normal"; + const bounds = new Float32Array([0, 0, 100, 100]); + const params = new Float32Array([]); + + expect(() => { + execute( + mockNode, + uniqueKey, + updated, + width, + height, + isBitmap, + matrix, + colorTransform, + blendMode, + bounds, + params + ); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextBitmapFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextBitmapFillUseCase.test.ts new file mode 100644 index 00000000..57f09574 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextBitmapFillUseCase.test.ts @@ -0,0 +1,37 @@ +import { execute } from "./ContextBitmapFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; + +describe("ContextBitmapFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute bitmap fill", () => + { + const pixels = new Uint8Array([255, 0, 0, 255]); + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const width = 2; + const height = 2; + const repeat = false; + const smooth = true; + + expect(() => { + execute(pixels, matrix, width, height, repeat, smooth); + }).not.toThrow(); + }); + + it("test case - should handle empty vertices", () => + { + const pixels = new Uint8Array([]); + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const width = 0; + const height = 0; + const repeat = false; + const smooth = false; + + expect(() => { + execute(pixels, matrix, width, height, repeat, smooth); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextBitmapStrokeUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextBitmapStrokeUseCase.test.ts new file mode 100644 index 00000000..37e89f3f --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextBitmapStrokeUseCase.test.ts @@ -0,0 +1,37 @@ +import { execute } from "./ContextBitmapStrokeUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; + +describe("ContextBitmapStrokeUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute bitmap stroke", () => + { + const pixels = new Uint8Array([255, 0, 0, 255]); + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const width = 2; + const height = 2; + const repeat = false; + const smooth = true; + + expect(() => { + execute(pixels, matrix, width, height, repeat, smooth); + }).not.toThrow(); + }); + + it("test case - should handle empty vertices", () => + { + const pixels = new Uint8Array([]); + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const width = 0; + const height = 0; + const repeat = false; + const smooth = false; + + expect(() => { + execute(pixels, matrix, width, height, repeat, smooth); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts new file mode 100644 index 00000000..99e448cb --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts @@ -0,0 +1,77 @@ +import { execute } from "./ContextClipUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import * as MaskModule from "../../Mask"; +import * as MeshModule from "../../Mesh"; +import * as GridModule from "../../Grid"; + +vi.mock("../../VertexArrayObject/usecase/VertexArrayObjectBindFillMeshUseCase", () => ({ + execute: vi.fn(() => ({ vertexArrayObject: {}, indexBuffer: {} })) +})); +vi.mock("../../VertexArrayObject/service/VertexArrayObjectReleaseVertexArrayObjectService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Shape/service/VariantsShapeMaskShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMaskUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Mask/service/MaskUnionMaskService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + enable: vi.fn(), + disable: vi.fn(), + scissor: vi.fn(), + stencilMask: vi.fn(), + SCISSOR_TEST: 0 + }, + $context: { + currentAttachmentObject: null + } + }; +}); + +describe("ContextClipUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + vi.spyOn(MeshModule, "$clearFillBufferSetting").mockImplementation(() => {}); + vi.spyOn(GridModule, "$terminateGrid").mockImplementation(() => {}); + Object.defineProperty(MeshModule, "$fillBufferIndexes", { + value: [], + writable: true, + configurable: true + }); + Object.defineProperty(GridModule, "$gridDataMap", { + value: new Map(), + writable: true, + configurable: true + }); + Object.defineProperty(MaskModule, "$clipLevels", { + value: new Map(), + writable: true, + configurable: true + }); + Object.defineProperty(MaskModule, "$clipBounds", { + value: new Map(), + writable: true, + configurable: true + }); + }); + + it("test case - should execute clip operation", () => + { + expect(() => { + execute(); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts new file mode 100644 index 00000000..6388e9a5 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts @@ -0,0 +1,65 @@ +import { execute } from "./ContextDrawElementUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import type { Node } from "@next2d/texture-packer"; + +vi.mock("../../TextureManager/usecase/TextureManagerCreateFromCanvasUseCase", () => ({ + execute: vi.fn(() => ({ width: 100, height: 100 })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendTextureShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetTextureUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Blend/service/BlendResetService", () => ({ + execute: vi.fn() +})); + +describe("ContextDrawElementUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute draw element with OffscreenCanvas", () => + { + const mockNode: Node = { + x: 0, + y: 0, + w: 100, + h: 100, + children: [], + characterId: 1 + } as Node; + + const mockCanvas = {} as OffscreenCanvas; + + expect(() => { + execute(mockNode, mockCanvas); + }).not.toThrow(); + }); + + it("test case - should execute draw element with ImageBitmap", () => + { + const mockNode: Node = { + x: 0, + y: 0, + w: 100, + h: 100, + children: [], + characterId: 1 + } as Node; + + const mockImageBitmap = {} as ImageBitmap; + + expect(() => { + execute(mockNode, mockImageBitmap); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts new file mode 100644 index 00000000..64aba267 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts @@ -0,0 +1,69 @@ +import { execute } from "./ContextDrawFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import * as MeshModule from "../../Mesh"; +import * as GridModule from "../../Grid"; + +vi.mock("../../VertexArrayObject/usecase/VertexArrayObjectBindFillMeshUseCase", () => ({ + execute: vi.fn(() => ({ vertexArrayObject: {}, indexBuffer: {} })) +})); +vi.mock("../../VertexArrayObject/service/VertexArrayObjectReleaseVertexArrayObjectService", () => ({ + execute: vi.fn() +})); +vi.mock("./ContextNormalFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("./ContextLinearGradientFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("./ContextRadialGradientFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("./ContextPatternBitmapFillUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + enable: vi.fn(), + disable: vi.fn(), + frontFace: vi.fn(), + stencilMask: vi.fn(), + STENCIL_TEST: 0, + CCW: 1 + } + }; +}); + +describe("ContextDrawFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + vi.spyOn(MeshModule, "$clearFillBufferSetting").mockImplementation(() => {}); + vi.spyOn(GridModule, "$terminateGrid").mockImplementation(() => {}); + Object.defineProperty(MeshModule, "$fillTypes", { + value: [], + writable: true, + configurable: true + }); + Object.defineProperty(MeshModule, "$fillBufferIndexes", { + value: { shift: vi.fn() }, + writable: true, + configurable: true + }); + Object.defineProperty(GridModule, "$gridDataMap", { + value: new Map(), + writable: true, + configurable: true + }); + }); + + it("test case - should execute draw fill", () => + { + expect(() => { + execute(); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts new file mode 100644 index 00000000..db9ec0e6 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts @@ -0,0 +1,65 @@ +import { execute } from "./ContextDrawPixelsUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import type { Node } from "@next2d/texture-packer"; + +vi.mock("../../TextureManager/usecase/TextureManagerCreateFromPixelsUseCase", () => ({ + execute: vi.fn(() => ({ width: 100, height: 100 })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Blend/service/VariantsBlendTextureShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetTextureUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Blend/service/BlendResetService", () => ({ + execute: vi.fn() +})); + +describe("ContextDrawPixelsUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute draw pixels", () => + { + const mockNode: Node = { + x: 0, + y: 0, + w: 100, + h: 100, + children: [], + characterId: 1 + } as Node; + + const pixels = new Uint8Array([255, 0, 0, 255, 0, 255, 0, 255]); + + expect(() => { + execute(mockNode, pixels); + }).not.toThrow(); + }); + + it("test case - should handle empty pixels", () => + { + const mockNode: Node = { + x: 0, + y: 0, + w: 0, + h: 0, + children: [], + characterId: 1 + } as Node; + + const pixels = new Uint8Array([]); + + expect(() => { + execute(mockNode, pixels); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextFillUseCase.test.ts new file mode 100644 index 00000000..669a8804 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextFillUseCase.test.ts @@ -0,0 +1,46 @@ +import { execute } from "./ContextFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import type { IFillType } from "../../interface/IFillType"; + +describe("ContextFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute fill with fill type", () => + { + const fillType: IFillType = "fill"; + + expect(() => { + execute(fillType); + }).not.toThrow(); + }); + + it("test case - should execute fill with linear type", () => + { + const fillType: IFillType = "linear"; + + expect(() => { + execute(fillType); + }).not.toThrow(); + }); + + it("test case - should execute fill with radial type", () => + { + const fillType: IFillType = "radial"; + + expect(() => { + execute(fillType); + }).not.toThrow(); + }); + + it("test case - should execute fill with bitmap type", () => + { + const fillType: IFillType = "bitmap"; + + expect(() => { + execute(fillType); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextGradientFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextGradientFillUseCase.test.ts new file mode 100644 index 00000000..a4239e6c --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextGradientFillUseCase.test.ts @@ -0,0 +1,37 @@ +import { execute } from "./ContextGradientFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; + +describe("ContextGradientFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute linear gradient fill", () => + { + const type = 0; // linear + const stops = [0, 0xff0000ff, 1, 0x0000ffff]; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const spread = 0; + const interpolation = 0; + const focal = 0; + + expect(() => { + execute(type, stops, matrix, spread, interpolation, focal); + }).not.toThrow(); + }); + + it("test case - should execute radial gradient fill", () => + { + const type = 1; // radial + const stops = [0, 0xff0000ff, 1, 0x0000ffff]; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const spread = 0; + const interpolation = 0; + const focal = 0.5; + + expect(() => { + execute(type, stops, matrix, spread, interpolation, focal); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextGradientStrokeUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextGradientStrokeUseCase.test.ts new file mode 100644 index 00000000..8db674ad --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextGradientStrokeUseCase.test.ts @@ -0,0 +1,37 @@ +import { execute } from "./ContextGradientStrokeUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; + +describe("ContextGradientStrokeUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute linear gradient stroke", () => + { + const type = 0; // linear + const stops = [0, 0xff0000ff, 1, 0x0000ffff]; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const spread = 0; + const interpolation = 0; + const focal = 0; + + expect(() => { + execute(type, stops, matrix, spread, interpolation, focal); + }).not.toThrow(); + }); + + it("test case - should execute radial gradient stroke", () => + { + const type = 1; // radial + const stops = [0, 0xff0000ff, 1, 0x0000ffff]; + const matrix = new Float32Array([1, 0, 0, 1, 0, 0]); + const spread = 0; + const interpolation = 0; + const focal = 0.5; + + expect(() => { + execute(type, stops, matrix, spread, interpolation, focal); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts new file mode 100644 index 00000000..63767405 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts @@ -0,0 +1,110 @@ +import { execute } from "./ContextLinearGradientFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import type { IVertexArrayObject } from "../../interface/IVertexArrayObject"; +import * as GradientModule from "../../Gradient"; + +vi.mock("../../Shader/GradientLUTGenerator/usecase/GradientLUTGenerateShapeTextureUseCase", () => ({ + execute: vi.fn(() => ({ width: 256, height: 1 })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Shape/service/VariantsShapeMaskShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMaskUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Gradient/usecase/VariantsGradientShapeShaderUseCase", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetGradientFillUniformService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + disable: vi.fn(), + enable: vi.fn(), + stencilFunc: vi.fn(), + stencilOpSeparate: vi.fn(), + colorMask: vi.fn(), + stencilOp: vi.fn(), + frontFace: vi.fn(), + stencilMask: vi.fn(), + STENCIL_TEST: 0, + CCW: 1, + ALWAYS: 2, + KEEP: 3, + INCR_WRAP: 4, + DECR_WRAP: 5, + FRONT: 6, + BACK: 7, + SAMPLE_ALPHA_TO_COVERAGE: 8, + NOTEQUAL: 9 + }, + $context: { + $matrix: new Float32Array([1, 0, 0, 1, 0, 0]) + }, + $linearGradientXY: vi.fn(() => new Float32Array([0, 0, 1, 1])), + $inverseMatrix: vi.fn(() => new Float32Array([1, 0, 0, 1, 0, 0])), + $poolFloat32Array4: vi.fn(), + $poolFloat32Array6: vi.fn() + }; +}); + +describe("ContextLinearGradientFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + vi.spyOn(GradientModule.$gradientData, "shift") + .mockReturnValueOnce([0, 0x000000, 1, 0xffffff]) + .mockReturnValueOnce(new Float32Array([1, 0, 0, 1, 0, 0])) + .mockReturnValueOnce(0) + .mockReturnValueOnce(0); + }); + + it("test case - should execute linear gradient fill shader", () => + { + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = null; + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); + + it("test case - should execute with grid data", () => + { + vi.spyOn(GradientModule.$gradientData, "shift") + .mockReturnValueOnce([0, 0x000000, 1, 0xffffff]) + .mockReturnValueOnce(new Float32Array([1, 0, 0, 1, 0, 0])) + .mockReturnValueOnce(0) + .mockReturnValueOnce(0); + + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = new Float32Array([1, 0, 0, 1, 0, 0]); + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts new file mode 100644 index 00000000..2f3eb28c --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts @@ -0,0 +1,81 @@ +import { execute } from "./ContextNormalFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import type { IVertexArrayObject } from "../../interface/IVertexArrayObject"; + +vi.mock("../../Shader/Variants/Shape/service/VariantsShapeMaskShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMaskUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Shape/service/VariantsShapeSolidColorShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetFillUniformService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + stencilFunc: vi.fn(), + stencilOpSeparate: vi.fn(), + colorMask: vi.fn(), + enable: vi.fn(), + disable: vi.fn(), + ALWAYS: 0, + KEEP: 1, + INCR_WRAP: 2, + DECR_WRAP: 3, + FRONT: 4, + BACK: 5, + SAMPLE_ALPHA_TO_COVERAGE: 6, + NOTEQUAL: 7, + stencilOp: vi.fn() + } + }; +}); + +describe("ContextNormalFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute normal fill shader", () => + { + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = null; + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); + + it("test case - should execute with grid data", () => + { + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = new Float32Array([1, 0, 0, 1, 0, 0]); + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts new file mode 100644 index 00000000..82cb509d --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts @@ -0,0 +1,108 @@ +import { execute } from "./ContextPatternBitmapFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import type { IVertexArrayObject } from "../../interface/IVertexArrayObject"; +import * as BitmapModule from "../../Bitmap"; + +vi.mock("../../Shader/Variants/Shape/service/VariantsShapeMaskShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMaskUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Bitmap/service/VariantsBitmapShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetBitmapFillUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../TextureManager/usecase/TextureManagerCreateFromPixelsUseCase", () => ({ + execute: vi.fn(() => ({ width: 100, height: 100 })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + stencilFunc: vi.fn(), + stencilOpSeparate: vi.fn(), + colorMask: vi.fn(), + enable: vi.fn(), + disable: vi.fn(), + ALWAYS: 0, + KEEP: 1, + INCR_WRAP: 2, + DECR_WRAP: 3, + FRONT: 4, + BACK: 5, + SAMPLE_ALPHA_TO_COVERAGE: 6, + NOTEQUAL: 7, + stencilOp: vi.fn() + }, + $context: { + save: vi.fn(), + restore: vi.fn(), + transform: vi.fn() + } + }; +}); + +describe("ContextPatternBitmapFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + vi.spyOn(BitmapModule.$bitmapData, "shift") + .mockReturnValueOnce(new Uint8Array([255, 0, 0, 255])) + .mockReturnValueOnce(new Float32Array([1, 0, 0, 1, 0, 0])) + .mockReturnValueOnce(100) + .mockReturnValueOnce(100) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true); + }); + + it("test case - should execute pattern bitmap fill shader", () => + { + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = null; + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); + + it("test case - should execute with grid data", () => + { + vi.spyOn(BitmapModule.$bitmapData, "shift") + .mockReturnValueOnce(new Uint8Array([255, 0, 0, 255])) + .mockReturnValueOnce(new Float32Array([1, 0, 0, 1, 0, 0])) + .mockReturnValueOnce(100) + .mockReturnValueOnce(100) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true); + + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = new Float32Array([1, 0, 0, 1, 0, 0]); + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts new file mode 100644 index 00000000..e95b0f02 --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts @@ -0,0 +1,114 @@ +import { execute } from "./ContextRadialGradientFillUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; +import type { IVertexArrayObject } from "../../interface/IVertexArrayObject"; +import * as GradientModule from "../../Gradient"; + +vi.mock("../../Shader/Variants/Shape/service/VariantsShapeMaskShaderService", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetMaskUniformService", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerFillUseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/GradientLUTGenerator/usecase/GradientLUTGenerateShapeTextureUseCase", () => ({ + execute: vi.fn(() => ({ width: 256, height: 1 })) +})); +vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() +})); +vi.mock("../../Shader/Variants/Gradient/usecase/VariantsGradientShapeShaderUseCase", () => ({ + execute: vi.fn(() => ({})) +})); +vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetGradientFillUniformService", () => ({ + execute: vi.fn() +})); + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + disable: vi.fn(), + enable: vi.fn(), + stencilFunc: vi.fn(), + stencilOpSeparate: vi.fn(), + colorMask: vi.fn(), + stencilOp: vi.fn(), + frontFace: vi.fn(), + stencilMask: vi.fn(), + STENCIL_TEST: 0, + CCW: 1, + ALWAYS: 2, + KEEP: 3, + INCR_WRAP: 4, + DECR_WRAP: 5, + FRONT: 6, + BACK: 7, + SAMPLE_ALPHA_TO_COVERAGE: 8, + NOTEQUAL: 9 + }, + $context: { + $matrix: new Float32Array([1, 0, 0, 1, 0, 0]), + $stack: [new Float32Array([1, 0, 0, 1, 0, 0])], + save: vi.fn(), + restore: vi.fn(), + transform: vi.fn() + }, + $inverseMatrix: vi.fn(() => new Float32Array([1, 0, 0, 1, 0, 0])), + $poolFloat32Array6: vi.fn() + }; +}); + +describe("ContextRadialGradientFillUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + vi.spyOn(GradientModule.$gradientData, "shift") + .mockReturnValueOnce([0, 0x000000, 1, 0xffffff]) + .mockReturnValueOnce(new Float32Array([1, 0, 0, 1, 0, 0])) + .mockReturnValueOnce(0) + .mockReturnValueOnce(0) + .mockReturnValueOnce(0); + }); + + it("test case - should execute radial gradient fill shader", () => + { + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = null; + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); + + it("test case - should execute with grid data", () => + { + vi.spyOn(GradientModule.$gradientData, "shift") + .mockReturnValueOnce([0, 0x000000, 1, 0xffffff]) + .mockReturnValueOnce(new Float32Array([1, 0, 0, 1, 0, 0])) + .mockReturnValueOnce(0) + .mockReturnValueOnce(0) + .mockReturnValueOnce(0); + + const mockVertexArrayObject: IVertexArrayObject = { + vertexArrayObject: {} as WebGLVertexArrayObject, + indexBuffer: {} as WebGLBuffer, + }; + + const offset = 0; + const indexCount = 3; + const gridData = new Float32Array([1, 0, 0, 1, 0, 0]); + + expect(() => { + execute(mockVertexArrayObject, offset, indexCount, gridData); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/Context/usecase/ContextStrokeUseCase.test.ts b/packages/webgl/src/Context/usecase/ContextStrokeUseCase.test.ts new file mode 100644 index 00000000..9969950b --- /dev/null +++ b/packages/webgl/src/Context/usecase/ContextStrokeUseCase.test.ts @@ -0,0 +1,16 @@ +import { execute } from "./ContextStrokeUseCase"; +import { describe, expect, it, beforeEach, vi } from "vitest"; + +describe("ContextStrokeUseCase.js method test", () => +{ + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("test case - should execute stroke drawing", () => + { + expect(() => { + execute(); + }).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferAtlasTextureService.test.ts b/packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferAtlasTextureService.test.ts new file mode 100644 index 00000000..bc06b337 --- /dev/null +++ b/packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferAtlasTextureService.test.ts @@ -0,0 +1,48 @@ +import { execute } from "./FrameBufferManagerTransferAtlasTextureService"; +import { describe, expect, it, vi } from "vitest"; + +describe("FrameBufferManagerTransferAtlasTextureService.ts test", () => +{ + it("execute test case1", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "DRAW_FRAMEBUFFER": 0x8CA9, + "COLOR_BUFFER_BIT": 0x00004000, + "NEAREST": 0x2600, + "SCISSOR_TEST": 0x0C11, + "bindFramebuffer": vi.fn(() => {}), + "blitFramebuffer": vi.fn(() => {}), + "enable": vi.fn(() => {}), + "disable": vi.fn(() => {}), + "scissor": vi.fn(() => {}), + }, + $context: { + "currentAttachmentObject": null, + "atlasAttachmentObject": { + "width": 2048, + "height": 2048, + }, + "bind": vi.fn(() => {}), + } + } + }); + + vi.mock("../../AtlasManager", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + "$getActiveAtlasIndex": vi.fn(() => 0), + "$getActiveTransferBounds": vi.fn(() => [0, 0, 100, 100]), + "$getActiveAllTransferBounds": vi.fn(() => [0, 0, 200, 200]), + } + }); + + expect(() => execute()).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferMainCanvasService.test.ts b/packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferMainCanvasService.test.ts new file mode 100644 index 00000000..dde85a6b --- /dev/null +++ b/packages/webgl/src/FrameBufferManager/service/FrameBufferManagerTransferMainCanvasService.test.ts @@ -0,0 +1,35 @@ +import type { IAttachmentObject } from "../../interface/IAttachmentObject"; +import { execute } from "./FrameBufferManagerTransferMainCanvasService"; +import { describe, expect, it, vi } from "vitest"; + +describe("FrameBufferManagerTransferMainCanvasService.ts test", () => +{ + it("execute test case1", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "READ_FRAMEBUFFER": 0x8CA8, + "DRAW_FRAMEBUFFER": 0x8CA9, + "FRAMEBUFFER": 0x8D40, + "COLOR_BUFFER_BIT": 0x00004000, + "NEAREST": 0x2600, + "bindFramebuffer": vi.fn(() => {}), + "blitFramebuffer": vi.fn(() => {}), + }, + $context: { + "$mainAttachmentObject": { + "width": 800, + "height": 600, + } as IAttachmentObject, + "bind": vi.fn(() => {}), + } + } + }); + + expect(() => execute()).not.toThrow(); + }); +}); diff --git a/test-output.log b/test-output.log new file mode 100644 index 00000000..e1860338 --- /dev/null +++ b/test-output.log @@ -0,0 +1,823 @@ + +> @next2d/player@2.6.0 test +> vitest --run + + + RUN  v4.0.5 /Users/l_0018/PhpstormProjects/Next2D/player + + ❯ packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts (2 tests | 2 failed) 5ms + × test case - should execute normal fill shader 4ms + × test case - should execute with grid data 0ms + ❯ packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts (2 tests | 2 failed) 4ms + × test case - should execute draw element with OffscreenCanvas 3ms + × test case - should execute draw element with ImageBitmap 0ms + ❯ packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts (2 tests | 2 failed) 9ms + × test case - should execute draw pixels 6ms + × test case - should handle empty pixels 2ms + ❯ packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts (2 tests | 2 failed) 6ms + × test case - should execute pattern bitmap fill shader 5ms + × test case - should execute with grid data 1ms + ❯ packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts (2 tests | 2 failed) 5ms + × test case - should execute linear gradient fill shader 4ms + × test case - should execute with grid data 1ms + ❯ packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts (2 tests | 2 failed) 8ms + × test case - should execute radial gradient fill shader 6ms + × test case - should execute with grid data 1ms + ❯ packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts (1 test | 1 failed) 4ms + × test case - should execute draw fill 4ms + ❯ packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts (1 test | 1 failed) 4ms + × test case - should execute clip operation 3ms + ✓ packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts (4 tests) 65ms + ✓ packages/core/src/Next2D/service/VideoSyncService.test.ts (2 tests) 38ms + ✓ packages/core/src/Canvas/service/CanvasInitializeService.test.ts (2 tests) 14ms + ✓ packages/core/src/Player/service/PlayerRemoveLoadingElementService.test.ts (1 test) 21ms + ✓ packages/text/src/TextField/service/TextFieldBlinkingClearTimeoutService.test.ts (15 tests) 157ms + ✓ packages/core/src/Player/service/PlayerApplyContainerElementStyleService.test.ts (3 tests) 17ms + ❯ packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts (1 test | 1 failed) 4ms + × test case - should execute filter application 4ms + ✓ packages/media/src/Sound/usecase/SoundLoadUseCase.test.ts (6 tests) 16ms + ✓ packages/text/src/TextField/usecase/TextFieldCompositionEndUseCase.test.ts (10 tests) 8ms + ✓ packages/text/src/TextField/usecase/TextFieldBuildFromCharacterUseCase.test.ts (10 tests) 11ms + ✓ packages/text/src/TextArea/usecase/TextAreaCompositionUpdateUseCase.test.ts (15 tests) 14ms + ✓ packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts (15 tests) 15ms + ✓ packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts (15 tests) 22ms + ✓ packages/display/src/TextField/usecase/TextFieldHitTestUseCase.test.ts (15 tests) 14ms + ✓ packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.test.ts (15 tests) 23ms + ✓ packages/text/src/TextField/usecase/TextFieldArrowUpUseCase.test.ts (10 tests) 14ms + ✓ packages/text/src/TextField/usecase/TextFieldArrowRightUseCase.test.ts (10 tests) 15ms + ✓ packages/text/src/TextField/usecase/TextFieldCompositionUpdateUseCase.test.ts (10 tests) 12ms + ✓ packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts (10 tests) 12ms + ✓ packages/text/src/TextField/usecase/TextFieldArrowLeftUseCase.test.ts (10 tests) 10ms + ✓ packages/text/src/TextField/usecase/TextFieldArrowDownUseCase.test.ts (10 tests) 15ms + ✓ packages/text/src/TextField/usecase/TextFieldInsertTextUseCase.test.ts (10 tests) 16ms + ✓ packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.test.ts (4 tests) 10ms + ✓ packages/core/src/Player/usecase/PlayerHitTestUseCase.test.ts (5 tests) 23ms + ✓ packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts (15 tests) 10ms + ✓ packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts (10 tests) 15ms + ✓ packages/text/src/TextArea/usecase/TextAreaInputUseCase.test.ts (15 tests) 7ms + ✓ packages/display/src/Video/usecase/VideoHitTestUseCase.test.ts (15 tests) 14ms + ✓ packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts (10 tests) 10ms + ✓ packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts (10 tests) 12ms + ✓ packages/text/src/TextArea/usecase/TextAreaCompositionStartUseCase.test.ts (10 tests) 8ms + ✓ packages/display/src/Graphics/service/GraphicsHitTestService.test.ts (15 tests) 9ms + ✓ packages/text/src/TextArea/usecase/TextAreaCompositionEndUseCase.test.ts (10 tests) 8ms + ✓ packages/text/src/TextField/usecase/TextFieldResizeAutoFontSizeUseCase.test.ts (1 test) 7ms + ✓ packages/core/src/Next2D/usecase/LoadUseCase.test.ts (6 tests) 8ms + ✓ packages/core/src/Player/usecase/PlayerBootUseCase.test.ts (5 tests) 10ms + ✓ packages/display/src/Shape/usecase/ShapeHitTestUseCase.test.ts (10 tests) 10ms + ✓ packages/text/src/TextField/usecase/TextFieldCopyUseCase.test.ts (3 tests) 11ms + ✓ packages/core/src/Player/service/PlayerLoadingAnimationService.test.ts (1 test) 5ms + ✓ packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts (10 tests) 6ms + ✓ packages/text/src/TextField/usecase/TextFieldDeleteTextUseCase.test.ts (2 tests) 5ms + ✓ packages/core/src/Player/service/PlayerPointerDownEventService.test.ts (3 tests) 6ms + ✓ packages/text/src/TextField/usecase/TextFieldSetScrollYUseCase.test.ts (1 test) 5ms + ✓ packages/text/src/TextField/usecase/TextFieldReplaceTextUseCase.test.ts (2 tests) 7ms + ✓ packages/text/src/TextField/service/TextFieldPasteService.test.ts (1 test) 5ms + ✓ packages/filters/src/GradientBevelFilter/service/GradientBevelFilterToNumberArrayService.test.ts (4 tests) 3ms + ✓ packages/filters/src/BevelFilter.test.ts (60 tests) 9ms + ✓ packages/text/src/TextField/usecase/TextFieldUpdateStopIndexUseCase.test.ts (2 tests) 5ms + ✓ packages/text/src/TextFormat/service/TextFormatIsSameService.test.ts (12 tests) 2ms + ✓ packages/display/src/Stage/service/StageExecuteFrameSoundsService.test.ts (15 tests) 5ms + ✓ packages/text/src/TextField/usecase/TextFieldGetLineTextUseCase.test.ts (1 test) 6ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerAddChildUseCase.test.ts (2 tests) 3ms + ✓ packages/geom/src/Matrix/service/MatrixCreateBoxService.test.ts (31 tests) 12ms + ✓ packages/text/src/TextField/usecase/TextFieldGetTextDataUseCase.test.ts (1 test) 5ms + ✓ packages/display/src/Shape/usecase/ShapeLoadSrcUseCase.test.ts (10 tests) 11ms + ✓ packages/webgl/src/Context/service/ContextRestoreService.test.ts (1 test) 2ms + ✓ packages/events/src/EventDispatcher/service/EventDispatcherAddEventListenerService.test.ts (6 tests) 2ms + ✓ packages/text/src/TextParser/usecase/TextParserCreateNewLineUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectBuildFilterService.test.ts (10 tests) 11ms + ✓ packages/text/src/TextField/usecase/TextFieldResizeUseCase.test.ts (2 tests) 7ms + ✓ packages/text/src/TextField/usecase/TextFieldHtmlTextToRawTextUseCase.test.ts (1 test) 8ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectIsMaskReflectedInDisplayUseCase.test.ts (9 tests) 6ms + ✓ packages/geom/src/Rectangle.test.ts (14 tests) 15ms + ✓ packages/text/src/TextField/usecase/TextFieldSetScrollXUseCase.test.ts (1 test) 5ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetWidthUseCase.test.ts (8 tests) 6ms + ✓ packages/display/src/MovieClip/service/MovieClipGetChildrenService.test.ts (15 tests) 5ms + ✓ packages/display/src/Loader/usecase/LoaderLoadJsonUseCase.test.ts (10 tests) 5ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetHeightUseCase.test.ts (8 tests) 4ms + ✓ packages/display/src/Shape/usecase/ShapeGenerateRenderQueueUseCase.test.ts (10 tests) 4ms + ✓ packages/display/src/Video/usecase/VideoGenerateRenderQueueUseCase.test.ts (15 tests) 5ms + ✓ packages/text/src/TextParser/usecase/TextParserParseHtmlTextUseCase.test.ts (1 test) 11ms + ✓ packages/display/src/Loader/usecase/LoaderLoadUseCase.test.ts (10 tests) 6ms + ✓ packages/text/src/TextParser/usecase/TextParserParseTagUseCase.test.ts (1 test) 9ms + ✓ packages/display/src/Stage/usecase/StageGenerateRenderQueueUseCase.test.ts (10 tests) 4ms + ✓ packages/text/src/TextField/usecase/TextFieldResetUseCase.test.ts (1 test) 5ms + ✓ packages/display/src/BitmapData/service/BitmapDataCanvasToBufferService.test.ts (1 test) 4ms + ✓ packages/display/src/Graphics/usecase/GraphicsCalcBoundsUseCase.test.ts (15 tests) 5ms + ✓ packages/media/src/Video/service/VideoLoadedmetadataEventService.test.ts (1 test) 3ms + ✓ packages/webgl/src/BezierConverter/service/BezierConverterSplit2QuadService.test.ts (4 tests) 3ms + ✓ packages/geom/src/Matrix/service/MatrixRotateService.test.ts (19 tests) 4ms + ✓ packages/display/src/BitmapData/service/BitmapDataImageToBufferService.test.ts (1 test) 3ms + ✓ packages/core/src/Player/usecase/PlayerTickerUseCase.test.ts (9 tests) 12ms + ✓ packages/text/src/TextParser/usecase/TextParserSetAttributesUseCase.test.ts (1 test) 7ms + ✓ packages/geom/src/Point/service/PointInterpolateService.test.ts (22 tests) 3ms + ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerAssignStageAndRootService.test.ts (1 test) 6ms + ✓ packages/webgl/src/PathCommand/usecase/PathCommandArcUseCase.test.ts (1 test) 5ms + ✓ packages/events/src/EventDispatcher/service/EventDispatcherRemoveEventListenerService.test.ts (5 tests) 2ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectGlobalToLocalService.test.ts (2 tests) 2ms + ✓ packages/display/src/MovieClip/usecase/MovieClipBuildFromCharacterUseCase.test.ts (15 tests) 4ms + ✓ packages/events/src/VideoEvent.test.ts (4 tests) 2ms + ✓ packages/display/src/MovieClip/usecase/MovieClipBuildDictionaryCharacterUseCase.test.ts (15 tests) 5ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetWidthUseCase.test.ts (3 tests) 6ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetHeightUseCase.test.ts (3 tests) 4ms + ✓ packages/display/src/Stage/usecase/StageReadyUseCase.test.ts (10 tests) 4ms + ✓ packages/geom/src/Matrix/service/MatrixCreateGradientBoxService.test.ts (14 tests) 5ms + ✓ packages/display/src/TextField/usecase/TextFieldCalcBoundsMatrixUseCase.test.ts (4 tests) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.test.ts (2 tests) 2ms + ✓ packages/display/src/Graphics/service/GraphicsToNumberArrayService.test.ts (2 tests) 2ms + ✓ packages/display/src/Graphics/service/GraphicsDrawRoundRectService.test.ts (1 test) 4ms + ✓ packages/media/src/Video/service/VideoEndedEventService.test.ts (2 tests) 3ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRawBoundsMatrixUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/MovieClip/service/MovieClipCurrentFrameLabelService.test.ts (3 tests) 4ms + ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerAddedToStageService.test.ts (2 tests) 3ms + ✓ packages/display/src/Stage/usecase/StageTickerUseCase.test.ts (10 tests) 5ms + ✓ packages/display/src/Shape/usecase/ShapeBuildFromCharacterUseCase.test.ts (10 tests) 3ms + ✓ packages/text/src/TextParser/usecase/TextParserParseTextUseCase.test.ts (1 test) 3ms + ✓ packages/geom/src/Point/service/PointPolarService.test.ts (20 tests) 3ms + ✓ packages/webgl/src/Context/usecase/ContextResizeUseCase.test.ts (1 test) 5ms + ✓ packages/core/src/Player/usecase/PlayerResizeEventUseCase.test.ts (1 test) 7ms + ✓ packages/cache/src/CacheStore/service/CacheStoreHasService.test.ts (3 tests) 3ms + ✓ packages/media/src/Sound/usecase/SoundBuildFromCharacterUseCase.test.ts (6 tests) 13ms + ✓ packages/geom/src/Rectangle/service/RectangleCopyFromService.test.ts (1 test) 4ms + ✓ packages/geom/src/Matrix/service/MatrixDeltaTransformPointService.test.ts (18 tests) 3ms + ✓ packages/display/src/Shape/usecase/ShapeSetBitmapBufferUseCase.test.ts (10 tests) 3ms + ✓ packages/webgl/src/Mask/usecase/MaskBindUseCase.test.ts (2 tests) 1ms + ✓ packages/webgl/src/Mesh/service/MeshCalculateNormalizeBezierService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.test.ts (1 test) 2ms + ✓ packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts (1 test) 4ms + ✓ packages/filters/src/BlurFilter.test.ts (22 tests) 3ms + ✓ packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase.test.ts (2 tests) 2ms + ✓ packages/geom/src/Point/service/PointSetToService.test.ts (2 tests) 1ms + ✓ packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts (4 tests) 3ms + ✓ packages/ui/src/Easing/service/EasingInOutElasticService.test.ts (1 test) 2ms + ✓ packages/text/src/TextField/usecase/TextFieldBlinkingUseCase.test.ts (1 test) 4ms + ✓ packages/events/src/EventDispatcher/service/EventDispatcherDispatchEventService.test.ts (8 tests) 3ms + ✓ packages/core/src/Player/service/PlayerCreateContainerElementService.test.ts (1 test) 2ms + ✓ packages/display/src/Shape/usecase/ShapeClearBitmapBufferUseCase.test.ts (10 tests) 3ms + ✓ packages/text/src/TextParser/service/TextParserParseStyleService.test.ts (1 test) 2ms + ✓ packages/geom/src/Matrix/service/MatrixTransformPointService.test.ts (13 tests) 3ms + ✓ packages/geom/src/Rectangle/service/RectangleUnionService.test.ts (9 tests) 2ms + ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerUnAssignStageAndRootService.test.ts (1 test) 4ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerCalcBoundsMatrixUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerContainsService.test.ts (1 test) 3ms + ✓ packages/geom/src/Point/service/PointDistanceService.test.ts (16 tests) 6ms + ✓ packages/renderer/src/Command/service/CommandInitializeContextService.test.ts (1 test) 4ms + ✓ packages/webgl/src/Blend/service/BlendSourceAtopService.test.ts (1 test) 1ms + ✓ packages/cache/src/CacheStore/service/CacheStoreGetService.test.ts (3 tests) 1ms + ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerRemovedToStageService.test.ts (1 test) 3ms + ✓ packages/geom/src/Rectangle/service/RectangleContainsPointService.test.ts (2 tests) 2ms + ✓ packages/geom/src/Rectangle/service/RectangleIntersectionService.test.ts (4 tests) 3ms + ✓ packages/webgl/src/Context/usecase/ContextGradientStrokeUseCase.test.ts (2 tests) 2ms + ✓ packages/webgl/src/Context/service/ContextTransformService.test.ts (1 test) 5ms + ✓ packages/webgl/src/Context/usecase/ContextBindUseCase.test.ts (1 test) 5ms + ✓ packages/webgl/src/Mask/usecase/MaskLeaveMaskUseCase.test.ts (2 tests) 3ms + ✓ packages/webgl/src/Blend/usecase/BlendOperationUseCase.test.ts (6 tests) 2ms + ✓ packages/geom/src/Matrix/service/MatrixInvertService.test.ts (7 tests) 2ms + ✓ packages/webgl/src/Context/service/ContextResetStyleService.test.ts (1 test) 8ms + ✓ packages/core/src/Canvas/service/CanvasBootOffscreenCanvasService.test.ts (1 test) 2ms + ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerGetChildByNameService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Mesh/service/MeshFillGenerateService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.test.ts (5 tests) 2ms + ✓ packages/display/src/BlendMode.test.ts (14 tests) 2ms + ✓ packages/webgl/src/Context/service/ContextCreateImageBitmapService.test.ts (3 tests) 2ms + ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerGetChildAtService.test.ts (1 test) 4ms + ✓ packages/webgl/src/BezierConverter/service/BezierConverterSplit2CubicService.test.ts (3 tests) 3ms + ✓ packages/webgl/src/Context/service/ContextSaveService.test.ts (1 test) 5ms + ✓ packages/geom/src/Matrix/service/MatirxConcatService.test.ts (8 tests) 3ms + ✓ packages/webgl/src/Context/service/ContextUpdateBackgroundColorService.test.ts (1 test) 6ms + ✓ packages/ui/src/Easing/service/EasingInOutBackService.test.ts (1 test) 2ms + ✓ packages/events/src/ProgressEvent.test.ts (1 test) 1ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectGenerateHashService.test.ts (1 test) 1ms + ✓ packages/filters/src/GradientGlowFilter/service/GradientGlowFilterToNumberArrayService.test.ts (4 tests) 4ms + ✓ packages/webgl/src/PathCommand/usecase/PathCommandBezierCurveToUseCase.test.ts (1 test) 3ms + ✓ packages/events/src/IOErrorEvent.test.ts (1 test) 1ms + ✓ packages/text/src/TextField/usecase/TextFieldSetFocusUseCase.test.ts (1 test) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetMatrixUseCase.test.ts (6 tests) 5ms + ✓ packages/display/src/Graphics/service/GraphicsDrawRectService.test.ts (1 test) 3ms + ✓ packages/display/src/Graphics/service/GraphicsDrawEllipseService.test.ts (1 test) 3ms + ✓ packages/ui/src/Easing/service/EasingInOutCircService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Context/service/ContextResetService.test.ts (1 test) 2ms + ✓ packages/webgl/src/StencilBufferObject/service/StencilBufferObjectReleaseColorBufferObjectService.test.ts (1 test) 3ms + ✓ packages/webgl/src/ColorBufferObject/service/ColorBufferObjectMeguruBinarySearchService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectHitTestPointUseCase.test.ts (1 test) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectHitTestObjectUseCase.test.ts (2 tests) 2ms + ✓ packages/filters/src/ConvolutionFilter/service/ConvolutionFilterToArrayService.test.ts (1 test) 7ms + ✓ packages/filters/src/DropShadowFilter/usecase/DropShadowFilterGetBoundsUseCase.test.ts (1 test) 2ms + ✓ packages/geom/src/Point/service/PointCloneService.test.ts (1 test) 2ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectBlendToNumberService.test.ts (1 test) 2ms + ✓ packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBindFillMeshUseCase.test.ts (1 test) 2ms + ✓ packages/text/src/TextField/service/TextFieldCompositionStartService.test.ts (1 test) 5ms + ✓ packages/core/src/Player/service/PlayerResizePostMessageService.test.ts (5 tests) 4ms + ✓ packages/webgl/src/Mesh/usecase/MeshCalculateCurveRectangleUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetColorTransformUseCase.test.ts (5 tests) 2ms + ✓ packages/display/src/Loader/usecase/LoaderLoadEndEventUseCase.test.ts (2 tests) 2ms + ✓ packages/display/src/TextField/service/TextFieldGetRawBoundsService.test.ts (1 test) 3ms + ✓ packages/events/src/Event.test.ts (12 tests) 5ms + ✓ packages/media/src/Video/service/VideoCreateElementService.test.ts (1 test) 4ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerSwapChildrenUseCase.test.ts (2 tests) 4ms + ✓ packages/cache/src/CacheStore/service/CacheStoreGenerateFilterKeysService.test.ts (2 tests) 2ms + ✓ packages/webgl/src/Context/usecase/ContextFillUseCase.test.ts (4 tests) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetCalcBoundsUseCase.test.ts (5 tests) 2ms + ✓ packages/geom/src/Point/service/PointAddService.test.ts (3 tests) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRawBoundsUseCase.test.ts (5 tests) 2ms + ✓ packages/filters/src/GradientGlowFilter/service/GradientGlowFilterCanApplyFilterService.test.ts (1 test) 2ms + ✓ packages/ui/src/Easing/service/EasingInOutQuintService.test.ts (1 test) 4ms + ✓ packages/geom/src/Matrix/service/MatrixScaleService.test.ts (5 tests) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.test.ts (4 tests) 2ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerSetChildIndexUseCase.test.ts (2 tests) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetBoundsUseCase.test.ts (1 test) 4ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerSwapChildrenAtUseCase.test.ts (2 tests) 2ms + ✓ packages/core/src/Player/service/PlayerAppendElementService.test.ts (1 test) 6ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectLocalToGlobalService.test.ts (2 tests) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.test.ts (4 tests) 4ms + ✓ packages/filters/src/BevelFilter/service/BevelFilterToNumberArrayService.test.ts (3 tests) 2ms + ✓ packages/core/src/Player/service/PlayerRenderingPostMessageService.test.ts (4 tests) 2ms + ✓ packages/display/src/Shape/usecase/ShapeCalcBoundsMatrixUseCase.test.ts (3 tests) 2ms + ✓ packages/geom/src/Rectangle/service/RectangleContainsService.test.ts (4 tests) 4ms + ✓ packages/ui/src/Easing/service/EasingOutQuintService.test.ts (1 test) 1ms + ✓ packages/display/src/Video/usecase/VideoCalcBoundsMatrixUseCase.test.ts (4 tests) 2ms + ✓ packages/webgl/src/PathCommand/service/PathCommandPushPointToCurrentPathService.test.ts (1 test) 1ms + ✓ packages/core/src/Canvas/usecase/CanvasPointerMoveEventUseCase.test.ts (1 test) 2ms + ✓ packages/core/src/Canvas/service/CanvasSetPositionService.test.ts (1 test) 2ms + ✓ packages/webgl/src/AtlasManager/service/AtlasManagerCreateNodeService.test.ts (1 test) 2ms + ✓ packages/net/src/URLRequest.test.ts (6 tests) 4ms + ✓ packages/media/src/Sound/usecase/SoundLoadEndEventUseCase.test.ts (2 tests) 4ms + ✓ packages/core/src/Player/service/PlayerRemoveCachePostMessageService.test.ts (3 tests) 3ms + ✓ packages/webgl/src/Mask/service/MaskBeginMaskService.test.ts (1 test) 2ms + ✓ packages/media/src/Sound/service/SoundLoadStartEventService.test.ts (2 tests) 3ms + ✓ packages/media/src/Video/usecase/VideoCanplaythroughEventUseCase.test.ts (2 tests) 2ms + ✓ packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/FrameBufferManager/service/FrameBufferManagerBindAttachmentObjectService.test.ts (2 tests) 2ms + ✓ packages/display/src/MovieClip/usecase/MovieClipGoToFrameUseCase.test.ts (2 tests) 7ms + ✓ packages/core/src/Player/service/PlayerSetCurrentMousePointService.test.ts (4 tests) 4ms + ✓ packages/display/src/Loader/service/LoaderLoadStartEventService.test.ts (2 tests) 2ms + ✓ packages/geom/src/ColorTransform/service/ColorTransformConcatService.test.ts (4 tests) 3ms + ✓ packages/geom/src/Point/service/PointOffsetService.test.ts (5 tests) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRawColorTransformUseCase.test.ts (3 tests) 2ms + ✓ packages/geom/src/Point/service/PointNormalizeService.test.ts (6 tests) 4ms + ✓ packages/display/src/MovieClip/usecase/MovieClipPrevFrameUseCase.test.ts (2 tests) 4ms + ✓ packages/geom/src/Matrix/service/MatrixTranslateService.test.ts (2 tests) 5ms + ✓ packages/webgl/src/Mesh/service/MeshGenerateCalculateRoundCapService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectConcatenatedMatrixUseCase.test.ts (3 tests) 2ms + ✓ packages/webgl/src/PathCommand/service/PathCommandCreateRectVerticesService.test.ts (1 test) 1ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRemoveChildUseCase.test.ts (1 test) 4ms + ✓ packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectGetFillObjectUseCase.test.ts (1 test) 2ms + ✓ packages/filters/src/ConvolutionFilter/service/ConvolutionFilterCanApplyFilterService.test.ts (2 tests) 1ms + ✓ packages/core/src/Player/service/PlayerDoubleClickEventService.test.ts (2 tests) 4ms + ✓ packages/ui/src/Job/service/JobEntriesService.test.ts (3 tests) 2ms + ✓ packages/webgl/src/Mesh/usecase/MeshFillGenerateUseCase.test.ts (1 test) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.test.ts (4 tests) 2ms + ✓ packages/webgl/src/Mesh/usecase/MeshSplitBezierMultipleTimesUseCase.test.ts (1 test) 4ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateRenderQueueUseCase.test.ts (1 test) 2ms + ✓ packages/text/src/TextArea/service/TextAreaMovePositionService.test.ts (1 test) 4ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRawMatrixUseCase.test.ts (3 tests) 4ms + ✓ packages/ui/src/Easing/service/EasingInCubicService.test.ts (1 test) 1ms + ✓ packages/media/src/Video/service/VideoProgressEventService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetAlphaUseCase.test.ts (2 tests) 5ms + ✓ packages/texture-packer/src/Node/service/NodeInsertService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRemoveChildAtUseCase.test.ts (1 test) 2ms + ✓ packages/geom/src/Point/service/PointEqualsService.test.ts (4 tests) 2ms + ✓ packages/geom/src/Matrix/service/MatrixIdentityService.test.ts (1 test) 1ms + ✓ packages/ui/src/Job/service/JobUpdatePropertyService.test.ts (3 tests) 4ms + ✓ packages/display/src/MovieClip/usecase/MovieClipAdvanceFrameUseCase.test.ts (3 tests) 2ms + ✓ packages/filters/src/BevelFilter/usecase/BevelFilterGetBoundsUseCase.test.ts (3 tests) 4ms + ✓ packages/geom/src/Rectangle/service/RectangleInflateService.test.ts (2 tests) 3ms + ✓ packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase.test.ts (2 tests) 4ms + ✓ packages/webgl/src/Context/usecase/ContextGradientFillUseCase.test.ts (2 tests) 5ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetYUseCase.test.ts (2 tests) 2ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRemoveChildrenUseCase.test.ts (1 test) 4ms + ✓ packages/display/src/Shape/usecase/ShapeGenerateClipQueueUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateGradientVertexArrayObjectUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/VertexArrayObject/service/VertexArrayObjectCreateFillObjectService.test.ts (1 test) 1ms + ✓ packages/webgl/src/ColorBufferObject/usecase/ColorBufferObjectGetColorBufferObjectUseCase.test.ts (1 test) 1ms + ✓ packages/webgl/src/Context/service/ContextUpdateAllTransferBoundsService.test.ts (1 test) 3ms + ✓ packages/display/src/MovieClip/usecase/MovieClipNextFrameUseCase.test.ts (2 tests) 4ms + ✓ packages/geom/src/Point/service/PointCopyFromService.test.ts (4 tests) 2ms + ✓ packages/webgl/src/Context/usecase/ContextBitmapStrokeUseCase.test.ts (2 tests) 3ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRotationUseCase.test.ts (4 tests) 2ms + ✓ packages/cache/src/CacheStore/service/CacheStoreDestroyService.test.ts (2 tests) 2ms + ✓ packages/filters/src/GradientBevelFilter.test.ts (1 test) 3ms + ✓ packages/core/src/Player/service/PlayerKeyUpEventService.test.ts (2 tests) 5ms + ✓ packages/media/src/Sound/service/SoundEndedEventService.test.ts (2 tests) 2ms + ✓ packages/ui/src/Job/usecase/JobBootUseCase.test.ts (1 test) 4ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetAlphaUseCase.test.ts (4 tests) 2ms + ✓ packages/display/src/Loader/service/LoaderBuildService.test.ts (1 test) 2ms + ✓ packages/display/src/Sprite/service/SpriteStartDragService.test.ts (1 test) 4ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetXUseCase.test.ts (2 tests) 2ms + ✓ packages/text/src/TextParser/service/TextParserAdjustmentHeightService.test.ts (2 tests) 2ms + ✓ packages/webgl/src/BezierConverter/usecase/BezierConverterCubicToQuadUseCase.test.ts (1 test) 2ms + ✓ packages/filters/src/ColorMatrixFilter.test.ts (2 tests) 1ms + ✓ packages/webgl/src/Context/usecase/ContextBitmapFillUseCase.test.ts (2 tests) 4ms + ✓ packages/filters/src/DisplacementMapFilter/service/DisplacementMapFilterToNumberArrayService.test.ts (1 test) 3ms + ✓ packages/events/src/EventDispatcher/service/EventDispatcherWillTriggerService.test.ts (2 tests) 3ms + ✓ packages/filters/src/GradientGlowFilter.test.ts (1 test) 10ms + ✓ packages/events/src/PointerEvent.test.ts (6 tests) 3ms + ✓ packages/media/src/Video/usecase/VideoPlayEventUseCase.test.ts (1 test) 2ms + ✓ packages/geom/src/Matrix/service/MatrixCopyFromService.test.ts (1 test) 2ms + ✓ packages/renderer/src/Command/service/CommandResizeService.test.ts (1 test) 1ms + ✓ packages/core/src/Canvas/usecase/CanvasPointerUpEventUseCase.test.ts (1 test) 3ms + ✓ packages/geom/src/Matrix/service/MatrixSetToService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectBaseBuildService.test.ts (1 test) 4ms + ✓ packages/filters/src/ConvolutionFilter/service/ConvolutionFilterToNumberArrayService.test.ts (1 test) 4ms + ✓ packages/display/src/Loader/service/LoaderProgressEventService.test.ts (1 test) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetFiltersUseCase.test.ts (3 tests) 2ms + ✓ packages/core/src/Canvas/usecase/CanvasPointerLeaveEventUseCase.test.ts (1 test) 1ms + ✓ packages/webgl/src/Mask/service/MaskUnionMaskService.test.ts (1 test) 2ms + ✓ packages/media/src/SoundMixer/service/SoundMixerUpdateVolumeService.test.ts (1 test) 5ms + ✓ packages/events/src/EventDispatcher/service/EventDispatcherRemoveAllEventListenerService.test.ts (2 tests) 4ms + ✓ packages/core/src/Player/usecase/PlayerPlayUseCase.test.ts (1 test) 4ms + ✓ packages/filters/src/DropShadowFilter/service/DropShadowFilterToNumberArrayService.test.ts (1 test) 5ms + ✓ packages/webgl/src/Mask/service/MaskEndMaskService.test.ts (1 test) 3ms + ✓ packages/webgl/src/PathCommand/usecase/PathCommandMoveToUseCase.test.ts (1 test) 3ms + ✓ packages/filters/src/BlurFilter/usecase/BlurFilterGetBoundsUseCase.test.ts (3 tests) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetYUseCase.test.ts (3 tests) 3ms + ✓ packages/webgl/src/Context/service/ContextSetTransformService.test.ts (1 test) 3ms + ✓ packages/geom/src/Rectangle/service/RectangleContainsRectService.test.ts (2 tests) 1ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetBlendModeUseCase.test.ts (3 tests) 1ms + ✓ packages/filters/src/GradientBevelFilter/service/GradientBevelFilterToArrayService.test.ts (1 test) 2ms + ✓ packages/display/src/Stage/service/StageExecuteFrameActionsService.test.ts (1 test) 2ms + ✓ packages/geom/src/Rectangle/service/RectangleInflatePointService.test.ts (2 tests) 2ms + ✓ packages/ui/src/Easing/service/EasingOutExpoService.test.ts (1 test) 3ms + ✓ packages/renderer/src/DisplayObject/service/DisplayObjectGetBlendModeService.test.ts (1 test) 1ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetXUseCase.test.ts (3 tests) 1ms + ✓ packages/core/src/Player/service/PlayerPointerMoveEventService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectApplyChangesService.test.ts (2 tests) 3ms + ✓ packages/filters/src/DropShadowFilter/service/DropShadowFilterToArrayService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingOutQuadService.test.ts (1 test) 1ms + ✓ packages/media/src/Sound/service/SoundProgressEventService.test.ts (1 test) 2ms + ✓ packages/display/src/MovieClip/service/MovieClipSetSoundsService.test.ts (2 tests) 2ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetBlendModeUseCase.test.ts (2 tests) 1ms + ✓ packages/webgl/src/Shader/ShaderManager/service/ShaderManagerInitializeUniformService.test.ts (1 test) 6ms + ✓ packages/filters/src/DisplacementMapFilter/service/DisplacementMapFilterToArrayService.test.ts (1 test) 3ms + ✓ packages/geom/src/Rectangle/service/RectangleIntersectsService.test.ts (3 tests) 3ms + ✓ packages/events/src/EventDispatcher/service/EventDispatcherHasEventListenerService.test.ts (2 tests) 3ms + ✓ packages/core/src/Player/service/PlayerKeyDownEventService.test.ts (2 tests) 3ms + ✓ packages/text/src/TextFormat/service/TextFormatGenerateFontStyleService.test.ts (4 tests) 10ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchRemovedToStageEventService.test.ts (1 test) 3ms + ✓ packages/webgl/src/Blend/service/BlendEraseService.test.ts (1 test) 1ms + ✓ packages/geom/src/Rectangle/service/RectangleSetToService.test.ts (1 test) 1ms + ✓ packages/filters/src/ColorMatrixFilter/service/ColorMatrixFilterToNumberArrayService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Blend/service/BlendScreenService.test.ts (1 test) 3ms + ✓ packages/cache/src/CacheStore/service/CacheStoreGenerateKeysService.test.ts (2 tests) 1ms + ✓ packages/display/src/Graphics/service/GraphicsCalcFillBoundsService.test.ts (1 test) 1ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerPrepareUseCase.test.ts (1 test) 2ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerAdvanceFrameUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectRemoveService.test.ts (1 test) 1ms + ✓ packages/filters/src/BevelFilter/service/BevelFilterToArrayService.test.ts (1 test) 4ms + ✓ packages/webgl/src/PathCommand/usecase/PathCommandLineToUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectGetPlaceObjectService.test.ts (1 test) 1ms + ✓ packages/webgl/src/ColorBufferObject/service/ColorBufferObjectCreateService.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchAddedEventService.test.ts (1 test) 3ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind01UseCase.test.ts (1 test) 3ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerCreateAtlasTextureUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/MovieClip/service/MovieClipGetFrameForLabelService.test.ts (2 tests) 3ms + ✓ packages/filters/src/GradientGlowFilter/service/GradientGlowFilterToArrayService.test.ts (1 test) 1ms + ✓ packages/webgl/src/ColorBufferObject/usecase/ColorBufferObjectAcquireObjectUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/AtlasManager/service/AtlasManagerRemoveNodeService.test.ts (1 test) 3ms + ✓ packages/media/src/Video/service/VideoApplyChangesService.test.ts (1 test) 4ms + ✓ packages/text/src/TextFormat/service/TextFormatHtmlTextGenerateStyleService.test.ts (3 tests) 4ms + ✓ packages/filters/src/GradientGlowFilter/usecase/GradientGlowFilterGetBoundsUseCase.test.ts (1 test) 1ms + ✓ packages/text/src/TextFormat/service/TextFormatGetWidthMarginService.test.ts (4 tests) 2ms + ✓ packages/webgl/src/PathCommand/service/PathCommandPushCurrentPathToVerticesService.test.ts (1 test) 3ms + ✓ packages/core/src/Canvas/usecase/CanvasRegisterEventUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/MovieClip/usecase/MovieClipPrepareSoundUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectCalcBoundsMatrixService.test.ts (2 tests) 4ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase.test.ts (1 test) 3ms + ✓ packages/text/src/TextFormat/service/TextFormatSetDefaultService.test.ts (1 test) 1ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind02UseCase.test.ts (1 test) 1ms + ✓ packages/core/src/Player/usecase/PlayerRegisterEventUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/Context/usecase/ContextStrokeUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/MovieClip/service/MovieClipBuildSoundsService.test.ts (1 test) 1ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerCreateFromPixelsUseCase.test.ts (1 test) 2ms + ✓ packages/filters/src/DropShadowFilter.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInOutQuadService.test.ts (1 test) 3ms + ✓ packages/geom/src/Point/service/PointSubtractService.test.ts (2 tests) 3ms + ✓ packages/display/src/MovieClip/usecase/MovieClipGotoAndStopUseCase.test.ts (1 test) 4ms + ✓ packages/webgl/src/FrameBufferManager/service/FrameBufferManagerCreateAttachmentObjectService.test.ts (1 test) 1ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchAddedToStageEventService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Blend/usecase/BlnedClearArraysInstancedUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchRemovedEventService.test.ts (1 test) 2ms + ✓ packages/filters/src/ConvolutionFilter.test.ts (1 test) 1ms + ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveTimerScheduledCacheService.test.ts (1 test) 1ms + ✓ packages/webgl/src/TextureManager/service/TextureManagerBindService.test.ts (1 test) 1ms + ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetFiltersUseCase.test.ts (1 test) 1ms + ✓ packages/text/src/TextArea/usecase/TextAreaRegisterEventUseCase.test.ts (1 test) 3ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind012UseCase.test.ts (1 test) 4ms + ✓ packages/display/src/MovieClip/service/MovieClipSetActionService.test.ts (2 tests) 4ms + ✓ packages/ui/src/Easing/service/EasingInBackService.test.ts (1 test) 2ms + ✓ packages/events/src/FocusEvent.test.ts (2 tests) 3ms + ✓ packages/webgl/src/Mesh/service/MeshGenerateCalculateSquareCapService.test.ts (1 test) 1ms + ✓ packages/filters/src/ColorMatrixFilter/service/ColorMatrixFilterToArrayService.test.ts (1 test) 3ms + ✓ packages/filters/src/BlurFilter/service/BlurFilterToArrayService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Mesh/usecase/MeshApproximateOffsetQuadraticUseCase.test.ts (1 test) 1ms + ✓ packages/filters/src/GlowFilter/service/GlowFilterToArrayService.test.ts (1 test) 3ms + ✓ packages/webgl/src/StencilBufferObject/usecase/StencilBufferObjectGetStencilBufferObjectUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind0UseCase.test.ts (1 test) 1ms + ✓ packages/display/src/MovieClip/service/MovieClipCurrentLabelsService.test.ts (2 tests) 3ms + ✓ packages/ui/src/Job/service/JobStopService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Mesh/service/MeshGetQuadraticBezierPointService.test.ts (1 test) 3ms + ✓ packages/filters/src/GlowFilter.test.ts (1 test) 2ms + ✓ packages/media/src/Video/usecase/VideoRegisterEventUseCase.test.ts (1 test) 3ms + ✓ packages/display/src/MovieClip/service/MovieClipDispatchFrameLabelEventService.test.ts (1 test) 1ms + ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateClipQueueUseCase.test.ts (1 test) 1ms + ✓ packages/events/src/EventPhase.test.ts (3 tests) 2ms + ✓ packages/ui/src/Job/usecase/JobStartUseCase.test.ts (1 test) 1ms + ✓ packages/filters/src/GradientBevelFilter/service/GradientBevelFilterCanApplyFilterService.test.ts (1 test) 3ms + ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveTimerService.test.ts (1 test) 2ms + ✓ packages/webgl/src/PathCommand/usecase/PathCommandQuadraticCurveToUseCase.test.ts (1 test) 4ms + ✓ packages/webgl/src/PathCommand/usecase/PathCommandClosePathUseCase.test.ts (1 test) 2ms + ✓ packages/filters/src/GlowFilter/service/GlowFilterToNumberArrayService.test.ts (1 test) 3ms + ✓ packages/geom/src/Rectangle/service/RectangleIsEmptyService.test.ts (3 tests) 3ms + ✓ packages/display/src/FrameLabel.test.ts (1 test) 2ms + ✓ packages/cache/src/CacheStore/service/CacheStoreSetService.test.ts (1 test) 2ms + ✓ packages/webgl/src/AtlasManager/usecase/AtlasManagerResetUseCase.test.ts (1 test) 3ms + ✓ packages/filters/src/GlowFilter/usecase/GlowFilterGetBoundsUseCase.test.ts (1 test) 1ms + ✓ packages/display/src/MovieClip/usecase/MovieClipGotoAndPlayUseCase.test.ts (1 test) 1ms + ✓ packages/filters/src/DropShadowFilter/service/DropShadowFilterCanApplyFilterService.test.ts (1 test) 2ms + ✓ packages/core/src/Player/service/PlayerPointerUpEventService.test.ts (1 test) 1ms + ✓ packages/geom/src/Rectangle/service/RectangleOffsetService.test.ts (1 test) 1ms + ✓ packages/filters/src/GlowFilter/service/GlowFilterCanApplyFilterService.test.ts (1 test) 1ms + ✓ packages/webgl/src/StencilBufferObject/usecase/StencilBufferObjectAcquireObjectUseCase.test.ts (1 test) 3ms + ✓ packages/filters/src/DisplacementMapFilter/service/DisplacementMapFilterCanApplyFilterService.test.ts (2 tests) 4ms + ✓ packages/display/src/Graphics/service/GraphicsCalcLineBoundsService.test.ts (1 test) 1ms + ✓ packages/geom/src/Matrix/service/MatrixCloneService.test.ts (1 test) 3ms + ✓ packages/filters/src/BevelFilter/service/BevelFilterCanApplyFilterService.test.ts (1 test) 4ms + ✓ packages/media/src/SoundMixer/service/SoundMixerStopAllService.test.ts (1 test) 3ms + ✓ packages/display/src/Sprite/service/SpriteStopDragService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Shader/ShaderManager/service/ShaderManagerCreateProgramService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Context/service/ContextUpdateTransferBoundsService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Mesh/service/MeshLerpService.test.ts (1 test) 3ms + ✓ packages/webgl/src/Mesh/usecase/MeshCalculateLineRectangleUseCase.test.ts (1 test) 3ms + ✓ packages/webgl/src/Mesh/service/MeshGetQuadraticBezierTangentService.test.ts (1 test) 3ms + ✓ packages/filters/src/BlurFilter/service/BlurFilterToNumberArrayService.test.ts (1 test) 1ms + ✓ packages/core/src/Canvas/usecase/CanvasWheelEventUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/FrameBufferManager/service/FrameBufferManagerUnBindAttachmentObjectService.test.ts (1 test) 3ms + ✓ packages/ui/src/Easing/service/EasingOutCubicService.test.ts (1 test) 1ms + ✓ packages/ui/src/Job/service/JobUpdateFrameService.test.ts (2 tests) 3ms + ✓ packages/webgl/src/TextureManager/service/TextureManagerCreateTextureObjectService.test.ts (1 test) 1ms + ✓ packages/display/src/MovieClip/usecase/MovieClipPrepareActionUseCase.test.ts (1 test) 3ms + ✓ packages/webgl/src/StencilBufferObject/service/StencilBufferObjectCreateService.test.ts (1 test) 1ms + ✓ packages/display/src/Shape/service/ShapeGetRawBoundsService.test.ts (1 test) 1ms + ✓ packages/webgl/src/PathCommand/service/PathCommandBeginPathService.test.ts (1 test) 3ms + ✓ packages/display/src/Video/service/VideoGetRawBoundsService.test.ts (1 test) 1ms + ✓ packages/texture-packer/src/Node/service/NodeDisposeService.test.ts (1 test) 2ms + ✓ packages/geom/src/Rectangle/service/RectangleSetEmptyService.test.ts (1 test) 3ms + ✓ packages/webgl/src/Mask/service/MaskSetMaskBoundsService.test.ts (1 test) 2ms + ✓ packages/filters/src/GradientBevelFilter/usecase/GradientBevelFilterGetBoundsUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/Blend/service/BlendAlphaService.test.ts (1 test) 3ms + ✓ packages/display/src/MovieClip/service/MovieClipAddFrameLabelService.test.ts (1 test) 3ms + ✓ packages/geom/src/Rectangle/service/RectangleOffsetPointService.test.ts (1 test) 1ms + ✓ packages/core/src/Player/service/PlayerStopService.test.ts (1 test) 1ms + ✓ packages/geom/src/Point.test.ts (2 tests) 3ms + ✓ packages/events/src/JobEvent.test.ts (2 tests) 1ms + ✓ packages/display/src/MovieClip/service/MovieClipAddActionsService.test.ts (1 test) 2ms + ✓ packages/geom/src/Rectangle/service/RectangleEqualsService.test.ts (1 test) 3ms + ✓ packages/geom/src/Rectangle/service/RectangleCloneService.test.ts (1 test) 3ms + ✓ packages/display/src/Graphics/service/GraphicsMargePathService.test.ts (1 test) 1ms + ✓ packages/filters/src/BlurFilter/service/BlurFilterCanApplyFilterService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Context/usecase/ContextClearRectUseCase.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingOutSineService.test.ts (1 test) 3ms + ✓ packages/webgl/src/TextureManager/usecase/TextureManagerGetTextureUseCase.test.ts (1 test) 2ms + ✓ packages/display/src/MovieClip/service/MovieClipAddLabelsService.test.ts (1 test) 2ms + ✓ packages/geom/src/ColorTransform.test.ts (1 test) 8ms + ✓ packages/webgl/src/Context/service/ContextFillBackgroundColorService.test.ts (1 test) 1ms + ✓ packages/webgl/src/VertexArrayObject/service/VertexArrayObjectReleaseVertexArrayObjectService.test.ts (1 test) 3ms + ✓ packages/cache/src/CacheStore/service/CacheStoreResetService.test.ts (1 test) 3ms + ✓ packages/webgl/src/VertexArrayObject/service/VertexArrayObjectBindService.test.ts (1 test) 3ms + ✓ packages/webgl/src/Blend/service/BlendSourceInService.test.ts (1 test) 3ms + ✓ packages/webgl/src/Blend/usecase/BlendBootUseCase.test.ts (1 test) 2ms + ✓ packages/webgl/src/TextureManager/service/TextureManagerInitializeBindService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInOutBounceService.test.ts (1 test) 1ms + ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveService.test.ts (1 test) 6ms + ✓ packages/text/src/TextField/service/TextFieldApplyChangesService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Blend/service/BlendOneZeroService.test.ts (1 test) 2ms + ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveByIdService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInOutQuartService.test.ts (1 test) 2ms + ✓ packages/webgl/src/PathCommand/service/PathCommandEqualsToLastPointService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInQuartService.test.ts (1 test) 2ms + ✓ packages/events/src/KeyboardEvent.test.ts (2 tests) 32ms + ✓ packages/ui/src/Easing/service/EasingOutBounceService.test.ts (1 test) 2ms + ✓ packages/cache/src/CacheUtil.test.ts (1 test) 1ms + ✓ packages/webgl/src/ColorBufferObject/usecase/ColorBufferObjectReleaseColorBufferObjectUseCase.test.ts (1 test) 1ms + ✓ packages/webgl/src/Context/service/ContextUseGridService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Mesh/service/MeshCalculateNormalVectorService.test.ts (1 test) 2ms + ✓ packages/core/src/Player/usecase/PlayerResizeRegisterUseCase.test.ts (1 test) 1ms + ✓ packages/webgl/src/Shader/Variants/Gradient/service/VariantsGradientCreateCollectionKeyService.test.ts (1 test) 5ms + ✓ packages/webgl/src/Blend/service/BlendAddService.test.ts (1 test) 2ms + ✓ packages/ui/src/Easing/service/EasingInCircService.test.ts (1 test) 2ms + ✓ packages/webgl/src/Blend/service/BlendResetService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingOutElasticService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInBounceService.test.ts (1 test) 2ms + ✓ packages/ui/src/Easing/service/EasingInOutExpoService.test.ts (1 test) 8ms + ✓ packages/ui/src/Easing/service/EasingOutCircService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Mesh/service/MeshFindOverlappingPathsService.test.ts (1 test) 2ms + ✓ packages/ui/src/Easing/service/EasingInElasticService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInExpoService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInQuadService.test.ts (1 test) 3ms + ✓ packages/ui/src/Easing/service/EasingInOutCubicService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInQuintService.test.ts (1 test) 3ms + ✓ packages/ui/src/Easing/service/EasingOutBackService.test.ts (1 test) 2ms + ✓ packages/events/src/HTTPStatusEvent.test.ts (1 test) 3ms + ✓ packages/renderer/src/TextField/service/TextFieldGenerateFontStyleService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingInSineService.test.ts (1 test) 2ms + ✓ packages/ui/src/Easing/service/EasingLinearService.test.ts (1 test) 3ms + ✓ packages/ui/src/Easing/service/EasingInOutSineService.test.ts (1 test) 1ms + ✓ packages/ui/src/Easing/service/EasingOutQuartService.test.ts (1 test) 1ms + ✓ packages/events/src/WheelEvent.test.ts (1 test) 1ms + ✓ packages/webgl/src/Context/service/ContextEndNodeRenderingService.test.ts (1 test) 1ms + ✓ packages/webgl/src/Context/service/ContextBeginNodeRenderingService.test.ts (1 test) 1ms + +⎯⎯⎯⎯⎯⎯ Failed Tests 15 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts > ContextApplyFilterUseCase.js method test > test case - should execute filter application +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'currentAttachmentObject')" + + ❯ packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts:48:16 +  46|  params +  47|  ); +  48|  }).not.toThrow(); +  |  ^ +  49|  }); +  50| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts > ContextClipUseCase.js method test > test case - should execute clip operation +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'currentAttachmentObject')" + + ❯ packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts:14:16 +  12|  expect(() => { +  13|  execute(); +  14|  }).not.toThrow(); +  |  ^ +  15|  }); +  16| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts > ContextDrawElementUseCase.js method test > test case - should execute draw element with OffscreenCanvas +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'createTexture')" + + ❯ packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts:26:16 +  24|  expect(() => { +  25|  execute(mockNode, mockCanvas); +  26|  }).not.toThrow(); +  |  ^ +  27|  }); +  28|  + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts > ContextDrawElementUseCase.js method test > test case - should execute draw element with ImageBitmap +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'createTexture')" + + ❯ packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts:44:16 +  42|  expect(() => { +  43|  execute(mockNode, mockImageBitmap); +  44|  }).not.toThrow(); +  |  ^ +  45|  }); +  46| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts > ContextDrawFillUseCase.js method test > test case - should execute draw fill +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'createVertexArray')" + + ❯ packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts:14:16 +  12|  expect(() => { +  13|  execute(); +  14|  }).not.toThrow(); +  |  ^ +  15|  }); +  16| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts > ContextDrawPixelsUseCase.js method test > test case - should execute draw pixels +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'createTexture')" + + ❯ packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts:26:16 +  24|  expect(() => { +  25|  execute(mockNode, pixels); +  26|  }).not.toThrow(); +  |  ^ +  27|  }); +  28|  + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts > ContextDrawPixelsUseCase.js method test > test case - should handle empty pixels +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'createTexture')" + + ❯ packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts:44:16 +  42|  expect(() => { +  43|  execute(mockNode, pixels); +  44|  }).not.toThrow(); +  |  ^ +  45|  }); +  46| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts > ContextLinearGradientFillUseCase.js method test > test case - should execute linear gradient fill shader +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'disable')" + + ❯ packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts:24:16 +  22|  expect(() => { +  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  24|  }).not.toThrow(); +  |  ^ +  25|  }); +  26|  + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts > ContextLinearGradientFillUseCase.js method test > test case - should execute with grid data +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'disable')" + + ❯ packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts:40:16 +  38|  expect(() => { +  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  40|  }).not.toThrow(); +  |  ^ +  41|  }); +  42| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts > ContextNormalFillUseCase.js method test > test case - should execute normal fill shader +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" + + ❯ packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts:24:16 +  22|  expect(() => { +  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  24|  }).not.toThrow(); +  |  ^ +  25|  }); +  26|  + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts > ContextNormalFillUseCase.js method test > test case - should execute with grid data +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" + + ❯ packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts:40:16 +  38|  expect(() => { +  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  40|  }).not.toThrow(); +  |  ^ +  41|  }); +  42| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts > ContextPatternBitmapFillUseCase.js method test > test case - should execute pattern bitmap fill shader +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" + + ❯ packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts:24:16 +  22|  expect(() => { +  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  24|  }).not.toThrow(); +  |  ^ +  25|  }); +  26|  + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts > ContextPatternBitmapFillUseCase.js method test > test case - should execute with grid data +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" + + ❯ packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts:40:16 +  38|  expect(() => { +  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  40|  }).not.toThrow(); +  |  ^ +  41|  }); +  42| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts > ContextRadialGradientFillUseCase.js method test > test case - should execute radial gradient fill shader +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'disable')" + + ❯ packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts:24:16 +  22|  expect(() => { +  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  24|  }).not.toThrow(); +  |  ^ +  25|  }); +  26|  + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/15]⎯ + + FAIL  packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts > ContextRadialGradientFillUseCase.js method test > test case - should execute with grid data +AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown + +- Expected: +undefined + ++ Received: +"TypeError: Cannot read properties of undefined (reading 'disable')" + + ❯ packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts:40:16 +  38|  expect(() => { +  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… +  40|  }).not.toThrow(); +  |  ^ +  41|  }); +  42| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/15]⎯ + + + Test Files  9 failed | 498 passed (507) + Tests  15 failed | 1583 passed (1598) + Start at  17:10:03 + Duration  53.81s (transform 19.95s, setup 14.49s, collect 109.99s, tests 2.15s, environment 182.45s, prepare 5.98s) + From 21a4296a8a6dbcb886ad0cbd4493b9ed0401a0f0 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 31 Oct 2025 18:29:41 +0900 Subject: [PATCH 24/45] =?UTF-8?q?#213=20=E3=83=A6=E3=83=8B=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/texture-packer/src/Node.ts | 12 +- ...ManagerGetTextureFromBoundsUseCase.test.ts | 79 ++ ...erManagerGetTextureFromNodeUseCase.test.ts | 71 ++ ...agerTransferTextureFromRectUseCase.test.ts | 48 + ...hGenerateCalculateBevelJoinUseCase.test.ts | 42 + ...hGenerateCalculateMiterJoinUseCase.test.ts | 54 ++ ...hGenerateCalculateRoundJoinUseCase.test.ts | 17 + .../MeshGenerateStrokeOutlineUseCase.test.ts | 26 + .../usecase/MeshStrokeGenerateUseCase.test.ts | 30 + packages/webgl/src/PathCommand.ts | 2 +- ...tureManagerCreateFromCanvasUseCase.test.ts | 100 +++ ...gerGetMainTextureFromBoundsUseCase.test.ts | 78 ++ ...texArrayObjectBindAttributeUseCase.test.ts | 53 ++ .../VertexArrayObjectBootUseCase.test.ts | 42 + ...eInstancedVertexArrayObjectUseCase.test.ts | 51 ++ ...CreateRectVertexArrayObjectUseCase.test.ts | 34 + ...rrayObjectGetGradientObjectUseCase.test.ts | 77 ++ test-output.log | 823 ------------------ test.setup.ts | 8 +- 19 files changed, 816 insertions(+), 831 deletions(-) create mode 100644 packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase.test.ts create mode 100644 packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase.test.ts create mode 100644 packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase.test.ts create mode 100644 packages/webgl/src/Mesh/usecase/MeshGenerateCalculateBevelJoinUseCase.test.ts create mode 100644 packages/webgl/src/Mesh/usecase/MeshGenerateCalculateMiterJoinUseCase.test.ts create mode 100644 packages/webgl/src/Mesh/usecase/MeshGenerateCalculateRoundJoinUseCase.test.ts create mode 100644 packages/webgl/src/Mesh/usecase/MeshGenerateStrokeOutlineUseCase.test.ts create mode 100644 packages/webgl/src/Mesh/usecase/MeshStrokeGenerateUseCase.test.ts create mode 100644 packages/webgl/src/TextureManager/usecase/TextureManagerCreateFromCanvasUseCase.test.ts create mode 100644 packages/webgl/src/TextureManager/usecase/TextureManagerGetMainTextureFromBoundsUseCase.test.ts create mode 100644 packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBindAttributeUseCase.test.ts create mode 100644 packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBootUseCase.test.ts create mode 100644 packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts create mode 100644 packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.test.ts create mode 100644 packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectGetGradientObjectUseCase.test.ts delete mode 100644 test-output.log diff --git a/packages/texture-packer/src/Node.ts b/packages/texture-packer/src/Node.ts index 385bd35e..e6949a6a 100644 --- a/packages/texture-packer/src/Node.ts +++ b/packages/texture-packer/src/Node.ts @@ -134,12 +134,12 @@ export class Node /** * @description 新規ノードを生成 * Create a new node - * - * @param {number} index - * @param {number} x - * @param {number} y - * @param {number} w - * @param {number} h + * + * @param {number} index + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h * @return {Node} * @method * @public diff --git a/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase.test.ts b/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase.test.ts new file mode 100644 index 00000000..c3682159 --- /dev/null +++ b/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromBoundsUseCase.test.ts @@ -0,0 +1,79 @@ +import { execute } from "./FrameBufferManagerGetTextureFromBoundsUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("FrameBufferManagerGetTextureFromBoundsUseCase.js method test", () => +{ + it("test case1", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createTexture": vi.fn(() => { return "createTexture" }), + "activeTexture": vi.fn(() => { return "activeTexture" }), + "bindTexture": vi.fn(() => { return "bindTexture" }), + "texParameteri": vi.fn(() => { return "texParameteri" }), + "texStorage2D": vi.fn(() => { return "texStorage2D" }), + "createRenderbuffer": vi.fn(() => { return "createRenderbuffer" }), + "bindRenderbuffer": vi.fn(() => { return "bindRenderbuffer" }), + "renderbufferStorage": vi.fn(() => { return "renderbufferStorage" }), + "TEXTURE0": 0, + "TEXTURE_2D": 0, + "LINEAR": 0, + "CLAMP_TO_EDGE": 0, + "RGBA8": 0, + "RENDERBUFFER": 0, + "STENCIL_INDEX8": 0 + }, + $context: { + "currentAttachmentObject": null, + "bind": vi.fn(), + "save": vi.fn(), + "setTransform": vi.fn(), + "restore": vi.fn() + } + } + }); + + vi.mock("../../TextureManager/usecase/TextureManagerGetMainTextureFromBoundsUseCase", () => ({ + execute: vi.fn(() => ({ + id: 0, + resource: "mainTexture", + width: 100, + height: 100, + area: 10000, + smooth: false + })) + })); + + vi.mock("../../Shader/Variants/Blend/service/VariantsBlendTextureShaderService", () => ({ + execute: vi.fn(() => ({ + program: "shaderProgram", + uniforms: {} + })) + })); + + vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetTextureUniformService", () => ({ + execute: vi.fn() + })); + + vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase", () => ({ + execute: vi.fn() + })); + + vi.mock("../../Blend/service/BlendResetService", () => ({ + execute: vi.fn() + })); + + vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() + })); + + const textureObject = execute(10, 20, 100, 100); + expect(textureObject).toBeDefined(); + expect(textureObject.width).toBe(100); + expect(textureObject.height).toBe(100); + }); +}); diff --git a/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase.test.ts b/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase.test.ts new file mode 100644 index 00000000..d3f20abc --- /dev/null +++ b/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetTextureFromNodeUseCase.test.ts @@ -0,0 +1,71 @@ +import type { Node } from "@next2d/texture-packer"; +import { execute } from "./FrameBufferManagerGetTextureFromNodeUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("FrameBufferManagerGetTextureFromNodeUseCase.js method test", () => +{ + it("test case1", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "bindFramebuffer": vi.fn(), + "framebufferTexture2D": vi.fn(), + "blitFramebuffer": vi.fn(), + "FRAMEBUFFER": 0, + "READ_FRAMEBUFFER": 1, + "DRAW_FRAMEBUFFER": 2, + "COLOR_ATTACHMENT0": 0, + "TEXTURE_2D": 0, + "COLOR_BUFFER_BIT": 0, + "NEAREST": 0 + } + } + }); + + vi.mock("../../FrameBufferManager", () => ({ + $getDrawBitmapFrameBuffer: vi.fn(() => "drawFrameBuffer"), + $getReadBitmapFrameBuffer: vi.fn(() => "readFrameBuffer"), + $readFrameBuffer: "readFrameBuffer" + })); + + vi.mock("../../AtlasManager", () => ({ + $getActiveAtlasIndex: vi.fn(() => 0), + $setActiveAtlasIndex: vi.fn(), + $getAtlasTextureObject: vi.fn(() => ({ + resource: "atlasTexture" + })) + })); + + vi.mock("../../TextureManager/usecase/TextureManagerGetTextureUseCase", () => ({ + execute: vi.fn(() => ({ + id: 0, + resource: "texture", + width: 100, + height: 100, + area: 10000, + smooth: false + })) + })); + + vi.mock("../../FrameBufferManager/service/FrameBufferManagerTransferAtlasTextureService", () => ({ + execute: vi.fn() + })); + + const node: Node = { + x: 10, + y: 20, + w: 100, + h: 100, + index: 0 + }; + + const textureObject = execute(node); + expect(textureObject).toBeDefined(); + expect(textureObject.width).toBe(100); + expect(textureObject.height).toBe(100); + }); +}); diff --git a/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase.test.ts b/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase.test.ts new file mode 100644 index 00000000..2452c1d1 --- /dev/null +++ b/packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerTransferTextureFromRectUseCase.test.ts @@ -0,0 +1,48 @@ +import type { ITextureObject } from "../../interface/ITextureObject"; +import { execute } from "./FrameBufferManagerTransferTextureFromRectUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("FrameBufferManagerTransferTextureFromRectUseCase.js method test", () => +{ + it("test case1", () => + { + vi.mock("../../TextureManager/usecase/TextureManagerBind0UseCase", () => ({ + execute: vi.fn() + })); + + vi.mock("../../Blend/service/BlendOneZeroService", () => ({ + execute: vi.fn() + })); + + vi.mock("../../Blend/service/BlendResetService", () => ({ + execute: vi.fn() + })); + + vi.mock("../../Shader/Variants/Blend/service/VariantsBlendTextureShaderService", () => ({ + execute: vi.fn(() => ({ + program: "shaderProgram", + uniforms: {} + })) + })); + + vi.mock("../../Shader/ShaderManager/service/ShaderManagerSetTextureUniformService", () => ({ + execute: vi.fn() + })); + + vi.mock("../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase", () => ({ + execute: vi.fn() + })); + + const textureObject: ITextureObject = { + id: 0, + resource: "texture", + width: 100, + height: 100, + area: 10000, + smooth: false + }; + + execute(textureObject); + expect(true).toBe(true); + }); +}); diff --git a/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateBevelJoinUseCase.test.ts b/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateBevelJoinUseCase.test.ts new file mode 100644 index 00000000..5c6d5e26 --- /dev/null +++ b/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateBevelJoinUseCase.test.ts @@ -0,0 +1,42 @@ +import { execute } from "./MeshGenerateCalculateBevelJoinUseCase"; +import { describe, expect, it } from "vitest"; + +describe("MeshGenerateCalculateBevelJoinUseCase.js method test", () => +{ + it("test case - basic bevel join", () => + { + const rectangles = [ + [0, 0, false, 10, 0, false, 10, 5, false, 0, 5, false, 0, 0, false], + [10, 0, false, 10, 10, false, 5, 10, false, 5, 0, false, 10, 0, false] + ]; + + const initialLength = rectangles.length; + execute(10, 0, 3, rectangles); + expect(rectangles.length).toBeGreaterThanOrEqual(initialLength); + }); + + it("test case - bevel join with is_last=true", () => + { + const rectangles = [ + [0, 0, false, 10, 0, false, 10, 5, false, 0, 5, false, 0, 0, false], + [10, 0, false, 10, 10, false, 5, 10, false, 5, 0, false, 10, 0, false], + [10, 10, false, 0, 10, false, 0, 15, false, 10, 15, false, 10, 10, false] + ]; + + const initialLength = rectangles.length; + execute(10, 10, 3, rectangles, true); + expect(rectangles.length).toBeGreaterThanOrEqual(initialLength); + }); + + it("test case - parallel paths (no join)", () => + { + const rectangles = [ + [10, 10, false, 20, 10, false, 20, 15, false, 10, 15, false, 10, 10, false], + [20, 10, false, 30, 10, false, 30, 15, false, 20, 15, false, 20, 10, false] + ]; + + const initialLength = rectangles.length; + execute(20, 10, 5, rectangles); + expect(rectangles.length).toBe(initialLength); + }); +}); diff --git a/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateMiterJoinUseCase.test.ts b/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateMiterJoinUseCase.test.ts new file mode 100644 index 00000000..f594ea83 --- /dev/null +++ b/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateMiterJoinUseCase.test.ts @@ -0,0 +1,54 @@ +import { execute } from "./MeshGenerateCalculateMiterJoinUseCase"; +import { describe, expect, it } from "vitest"; + +describe("MeshGenerateCalculateMiterJoinUseCase.js method test", () => +{ + it("test case - basic miter join", () => + { + const rectangles = [ + [0, 0, false, 10, 0, false, 10, 5, false, 0, 5, false, 0, 0, false], + [10, 0, false, 10, 10, false, 5, 10, false, 5, 0, false, 10, 0, false] + ]; + + const startPoint = { x: 10, y: 0 }; + const endPoint = { x: 10, y: 10 }; + const prevPoint = { x: 0, y: 0 }; + + const initialLength = rectangles.length; + execute(startPoint, endPoint, prevPoint, 3, rectangles); + expect(rectangles.length).toBeGreaterThanOrEqual(initialLength); + }); + + it("test case - miter join with is_last=true", () => + { + const rectangles = [ + [0, 0, false, 10, 0, false, 10, 5, false, 0, 5, false, 0, 0, false], + [10, 0, false, 10, 10, false, 5, 10, false, 5, 0, false, 10, 0, false], + [10, 10, false, 0, 10, false, 0, 15, false, 10, 15, false, 10, 10, false] + ]; + + const startPoint = { x: 10, y: 10 }; + const endPoint = { x: 0, y: 10 }; + const prevPoint = { x: 10, y: 0 }; + + const initialLength = rectangles.length; + execute(startPoint, endPoint, prevPoint, 3, rectangles, true); + expect(rectangles.length).toBeGreaterThanOrEqual(initialLength); + }); + + it("test case - parallel paths (no join)", () => + { + const rectangles = [ + [10, 10, false, 20, 10, false, 20, 15, false, 10, 15, false, 10, 10, false], + [20, 10, false, 30, 10, false, 30, 15, false, 20, 15, false, 20, 10, false] + ]; + + const startPoint = { x: 20, y: 10 }; + const endPoint = { x: 30, y: 10 }; + const prevPoint = { x: 10, y: 10 }; + + const initialLength = rectangles.length; + execute(startPoint, endPoint, prevPoint, 5, rectangles); + expect(rectangles.length).toBe(initialLength); + }); +}); diff --git a/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateRoundJoinUseCase.test.ts b/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateRoundJoinUseCase.test.ts new file mode 100644 index 00000000..355e8c8c --- /dev/null +++ b/packages/webgl/src/Mesh/usecase/MeshGenerateCalculateRoundJoinUseCase.test.ts @@ -0,0 +1,17 @@ +import { execute } from "./MeshGenerateCalculateRoundJoinUseCase"; +import { describe, expect, it } from "vitest"; + +describe("MeshGenerateCalculateRoundJoinUseCase.js method test", () => +{ + it("test case - basic round join returns without error when points not inside", () => + { + const rectangles = [ + [0, 0, false, 10, 0, false, 10, 5, false, 0, 5, false, 0, 0, false], + [100, 100, false, 110, 100, false, 110, 105, false, 100, 105, false, 100, 100, false] + ]; + + const initialLength = rectangles.length; + execute(50, 50, 5, rectangles); + expect(rectangles.length).toBe(initialLength); + }); +}); diff --git a/packages/webgl/src/Mesh/usecase/MeshGenerateStrokeOutlineUseCase.test.ts b/packages/webgl/src/Mesh/usecase/MeshGenerateStrokeOutlineUseCase.test.ts new file mode 100644 index 00000000..44db3af5 --- /dev/null +++ b/packages/webgl/src/Mesh/usecase/MeshGenerateStrokeOutlineUseCase.test.ts @@ -0,0 +1,26 @@ +import { execute } from "./MeshGenerateStrokeOutlineUseCase"; +import { describe, expect, it, vi } from "vitest"; + +vi.mock("../../WebGLUtil.ts", () => ({ + "$context": { + "joints": 0, + "caps": 0 + } +})); + +describe("MeshGenerateStrokeOutlineUseCase.js method test", () => +{ + it("test case - generate stroke outline with straight lines", () => + { + const vertices = [ + 0, 0, false, + 100, 0, false + ]; + + const result = execute(vertices, 2); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBeGreaterThan(0); + expect(result[0]).toBeDefined(); + expect(result[0].length).toBeGreaterThan(0); + }); +}); diff --git a/packages/webgl/src/Mesh/usecase/MeshStrokeGenerateUseCase.test.ts b/packages/webgl/src/Mesh/usecase/MeshStrokeGenerateUseCase.test.ts new file mode 100644 index 00000000..66f7ddc4 --- /dev/null +++ b/packages/webgl/src/Mesh/usecase/MeshStrokeGenerateUseCase.test.ts @@ -0,0 +1,30 @@ +import { execute } from "./MeshStrokeGenerateUseCase"; +import { describe, expect, it, vi } from "vitest"; + +vi.mock("../../WebGLUtil.ts", () => ({ + "$context": { + "thickness": 4, + "joints": 0, + "caps": 0, + "$fillStyle": new Float32Array([0, 0, 0, 1]), + "$strokeStyle": new Float32Array([0, 0, 0, 1]), + "$matrix": new Float32Array([1, 0, 0, 1, 0, 0, 0, 0, 1]) + }, + "$getViewportWidth": () => 1024, + "$getViewportHeight": () => 1024 +})); + +describe("MeshStrokeGenerateUseCase.js method test", () => +{ + it("test case - generate stroke mesh", () => + { + const vertices = [ + [0, 0, false, 100, 0, false] + ]; + + const result = execute(vertices); + expect(result).toBeDefined(); + expect(result.buffer).toBeDefined(); + expect(result.indexCount).toBeGreaterThan(0); + }); +}); diff --git a/packages/webgl/src/PathCommand.ts b/packages/webgl/src/PathCommand.ts index 840eed03..2bc576b3 100644 --- a/packages/webgl/src/PathCommand.ts +++ b/packages/webgl/src/PathCommand.ts @@ -39,6 +39,6 @@ export const $getVertices = (stroke: boolean = false): IPath[] => $vertices.push($currentPath.slice(0)); $currentPath.length = 0; } - + return $vertices; }; \ No newline at end of file diff --git a/packages/webgl/src/TextureManager/usecase/TextureManagerCreateFromCanvasUseCase.test.ts b/packages/webgl/src/TextureManager/usecase/TextureManagerCreateFromCanvasUseCase.test.ts new file mode 100644 index 00000000..7d597fd5 --- /dev/null +++ b/packages/webgl/src/TextureManager/usecase/TextureManagerCreateFromCanvasUseCase.test.ts @@ -0,0 +1,100 @@ +import { execute } from "./TextureManagerCreateFromCanvasUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +describe("TextureManagerCreateFromCanvasUseCase.js method test", () => +{ + beforeEach(() => + { + vi.clearAllMocks(); + }); + + it("test case with OffscreenCanvas", async () => + { + const mockTexture = { + width: 320, + height: 240, + area: 76800, + resource: "mockTexture", + smooth: false + }; + + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createTexture": vi.fn(() => { return "createTexture" }), + "activeTexture": vi.fn(() => { return "activeTexture" }), + "bindTexture": vi.fn(() => { return "bindTexture" }), + "texParameteri": vi.fn(() => { return "texParameteri" }), + "texStorage2D": vi.fn(() => { return "texStorage2D" }), + "texSubImage2D": vi.fn(() => { return "texSubImage2D" }), + "TEXTURE_2D": 3553, + "RGBA": 6408, + "UNSIGNED_BYTE": 5121, + } + } + }); + + vi.mock("./TextureManagerGetTextureUseCase.ts", () => ({ + execute: vi.fn((width: number, height: number) => ({ + width, + height, + area: width * height, + resource: "mockTexture", + smooth: false + })) + })); + + const mockCanvas = { + width: 320, + height: 240 + } as OffscreenCanvas; + + const textureObject = execute(320, 240, mockCanvas); + expect(textureObject.width).toBe(320); + expect(textureObject.height).toBe(240); + }); + + it("test case with smooth parameter", async () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createTexture": vi.fn(() => { return "createTexture" }), + "activeTexture": vi.fn(() => { return "activeTexture" }), + "bindTexture": vi.fn(() => { return "bindTexture" }), + "texParameteri": vi.fn(() => { return "texParameteri" }), + "texStorage2D": vi.fn(() => { return "texStorage2D" }), + "texSubImage2D": vi.fn(() => { return "texSubImage2D" }), + "TEXTURE_2D": 3553, + "RGBA": 6408, + "UNSIGNED_BYTE": 5121, + } + } + }); + + vi.mock("./TextureManagerGetTextureUseCase.ts", () => ({ + execute: vi.fn((width: number, height: number, smooth: boolean) => ({ + width, + height, + area: width * height, + resource: "mockTexture", + smooth + })) + })); + + const mockCanvas = { + width: 100, + height: 100 + } as OffscreenCanvas; + + const textureObject = execute(100, 100, mockCanvas, true); + expect(textureObject.width).toBe(100); + expect(textureObject.height).toBe(100); + }); +}); diff --git a/packages/webgl/src/TextureManager/usecase/TextureManagerGetMainTextureFromBoundsUseCase.test.ts b/packages/webgl/src/TextureManager/usecase/TextureManagerGetMainTextureFromBoundsUseCase.test.ts new file mode 100644 index 00000000..142d93f1 --- /dev/null +++ b/packages/webgl/src/TextureManager/usecase/TextureManagerGetMainTextureFromBoundsUseCase.test.ts @@ -0,0 +1,78 @@ +import { execute } from "./TextureManagerGetMainTextureFromBoundsUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +vi.mock("../../WebGLUtil.ts", async (importOriginal) => +{ + const mod = await importOriginal(); + const mockAttachment = { + width: 800, + height: 600, + texture: { resource: "mockTexture", width: 800, height: 600, area: 480000 }, + frameBuffer: "mockFrameBuffer" + }; + + return { + ...mod, + $gl: { + "bindFramebuffer": vi.fn(), + "framebufferTexture2D": vi.fn(), + "enable": vi.fn(), + "scissor": vi.fn(), + "blitFramebuffer": vi.fn(), + "disable": vi.fn(), + "FRAMEBUFFER": 36160, + "READ_FRAMEBUFFER": 36008, + "DRAW_FRAMEBUFFER": 36009, + "COLOR_ATTACHMENT0": 36064, + "TEXTURE_2D": 3553, + "SCISSOR_TEST": 3089, + "COLOR_BUFFER_BIT": 16384, + "NEAREST": 9728, + }, + $context: { + currentAttachmentObject: mockAttachment, + $mainAttachmentObject: mockAttachment, + bind: vi.fn() + } + } +}); + +vi.mock("../../FrameBufferManager.ts", () => ({ + $getDrawBitmapFrameBuffer: vi.fn(() => "drawBitmapFrameBuffer"), + $readFrameBuffer: "readFrameBuffer" +})); + +vi.mock("./TextureManagerGetTextureUseCase.ts", () => ({ + execute: vi.fn((width: number, height: number) => ({ + width, + height, + area: width * height, + resource: "mockTexture" + })) +})); + +vi.mock("./TextureManagerBind0UseCase.ts", () => ({ + execute: vi.fn() +})); + +describe("TextureManagerGetMainTextureFromBoundsUseCase.js method test", () => +{ + beforeEach(() => + { + vi.clearAllMocks(); + }); + + it("test case with basic parameters", () => + { + const textureObject = execute(0, 0, 100, 100); + expect(textureObject.width).toBe(800); + expect(textureObject.height).toBe(600); + }); + + it("test case with different bounds", () => + { + const textureObject = execute(100, 200, 300, 400); + expect(textureObject.width).toBe(800); + expect(textureObject.height).toBe(600); + }); +}); diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBindAttributeUseCase.test.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBindAttributeUseCase.test.ts new file mode 100644 index 00000000..4ff59d05 --- /dev/null +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBindAttributeUseCase.test.ts @@ -0,0 +1,53 @@ +import { execute } from "./VertexArrayObjectBindAttributeUseCase"; +import { describe, expect, it, vi, beforeEach } from "vitest"; + +describe("VertexArrayObjectBindAttributeUseCase.js method test", () => +{ + beforeEach(() => + { + vi.clearAllMocks(); + }); + + it("test case", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "bindVertexArray": vi.fn(() => { return "bindVertexArray" }), + "bindBuffer": vi.fn(() => { return "bindBuffer" }), + "bufferData": vi.fn(() => { return "bufferData" }), + "bufferSubData": vi.fn(() => { return "bufferSubData" }), + "ARRAY_BUFFER": 34962, + "DYNAMIC_DRAW": 35048, + } + } + }); + + vi.mock("../../VertexArrayObject.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $instancedVertexArrayObject: { + "id": 1, + "resource": "testVertexArray", + "vertexBuffer": "testBuffer", + "vertexLength": 0 + }, + $attributeWebGLBuffer: "testAttributeBuffer" + } + }); + + vi.mock("@next2d/render-queue", () => ({ + renderQueue: { + buffer: new Float32Array(100), + offset: 50 + } + })); + + expect(() => execute()).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBootUseCase.test.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBootUseCase.test.ts new file mode 100644 index 00000000..aa0bc9ae --- /dev/null +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBootUseCase.test.ts @@ -0,0 +1,42 @@ +import { execute } from "./VertexArrayObjectBootUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("VertexArrayObjectBootUseCase.js method test", () => +{ + it("test case", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createVertexArray": vi.fn(() => { return "createVertexArray" }), + "createBuffer": vi.fn(() => { return "createBuffer" }), + "bindVertexArray": vi.fn(() => { return "bindVertexArray" }), + "bindBuffer": vi.fn(() => { return "bindBuffer" }), + "enableVertexAttribArray": vi.fn(() => { return "enableVertexAttribArray" }), + "vertexAttribPointer": vi.fn(() => { return "vertexAttribPointer" }), + "vertexAttribDivisor": vi.fn(() => { return "vertexAttribDivisor" }), + "bufferData": vi.fn(() => { return "bufferData" }), + "ARRAY_BUFFER": 34962, + "STATIC_DRAW": 35044, + "DYNAMIC_DRAW": 35048, + "FLOAT": 5126 + } + } + }); + + vi.mock("@next2d/render-queue", () => ({ + renderQueue: { + buffer: new Float32Array(1000) + } + })); + + const mockGl = { + "createBuffer": vi.fn(() => "testBuffer") + } as unknown as WebGL2RenderingContext; + + expect(() => execute(mockGl)).not.toThrow(); + }); +}); diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts new file mode 100644 index 00000000..6caadc37 --- /dev/null +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts @@ -0,0 +1,51 @@ +import { execute } from "./VertexArrayObjectCreateInstancedVertexArrayObjectUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.js method test", () => +{ + it("test case", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createVertexArray": vi.fn(() => "testVertexArray"), + "createBuffer": vi.fn(() => "testBuffer"), + "bindVertexArray": vi.fn(), + "bindBuffer": vi.fn(), + "bufferData": vi.fn(), + "enableVertexAttribArray": vi.fn(), + "vertexAttribPointer": vi.fn(), + "vertexAttribDivisor": vi.fn(), + "ARRAY_BUFFER": 34962, + "STATIC_DRAW": 35044, + "DYNAMIC_DRAW": 35048, + "FLOAT": 5126 + } + } + }); + + vi.mock("../../VertexArrayObject.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $attributeWebGLBuffer: "testAttributeBuffer" + } + }); + + vi.mock("@next2d/render-queue", () => ({ + renderQueue: { + buffer: new Float32Array(1000) + } + })); + + const vertexArrayObject = execute(); + + expect(vertexArrayObject.resource).toBeDefined(); + expect(vertexArrayObject.vertexBuffer).toBeDefined(); + expect(vertexArrayObject.vertexLength).toBe(0); + }); +}); diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.test.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.test.ts new file mode 100644 index 00000000..e4829a33 --- /dev/null +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.test.ts @@ -0,0 +1,34 @@ +import { execute } from "./VertexArrayObjectCreateRectVertexArrayObjectUseCase"; +import { describe, expect, it, vi } from "vitest"; + +describe("VertexArrayObjectCreateRectVertexArrayObjectUseCase.js method test", () => +{ + it("test case", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createVertexArray": vi.fn(() => "testVertexArray"), + "createBuffer": vi.fn(() => "testBuffer"), + "bindVertexArray": vi.fn(), + "bindBuffer": vi.fn(), + "bufferData": vi.fn(), + "enableVertexAttribArray": vi.fn(), + "vertexAttribPointer": vi.fn(), + "ARRAY_BUFFER": 34962, + "STATIC_DRAW": 35044, + "FLOAT": 5126 + } + } + }); + + const vertexArrayObject = execute(); + + expect(vertexArrayObject.resource).toBeDefined(); + expect(vertexArrayObject.vertexBuffer).toBeDefined(); + expect(vertexArrayObject.vertexLength).toBe(0); + }); +}); diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectGetGradientObjectUseCase.test.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectGetGradientObjectUseCase.test.ts new file mode 100644 index 00000000..fa4b612b --- /dev/null +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectGetGradientObjectUseCase.test.ts @@ -0,0 +1,77 @@ +import { execute } from "./VertexArrayObjectGetGradientObjectUseCase"; +import { describe, expect, it, vi } from "vitest"; +import { $vertexBufferData } from "../../VertexArrayObject"; + +describe("VertexArrayObjectGetGradientObjectUseCase.js method test", () => +{ + it("test case - create new gradient object", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createVertexArray": vi.fn(() => { return "createVertexArray" }), + "createBuffer": vi.fn(() => { return "createBuffer" }), + "bindVertexArray": vi.fn(() => { return "bindVertexArray" }), + "bindBuffer": vi.fn(() => { return "bindBuffer" }), + "enableVertexAttribArray": vi.fn(() => { return "enableVertexAttribArray" }), + "vertexAttribPointer": vi.fn(() => { return "vertexAttribPointer" }), + "bufferData": vi.fn(() => { return "bufferData" }), + "bufferSubData": vi.fn(() => { return "bufferSubData" }), + }, + $context: { + "$fillStyle": new Float32Array([0, 0, 0, 1]), + "$matrix": new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]), + } + } + }); + + $vertexBufferData[0] = 0; + $vertexBufferData[2] = 0; + $vertexBufferData[4] = 0; + $vertexBufferData[6] = 0; + + const vertexArrayObject = execute(0, 1); + + expect(vertexArrayObject.resource).toBe("createVertexArray"); + expect(vertexArrayObject.vertexBuffer).toBe("createBuffer"); + expect(vertexArrayObject.vertexLength).toBe(0); + }); + + it("test case - reuse existing gradient object with same values", () => + { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => + { + const mod = await importOriginal(); + return { + ...mod, + $gl: { + "createVertexArray": vi.fn(() => { return "createVertexArray" }), + "createBuffer": vi.fn(() => { return "createBuffer" }), + "bindVertexArray": vi.fn(() => { return "bindVertexArray" }), + "bindBuffer": vi.fn(() => { return "bindBuffer" }), + "enableVertexAttribArray": vi.fn(() => { return "enableVertexAttribArray" }), + "vertexAttribPointer": vi.fn(() => { return "vertexAttribPointer" }), + "bufferData": vi.fn(() => { return "bufferData" }), + "bufferSubData": vi.fn(() => { return "bufferSubData" }), + }, + $context: { + "$fillStyle": new Float32Array([0, 0, 0, 1]), + "$matrix": new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]), + } + } + }); + + $vertexBufferData[0] = 0; + $vertexBufferData[2] = 0; + $vertexBufferData[4] = 1; + $vertexBufferData[6] = 1; + + const vertexArrayObject1 = execute(0, 1); + const vertexArrayObject2 = execute(0, 1); + + expect(vertexArrayObject1).toBe(vertexArrayObject2); + }); +}); diff --git a/test-output.log b/test-output.log deleted file mode 100644 index e1860338..00000000 --- a/test-output.log +++ /dev/null @@ -1,823 +0,0 @@ - -> @next2d/player@2.6.0 test -> vitest --run - - - RUN  v4.0.5 /Users/l_0018/PhpstormProjects/Next2D/player - - ❯ packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts (2 tests | 2 failed) 5ms - × test case - should execute normal fill shader 4ms - × test case - should execute with grid data 0ms - ❯ packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts (2 tests | 2 failed) 4ms - × test case - should execute draw element with OffscreenCanvas 3ms - × test case - should execute draw element with ImageBitmap 0ms - ❯ packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts (2 tests | 2 failed) 9ms - × test case - should execute draw pixels 6ms - × test case - should handle empty pixels 2ms - ❯ packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts (2 tests | 2 failed) 6ms - × test case - should execute pattern bitmap fill shader 5ms - × test case - should execute with grid data 1ms - ❯ packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts (2 tests | 2 failed) 5ms - × test case - should execute linear gradient fill shader 4ms - × test case - should execute with grid data 1ms - ❯ packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts (2 tests | 2 failed) 8ms - × test case - should execute radial gradient fill shader 6ms - × test case - should execute with grid data 1ms - ❯ packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts (1 test | 1 failed) 4ms - × test case - should execute draw fill 4ms - ❯ packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts (1 test | 1 failed) 4ms - × test case - should execute clip operation 3ms - ✓ packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts (4 tests) 65ms - ✓ packages/core/src/Next2D/service/VideoSyncService.test.ts (2 tests) 38ms - ✓ packages/core/src/Canvas/service/CanvasInitializeService.test.ts (2 tests) 14ms - ✓ packages/core/src/Player/service/PlayerRemoveLoadingElementService.test.ts (1 test) 21ms - ✓ packages/text/src/TextField/service/TextFieldBlinkingClearTimeoutService.test.ts (15 tests) 157ms - ✓ packages/core/src/Player/service/PlayerApplyContainerElementStyleService.test.ts (3 tests) 17ms - ❯ packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts (1 test | 1 failed) 4ms - × test case - should execute filter application 4ms - ✓ packages/media/src/Sound/usecase/SoundLoadUseCase.test.ts (6 tests) 16ms - ✓ packages/text/src/TextField/usecase/TextFieldCompositionEndUseCase.test.ts (10 tests) 8ms - ✓ packages/text/src/TextField/usecase/TextFieldBuildFromCharacterUseCase.test.ts (10 tests) 11ms - ✓ packages/text/src/TextArea/usecase/TextAreaCompositionUpdateUseCase.test.ts (15 tests) 14ms - ✓ packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts (15 tests) 15ms - ✓ packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts (15 tests) 22ms - ✓ packages/display/src/TextField/usecase/TextFieldHitTestUseCase.test.ts (15 tests) 14ms - ✓ packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.test.ts (15 tests) 23ms - ✓ packages/text/src/TextField/usecase/TextFieldArrowUpUseCase.test.ts (10 tests) 14ms - ✓ packages/text/src/TextField/usecase/TextFieldArrowRightUseCase.test.ts (10 tests) 15ms - ✓ packages/text/src/TextField/usecase/TextFieldCompositionUpdateUseCase.test.ts (10 tests) 12ms - ✓ packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts (10 tests) 12ms - ✓ packages/text/src/TextField/usecase/TextFieldArrowLeftUseCase.test.ts (10 tests) 10ms - ✓ packages/text/src/TextField/usecase/TextFieldArrowDownUseCase.test.ts (10 tests) 15ms - ✓ packages/text/src/TextField/usecase/TextFieldInsertTextUseCase.test.ts (10 tests) 16ms - ✓ packages/core/src/Player/service/PlayerTransferCanvasPostMessageService.test.ts (4 tests) 10ms - ✓ packages/core/src/Player/usecase/PlayerHitTestUseCase.test.ts (5 tests) 23ms - ✓ packages/webgl/src/Blend/usecase/BlnedDrawDisplayObjectUseCase.test.ts (15 tests) 10ms - ✓ packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts (10 tests) 15ms - ✓ packages/text/src/TextArea/usecase/TextAreaInputUseCase.test.ts (15 tests) 7ms - ✓ packages/display/src/Video/usecase/VideoHitTestUseCase.test.ts (15 tests) 14ms - ✓ packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts (10 tests) 10ms - ✓ packages/webgl/src/Blend/usecase/BlendDrawFilterToMainUseCase.test.ts (10 tests) 12ms - ✓ packages/text/src/TextArea/usecase/TextAreaCompositionStartUseCase.test.ts (10 tests) 8ms - ✓ packages/display/src/Graphics/service/GraphicsHitTestService.test.ts (15 tests) 9ms - ✓ packages/text/src/TextArea/usecase/TextAreaCompositionEndUseCase.test.ts (10 tests) 8ms - ✓ packages/text/src/TextField/usecase/TextFieldResizeAutoFontSizeUseCase.test.ts (1 test) 7ms - ✓ packages/core/src/Next2D/usecase/LoadUseCase.test.ts (6 tests) 8ms - ✓ packages/core/src/Player/usecase/PlayerBootUseCase.test.ts (5 tests) 10ms - ✓ packages/display/src/Shape/usecase/ShapeHitTestUseCase.test.ts (10 tests) 10ms - ✓ packages/text/src/TextField/usecase/TextFieldCopyUseCase.test.ts (3 tests) 11ms - ✓ packages/core/src/Player/service/PlayerLoadingAnimationService.test.ts (1 test) 5ms - ✓ packages/webgl/src/Blend/usecase/BlnedDrawArraysInstancedUseCase.test.ts (10 tests) 6ms - ✓ packages/text/src/TextField/usecase/TextFieldDeleteTextUseCase.test.ts (2 tests) 5ms - ✓ packages/core/src/Player/service/PlayerPointerDownEventService.test.ts (3 tests) 6ms - ✓ packages/text/src/TextField/usecase/TextFieldSetScrollYUseCase.test.ts (1 test) 5ms - ✓ packages/text/src/TextField/usecase/TextFieldReplaceTextUseCase.test.ts (2 tests) 7ms - ✓ packages/text/src/TextField/service/TextFieldPasteService.test.ts (1 test) 5ms - ✓ packages/filters/src/GradientBevelFilter/service/GradientBevelFilterToNumberArrayService.test.ts (4 tests) 3ms - ✓ packages/filters/src/BevelFilter.test.ts (60 tests) 9ms - ✓ packages/text/src/TextField/usecase/TextFieldUpdateStopIndexUseCase.test.ts (2 tests) 5ms - ✓ packages/text/src/TextFormat/service/TextFormatIsSameService.test.ts (12 tests) 2ms - ✓ packages/display/src/Stage/service/StageExecuteFrameSoundsService.test.ts (15 tests) 5ms - ✓ packages/text/src/TextField/usecase/TextFieldGetLineTextUseCase.test.ts (1 test) 6ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerAddChildUseCase.test.ts (2 tests) 3ms - ✓ packages/geom/src/Matrix/service/MatrixCreateBoxService.test.ts (31 tests) 12ms - ✓ packages/text/src/TextField/usecase/TextFieldGetTextDataUseCase.test.ts (1 test) 5ms - ✓ packages/display/src/Shape/usecase/ShapeLoadSrcUseCase.test.ts (10 tests) 11ms - ✓ packages/webgl/src/Context/service/ContextRestoreService.test.ts (1 test) 2ms - ✓ packages/events/src/EventDispatcher/service/EventDispatcherAddEventListenerService.test.ts (6 tests) 2ms - ✓ packages/text/src/TextParser/usecase/TextParserCreateNewLineUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectBuildFilterService.test.ts (10 tests) 11ms - ✓ packages/text/src/TextField/usecase/TextFieldResizeUseCase.test.ts (2 tests) 7ms - ✓ packages/text/src/TextField/usecase/TextFieldHtmlTextToRawTextUseCase.test.ts (1 test) 8ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectIsMaskReflectedInDisplayUseCase.test.ts (9 tests) 6ms - ✓ packages/geom/src/Rectangle.test.ts (14 tests) 15ms - ✓ packages/text/src/TextField/usecase/TextFieldSetScrollXUseCase.test.ts (1 test) 5ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetWidthUseCase.test.ts (8 tests) 6ms - ✓ packages/display/src/MovieClip/service/MovieClipGetChildrenService.test.ts (15 tests) 5ms - ✓ packages/display/src/Loader/usecase/LoaderLoadJsonUseCase.test.ts (10 tests) 5ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetHeightUseCase.test.ts (8 tests) 4ms - ✓ packages/display/src/Shape/usecase/ShapeGenerateRenderQueueUseCase.test.ts (10 tests) 4ms - ✓ packages/display/src/Video/usecase/VideoGenerateRenderQueueUseCase.test.ts (15 tests) 5ms - ✓ packages/text/src/TextParser/usecase/TextParserParseHtmlTextUseCase.test.ts (1 test) 11ms - ✓ packages/display/src/Loader/usecase/LoaderLoadUseCase.test.ts (10 tests) 6ms - ✓ packages/text/src/TextParser/usecase/TextParserParseTagUseCase.test.ts (1 test) 9ms - ✓ packages/display/src/Stage/usecase/StageGenerateRenderQueueUseCase.test.ts (10 tests) 4ms - ✓ packages/text/src/TextField/usecase/TextFieldResetUseCase.test.ts (1 test) 5ms - ✓ packages/display/src/BitmapData/service/BitmapDataCanvasToBufferService.test.ts (1 test) 4ms - ✓ packages/display/src/Graphics/usecase/GraphicsCalcBoundsUseCase.test.ts (15 tests) 5ms - ✓ packages/media/src/Video/service/VideoLoadedmetadataEventService.test.ts (1 test) 3ms - ✓ packages/webgl/src/BezierConverter/service/BezierConverterSplit2QuadService.test.ts (4 tests) 3ms - ✓ packages/geom/src/Matrix/service/MatrixRotateService.test.ts (19 tests) 4ms - ✓ packages/display/src/BitmapData/service/BitmapDataImageToBufferService.test.ts (1 test) 3ms - ✓ packages/core/src/Player/usecase/PlayerTickerUseCase.test.ts (9 tests) 12ms - ✓ packages/text/src/TextParser/usecase/TextParserSetAttributesUseCase.test.ts (1 test) 7ms - ✓ packages/geom/src/Point/service/PointInterpolateService.test.ts (22 tests) 3ms - ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerAssignStageAndRootService.test.ts (1 test) 6ms - ✓ packages/webgl/src/PathCommand/usecase/PathCommandArcUseCase.test.ts (1 test) 5ms - ✓ packages/events/src/EventDispatcher/service/EventDispatcherRemoveEventListenerService.test.ts (5 tests) 2ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectGlobalToLocalService.test.ts (2 tests) 2ms - ✓ packages/display/src/MovieClip/usecase/MovieClipBuildFromCharacterUseCase.test.ts (15 tests) 4ms - ✓ packages/events/src/VideoEvent.test.ts (4 tests) 2ms - ✓ packages/display/src/MovieClip/usecase/MovieClipBuildDictionaryCharacterUseCase.test.ts (15 tests) 5ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetWidthUseCase.test.ts (3 tests) 6ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetHeightUseCase.test.ts (3 tests) 4ms - ✓ packages/display/src/Stage/usecase/StageReadyUseCase.test.ts (10 tests) 4ms - ✓ packages/geom/src/Matrix/service/MatrixCreateGradientBoxService.test.ts (14 tests) 5ms - ✓ packages/display/src/TextField/usecase/TextFieldCalcBoundsMatrixUseCase.test.ts (4 tests) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.test.ts (2 tests) 2ms - ✓ packages/display/src/Graphics/service/GraphicsToNumberArrayService.test.ts (2 tests) 2ms - ✓ packages/display/src/Graphics/service/GraphicsDrawRoundRectService.test.ts (1 test) 4ms - ✓ packages/media/src/Video/service/VideoEndedEventService.test.ts (2 tests) 3ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRawBoundsMatrixUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/MovieClip/service/MovieClipCurrentFrameLabelService.test.ts (3 tests) 4ms - ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerAddedToStageService.test.ts (2 tests) 3ms - ✓ packages/display/src/Stage/usecase/StageTickerUseCase.test.ts (10 tests) 5ms - ✓ packages/display/src/Shape/usecase/ShapeBuildFromCharacterUseCase.test.ts (10 tests) 3ms - ✓ packages/text/src/TextParser/usecase/TextParserParseTextUseCase.test.ts (1 test) 3ms - ✓ packages/geom/src/Point/service/PointPolarService.test.ts (20 tests) 3ms - ✓ packages/webgl/src/Context/usecase/ContextResizeUseCase.test.ts (1 test) 5ms - ✓ packages/core/src/Player/usecase/PlayerResizeEventUseCase.test.ts (1 test) 7ms - ✓ packages/cache/src/CacheStore/service/CacheStoreHasService.test.ts (3 tests) 3ms - ✓ packages/media/src/Sound/usecase/SoundBuildFromCharacterUseCase.test.ts (6 tests) 13ms - ✓ packages/geom/src/Rectangle/service/RectangleCopyFromService.test.ts (1 test) 4ms - ✓ packages/geom/src/Matrix/service/MatrixDeltaTransformPointService.test.ts (18 tests) 3ms - ✓ packages/display/src/Shape/usecase/ShapeSetBitmapBufferUseCase.test.ts (10 tests) 3ms - ✓ packages/webgl/src/Mask/usecase/MaskBindUseCase.test.ts (2 tests) 1ms - ✓ packages/webgl/src/Mesh/service/MeshCalculateNormalizeBezierService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.test.ts (1 test) 2ms - ✓ packages/core/src/Player/usecase/PlayerReadyCompleteUseCase.test.ts (1 test) 4ms - ✓ packages/filters/src/BlurFilter.test.ts (22 tests) 3ms - ✓ packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase.test.ts (2 tests) 2ms - ✓ packages/geom/src/Point/service/PointSetToService.test.ts (2 tests) 1ms - ✓ packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts (4 tests) 3ms - ✓ packages/ui/src/Easing/service/EasingInOutElasticService.test.ts (1 test) 2ms - ✓ packages/text/src/TextField/usecase/TextFieldBlinkingUseCase.test.ts (1 test) 4ms - ✓ packages/events/src/EventDispatcher/service/EventDispatcherDispatchEventService.test.ts (8 tests) 3ms - ✓ packages/core/src/Player/service/PlayerCreateContainerElementService.test.ts (1 test) 2ms - ✓ packages/display/src/Shape/usecase/ShapeClearBitmapBufferUseCase.test.ts (10 tests) 3ms - ✓ packages/text/src/TextParser/service/TextParserParseStyleService.test.ts (1 test) 2ms - ✓ packages/geom/src/Matrix/service/MatrixTransformPointService.test.ts (13 tests) 3ms - ✓ packages/geom/src/Rectangle/service/RectangleUnionService.test.ts (9 tests) 2ms - ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerUnAssignStageAndRootService.test.ts (1 test) 4ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerCalcBoundsMatrixUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerContainsService.test.ts (1 test) 3ms - ✓ packages/geom/src/Point/service/PointDistanceService.test.ts (16 tests) 6ms - ✓ packages/renderer/src/Command/service/CommandInitializeContextService.test.ts (1 test) 4ms - ✓ packages/webgl/src/Blend/service/BlendSourceAtopService.test.ts (1 test) 1ms - ✓ packages/cache/src/CacheStore/service/CacheStoreGetService.test.ts (3 tests) 1ms - ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerRemovedToStageService.test.ts (1 test) 3ms - ✓ packages/geom/src/Rectangle/service/RectangleContainsPointService.test.ts (2 tests) 2ms - ✓ packages/geom/src/Rectangle/service/RectangleIntersectionService.test.ts (4 tests) 3ms - ✓ packages/webgl/src/Context/usecase/ContextGradientStrokeUseCase.test.ts (2 tests) 2ms - ✓ packages/webgl/src/Context/service/ContextTransformService.test.ts (1 test) 5ms - ✓ packages/webgl/src/Context/usecase/ContextBindUseCase.test.ts (1 test) 5ms - ✓ packages/webgl/src/Mask/usecase/MaskLeaveMaskUseCase.test.ts (2 tests) 3ms - ✓ packages/webgl/src/Blend/usecase/BlendOperationUseCase.test.ts (6 tests) 2ms - ✓ packages/geom/src/Matrix/service/MatrixInvertService.test.ts (7 tests) 2ms - ✓ packages/webgl/src/Context/service/ContextResetStyleService.test.ts (1 test) 8ms - ✓ packages/core/src/Canvas/service/CanvasBootOffscreenCanvasService.test.ts (1 test) 2ms - ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerGetChildByNameService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Mesh/service/MeshFillGenerateService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.test.ts (5 tests) 2ms - ✓ packages/display/src/BlendMode.test.ts (14 tests) 2ms - ✓ packages/webgl/src/Context/service/ContextCreateImageBitmapService.test.ts (3 tests) 2ms - ✓ packages/display/src/DisplayObjectContainer/service/DisplayObjectContainerGetChildAtService.test.ts (1 test) 4ms - ✓ packages/webgl/src/BezierConverter/service/BezierConverterSplit2CubicService.test.ts (3 tests) 3ms - ✓ packages/webgl/src/Context/service/ContextSaveService.test.ts (1 test) 5ms - ✓ packages/geom/src/Matrix/service/MatirxConcatService.test.ts (8 tests) 3ms - ✓ packages/webgl/src/Context/service/ContextUpdateBackgroundColorService.test.ts (1 test) 6ms - ✓ packages/ui/src/Easing/service/EasingInOutBackService.test.ts (1 test) 2ms - ✓ packages/events/src/ProgressEvent.test.ts (1 test) 1ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectGenerateHashService.test.ts (1 test) 1ms - ✓ packages/filters/src/GradientGlowFilter/service/GradientGlowFilterToNumberArrayService.test.ts (4 tests) 4ms - ✓ packages/webgl/src/PathCommand/usecase/PathCommandBezierCurveToUseCase.test.ts (1 test) 3ms - ✓ packages/events/src/IOErrorEvent.test.ts (1 test) 1ms - ✓ packages/text/src/TextField/usecase/TextFieldSetFocusUseCase.test.ts (1 test) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetMatrixUseCase.test.ts (6 tests) 5ms - ✓ packages/display/src/Graphics/service/GraphicsDrawRectService.test.ts (1 test) 3ms - ✓ packages/display/src/Graphics/service/GraphicsDrawEllipseService.test.ts (1 test) 3ms - ✓ packages/ui/src/Easing/service/EasingInOutCircService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Context/service/ContextResetService.test.ts (1 test) 2ms - ✓ packages/webgl/src/StencilBufferObject/service/StencilBufferObjectReleaseColorBufferObjectService.test.ts (1 test) 3ms - ✓ packages/webgl/src/ColorBufferObject/service/ColorBufferObjectMeguruBinarySearchService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectHitTestPointUseCase.test.ts (1 test) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectHitTestObjectUseCase.test.ts (2 tests) 2ms - ✓ packages/filters/src/ConvolutionFilter/service/ConvolutionFilterToArrayService.test.ts (1 test) 7ms - ✓ packages/filters/src/DropShadowFilter/usecase/DropShadowFilterGetBoundsUseCase.test.ts (1 test) 2ms - ✓ packages/geom/src/Point/service/PointCloneService.test.ts (1 test) 2ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectBlendToNumberService.test.ts (1 test) 2ms - ✓ packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectBindFillMeshUseCase.test.ts (1 test) 2ms - ✓ packages/text/src/TextField/service/TextFieldCompositionStartService.test.ts (1 test) 5ms - ✓ packages/core/src/Player/service/PlayerResizePostMessageService.test.ts (5 tests) 4ms - ✓ packages/webgl/src/Mesh/usecase/MeshCalculateCurveRectangleUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetColorTransformUseCase.test.ts (5 tests) 2ms - ✓ packages/display/src/Loader/usecase/LoaderLoadEndEventUseCase.test.ts (2 tests) 2ms - ✓ packages/display/src/TextField/service/TextFieldGetRawBoundsService.test.ts (1 test) 3ms - ✓ packages/events/src/Event.test.ts (12 tests) 5ms - ✓ packages/media/src/Video/service/VideoCreateElementService.test.ts (1 test) 4ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerSwapChildrenUseCase.test.ts (2 tests) 4ms - ✓ packages/cache/src/CacheStore/service/CacheStoreGenerateFilterKeysService.test.ts (2 tests) 2ms - ✓ packages/webgl/src/Context/usecase/ContextFillUseCase.test.ts (4 tests) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetCalcBoundsUseCase.test.ts (5 tests) 2ms - ✓ packages/geom/src/Point/service/PointAddService.test.ts (3 tests) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRawBoundsUseCase.test.ts (5 tests) 2ms - ✓ packages/filters/src/GradientGlowFilter/service/GradientGlowFilterCanApplyFilterService.test.ts (1 test) 2ms - ✓ packages/ui/src/Easing/service/EasingInOutQuintService.test.ts (1 test) 4ms - ✓ packages/geom/src/Matrix/service/MatrixScaleService.test.ts (5 tests) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.test.ts (4 tests) 2ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerSetChildIndexUseCase.test.ts (2 tests) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetBoundsUseCase.test.ts (1 test) 4ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerSwapChildrenAtUseCase.test.ts (2 tests) 2ms - ✓ packages/core/src/Player/service/PlayerAppendElementService.test.ts (1 test) 6ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectLocalToGlobalService.test.ts (2 tests) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.test.ts (4 tests) 4ms - ✓ packages/filters/src/BevelFilter/service/BevelFilterToNumberArrayService.test.ts (3 tests) 2ms - ✓ packages/core/src/Player/service/PlayerRenderingPostMessageService.test.ts (4 tests) 2ms - ✓ packages/display/src/Shape/usecase/ShapeCalcBoundsMatrixUseCase.test.ts (3 tests) 2ms - ✓ packages/geom/src/Rectangle/service/RectangleContainsService.test.ts (4 tests) 4ms - ✓ packages/ui/src/Easing/service/EasingOutQuintService.test.ts (1 test) 1ms - ✓ packages/display/src/Video/usecase/VideoCalcBoundsMatrixUseCase.test.ts (4 tests) 2ms - ✓ packages/webgl/src/PathCommand/service/PathCommandPushPointToCurrentPathService.test.ts (1 test) 1ms - ✓ packages/core/src/Canvas/usecase/CanvasPointerMoveEventUseCase.test.ts (1 test) 2ms - ✓ packages/core/src/Canvas/service/CanvasSetPositionService.test.ts (1 test) 2ms - ✓ packages/webgl/src/AtlasManager/service/AtlasManagerCreateNodeService.test.ts (1 test) 2ms - ✓ packages/net/src/URLRequest.test.ts (6 tests) 4ms - ✓ packages/media/src/Sound/usecase/SoundLoadEndEventUseCase.test.ts (2 tests) 4ms - ✓ packages/core/src/Player/service/PlayerRemoveCachePostMessageService.test.ts (3 tests) 3ms - ✓ packages/webgl/src/Mask/service/MaskBeginMaskService.test.ts (1 test) 2ms - ✓ packages/media/src/Sound/service/SoundLoadStartEventService.test.ts (2 tests) 3ms - ✓ packages/media/src/Video/usecase/VideoCanplaythroughEventUseCase.test.ts (2 tests) 2ms - ✓ packages/core/src/Canvas/usecase/CanvasPointerDownEventUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/FrameBufferManager/service/FrameBufferManagerBindAttachmentObjectService.test.ts (2 tests) 2ms - ✓ packages/display/src/MovieClip/usecase/MovieClipGoToFrameUseCase.test.ts (2 tests) 7ms - ✓ packages/core/src/Player/service/PlayerSetCurrentMousePointService.test.ts (4 tests) 4ms - ✓ packages/display/src/Loader/service/LoaderLoadStartEventService.test.ts (2 tests) 2ms - ✓ packages/geom/src/ColorTransform/service/ColorTransformConcatService.test.ts (4 tests) 3ms - ✓ packages/geom/src/Point/service/PointOffsetService.test.ts (5 tests) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRawColorTransformUseCase.test.ts (3 tests) 2ms - ✓ packages/geom/src/Point/service/PointNormalizeService.test.ts (6 tests) 4ms - ✓ packages/display/src/MovieClip/usecase/MovieClipPrevFrameUseCase.test.ts (2 tests) 4ms - ✓ packages/geom/src/Matrix/service/MatrixTranslateService.test.ts (2 tests) 5ms - ✓ packages/webgl/src/Mesh/service/MeshGenerateCalculateRoundCapService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectConcatenatedMatrixUseCase.test.ts (3 tests) 2ms - ✓ packages/webgl/src/PathCommand/service/PathCommandCreateRectVerticesService.test.ts (1 test) 1ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRemoveChildUseCase.test.ts (1 test) 4ms - ✓ packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectGetFillObjectUseCase.test.ts (1 test) 2ms - ✓ packages/filters/src/ConvolutionFilter/service/ConvolutionFilterCanApplyFilterService.test.ts (2 tests) 1ms - ✓ packages/core/src/Player/service/PlayerDoubleClickEventService.test.ts (2 tests) 4ms - ✓ packages/ui/src/Job/service/JobEntriesService.test.ts (3 tests) 2ms - ✓ packages/webgl/src/Mesh/usecase/MeshFillGenerateUseCase.test.ts (1 test) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.test.ts (4 tests) 2ms - ✓ packages/webgl/src/Mesh/usecase/MeshSplitBezierMultipleTimesUseCase.test.ts (1 test) 4ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateRenderQueueUseCase.test.ts (1 test) 2ms - ✓ packages/text/src/TextArea/service/TextAreaMovePositionService.test.ts (1 test) 4ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRawMatrixUseCase.test.ts (3 tests) 4ms - ✓ packages/ui/src/Easing/service/EasingInCubicService.test.ts (1 test) 1ms - ✓ packages/media/src/Video/service/VideoProgressEventService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetAlphaUseCase.test.ts (2 tests) 5ms - ✓ packages/texture-packer/src/Node/service/NodeInsertService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRemoveChildAtUseCase.test.ts (1 test) 2ms - ✓ packages/geom/src/Point/service/PointEqualsService.test.ts (4 tests) 2ms - ✓ packages/geom/src/Matrix/service/MatrixIdentityService.test.ts (1 test) 1ms - ✓ packages/ui/src/Job/service/JobUpdatePropertyService.test.ts (3 tests) 4ms - ✓ packages/display/src/MovieClip/usecase/MovieClipAdvanceFrameUseCase.test.ts (3 tests) 2ms - ✓ packages/filters/src/BevelFilter/usecase/BevelFilterGetBoundsUseCase.test.ts (3 tests) 4ms - ✓ packages/geom/src/Rectangle/service/RectangleInflateService.test.ts (2 tests) 3ms - ✓ packages/webgl/src/FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase.test.ts (2 tests) 4ms - ✓ packages/webgl/src/Context/usecase/ContextGradientFillUseCase.test.ts (2 tests) 5ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetYUseCase.test.ts (2 tests) 2ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerRemoveChildrenUseCase.test.ts (1 test) 4ms - ✓ packages/display/src/Shape/usecase/ShapeGenerateClipQueueUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateGradientVertexArrayObjectUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/VertexArrayObject/service/VertexArrayObjectCreateFillObjectService.test.ts (1 test) 1ms - ✓ packages/webgl/src/ColorBufferObject/usecase/ColorBufferObjectGetColorBufferObjectUseCase.test.ts (1 test) 1ms - ✓ packages/webgl/src/Context/service/ContextUpdateAllTransferBoundsService.test.ts (1 test) 3ms - ✓ packages/display/src/MovieClip/usecase/MovieClipNextFrameUseCase.test.ts (2 tests) 4ms - ✓ packages/geom/src/Point/service/PointCopyFromService.test.ts (4 tests) 2ms - ✓ packages/webgl/src/Context/usecase/ContextBitmapStrokeUseCase.test.ts (2 tests) 3ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetRotationUseCase.test.ts (4 tests) 2ms - ✓ packages/cache/src/CacheStore/service/CacheStoreDestroyService.test.ts (2 tests) 2ms - ✓ packages/filters/src/GradientBevelFilter.test.ts (1 test) 3ms - ✓ packages/core/src/Player/service/PlayerKeyUpEventService.test.ts (2 tests) 5ms - ✓ packages/media/src/Sound/service/SoundEndedEventService.test.ts (2 tests) 2ms - ✓ packages/ui/src/Job/usecase/JobBootUseCase.test.ts (1 test) 4ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetAlphaUseCase.test.ts (4 tests) 2ms - ✓ packages/display/src/Loader/service/LoaderBuildService.test.ts (1 test) 2ms - ✓ packages/display/src/Sprite/service/SpriteStartDragService.test.ts (1 test) 4ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetXUseCase.test.ts (2 tests) 2ms - ✓ packages/text/src/TextParser/service/TextParserAdjustmentHeightService.test.ts (2 tests) 2ms - ✓ packages/webgl/src/BezierConverter/usecase/BezierConverterCubicToQuadUseCase.test.ts (1 test) 2ms - ✓ packages/filters/src/ColorMatrixFilter.test.ts (2 tests) 1ms - ✓ packages/webgl/src/Context/usecase/ContextBitmapFillUseCase.test.ts (2 tests) 4ms - ✓ packages/filters/src/DisplacementMapFilter/service/DisplacementMapFilterToNumberArrayService.test.ts (1 test) 3ms - ✓ packages/events/src/EventDispatcher/service/EventDispatcherWillTriggerService.test.ts (2 tests) 3ms - ✓ packages/filters/src/GradientGlowFilter.test.ts (1 test) 10ms - ✓ packages/events/src/PointerEvent.test.ts (6 tests) 3ms - ✓ packages/media/src/Video/usecase/VideoPlayEventUseCase.test.ts (1 test) 2ms - ✓ packages/geom/src/Matrix/service/MatrixCopyFromService.test.ts (1 test) 2ms - ✓ packages/renderer/src/Command/service/CommandResizeService.test.ts (1 test) 1ms - ✓ packages/core/src/Canvas/usecase/CanvasPointerUpEventUseCase.test.ts (1 test) 3ms - ✓ packages/geom/src/Matrix/service/MatrixSetToService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectBaseBuildService.test.ts (1 test) 4ms - ✓ packages/filters/src/ConvolutionFilter/service/ConvolutionFilterToNumberArrayService.test.ts (1 test) 4ms - ✓ packages/display/src/Loader/service/LoaderProgressEventService.test.ts (1 test) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetFiltersUseCase.test.ts (3 tests) 2ms - ✓ packages/core/src/Canvas/usecase/CanvasPointerLeaveEventUseCase.test.ts (1 test) 1ms - ✓ packages/webgl/src/Mask/service/MaskUnionMaskService.test.ts (1 test) 2ms - ✓ packages/media/src/SoundMixer/service/SoundMixerUpdateVolumeService.test.ts (1 test) 5ms - ✓ packages/events/src/EventDispatcher/service/EventDispatcherRemoveAllEventListenerService.test.ts (2 tests) 4ms - ✓ packages/core/src/Player/usecase/PlayerPlayUseCase.test.ts (1 test) 4ms - ✓ packages/filters/src/DropShadowFilter/service/DropShadowFilterToNumberArrayService.test.ts (1 test) 5ms - ✓ packages/webgl/src/Mask/service/MaskEndMaskService.test.ts (1 test) 3ms - ✓ packages/webgl/src/PathCommand/usecase/PathCommandMoveToUseCase.test.ts (1 test) 3ms - ✓ packages/filters/src/BlurFilter/usecase/BlurFilterGetBoundsUseCase.test.ts (3 tests) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetYUseCase.test.ts (3 tests) 3ms - ✓ packages/webgl/src/Context/service/ContextSetTransformService.test.ts (1 test) 3ms - ✓ packages/geom/src/Rectangle/service/RectangleContainsRectService.test.ts (2 tests) 1ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetBlendModeUseCase.test.ts (3 tests) 1ms - ✓ packages/filters/src/GradientBevelFilter/service/GradientBevelFilterToArrayService.test.ts (1 test) 2ms - ✓ packages/display/src/Stage/service/StageExecuteFrameActionsService.test.ts (1 test) 2ms - ✓ packages/geom/src/Rectangle/service/RectangleInflatePointService.test.ts (2 tests) 2ms - ✓ packages/ui/src/Easing/service/EasingOutExpoService.test.ts (1 test) 3ms - ✓ packages/renderer/src/DisplayObject/service/DisplayObjectGetBlendModeService.test.ts (1 test) 1ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectGetXUseCase.test.ts (3 tests) 1ms - ✓ packages/core/src/Player/service/PlayerPointerMoveEventService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectApplyChangesService.test.ts (2 tests) 3ms - ✓ packages/filters/src/DropShadowFilter/service/DropShadowFilterToArrayService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingOutQuadService.test.ts (1 test) 1ms - ✓ packages/media/src/Sound/service/SoundProgressEventService.test.ts (1 test) 2ms - ✓ packages/display/src/MovieClip/service/MovieClipSetSoundsService.test.ts (2 tests) 2ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetBlendModeUseCase.test.ts (2 tests) 1ms - ✓ packages/webgl/src/Shader/ShaderManager/service/ShaderManagerInitializeUniformService.test.ts (1 test) 6ms - ✓ packages/filters/src/DisplacementMapFilter/service/DisplacementMapFilterToArrayService.test.ts (1 test) 3ms - ✓ packages/geom/src/Rectangle/service/RectangleIntersectsService.test.ts (3 tests) 3ms - ✓ packages/events/src/EventDispatcher/service/EventDispatcherHasEventListenerService.test.ts (2 tests) 3ms - ✓ packages/core/src/Player/service/PlayerKeyDownEventService.test.ts (2 tests) 3ms - ✓ packages/text/src/TextFormat/service/TextFormatGenerateFontStyleService.test.ts (4 tests) 10ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchRemovedToStageEventService.test.ts (1 test) 3ms - ✓ packages/webgl/src/Blend/service/BlendEraseService.test.ts (1 test) 1ms - ✓ packages/geom/src/Rectangle/service/RectangleSetToService.test.ts (1 test) 1ms - ✓ packages/filters/src/ColorMatrixFilter/service/ColorMatrixFilterToNumberArrayService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Blend/service/BlendScreenService.test.ts (1 test) 3ms - ✓ packages/cache/src/CacheStore/service/CacheStoreGenerateKeysService.test.ts (2 tests) 1ms - ✓ packages/display/src/Graphics/service/GraphicsCalcFillBoundsService.test.ts (1 test) 1ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerPrepareUseCase.test.ts (1 test) 2ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerAdvanceFrameUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectRemoveService.test.ts (1 test) 1ms - ✓ packages/filters/src/BevelFilter/service/BevelFilterToArrayService.test.ts (1 test) 4ms - ✓ packages/webgl/src/PathCommand/usecase/PathCommandLineToUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectGetPlaceObjectService.test.ts (1 test) 1ms - ✓ packages/webgl/src/ColorBufferObject/service/ColorBufferObjectCreateService.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchAddedEventService.test.ts (1 test) 3ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind01UseCase.test.ts (1 test) 3ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerCreateAtlasTextureUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/MovieClip/service/MovieClipGetFrameForLabelService.test.ts (2 tests) 3ms - ✓ packages/filters/src/GradientGlowFilter/service/GradientGlowFilterToArrayService.test.ts (1 test) 1ms - ✓ packages/webgl/src/ColorBufferObject/usecase/ColorBufferObjectAcquireObjectUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/AtlasManager/service/AtlasManagerRemoveNodeService.test.ts (1 test) 3ms - ✓ packages/media/src/Video/service/VideoApplyChangesService.test.ts (1 test) 4ms - ✓ packages/text/src/TextFormat/service/TextFormatHtmlTextGenerateStyleService.test.ts (3 tests) 4ms - ✓ packages/filters/src/GradientGlowFilter/usecase/GradientGlowFilterGetBoundsUseCase.test.ts (1 test) 1ms - ✓ packages/text/src/TextFormat/service/TextFormatGetWidthMarginService.test.ts (4 tests) 2ms - ✓ packages/webgl/src/PathCommand/service/PathCommandPushCurrentPathToVerticesService.test.ts (1 test) 3ms - ✓ packages/core/src/Canvas/usecase/CanvasRegisterEventUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/MovieClip/usecase/MovieClipPrepareSoundUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectCalcBoundsMatrixService.test.ts (2 tests) 4ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase.test.ts (1 test) 3ms - ✓ packages/text/src/TextFormat/service/TextFormatSetDefaultService.test.ts (1 test) 1ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind02UseCase.test.ts (1 test) 1ms - ✓ packages/core/src/Player/usecase/PlayerRegisterEventUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/Context/usecase/ContextStrokeUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/MovieClip/service/MovieClipBuildSoundsService.test.ts (1 test) 1ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerCreateFromPixelsUseCase.test.ts (1 test) 2ms - ✓ packages/filters/src/DropShadowFilter.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInOutQuadService.test.ts (1 test) 3ms - ✓ packages/geom/src/Point/service/PointSubtractService.test.ts (2 tests) 3ms - ✓ packages/display/src/MovieClip/usecase/MovieClipGotoAndStopUseCase.test.ts (1 test) 4ms - ✓ packages/webgl/src/FrameBufferManager/service/FrameBufferManagerCreateAttachmentObjectService.test.ts (1 test) 1ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchAddedToStageEventService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Blend/usecase/BlnedClearArraysInstancedUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/DisplayObject/service/DisplayObjectDispatchRemovedEventService.test.ts (1 test) 2ms - ✓ packages/filters/src/ConvolutionFilter.test.ts (1 test) 1ms - ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveTimerScheduledCacheService.test.ts (1 test) 1ms - ✓ packages/webgl/src/TextureManager/service/TextureManagerBindService.test.ts (1 test) 1ms - ✓ packages/display/src/DisplayObject/usecase/DisplayObjectSetFiltersUseCase.test.ts (1 test) 1ms - ✓ packages/text/src/TextArea/usecase/TextAreaRegisterEventUseCase.test.ts (1 test) 3ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind012UseCase.test.ts (1 test) 4ms - ✓ packages/display/src/MovieClip/service/MovieClipSetActionService.test.ts (2 tests) 4ms - ✓ packages/ui/src/Easing/service/EasingInBackService.test.ts (1 test) 2ms - ✓ packages/events/src/FocusEvent.test.ts (2 tests) 3ms - ✓ packages/webgl/src/Mesh/service/MeshGenerateCalculateSquareCapService.test.ts (1 test) 1ms - ✓ packages/filters/src/ColorMatrixFilter/service/ColorMatrixFilterToArrayService.test.ts (1 test) 3ms - ✓ packages/filters/src/BlurFilter/service/BlurFilterToArrayService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Mesh/usecase/MeshApproximateOffsetQuadraticUseCase.test.ts (1 test) 1ms - ✓ packages/filters/src/GlowFilter/service/GlowFilterToArrayService.test.ts (1 test) 3ms - ✓ packages/webgl/src/StencilBufferObject/usecase/StencilBufferObjectGetStencilBufferObjectUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerBind0UseCase.test.ts (1 test) 1ms - ✓ packages/display/src/MovieClip/service/MovieClipCurrentLabelsService.test.ts (2 tests) 3ms - ✓ packages/ui/src/Job/service/JobStopService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Mesh/service/MeshGetQuadraticBezierPointService.test.ts (1 test) 3ms - ✓ packages/filters/src/GlowFilter.test.ts (1 test) 2ms - ✓ packages/media/src/Video/usecase/VideoRegisterEventUseCase.test.ts (1 test) 3ms - ✓ packages/display/src/MovieClip/service/MovieClipDispatchFrameLabelEventService.test.ts (1 test) 1ms - ✓ packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateClipQueueUseCase.test.ts (1 test) 1ms - ✓ packages/events/src/EventPhase.test.ts (3 tests) 2ms - ✓ packages/ui/src/Job/usecase/JobStartUseCase.test.ts (1 test) 1ms - ✓ packages/filters/src/GradientBevelFilter/service/GradientBevelFilterCanApplyFilterService.test.ts (1 test) 3ms - ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveTimerService.test.ts (1 test) 2ms - ✓ packages/webgl/src/PathCommand/usecase/PathCommandQuadraticCurveToUseCase.test.ts (1 test) 4ms - ✓ packages/webgl/src/PathCommand/usecase/PathCommandClosePathUseCase.test.ts (1 test) 2ms - ✓ packages/filters/src/GlowFilter/service/GlowFilterToNumberArrayService.test.ts (1 test) 3ms - ✓ packages/geom/src/Rectangle/service/RectangleIsEmptyService.test.ts (3 tests) 3ms - ✓ packages/display/src/FrameLabel.test.ts (1 test) 2ms - ✓ packages/cache/src/CacheStore/service/CacheStoreSetService.test.ts (1 test) 2ms - ✓ packages/webgl/src/AtlasManager/usecase/AtlasManagerResetUseCase.test.ts (1 test) 3ms - ✓ packages/filters/src/GlowFilter/usecase/GlowFilterGetBoundsUseCase.test.ts (1 test) 1ms - ✓ packages/display/src/MovieClip/usecase/MovieClipGotoAndPlayUseCase.test.ts (1 test) 1ms - ✓ packages/filters/src/DropShadowFilter/service/DropShadowFilterCanApplyFilterService.test.ts (1 test) 2ms - ✓ packages/core/src/Player/service/PlayerPointerUpEventService.test.ts (1 test) 1ms - ✓ packages/geom/src/Rectangle/service/RectangleOffsetService.test.ts (1 test) 1ms - ✓ packages/filters/src/GlowFilter/service/GlowFilterCanApplyFilterService.test.ts (1 test) 1ms - ✓ packages/webgl/src/StencilBufferObject/usecase/StencilBufferObjectAcquireObjectUseCase.test.ts (1 test) 3ms - ✓ packages/filters/src/DisplacementMapFilter/service/DisplacementMapFilterCanApplyFilterService.test.ts (2 tests) 4ms - ✓ packages/display/src/Graphics/service/GraphicsCalcLineBoundsService.test.ts (1 test) 1ms - ✓ packages/geom/src/Matrix/service/MatrixCloneService.test.ts (1 test) 3ms - ✓ packages/filters/src/BevelFilter/service/BevelFilterCanApplyFilterService.test.ts (1 test) 4ms - ✓ packages/media/src/SoundMixer/service/SoundMixerStopAllService.test.ts (1 test) 3ms - ✓ packages/display/src/Sprite/service/SpriteStopDragService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Shader/ShaderManager/service/ShaderManagerCreateProgramService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Context/service/ContextUpdateTransferBoundsService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Mesh/service/MeshLerpService.test.ts (1 test) 3ms - ✓ packages/webgl/src/Mesh/usecase/MeshCalculateLineRectangleUseCase.test.ts (1 test) 3ms - ✓ packages/webgl/src/Mesh/service/MeshGetQuadraticBezierTangentService.test.ts (1 test) 3ms - ✓ packages/filters/src/BlurFilter/service/BlurFilterToNumberArrayService.test.ts (1 test) 1ms - ✓ packages/core/src/Canvas/usecase/CanvasWheelEventUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/FrameBufferManager/service/FrameBufferManagerUnBindAttachmentObjectService.test.ts (1 test) 3ms - ✓ packages/ui/src/Easing/service/EasingOutCubicService.test.ts (1 test) 1ms - ✓ packages/ui/src/Job/service/JobUpdateFrameService.test.ts (2 tests) 3ms - ✓ packages/webgl/src/TextureManager/service/TextureManagerCreateTextureObjectService.test.ts (1 test) 1ms - ✓ packages/display/src/MovieClip/usecase/MovieClipPrepareActionUseCase.test.ts (1 test) 3ms - ✓ packages/webgl/src/StencilBufferObject/service/StencilBufferObjectCreateService.test.ts (1 test) 1ms - ✓ packages/display/src/Shape/service/ShapeGetRawBoundsService.test.ts (1 test) 1ms - ✓ packages/webgl/src/PathCommand/service/PathCommandBeginPathService.test.ts (1 test) 3ms - ✓ packages/display/src/Video/service/VideoGetRawBoundsService.test.ts (1 test) 1ms - ✓ packages/texture-packer/src/Node/service/NodeDisposeService.test.ts (1 test) 2ms - ✓ packages/geom/src/Rectangle/service/RectangleSetEmptyService.test.ts (1 test) 3ms - ✓ packages/webgl/src/Mask/service/MaskSetMaskBoundsService.test.ts (1 test) 2ms - ✓ packages/filters/src/GradientBevelFilter/usecase/GradientBevelFilterGetBoundsUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/Blend/service/BlendAlphaService.test.ts (1 test) 3ms - ✓ packages/display/src/MovieClip/service/MovieClipAddFrameLabelService.test.ts (1 test) 3ms - ✓ packages/geom/src/Rectangle/service/RectangleOffsetPointService.test.ts (1 test) 1ms - ✓ packages/core/src/Player/service/PlayerStopService.test.ts (1 test) 1ms - ✓ packages/geom/src/Point.test.ts (2 tests) 3ms - ✓ packages/events/src/JobEvent.test.ts (2 tests) 1ms - ✓ packages/display/src/MovieClip/service/MovieClipAddActionsService.test.ts (1 test) 2ms - ✓ packages/geom/src/Rectangle/service/RectangleEqualsService.test.ts (1 test) 3ms - ✓ packages/geom/src/Rectangle/service/RectangleCloneService.test.ts (1 test) 3ms - ✓ packages/display/src/Graphics/service/GraphicsMargePathService.test.ts (1 test) 1ms - ✓ packages/filters/src/BlurFilter/service/BlurFilterCanApplyFilterService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Context/usecase/ContextClearRectUseCase.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingOutSineService.test.ts (1 test) 3ms - ✓ packages/webgl/src/TextureManager/usecase/TextureManagerGetTextureUseCase.test.ts (1 test) 2ms - ✓ packages/display/src/MovieClip/service/MovieClipAddLabelsService.test.ts (1 test) 2ms - ✓ packages/geom/src/ColorTransform.test.ts (1 test) 8ms - ✓ packages/webgl/src/Context/service/ContextFillBackgroundColorService.test.ts (1 test) 1ms - ✓ packages/webgl/src/VertexArrayObject/service/VertexArrayObjectReleaseVertexArrayObjectService.test.ts (1 test) 3ms - ✓ packages/cache/src/CacheStore/service/CacheStoreResetService.test.ts (1 test) 3ms - ✓ packages/webgl/src/VertexArrayObject/service/VertexArrayObjectBindService.test.ts (1 test) 3ms - ✓ packages/webgl/src/Blend/service/BlendSourceInService.test.ts (1 test) 3ms - ✓ packages/webgl/src/Blend/usecase/BlendBootUseCase.test.ts (1 test) 2ms - ✓ packages/webgl/src/TextureManager/service/TextureManagerInitializeBindService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInOutBounceService.test.ts (1 test) 1ms - ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveService.test.ts (1 test) 6ms - ✓ packages/text/src/TextField/service/TextFieldApplyChangesService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Blend/service/BlendOneZeroService.test.ts (1 test) 2ms - ✓ packages/cache/src/CacheStore/service/CacheStoreRemoveByIdService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInOutQuartService.test.ts (1 test) 2ms - ✓ packages/webgl/src/PathCommand/service/PathCommandEqualsToLastPointService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInQuartService.test.ts (1 test) 2ms - ✓ packages/events/src/KeyboardEvent.test.ts (2 tests) 32ms - ✓ packages/ui/src/Easing/service/EasingOutBounceService.test.ts (1 test) 2ms - ✓ packages/cache/src/CacheUtil.test.ts (1 test) 1ms - ✓ packages/webgl/src/ColorBufferObject/usecase/ColorBufferObjectReleaseColorBufferObjectUseCase.test.ts (1 test) 1ms - ✓ packages/webgl/src/Context/service/ContextUseGridService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Mesh/service/MeshCalculateNormalVectorService.test.ts (1 test) 2ms - ✓ packages/core/src/Player/usecase/PlayerResizeRegisterUseCase.test.ts (1 test) 1ms - ✓ packages/webgl/src/Shader/Variants/Gradient/service/VariantsGradientCreateCollectionKeyService.test.ts (1 test) 5ms - ✓ packages/webgl/src/Blend/service/BlendAddService.test.ts (1 test) 2ms - ✓ packages/ui/src/Easing/service/EasingInCircService.test.ts (1 test) 2ms - ✓ packages/webgl/src/Blend/service/BlendResetService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingOutElasticService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInBounceService.test.ts (1 test) 2ms - ✓ packages/ui/src/Easing/service/EasingInOutExpoService.test.ts (1 test) 8ms - ✓ packages/ui/src/Easing/service/EasingOutCircService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Mesh/service/MeshFindOverlappingPathsService.test.ts (1 test) 2ms - ✓ packages/ui/src/Easing/service/EasingInElasticService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInExpoService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInQuadService.test.ts (1 test) 3ms - ✓ packages/ui/src/Easing/service/EasingInOutCubicService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInQuintService.test.ts (1 test) 3ms - ✓ packages/ui/src/Easing/service/EasingOutBackService.test.ts (1 test) 2ms - ✓ packages/events/src/HTTPStatusEvent.test.ts (1 test) 3ms - ✓ packages/renderer/src/TextField/service/TextFieldGenerateFontStyleService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingInSineService.test.ts (1 test) 2ms - ✓ packages/ui/src/Easing/service/EasingLinearService.test.ts (1 test) 3ms - ✓ packages/ui/src/Easing/service/EasingInOutSineService.test.ts (1 test) 1ms - ✓ packages/ui/src/Easing/service/EasingOutQuartService.test.ts (1 test) 1ms - ✓ packages/events/src/WheelEvent.test.ts (1 test) 1ms - ✓ packages/webgl/src/Context/service/ContextEndNodeRenderingService.test.ts (1 test) 1ms - ✓ packages/webgl/src/Context/service/ContextBeginNodeRenderingService.test.ts (1 test) 1ms - -⎯⎯⎯⎯⎯⎯ Failed Tests 15 ⎯⎯⎯⎯⎯⎯⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts > ContextApplyFilterUseCase.js method test > test case - should execute filter application -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'currentAttachmentObject')" - - ❯ packages/webgl/src/Context/usecase/ContextApplyFilterUseCase.test.ts:48:16 -  46|  params -  47|  ); -  48|  }).not.toThrow(); -  |  ^ -  49|  }); -  50| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts > ContextClipUseCase.js method test > test case - should execute clip operation -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'currentAttachmentObject')" - - ❯ packages/webgl/src/Context/usecase/ContextClipUseCase.test.ts:14:16 -  12|  expect(() => { -  13|  execute(); -  14|  }).not.toThrow(); -  |  ^ -  15|  }); -  16| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts > ContextDrawElementUseCase.js method test > test case - should execute draw element with OffscreenCanvas -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'createTexture')" - - ❯ packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts:26:16 -  24|  expect(() => { -  25|  execute(mockNode, mockCanvas); -  26|  }).not.toThrow(); -  |  ^ -  27|  }); -  28|  - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts > ContextDrawElementUseCase.js method test > test case - should execute draw element with ImageBitmap -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'createTexture')" - - ❯ packages/webgl/src/Context/usecase/ContextDrawElementUseCase.test.ts:44:16 -  42|  expect(() => { -  43|  execute(mockNode, mockImageBitmap); -  44|  }).not.toThrow(); -  |  ^ -  45|  }); -  46| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts > ContextDrawFillUseCase.js method test > test case - should execute draw fill -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'createVertexArray')" - - ❯ packages/webgl/src/Context/usecase/ContextDrawFillUseCase.test.ts:14:16 -  12|  expect(() => { -  13|  execute(); -  14|  }).not.toThrow(); -  |  ^ -  15|  }); -  16| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts > ContextDrawPixelsUseCase.js method test > test case - should execute draw pixels -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'createTexture')" - - ❯ packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts:26:16 -  24|  expect(() => { -  25|  execute(mockNode, pixels); -  26|  }).not.toThrow(); -  |  ^ -  27|  }); -  28|  - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts > ContextDrawPixelsUseCase.js method test > test case - should handle empty pixels -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'createTexture')" - - ❯ packages/webgl/src/Context/usecase/ContextDrawPixelsUseCase.test.ts:44:16 -  42|  expect(() => { -  43|  execute(mockNode, pixels); -  44|  }).not.toThrow(); -  |  ^ -  45|  }); -  46| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts > ContextLinearGradientFillUseCase.js method test > test case - should execute linear gradient fill shader -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'disable')" - - ❯ packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts:24:16 -  22|  expect(() => { -  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  24|  }).not.toThrow(); -  |  ^ -  25|  }); -  26|  - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts > ContextLinearGradientFillUseCase.js method test > test case - should execute with grid data -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'disable')" - - ❯ packages/webgl/src/Context/usecase/ContextLinearGradientFillUseCase.test.ts:40:16 -  38|  expect(() => { -  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  40|  }).not.toThrow(); -  |  ^ -  41|  }); -  42| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts > ContextNormalFillUseCase.js method test > test case - should execute normal fill shader -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" - - ❯ packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts:24:16 -  22|  expect(() => { -  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  24|  }).not.toThrow(); -  |  ^ -  25|  }); -  26|  - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts > ContextNormalFillUseCase.js method test > test case - should execute with grid data -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" - - ❯ packages/webgl/src/Context/usecase/ContextNormalFillUseCase.test.ts:40:16 -  38|  expect(() => { -  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  40|  }).not.toThrow(); -  |  ^ -  41|  }); -  42| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts > ContextPatternBitmapFillUseCase.js method test > test case - should execute pattern bitmap fill shader -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" - - ❯ packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts:24:16 -  22|  expect(() => { -  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  24|  }).not.toThrow(); -  |  ^ -  25|  }); -  26|  - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts > ContextPatternBitmapFillUseCase.js method test > test case - should execute with grid data -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'stencilFunc')" - - ❯ packages/webgl/src/Context/usecase/ContextPatternBitmapFillUseCase.test.ts:40:16 -  38|  expect(() => { -  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  40|  }).not.toThrow(); -  |  ^ -  41|  }); -  42| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts > ContextRadialGradientFillUseCase.js method test > test case - should execute radial gradient fill shader -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'disable')" - - ❯ packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts:24:16 -  22|  expect(() => { -  23|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  24|  }).not.toThrow(); -  |  ^ -  25|  }); -  26|  - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/15]⎯ - - FAIL  packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts > ContextRadialGradientFillUseCase.js method test > test case - should execute with grid data -AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot read properties of …' was thrown - -- Expected: -undefined - -+ Received: -"TypeError: Cannot read properties of undefined (reading 'disable')" - - ❯ packages/webgl/src/Context/usecase/ContextRadialGradientFillUseCase.test.ts:40:16 -  38|  expect(() => { -  39|  execute(mockVertexArrayObject, offset, indexCount, gridDat… -  40|  }).not.toThrow(); -  |  ^ -  41|  }); -  42| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/15]⎯ - - - Test Files  9 failed | 498 passed (507) - Tests  15 failed | 1583 passed (1598) - Start at  17:10:03 - Duration  53.81s (transform 19.95s, setup 14.49s, collect 109.99s, tests 2.15s, environment 182.45s, prepare 5.98s) - diff --git a/test.setup.ts b/test.setup.ts index 0eaf85fb..d988aa18 100644 --- a/test.setup.ts +++ b/test.setup.ts @@ -13,7 +13,13 @@ class MockOffscreenCanvas { // CanvasRenderingContext2D などをモック return { // 必要に応じてメソッドを追加 - "fillRect": (x: number, y: number, w: number, h: number) => {} + "fillRect": (x: number, y: number, w: number, h: number) => {}, + "beginPath": () => {}, + "moveTo": (x: number, y: number) => {}, + "lineTo": (x: number, y: number) => {}, + "quadraticCurveTo": (cpx: number, cpy: number, x: number, y: number) => {}, + "closePath": () => {}, + "isPointInPath": (x: number, y: number) => false }; } } From 283fcc2ae2a12c806ab30f5bdfd59723be3365a0 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 31 Oct 2025 22:01:29 +0900 Subject: [PATCH 25/45] #213 update github/actions --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/integration.yml | 8 ++++---- .github/workflows/lint.yml | 8 ++++---- .github/workflows/publish.yml | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a2a09b76..5ba010d8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 20d36375..c61026be 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -17,8 +17,8 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 - run: npm install - run: npm run test @@ -28,7 +28,7 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 - run: npm install - run: npm run test diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0740833e..b97d39af 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -17,8 +17,8 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 - run: npm install - run: npm run lint @@ -28,7 +28,7 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 - run: npm install - run: npm run lint \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 98e506e0..37e85efa 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,8 +12,8 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 with: node-version: "22.x" registry-url: "https://registry.npmjs.org" From fad750750eecc4b15c23326f2da637faac17013d Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 31 Oct 2025 23:23:38 +0900 Subject: [PATCH 26/45] #213 update package-lock.json --- package-lock.json | 90 +++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec36711f..49b092ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1808,16 +1808,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.5.tgz", - "integrity": "sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.6.tgz", + "integrity": "sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.5", - "@vitest/utils": "4.0.5", + "@vitest/spy": "4.0.6", + "@vitest/utils": "4.0.6", "chai": "^6.0.1", "tinyrainbow": "^3.0.3" }, @@ -1826,13 +1826,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.5.tgz", - "integrity": "sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.6.tgz", + "integrity": "sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.5", + "@vitest/spy": "4.0.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.19" }, @@ -1863,9 +1863,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.5.tgz", - "integrity": "sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.6.tgz", + "integrity": "sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==", "dev": true, "license": "MIT", "dependencies": { @@ -1876,13 +1876,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.5.tgz", - "integrity": "sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.6.tgz", + "integrity": "sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.5", + "@vitest/utils": "4.0.6", "pathe": "^2.0.3" }, "funding": { @@ -1890,13 +1890,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.5.tgz", - "integrity": "sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.6.tgz", + "integrity": "sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.5", + "@vitest/pretty-format": "4.0.6", "magic-string": "^0.30.19", "pathe": "^2.0.3" }, @@ -1905,9 +1905,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.5.tgz", - "integrity": "sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.6.tgz", + "integrity": "sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==", "dev": true, "license": "MIT", "funding": { @@ -1915,13 +1915,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.5.tgz", - "integrity": "sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.6.tgz", + "integrity": "sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.5", + "@vitest/pretty-format": "4.0.6", "tinyrainbow": "^3.0.3" }, "funding": { @@ -1929,9 +1929,9 @@ } }, "node_modules/@vitest/web-worker": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-4.0.5.tgz", - "integrity": "sha512-oyqVOUbHdiLOrUKvpPiIxCLZMZsDe30E3qqv2GbyogwLAEH7ofCQ2prujGyQyvlDEOqxtnUFSHVnSP1qczvGCg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-4.0.6.tgz", + "integrity": "sha512-MR746qUSD5Sz4nmgbJBfJnhvPBU+TPRIWGIK4pg6AZEo6F5jlq+Js8I3/NhIqW9QCmWXqk+76vXSQhRB/amTYg==", "dev": true, "license": "MIT", "dependencies": { @@ -1941,7 +1941,7 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.0.5" + "vitest": "4.0.6" } }, "node_modules/acorn": { @@ -4067,20 +4067,20 @@ } }, "node_modules/vitest": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.5.tgz", - "integrity": "sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.6.tgz", + "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/expect": "4.0.5", - "@vitest/mocker": "4.0.5", - "@vitest/pretty-format": "4.0.5", - "@vitest/runner": "4.0.5", - "@vitest/snapshot": "4.0.5", - "@vitest/spy": "4.0.5", - "@vitest/utils": "4.0.5", + "@vitest/expect": "4.0.6", + "@vitest/mocker": "4.0.6", + "@vitest/pretty-format": "4.0.6", + "@vitest/runner": "4.0.6", + "@vitest/snapshot": "4.0.6", + "@vitest/spy": "4.0.6", + "@vitest/utils": "4.0.6", "debug": "^4.4.3", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", @@ -4108,10 +4108,10 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.5", - "@vitest/browser-preview": "4.0.5", - "@vitest/browser-webdriverio": "4.0.5", - "@vitest/ui": "4.0.5", + "@vitest/browser-playwright": "4.0.6", + "@vitest/browser-preview": "4.0.6", + "@vitest/browser-webdriverio": "4.0.6", + "@vitest/ui": "4.0.6", "happy-dom": "*", "jsdom": "*" }, From b003a9a693ac75270b4003c45ee1e18d2599464a Mon Sep 17 00:00:00 2001 From: ienaga Date: Sat, 1 Nov 2025 07:14:47 +0900 Subject: [PATCH 27/45] #213 update packages --- package-lock.json | 56 +++++++++++++---------------------------------- package.json | 8 +++---- 2 files changed, 19 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49b092ed..113007c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.38.0", + "@eslint/js": "^9.39.0", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", @@ -25,8 +25,8 @@ "@types/node": "^24.9.2", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", - "@vitest/web-worker": "^4.0.5", - "eslint": "^9.38.0", + "@vitest/web-worker": "^4.0.6", + "eslint": "^9.39.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", "jsdom": "^27.1.0", @@ -34,7 +34,7 @@ "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.1.12", - "vitest": "^4.0.5", + "vitest": "^4.0.6", "vitest-webgl-canvas-mock": "^1.1.0" }, "funding": { @@ -736,7 +736,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "node_modules/@eslint/core": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", @@ -749,19 +749,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", @@ -800,9 +787,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", - "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "version": "9.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.0.tgz", + "integrity": "sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==", "dev": true, "license": "MIT", "engines": { @@ -836,19 +823,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2403,9 +2377,9 @@ } }, "node_modules/eslint": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", - "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "version": "9.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.0.tgz", + "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", "dev": true, "license": "MIT", "peer": true, @@ -2413,11 +2387,11 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.1", - "@eslint/core": "^0.16.0", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.38.0", - "@eslint/plugin-kit": "^0.4.0", + "@eslint/js": "9.39.0", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", diff --git a/package.json b/package.json index 1aef8729..6735419a 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.38.0", + "@eslint/js": "^9.39.0", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^0.4.4", @@ -54,8 +54,8 @@ "@types/node": "^24.9.2", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", - "@vitest/web-worker": "^4.0.5", - "eslint": "^9.38.0", + "@vitest/web-worker": "^4.0.6", + "eslint": "^9.39.0", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.4.0", "jsdom": "^27.1.0", @@ -63,7 +63,7 @@ "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.1.12", - "vitest": "^4.0.5", + "vitest": "^4.0.6", "vitest-webgl-canvas-mock": "^1.1.0" }, "peerDependencies": { From 846becc44b4a1fd5fc6883a54677c731f444e505 Mon Sep 17 00:00:00 2001 From: ienaga Date: Sat, 1 Nov 2025 07:30:08 +0900 Subject: [PATCH 28/45] #213 update github/actions --- .github/workflows/codeql-analysis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 5ba010d8..b20bf705 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL @@ -71,3 +71,5 @@ jobs: - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{ matrix.language }}" From 9adbfa4dc8c238b0bc7a4bc5b11f4a6f34dee5d5 Mon Sep 17 00:00:00 2001 From: ienaga Date: Sat, 1 Nov 2025 07:37:10 +0900 Subject: [PATCH 29/45] #213 update github/actions --- .github/workflows/codeql-analysis.yml | 90 +++++++++++++++++---------- 1 file changed, 58 insertions(+), 32 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b20bf705..5097e684 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,67 +9,93 @@ # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # -name: "CodeQL" +name: "CodeQL Advanced" on: push: - branches: [ "main", "develop" ] + branches: [ "develop", "main" ] pull_request: - # The branches below must be a subset of the branches above - branches: [ "main", "develop" ] + branches: [ "develop", "main" ] schedule: - - cron: '44 22 * * 5' + - cron: '35 17 * * 6' jobs: analyze: - name: Analyze - runs-on: ubuntu-latest + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories actions: read contents: read - pull-requests: write - security-events: write strategy: fail-fast: false matrix: - language: [ 'javascript-typescript' ] - # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ] - # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both - # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both - # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support - + include: + - language: actions + build-mode: none + - language: javascript-typescript + build-mode: none + # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository uses: actions/checkout@v4 + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 + # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - name: Run manual build steps + if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 with: - category: "/language:${{ matrix.language }}" + category: "/language:${{matrix.language}}" From 6559f67dab9cfcbb03df1308262384187e74d2ae Mon Sep 17 00:00:00 2001 From: ienaga Date: Sat, 1 Nov 2025 07:38:44 +0900 Subject: [PATCH 30/45] #213 update github/actions --- .github/workflows/codeql-analysis.yml | 101 -------------------------- 1 file changed, 101 deletions(-) delete mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 5097e684..00000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,101 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL Advanced" - -on: - push: - branches: [ "develop", "main" ] - pull_request: - branches: [ "develop", "main" ] - schedule: - - cron: '35 17 * * 6' - -jobs: - analyze: - name: Analyze (${{ matrix.language }}) - # Runner size impacts CodeQL analysis time. To learn more, please see: - # - https://gh.io/recommended-hardware-resources-for-running-codeql - # - https://gh.io/supported-runners-and-hardware-resources - # - https://gh.io/using-larger-runners (GitHub.com only) - # Consider using larger runners or machines with greater resources for possible analysis time improvements. - runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} - permissions: - # required for all workflows - security-events: write - - # required to fetch internal or private CodeQL packs - packages: read - - # only required for workflows in private repositories - actions: read - contents: read - - strategy: - fail-fast: false - matrix: - include: - - language: actions - build-mode: none - - language: javascript-typescript - build-mode: none - # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' - # Use `c-cpp` to analyze code written in C, C++ or both - # Use 'java-kotlin' to analyze code written in Java, Kotlin or both - # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both - # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, - # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. - # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how - # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # Add any setup steps before running the `github/codeql-action/init` action. - # This includes steps like installing compilers or runtimes (`actions/setup-node` - # or others). This is typically only required for manual builds. - # - name: Setup runtime (example) - # uses: actions/setup-example@v1 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v4 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # ℹ️ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - name: Run manual build steps - if: matrix.build-mode == 'manual' - shell: bash - run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 - with: - category: "/language:${{matrix.language}}" From 2b33e29aa116c7f1fe72b6e94df73eea9aa0f39e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:48:01 +0000 Subject: [PATCH 31/45] Initial plan From 992475595f1a2751a175701d6d8e37b9cb9a8676 Mon Sep 17 00:00:00 2001 From: Toshiyuki Ienaga Date: Sat, 1 Nov 2025 07:50:30 +0900 Subject: [PATCH 32/45] Update packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts index e3c3c1ad..d05bfdd8 100644 --- a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts +++ b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts @@ -1,5 +1,5 @@ import { execute } from "./CaptureToCanvasUseCase"; -import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; +import { describe, expect, it, vi, beforeEach } from "vitest"; import type { DisplayObject } from "@next2d/display"; import { $cacheStore } from "@next2d/cache"; import { $player } from "../../Player"; From 796fe21f70daf99a3e84f9036d7beca8fc7ca960 Mon Sep 17 00:00:00 2001 From: Toshiyuki Ienaga Date: Sat, 1 Nov 2025 07:52:52 +0900 Subject: [PATCH 33/45] Update packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts index d05bfdd8..d82819ac 100644 --- a/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts +++ b/packages/core/src/Next2D/usecase/CaptureToCanvasUseCase.test.ts @@ -1,7 +1,6 @@ import { execute } from "./CaptureToCanvasUseCase"; import { describe, expect, it, vi, beforeEach } from "vitest"; import type { DisplayObject } from "@next2d/display"; -import { $cacheStore } from "@next2d/cache"; import { $player } from "../../Player"; vi.mock("@next2d/display", () => ({ From fee509be1612a6613e8a40b0b132e86bfc2ee158 Mon Sep 17 00:00:00 2001 From: Toshiyuki Ienaga Date: Sat, 1 Nov 2025 07:53:16 +0900 Subject: [PATCH 34/45] Update packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts b/packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts index 45e9546c..1346eb7e 100644 --- a/packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts +++ b/packages/core/src/Next2D/usecase/CreateRootMovieClipUseCase.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; +import { describe, expect, it, vi, beforeEach } from "vitest"; import { Sprite } from "@next2d/display"; vi.mock("@next2d/display", () => ({ From 91d6eb83d1cba5c464eafd951b3fca03d1f9e211 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:53:33 +0000 Subject: [PATCH 35/45] Initial plan From b435b44361d1085b79ac77a8ebdcf320c9481360 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:53:38 +0000 Subject: [PATCH 36/45] Initial plan From ce80eef12d9c5106eac441facf4d98fa6189c08c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:53:48 +0000 Subject: [PATCH 37/45] Initial plan From 55ffb0cf88039a533ee00c559ac1cf5995f19830 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:53:49 +0000 Subject: [PATCH 38/45] Initial plan From 39b0218f2fff7ef41bd820ddd8e4a5bd1c9da1c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:55:21 +0000 Subject: [PATCH 39/45] Fix gl.pixelStorei parameter: change true to 1 Co-authored-by: ienaga <4123454+ienaga@users.noreply.github.com> --- package-lock.json | 37 ++++++++--------------------------- packages/webgl/src/Context.ts | 2 +- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 113007c0..549ec714 100644 --- a/package-lock.json +++ b/package-lock.json @@ -188,7 +188,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -232,7 +231,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1497,7 +1495,6 @@ "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1555,7 +1552,6 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -1924,7 +1920,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2382,7 +2377,6 @@ "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3029,7 +3023,6 @@ "integrity": "sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@acemir/cssom": "^0.9.19", "@asamuzakjp/dom-selector": "^6.7.3", @@ -3526,7 +3519,6 @@ "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -3916,8 +3908,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -3938,7 +3929,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3970,7 +3960,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -4046,7 +4035,6 @@ "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.6", "@vitest/mocker": "4.0.6", @@ -4288,8 +4276,7 @@ "packages/cache": { "name": "@next2d/cache", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/core": { "name": "@next2d/core", @@ -4313,7 +4300,6 @@ "name": "@next2d/display", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/events": "file:../events", "@next2d/filters": "file:../filters", @@ -4328,26 +4314,22 @@ "packages/events": { "name": "@next2d/events", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/filters": { "name": "@next2d/filters", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/geom": { "name": "@next2d/geom", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/media": { "name": "@next2d/media", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/display": "file:../display", "@next2d/events": "file:../events", @@ -4358,14 +4340,12 @@ "packages/net": { "name": "@next2d/net", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/render-queue": { "name": "@next2d/render-queue", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/renderer": { "name": "@next2d/renderer", @@ -4395,8 +4375,7 @@ "packages/texture-packer": { "name": "@next2d/texture-packer", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/ui": { "name": "@next2d/ui", diff --git a/packages/webgl/src/Context.ts b/packages/webgl/src/Context.ts index 97e997f4..bc3399e9 100644 --- a/packages/webgl/src/Context.ts +++ b/packages/webgl/src/Context.ts @@ -304,7 +304,7 @@ export class Context }; // WebTextureの設定 - gl.pixelStorei(gl.UNPACK_ALIGNMENT, true); + gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); // FrameBufferManagerの初期起動 From ec302dc1bb251cd5b1a5d3420046bc3062afd23e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:59:41 +0000 Subject: [PATCH 40/45] Fix test that incorrectly captures void function return value Co-authored-by: ienaga <4123454+ienaga@users.noreply.github.com> --- package-lock.json | 37 ++++--------------- .../TextFieldKeyDownEventUseCase.test.ts | 7 ++-- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 113007c0..549ec714 100644 --- a/package-lock.json +++ b/package-lock.json @@ -188,7 +188,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -232,7 +231,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1497,7 +1495,6 @@ "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1555,7 +1552,6 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -1924,7 +1920,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2382,7 +2377,6 @@ "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3029,7 +3023,6 @@ "integrity": "sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@acemir/cssom": "^0.9.19", "@asamuzakjp/dom-selector": "^6.7.3", @@ -3526,7 +3519,6 @@ "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -3916,8 +3908,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -3938,7 +3929,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3970,7 +3960,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -4046,7 +4035,6 @@ "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.6", "@vitest/mocker": "4.0.6", @@ -4288,8 +4276,7 @@ "packages/cache": { "name": "@next2d/cache", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/core": { "name": "@next2d/core", @@ -4313,7 +4300,6 @@ "name": "@next2d/display", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/events": "file:../events", "@next2d/filters": "file:../filters", @@ -4328,26 +4314,22 @@ "packages/events": { "name": "@next2d/events", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/filters": { "name": "@next2d/filters", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/geom": { "name": "@next2d/geom", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/media": { "name": "@next2d/media", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/display": "file:../display", "@next2d/events": "file:../events", @@ -4358,14 +4340,12 @@ "packages/net": { "name": "@next2d/net", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/render-queue": { "name": "@next2d/render-queue", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/renderer": { "name": "@next2d/renderer", @@ -4395,8 +4375,7 @@ "packages/texture-packer": { "name": "@next2d/texture-packer", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/ui": { "name": "@next2d/ui", diff --git a/packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts index b0974355..f0a274e0 100644 --- a/packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts +++ b/packages/text/src/TextField/usecase/TextFieldKeyDownEventUseCase.test.ts @@ -177,15 +177,16 @@ describe("TextFieldKeyDownEventUseCase.js test", () => expect(typeof execute).toBe("function"); }); - it("execute test case15 - returns undefined", () => + it("execute test case15 - handles unmatched key without throwing", () => { const textField = new TextField(); textField.text = "Test"; textField.focusIndex = 2; const event = new KeyboardEvent("keydown", { key: "a" }); - const result = execute(textField, event); - expect(result).toBeUndefined(); + expect(() => { + execute(textField, event); + }).not.toThrow(); }); }); From 1a5025911a2e9531d538d1adb93ede322c71130d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:00:07 +0000 Subject: [PATCH 41/45] Fix test case6 to not capture return value from void function Co-authored-by: ienaga <4123454+ienaga@users.noreply.github.com> --- package-lock.json | 37 ++++--------------- .../TextFieldSelectedFocusMoveUseCase.test.ts | 8 ++-- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 113007c0..549ec714 100644 --- a/package-lock.json +++ b/package-lock.json @@ -188,7 +188,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -232,7 +231,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1497,7 +1495,6 @@ "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1555,7 +1552,6 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -1924,7 +1920,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2382,7 +2377,6 @@ "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3029,7 +3023,6 @@ "integrity": "sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@acemir/cssom": "^0.9.19", "@asamuzakjp/dom-selector": "^6.7.3", @@ -3526,7 +3519,6 @@ "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -3916,8 +3908,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -3938,7 +3929,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3970,7 +3960,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -4046,7 +4035,6 @@ "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.6", "@vitest/mocker": "4.0.6", @@ -4288,8 +4276,7 @@ "packages/cache": { "name": "@next2d/cache", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/core": { "name": "@next2d/core", @@ -4313,7 +4300,6 @@ "name": "@next2d/display", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/events": "file:../events", "@next2d/filters": "file:../filters", @@ -4328,26 +4314,22 @@ "packages/events": { "name": "@next2d/events", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/filters": { "name": "@next2d/filters", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/geom": { "name": "@next2d/geom", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/media": { "name": "@next2d/media", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/display": "file:../display", "@next2d/events": "file:../events", @@ -4358,14 +4340,12 @@ "packages/net": { "name": "@next2d/net", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/render-queue": { "name": "@next2d/render-queue", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/renderer": { "name": "@next2d/renderer", @@ -4395,8 +4375,7 @@ "packages/texture-packer": { "name": "@next2d/texture-packer", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/ui": { "name": "@next2d/ui", diff --git a/packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts index 6ce447cb..2e183530 100644 --- a/packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts +++ b/packages/text/src/TextField/usecase/TextFieldSelectedFocusMoveUseCase.test.ts @@ -48,15 +48,15 @@ describe("TextFieldSelectedFocusMoveUseCase.js test", () => expect(typeof execute).toBe("function"); }); - it("execute test case6 - returns undefined", () => + it("execute test case6 - handles normal selectIndex", () => { const textField = new TextField(); textField.text = "Test"; textField.selectIndex = 2; - const result = execute(textField); - - expect(result).toBeUndefined(); + expect(() => { + execute(textField); + }).not.toThrow(); }); it("execute test case7 - handles empty text", () => From 323cd6dc37208f87d74ce4da48abca241c21bf39 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:02:14 +0000 Subject: [PATCH 42/45] Remove meaningless test case checking void function return value Co-authored-by: ienaga <4123454+ienaga@users.noreply.github.com> --- .../TextFieldSetFocusIndexUseCase.test.ts | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts index 9016b63e..e7720c7b 100644 --- a/packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts +++ b/packages/text/src/TextField/usecase/TextFieldSetFocusIndexUseCase.test.ts @@ -72,18 +72,7 @@ describe("TextFieldSetFocusIndexUseCase.js test", () => expect(typeof execute).toBe("function"); }); - it("execute test case8 - returns undefined", () => - { - const textField = new TextField(); - textField.type = "input"; - textField.text = "Test"; - - const result = execute(textField, 10, 10); - - expect(result).toBeUndefined(); - }); - - it("execute test case9 - handles multiline text", () => + it("execute test case8 - handles multiline text", () => { const textField = new TextField(); textField.type = "input"; @@ -95,7 +84,7 @@ describe("TextFieldSetFocusIndexUseCase.js test", () => }).not.toThrow(); }); - it("execute test case10 - handles different stage coordinates", () => + it("execute test case9 - handles different stage coordinates", () => { const textField = new TextField(); textField.type = "input"; @@ -108,7 +97,7 @@ describe("TextFieldSetFocusIndexUseCase.js test", () => }).not.toThrow(); }); - it("execute test case11 - default selected parameter is false", () => + it("execute test case10 - default selected parameter is false", () => { const textField = new TextField(); textField.type = "input"; @@ -119,7 +108,7 @@ describe("TextFieldSetFocusIndexUseCase.js test", () => expect(textField.selectIndex).toBe(-1); }); - it("execute test case12 - handles text with scrolling", () => + it("execute test case11 - handles text with scrolling", () => { const textField = new TextField(); textField.type = "input"; @@ -132,7 +121,7 @@ describe("TextFieldSetFocusIndexUseCase.js test", () => }).not.toThrow(); }); - it("execute test case13 - handles negative coordinates", () => + it("execute test case12 - handles negative coordinates", () => { const textField = new TextField(); textField.type = "input"; @@ -143,7 +132,7 @@ describe("TextFieldSetFocusIndexUseCase.js test", () => }).not.toThrow(); }); - it("execute test case14 - handles large coordinates", () => + it("execute test case13 - handles large coordinates", () => { const textField = new TextField(); textField.type = "input"; @@ -154,7 +143,7 @@ describe("TextFieldSetFocusIndexUseCase.js test", () => }).not.toThrow(); }); - it("execute test case15 - handles Japanese text", () => + it("execute test case14 - handles Japanese text", () => { const textField = new TextField(); textField.type = "input"; From 1dd9d65d82afeee3894e615dadd13ecfb4a74e42 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:02:47 +0000 Subject: [PATCH 43/45] Remove test case that captures return value of void function Co-authored-by: ienaga <4123454+ienaga@users.noreply.github.com> --- .../usecase/TextFieldReloadUseCase.test.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts index 9271e4b0..2872e7b9 100644 --- a/packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts +++ b/packages/text/src/TextField/usecase/TextFieldReloadUseCase.test.ts @@ -45,17 +45,7 @@ describe("TextFieldReloadUseCase.js test", () => expect(typeof execute).toBe("function"); }); - it("execute test case6 - returns undefined", () => - { - const textField = new TextField(); - textField.text = "Test"; - - const result = execute(textField); - - expect(result).toBeUndefined(); - }); - - it("execute test case7 - handles text field with autoSize", () => + it("execute test case6 - handles text field with autoSize", () => { const textField = new TextField(); textField.text = "Test"; @@ -66,7 +56,7 @@ describe("TextFieldReloadUseCase.js test", () => }).not.toThrow(); }); - it("execute test case8 - handles text field with autoFontSize", () => + it("execute test case7 - handles text field with autoFontSize", () => { const textField = new TextField(); textField.text = "Test"; @@ -77,7 +67,7 @@ describe("TextFieldReloadUseCase.js test", () => }).not.toThrow(); }); - it("execute test case9 - can be called multiple times", () => + it("execute test case8 - can be called multiple times", () => { const textField = new TextField(); textField.text = "Test"; @@ -89,7 +79,7 @@ describe("TextFieldReloadUseCase.js test", () => }).not.toThrow(); }); - it("execute test case10 - handles long text", () => + it("execute test case9 - handles long text", () => { const textField = new TextField(); textField.text = "This is a very long text that should be handled properly by the reload use case"; From 01aff017c1bfb5c8a5f350c389ccb2721698508e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:03:56 +0000 Subject: [PATCH 44/45] Initial plan From 331d0d6b734a0e6ba8f98ce0684eedbd15c1f438 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:10:46 +0000 Subject: [PATCH 45/45] Remove redundant test case7 that captured void function return value Co-authored-by: ienaga <4123454+ienaga@users.noreply.github.com> --- package-lock.json | 37 ++++--------------- .../usecase/TextFieldSelectAllUseCase.test.ts | 16 ++------ 2 files changed, 11 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 113007c0..549ec714 100644 --- a/package-lock.json +++ b/package-lock.json @@ -188,7 +188,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -232,7 +231,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1497,7 +1495,6 @@ "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1555,7 +1552,6 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -1924,7 +1920,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2382,7 +2377,6 @@ "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3029,7 +3023,6 @@ "integrity": "sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@acemir/cssom": "^0.9.19", "@asamuzakjp/dom-selector": "^6.7.3", @@ -3526,7 +3519,6 @@ "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -3916,8 +3908,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -3938,7 +3929,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3970,7 +3960,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -4046,7 +4035,6 @@ "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.6", "@vitest/mocker": "4.0.6", @@ -4288,8 +4276,7 @@ "packages/cache": { "name": "@next2d/cache", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/core": { "name": "@next2d/core", @@ -4313,7 +4300,6 @@ "name": "@next2d/display", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/events": "file:../events", "@next2d/filters": "file:../filters", @@ -4328,26 +4314,22 @@ "packages/events": { "name": "@next2d/events", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/filters": { "name": "@next2d/filters", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/geom": { "name": "@next2d/geom", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/media": { "name": "@next2d/media", "version": "*", "license": "MIT", - "peer": true, "peerDependencies": { "@next2d/display": "file:../display", "@next2d/events": "file:../events", @@ -4358,14 +4340,12 @@ "packages/net": { "name": "@next2d/net", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/render-queue": { "name": "@next2d/render-queue", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/renderer": { "name": "@next2d/renderer", @@ -4395,8 +4375,7 @@ "packages/texture-packer": { "name": "@next2d/texture-packer", "version": "*", - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/ui": { "name": "@next2d/ui", diff --git a/packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts b/packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts index bd9d0dd6..a1038929 100644 --- a/packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts +++ b/packages/text/src/TextField/usecase/TextFieldSelectAllUseCase.test.ts @@ -57,17 +57,7 @@ describe("TextFieldSelectAllUseCase.js test", () => expect(typeof execute).toBe("function"); }); - it("execute test case7 - returns undefined", () => - { - const textField = new TextField(); - textField.text = "Test"; - - const result = execute(textField); - - expect(result).toBeUndefined(); - }); - - it("execute test case8 - handles long text", () => + it("execute test case7 - handles long text", () => { const textField = new TextField(); textField.text = "This is a very long text that should be selected entirely"; @@ -79,7 +69,7 @@ describe("TextFieldSelectAllUseCase.js test", () => expect(textField.selectIndex).toBe(1); }); - it("execute test case9 - handles Japanese text", () => + it("execute test case8 - handles Japanese text", () => { const textField = new TextField(); textField.text = "日本語のテキスト"; @@ -91,7 +81,7 @@ describe("TextFieldSelectAllUseCase.js test", () => expect(textField.selectIndex).toBe(1); }); - it("execute test case10 - can be called multiple times", () => + it("execute test case9 - can be called multiple times", () => { const textField = new TextField(); textField.text = "Test";