Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Commit 801ef41

Browse files
committed
Add preliminary SwiftDoc tests
1 parent 37db3e6 commit 801ef41

File tree

4 files changed

+196
-0
lines changed

4 files changed

+196
-0
lines changed

Package.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,9 @@ let package = Package(
3636
name: "SwiftDoc",
3737
dependencies: ["SwiftSyntax", "SwiftSemantics", "SwiftMarkup"]
3838
),
39+
.testTarget(
40+
name: "SwiftDocTests",
41+
dependencies: ["SwiftDoc", "SwiftSyntax", "SwiftSemantics", "SwiftMarkup"]
42+
),
3943
]
4044
)

Tests/LinuxMain.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fatalError("Run with `swift test --enable-test-discovery`")
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Foundation
2+
3+
func temporaryFile(path: String? = nil, contents: String) throws -> URL {
4+
let temporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(ProcessInfo().globallyUniqueString)
5+
try FileManager.default.createDirectory(at: temporaryDirectoryURL, withIntermediateDirectories: true, attributes: [.posixPermissions: 0o766])
6+
7+
let path = path ?? ProcessInfo().globallyUniqueString
8+
let temporaryFileURL = temporaryDirectoryURL.appendingPathComponent(path)
9+
10+
try contents.data(using: .utf8)?.write(to: temporaryFileURL)
11+
12+
return temporaryFileURL
13+
}
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
import XCTest
2+
3+
@testable import SwiftDoc
4+
import SwiftSemantics
5+
import struct SwiftSemantics.Protocol
6+
import SwiftSyntax
7+
8+
final class SourceFileTests: XCTestCase {
9+
func testSourceFile() throws {
10+
let source = #"""
11+
import Foundation
12+
13+
/// Protocol
14+
public protocol P {
15+
/// Function requirement
16+
func f()
17+
18+
/// Property requirement
19+
var p: Any { get }
20+
}
21+
22+
/// Enumeration
23+
public enum E {
24+
/// Enumeration case
25+
case c
26+
}
27+
28+
/// Structure
29+
public struct S {}
30+
31+
/// Extension
32+
extension S: P {
33+
/// Function
34+
func f() {}
35+
36+
/// Property
37+
var p: Any { return () }
38+
}
39+
40+
/// Class
41+
open class C: P{
42+
/// Function
43+
func f() {}
44+
45+
/// Property
46+
var p: Any { return () }
47+
}
48+
49+
/// Subclass
50+
public final class SC: C {}
51+
"""#
52+
53+
let url = try temporaryFile(contents: source)
54+
let sourceFile = try SourceFile(file: url, relativeTo: url.deletingLastPathComponent())
55+
56+
XCTAssertEqual(sourceFile.imports.count, 1)
57+
XCTAssertEqual(sourceFile.imports.first?.pathComponents, ["Foundation"])
58+
59+
XCTAssertEqual(sourceFile.symbols.count, 12)
60+
61+
do {
62+
let `protocol` = sourceFile.symbols[0]
63+
XCTAssert(`protocol`.declaration is Protocol)
64+
XCTAssertEqual(`protocol`.documentation?.summary, "Protocol")
65+
66+
do {
67+
let function = sourceFile.symbols[1]
68+
69+
XCTAssert(function.declaration is Function)
70+
71+
XCTAssertEqual(function.context.count, 1)
72+
XCTAssert(function.context.first is Symbol)
73+
XCTAssertEqual(function.context.first as? Symbol, `protocol`)
74+
75+
XCTAssertEqual(function.documentation?.summary, "Function requirement")
76+
}
77+
78+
do {
79+
let property = sourceFile.symbols[2]
80+
81+
XCTAssert(property.declaration is Variable)
82+
83+
XCTAssertEqual(property.context.count, 1)
84+
XCTAssert(property.context.first is Symbol)
85+
XCTAssertEqual(property.context.first as? Symbol, `protocol`)
86+
87+
XCTAssertEqual(property.documentation?.summary, "Property requirement")
88+
}
89+
}
90+
91+
do {
92+
let enumeration = sourceFile.symbols[3]
93+
XCTAssert(enumeration.declaration is Enumeration)
94+
XCTAssertEqual(enumeration.documentation?.summary, "Enumeration")
95+
96+
do {
97+
let `case` = sourceFile.symbols[4]
98+
99+
XCTAssert(`case`.declaration is Enumeration.Case)
100+
101+
XCTAssertEqual(`case`.context.count, 1)
102+
XCTAssert(`case`.context.first is Symbol)
103+
XCTAssertEqual(`case`.context.first as? Symbol, enumeration)
104+
105+
XCTAssertEqual(`case`.documentation?.summary, "Enumeration case")
106+
}
107+
}
108+
109+
do {
110+
let structure = sourceFile.symbols[5]
111+
XCTAssert(structure.declaration is Structure)
112+
XCTAssertEqual(structure.documentation?.summary, "Structure")
113+
}
114+
115+
do {
116+
do {
117+
let function = sourceFile.symbols[6]
118+
119+
XCTAssert(function.declaration is Function)
120+
121+
XCTAssertEqual(function.context.count, 1)
122+
XCTAssert(function.context.first is Extension)
123+
XCTAssertEqual((function.context.first as? Extension)?.extendedType, "S")
124+
125+
XCTAssertEqual(function.documentation?.summary, "Function")
126+
}
127+
128+
do {
129+
let property = sourceFile.symbols[7]
130+
131+
XCTAssert(property.declaration is Variable)
132+
133+
XCTAssertEqual(property.context.count, 1)
134+
XCTAssert(property.context.first is Extension)
135+
XCTAssertEqual((property.context.first as? Extension)?.extendedType, "S")
136+
137+
XCTAssertEqual(property.documentation?.summary, "Property")
138+
}
139+
}
140+
141+
do {
142+
let `class` = sourceFile.symbols[8]
143+
XCTAssert(`class`.declaration is Class)
144+
XCTAssertEqual(`class`.documentation?.summary, "Class")
145+
146+
do {
147+
let function = sourceFile.symbols[9]
148+
149+
XCTAssert(function.declaration is Function)
150+
151+
XCTAssertEqual(function.context.count, 1)
152+
XCTAssert(function.context.first is Symbol)
153+
XCTAssertEqual(function.context.first as? Symbol, `class`)
154+
155+
XCTAssertEqual(function.documentation?.summary, "Function")
156+
}
157+
158+
do {
159+
let property = sourceFile.symbols[10]
160+
161+
XCTAssert(property.declaration is Variable)
162+
163+
XCTAssertEqual(property.context.count, 1)
164+
XCTAssert(property.context.first is Symbol)
165+
XCTAssertEqual(property.context.first as? Symbol, `class`)
166+
167+
XCTAssertEqual(property.documentation?.summary, "Property")
168+
}
169+
}
170+
171+
do {
172+
let `class` = sourceFile.symbols[11]
173+
XCTAssert(`class`.declaration is Class)
174+
XCTAssertEqual((`class`.declaration as? Class)?.inheritance, ["C"])
175+
XCTAssertEqual(`class`.documentation?.summary, "Subclass")
176+
}
177+
}
178+
}

0 commit comments

Comments
 (0)