diff --git a/Source/SwiftLintFramework/Rules/XCTSpecificMatcherRule.swift b/Source/SwiftLintFramework/Rules/XCTSpecificMatcherRule.swift index c0168830d..febe74a8f 100644 --- a/Source/SwiftLintFramework/Rules/XCTSpecificMatcherRule.swift +++ b/Source/SwiftLintFramework/Rules/XCTSpecificMatcherRule.swift @@ -50,7 +50,7 @@ public struct XCTSpecificMatcherRule: ASTRule, OptInRule, ConfigurationProviderR let body = file.contents.bridge().substringWithByteRange(start: paramOffset, length: paramLength) else { return nil } - return ["false", "true", "nil"].contains(body) ? body : nil + return protectedArguments.contains(body) ? body : nil } // If the call has "protected" words, provides suggestion based on the first one. @@ -65,6 +65,10 @@ public struct XCTSpecificMatcherRule: ASTRule, OptInRule, ConfigurationProviderR reason: "Prefer the specific matcher '\(reason)' instead.") ] } + + private let protectedArguments: Set = [ + "false", "true", "nil" + ] } private enum XCTestMatcher: String { diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 0ce5f208f..5e3dd2ab6 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -1333,6 +1333,20 @@ extension WeakDelegateRuleTests { extension XCTFailMessageRuleTests { static var allTests: [(String, (XCTFailMessageRuleTests) -> () throws -> Void)] = [ ("testWithDefaultConfiguration", testWithDefaultConfiguration) +} + +extension XCTSpecificMatcherRuleTests { + static var allTests: [(String, (XCTSpecificMatcherRuleTests) -> () throws -> Void)] = [ + ("testRule", testRule), + ("testEqualTrue", testEqualTrue), + ("testEqualFalse", testEqualFalse), + ("testEqualNil", testEqualNil), + ("testNotEqualTrue", testNotEqualTrue), + ("testNotEqualFalse", testNotEqualFalse), + ("testNotEqualNil", testNotEqualNil), + ("testEqualNilNil", testEqualNilNil), + ("testEqualTrueTrue", testEqualTrueTrue), + ("testEqualFalseFalse", testEqualFalseFalse) ] } diff --git a/Tests/SwiftLintFrameworkTests/XCTSpecificMatcherRuleTests.swift b/Tests/SwiftLintFrameworkTests/XCTSpecificMatcherRuleTests.swift index 7253081bc..dd3e4402e 100644 --- a/Tests/SwiftLintFrameworkTests/XCTSpecificMatcherRuleTests.swift +++ b/Tests/SwiftLintFrameworkTests/XCTSpecificMatcherRuleTests.swift @@ -15,6 +15,50 @@ class XCTSpecificMatcherRuleTests: XCTestCase { verifyRule(XCTSpecificMatcherRule.description) } + // MARK: - Reasons + + func testEqualTrue() { + let string = "XCTAssertEqual(a, true)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertTrue' instead.") + } + + func testEqualFalse() { + let string = "XCTAssertEqual(a, false)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertFalse' instead.") + } + + func testEqualNil() { + let string = "XCTAssertEqual(a, nil)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertNil' instead.") + } + + func testNotEqualTrue() { + let string = "XCTAssertNotEqual(a, true)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertFalse' instead.") + } + + func testNotEqualFalse() { + let string = "XCTAssertNotEqual(a, false)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertTrue' instead.") + } + + func testNotEqualNil() { + let string = "XCTAssertNotEqual(a, nil)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertNotNil' instead.") + } + // MARK: - Additional Tests func testEqualNilNil() { @@ -38,6 +82,27 @@ class XCTSpecificMatcherRuleTests: XCTestCase { XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertFalse' instead.") } + func testNotEqualNilNil() { + let string = "XCTAssertNotEqual(nil, nil)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertNotNil' instead.") + } + + func testNotEqualTrueTrue() { + let string = "XCTAssertNotEqual(true, true)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertFalse' instead.") + } + + func testNotEqualFalseFalse() { + let string = "XCTAssertNotEqual(false, false)" + let violations = self.violations(string) + XCTAssertEqual(violations.count, 1) + XCTAssertEqual(violations.first!.reason, "Prefer the specific matcher 'XCTAssertTrue' instead.") + } + private func violations(_ string: String) -> [StyleViolation] { let config = makeConfig(nil, XCTSpecificMatcherRule.description.identifier)! return SwiftLintFrameworkTests.violations(string, config: config)