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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
import _SwiftFormatTestSupport
@_spi(Rules) import SwiftFormat
final class UseEarlyExitsTests: LintOrFormatRuleTestCase {
func testBasicIfElse() {
// In this and other tests, the indentation of the true block in the expected output is
// explicitly incorrect because this formatting rule does not fix it up with the assumption that
// the pretty-printer will handle it.
assertFormatting(
UseEarlyExits.self,
input: """
1️⃣if condition {
trueBlock()
} else {
falseBlock()
return
}
""",
expected: """
guard condition else {
falseBlock()
return
}
trueBlock()
""",
findings: [
FindingSpec("1️⃣", message: "replace this 'if/else' block with a 'guard' statement containing the early exit"),
]
)
}
func testIfElseWithBothEarlyExiting() {
assertFormatting(
UseEarlyExits.self,
input: """
1️⃣if condition {
trueBlock()
return
} else {
falseBlock()
return
}
""",
expected: """
guard condition else {
falseBlock()
return
}
trueBlock()
return
""",
findings: [
FindingSpec("1️⃣", message: "replace this 'if/else' block with a 'guard' statement containing the early exit"),
]
)
}
func testElseIfsDoNotChange() {
let input = """
if condition {
trueBlock()
} else if otherCondition {
otherBlock()
return
}
"""
assertFormatting(UseEarlyExits.self, input: input, expected: input, findings: [])
}
func testElsesAtEndOfElseIfsDoNotChange() {
let input = """
if condition {
trueBlock()
} else if otherCondition {
otherBlock()
return
} else {
falseBlock()
return
}
"""
assertFormatting(UseEarlyExits.self, input: input, expected: input, findings: [])
}
func testComplex() {
assertFormatting(
UseEarlyExits.self,
input: """
func discombobulate(_ values: [Int]) throws -> Int {
// Comment 1
/*Comment 2*/ 1️⃣if let first = values.first {
// Comment 3
/// Doc comment
2️⃣if first >= 0 {
// Comment 4
var result = 0
for value in values {
result += invertedCombobulatorFactor(of: value)
}
return result
} else {
print("Can't have negative energy")
throw DiscombobulationError.negativeEnergy
}
} else {
print("The array was empty")
throw DiscombobulationError.arrayWasEmpty
}
}
""",
expected: """
func discombobulate(_ values: [Int]) throws -> Int {
// Comment 1
/*Comment 2*/ guard let first = values.first else {
print("The array was empty")
throw DiscombobulationError.arrayWasEmpty
}
// Comment 3
/// Doc comment
guard first >= 0 else {
print("Can't have negative energy")
throw DiscombobulationError.negativeEnergy
}
// Comment 4
var result = 0
for value in values {
result += invertedCombobulatorFactor(of: value)
}
return result
}
""",
findings: [
FindingSpec("1️⃣", message: "replace this 'if/else' block with a 'guard' statement containing the early exit"),
FindingSpec("2️⃣", message: "replace this 'if/else' block with a 'guard' statement containing the early exit"),
]
)
}
}
|