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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2023 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 LanguageServerProtocol
import SKLogging
import SKTestSupport
import SourceKitLSP
import XCTest
final class OnTypeFormattingTests: XCTestCase {
func testOnlyFormatsSpecifiedLine() async throws {
try await SkipUnless.toolchainContainsSwiftFormat()
let testClient = try await TestSourceKitLSPClient()
let uri = DocumentURI(for: .swift)
let positions = testClient.openDocument(
"""
func foo() {
if let SomeReallyLongVar = Some.More.Stuff(), let a = myfunc() {
1️⃣// do stuff
}
}
""",
uri: uri
)
let response = try await testClient.send(
DocumentOnTypeFormattingRequest(
textDocument: TextDocumentIdentifier(uri),
position: positions["1️⃣"],
ch: "\n",
options: FormattingOptions(tabSize: 2, insertSpaces: true)
)
)
let edits = try XCTUnwrap(response)
XCTAssertEqual(
edits,
[
TextEdit(range: Range(positions["1️⃣"]), newText: " ")
]
)
}
func testFormatsFullLineAndDoesNotFormatNextLine() async throws {
try await SkipUnless.toolchainContainsSwiftFormat()
let testClient = try await TestSourceKitLSPClient()
let uri = DocumentURI(for: .swift)
let positions = testClient.openDocument(
"""
func foo() {
1️⃣if let SomeReallyLongVar = 2️⃣ 3️⃣Some.More.Stuff(), let a = 4️⃣ 5️⃣myfunc() 6️⃣{
}
}
""",
uri: uri
)
let response = try await testClient.send(
DocumentOnTypeFormattingRequest(
textDocument: TextDocumentIdentifier(uri),
position: positions["6️⃣"],
ch: "{",
options: FormattingOptions(tabSize: 4, insertSpaces: true)
)
)
let edits = try XCTUnwrap(response)
XCTAssertEqual(
edits,
[
TextEdit(range: Range(positions["1️⃣"]), newText: " "),
TextEdit(range: positions["2️⃣"]..<positions["3️⃣"], newText: ""),
TextEdit(range: positions["4️⃣"]..<positions["5️⃣"], newText: ""),
]
)
}
/// Should not remove empty lines when formatting is triggered on a new empty line.
/// Otherwise could mess up writing code. You'd write {} and try to go into the braces to write more code,
/// only for on-type formatting to immediately close the braces again.
func testDoesNothingWhenInAnEmptyLine() async throws {
try await SkipUnless.toolchainContainsSwiftFormat()
let testClient = try await TestSourceKitLSPClient()
let uri = DocumentURI(for: .swift)
let positions = testClient.openDocument(
"""
func foo() {
if let SomeReallyLongVar = Some.More.Stuff(), let a = myfunc() {
1️⃣
}
}
""",
uri: uri
)
let response = try await testClient.send(
DocumentOnTypeFormattingRequest(
textDocument: TextDocumentIdentifier(uri),
position: positions["1️⃣"],
ch: "\n",
options: FormattingOptions(tabSize: 2, insertSpaces: true)
)
)
let edits = try XCTUnwrap(response)
XCTAssertEqual(
edits,
[]
)
}
}
|