Skip to content

Commit 40c6e1e

Browse files
committed
Add More Tests
1 parent c93b105 commit 40c6e1e

14 files changed

+283
-18
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Foundation
2+
3+
extension FileManager: FileManaging {
4+
func files(atPath path: String) -> [String]? {
5+
enumerator(atPath: path)?.allObjects.compactMap { $0 as? String }
6+
}
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import Foundation
2+
3+
enum ApplicationError: Error {
4+
case fileReadError
5+
}

Sources/Core/Protocols/FileBrowser.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ import Foundation
33
protocol FileBrowser {
44
func getFilePaths(in directory: String,
55
matchingExtension fileExtension: String?,
6-
ignoringItems ignoredItems: [IgnoredItem]) -> [String]
6+
ignoringItems ignoredItems: [IgnoredItem]) throws -> [String]
77
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import Foundation
2+
3+
protocol FileManaging {
4+
func files(atPath path: String) -> [String]?
5+
}

Sources/Core/UnusedCodeTool.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,19 @@ public final class UnusedCodeTool {
6363
// MARK: - Internal Functions
6464

6565
func run(fileReader: FileReader,
66-
fileBrowser: FileBrowser) -> Int {
66+
fileBrowser: FileBrowser) -> Int
67+
{
6768
// Create ignored items list.
6869
let ignoredItems = [IgnoredItem](from: ignoreFilePath, using: fileReader, logger: logger)
6970

7071
// Find all Swift files.
71-
let swiftFilePaths = fileBrowser.getFilePaths(in: directory, matchingExtension: "swift", ignoringItems: ignoredItems)
72-
let xibFilePaths = fileBrowser.getFilePaths(in: directory, matchingExtension: "xib", ignoringItems: ignoredItems)
73-
let nibFilePaths = fileBrowser.getFilePaths(in: directory, matchingExtension: "nib", ignoringItems: ignoredItems)
72+
guard let swiftFilePaths = try? fileBrowser.getFilePaths(in: directory, matchingExtension: "swift", ignoringItems: ignoredItems),
73+
let xibFilePaths = try? fileBrowser.getFilePaths(in: directory, matchingExtension: "xib", ignoringItems: ignoredItems),
74+
let nibFilePaths = try? fileBrowser.getFilePaths(in: directory, matchingExtension: "nib", ignoringItems: ignoredItems)
75+
else {
76+
exit(1)
77+
}
78+
7479
guard swiftFilePaths.isEmpty == false else {
7580
logger.debug("[System] No Swift files found.")
7681
return 0

Sources/Core/Utilities/LocalFileBrowser.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import Foundation
44
struct LocalFileBrowser: FileBrowser {
55
// MARK: - Private Properties
66

7-
private let fileManager: FileManager
7+
private let fileManager: FileManaging
88
private let logger: Logger
99

1010
// MARK: - Lifecycle
1111

12-
init(using fileManager: FileManager = .default,
12+
init(using fileManager: FileManaging = FileManager.default,
1313
logger: Logger)
1414
{
1515
self.fileManager = fileManager
@@ -26,13 +26,13 @@ struct LocalFileBrowser: FileBrowser {
2626
/// - Returns: A list of matched file paths.
2727
func getFilePaths(in directory: String = ".",
2828
matchingExtension fileExtension: String? = nil,
29-
ignoringItems ignoredItems: [IgnoredItem] = []) -> [String]
29+
ignoringItems ignoredItems: [IgnoredItem] = []) throws -> [String]
3030
{
31-
guard let enumerator = fileManager.enumerator(atPath: directory) else {
31+
guard let rawFilePaths = fileManager.files(atPath: directory) else {
3232
logger.error("[LocalFileBrowser] Failed to enumerate items in directory \"\(directory)\"")
33-
exit(1)
33+
throw ApplicationError.fileReadError
3434
}
35-
let filePaths = enumerator.allObjects.compactMap { $0 as? String }.map { "\(directory)\(directory.hasSuffix("/") ? "" : "/")\($0)" }
35+
let filePaths = rawFilePaths.map { "\(directory)\(directory.hasSuffix("/") ? "" : "/")\($0)" }
3636
logger.debug("[LocalFileBrowser] File Path Count - All: \(filePaths.count)")
3737
let filePathsMatchingExtension = filter(filePaths: filePaths, matchingExtension: fileExtension)
3838
logger.debug("[LocalFileBrowser] File Path Count - Matching Extension (\(fileExtension ?? "none")): \(filePathsMatchingExtension.count)")

Tests/ArgumentParserTests.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
@testable import Core
2+
import Foundation
3+
import Testing
4+
5+
struct ArgumentParserTests {
6+
/// Happy path.
7+
@Test func testArgumentParserParsesArguments() async throws {
8+
let arguments = [
9+
"--foo=bar",
10+
"baz=bat",
11+
]
12+
13+
let foo = ArgumentParser.find("foo", from: arguments)
14+
#expect(foo == "bar")
15+
16+
let baz = ArgumentParser.find("baz", from: arguments)
17+
#expect(baz == "bat")
18+
19+
let qux = ArgumentParser.find("qux", from: arguments)
20+
#expect(qux == nil)
21+
}
22+
}

Tests/DeclarationTests.swift

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
@testable import Core
2+
import Foundation
3+
import Testing
4+
5+
struct DeclarationTests {
6+
/// Sort by file name, line number, and name.
7+
@Test func testModifiers() async throws {
8+
let foo = Declaration(file: "a.swift", line: "var foo = 0", at: 0, type: "var", name: "foo", modifiers: [
9+
"private",
10+
"@IBOutlet",
11+
"override",
12+
])
13+
#expect(foo.isOverride == true)
14+
#expect(foo.isPrivate == true)
15+
#expect(foo.isIBLinked == true)
16+
17+
let foo2 = Declaration(file: "a.swift", line: "var foo = 0", at: 0, type: "var", name: "foo", modifiers: [
18+
"override",
19+
])
20+
#expect(foo2.isOverride == true)
21+
#expect(foo2.isPrivate == false)
22+
#expect(foo2.isIBLinked == false)
23+
24+
let foo3 = Declaration(file: "a.swift", line: "var foo = 0", at: 0, type: "var", name: "foo", modifiers: [
25+
"private",
26+
])
27+
#expect(foo3.isOverride == false)
28+
#expect(foo3.isPrivate == true)
29+
#expect(foo3.isIBLinked == false)
30+
31+
let foo4 = Declaration(file: "a.swift", line: "var foo = 0", at: 0, type: "var", name: "foo", modifiers: [
32+
"@IBOutlet",
33+
])
34+
#expect(foo4.isOverride == false)
35+
#expect(foo4.isPrivate == false)
36+
#expect(foo4.isIBLinked == true)
37+
}
38+
39+
/// Sort by file name, line number, and name.
40+
@Test func testDeclarationsSortCorrectly() async throws {
41+
let a1 = Declaration(file: "a.swift", line: "var foo = 0", at: 0, type: "var", name: "foo", modifiers: [])
42+
let a2 = Declaration(file: "a.swift", line: "var bar = 0, var baz = 1", at: 1, type: "var", name: "bar", modifiers: [])
43+
let a3 = Declaration(file: "a.swift", line: "var bar = 0, var baz = 1", at: 1, type: "var", name: "baz", modifiers: [])
44+
let b = Declaration(file: "b.swift", line: "var bar = 0", at: 0, type: "var", name: "bar", modifiers: [])
45+
let c = Declaration(file: "c.swift", line: "var bar = 0", at: 0, type: "var", name: "bar", modifiers: [])
46+
let declarations: [Declaration] = [a1, a2, a3, b, c].shuffled().sorted()
47+
#expect(declarations == [a1, a2, a3, b, c])
48+
}
49+
}

Tests/FileBrowserTests.swift

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
@testable import Core
2+
import Foundation
3+
import Testing
4+
5+
struct LocalFileBrowserTests {
6+
private let logger = Logger(logLevel: .info)
7+
8+
/// Returns all files.
9+
@Test func testFileBrowserReturnsUnfilteredFileList() async throws {
10+
let filePaths = [
11+
"foo.swift",
12+
"bar.xib",
13+
]
14+
let fileManager = MockFileManager(filePaths: filePaths)
15+
let fileBrowser = LocalFileBrowser(using: fileManager,
16+
logger: logger)
17+
let foundPaths = try! fileBrowser.getFilePaths()
18+
#expect(foundPaths.count == 2)
19+
}
20+
21+
/// Returns files matching extension.
22+
@Test func testFileBrowserReturnsExtensionFilteredFileList() async throws {
23+
let filePaths = [
24+
"foo.swift",
25+
"bar.xib",
26+
]
27+
let fileManager = MockFileManager(filePaths: filePaths)
28+
let fileBrowser = LocalFileBrowser(using: fileManager,
29+
logger: logger)
30+
let foundPaths = try! fileBrowser.getFilePaths(matchingExtension: "swift")
31+
#expect(foundPaths.count == 1)
32+
}
33+
34+
/// Returns files ignoring items in ignore list.
35+
@Test func testFileBrowserReturnsIgnoredItemFilteredFileList() async throws {
36+
let filePaths = [
37+
"foo.swift",
38+
"bar.xib",
39+
]
40+
let fileManager = MockFileManager(filePaths: filePaths)
41+
let fileBrowser = LocalFileBrowser(using: fileManager,
42+
logger: logger)
43+
let ignoredItems = [
44+
try! IgnoredItem(line: ".*.xib"),
45+
].compactMap { $0 }
46+
let foundPaths = try! fileBrowser.getFilePaths(ignoringItems: ignoredItems)
47+
#expect(foundPaths.count == 1)
48+
}
49+
50+
/// Throws an error when file manager fails.
51+
@Test func testFileBrowserThrowsWhenFileManagerFailure() async throws {
52+
let fileManager = MockFileManager(filePaths: nil)
53+
let fileBrowser = LocalFileBrowser(using: fileManager,
54+
logger: logger)
55+
#expect(throws: ApplicationError.fileReadError) {
56+
try fileBrowser.getFilePaths()
57+
}
58+
}
59+
}

Tests/FileReaderTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
@testable import Core
2+
import Foundation
3+
import Testing
4+
5+
struct LocalFileReaderTests {
6+
private let logger = Logger(logLevel: .info)
7+
8+
/// Returns all files.
9+
@Test func testFileReaderReturnsUnfilteredFileList() async throws {
10+
let filePaths = [
11+
"foo.swift",
12+
"bar.xib",
13+
]
14+
let fileManager = MockFileManager(filePaths: filePaths)
15+
let fileBrowser = LocalFileBrowser(using: fileManager,
16+
logger: logger)
17+
let foundPaths = try! fileBrowser.getFilePaths()
18+
#expect(foundPaths.count == 2)
19+
}
20+
}

0 commit comments

Comments
 (0)