1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
//===----------------------------------------------------------------------===//
//
// 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 LSPTestSupport
import SKSupport
import SourceKitD
import TSCBasic
import XCTest
final class SourceKitDRegistryTests: XCTestCase {
func testAdd() async throws {
let registry = SourceKitDRegistry()
let a = try await FakeSourceKitD.getOrCreate(AbsolutePath(validating: "/a"), in: registry)
let b = try await FakeSourceKitD.getOrCreate(AbsolutePath(validating: "/b"), in: registry)
let a2 = try await FakeSourceKitD.getOrCreate(AbsolutePath(validating: "/a"), in: registry)
XCTAssert(a === a2)
XCTAssert(a !== b)
}
func testRemove() async throws {
let registry = SourceKitDRegistry()
let a = await FakeSourceKitD.getOrCreate(try AbsolutePath(validating: "/a"), in: registry)
await assertTrue(registry.remove(try AbsolutePath(validating: "/a")) === a)
await assertNil(registry.remove(try AbsolutePath(validating: "/a")))
}
func testRemoveResurrect() async throws {
let registry = SourceKitDRegistry()
@inline(never)
func scope(registry: SourceKitDRegistry) async throws -> UInt32 {
let a = await FakeSourceKitD.getOrCreate(try AbsolutePath(validating: "/a"), in: registry)
await assertTrue(a === FakeSourceKitD.getOrCreate(try AbsolutePath(validating: "/a"), in: registry))
await assertTrue(registry.remove(try AbsolutePath(validating: "/a")) === a)
// Resurrected.
await assertTrue(a === FakeSourceKitD.getOrCreate(try AbsolutePath(validating: "/a"), in: registry))
// Remove again.
await assertTrue(registry.remove(try AbsolutePath(validating: "/a")) === a)
return (a as! FakeSourceKitD).token
}
let id = try await scope(registry: registry)
let a2 = await FakeSourceKitD.getOrCreate(try AbsolutePath(validating: "/a"), in: registry)
XCTAssertNotEqual(id, (a2 as! FakeSourceKitD).token)
}
}
private let nextToken = AtomicUInt32(initialValue: 0)
final class FakeSourceKitD: SourceKitD {
let token: UInt32
var api: sourcekitd_api_functions_t { fatalError() }
var keys: sourcekitd_api_keys { fatalError() }
var requests: sourcekitd_api_requests { fatalError() }
var values: sourcekitd_api_values { fatalError() }
func addNotificationHandler(_ handler: SKDNotificationHandler) { fatalError() }
func removeNotificationHandler(_ handler: SKDNotificationHandler) { fatalError() }
private init() {
token = nextToken.fetchAndIncrement()
}
static func getOrCreate(_ path: AbsolutePath, in registry: SourceKitDRegistry) async -> SourceKitD {
return await registry.getOrAdd(path, create: { Self.init() })
}
public func log(request: SKDRequestDictionary) {}
public func log(response: SKDResponse) {}
public func log(crashedRequest: SKDRequestDictionary, fileContents: String?) {}
public func logRequestCancellation(request: SKDRequestDictionary) {}
}
|