8000 Fix name collisions by Kolos65 · Pull Request #81 · Kolos65/Mockable · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Fix name collisions #81

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Sources/Mockable/Documentation/Documentation.docc/Usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,14 @@ You have two options to override the default strict behavior of the library:
MockerPolicy.default = .relaxedVoid
```

The `.relaxedMockable` policy in combination with the [`Mockable`](https://kolos65.github.io/Mockable/documentation/mockable/mockable) protocol can be used to set an implicit return value for custom (or even built in) types:
The `.relaxedMocked` policy in combination with the [`Mocked`](https://kolos65.github.io/Mockable/documentation/mockable/mocked) protocol can be used to set an implicit return value for custom (or even built in) types:
```swift
struct Car {
var name: String
var seats: Int
}

extension Car: Mockable {
extension Car: Mocked {
static var mock: Car {
Car(name: "Mock Car", seats: 4)
}
Expand All @@ -227,7 +227,7 @@ protocol CarService {

func testCarService() {
func test() {
let mock = MockCarService(policy: .relaxedMockable)
let mock = MockCarService(policy: .relaxedMocked)
// Implictly mocked without a given registration:
let car = mock.getCar()
let cars = mock.getCars()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
//
// Mockable.swift
// Mockable
// Mocked.swift
// Mocked
//
// Created by Kolos Foltanyi on 2024. 04. 03..
//

/// A protocol that represents auto-mocked types.
///
/// `Mockable` in combination with a `relaxedMockable` option of `MockerPolicy `can be used
/// `Mocked` in combination with a `relaxedMocked` option of `MockerPolicy `can be used
/// to set an implicit return value for custom types:
///
/// ```swift
Expand All @@ -16,7 +16,7 @@
/// var seats: Int
/// }
///
/// extension Car: Mockable {
/// extension Car: Mocked {
/// static var mock: Car {
/// Car(name: "Mock Car", seats: 4)
/// }
Expand All @@ -39,14 +39,14 @@
///
/// func testCarService() {
/// func test() {
/// let mock = MockCarService(policy: .relaxedMockable)
/// let mock = MockCarService(policy: .relaxedMocked)
/// // Implictly mocked without a given registration:
/// let car = mock.getCar()
/// let cars = mock.getCars()
/// }
/// }
/// ```
public protocol Mockable {
public protocol Mocked {
/// A default mock return value to use when `.relaxedMocked` policy is set.
static var mock: Self { get }

Expand All @@ -55,16 +55,16 @@ public protocol Mockable {
static var mocks: [Self] { get }
}

extension Mockable {
extension Mocked {
public static var mocks: [Self] { [mock] }
}

extension Array: Mockable where Element: Mockable {
extension Array: Mocked where Element: Mocked {
public static var mock: Self {
Element.mocks
}
}

extension Optional: Mockable where Wrapped: Mockable {
extension Optional: Mocked where Wrapped: Mocked {
public static var mock: Self { Wrapped.mock }
}
16 changes: 8 additions & 8 deletions Sources/Mockable/Mocker/Mocker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -358,8 +358,8 @@ extension Mocker {
public func mock<V>(
_ member: Member,
producerResolver: (Any) throws -> V
) -> V where V: Mockable {
let relaxed = currentPolicy.contains(.relaxedMockable)
) -> V where V: Mocked {
let relaxed = currentPolicy.contains(.relaxedMocked)
// swiftlint:disable:next force_try
return try! mock(member, producerResolver, relaxed ? .value(.mock) : .none)
}
Expand All @@ -374,8 +374,8 @@ extension Mocker {
public func mockThrowing<V>(
_ member: Member,
producerResolver: (Any) throws -> V
) throws -> V where V: Mockable {
let relaxed = currentPolicy.contains(.relaxedMockable)
) throws -> V where V: Mocked {
let relaxed = currentPolicy.contains(.relaxedMocked)
return try mock(member, producerResolver, relaxed ? .value(.mock) : .none)
}
}
Expand All @@ -393,9 +393,9 @@ extension Mocker {
public func mock<V>(
_ member: Member,
producerResolver: (Any) throws -> V
) -> V where V: Mockable, V: ExpressibleByNilLiteral {
) -> V where V: Mocked, V: ExpressibleByNilLiteral {
// swiftlint:disable force_try
if currentPolicy.contains(.relaxedMockable) {
if currentPolicy.contains(.relaxedMocked) {
return try! mock(member, producerResolver, .value(.mock))
} else if currentPolicy.contains(.relaxedOptional) {
return try! mock(member, producerResolver, .value(nil))
Expand All @@ -415,8 +415,8 @@ extension Mocker {
public func mockThrowing<V>(
_ member: Member,
producerResolver: (Any) throws -> V
) throws -> V where V: Mockable, V: ExpressibleByNilLiteral {
if currentPolicy.contains(.relaxedMockable) {
) throws -> V where V: Mocked, V: ExpressibleByNilLiteral {
if currentPolicy.contains(.relaxedMocked) {
return try mock(member, producerResolver, .value(.mock))
} else if currentPolicy.contains(.relaxedOptional) {
return try mock(member, producerResolver, .value(nil))
Expand Down
6 changes: 3 additions & 3 deletions Sources/Mockable/Mocker/MockerPolicy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public struct MockerPolicy: OptionSet {
.relaxedOptional,
.relaxedThrowingVoid,
.relaxedNonThrowingVoid,
.relaxedMockable
.relaxedMocked
]

/// Every void function will run normally without a registration
Expand All @@ -41,8 +41,8 @@ public struct MockerPolicy: OptionSet {
/// Optional return values will default to nil.
public static let relaxedOptional = Self(rawValue: 1 << 2)

/// Types conforming to the `Mockable` protocol will default to their mock value.
public static let relaxedMockable = Self(rawValue: 1 << 3)
/// Types conforming to the `Mocked` protocol will default to their mock value.
public static let relaxedMocked = Self(rawValue: 1 << 3)

/// Option set raw value.
public let rawValue: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ extension FunctionRequirement {
}
}
return ReturnClauseSyntax(
type: IdentifierTypeSyntax(
type: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: name,
genericArgumentClause: .init(arguments: arguments)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ extension VariableRequirement {
private func returnType(
for kind: BuilderKind,
using mockType: IdentifierTypeSyntax
) throws -> IdentifierTypeSyntax {
) throws -> MemberTypeSyntax {
let name = if syntax.isComputed {
try syntax.isThrowing ? NS.ThrowingFunction(kind) : NS.Function(kind)
} else {
Expand All @@ -108,7 +108,9 @@ extension VariableRequirement {
produceType
}
}
return IdentifierTypeSyntax(

return MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: name,
genericArgumentClause: .init(arguments: arguments)
)
Expand Down
31 changes: 17 additions & 14 deletions Sources/MockableMacro/Factory/BuilderFactory.swift
10000
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,14 @@ extension BuilderFactory {
}

private static func inheritedTypes(_ kind: BuilderKind) -> InheritedTypeListSyntax {
let effectBuilder = IdentifierTypeSyntax(name: NS.EffectBuilder)
let assertionBuilder = IdentifierTypeSyntax(name: NS.AssertionBuilder)
let effectBuilder = MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.EffectBuilder
)
let assertionBuilder = MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.AssertionBuilder
)
return [InheritedTypeSyntax(type: kind == .verify ? assertionBuilder : effectBuilder)]
}

Expand Down Expand Up @@ -77,7 +83,7 @@ extension BuilderFactory {
bindingsBuilder: {
PatternBindingSyntax(
pattern: IdentifierPatternSyntax(identifier: NS.mocker),
typeAnnotation: TypeAnnotationSyntax(type: mockerType(requirements))
typeAnnotation: TypeAnnotationSyntax(type: IdentifierTypeSyntax(name: NS.Mocker))
)
}
)
Expand Down Expand Up @@ -131,7 +137,10 @@ extension BuilderFactory {
) -> FunctionSignatureSyntax {
FunctionSignatureSyntax(
parameterClause: FunctionParameterClauseSyntax {
FunctionParameterSyntax(firstName: NS.mocker, type: mockerType(requirements))
FunctionParameterSyntax(
firstName: NS.mocker,
type: IdentifierTypeSyntax(name: NS.Mocker)
)
if kind == .verify {
FunctionParameterSyntax(
firstName: NS.assertion,
Expand All @@ -142,16 +151,10 @@ extension BuilderFactory {
)
}

private static func mockerType(_ requirements: Requirements) -> IdentifierTypeSyntax {
IdentifierTypeSyntax(
name: NS.Mocker,
genericArgumentClause: GenericArgumentClauseSyntax(arguments: [
GenericArgumentSyntax(argument: requirements.syntax.mockType)
])
private static var assertionType: MemberTypeSyntax {
MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.MockableAssertion
)
}

private static var assertionType: IdentifierTypeSyntax {
IdentifierTypeSyntax(name: NS.MockableAssertion)
}
}
14 changes: 12 additions & 2 deletions Sources/MockableMacro/Factory/EnumFactory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,18 @@ enum EnumFactory: Factory {
extension EnumFactory {
private static var inheritanceClause: InheritanceClauseSyntax {
InheritanceClauseSyntax {
InheritedTypeSyntax(type: IdentifierTypeSyntax(name: NS.Matchable))
InheritedTypeSyntax(type: IdentifierTypeSyntax(name: NS.CaseIdentifiable))
InheritedTypeSyntax(
type: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.Matchable
)
)
InheritedTypeSyntax(
type: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.CaseIdentifiable
)
)
}
}

Expand Down
41 changes: 30 additions & 11 deletions Sources/MockableMacro/Factory/MemberFactory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import SwiftSyntax
enum MemberFactory: Factory {
static func build(from requirements: Requirements) throws -> MemberBlockItemListSyntax {
MemberBlockItemListSyntax {
mockerAlias(requirements)
mocker(requirements)
given(requirements)
when(requirements)
Expand All @@ -35,6 +36,24 @@ extension MemberFactory {
)
}

private static func mockerAlias(_ requirements: Requirements) -> TypeAliasDeclSyntax {
TypeAliasDeclSyntax(
modifiers: requirements.modifiers,
name: NS.Mocker,
initializer: TypeInitializerClauseSyntax(
value: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.Mocker,
genericArgumentClause: GenericArgumentClauseSyntax(
arguments: GenericArgumentListSyntax {
GenericArgumentSyntax(argument: requirements.syntax.mockType)
}
)
)
)
)
}

private static func mocker(_ requirements: Requirements) -> VariableDeclSyntax {
VariableDeclSyntax(
modifiers: [DeclModifierSyntax(name: .keyword(.private))],
Expand All @@ -44,14 +63,7 @@ extension MemberFactory {
pattern: IdentifierPatternSyntax(identifier: NS.mocker),
initializer: InitializerClauseSyntax(
value: FunctionCallExprSyntax(
calledExpression: GenericSpecializationExprSyntax(
expression: DeclReferenceExprSyntax(baseName: NS.Mocker),
genericArgumentClause: GenericArgumentClauseSyntax(
arguments: GenericArgumentListSyntax {
GenericArgumentSyntax(argument: requirements.syntax.mockType)
}
)
),
calledExpression: DeclReferenceExprSyntax(baseName: NS.Mocker),
leftParen: .leftParenToken(),
arguments: [],
rightParen: .rightParenToken()
Expand Down Expand Up @@ -164,7 +176,10 @@ extension MemberFactory {
secondName: NS.assertion,
type: AttributedTypeSyntax(
attributes: [.attribute(.escaping)],
baseType: IdentifierTypeSyntax(name: NS.MockableAssertion)
baseType: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.MockableAssertion
)
)
)
}
Expand All @@ -178,7 +193,8 @@ extension MemberFactory {
genericArgumentClause: GenericArgumentClauseSyntax(
arguments: GenericArgumentListSyntax {
GenericArgumentSyntax(
argument: IdentifierTypeSyntax(
argument: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.MockerScope
)
)
Expand Down Expand Up @@ -246,7 +262,10 @@ extension MemberFactory {
FunctionParameterSyntax(
firstName: NS.policy,
type: OptionalTypeSyntax(
wrappedType: IdentifierTypeSyntax(name: NS.MockerPolicy)
wrappedType: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.MockerPolicy
)
),
defaultValue: InitializerClauseSyntax(
value: NilLiteralExprSyntax()
Expand Down
9 changes: 6 additions & 3 deletions Sources/MockableMacro/Factory/MockFactory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,12 @@ extension MockFactory {
InheritedTypeSyntax(type: IdentifierTypeSyntax(
name: requirements.syntax.name.trimmed
))
InheritedTypeSyntax(type: IdentifierTypeSyntax(
name: NS.MockableService
))
InheritedTypeSyntax(
type: MemberTypeSyntax(
baseType: IdentifierTypeSyntax(name: NS.Mockable),
name: NS.MockableService
)
)
}
}

Expand Down
1 change: 1 addition & 0 deletions Sources/MockableMacro/Utils/Namespace.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ enum NS {
static let mocker: TokenSyntax = "mocker"
static let assertion: TokenSyntax = "assertion"

static let Mockable: TokenSyntax = "Mockable"
static let Mock: TokenSyntax = "Mock"
static let MockableService: TokenSyntax = "MockableService"
static let Bool: TokenSyntax = "Bool"
Expand Down
Loading
Loading
0