Sourcery icon indicating copy to clipboard operation
Sourcery copied to clipboard

[BUG] Generated AutoMockable compilation issues

Open rokridi opened this issue 1 year ago • 1 comments

Hello 👋

The current AutoMockable.stencil has some issues that related to generating mocks for methods. If a closure contains multiple existential parameters then the corresponding generated code will not compile due to misplaced parentheses.

Example:

protocol TotoProtocol {
  func execute(completion: ((any StubWithSomeNameProtocol)?, any StubWithSomeNameProtocol) -> (any StubWithSomeNameProtocol)?)
}

Result:

class TotoProtocolMock: TotoProtocol {
  //MARK: - execute

  var executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCallsCount = 0
  var executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCalled: Bool {
    return executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCallsCount > 0
  }
  var executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidClosure: ((((any StubWithSomeNameProtocol)?, (any StubWithSomeNameProtocol) -> (any StubWithSomeNameProtocol)?) -> Void)?

  func execute(completion: ((any StubWithSomeNameProtocol)?, (any StubWithSomeNameProtocol) -> (any StubWithSomeNameProtocol)?) {
    executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCallsCount += 1
    executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidClosure?(completion)
  }
}

Expected:

class TotoProtocolMock: TotoProtocol {

  //MARK: - execute

  var executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCallsCount = 0
  var executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCalled: Bool {
    return executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCallsCount > 0
  }
  var executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidClosure: ((((any StubWithSomeNameProtocol)? ,any StubWithSomeNameProtocol) -> (any StubWithSomeNameProtocol)?) -> Void)?

  func execute(completion: ((any StubWithSomeNameProtocol)?, any StubWithSomeNameProtocol) -> (any StubWithSomeNameProtocol)?) {
    executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidCallsCount += 1
    executeCompletionAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolAnyStubWithSomeNameProtocolVoidClosure?(completion)
  }
}

rokridi avatar Jan 25 '24 15:01 rokridi

This PR should fix the issue

rokridi avatar Jan 25 '24 15:01 rokridi