XCTest Specific Matcher

Prefer specific XCTest matchers.

  • Identifier: xct_specific_matcher
  • Enabled by default: No
  • Supports autocorrection: No
  • Kind: idiomatic
  • Analyzer rule: No
  • Minimum Swift compiler version: 5.0.0
  • Default configuration:
    KeyValue
    severity warning
    matchers [one-argument-asserts, two-argument-asserts]

Rationale

Using specific matchers like XCTAssertEqual, XCTAssertNotEqual, XCTAssertTrue, XCTAssertFalse, XCTAssertIdentical and XCTAssertNotIdentical improves code readability and clarity. They more clearly state the intention of the assertion.

Consider for example XCTAssertTrue(foo == bar), which requires two details to grasp: that foo and bar are equal, and that the result of the comparison shall be true. Using XCTAssertEqual(foo, bar) makes it clear that the intention is to check equality, without needing to understand the underlying logic of the comparison.

Non Triggering Examples

XCTAssert(foo
XCTAssertFalse(foo)
XCTAssertTrue(foo)
XCTAssertNil(foo)
XCTAssertNotNil(foo)
XCTAssertEqual(foo, 2)
XCTAssertNotEqual(foo, "false")
XCTAssertEqual(foo, [1, 2, 3, true])
XCTAssertEqual(foo, [1, 2, 3, false])
XCTAssertEqual(foo, [1, 2, 3, nil])
XCTAssertEqual(foo, [true, nil, true, nil])
XCTAssertEqual([1, 2, 3, true], foo)
XCTAssertEqual([1, 2, 3, false], foo)
XCTAssertEqual([1, 2, 3, nil], foo)
XCTAssertEqual([true, nil, true, nil], foo)
XCTAssertEqual(2, foo)
XCTAssertNotEqual("false"), foo)
XCTAssertEqual(false, foo?.bar)
XCTAssertEqual(true, foo?.bar)
XCTAssert(    foo  )
XCTAssertFalse(  foo  )
XCTAssertTrue(  foo  )
XCTAssertNil(  foo  )
XCTAssertNotNil(  foo  )
XCTAssertEqual(  foo  , 2  )
XCTAssertNotEqual(  foo, "false")
XCTAssertEqual(foo?.bar, false)
XCTAssertEqual(foo?.bar, true)
XCTAssertNil(foo?.bar)
XCTAssertNotNil(foo?.bar)
XCTAssertEqual(foo?.bar, 2)
XCTAssertNotEqual(foo?.bar, "false")
XCTAssertEqual(foo?.bar, toto())
XCTAssertEqual(foo?.bar, .toto(.zoo))
XCTAssertEqual(toto(), foo?.bar)
XCTAssertEqual(.toto(.zoo), foo?.bar)
XCTAssert(foo.self == bar)
XCTAssertTrue(type(of: foo) != Int.self)
XCTAssertTrue(a == (1, 3, 5)
XCTAssertIdentical(foo, bar)
XCTAssertNotIdentical(foo, bar)
XCTAssert(foo.self === bar.self)

Triggering Examples

XCTAssertEqual(foo, true)
XCTAssertEqual(foo, false)
XCTAssertEqual(foo, nil)
XCTAssertNotEqual(foo, true)
XCTAssertNotEqual(foo, false)
XCTAssertNotEqual(foo, nil)
XCTAssertEqual(true, foo)
XCTAssertEqual(false, foo)
XCTAssertEqual(nil, foo)
XCTAssertNotEqual(true, foo)
XCTAssertNotEqual(false, foo)
XCTAssertNotEqual(nil, foo)
XCTAssertEqual(foo, true, "toto")
XCTAssertEqual(foo, false, "toto")
XCTAssertEqual(foo, nil, "toto")
XCTAssertNotEqual(foo, true, "toto")
XCTAssertNotEqual(foo, false, "toto")
XCTAssertNotEqual(foo, nil, "toto")
XCTAssertEqual(true, foo, "toto")
XCTAssertEqual(false, foo, "toto")
XCTAssertEqual(nil, foo, "toto")
XCTAssertNotEqual(true, foo, "toto")
XCTAssertNotEqual(false, foo, "toto")
XCTAssertNotEqual(nil, foo, "toto")
XCTAssertEqual(foo,true)
XCTAssertEqual( foo , false )
XCTAssertEqual(  foo  ,  nil  )
XCTAssertEqual(true, [1, 2, 3, true].hasNumbers())
XCTAssertEqual([1, 2, 3, true].hasNumbers(), true)
XCTAssertEqual(foo?.bar, nil)
XCTAssertNotEqual(foo?.bar, nil)
XCTAssertEqual(nil, true)
XCTAssertEqual(nil, false)
XCTAssertEqual(true, nil)
XCTAssertEqual(false, nil)
XCTAssertEqual(nil, nil)
XCTAssertEqual(true, true)
XCTAssertEqual(false, false)
XCTAssert(foo == bar)
XCTAssertTrue(   foo  ==   bar  )
XCTAssertFalse(1 == foo)
XCTAssert(foo == bar, "toto")
XCTAssert(foo != bar)
XCTAssertTrue(   foo  !=   bar  )
XCTAssertFalse(1 != foo)
XCTAssert(foo != bar, "toto")
XCTAssert(foo === bar)
XCTAssertTrue(   foo  ===   bar  )
XCTAssertFalse(bar === foo)
XCTAssert(foo === bar, "toto")
XCTAssert(foo !== bar)
XCTAssertTrue(   foo  !==   bar  )
XCTAssertFalse(bar !== foo)
XCTAssert(foo !== bar, "toto")
XCTAssert(  foo   ==  nil)
XCTAssert(nil == foo
XCTAssertTrue(  foo   !=  nil)
XCTAssertFalse(nil != foo
XCTAssert(foo == nil, "toto")