From 8146fc28175d5379ad1690ab2ced3de868ccd452 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Thu, 2 Oct 2025 15:33:44 +0000 Subject: [PATCH] test: fix vscode language service e2e tests (#64197) Fix the e2e test suite for the vscode language service extension and run it in CI. PR Close #64197 --- pnpm-lock.yaml | 196 +++++++----------- .../integration/BUILD.bazel | 20 +- .../integration/e2e/BUILD.bazel | 27 ++- .../integration/e2e/completion_spec.ts | 2 +- .../integration/e2e/definition_spec.ts | 6 +- .../integration/e2e/helper.ts | 21 +- .../integration/e2e/hover_spec.ts | 6 +- .../integration/e2e/index.ts | 34 ++- .../integration/e2e/jasmine.ts | 24 +++ .../integration/lsp/BUILD.bazel | 6 +- .../integration/tsconfig-test.json | 2 +- .../integration/tsconfig.json | 9 - vscode-ng-language-service/package.json | 6 +- vscode-ng-language-service/server/BUILD.bazel | 1 - .../server/tsconfig.json | 2 +- 15 files changed, 178 insertions(+), 184 deletions(-) create mode 100644 vscode-ng-language-service/integration/e2e/jasmine.ts delete mode 100644 vscode-ng-language-service/integration/tsconfig.json diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cacf3c400e..5b1f34a02d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1317,12 +1317,18 @@ importers: '@types/jasmine': specifier: ~5.1.9 version: 5.1.9 + '@types/jasmine-reporters': + specifier: ~2.5.3 + version: 2.5.3 '@types/node': specifier: ^24.5.2 version: 24.5.2 '@types/vscode': specifier: ^1.74.3 version: 1.104.0 + '@vscode/test-electron': + specifier: ~2.5.2 + version: 2.5.2 '@vscode/vsce': specifier: ~3.6.1 version: 3.6.2 @@ -1356,15 +1362,15 @@ importers: vscode-languageserver-textdocument: specifier: 1.0.12 version: 1.0.12 - vscode-test: - specifier: 1.6.1 - version: 1.6.1 vscode-tmgrammar-test: specifier: 0.1.3 version: 0.1.3 vscode-uri: specifier: 3.1.0 version: 3.1.0 + xvfb: + specifier: ^0.4.0 + version: 0.4.0 vscode-ng-language-service/integration/pre_standalone_project: dependencies: @@ -1395,7 +1401,7 @@ importers: devDependencies: ng-packagr: specifier: 21.0.0-next.4 - version: 21.0.0-next.4(@angular/compiler-cli@21.0.0-next.5(@angular/compiler@21.0.0-next.5)(typescript@5.9.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.9.2)))(tslib@2.8.1)(typescript@5.9.2) + version: 21.0.0-next.4(@angular/compiler-cli@21.0.0-next.5(@angular/compiler@21.0.0-next.5)(typescript@5.9.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.9.2)))(tslib@2.8.1)(typescript@5.9.2) typescript: specifier: 5.9.2 version: 5.9.2 @@ -4542,10 +4548,6 @@ packages: '@textlint/types@15.2.2': resolution: {integrity: sha512-X2BHGAR3yXJsCAjwYEDBIk9qUDWcH4pW61ISfmtejau+tVqKtnbbvEZnMTb6mWgKU1BvTmftd5DmB1XVDUtY3g==} - '@tootallnate/once@1.1.2': - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -4813,6 +4815,9 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/jasmine-reporters@2.5.3': + resolution: {integrity: sha512-8aojAUdgdiD9VQbllBJb/9gny3lOjz9T5gyMcbYlKe6npwGVsarbr8v2JYSFJSZSuFYXcPVzFG2lLX3ib0j/DA==} + '@types/jasmine@5.1.9': resolution: {integrity: sha512-8t4HtkW4wxiPVedMpeZ63n3vlWxEIquo/zc1Tm8ElU+SqVV7+D3Na2PWaJUp179AzTragMWVwkMv7mvty0NfyQ==} @@ -5126,6 +5131,10 @@ packages: '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + '@vscode/test-electron@2.5.2': + resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} + engines: {node: '>=16'} + '@vscode/vsce-sign-alpine-arm64@2.0.6': resolution: {integrity: sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==} cpu: [arm64] @@ -5769,10 +5778,6 @@ packages: bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -5786,9 +5791,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - binaryextensions@6.11.0: resolution: {integrity: sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==} engines: {node: '>=4'} @@ -5810,9 +5812,6 @@ packages: engines: {node: '>=6.9.x'} hasBin: true - bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -5890,20 +5889,12 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} - bufferutil@4.0.9: resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} engines: {node: '>=6.14.2'} @@ -6001,9 +5992,6 @@ packages: chainsaw@0.0.9: resolution: {integrity: sha512-nG8PYH+/4xB+8zkV4G844EtfvZ5tTiLFoX3dZ4nhF4t3OCKIb9UvaFyNmeZO2zOSmRWzBoTD+napN6hiL+EgcA==} - chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -7044,9 +7032,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} @@ -7659,11 +7644,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - deprecated: This package is no longer supported. - function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -8084,10 +8064,6 @@ packages: http-parser-js@0.5.10: resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -8523,6 +8499,10 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -9105,9 +9085,6 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - listr2@3.14.0: resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} engines: {node: '>=10.0.0'} @@ -9229,6 +9206,10 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} @@ -9922,6 +9903,10 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + ora@9.0.0: resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} engines: {node: '>=20'} @@ -11153,6 +11138,10 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + sleep@6.1.0: + resolution: {integrity: sha512-Z1x4JjJxsru75Tqn8F4tnOFeEu3HjtITTsumYUiuz54sGKdISgLCek9AUlXlVVrkhltRFhNUsJDJE76SFHTDIQ==} + engines: {node: '>=0.8.0'} + slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -12106,9 +12095,6 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -12348,11 +12334,6 @@ packages: vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - vscode-test@1.6.1: - resolution: {integrity: sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==} - engines: {node: '>=8.9.3'} - deprecated: This package has been renamed to @vscode/test-electron, please update to the new name - vscode-textmate@7.0.4: resolution: {integrity: sha512-9hJp0xL7HW1Q5OgGe03NACo7yiCTMEk3WU/rtKXUbncLtdg6rVVNJnHwD88UhbIYU2KoxY0Dih0x+kIsmUKn2A==} @@ -12690,6 +12671,9 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + xvfb@0.4.0: + resolution: {integrity: sha512-g55AbjcBL4Bztfn7kiUrR0ne8mMUsFODDJ+HFGf5OuHJqKKccpExX2Qgn7VF2eImw1eoh6+riXHser1J4agrFA==} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -17055,8 +17039,6 @@ snapshots: dependencies: '@textlint/ast-node-types': 15.2.2 - '@tootallnate/once@1.1.2': {} - '@tootallnate/once@2.0.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -17363,6 +17345,10 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/jasmine-reporters@2.5.3': + dependencies: + '@types/jasmine': 5.1.9 + '@types/jasmine@5.1.9': {} '@types/jasminewd2@2.0.13': @@ -17691,6 +17677,16 @@ snapshots: '@vscode/l10n@0.0.18': {} + '@vscode/test-electron@2.5.2': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + jszip: 3.10.1 + ora: 8.2.0 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + '@vscode/vsce-sign-alpine-arm64@2.0.6': optional: true @@ -18424,8 +18420,6 @@ snapshots: dependencies: require-from-string: 2.0.2 - big-integer@1.6.52: {} - big.js@5.2.2: {} big.js@7.0.1: {} @@ -18434,11 +18428,6 @@ snapshots: binary-extensions@2.3.0: {} - binary@0.3.0: - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - binaryextensions@6.11.0: dependencies: editions: 6.22.0 @@ -18466,8 +18455,6 @@ snapshots: dependencies: minimist: 1.2.8 - bluebird@3.4.7: {} - bluebird@3.7.2: {} body-parser@1.20.3: @@ -18575,8 +18562,6 @@ snapshots: buffer-from@1.1.2: {} - buffer-indexof-polyfill@1.0.2: {} - buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -18587,8 +18572,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - buffers@0.1.1: {} - bufferutil@4.0.9: dependencies: node-gyp-build: 4.8.4 @@ -18704,10 +18687,6 @@ snapshots: dependencies: traverse: 0.3.9 - chainsaw@0.1.0: - dependencies: - traverse: 0.3.9 - chalk@1.1.3: dependencies: ansi-styles: 2.2.1 @@ -19874,10 +19853,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexer2@0.1.4: - dependencies: - readable-stream: 2.3.8 - duplexify@3.7.1: dependencies: end-of-stream: 1.4.5 @@ -20771,13 +20746,6 @@ snapshots: fsevents@2.3.3: optional: true - fstream@1.0.12: - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - function-bind@1.1.2: {} function.prototype.name@1.1.8: @@ -21355,14 +21323,6 @@ snapshots: http-parser-js@0.5.10: {} - http-proxy-agent@4.0.1: - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2(supports-color@10.2.2) - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - http-proxy-agent@5.0.0(supports-color@10.2.2): dependencies: '@tootallnate/once': 2.0.0 @@ -21761,6 +21721,8 @@ snapshots: is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} + is-unicode-supported@2.1.0: {} is-url@1.2.4: {} @@ -22676,8 +22638,6 @@ snapshots: dependencies: uc.micro: 2.1.0 - listenercount@1.0.1: {} - listr2@3.14.0(enquirer@2.4.1): dependencies: cli-truncate: 2.1.0 @@ -22802,6 +22762,11 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 @@ -23301,7 +23266,7 @@ snapshots: netmask@2.0.2: {} - ng-packagr@21.0.0-next.4(@angular/compiler-cli@21.0.0-next.5(@angular/compiler@21.0.0-next.5)(typescript@5.9.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.9.2)))(tslib@2.8.1)(typescript@5.9.2): + ng-packagr@21.0.0-next.4(@angular/compiler-cli@21.0.0-next.5(@angular/compiler@21.0.0-next.5)(typescript@5.9.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.9.2)))(tslib@2.8.1)(typescript@5.9.2): dependencies: '@ampproject/remapping': 2.3.0 '@angular/compiler-cli': 21.0.0-next.5(@angular/compiler@21.0.0-next.5)(typescript@5.9.2) @@ -23329,7 +23294,7 @@ snapshots: typescript: 5.9.2 optionalDependencies: rollup: 4.52.3 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.9.2)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.9.2)) ng-packagr@21.0.0-next.4(@angular/compiler-cli@packages+compiler-cli)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.9.2)))(tslib@2.8.1)(typescript@5.9.2): dependencies: @@ -23665,6 +23630,18 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + ora@9.0.0: dependencies: chalk: 5.6.2 @@ -25155,6 +25132,11 @@ snapshots: slash@5.1.0: {} + sleep@6.1.0: + dependencies: + nan: 2.23.0 + optional: true + slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -26314,19 +26296,6 @@ snapshots: untildify@4.0.0: {} - unzipper@0.10.14: - dependencies: - big-integer: 1.6.52 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: browserslist: 4.26.2 @@ -26810,15 +26779,6 @@ snapshots: vscode-oniguruma@1.7.0: {} - vscode-test@1.6.1: - dependencies: - http-proxy-agent: 4.0.1 - https-proxy-agent: 7.0.6(supports-color@10.2.2) - rimraf: 3.0.2 - unzipper: 0.10.14 - transitivePeerDependencies: - - supports-color - vscode-textmate@7.0.4: {} vscode-tmgrammar-test@0.1.3: @@ -27251,6 +27211,10 @@ snapshots: xtend@4.0.2: {} + xvfb@0.4.0: + optionalDependencies: + sleep: 6.1.0 + y18n@4.0.3: {} y18n@5.0.8: {} diff --git a/vscode-ng-language-service/integration/BUILD.bazel b/vscode-ng-language-service/integration/BUILD.bazel index ade6e16b100..00313f5d3fb 100644 --- a/vscode-ng-language-service/integration/BUILD.bazel +++ b/vscode-ng-language-service/integration/BUILD.bazel @@ -1,34 +1,22 @@ load("@aspect_rules_ts//ts:defs.bzl", "ts_config", "ts_project") -ts_config( - name = "tsconfig", - src = "tsconfig.json", - visibility = ["//vscode-ng-language-service/integration:__subpackages__"], - deps = [ - "//vscode-ng-language-service:tsconfig", - "//vscode-ng-language-service/server:tsconfig", - ], -) - ts_config( name = "tsconfig-test", src = "tsconfig-test.json", visibility = ["//vscode-ng-language-service/integration:__subpackages__"], deps = [ - ":tsconfig", "//vscode-ng-language-service:tsconfig", - "//vscode-ng-language-service/server:tsconfig", ], ) ts_project( name = "integration", - srcs = glob([ - "*.ts", - ]), + srcs = [ + "test_constants.ts", + ], declaration = True, source_map = True, - tsconfig = ":tsconfig", + tsconfig = "//vscode-ng-language-service:tsconfig", visibility = ["//vscode-ng-language-service/integration:__subpackages__"], deps = [ "//vscode-ng-language-service:node_modules/@types/node", diff --git a/vscode-ng-language-service/integration/e2e/BUILD.bazel b/vscode-ng-language-service/integration/e2e/BUILD.bazel index 900e483c237..2d4be703b17 100644 --- a/vscode-ng-language-service/integration/e2e/BUILD.bazel +++ b/vscode-ng-language-service/integration/e2e/BUILD.bazel @@ -3,18 +3,20 @@ load("@aspect_rules_ts//ts:defs.bzl", "ts_project") ts_project( name = "e2e", + testonly = True, srcs = glob(["*.ts"]), declaration = True, source_map = True, - tsconfig = "//vscode-ng-language-service/integration:tsconfig", + tsconfig = "//vscode-ng-language-service:tsconfig", visibility = [ "//vscode-ng-language-service/integration:__subpackages__", ], deps = [ "//vscode-ng-language-service:node_modules/@types/jasmine", + "//vscode-ng-language-service:node_modules/@types/jasmine-reporters", "//vscode-ng-language-service:node_modules/@types/node", "//vscode-ng-language-service:node_modules/@types/vscode", - "//vscode-ng-language-service:node_modules/vscode-test", + "//vscode-ng-language-service:node_modules/@vscode/test-electron", "//vscode-ng-language-service/integration", ], ) @@ -23,21 +25,26 @@ js_test( name = "test", data = [ ":e2e", - "//vscode-ng-language-service:npm", - "//vscode-ng-language-service/integration", - "//vscode-ng-language-service/integration/project", - # Depend on //:node_modules/jasmine as a temporary work-around for jasmine escaping its - # runfiles likely due to esm import issue in rules_js https://github.com/aspect-build/rules_js/issues/362 "//vscode-ng-language-service:node_modules/jasmine", + "//vscode-ng-language-service:node_modules/jasmine-reporters", + "//vscode-ng-language-service:node_modules/typescript", + "//vscode-ng-language-service:node_modules/xvfb", + "//vscode-ng-language-service:npm", + "//vscode-ng-language-service/integration/project", + "//vscode-ng-language-service/integration/project:node_modules/@angular/common", + "//vscode-ng-language-service/integration/project:node_modules/@angular/core", ], entry_point = ":index.js", + env = { + "DBUS_SESSION_BUS_ADDRESS": "", + }, # This test downloads vscode & installs it which is not allowed in the sandbox # due to file system protection. It is tagged local so it runs outside of # the sandbox. It would need some redesign to allow for sandbox execution. - # Tagged manual so that `bazel test //...` doesn't run it automatically. tags = [ "e2e", - "local", - "manual", + "no-remote-exec", + "no-sandbox", + "requires-network", ], ) diff --git a/vscode-ng-language-service/integration/e2e/completion_spec.ts b/vscode-ng-language-service/integration/e2e/completion_spec.ts index 87472b9ddec..cef485ca241 100644 --- a/vscode-ng-language-service/integration/e2e/completion_spec.ts +++ b/vscode-ng-language-service/integration/e2e/completion_spec.ts @@ -5,7 +5,7 @@ import {activate, COMPLETION_COMMAND, FOO_TEMPLATE_URI} from './helper'; describe('Angular LS completions', () => { beforeAll(async () => { await activate(FOO_TEMPLATE_URI); - }); + }, 20_000); it(`does not duplicate HTML completions in external templates`, async () => { const position = new vscode.Position(0, 0); diff --git a/vscode-ng-language-service/integration/e2e/definition_spec.ts b/vscode-ng-language-service/integration/e2e/definition_spec.ts index 44c40ce9093..4aedaf0ce7b 100644 --- a/vscode-ng-language-service/integration/e2e/definition_spec.ts +++ b/vscode-ng-language-service/integration/e2e/definition_spec.ts @@ -10,7 +10,7 @@ const APP_COMPONENT_URI = vscode.Uri.file(APP_COMPONENT); describe('Angular LS', () => { beforeAll(async () => { await activate(APP_COMPONENT_URI); - }, 25000 /* 25 seconds */); + }, 20_000); it(`returns definition for variable in template`, async () => { // vscode Position is zero-based @@ -29,8 +29,8 @@ describe('Angular LS', () => { expect(def.targetUri.fsPath).toBe(APP_COMPONENT); // in the same document const {start, end} = def.targetRange; // Should start and end on line 6 - expect(start.line).toBe(7); - expect(end.line).toBe(7); + expect(start.line).toBe(8); + expect(end.line).toBe(8); expect(start.character).toBe(2); expect(end.character).toBe(start.character + `name`.length); }); diff --git a/vscode-ng-language-service/integration/e2e/helper.ts b/vscode-ng-language-service/integration/e2e/helper.ts index 78b6f5c1acc..64646e93bfd 100644 --- a/vscode-ng-language-service/integration/e2e/helper.ts +++ b/vscode-ng-language-service/integration/e2e/helper.ts @@ -1,3 +1,4 @@ +import {setTimeout} from 'node:timers/promises'; import * as vscode from 'vscode'; import {APP_COMPONENT, FOO_TEMPLATE} from '../test_constants'; @@ -8,20 +9,16 @@ export const DEFINITION_COMMAND = 'vscode.executeDefinitionProvider'; export const APP_COMPONENT_URI = vscode.Uri.file(APP_COMPONENT); export const FOO_TEMPLATE_URI = vscode.Uri.file(FOO_TEMPLATE); -function sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -export async function activate(uri: vscode.Uri) { - // set default timeout to 30 seconds - jasmine.DEFAULT_TIMEOUT_INTERVAL = 30_000; +export async function activate(uri: vscode.Uri): Promise { await vscode.window.showTextDocument(uri); await waitForDefinitionsToBeAvailable(20); } -async function waitForDefinitionsToBeAvailable(maxSeconds: number) { +async function waitForDefinitionsToBeAvailable(maxTries: number) { + await vscode.workspace.openTextDocument(APP_COMPONENT_URI); + let tries = 0; - while (tries < maxSeconds) { + while (tries < maxTries) { const position = new vscode.Position(4, 25); // For a complete list of standard commands, see // https://code.visualstudio.com/api/references/commands @@ -30,10 +27,12 @@ async function waitForDefinitionsToBeAvailable(maxSeconds: number) { APP_COMPONENT_URI, position, ); - if (definitions && definitions.length > 0) { + + if (definitions?.length > 0) { return; } + tries++; - await sleep(1000); + await setTimeout(500); } } diff --git a/vscode-ng-language-service/integration/e2e/hover_spec.ts b/vscode-ng-language-service/integration/e2e/hover_spec.ts index 4740b6aff14..1f30c59f671 100644 --- a/vscode-ng-language-service/integration/e2e/hover_spec.ts +++ b/vscode-ng-language-service/integration/e2e/hover_spec.ts @@ -2,12 +2,10 @@ import * as vscode from 'vscode'; import {activate, FOO_TEMPLATE_URI, HOVER_COMMAND} from './helper'; -// This hover tests appear to be the only flaky ones in the suite. Disable until they can -// consistently pass. -xdescribe('Angular LS quick info', () => { +describe('Angular LS quick info', () => { beforeAll(async () => { await activate(FOO_TEMPLATE_URI); - }); + }, 20_000); it(`returns quick info from built in extension for class in template`, async () => { const position = new vscode.Position(1, 8); diff --git a/vscode-ng-language-service/integration/e2e/index.ts b/vscode-ng-language-service/integration/e2e/index.ts index a45019c75c6..6a6ba21044b 100644 --- a/vscode-ng-language-service/integration/e2e/index.ts +++ b/vscode-ng-language-service/integration/e2e/index.ts @@ -1,27 +1,51 @@ -import {join} from 'path'; -import {runTests} from 'vscode-test'; +import {join} from 'node:path'; +import {tmpdir} from 'node:os'; +import {runTests} from '@vscode/test-electron'; import {PACKAGE_ROOT, PROJECT_PATH} from '../test_constants'; +import {mkdtemp} from 'node:fs/promises'; + +// @ts-expect-error no types. +import Xvfb from 'xvfb'; async function main() { - const EXT_DEVELOPMENT_PATH = join(PACKAGE_ROOT, 'npm'); + const EXT_DEVELOPMENT_PATH = join(PACKAGE_ROOT, 'npm/vscode-ng-language-service/vsix_sandbox'); const EXT_TESTS_PATH = join(PACKAGE_ROOT, 'integration', 'e2e', 'jasmine'); + const xvfb = new Xvfb(); + + // We cannot use `TEST_TMPDIR` as it's longer than 170 characters + const vsCodeDataDir = await mkdtemp(join(tmpdir(), 'vscode-e2e-')); try { - await runTests({ + xvfb.start(); + const exitCode = await runTests({ // Keep version in sync with vscode engine version in package.json version: '1.74.3', extensionDevelopmentPath: EXT_DEVELOPMENT_PATH, extensionTestsPath: EXT_TESTS_PATH, + // Avoid redownloading vscode if the test if flaky. + cachePath: join(tmpdir(), 'vscode-cache'), launchArgs: [ PROJECT_PATH, // This disables all extensions except the one being tested '--disable-extensions', + '--disable-gpu', + '--no-sandbox', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + `--extensions-dir=${vsCodeDataDir}/extensions`, + `--user-data-dir=${vsCodeDataDir}/user-data`, ], }); + + if (exitCode !== 0) { + process.exitCode = exitCode; + } } catch (err) { console.error('Failed to run tests', err); - process.exit(1); + process.exitCode = 1; + } finally { + xvfb.stop(); } } diff --git a/vscode-ng-language-service/integration/e2e/jasmine.ts b/vscode-ng-language-service/integration/e2e/jasmine.ts new file mode 100644 index 00000000000..b72709ddb98 --- /dev/null +++ b/vscode-ng-language-service/integration/e2e/jasmine.ts @@ -0,0 +1,24 @@ +import Jasmine from 'jasmine'; +import {TerminalReporter} from 'jasmine-reporters'; + +export async function run( + _testsRoot: string, + cb: (error: any, exitCode?: number) => void, +): Promise { + const jasmine = new Jasmine({projectBaseDir: __dirname}); + jasmine.loadConfig({ + spec_files: ['*_spec.js'], + }); + + jasmine.addReporter(new TerminalReporter()); + jasmine.exitOnCompletion = false; + const result = await jasmine.execute(); + + if (result.overallStatus === 'passed') { + console.log('All specs have passed'); + cb(null, 0); + } else { + console.log('At least one spec has failed'); + cb(result.incompleteReason, 1); + } +} diff --git a/vscode-ng-language-service/integration/lsp/BUILD.bazel b/vscode-ng-language-service/integration/lsp/BUILD.bazel index 5010c1f3821..3e011d7284a 100644 --- a/vscode-ng-language-service/integration/lsp/BUILD.bazel +++ b/vscode-ng-language-service/integration/lsp/BUILD.bazel @@ -12,13 +12,11 @@ jasmine_test( "//vscode-ng-language-service/integration/project:node_modules/@angular/common", "//vscode-ng-language-service/integration/project:node_modules/@angular/core", "//vscode-ng-language-service/server:index", - "//vscode-ng-language-service/server:node_modules", + "//vscode-ng-language-service/server:node_modules/@angular/language-service", + "//vscode-ng-language-service/server:node_modules/typescript", ], flaky = True, shard_count = 2, - tags = [ - "e2e", - ], ) ts_project( diff --git a/vscode-ng-language-service/integration/tsconfig-test.json b/vscode-ng-language-service/integration/tsconfig-test.json index d022089a551..33321133ecf 100644 --- a/vscode-ng-language-service/integration/tsconfig-test.json +++ b/vscode-ng-language-service/integration/tsconfig-test.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { "types": ["node", "jasmine"] } diff --git a/vscode-ng-language-service/integration/tsconfig.json b/vscode-ng-language-service/integration/tsconfig.json deleted file mode 100644 index 615564c3482..00000000000 --- a/vscode-ng-language-service/integration/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "rootDirs": [ - "..", - "dist" - ] - }, -} diff --git a/vscode-ng-language-service/package.json b/vscode-ng-language-service/package.json index 3fdc9224885..47bad9a7549 100644 --- a/vscode-ng-language-service/package.json +++ b/vscode-ng-language-service/package.json @@ -262,8 +262,10 @@ "devDependencies": { "@angular/core": "21.0.0-next.5", "@types/jasmine": "~5.1.9", + "@types/jasmine-reporters": "~2.5.3", "@types/node": "^24.5.2", "@types/vscode": "^1.74.3", + "@vscode/test-electron": "~2.5.2", "@vscode/vsce": "~3.6.1", "jasmine": "~5.11.0", "jasmine-core": "~5.11.0", @@ -275,9 +277,9 @@ "vscode-languageserver": "7.0.0", "vscode-languageserver-protocol": "3.16.0", "vscode-languageserver-textdocument": "1.0.12", - "vscode-test": "1.6.1", "vscode-tmgrammar-test": "0.1.3", - "vscode-uri": "3.1.0" + "vscode-uri": "3.1.0", + "xvfb": "^0.4.0" }, "repository": { "type": "git", diff --git a/vscode-ng-language-service/server/BUILD.bazel b/vscode-ng-language-service/server/BUILD.bazel index 704e0c2b36f..24166ab27d5 100644 --- a/vscode-ng-language-service/server/BUILD.bazel +++ b/vscode-ng-language-service/server/BUILD.bazel @@ -9,7 +9,6 @@ ts_config( name = "tsconfig", src = "tsconfig.json", visibility = [ - "//vscode-ng-language-service/integration:__subpackages__", "//vscode-ng-language-service/server:__subpackages__", ], deps = [ diff --git a/vscode-ng-language-service/server/tsconfig.json b/vscode-ng-language-service/server/tsconfig.json index d1bdb214cb7..b81670c2405 100644 --- a/vscode-ng-language-service/server/tsconfig.json +++ b/vscode-ng-language-service/server/tsconfig.json @@ -3,4 +3,4 @@ "compilerOptions": { "useUnknownInCatchVariables": false } -} \ No newline at end of file +}