Files
SwiftLint/Tests/BuiltInRulesTests/LineLengthRuleTests.swift
2025-09-08 19:33:57 +00:00

234 lines
9.9 KiB
Swift

@testable import SwiftLintBuiltInRules
import TestHelpers
final class LineLengthRuleTests: SwiftLintTestCase {
private static let longString = String(repeating: "a", count: 121)
private let longFunctionDeclarations = [
Example("""
public func superDuperLongFunctionDeclaration(a: String, b: String, \
c: String, d: String, e: String, f: String, g: String, h: String, i: String, \
j: String, k: String, l: String, m: String, n: String, o: String, p: String, \
q: String, r: String, s: String, t: String, u: String, v: String, w: String, \
x: String, y: String, z: String) {}
"""),
Example("""
func superDuperLongFunctionDeclaration(a: String, b: String, \
c: String, d: String, e: String, f: String, g: String, h: String, i: String, \
j: String, k: String, l: String, m: String, n: String, o: String, p: String, \
q: String, r: String, s: String, t: String, u: String, v: String, w: String, \
x: String, y: String, z: String) {}
"""),
Example("""
struct S {
public init(a: String, b: String, c: String, d: String, e: String, f: String, \
g: String, h: String, i: String, j: String, k: String, l: String, \
m: String, n: String, o: String, p: String, q: String, r: String, \
s: String, t: String, u: String, v: String, w: String, x: String, \
y: String, z: String) throws {
// ...
}
}
"""),
Example("""
struct S {
subscript(a: String, b: String, c: String, d: String, e: String, f: String, \
g: String, h: String, i: String, j: String, k: String, l: String, \
m: String, n: String, o: String, p: String, q: String, r: String, \
s: String, t: String, u: String, v: String, w: String, x: String, \
y: String, z: String) -> Int {
// ...
return 0
}
}
"""),
]
private let longComment = Example(String(repeating: "/", count: 121) + "\n")
private let longBlockComment = Example("/*" + String(repeating: " ", count: 121) + "*/\n")
private let longRealBlockComment = Example("""
/*
\(LineLengthRuleTests.longString)
*/
""")
private let declarationWithTrailingLongComment = Example("let foo = 1 " + String(repeating: "/", count: 121) + "\n")
private let interpolatedString = Example("print(\"\\(value)" + String(repeating: "A", count: 113) + "\" )\n")
private let plainString = Example("print(\"" + LineLengthRuleTests.longString + ")\"\n")
private let multilineString = Example("""
let multilineString = \"\"\"
\(LineLengthRuleTests.longString)
\"\"\"
""")
private let tripleStringSingleLine = Example(
"let tripleString = \"\"\"\(LineLengthRuleTests.longString)\"\"\"\n"
)
private let poundStringSingleLine = Example("let poundString = #\"\(LineLengthRuleTests.longString)\"#\n")
private let multilineStringWithExpression = Example("""
let multilineString = \"\"\"
\(LineLengthRuleTests.longString)
\"\"\"; let a = 1
""")
private let multilineStringWithNewlineExpression = Example("""
let multilineString = \"\"\"
\(LineLengthRuleTests.longString)
\"\"\"
; let a = 1
""")
private let multilineStringFail = Example("""
let multilineString = "A" +
"\(LineLengthRuleTests.longString)"
""")
private let multilineStringWithFunction = Example("""
let multilineString = \"\"\"
\(LineLengthRuleTests.longString)
\"\"\".functionCall()
""")
func testLineLength() {
verifyRule(LineLengthRule.description, commentDoesntViolate: false, stringDoesntViolate: false)
}
func testLineLengthWithIgnoreFunctionDeclarationsEnabled() {
let baseDescription = LineLengthRule.description
let nonTriggeringExamples = baseDescription.nonTriggeringExamples + longFunctionDeclarations
let description = baseDescription.with(nonTriggeringExamples: nonTriggeringExamples)
verifyRule(
description,
ruleConfiguration: ["ignores_function_declarations": true],
commentDoesntViolate: false,
stringDoesntViolate: false
)
}
func testLineLengthWithIgnoreCommentsEnabled() {
let baseDescription = LineLengthRule.description
let triggeringExamples = longFunctionDeclarations + [declarationWithTrailingLongComment]
let nonTriggeringExamples = [longComment, longBlockComment, longRealBlockComment]
let description = baseDescription.with(nonTriggeringExamples: nonTriggeringExamples)
.with(triggeringExamples: triggeringExamples)
verifyRule(description, ruleConfiguration: ["ignores_comments": true],
commentDoesntViolate: false, stringDoesntViolate: false, skipCommentTests: true)
}
func testLineLengthWithIgnoreURLsEnabled() {
let url = "https://github.com/realm/SwiftLint"
let triggeringLines = [Example(String(repeating: "/", count: 121) + "\(url)\n")]
let nonTriggeringLines = [
Example("\(url) " + String(repeating: "/", count: 118) + " \(url)\n"),
Example("\(url)/" + String(repeating: "a", count: 120)),
]
let baseDescription = LineLengthRule.description
let nonTriggeringExamples = baseDescription.nonTriggeringExamples + nonTriggeringLines
let triggeringExamples = baseDescription.triggeringExamples + triggeringLines
let description = baseDescription.with(nonTriggeringExamples: nonTriggeringExamples)
.with(triggeringExamples: triggeringExamples)
verifyRule(description, ruleConfiguration: ["ignores_urls": true],
commentDoesntViolate: false, stringDoesntViolate: false)
}
func testLineLengthWithIgnoreInterpolatedStringsTrue() {
let triggeringLines = [plainString]
let nonTriggeringLines = [interpolatedString]
let baseDescription = LineLengthRule.description
let nonTriggeringExamples = baseDescription.nonTriggeringExamples + nonTriggeringLines
let triggeringExamples = baseDescription.triggeringExamples + triggeringLines
let description = baseDescription.with(nonTriggeringExamples: nonTriggeringExamples)
.with(triggeringExamples: triggeringExamples)
verifyRule(description, ruleConfiguration: ["ignores_interpolated_strings": true],
commentDoesntViolate: false, stringDoesntViolate: false)
}
func testLineLengthWithIgnoreMultilineStringsTrue() {
let triggeringLines = [
multilineStringFail,
tripleStringSingleLine,
poundStringSingleLine,
]
let nonTriggeringLines = [
multilineString,
multilineStringWithExpression,
multilineStringWithNewlineExpression,
multilineStringWithFunction,
]
let baseDescription = LineLengthRule.description
let nonTriggeringExamples = baseDescription.nonTriggeringExamples + nonTriggeringLines
let triggeringExamples = baseDescription.triggeringExamples + triggeringLines
let description = baseDescription.with(nonTriggeringExamples: nonTriggeringExamples)
.with(triggeringExamples: triggeringExamples)
verifyRule(description, ruleConfiguration: ["ignores_multiline_strings": true],
commentDoesntViolate: false, stringDoesntViolate: false)
}
func testLineLengthWithIgnoreInterpolatedStringsFalse() {
let triggeringLines = [plainString, interpolatedString]
let baseDescription = LineLengthRule.description
let nonTriggeringExamples = baseDescription.nonTriggeringExamples
let triggeringExamples = baseDescription.triggeringExamples + triggeringLines
let description = baseDescription.with(nonTriggeringExamples: nonTriggeringExamples)
.with(triggeringExamples: triggeringExamples)
verifyRule(description, ruleConfiguration: ["ignores_interpolated_strings": false],
commentDoesntViolate: false, stringDoesntViolate: false)
}
func testLineLengthWithExcludedLinesPatterns() {
let nonTriggeringLines = [plainString, interpolatedString]
let baseDescription = LineLengthRule.description
let nonTriggeringExamples = baseDescription.nonTriggeringExamples + nonTriggeringLines
let triggeringExamples = baseDescription.triggeringExamples
let description = baseDescription
.with(nonTriggeringExamples: nonTriggeringExamples)
.with(triggeringExamples: triggeringExamples)
verifyRule(
description,
ruleConfiguration: ["excluded_lines_patterns": ["^print"]],
commentDoesntViolate: false,
stringDoesntViolate: false
)
}
func testLineLengthWithEmptyExcludedLinesPatterns() {
let triggeringLines = [plainString, interpolatedString]
let baseDescription = LineLengthRule.description
let nonTriggeringExamples = baseDescription.nonTriggeringExamples
let triggeringExamples = baseDescription.triggeringExamples + triggeringLines
let description = baseDescription
.with(nonTriggeringExamples: nonTriggeringExamples)
.with(triggeringExamples: triggeringExamples)
verifyRule(
description,
ruleConfiguration: ["excluded_lines_patterns": []],
commentDoesntViolate: false,
stringDoesntViolate: false
)
}
}