<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:HelveticaNeue;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
code
        {mso-style-priority:99;
        font-family:"Courier New";}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.airmailon, li.airmailon, div.airmailon
        {mso-style-name:airmail_on;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
span.p
        {mso-style-name:p;}
span.nf
        {mso-style-name:nf;}
span.s
        {mso-style-name:s;}
span.nv
        {mso-style-name:nv;}
span.kd
        {mso-style-name:kd;}
span.nc
        {mso-style-name:nc;}
span.n
        {mso-style-name:n;}
span.nb
        {mso-style-name:nb;}
span.kc
        {mso-style-name:kc;}
span.k
        {mso-style-name:k;}
span.o
        {mso-style-name:o;}
span.bp
        {mso-style-name:bp;}
span.mi
        {mso-style-name:mi;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Resending as Outlook apparently has trouble including the list instead of just the recipients…<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>---<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Honestly, I’m still confused why this is the approach that is desired to be taken. Why not just provide a way to invoke different runners from within SwiftPM? Like Drew mentioned, this approach still isn’t going to solve the problems we had. We simply provided a mechanism to run various things. This made it <b>extremely</b> trivial to integrate the running of any type of test framework we wanted with <b>no additional</b> work required by anyone.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>With this approach, it is trivial for us to support XCTest runners, shell script tests, tests that required files to be generated first, etc… <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>I’ve also been doing some experiments with different ways to write tests, how would I go about doing that with SwiftPM? <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span class=kd><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>class</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=nc><b><span style='font-family:Consolas;color:#445588;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>Sum</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>{</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp; &nbsp;</span></code><span class=kd><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>func</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=nf><b><span style='font-family:Consolas;color:#990000;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>add</span></b></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>(</span></span><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>x</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=nb><span style='font-family:Consolas;color:#0086B3;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>Int</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>,</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=kc><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>_</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>y</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=nb><span style='font-family:Consolas;color:#0086B3;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>Int</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>)</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>-&gt;</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=nb><span style='font-family:Consolas;color:#0086B3;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>Int</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>{</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=k><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>return</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>x</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=o><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>+</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>y</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>}</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>}</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p>&nbsp;</o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span class=kd><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>func</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=nf><b><span style='font-family:Consolas;color:#990000;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>__test_sum_add_checkin</span></b></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>()</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>throws</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>{</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp; &nbsp;</span></code><span class=kd><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>let</span></b></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=nv><span style='font-family:Consolas;color:teal;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>sum</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>=</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>Sum</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>()</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp; &nbsp;</span></code><span class=bp><span style='font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>assert</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>(</span></span><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>sum</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>.</span></span><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>add</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>(</span></span><span class=mi><span style='font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>4</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>,</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=mi><span style='font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>5</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>)</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>==</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=mi><span style='font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>10</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>,</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=s><span style='font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;Math is hard!&quot;</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>)</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp; &nbsp;</span></code><span class=bp><span style='font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>assert</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>(</span></span><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>sum</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>.</span></span><span class=n><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>add</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>(</span></span><span class=o><b><span style='font-family:Consolas;color:black;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>-</span></b></span><span class=mi><span style='font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>3</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>,</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=mi><span style='font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>3</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>)</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>==</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span></code><span class=mi><span style='font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>0</span></span><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>)</span></span><code><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></code></pre><pre style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span class=p><span style='font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>}</span></span><o:p></o:p></pre><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Then with our build files:<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>(</span><b><span style='font-size:10.0pt;font-family:Consolas;color:#990000;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>package</span></b><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:name</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;IntegratedUnitTests&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp; <o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;</span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:tasks</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> {<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:build</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> {<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:tool</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;atllbuild&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:sources</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> [</span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;Sum.swift&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>]<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:name</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;math&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:output-type</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;static-library&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:publish-product</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:teal;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>true</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:compile-options</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> [</span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;-enable-testing&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>]<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:test</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> {<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:dependencies</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> [</span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;generate-test-file&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>]<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:tool</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;atllbuild&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:sources</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> [</span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;sum_test.swift&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>]<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:name</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;sum_test&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:output-type</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;executable&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:publish-product</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:teal;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>true</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:link-with</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> [</span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;math.a&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>]<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:generate-test-file</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> {<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:dependencies</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> [</span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;build&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>]<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:tool</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;shell&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:script</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;echo '@testable import math' &gt; sum_test.swift &amp;&amp; xcrun -sdk macosx swiftc -print-ast Sum.swift | grep __test | sed 's/internal func/try/g' | sed 's/throws//g' &gt;&gt; sum_test.swift&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:run</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> {<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:dependencies</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> [</span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;test&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>]<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:tool</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;shell&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='font-size:10.0pt;font-family:Consolas;color:#990073;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>:script</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'> </span><span style='font-size:10.0pt;font-family:Consolas;color:#D01040;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&quot;./bin/sum_test&quot;</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'><o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>&nbsp; }<o:p></o:p></span></p><p class=MsoNormal style='background:#F7F7F7;vertical-align:baseline;word-break:break-all'><span style='font-size:10.0pt;font-family:Consolas;color:#111111;border:none windowtext 1.0pt;padding:0in;background:#F7F7F7'>)</span><span style='font-size:10.0pt;font-family:Consolas;color:#111111'><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>More details: <a href="http://owensd.io/blog/tooling-around---testing-in-swift/">http://owensd.io/blog/tooling-around---testing-in-swift/</a><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>It would seem the plan is that I’d then have to go write some additional wrapper if I simply wanted it to work in SwiftPM. That’s not a problem that scales very well.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>-David<o:p></o:p></span></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></b></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'> swift-build-dev-bounces@swift.org [mailto:swift-build-dev-bounces@swift.org] <b>On Behalf Of </b>Brian Pratt via swift-build-dev<br><b>Sent:</b> Thursday, March 17, 2016 10:32 AM<br><b>To:</b> Drew Crawford &lt;drew@sealedabstract.com&gt;; Max Howell &lt;max.howell@apple.com&gt;; Drew Crawford via swift-build-dev &lt;swift-build-dev@swift.org&gt;<br><b>Subject:</b> Re: [swift-build-dev] protocol for third-party testing frameworks<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>To get a bit more concrete:<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><blockquote style='margin-left:30.0pt;margin-right:0in'><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>let package = Package(<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp; name: &quot;MyCoolPackage&quot;,<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp; // etc<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp; targets: [<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp; &nbsp; Target(name: &quot;MyCoolPackageTarget&quot;)<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp;],<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp;testTargets: [<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp; &nbsp; Target(name: &quot;MyCoolTestingTarget&quot;, dependencies: [.Dependency(&quot;one-of-my-test-dependencies&quot;)])<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp; ])<o:p></o:p></span></p></div></blockquote><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>&nbsp;&nbsp;<o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>When someone else uses my package, MyCoolTestingTarget would not be built (although its sources would be present), but MyCoolPackageTarget would be -- if that makes sense. In this way, we'd get ad-hoc support for third-party testing frameworks and also improve the Package Manager to be able to be more useful as a build tool for a whole dev environment as opposed to just a build tool for creating and consuming packages.<o:p></o:p></span></p><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>The only drawback I can think of that falls out of this approach is that 3rd-party testing frameworks wouldn't support the `swift test` command-line invocation, but I'd personally rank that as a lower priority for me than just being able to get more granular control over what gets built in a local context vs what gets built when I'm a dependency of something else.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>Hopefully that clears my idea up a bit more.<o:p></o:p></span></p><div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>--&nbsp;<o:p></o:p></span></p><div><div id="bloop_sign_1458235494777009920"><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>Brian Pratt<o:p></o:p></span></p></div></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=airmailon><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>On March 17, 2016 at 10:05:23 AM, Brian Pratt (<a href="mailto:brian@pratt.io">brian@pratt.io</a>) wrote:<o:p></o:p></span></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>Hey folks,<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>I think from my perspective SwiftPM could solve this problem by simply allowing me to define and build targets that aren't going to be included in the distributed package. Maybe a field like `testTargets` or something that allows the author downstream to link `testDependencies`?<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>SwiftPM is great as a package manager, but for a lot of my most common development workflows, it falls short because of this limitation -- I can't use it to build things that I don't mean to distribute as part of the package.<o:p></o:p></span></p></div><div id="bloop_customfont"><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div id="bloop_sign_1458226907414573056"><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>--&nbsp;<br>Brian Pratt<o:p></o:p></span></p></div></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><p class=airmailon><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>On March 16, 2016 at 8:39:02 PM, Drew Crawford via swift-build-dev (<a href="mailto:swift-build-dev@swift.org">swift-build-dev@swift.org</a>) wrote:<o:p></o:p></span></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>Please take the lead on this. <o:p></o:p></span></p><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>For background. &nbsp;We required a solution around the time I was working on this originally, and given that upstream wasn't ready (which is understandable) we decided to go alone, and we're now committed to our solution. &nbsp;So from our POV the problem has been solved.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>On Mar 16, 2016, at 8:12 PM, Max Howell &lt;<a href="mailto:max.howell@apple.com">max.howell@apple.com</a>&gt; wrote:<o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>It’s time to resurrect this proposal. <o:p></o:p></span></p><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>By all means let’s talk a bit more here, but I hope Drew will submit a proposal, or if he doesn’t have the time I can write it up, co-authored and we’ll submit to evolution.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>On Jan 12, 2016, at 5:02 PM, Max Howell &lt;<a href="mailto:max.howell@apple.com">max.howell@apple.com</a>&gt; wrote:<o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>To follow up here, I’d like to put this particular proposal on the back burner for a couple weeks until we have the initial testing infrastructure in place. <o:p></o:p></span></p><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>We should keep this proposal in mind as we build the testing infrastructure, as this protocol is in my mind at least, the more important of the two.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>On Jan 6, 2016, at 11:58 AM, Max Howell via swift-build-dev &lt;<a href="mailto:swift-build-dev@swift.org">swift-build-dev@swift.org</a>&gt; wrote:<o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><div><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"HelveticaNeue",serif'>I envisaged command line arguments to `swift build`. What use cases are we talking about here for making which tests run more configurable?</span><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p></o:p></span></p></div></blockquote></div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>Well I think some kind of CLI support (like perhaps passing the whole CLI to the testing framework?) makes sense.<o:p></o:p></span></p></div></div></div></blockquote><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>That’s our current thinking.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>Specifically one problem that motivates flexibility here is the per-commit continuous integration. If my test suite is 15 minutes, and I'm going to run that in a few different configurations &nbsp;(32 vs 64-bit, or say we support iOS someday and I'm cross-compiling for N simulators or hardware devices, etc.) I'm in for a bad time trying to do all that every commit.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>There are a lot of &quot;solutions&quot; here–parallelization, random sampling, running an abbreviated test suite ordinarily and the full test suite every 10th commit–a test suite that tries to maximize code coverage per unit time–there are all kinds of ways to look at this problem that may make sense to somebody.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>I'm simply pushing that decision out to individual test frameworks to study. &nbsp;XCTest thinks you should have test suites that are human curated. &nbsp;That's one way to skin the cat. &nbsp;Let's give another test framework the flexibility to think differently on this problem.<o:p></o:p></span></p></div></div></div></blockquote><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>Sounds super interesting. We should make sure the protocol we design can do these things.<o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><br><br><o:p></o:p></span></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal><span style='font-size:13.5pt;font-family:"HelveticaNeue",serif'>I’ll be working on the testing infrastructure as soon as the proposal has been reviewed. As I do so I’ll be making notes on this aspect.</span><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p></o:p></span></p></blockquote><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>Thanks for picking this up. &nbsp;Getting basic testing support in place is really important, and IMO the current proposal is really strong. &nbsp;I am focusing on some of these other areas not as a distraction but because I think the basic testing ideas are strong enough already that they don't need my help :-)<o:p></o:p></span></p></div></div></div></blockquote></div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><br></span><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><img border=0 width=1 height=1 id="_x0000_i1025" src="https://u2002410.ct.sendgrid.net/wf/open?upn=cbMbdH1LnH6O78Q-2BHw3jtU8ikibH470Fh9meAJKpwSqpJeTKnMxtBKMcwgO6eNd7RiBAIn9BZYPOs2eHgzutG3iFkECUBpSh2YJRbpFs5gYIFdbbC8ItMNA7gp-2BqGK4cWwBss4mY6Uv8sMAwKkzb1-2B1rswus8P2lPVMLer7xFPfSEQS6c96lmiGJyiZhqf-2F-2BJOnpV-2BhXXERxFHP94bzeH6uMWF-2B662RYrOYdPl-2FmMCE-3D"></span><span class=apple-converted-space><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>&nbsp;</span></span><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'>_______________________________________________<br>swift-build-dev mailing list<br></span><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><a href="mailto:swift-build-dev@swift.org"><span style='font-size:13.5pt'>swift-build-dev@swift.org</span></a></span><span style='font-size:13.5pt;font-family:"Helvetica",sans-serif'><br></span><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><a href="https://lists.swift.org/mailman/listinfo/swift-build-dev"><span style='font-size:13.5pt'>https://lists.swift.org/mailman/listinfo/swift-build-dev</span></a><o:p></o:p></span></p></div></blockquote></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div></div></div></blockquote></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div></div></div></blockquote></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'><o:p>&nbsp;</o:p></span></p></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>_______________________________________________<br>swift-build-dev mailing list<br><a href="mailto:swift-build-dev@swift.org">swift-build-dev@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-build-dev">https://lists.swift.org/mailman/listinfo/swift-build-dev</a><o:p></o:p></span></p></div></div></blockquote></div></div></blockquote></div></div></div></div></div></body></html>