Skip to content

Commit bdb1fce

Browse files
committed
Make clangd test not rely on LSP
1 parent a0954c0 commit bdb1fce

File tree

3 files changed

+145
-121
lines changed

3 files changed

+145
-121
lines changed

test/integration-tests/DiagnosticsManager.test.ts

Lines changed: 137 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,22 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
import * as assert from "assert";
16-
import * as langclient from "vscode-languageclient/node";
1716
import * as vscode from "vscode";
1817
import { SwiftToolchain } from "../../src/toolchain/toolchain";
1918
import { executeTaskAndWaitForResult, waitForNoRunningTasks } from "../utilities/tasks";
2019
import { WorkspaceContext } from "../../src/WorkspaceContext";
21-
import { testAssetUri, testAssetWorkspaceFolder, testSwiftTask } from "../fixtures";
20+
import { testAssetUri, testSwiftTask } from "../fixtures";
2221
import { createBuildAllTask } from "../../src/tasks/SwiftTaskProvider";
2322
import { DiagnosticsManager } from "../../src/DiagnosticsManager";
2423
import { FolderContext } from "../../src/FolderContext";
2524
import { Version } from "../../src/utilities/version";
26-
import { Workbench } from "../../src/utilities/commands";
2725
import {
2826
activateExtensionForSuite,
29-
buildProject,
3027
folderInRootWorkspace,
3128
updateSettings,
3229
} from "./utilities/testutilities";
3330
import { DiagnosticStyle } from "../../src/configuration";
3431
import { expect } from "chai";
35-
import { touchDocument, waitForClientState, waitForIndex } from "./utilities/lsputilities";
3632

