-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy pathMockGenerator.swift
58 lines (52 loc) · 1.91 KB
/
MockGenerator.swift
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
import AST
import class UseCases.MockClass
import class UseCases.CallbackMockView
import class UseCases.Generator
import SwiftyKit
protocol MockGenerator {
var templateName: String { get }
}
extension MockGenerator {
func generateMock(
toFile file: Element,
atElement element: TypeDeclaration
) throws {
let mockClass = transformToMockClass(element: element)
guard !isEmpty(mockClass: mockClass) else {
throw error("Could not find a class or protocol on \(element.name)")
}
let mockLines = getMockBody(from: mockClass)
guard !mockLines.isEmpty else {
throw error("Found inherited types but there was nothing to mock")
}
let mockString = mockLines.joined(separator: "\n")
let mock = "class Mock {\n\(mockString)\n}"
guard let codeBlock = try? parserFactory.make().parseFile(
mock,
url: nil
).typeDeclarations.first?.codeBlock
else {
throw error("The resulting mock could not be parsed")
}
codeBlock.delete()
element.codeBlock.swap(with: codeBlock)
formatterFactory.make().format(element)
}
private func isEmpty(mockClass: MockClass) -> Bool {
return mockClass.protocols.isEmpty && mockClass.inheritedClass == nil
}
private func getMockBody(from mockClass: MockClass) -> [String] {
let view = CallbackMockView { [templateName] model in
let view = MustacheView(templateName: templateName)
view.render(model: model)
return view.result
}
let generator = Generator(view: view)
generator.set(c: mockClass)
generator.generate()
return view.result
}
private func transformToMockClass(element: Element) -> MockClass {
return TypeDeclarationTransformingVisitor.transformMock(element, resolver: resolverFactory.make())
}
}