@@ -13,113 +13,55 @@ import XCTest
1313import TSCBasic
1414import TSCTestSupport
1515
16- private enum DummyError : Swift . Error {
16+ private enum DummyError : Error , Equatable {
1717 case somethingWentWrong
1818}
1919
20- private enum OtherDummyError : Swift . Error {
20+ private enum OtherDummyError : Error , Equatable {
2121 case somethingElseWentWrong
2222 case andYetAnotherThingToGoWrong
2323}
2424
2525class ResultTests : XCTestCase {
26-
27- func testAnyError( ) {
28- func doSomething( right: Bool ) -> Result < String , AnyError > {
29- if right {
30- return . success( " All OK. " )
31- }
32- return Result ( DummyError . somethingWentWrong)
33- }
34-
35- // Success.
36- switch doSomething ( right: true ) {
37- case . success( let string) :
38- XCTAssertEqual ( string, " All OK. " )
39- case . failure( let error) :
40- XCTFail ( " Unexpected failure: \( error) " )
41- }
42-
43- // Error.
44- switch doSomething ( right: false ) {
45- case . success( let string) :
46- XCTFail ( " Unexpected success: \( string) " )
47- case . failure( let error) :
48- XCTAssertEqual ( error. underlyingError as? DummyError , DummyError . somethingWentWrong)
49- }
50-
51- do {
52- // Create an any error and check it doesn't nest.
53- let error = AnyError ( DummyError . somethingWentWrong)
54- XCTAssertEqual ( error. underlyingError as? DummyError , DummyError . somethingWentWrong)
55- let nested = AnyError ( error)
56- XCTAssertEqual ( nested. underlyingError as? DummyError , DummyError . somethingWentWrong)
57-
58- // Check can create result directly from error.
59- let result : Result < String , AnyError > = Result ( DummyError . somethingWentWrong)
60- if case let . failure( resultError) = result {
61- XCTAssertEqual ( resultError. underlyingError as? DummyError , DummyError . somethingWentWrong)
62- } else {
63- XCTFail ( " Wrong result value \( result) " )
64- }
65- }
66-
67- do {
68- // Check any error closure initializer.
69- func throwing( ) throws -> String {
70- throw DummyError . somethingWentWrong
71- }
72- let result = Result ( anyError: { try throwing ( ) } )
73- if case let . failure( resultError) = result {
74- XCTAssertEqual ( resultError. underlyingError as? DummyError , DummyError . somethingWentWrong)
75- } else {
76- XCTFail ( " Wrong result value \( result) " )
77- }
78- }
26+ func testTryMap( ) {
27+ let result1 = Result < Int , Error > . success ( 1 ) . tryMap ( { $0 + 1 } )
28+ XCTAssertEqual ( result1. success, 2 )
29+
30+ let result2 = Result < Int , Error > . failure ( DummyError . somethingWentWrong) . tryMap ( { ( value: Int ) -> Int in
31+ XCTFail ( " should not reach here " )
32+ return value
33+ } )
34+ XCTAssertEqual ( result2. failure as? DummyError , DummyError . somethingWentWrong)
35+
36+ let result3 = Result < Int , Error > . success ( 1 ) . tryMap ( { ( value: Int ) -> Int in
37+ throw OtherDummyError . somethingElseWentWrong
38+ } )
39+ XCTAssertEqual ( result3. failure as? OtherDummyError , OtherDummyError . somethingElseWentWrong)
40+
41+ let result4 = Result < Int , Error > . failure ( DummyError . somethingWentWrong) . tryMap ( { ( value: Int ) -> Int in
42+ XCTFail ( " should not reach here " )
43+ throw OtherDummyError . somethingElseWentWrong
44+ } )
45+ XCTAssertEqual ( result4. failure as? DummyError , DummyError . somethingWentWrong)
7946 }
47+ }
8048
81- func testMapAny( ) throws {
82- func throwing( _ shouldThrow: Bool ) throws -> String {
83- if shouldThrow {
84- throw DummyError . somethingWentWrong
85- }
86- return " World "
87- }
88-
89- // We should be able to map when we have value in result and our closure doesn't throw.
90- let success = Result < String , AnyError > . success ( " Hello " ) . mapAny { value -> String in
91- let second = try throwing ( false )
92- return value + second
93- }
94- XCTAssertEqual ( try success. get ( ) , " Hello World " )
95-
96- // We don't have a value, closure shouldn't matter.
97- let failure1 = Result < String , AnyError > ( DummyError . somethingWentWrong) . mapAny { value -> String in
98- let second = try throwing ( false )
99- return value + second
100- }
101- XCTAssertThrowsAny ( DummyError . somethingWentWrong) {
102- _ = try failure1. get ( )
103- }
104-
105- // We have a value, but our closure throws.
106- let failure2 = Result < String , AnyError > . success ( " Hello " ) . mapAny { value -> String in
107- let second = try throwing ( true )
108- return value + second
109- }
110- XCTAssertThrowsAny ( DummyError . somethingWentWrong) {
111- _ = try failure2. get ( )
49+ extension Result {
50+ var success : Success ? {
51+ switch self {
52+ case . success( let success) :
53+ return success
54+ case . failure:
55+ return nil
11256 }
11357 }
114- }
11558
116- public func XCTAssertThrowsAny< T: Swift . Error > ( _ expectedError: T , file: StaticString = #file, line: UInt = #line, _ body: ( ) throws -> ( ) ) where T: Equatable {
117- do {
118- try body ( )
119- XCTFail ( " body completed successfully " , file: file, line: line)
120- } catch let error as AnyError {
121- XCTAssertEqual ( error. underlyingError as? T , expectedError, file: file, line: line)
122- } catch {
123- XCTFail ( " unexpected error thrown " , file: file, line: line)
59+ var failure : Failure ? {
60+ switch self {
61+ case . success:
62+ return nil
63+ case . failure( let error) :
64+ return error
65+ }
12466 }
12567}
0 commit comments