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 85 86 87 88
|
/*
This source file is part of the Swift.org open source project
Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See http://swift.org/LICENSE.txt for license information
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
import TSCBasic
import TSCUtility
import XCTest
public func DiagnosticsEngineTester(
_ engine: DiagnosticsEngine,
ignoreNotes: Bool = false,
file: StaticString = #file,
line: UInt = #line,
result: (DiagnosticsEngineResult) throws -> Void
) {
let engineResult = DiagnosticsEngineResult(engine, ignoreNotes: ignoreNotes)
do {
try result(engineResult)
} catch {
XCTFail("error \(String(describing: error))", file: file, line: line)
}
if !engineResult.uncheckedDiagnostics.isEmpty {
XCTFail("unchecked diagnostics \(engineResult.uncheckedDiagnostics)", file: file, line: line)
}
}
/// Helper to check diagnostics in the engine.
final public class DiagnosticsEngineResult {
fileprivate var uncheckedDiagnostics: [Diagnostic]
init(_ engine: DiagnosticsEngine, ignoreNotes: Bool = false) {
self.uncheckedDiagnostics = engine.diagnostics
}
public func check(
diagnostic: StringPattern,
checkContains: Bool = false,
behavior: Diagnostic.Behavior,
location: String? = nil,
file: StaticString = #file,
line: UInt = #line
) {
guard !uncheckedDiagnostics.isEmpty else {
return XCTFail("No diagnostics left to check", file: file, line: line)
}
let location = location ?? UnknownLocation.location.description
let theDiagnostic = uncheckedDiagnostics.removeFirst()
XCTAssertMatch(theDiagnostic.description, diagnostic, file: file, line: line)
XCTAssertEqual(theDiagnostic.message.behavior, behavior, file: file, line: line)
XCTAssertEqual(theDiagnostic.location.description, location, file: file, line: line)
}
public func checkUnordered(
diagnostic diagnosticPattern: StringPattern,
checkContains: Bool = false,
behavior: Diagnostic.Behavior,
location: String? = nil,
file: StaticString = #file,
line: UInt = #line
) {
guard !uncheckedDiagnostics.isEmpty else {
return XCTFail("No diagnostics left to check", file: file, line: line)
}
let locationDescription = location ?? UnknownLocation.location.description
let matchIndex = uncheckedDiagnostics.firstIndex(where: { diagnostic in
diagnosticPattern ~= diagnostic.description &&
diagnostic.message.behavior == behavior &&
diagnostic.location.description == locationDescription
})
if let index = matchIndex {
uncheckedDiagnostics.remove(at: index)
}
}
}
|