Skip to content

Commit b8b2551

Browse files
committed
Add tests for extract selected code and remove spaces
1 parent 3ac8dca commit b8b2551

File tree

3 files changed

+134
-33
lines changed

3 files changed

+134
-33
lines changed

Core/Sources/XPCShared/Models.swift

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -42,39 +42,7 @@ public struct EditorContent: Codable {
4242
public var usesTabsForIndentation: Bool
4343

4444
public func selectedCode(in selection: Selection) -> String {
45-
let startPosition = selection.start
46-
let endPosition = selection.end
47-
48-
guard startPosition.line >= 0, startPosition.line < lines.count else { return "" }
49-
guard endPosition.line >= 0, endPosition.line < lines.count else { return "" }
50-
guard endPosition.line >= startPosition.line else { return "" }
51-
52-
var code = ""
53-
if startPosition.line == endPosition.line {
54-
let line = lines[startPosition.line]
55-
let startIndex = line.index(line.startIndex, offsetBy: startPosition.character)
56-
let endIndex = line.index(line.startIndex, offsetBy: endPosition.character)
57-
code = String(line[startIndex...endIndex])
58-
} else {
59-
let startLine = lines[startPosition.line]
60-
let startIndex = startLine.index(
61-
startLine.startIndex,
62-
offsetBy: startPosition.character
63-
)
64-
code += String(startLine[startIndex...])
65-
66-
if startPosition.line + 1 < endPosition.line {
67-
for line in lines[startPosition.line + 1...endPosition.line - 1] {
68-
code += line
69-
}
70-
}
71-
72-
let endLine = lines[endPosition.line]
73-
let endIndex = endLine.index(endLine.startIndex, offsetBy: endPosition.character)
74-
code += String(endLine[...endIndex])
75-
}
76-
77-
return code
45+
return XPCShared.selectedCode(in: selection, for: lines)
7846
}
7947
}
8048

@@ -89,3 +57,47 @@ public struct UpdatedContent: Codable {
8957
public var newCursor: CursorPosition?
9058
public var modifications: [Modification]
9159
}
60+
61+
func selectedCode(in selection: EditorContent.Selection, for lines: [String]) -> String {
62+
let startPosition = selection.start
63+
var endPosition = CursorPosition(
64+
line: selection.end.line,
65+
character: selection.end.character - 1
66+
)
67+
68+
guard startPosition.line >= 0, startPosition.line < lines.count else { return "" }
69+
guard startPosition.character >= 0,
70+
startPosition.character < lines[startPosition.line].count else { return "" }
71+
guard endPosition.line >= 0, endPosition.line < lines.count else { return "" }
72+
guard endPosition.line >= startPosition.line else { return "" }
73+
guard endPosition.character >= 0,
74+
endPosition.character < lines[endPosition.line].count else { return "" }
75+
76+
var code = ""
77+
if startPosition.line == endPosition.line {
78+
guard endPosition.character >= startPosition.character else { return "" }
79+
let line = lines[startPosition.line]
80+
let startIndex = line.index(line.startIndex, offsetBy: startPosition.character)
81+
let endIndex = line.index(line.startIndex, offsetBy: endPosition.character)
82+
code = String(line[startIndex...endIndex])
83+
} else {
84+
let startLine = lines[startPosition.line]
85+
let startIndex = startLine.index(
86+
startLine.startIndex,
87+
offsetBy: startPosition.character
88+
)
89+
code += String(startLine[startIndex...])
90+
91+
if startPosition.line + 1 < endPosition.line {
92+
for line in lines[startPosition.line + 1...endPosition.line - 1] {
93+
code += line
94+
}
95+
}
96+
97+
let endLine = lines[endPosition.line]
98+
let endIndex = endLine.index(endLine.startIndex, offsetBy: endPosition.character)
99+
code += String(endLine[...endIndex])
100+
}
101+
102+
return code
103+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import CopilotModel
2+
import XCTest
3+
@testable import Service
4+
@testable import XPCShared
5+
6+
class ExtractSelectedCodeTests: XCTestCase {
7+
func test_empty_selection() {
8+
let selection = EditorContent.Selection(
9+
start: CursorPosition(line: 0, character: 0),
10+
end: CursorPosition(line: 0, character: 0)
11+
)
12+
let lines = ["let foo = 1\n", "let bar = 2\n"]
13+
let result = selectedCode(in: selection, for: lines)
14+
XCTAssertEqual(result, "")
15+
}
16+
17+
func test_single_line_selection() {
18+
let selection = EditorContent.Selection(
19+
start: CursorPosition(line: 0, character: 4),
20+
end: CursorPosition(line: 0, character: 10)
21+
)
22+
let lines = ["let foo = 1\n", "let bar = 2\n"]
23+
let result = selectedCode(in: selection, for: lines)
24+
XCTAssertEqual(result, "foo = ")
25+
}
26+
27+
func test_single_line_selection_at_line_end() {
28+
let selection = EditorContent.Selection(
29+
start: CursorPosition(line: 0, character: 8),
30+
end: CursorPosition(line: 0, character: 11)
31+
)
32+
let lines = ["let foo = 1\n", "let bar = 2\n"]
33+
let result = selectedCode(in: selection, for: lines)
34+
XCTAssertEqual(result, "= 1")
35+
}
36+
37+
func test_multi_line_selection() {
38+
let selection = EditorContent.Selection(
39+
start: CursorPosition(line: 0, character: 4),
40+
end: CursorPosition(line: 1, character: 11)
41+
)
42+
let lines = ["let foo = 1\n", "let bar = 2\n", "let baz = 3\n"]
43+
let result = selectedCode(in: selection, for: lines)
44+
XCTAssertEqual(result, "foo = 1\nlet bar = 2")
45+
}
46+
47+
func test_invalid_selection() {
48+
let selection = EditorContent.Selection(
49+
start: CursorPosition(line: 1, character: 4),
50+
end: CursorPosition(line: 0, character: 10)
51+
)
52+
let lines = ["let foo = 1", "let bar = 2"]
53+
let result = selectedCode(in: selection, for: lines)
54+
XCTAssertEqual(result, "")
55+
}
56+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import XCTest
2+
@testable import Service
3+
4+
class RemoveContinuousSpacesInCodeTests: XCTestCase {
5+
func test_remove_continuous_spaces_in_code_empty_string() {
6+
let input = ""
7+
let expectedOutput = ""
8+
let output = removeContinuousSpaces(from: input)
9+
XCTAssertEqual(output, expectedOutput)
10+
}
11+
12+
func test_remove_continuous_spaces_in_code_blank_string() {
13+
let input = " "
14+
let expectedOutput = ""
15+
let output = removeContinuousSpaces(from: input)
16+
XCTAssertEqual(output, expectedOutput)
17+
}
18+
19+
func test_remove_continuous_spaces() {
20+
let input = "hello world"
21+
let expectedOutput = "hello world"
22+
let output = removeContinuousSpaces(from: input)
23+
XCTAssertEqual(output, expectedOutput)
24+
}
25+
26+
func test_remove_continuous_spaces_without_continuous_spaces() {
27+
let input = "hello world"
28+
let expectedOutput = "hello world"
29+
let output = removeContinuousSpaces(from: input)
30+
XCTAssertEqual(output, expectedOutput)
31+
}
32+
}
33+

0 commit comments

Comments
 (0)