<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8">
<title></title>
</head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">On Sat, Jan 9, 2016, at 06:58 PM, Chris Hanson via swift-evolution wrote:<br class=""></div>
<blockquote type="cite" class=""><div class="">We’d like feedback on a proposed design for adding support for Swift error handling to XCTest, attached below. I’ll mostly let the proposal speak for itself, but there are three components to it: Allowing test methods to throw errors, allowing the expressions evaluated by assertions to throw errors, and adding an assertion for checking error handling.<br class=""></div>
<div class="">&nbsp;</div>
<div class=""><div class="">We’d love to hear your feedback. We’re particularly interested in some feedback on the idea of allowing the expressions evaluated by assertions to throw errors; it’s generated some debate because it results in writing test code slightly differently than other code that makes use of Swift error handling, so any thoughts on it would be particularly appreciated.<br class=""></div>
</div>
</blockquote><div class="">&nbsp;</div>
<div class="">Very strong +1 to the entire proposal. I've been meaning to submit something like this for a while, though not as comprehensive as what you have here. In particular, making all the @autoclosure-accepting functions take a throwing closure and reporting errors as failures solves my biggest annoyance with XCTest. Making the test functions themselves also be able to throw is a neat idea too. And the trailing closure argument to&nbsp;XCTAssertThrowsError is a good idea.<br class=""></div>
<div class="">&nbsp;</div>
<div class="">The only change I'd like to make to this proposal is to&nbsp;XCTAssertThrowsError. Instead of having it take an autoclosure that returns Void, it should just be generic so it can take a closure that returns any type. That gets rid of the need for `_ =` in the argument, and XCTest could even report the actual return value in the event that the closure does not, in fact, throw an error.<br class=""></div>
<div class="">&nbsp;</div>
<div class="">I also wonder if maybe there's some utility in adding an overload to&nbsp;XCTAssertThrowsError that accepts any Equatable ErrorType as the second parameter, to simplify the cases where you do want to test against some specific error that happens to be Equatable. Although I'm not sure how likely it is for any given ErrorType to also be Equatable. The overload might look like<br class=""></div>
<div class="">&nbsp;</div>
<div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">public</span> <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">func</span> XCTAssertThrowsError&lt;T, E: <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">ErrorType</span> <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">where</span> <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">E</span>: Equatable&gt;(</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">@autoclosure</span> expression: () <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">throws</span> -&gt; <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">T</span>,</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">_</span> message: <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">String</span> = <span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b" class="">""</span>,</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; file: <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">StaticString</span> = <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">__FILE__</span>,</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; line: <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">UInt</span> = <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">__LINE__</span>,</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">_</span> expectedError: <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">E</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">) {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; XCTAssertThrowsError(expression, message, file: file, line: line) { error <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">in</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">if</span> <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">let</span> error = error <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">as</span>? <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">E</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">if</span> error != expectedError {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XCTFail(<span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b" class="">"Expected error </span>\<span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b" class="">(</span>expectedError<span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b" class="">), found error </span>\<span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b" class="">(</span>error<span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b" class="">)"</span>)</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; } <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">else</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(209, 47, 27);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XCTFail(</span>"Unexpected type of error thrown: <span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">\</span>(<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">error</span>)"<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">)</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">}</div><div class="">&nbsp;<br class=""></div>
<div class="">-Kevin Ballard</div>


</body></html>