Files
sourcekit-lsp/Tests/SourceKitDTests/SourceKitDRegistryTests.swift
Alex Hoppen 92aa94fa43 Remove the split between SourceKitD and DynamicallyLoadedSourceKitD
There is only one real class that implements the `SourceKitD` protocol, so there really isn’t any need for the protocol + class split at all. Unify them to make code simpler to reason about.
2025-03-27 11:05:24 -07:00

77 lines
2.7 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2020 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 Csourcekitd
import LanguageServerProtocolExtensions
import SKTestSupport
import SourceKitD
import SwiftExtensions
import TSCBasic
import XCTest
final class SourceKitDRegistryTests: XCTestCase {
func testAdd() async throws {
let registry = SourceKitDRegistry<FakeSourceKitD>()
let a = await FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/a"), in: registry)
let b = await FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/b"), in: registry)
let a2 = await FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/a"), in: registry)
XCTAssert(a === a2)
XCTAssert(a !== b)
}
func testRemove() async throws {
let registry = SourceKitDRegistry<FakeSourceKitD>()
let a = await FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/a"), in: registry)
await assertTrue(registry.remove(URL(fileURLWithPath: "/a")) === a)
await assertNil(registry.remove(URL(fileURLWithPath: "/a")))
}
func testRemoveResurrect() async throws {
let registry = SourceKitDRegistry<FakeSourceKitD>()
@inline(never)
func scope(registry: SourceKitDRegistry<FakeSourceKitD>) async throws -> UInt32 {
let a = await FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/a"), in: registry)
await assertTrue(a === FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/a"), in: registry))
await assertTrue(registry.remove(URL(fileURLWithPath: "/a")) === a)
// Resurrected.
await assertTrue(a === FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/a"), in: registry))
// Remove again.
await assertTrue(registry.remove(URL(fileURLWithPath: "/a")) === a)
return a.token
}
let id = try await scope(registry: registry)
let a2 = await FakeSourceKitD.getOrCreate(URL(fileURLWithPath: "/a"), in: registry)
XCTAssertNotEqual(id, a2.token)
}
}
private let nextToken = AtomicUInt32(initialValue: 0)
final class FakeSourceKitD: Sendable {
let token: UInt32
private init() {
token = nextToken.fetchAndIncrement()
}
static func getOrCreate(_ url: URL, in registry: SourceKitDRegistry<FakeSourceKitD>) async -> FakeSourceKitD {
return await registry.getOrAdd(url, pluginPaths: nil, create: { Self.init() })
}
}