3733
const isEqual = (d1: vscode.Diagnostic, d2: vscode.Diagnostic) => {
3834
return (
@@ -75,7 +71,6 @@ suite.only("DiagnosticsManager Test Suite", function () {
7571
let cFolderContext: FolderContext;
7672
let cppFolderContext: FolderContext;
7773
let toolchain: SwiftToolchain;
78-
let workspaceFolder: vscode.WorkspaceFolder;
7974

8075
let mainUri: vscode.Uri;
8176
let funcUri: vscode.Uri;
@@ -135,7 +130,6 @@ suite.only("DiagnosticsManager Test Suite", function () {
135130

136131
workspaceContext = ctx;
137132
toolchain = workspaceContext.globalToolchain;
138-
workspaceFolder = testAssetWorkspaceFolder("diagnostics");
139133
folderContext = await folderInRootWorkspace("diagnostics", workspaceContext);
140134
cFolderContext = await folderInRootWorkspace("diagnosticsC", workspaceContext);
141135
cppFolderContext = await folderInRootWorkspace("diagnosticsCpp", workspaceContext);
@@ -243,7 +237,7 @@ suite.only("DiagnosticsManager Test Suite", function () {
243237
) {
244238
this.skip();
245239
}
246-
this.timeout(3 * 60 * 1000); // Allow 3 minutes to build
240+
this.timeout(5 * 60 * 1000); // Allow 5 minutes to build
247241

248242
// Clean up any lingering diagnostics
249243
workspaceContext.diagnostics.clear();
@@ -433,10 +427,12 @@ suite.only("DiagnosticsManager Test Suite", function () {
433427
vscode.DiagnosticSeverity.Error
434428
);
435429
outputDiagnostic.source = "swiftc";
430+
let workspaceFolder: vscode.WorkspaceFolder;
436431

437432
setup(async () => {
438433
await waitForNoRunningTasks();
439434
workspaceContext.diagnostics.clear();
435+
workspaceFolder = folderContext.workspaceFolder;
440436
});
441437

442438
test("Parse partial line", async () => {
@@ -517,6 +513,8 @@ suite.only("DiagnosticsManager Test Suite", function () {
517513
let sourcekitErrorDiagnostic: vscode.Diagnostic;
518514
let sourcekitWarningDiagnostic: vscode.Diagnostic;
519515
let sourcekitLowercaseDiagnostic: vscode.Diagnostic;
516+
let clangErrorDiagnostic: vscode.Diagnostic;
517+
let swiftcClangErrorDiagnostic: vscode.Diagnostic;
520518

521519
setup(async () => {
522520
workspaceContext.diagnostics.clear();
@@ -556,6 +554,19 @@ suite.only("DiagnosticsManager Test Suite", function () {
556554
vscode.DiagnosticSeverity.Warning
557555
);
558556
sourcekitWarningDiagnostic.source = "SourceKit";
557+
558+
clangErrorDiagnostic = new vscode.Diagnostic(
559+
new vscode.Range(new vscode.Position(5, 10), new vscode.Position(5, 13)),
560+
"Use of undeclared identifier 'bar'",
561+
vscode.DiagnosticSeverity.Error
562+
);
563+
clangErrorDiagnostic.source = "clang"; // Set by LSP
564+
swiftcClangErrorDiagnostic = new vscode.Diagnostic(
565+
new vscode.Range(new vscode.Position(5, 10), new vscode.Position(5, 13)),
566+
"Use of undeclared identifier 'bar'",
567+
vscode.DiagnosticSeverity.Error
568+
);
569+
swiftcClangErrorDiagnostic.source = "swiftc";
559570
});
560571

561572
suite("markdownLinks", () => {
@@ -704,6 +715,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
704715
assertHasDiagnostic(mainUri, swiftcWarningDiagnostic);
705716
});
706717

718+
test("merge in clangd diagnostics", async () => {
719+
// Add initial swiftc diagnostics
720+
workspaceContext.diagnostics.handleDiagnostics(cUri, DiagnosticsManager.isSwiftc, [
721+
swiftcClangErrorDiagnostic,
722+
]);
723+
724+
// Now provide identical clangd diagnostic
725+
workspaceContext.diagnostics.handleDiagnostics(
726+
cUri,
727+
DiagnosticsManager.isSourcekit,
728+
[clangErrorDiagnostic]
729+
);
730+
731+
// check clangd merged in
732+
assertHasDiagnostic(cUri, clangErrorDiagnostic);
733+
// check swiftc merged in
734+
assertHasDiagnostic(cUri, swiftcClangErrorDiagnostic);
735+
});
736+
707737
test("merge in swiftc diagnostics", async () => {
708738
// Add initial SourceKit diagnostics
709739
workspaceContext.diagnostics.handleDiagnostics(
@@ -788,6 +818,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
788818
assertHasDiagnostic(mainUri, swiftcWarningDiagnostic);
789819
});
790820

821+
test("merge in clangd diagnostics", async () => {
822+
// Add initial swiftc diagnostics
823+
workspaceContext.diagnostics.handleDiagnostics(cUri, DiagnosticsManager.isSwiftc, [
824+
swiftcClangErrorDiagnostic,
825+
]);
826+
827+
// Now provide identical clangd diagnostic
828+
workspaceContext.diagnostics.handleDiagnostics(
829+
cUri,
830+
DiagnosticsManager.isSourcekit,
831+
[clangErrorDiagnostic]
832+
);
833+
834+
// check clangd merged in
835+
assertHasDiagnostic(cUri, clangErrorDiagnostic);
836+
// swiftc deduplicated
837+
assertWithoutDiagnostic(cUri, swiftcClangErrorDiagnostic);
838+
});
839+
791840
test("merge in swiftc diagnostics", async () => {
792841
// Add initial SourceKit diagnostic
793842
workspaceContext.diagnostics.handleDiagnostics(
@@ -886,6 +935,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
886935
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
887936
});
888937

938+
test("merge in clangd diagnostics", async () => {
939+
// Add initial swiftc diagnostics
940+
workspaceContext.diagnostics.handleDiagnostics(cUri, DiagnosticsManager.isSwiftc, [
941+
swiftcClangErrorDiagnostic,
942+
]);
943+
944+
// Now provide identical clangd diagnostic
945+
workspaceContext.diagnostics.handleDiagnostics(
946+
cUri,
947+
DiagnosticsManager.isSourcekit,
948+
[clangErrorDiagnostic]
949+
);
950+
951+
// check swiftc stayed in
952+
assertHasDiagnostic(cUri, swiftcClangErrorDiagnostic);
953+
// clangd ignored
954+
assertWithoutDiagnostic(cUri, clangErrorDiagnostic);
955+
});
956+
889957
test("merge in SourceKit diagnostics", async () => {
890958
// Add initial swiftc diagnostic
891959
workspaceContext.diagnostics.handleDiagnostics(
@@ -983,6 +1051,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
9831051
assertWithoutDiagnostic(mainUri, swiftcWarningDiagnostic);
9841052
});
9851053

1054+
test("merge in clangd diagnostics", async () => {
1055+
// Provide clangd diagnostic
1056+
workspaceContext.diagnostics.handleDiagnostics(
1057+
cUri,
1058+
DiagnosticsManager.isSourcekit,
1059+
[clangErrorDiagnostic]
1060+
);
1061+
1062+
// Add identical swiftc diagnostic
1063+
workspaceContext.diagnostics.handleDiagnostics(cUri, DiagnosticsManager.isSwiftc, [
1064+
swiftcClangErrorDiagnostic,
1065+
]);
1066+
1067+
// check clangd merged in
1068+
assertHasDiagnostic(cUri, clangErrorDiagnostic);
1069+
// swiftc ignored
1070+
assertWithoutDiagnostic(cUri, swiftcClangErrorDiagnostic);
1071+
});
1072+
9861073
test("ignore swiftc diagnostics", async () => {
9871074
// Provide swiftc diagnostics
9881075
workspaceContext.diagnostics.handleDiagnostics(
@@ -1067,6 +1154,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
10671154
assertWithoutDiagnostic(mainUri, sourcekitWarningDiagnostic);
10681155
});
10691156

1157+
test("ignore clangd diagnostics", async () => {
1158+
// Add initial swiftc diagnostics
1159+
workspaceContext.diagnostics.handleDiagnostics(cUri, DiagnosticsManager.isSwiftc, [
1160+
swiftcClangErrorDiagnostic,
1161+
]);
1162+
1163+
// Now provide identical clangd diagnostic
1164+
workspaceContext.diagnostics.handleDiagnostics(
1165+
cUri,
1166+
DiagnosticsManager.isSourcekit,
1167+
[clangErrorDiagnostic]
1168+
);
1169+
1170+
// check swiftc stayed in
1171+
assertHasDiagnostic(cUri, swiftcClangErrorDiagnostic);
1172+
// clangd ignored
1173+
assertWithoutDiagnostic(cUri, clangErrorDiagnostic);
1174+
});
1175+
10701176
test("clean old SourceKit diagnostics", async () => {
10711177
// Add initial SourceKit diagnostics
10721178
workspaceContext.diagnostics.allDiagnostics.set(mainUri.fsPath, [
@@ -1156,6 +1262,29 @@ suite.only("DiagnosticsManager Test Suite", function () {
11561262
assertHasDiagnostic(mainUri, swiftcWarningDiagnostic);
11571263
});
11581264

1265+
test("clangd removes swiftc diagnostic (swiftc shows first)", async () => {
1266+
// Add initial diagnostics
1267+
workspaceContext.diagnostics.handleDiagnostics(cUri, DiagnosticsManager.isSwiftc, [
1268+
swiftcClangErrorDiagnostic,
1269+
]);
1270+
workspaceContext.diagnostics.handleDiagnostics(
1271+
cUri,
1272+
DiagnosticsManager.isSourcekit,
1273+
[clangErrorDiagnostic]
1274+
);
1275+
1276+
// Have clangd indicate has been fixed
1277+
workspaceContext.diagnostics.handleDiagnostics(
1278+
cUri,
1279+
DiagnosticsManager.isSourcekit,
1280+
[]
1281+
);
1282+
1283+
// check cleaned up stale error
1284+
assertWithoutDiagnostic(cUri, clangErrorDiagnostic);
1285+
assertWithoutDiagnostic(cUri, swiftcClangErrorDiagnostic);
1286+
});
1287+
11591288
test("don't remove swiftc diagnostics when SourceKit never matched", async () => {
11601289
workspaceContext.diagnostics.handleDiagnostics(
11611290
mainUri,
@@ -1175,107 +1304,4 @@ suite.only("DiagnosticsManager Test Suite", function () {
11751304
});
11761305
});
11771306
});
1178-
1179-
// Skipped until we enable it in a nightly build
1180-
suite("SourceKit-LSP diagnostics @slow", () => {
1181-
let resetSettings: (() => Promise<void>) | undefined;
1182-
suiteTeardown(async () => {
1183-
if (resetSettings) {
1184-
await resetSettings();
1185-
resetSettings = undefined;
1186-
}
1187-
});
1188-
1189-
suiteSetup(async function () {
1190-
if (workspaceContext.globalToolchainSwiftVersion.isLessThan(new Version(6, 0, 0))) {
1191-
// need to waitForIndex
1192-
this.skip();
1193-
return;
1194-
}
1195-
resetSettings = await updateSettings({
1196-
"swift.diagnosticsCollection": "onlySourceKit", // So waitForDiagnostics only resolves from LSP
1197-
});
1198-
});
1199-
1200-
teardown(async () => {
1201-
await vscode.commands.executeCommand(Workbench.ACTION_CLOSEALLEDITORS);
1202-
});
1203-
1204-
async function triggerFileDiagnostics(uri: vscode.Uri, folder: FolderContext) {
1205-
const clientManager = workspaceContext.languageClientManager.get(folder);
1206-
await waitForClientState(clientManager, langclient.State.Running);
1207-
await vscode.window.showTextDocument(uri);
1208-
await new Promise(r => setTimeout(r, 2000));
1209-
await touchDocument(clientManager, uri);
1210-
await waitForIndex(clientManager, folder.swiftVersion);
1211-
}
1212-
1213-
suite("swift", () => {
1214-
setup(async function () {
1215-
this.timeout(3 * 60 * 1000); // Allow 3 minutes to build
1216-
await buildProject(workspaceContext, "diagnostics", true);
1217-
});
1218-
1219-
test("Provides diagnostics", async () => {
1220-
const lspSource = toolchain.swiftVersion.isGreaterThanOrEqual(new Version(6, 0, 0))
1221-
? "SourceKit"
1222-
: "sourcekitd";
1223-
1224-
// Include warning
1225-
const expectedDiagnostic1 = new vscode.Diagnostic(
1226-
new vscode.Range(new vscode.Position(1, 8), new vscode.Position(1, 8)),
1227-
"Initialization of variable 'unused' was never used; consider replacing with assignment to '_' or removing it",
1228-
vscode.DiagnosticSeverity.Warning
1229-
);
1230-
expectedDiagnostic1.source = lspSource; // Set by LSP
1231-
1232-
// Include error
1233-
const expectedDiagnostic2 = new vscode.Diagnostic(
1234-
new vscode.Range(new vscode.Position(7, 0), new vscode.Position(7, 3)),
1235-
"Cannot assign to value: 'bar' is a 'let' constant",
1236-
vscode.DiagnosticSeverity.Error
1237-
);
1238-
expectedDiagnostic2.source = lspSource; // Set by LSP
1239-
1240-
const promise = waitForDiagnostics({
1241-
[mainUri.fsPath]: [expectedDiagnostic1, expectedDiagnostic2],
1242-
});
1243-
// Retrigger diagnostics
1244-
await triggerFileDiagnostics(mainUri, folderContext);
1245-
await promise;
1246-
});
1247-
});
1248-
1249-
suite("clang", async () => {
1250-
setup(async function () {
1251-
this.timeout(3 * 60 * 1000); // Allow 3 minutes to build
1252-
await buildProject(workspaceContext, "diagnosticsC", true);
1253-
});
1254-
1255-
test("Provides diagnostics", async () => {
1256-
// No string manipulation
1257-
const expectedDiagnostic1 = new vscode.Diagnostic(
1258-
new vscode.Range(new vscode.Position(5, 10), new vscode.Position(5, 13)),
1259-
"Use of undeclared identifier 'bar'",
1260-
vscode.DiagnosticSeverity.Error
1261-
);
1262-
expectedDiagnostic1.source = "clang"; // Set by LSP
1263-
1264-
// Remove "(fix available)" from string from SourceKit
1265-
const expectedDiagnostic2 = new vscode.Diagnostic(
1266-
new vscode.Range(new vscode.Position(7, 4), new vscode.Position(7, 10)),
1267-
"Expected ';' after expression",
1268-
vscode.DiagnosticSeverity.Error
1269-
);
1270-
expectedDiagnostic2.source = "clang"; // Set by LSP
1271-
1272-
const promise = waitForDiagnostics({
1273-
[cUri.fsPath]: [expectedDiagnostic1, expectedDiagnostic2],
1274-
});
1275-
// Retrigger diagnostics
1276-
await triggerFileDiagnostics(cUri, cFolderContext);
1277-
await promise;
1278-
});
1279-
});
1280-
});
12811307
});

0 commit comments

Comments
 (0)