Kolos65 / Mockable

A Swift macro driven auto-mocking library.
MIT License
233 stars 18 forks source link

Bug: @available attribute is not added to Builder structs (v0.0.3) #23

Closed EnesKaraosman closed 6 months ago

EnesKaraosman commented 7 months ago
@Mockable
protocol MyProtocol {
    @available(iOS 15, *)
    func foo()
}

And the generated code is below;

#if MOCKING
final class MockMyProtocol: MyProtocol, Mockable {
    private var mocker = Mocker<MockMyProtocol>()
    @available(*, deprecated, message: "Use given(_ service:) of MockableTest instead.")
    func given() -> ReturnBuilder {
        .init(mocker: mocker)
    }
    @available(*, deprecated, message: "Use when(_ service:) of MockableTest instead.")
    func when() -> ActionBuilder {
        .init(mocker: mocker)
    }
    @available(*, deprecated, message: "Use verify(_ service:) of MockableTest instead.")
    func verify(with assertion: @escaping MockableAssertion) -> VerifyBuilder {
        .init(mocker: mocker, assertion: assertion)
    }
    func reset(_ scopes: Set<MockerScope> = .all) {
        mocker.reset(scopes: scopes)
    }
    init() {
    }
    @available(iOS 15, *)
        func foo() {
        let member: Member = .m1_foo
        try! mocker.mock(member) { producer in
            let producer = try cast(producer) as () -> Void
            return producer()
        }
    }
    enum Member: Matchable, CaseIdentifiable {
        case m1_foo
        func match(_ other: Member) -> Bool {
            switch (self, other) {
            case (.m1_foo, .m1_foo):
                return true

            }
        }
    }
    struct ReturnBuilder: EffectBuilder {
        private let mocker: Mocker<MockMyProtocol>
        init(mocker: Mocker<MockMyProtocol>) {
            self.mocker = mocker
        }
        func foo() -> FunctionReturnBuilder<MockMyProtocol, ReturnBuilder, Void, () -> Void> {
            .init(mocker, kind: .m1_foo)
        }
    }
    struct ActionBuilder: EffectBuilder {
        private let mocker: Mocker<MockMyProtocol>
        init(mocker: Mocker<MockMyProtocol>) {
            self.mocker = mocker
        }
        func foo() -> FunctionActionBuilder<MockMyProtocol, ActionBuilder> {
            .init(mocker, kind: .m1_foo)
        }
    }
    struct VerifyBuilder: AssertionBuilder {
        private let mocker: Mocker<MockMyProtocol>
        private let assertion: MockableAssertion
        init(mocker: Mocker<MockMyProtocol>, assertion: @escaping MockableAssertion) {
            self.mocker = mocker
            self.assertion = assertion
        }
        func foo() -> FunctionVerifyBuilder<MockMyProtocol, VerifyBuilder> {
            .init(mocker, kind: .m1_foo, assertion: assertion)
        }
    }
}
#endif

See there is no @available attribute in ReturnBuilder, ActionBuilder and VerifyBuilder structs

Kolos65 commented 6 months ago

@EnesKaraosman This is now fixed in 0.0.4