Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Tenta.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
744C2686216D00C000A40EA6 /* RoseTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 744C2683216D00B700A40EA6 /* RoseTreeTests.swift */; };
8E890091C35AF754B7E1E33E /* Bool+Generatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89031F831C25B5D6457A77 /* Bool+Generatable.swift */; };
8E8900968962CCF89B869AEA /* XCTestCaseExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E890DA1F1C83F46E0731E1A /* XCTestCaseExtensionTests.swift */; };
8E8900A25B6CB48C491503A6 /* Reporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E890F45B43FBE566DDC89E4 /* Reporter.swift */; };
8E8900E77EB4A26AF75CAA84 /* CircularBufferTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89014FC3E3BE10228A043D /* CircularBufferTests.swift */; };
8E890107B6B80B99042FD749 /* String+Generatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E8907EA7C17DE23D1AF85AC /* String+Generatable.swift */; };
8E89012AA18EDB966D3BDB79 /* SeededRandomNumberGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E890EF7AE76B901FA571DED /* SeededRandomNumberGenerator.swift */; };
Expand All @@ -61,6 +62,7 @@
8E8906B90C67FCA8540DD929 /* Generatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E890BE14D9CEC77ED2315A7 /* Generatable.swift */; };
8E8907E3EB2B315C63D98D23 /* SeededRandomNumberGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89037A71F17CA04A21C5E7 /* SeededRandomNumberGeneratorTests.swift */; };
8E8907FC12761000679288B8 /* Generator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E890F17CFDEDA3A1F1C4266 /* Generator.swift */; };
8E89083ABE3DD88C9455A54B /* Reporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E890F45B43FBE566DDC89E4 /* Reporter.swift */; };
8E89084C41667E68D4A52EA4 /* FiniteStateMachine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E8909FF491E3D8C5BF4497A /* FiniteStateMachine.swift */; };
8E8908CDF873E0791E3A2CF6 /* evil-strings.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8E890C2BAD6FF2E57604074B /* evil-strings.txt */; };
8E8908D97BEF134D3D8B005D /* Foundation+Generatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E8902E7FE2569C37E8D2AB1 /* Foundation+Generatable.swift */; };
Expand Down Expand Up @@ -137,6 +139,7 @@
8E890EF7AE76B901FA571DED /* SeededRandomNumberGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeededRandomNumberGenerator.swift; sourceTree = "<group>"; };
8E890EF83249CB80070A243C /* TestResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestResult.swift; sourceTree = "<group>"; };
8E890F17CFDEDA3A1F1C4266 /* Generator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Generator.swift; sourceTree = "<group>"; };
8E890F45B43FBE566DDC89E4 /* Reporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reporter.swift; sourceTree = "<group>"; };
8E890FF115A2715C7DDE9499 /* Property.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Property.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

Expand Down Expand Up @@ -236,6 +239,7 @@
8E8909FF491E3D8C5BF4497A /* FiniteStateMachine.swift */,
8E890C2BAD6FF2E57604074B /* evil-strings.txt */,
8E890EF83249CB80070A243C /* TestResult.swift */,
8E890F45B43FBE566DDC89E4 /* Reporter.swift */,
);
path = Tenta;
sourceTree = "<group>";
Expand Down Expand Up @@ -489,6 +493,7 @@
8E8903358C93EA8B472455E2 /* CGTypes+Generatable.swift in Sources */,
8E890CE95DFCAC3B44AF6DCB /* String+Evil.swift in Sources */,
8E890A940419672020899DCA /* TestResult.swift in Sources */,
8E89083ABE3DD88C9455A54B /* Reporter.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -533,6 +538,7 @@
8E89084C41667E68D4A52EA4 /* FiniteStateMachine.swift in Sources */,
8E890FB058E6FACEA1E3C6C5 /* String+Evil.swift in Sources */,
8E8903DBF76DACCFE2DF4020 /* TestResult.swift in Sources */,
8E8900A25B6CB48C491503A6 /* Reporter.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
28 changes: 28 additions & 0 deletions Tenta/Reporter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// Created by Niil Öhlin on 2018-12-20.
// Copyright (c) 2018 Niil Öhlin. All rights reserved.
//

import Foundation
import XCTest

public struct Reporter<TestValue> {
let report: (TestResult<TestValue>) -> Void
}

public extension Reporter {
static var xcTestReporter: Reporter<TestValue> {
return Reporter { result in
switch result.type {
case .succeeded:
print("success")
case .failed(value: _, shrunkValue: let value, shrinks: _):
XCTFail(
"failed with value: \(value), rerun with seed: \(result.seed)",
file: result.file,
line: result.line
)
}
}
}
}
17 changes: 14 additions & 3 deletions Tenta/TestResult.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,18 @@

import Foundation

public enum TestResult<TestedType> {
case succeeded
case failed(value: TestedType, shrunkValue: TestedType, shrinks: Int)
public struct TestResult<TestedType> {
public enum ResultType<TestedType> {
case succeeded
case failed(
value: TestedType,
shrunkValue: TestedType,
shrinks: Int,
file: StaticString,
line: UInt
)
}
let type: ResultType<TestedType>
let seed: UInt64
let numberOfTests: UInt
}
5 changes: 2 additions & 3 deletions Tenta/XCTest+Property.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,12 @@ public extension XCTestCase {
@discardableResult
func runProperty<TestValue>(
_ property: Property<TestValue>,
_ reporter: Reporter<TestValue> = .xcTestReporter,
file: StaticString = #file,
line: UInt = #line
) -> TestResult<TestValue> {
let testResult = property.checkProperty()
if case let .failed(_, shrunk, _) = testResult {
XCTFail("failed with value: \(shrunk), rerun with seed: \(seed)", file: file, line: line)
}
reporter.report(testResult)
return testResult
}

Expand Down