Files
SwiftLint/Tests/BuiltInRulesTests/ExplicitTypeInterfaceRuleTests.swift
Danny Mösch ac2eda6732 Adopt Swift Testing
# Conflicts:
#	Tests/BuiltInRulesTests/FileHeaderRuleTests.swift
#	Tests/BuiltInRulesTests/FileNameNoSpaceRuleTests.swift
#	Tests/BuiltInRulesTests/IndentationWidthRuleTests.swift
#	Tests/CoreTests/RegexConfigurationTests.swift
#	Tests/CoreTests/SwiftLintFileTests.swift
#	Tests/FileSystemAccessTests/BaselineTests.swift
#	Tests/FileSystemAccessTests/ConfigurationTests+Mock.swift
#	Tests/FileSystemAccessTests/ConfigurationTests.swift
#	Tests/FileSystemAccessTests/GlobTests.swift
#	Tests/FileSystemAccessTests/MultipleConfigurationsTests.swift
#	Tests/FileSystemAccessTests/ReporterTests.swift
#	Tests/FileSystemAccessTests/SourceKitCrashTests.swift
#	Tests/FrameworkTests/CustomRulesTests.swift
#	Tests/FrameworkTests/LinterCacheTests.swift
#	Tests/FrameworkTests/RuleConfigurationTests.swift
#	Tests/FrameworkTests/SwiftVersionTests.swift
#	Tests/GeneratedTests/GeneratedTests_02.swift
#	Tests/GeneratedTests/GeneratedTests_03.swift
#	Tests/GeneratedTests/GeneratedTests_04.swift
#	Tests/GeneratedTests/GeneratedTests_05.swift
#	Tests/GeneratedTests/GeneratedTests_06.swift
#	Tests/GeneratedTests/GeneratedTests_07.swift
#	Tests/GeneratedTests/GeneratedTests_08.swift
#	Tests/GeneratedTests/GeneratedTests_09.swift
#	Tests/GeneratedTests/GeneratedTests_10.swift
#	Tests/IntegrationTests/ConfigPathResolutionTests.swift
#	Tests/IntegrationTests/IntegrationTests.swift
#	Tests/TestHelpers/TestHelpers.swift
2026-06-06 11:07:04 +02:00

250 lines
8.3 KiB
Swift

import TestHelpers
import Testing
@testable import SwiftLintBuiltInRules
@Suite(.rulesRegistered)
struct ExplicitTypeInterfaceRuleTests {
@Test
func localVars() {
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)
}
@Test
func excludeLocalVars() {
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"]])
}
@Test
func excludeClassVars() {
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"]])
}
@Test
func allowRedundancy() {
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])
}
@Test
func embeddedInStatements() {
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)
}
@Test
func captureGroup() {
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)
}
@Test
func fastEnumerationDeclaration() {
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)
}
@Test
func switchCaseDeclarations() {
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)
}
}