-
Notifications
You must be signed in to change notification settings - Fork 7
/
MockSwift.stencil
159 lines (139 loc) · 7.49 KB
/
MockSwift.stencil
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import Foundation
import MockSwift
@testable import {{argument.module}}
{% macro predicatesParameter method %}{% for param in method.parameters %}{% if param.argumentLabel == null %}_ {% elif param.argumentLabel != param.name %}{{ param.argumentLabel }} {% endif %}{{ param.name }}: Predicate<{{ param.unwrappedTypeName if param.typeAttributes.escaping else param.typeName }}>{{ ', ' if not forloop.last }}{% endfor %}{% endmacro %}
{% macro normalizeParameter method %}{% for param in method.parameters %}{% if param.argumentLabel == null %}_ {% elif param.argumentLabel != param.name %}{{ param.argumentLabel }} {% endif %}{{ param.name }}: {% if param.typeName|contains:"->" %}@escaping {{ param.unwrappedTypeName }}{% else %}{{ param.typeName }}{% endif %}{{ ', ' if not forloop.last }}{% endfor %}{% endmacro %}
{% macro parametersOnInvoke method %}{% for param in method.parameters %}{{ param.name }}{{ ', ' if not forloop.last }}{% endfor %}{% endmacro %}
{% macro mockVariable variable %}
public var {{ variable.name }}: {{ variable.typeName }} {
{% if variable.isMutable %}
get { mocked() }
set { mocked(newValue) }
{% else %}
mocked()
{% endif %}
}
{% endmacro %}
{% macro mockMethod method %}
{% ifnot method.isInitializer %}
public func {{ method.name }}{{ ' throws' if method.throws }}{% if not method.returnTypeName.isVoid %} -> {{ method.returnTypeName.name }}{% endif %} {
{% if method.throws %}
try mockedThrowable({% call parametersOnInvoke method %})
{% else %}
mocked({% call parametersOnInvoke method %})
{% endif %}
}
{% endif %}
{% endmacro %}
{% macro mockSubscript subscript %}
public subscript({% for param in subscript.parameters %}{% if param.argumentLabel != null and param.argumentLabel != param.name %}{{ param.argumentLabel }} {% endif %}{{ param.name }}: {{ param.typeName }}{{ ', ' if not forloop.last }}{% endfor %}) -> {{ subscript.actualReturnTypeName }} {
get {
mocked({% call parametersOnInvoke subcript %})
}
{% if subscript.isMutable %}
set {
mocked({% call parametersOnInvoke subcript %}, newValue)
}
{% endif %}
}
{% endmacro %}
{% macro mock type %}
extension Mock: {{ type.name }} where WrappedType == {{ type.name }} {
{% for variable in type.rawVariables|!definedInExtension %}
{% call mockVariable variable %}
{% endfor %}
{% for method in type.rawMethods|!definedInExtension %}
{% call mockMethod method %}
{% endfor %}
{% for method in type.rawSubscripts|!definedInExtension %}
{% call mockSubscript method %}
{% endfor %}
}
{% endmacro %}
{% macro normalizeReturnType type %}<{% if type|hasPrefix: "where " %}{{ type|replace:"where ","Void> where " }}{% elif type|contains:" where " %}{{ type|replace:" where ","> where " }}{% else %}{{ type }}>{% endif %}{% endmacro %}
{% macro givenMockVariable variable %}
public var {{ variable.name }}: MockableProperty.{% if variable.isMutable %}Writable{% else %}Readable{% endif %}{% call normalizeReturnType variable.typeName %} {
mockable()
}
{% endmacro %}
{% macro givenMockMethod method %}
{% ifnot method.isInitializer %}
public func {{ method.shortName }}({% call predicatesParameter method %}) -> Mockable{% call normalizeReturnType method.returnTypeName %} {
mockable({% call parametersOnInvoke method %})
}
{% if method.parameters.count > 0 %}
public func {{ method.shortName }}({% call normalizeParameter method %}) -> Mockable{% call normalizeReturnType method.returnTypeName %} {
mockable({% call parametersOnInvoke method %})
}
{% endif %}
{% endif %}
{% endmacro %}
{% macro givenMockSubscript subscript %}
public subscript({% for param in subscript.parameters %}{% if param.argumentLabel != null and param.argumentLabel != param.name %}{{ param.argumentLabel }} {% endif %}{{ param.name }}: Predicate<{{ param.unwrappedTypeName if param.typeAttributes.escaping else param.typeName }}>{{ ', ' if not forloop.last }}{% endfor %}) -> MockableSubscript.{% if subscript.isMutable %}Writable{% else %}Readable{% endif %}{% call normalizeReturnType subscript.actualReturnTypeName %} {
mockable({% call parametersOnInvoke method %})
}
{% if method.parameters.count > 0 %}
public subscript({% for param in subscript.parameters %}{% if param.argumentLabel != null and param.argumentLabel != param.name %}{{ param.argumentLabel }} {% endif %}{{ param.name }}: {{ param.typeName }}{{ ', ' if not forloop.last }}{% endfor %}) -> MockableSubscript.{% if subscript.isMutable %}Writable{% else %}Readable{% endif %}{% call normalizeReturnType subscript.actualReturnTypeName %} {
mockable({% call parametersOnInvoke subscript %})
}
{% endif %}
{% endmacro %}
{% macro given type %}
extension Given where WrappedType == {{ type.name }} {
{% for variable in type.rawVariables|!definedInExtension %}
{% call givenMockVariable variable %}
{% endfor %}
{% for method in type.rawMethods|!definedInExtension %}
{% call givenMockMethod method %}
{% endfor %}
{% for method in type.rawSubscripts|!definedInExtension %}
{% call givenMockSubscript method %}
{% endfor %}
}
{% endmacro %}
{% macro thenMockVariable variable %}
public var {{ variable.name }}: VerifiableProperty.{% if variable.isMutable %}Writable{% else %}Readable{% endif %}{% call normalizeReturnType variable.typeName %} {
verifiable()
}
{% endmacro %}
{% macro thenMockMethod method %}
{% ifnot method.isInitializer %}
public func {{ method.shortName }}({% call predicatesParameter method %}) -> Verifiable{% call normalizeReturnType method.returnTypeName %} {
verifiable({% call parametersOnInvoke method %})
}
{% if method.parameters.count > 0 %}
public func {{ method.shortName }}({% call normalizeParameter method %}) -> Verifiable{% call normalizeReturnType method.returnTypeName %} {
verifiable({% call parametersOnInvoke method %})
}
{% endif %}
{% endif %}
{% endmacro %}
{% macro thenMockSubscript subscript %}
public subscript({% for param in subscript.parameters %}{% if param.argumentLabel != null and param.argumentLabel != param.name %}{{ param.argumentLabel }} {% endif %}{{ param.name }}: Predicate<{{ param.unwrappedTypeName if param.typeAttributes.escaping else param.typeName }}>{{ ', ' if not forloop.last }}{% endfor %}) -> VerifiableSubscript.{% if subscript.isMutable %}Writable{% else %}Readable{% endif %}{% call normalizeReturnType subscript.actualReturnTypeName %} {
verifiable({% call parametersOnInvoke method %})
}
{% if method.parameters.count > 0 %}
public subscript({% for param in subscript.parameters %}{% if param.argumentLabel != null and param.argumentLabel != param.name %}{{ param.argumentLabel }} {% endif %}{{ param.name }}: {{ param.typeName }}{{ ', ' if not forloop.last }}{% endfor %}) -> VerifiableSubscript.{% if subscript.isMutable %}Writable{% else %}Readable{% endif %}{% call normalizeReturnType subscript.actualReturnTypeName %} {
verifiable({% call parametersOnInvoke subscript %})
}
{% endif %}
{% endmacro %}
{% macro then type %}
extension Then where WrappedType == {{ type.name }} {
{% for variable in type.rawVariables|!definedInExtension %}
{% call thenMockVariable variable %}
{% endfor %}
{% for method in type.rawMethods|!definedInExtension %}
{% call thenMockMethod method %}
{% endfor %}
{% for method in type.rawSubscripts|!definedInExtension %}
{% call thenMockSubscript method %}
{% endfor %}
}
{% endmacro %}
{% for type in types.protocols where type|annotated:"AutoMockable" %}
// MARK: - {{ type.name }}
{% call mock type %}
{% call given type %}
{% call then type %}
{% endfor %}