Files
SwiftLint/Tests/BuiltInRulesTests/ModifierOrderTests.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

496 lines
16 KiB
Swift

import TestHelpers
import Testing
@testable import SwiftLintBuiltInRules
// swiftlint:disable file_length
@Suite(.rulesRegistered)
struct ModifierOrderTests { // swiftlint:disable:this type_body_length
@Test
func attributeTypeMethod() {
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [
Example("""
public class SomeClass {
class public func someFunc() {}
}
"""),
Example("""
public class SomeClass {
static public func someFunc() {}
}
"""),
])
.with(triggeringExamples: [
Example("""
public class SomeClass {
public class func someFunc() {}
}
"""),
Example("""
public class SomeClass {
public static func someFunc() {}
}
"""),
])
.with(corrections: [:])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["typeMethods", "acl"]])
}
@Test
func rightOrderedModifierGroups() {
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [
Example("public protocol Foo: class {}\n" +
"public weak internal(set) var bar: Foo? \n"),
Example("open final class Foo {" +
" fileprivate static func bar() {} \n" +
" open class func barFoo() {} }"),
Example("public struct Foo {" +
" private mutating func bar() {} }"),
])
.with(triggeringExamples: [
Example("public protocol Foo: class {} \n" +
"public internal(set) weak var bar: Foo? \n"),
Example("final public class Foo {" +
" static fileprivate func bar() {} \n" +
" class open func barFoo() {} }"),
Example("public struct Foo {" +
" mutating private func bar() {} }"),
])
.with(corrections: [:])
verifyRule(
descriptionOverride,
ruleConfiguration: [
"preferred_modifier_order": [
"acl",
"typeMethods",
"owned",
"setterACL",
"final",
"mutators",
"override",
],
]
)
}
@Test
func atPrefixedGroup() { // swiftlint:disable:this function_body_length
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [
Example(#"""
class Foo {
@objc
internal var bar: String {
return "foo"
}
}
class Bar: Foo {
@objc
override internal var bar: String {
return "bar"
}
}
"""#),
Example("""
@objcMembers
public final class Bar {}
"""),
Example("""
class Foo {
@IBOutlet internal weak var bar: UIView!
}
"""),
Example("""
class Foo {
@IBAction internal func bar() {}
}
"""),
Example("""
class Bar: Foo {
@IBAction override internal func bar() {}
}
"""),
Example(#"""
public class Foo {
@NSCopying public final var foo:NSString = "s"
}
"""#),
Example(#"""
public class Foo {
@NSCopying public final var foo: NSString
}
"""#),
])
.with(triggeringExamples: [
Example(#"""
class Foo {
@objc
internal var bar: String {
return "foo"
}
}
class Bar: Foo {
@objc
internal override var bar: String {
return "bar"
}
}
"""#),
Example("""
@objcMembers
final public class Bar {}
"""),
Example("""
class Foo {
@IBOutlet weak internal var bar: UIView!
}
"""),
Example("""
class Foo {
@IBAction internal func bar() {}
}
class Bar: Foo {
@IBAction internal override func bar() {}
}
"""),
Example(#"""
public class Foo {
@NSCopying final public var foo:NSString = "s"
}
"""#),
Example("""
public class Foo {
@NSManaged final public var foo: NSString
}
"""),
])
.with(corrections: [:])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["override", "acl", "owned", "final"]])
}
@Test
func nonSpecifiedModifiersDontInterfere() {
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [
Example("""
class Foo {
weak final override private var bar: UIView?
}
"""),
Example("""
class Foo {
final weak override private var bar: UIView?
}
"""),
Example("""
class Foo {
final override weak private var bar: UIView?
}
"""),
Example("""
class Foo {
final override private weak var bar: UIView?
}
"""),
])
.with(triggeringExamples: [
Example("""
class Foo {
weak override final private var bar: UIView?
}
"""),
Example("""
class Foo {
override weak final private var bar: UIView?
}
"""),
Example("""
class Foo {
override final weak private var bar: UIView?
}
"""),
Example("""
class Foo {
override final private weak var bar: UIView?
}
"""),
])
.with(corrections: [:])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["final", "override", "acl"]])
}
@Test
func correctionsAreAppliedCorrectly() { // swiftlint:disable:this function_body_length
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [], triggeringExamples: [])
.with(corrections: [
Example("""
class Foo {
private final override var bar: UIView?
}
"""):
Example("""
class Foo {
final override private var bar: UIView?
}
"""),
Example("""
class Foo {
private final var bar: UIView?
}
"""):
Example("""
class Foo {
final private var bar: UIView?
}
"""),
Example("""
class Foo {
class private final var bar: UIView?
}
"""):
Example("""
class Foo {
final private class var bar: UIView?
}
"""),
Example("""
class Foo {
@objc
private
class
final
override
var bar: UIView?
}
"""):
Example("""
class Foo {
@objc
final
override
private
class
var bar: UIView?
}
"""),
Example("""
private final class Foo {}
"""):
Example("""
final private class Foo {}
"""),
])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["final", "override", "acl", "typeMethods"]])
}
@Test
func correctionsAreNotAppliedToIrrelevantModifier() {
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [], triggeringExamples: [])
.with(corrections: [
Example("""
class Foo {
weak class final var bar: UIView?
}
"""):
Example("""
class Foo {
weak final class var bar: UIView?
}
"""),
Example("""
class Foo {
static weak final var bar: UIView?
}
"""):
Example("""
class Foo {
final static weak var bar: UIView?
}
"""),
Example("""
class Foo {
class final weak var bar: UIView?
}
"""):
Example("""
class Foo {
final class weak var bar: UIView?
}
"""),
Example("""
class Foo {
@objc
private private(set) class final var bar: UIView?
}
"""):
Example("""
class Foo {
@objc
final private private(set) class var bar: UIView?
}
"""),
Example("""
class Foo {
var bar: UIView?
}
"""):
Example("""
class Foo {
var bar: UIView?
}
"""),
])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["final", "override", "acl", "typeMethods"]])
}
@Test
func typeMethodClassCorrection() {
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [], triggeringExamples: [])
.with(corrections: [
Example("""
private final class Foo {}
"""):
Example("""
final private class Foo {}
"""),
Example("""
public protocol Foo: class {}\n
"""):
Example("""
public protocol Foo: class {}\n
"""),
])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["final", "typeMethods", "acl"]])
}
@Test
func violationMessage() {
let ruleID = ModifierOrderRule.identifier
guard let config = makeConfig(["preferred_modifier_order": ["acl", "final"]], ruleID) else {
Testing.Issue.record("Failed to create configuration")
return
}
let allViolations = violations(Example("final public var foo: String"), config: config)
let modifierOrderRuleViolation = allViolations.first { $0.ruleIdentifier == ruleID }
if let violation = modifierOrderRuleViolation {
#expect(violation.reason == "public modifier should come before final")
} else {
Testing.Issue.record("A modifier order violation should have been triggered!")
}
}
@Test
func isolationModifierOrder() {
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [
Example("""
@MainActor
class Foo {
nonisolated public func bar() {}
}
"""),
Example("""
actor MyActor: CustomStringConvertible {
nonisolated var description: String {
"MyActor instance"
}
}
"""),
Example("""
class RegularClass {
@MainActor public func bar() {}
}
"""),
])
.with(triggeringExamples: [
Example("""
@MainActor
class Foo {
public nonisolated func bar() {}
}
"""),
Example("""
@MainActor
class RegularClass {
private nonisolated func heavyWork() {}
}
"""),
])
.with(corrections: [
Example("""
@MainActor
class Foo {
public nonisolated func bar() {}
}
"""):
Example("""
@MainActor
class Foo {
nonisolated public func bar() {}
}
"""),
])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["override", "isolation", "acl", "final"]])
}
@Test
func isolationModifierCustomOrder() {
let descriptionOverride = ModifierOrderRule.description
.with(nonTriggeringExamples: [
Example("""
@MainActor
class Foo {
public nonisolated final func bar() {}
}
"""),
])
.with(triggeringExamples: [
Example("""
@MainActor
class Foo {
nonisolated public func bar() {}
}
"""),
])
.with(corrections: [
Example("""
@MainActor
class Foo {
nonisolated public func bar() {}
}
"""):
Example("""
@MainActor
class Foo {
public nonisolated func bar() {}
}
"""),
])
verifyRule(descriptionOverride,
ruleConfiguration: ["preferred_modifier_order": ["override", "acl", "isolation", "final"]])
}
}