Files
sourcekit-lsp/Tests/BuildSystemIntegrationTests/LegacyBuildServerBuildSystemTests.swift
Alex Hoppen 5c60d1d39c Add a new test project type that uses a custom build server
This allows us to more easily test behavior for build servers that have different behavior than SwiftPM and compile commands without having to implement the build server in Python.
2025-03-05 23:54:32 -08:00

97 lines
3.1 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import BuildServerProtocol
import BuildSystemIntegration
import Foundation
import LanguageServerProtocol
import LanguageServerProtocolExtensions
import SKTestSupport
import TSCBasic
import XCTest
final class LegacyBuildServerBuildSystemTests: XCTestCase {
func testBuildSettingsFromBuildServer() async throws {
let project = try await ExternalBuildServerTestProject(
files: [
"Test.swift": """
#if DEBUG
#error("DEBUG SET")
#else
#error("DEBUG NOT SET")
#endif
"""
],
buildServer: """
class BuildServer(LegacyBuildServer):
def register_for_changes(self, notification: Dict[str, object]):
if notification["action"] == "register":
self.send_notification(
"build/sourceKitOptionsChanged",
{
"uri": notification["uri"],
"updatedOptions": {
"options": [r"$TEST_DIR/Test.swift", "-DDEBUG", $SDK_ARGS]
},
},
)
"""
)
let (uri, _) = try project.openDocument("Test.swift")
try await repeatUntilExpectedResult {
let diags = try await project.testClient.send(
DocumentDiagnosticsRequest(textDocument: TextDocumentIdentifier(uri))
)
return diags.fullReport?.items.map(\.message) == ["DEBUG SET"]
}
}
func testBuildSettingsFromBuildServerChanged() async throws {
let project = try await ExternalBuildServerTestProject(
files: [
"Test.swift": """
#if DEBUG
#error("DEBUG SET")
#else
#error("DEBUG NOT SET")
#endif
"""
],
buildServer: """
import threading
class BuildServer(LegacyBuildServer):
def send_delayed_options_changed(self, uri: str):
self.send_sourcekit_options_changed(uri, [r"$TEST_DIR/Test.swift", "-DDEBUG", $SDK_ARGS])
def register_for_changes(self, notification: Dict[str, object]):
if notification["action"] != "register":
return
self.send_sourcekit_options_changed(
notification["uri"],
[r"$TEST_DIR/Test.swift", $SDK_ARGS]
)
threading.Timer(1, self.send_delayed_options_changed, [notification["uri"]]).start()
"""
)
let (uri, _) = try project.openDocument("Test.swift")
try await repeatUntilExpectedResult {
let diags = try await project.testClient.send(
DocumentDiagnosticsRequest(textDocument: TextDocumentIdentifier(uri))
)
return diags.fullReport?.items.map(\.message) == ["DEBUG SET"]
}
}
}