Skip to content

Commit fa7a69d

Browse files
author
Thibault Wittemberg
committed
project: implement unit tests
1 parent a7015d2 commit fa7a69d

26 files changed

+9400
-234
lines changed

Package.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,12 @@ let package = Package(
1818
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
1919
.target(
2020
name: "XcodeCoverageConverter",
21-
dependencies: [.product(name: "ArgumentParser", package: "swift-argument-parser"), "Core"],
21+
dependencies: ["Core"],
2222
path: "Sources/XcodeCoverageConverter"),
2323
.target(
2424
name: "Core",
25-
dependencies: [],
25+
dependencies: [.product(name: "ArgumentParser", package: "swift-argument-parser")],
2626
path: "Sources/Core"),
27-
.testTarget(
28-
name: "XcodeCoverageConverterTests",
29-
dependencies: ["XcodeCoverageConverter"],
30-
path: "Tests/XcodeCoverageConverterTests"),
3127
.testTarget(
3228
name: "CoreTests",
3329
dependencies: ["Core"],

Sources/Core/Commands/GenerateCommand.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,23 @@ public extension Xccov.Commands.Generate {
1515

1616
enum Output: String, ExpressibleByArgument {
1717
case coberturaXml = "cobertura-xml"
18+
case failable = "failable"
1819

1920
var converter: Xccov.Converters.Converter {
2021
switch self {
2122
case .coberturaXml:
2223
return Xccov.Converters.CoberturaXml.convert(coverageReport:)
24+
case .failable:
25+
return Xccov.Converters.FailableConverter.convert(coverageReport:)
2326
}
2427
}
2528

2629
var filename: String {
2730
switch self {
2831
case .coberturaXml:
2932
return "cobertura.xml"
33+
case .failable:
34+
return "failable.xml"
3035
}
3136
}
3237
}

Sources/Core/Commons/Models/Export.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// Created by Thibault Wittemberg on 2020-06-03.
66
//
77

8-
public struct Export {
8+
public struct Export: Equatable {
99
public let content: String
1010
public let filename: String
1111

Sources/Core/Converters/CoberturaXmlConverter.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,16 @@ public extension Xccov.Converters {
1212
}
1313

1414
public extension Xccov.Converters.CoberturaXml {
15+
1516
static func convert(coverageReport: CoverageReport) -> Result<String, Xccov.Error> {
16-
let currentDirectoryPath = FileManager.default.currentDirectoryPath
17+
Self.convert(coverageReport: coverageReport,
18+
timeStamp: Date().timeIntervalSince1970,
19+
currentDirectoryPath: FileManager.default.currentDirectoryPath)
20+
}
1721

22+
static func convert(coverageReport: CoverageReport,
23+
timeStamp: TimeInterval = Date().timeIntervalSince1970,
24+
currentDirectoryPath: String = FileManager.default.currentDirectoryPath) -> Result<String, Xccov.Error> {
1825
let dtd = try! XMLDTD(contentsOf: URL(string: "http://cobertura.sourceforge.net/xml/coverage-04.dtd")!)
1926
dtd.name = "coverage"
2027
dtd.systemID = "http://cobertura.sourceforge.net/xml/coverage-04.dtd"
@@ -24,7 +31,7 @@ public extension Xccov.Converters.CoberturaXml {
2431
rootElement.addAttribute(XMLNode.attribute(withName: "branch-rate", stringValue: "1.0") as! XMLNode)
2532
rootElement.addAttribute(XMLNode.attribute(withName: "lines-covered", stringValue: "\(coverageReport.coveredLines)") as! XMLNode)
2633
rootElement.addAttribute(XMLNode.attribute(withName: "lines-valid", stringValue: "\(coverageReport.executableLines)") as! XMLNode)
27-
rootElement.addAttribute(XMLNode.attribute(withName: "timestamp", stringValue: "\(Date().timeIntervalSince1970)") as! XMLNode)
34+
rootElement.addAttribute(XMLNode.attribute(withName: "timestamp", stringValue: "\(timeStamp)") as! XMLNode)
2835
rootElement.addAttribute(XMLNode.attribute(withName: "version", stringValue: "diff_coverage 0.1") as! XMLNode)
2936
rootElement.addAttribute(XMLNode.attribute(withName: "complexity", stringValue: "0.0") as! XMLNode)
3037
rootElement.addAttribute(XMLNode.attribute(withName: "branches-valid", stringValue: "1.0") as! XMLNode)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// FailableConverter.swift
3+
//
4+
//
5+
// Created by Thibault Wittemberg on 2020-07-05.
6+
//
7+
8+
public extension Xccov.Converters {
9+
enum FailableConverter {}
10+
}
11+
12+
public extension Xccov.Converters.FailableConverter {
13+
static func convert(coverageReport: CoverageReport) -> Result<String, Xccov.Error> {
14+
.failure(Xccov.Error.conversionFailed(""))
15+
}
16+
}

Sources/Core/Converters/Xccov+Converter.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,3 @@ public extension Xccov {
1414
public extension Xccov.Converters {
1515
typealias Converter = (CoverageReport) -> Result<String, Xccov.Error>
1616
}
17-

Tests/CoreTests/Readers/Fixtures/Coverage.swift renamed to Tests/CoreTests/Commands/Fixtures/CommandCoverageJson.swift

Lines changed: 39 additions & 39 deletions
Large diffs are not rendered by default.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//
2+
// GenerateCommandTests.swift
3+
//
4+
//
5+
// Created by Thibault Wittemberg on 2020-07-05.
6+
//
7+
8+
@testable import Core
9+
import XCTest
10+
11+
final class GenerateCommandTests: XCTestCase {
12+
func testFilename_return_expected_value_for_cobertura() {
13+
// Given: a Cobertura command output
14+
let sut = Xccov.Commands.Generate.Output.coberturaXml
15+
16+
// When: requesting the filename
17+
// Then: it is the expected one
18+
XCTAssertEqual(sut.filename, "cobertura.xml")
19+
}
20+
21+
func testConvert_to_coberturalXml_return_success_when_coverageReport_is_valid() {
22+
// Given: a valid json report
23+
let data = converterFixtureCoverageJson.data(using: .utf8)
24+
let coverageReport = try! JSONDecoder().decode(CoverageReport.self, from: data!)
25+
26+
// When: converting it to Cobertura xml
27+
let receivedResult = Xccov.Commands.Generate.convert(report: coverageReport, to: .coberturaXml)
28+
29+
// Then: it is a success
30+
XCTAssertNoThrow(try receivedResult.get())
31+
}
32+
33+
func testConvert_to_failable_return_failure() {
34+
// Given: a json report
35+
let data = converterFixtureCoverageJson.data(using: .utf8)
36+
let coverageReport = try! JSONDecoder().decode(CoverageReport.self, from: data!)
37+
38+
// When: converting it to Failable output
39+
let receivedResult = Xccov.Commands.Generate.convert(report: coverageReport, to: .failable)
40+
41+
// Then: it is a failure
42+
XCTAssertEqual(receivedResult, Result.failure(Xccov.Error.conversionFailed("")))
43+
}
44+
45+
func testConvert_to_several_outputs_return_success_when_coverageReport_is_valid() {
46+
// Given: a valid json report
47+
let data = converterFixtureCoverageJson.data(using: .utf8)
48+
let coverageReport = try! JSONDecoder().decode(CoverageReport.self, from: data!)
49+
50+
// When: converting it to several output formats
51+
let receivedResult = Xccov.Commands.Generate.convert(report: coverageReport, to: [.coberturaXml])
52+
53+
// Then: it is a success with the count of output formats
54+
XCTAssertNoThrow(try receivedResult.get())
55+
XCTAssertEqual((try receivedResult.get()).count, 1)
56+
}
57+
58+
func testConvert_to_several_outputs_return_failure_when_a_conversion_fails() {
59+
// Given: a json report
60+
let data = converterFixtureCoverageJson.data(using: .utf8)
61+
let coverageReport = try! JSONDecoder().decode(CoverageReport.self, from: data!)
62+
63+
// When: converting it to several output formats
64+
let receivedResult = Xccov.Commands.Generate.convert(report: coverageReport, to: [.coberturaXml, .failable, .failable])
65+
66+
// Then: it is a failure
67+
XCTAssertEqual(receivedResult, Result.failure(Xccov.Error.conversionFailed("")))
68+
}
69+
70+
static var allTests = [
71+
("testFilename_return_expected_value_for_cobertura", testFilename_return_expected_value_for_cobertura),
72+
("testConvert_to_coberturalXml_return_success_when_coverageReport_is_valid", testConvert_to_coberturalXml_return_success_when_coverageReport_is_valid),
73+
("testConvert_to_failable_return_failure", testConvert_to_failable_return_failure),
74+
("testConvert_to_several_outputs_return_success_when_coverageReport_is_valid", testConvert_to_several_outputs_return_success_when_coverageReport_is_valid),
75+
("testConvert_to_several_outputs_return_failure_when_a_conversion_fails", testConvert_to_several_outputs_return_failure_when_a_conversion_fails),
76+
]
77+
}

Tests/CoreTests/Commons/Tools/Result+ApplyTests.swift

Lines changed: 0 additions & 61 deletions
This file was deleted.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//
2+
// Result+MapEachTests.swift
3+
//
4+
//
5+
// Created by Thibault Wittemberg on 2020-07-04.
6+
//
7+
8+
@testable import Core
9+
import XCTest
10+
11+
private enum MockError: Error, Equatable {
12+
case someError
13+
}
14+
15+
final class Result_MapEachTests: XCTestCase {
16+
func testMapEach_give_error_to_onFailure_function_and_return_result_from_onFailure() {
17+
let expectedError = MockError.someError
18+
var receivedError: MockError?
19+
let expectedResult = Result<[Int],MockError>.failure(.someError)
20+
var receivedResult: Result<[Int],MockError>?
21+
let spyFailureFunction: (MockError) -> Result<[Int], MockError> = { error in
22+
receivedError = error
23+
return .failure(error)
24+
}
25+
26+
// Given: a result being a failure
27+
let sut = Result<[Int],MockError>.failure(.someError)
28+
29+
// When: calling mapEach on it
30+
receivedResult = sut.mapEach(onFailure: spyFailureFunction, onSuccess: { return .success($0) })
31+
32+
// Then: the error received in the onFailure function is the one from the failure
33+
XCTAssertEqual(receivedError, expectedError)
34+
35+
// Then: the result of mapEach is the one returned by the onFailure function
36+
XCTAssertEqual(receivedResult, expectedResult)
37+
}
38+
39+
func testMapEach_give_values_to_onSuccess_function_and_return_result_from_onSuccess() {
40+
let expectedValues = [1, 2, 3, 4, 5]
41+
var receivedValues = [Int]()
42+
let expectedResult = Result<[String],MockError>.success(["1", "2", "3", "4", "5"])
43+
var receivedResult: Result<[String],MockError>?
44+
45+
// Given: a result being a success
46+
let spySuccessFunction: (Int) -> Result<String, MockError> = { value in
47+
receivedValues.append(value)
48+
return .success("\(value)")
49+
}
50+
let sut = Result<[Int],MockError>.success([1, 2, 3, 4, 5])
51+
receivedResult = sut.mapEach(onSuccess: spySuccessFunction)
52+
53+
XCTAssertEqual(receivedValues, expectedValues)
54+
XCTAssertEqual(receivedResult, expectedResult)
55+
}
56+
57+
func testMapEach_return_failure_if_onSuccess_return_failure() {
58+
let expectedResult = Result<[String],MockError>.failure(.someError)
59+
var receivedResult: Result<[String],MockError>?
60+
61+
// Given: a result being a success
62+
let spySuccessFunction: (Int) -> Result<String, MockError> = { value in
63+
if value == 3 {
64+
return .failure(MockError.someError)
65+
}
66+
return .success("\(value)")
67+
}
68+
69+
let sut = Result<[Int],MockError>.success([1, 2, 3, 4, 5])
70+
receivedResult = sut.mapEach(onSuccess: spySuccessFunction)
71+
72+
XCTAssertEqual(receivedResult, expectedResult)
73+
}
74+
75+
static var allTests = [
76+
("testMapEach_give_error_to_onFailure_function_and_return_result_from_onFailure", testMapEach_give_error_to_onFailure_function_and_return_result_from_onFailure),
77+
("testMapEach_give_values_to_onSuccess_function_and_return_result_from_onSuccess", testMapEach_give_values_to_onSuccess_function_and_return_result_from_onSuccess),
78+
("testMapEach_return_failure_if_onSuccess_return_failure", testMapEach_return_failure_if_onSuccess_return_failure),
79+
]
80+
}

0 commit comments

Comments
 (0)