Files
SwiftLint/Tests/BuiltInRulesTests/ExplicitTypeInterfaceRuleTests.swift
Danny Mösch 15b285527a Separate built-in rule tests from framework tests (#5924)
* Short names for test modules
* Lint plugins and `Package.swift` in integration tests
* Simplify and merge file groups in Bazel
* Move common functions to `TestHelpers`
2024-12-30 12:26:46 +01:00

239 lines
8.3 KiB
Swift

@testable import SwiftLintBuiltInRules
import TestHelpers
final class ExplicitTypeInterfaceRuleTests: SwiftLintTestCase {
func testLocalVars() {
let nonTriggeringExamples = [
Example("func foo() {\nlet intVal: Int = 1\n}"),
Example("""
func foo() {
bar {
let x: Int = 1
}
}
"""),
]
let triggeringExamples = [
Example("func foo() {\nlet ↓intVal = 1\n}"),
Example("""
func foo() {
bar {
let ↓x = 1
}
}
"""),
]
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description)
}
func testExcludeLocalVars() {
let nonTriggeringExamples = ExplicitTypeInterfaceRule.description.nonTriggeringExamples + [
Example("func foo() {\nlet intVal = 1\n}")
]
let triggeringExamples = ExplicitTypeInterfaceRule.description.triggeringExamples
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description, ruleConfiguration: ["excluded": ["local"]])
}
func testExcludeClassVars() {
let nonTriggeringExamples = ExplicitTypeInterfaceRule.description.nonTriggeringExamples + [
Example("class Foo {\n static var myStaticVar = 0\n}\n"),
Example("class Foo {\n static let myStaticLet = 0\n}\n"),
]
let triggeringExamples: [Example] = [
Example("class Foo {\n var ↓myVar = 0\n\n}\n"),
Example("class Foo {\n let ↓myLet = 0\n\n}\n"),
Example("class Foo {\n class var ↓myClassVar = 0\n}\n"),
]
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description, ruleConfiguration: ["excluded": ["static"]])
}
func testAllowRedundancy() {
let nonTriggeringExamples: [Example] = [
Example("class Foo {\n var myVar: Int? = 0\n}\n"),
Example("class Foo {\n let myVar: Int? = 0\n}\n"),
Example("class Foo {\n static var myVar: Int? = 0\n}\n"),
Example("class Foo {\n class var myVar: Int? = 0\n}\n"),
Example("class Foo {\n static let shared = Foo()\n}\n"),
Example("class Foo {\n let myVar = Int(0)\n}\n"),
Example("class Foo {\n let myVar = Set<Int>(0)\n}\n"),
Example("class Foo {\n let regex = try! NSRegularExpression(pattern: \".*\")\n}\n"),
Example("class Foo {\n let regex = try? NSRegularExpression(pattern: \".*\")\n}\n"),
Example("class Foo {\n let array = [String]()\n}\n"),
Example("class Foo {\n let dict = [String: String]()\n}\n"),
Example("class Foo {\n let dict = [String: [String: Array<String>]]()\n}\n"),
Example("class Foo {\n let l10n = L10n.Communication.self\n}\n"),
]
let triggeringExamples: [Example] = [
Example("class Foo {\n var ↓myVar = 0\n\n}\n"),
Example("class Foo {\n let ↓myLet = 0\n\n}\n"),
Example("class Foo {\n static var ↓myStaticVar = 0\n}\n"),
Example("class Foo {\n class var ↓myClassVar = 0\n}\n"),
Example("class Foo {\n let ↓array = [\"foo\", \"bar\"]\n}\n"),
Example("class Foo {\n let ↓dict = [\"foo\": \"bar\"]\n}\n"),
]
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description, ruleConfiguration: ["allow_redundancy": true])
}
func testEmbeddedInStatements() {
let nonTriggeringExamples = [
Example("""
func foo() {
var bar: String?
guard let strongBar = bar else {
return
}
}
"""),
Example("""
struct SomeError: Error {}
var error: Error?
switch error {
case let error as SomeError: break
default: break
}
"""),
]
let triggeringExamples = ExplicitTypeInterfaceRule.description.triggeringExamples
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description)
}
func testCaptureGroup() {
let nonTriggeringExamples = [
Example("""
var k: Int = 0
_ = { [weak k] in
print(k)
}
"""),
Example("""
var k: Int = 0
_ = { [unowned k] in
print(k)
}
"""),
Example("""
class Foo {
func bar() {
var k: Int = 0
_ = { [weak self, weak k] in
guard let strongSelf = self else { return }
}
}
}
"""),
]
let triggeringExamples = ExplicitTypeInterfaceRule.description.triggeringExamples
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description)
}
func testFastEnumerationDeclaration() {
let nonTriggeringExamples = [
Example("""
func foo() {
let elements: [Int] = [1, 2]
for element in elements {}
}
"""),
Example("""
func foo() {
let elements: [Int] = [1, 2]
for (index, element) in elements.enumerated() {}
}
"""),
]
let triggeringExamples = ExplicitTypeInterfaceRule.description.triggeringExamples
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description)
}
func testSwitchCaseDeclarations() {
let nonTriggeringExamples = [
Example("""
enum Foo {
case failure(Any)
case success(Any)
}
func bar() {
let foo: Foo = .success(1)
switch foo {
case .failure(let error):
let bar: Int = 1
case .success(let result):
let bar: Int = 2
}
}
"""),
Example("""
enum Foo {
case failure(Any, Any)
}
func foo() {
switch foo {
case var (x, y): break
}
}
"""),
]
let triggeringExamples = [
Example("""
enum Foo {
case failure(Any)
case success(Any)
}
func bar() {
let foo: Foo = .success(1)
switch foo {
case .failure(let error): let ↓fooBar = 1
case .success(let result): let ↓fooBar = 1
}
}
"""),
Example("""
enum Foo {
case failure(Any, Any)
}
func foo() {
let foo: Foo = .failure(1, 1)
switch foo {
case var .failure(x, y): let ↓fooBar = 1
default: let ↓fooBar = 1
}
}
"""),
]
let description = ExplicitTypeInterfaceRule.description
.with(triggeringExamples: triggeringExamples)
.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(description)
}
}