From cdd9616d85966651781b790e7ab181c51151a6fd Mon Sep 17 00:00:00 2001 From: thomhurst Date: Tue, 17 Sep 2024 19:11:05 +0000 Subject: [PATCH] deploy: c1ffaa9f9d9b0d4417a009bc67eca15c2cc932ad --- 404.html | 2 +- assets/js/12f8ba17.0be96710.js | 1 + assets/js/12f8ba17.0d1bf780.js | 1 - assets/js/2a9ef78c.5c306a53.js | 1 + assets/js/2a9ef78c.d1cda784.js | 1 - assets/js/{4c5555c4.c0a83f77.js => 4c5555c4.aa2b97b0.js} | 2 +- assets/js/{914d3ab3.9f6560a4.js => 914d3ab3.29c23d13.js} | 2 +- assets/js/a66eab3e.3dce092e.js | 1 - assets/js/a66eab3e.672ceccf.js | 1 + .../{runtime~main.57504d6b.js => runtime~main.3997fd90.js} | 2 +- docs/category/extensions/index.html | 2 +- docs/category/test-framework-comparisons/index.html | 4 ++-- docs/category/tutorial---assertions/index.html | 4 ++-- docs/category/tutorial---basics/index.html | 2 +- docs/category/tutorial---extras/index.html | 2 +- docs/comparison/attributes/index.html | 2 +- docs/comparison/framework-differences/index.html | 2 +- docs/extensions/index.html | 2 +- docs/intro/index.html | 2 +- docs/tutorial-assertions/and-conditions/index.html | 4 ++-- docs/tutorial-assertions/awaiting/index.html | 4 ++-- docs/tutorial-assertions/congratulations/index.html | 6 +++--- docs/tutorial-assertions/delegates/index.html | 6 +++--- docs/tutorial-assertions/extensibility/index.html | 7 ++++--- docs/tutorial-assertions/or-conditions/index.html | 4 ++-- docs/tutorial-assertions/scopes/index.html | 4 ++-- docs/tutorial-assertions/type-checking/index.html | 4 ++-- docs/tutorial-basics/congratulations/index.html | 2 +- docs/tutorial-basics/data-driven-tests/index.html | 2 +- docs/tutorial-basics/data-source-driven-tests/index.html | 2 +- docs/tutorial-basics/installing/index.html | 2 +- docs/tutorial-basics/matrix-tests/index.html | 2 +- docs/tutorial-basics/running-your-tests/index.html | 2 +- docs/tutorial-basics/things-to-know/index.html | 2 +- docs/tutorial-basics/writing-your-first-test/index.html | 2 +- docs/tutorial-extras/class-constructors/index.html | 2 +- docs/tutorial-extras/cleanup/index.html | 2 +- docs/tutorial-extras/depends-on/index.html | 2 +- docs/tutorial-extras/executors/index.html | 2 +- docs/tutorial-extras/explicit/index.html | 2 +- docs/tutorial-extras/not-in-parallel/index.html | 2 +- docs/tutorial-extras/order/index.html | 2 +- docs/tutorial-extras/parallel-limiter/index.html | 2 +- docs/tutorial-extras/properties/index.html | 2 +- docs/tutorial-extras/repeating/index.html | 2 +- docs/tutorial-extras/retrying/index.html | 2 +- docs/tutorial-extras/setup/index.html | 2 +- docs/tutorial-extras/test-context/index.html | 2 +- docs/tutorial-extras/test-filters/index.html | 2 +- docs/tutorial-extras/timeouts/index.html | 2 +- index.html | 2 +- markdown-page/index.html | 2 +- 52 files changed, 63 insertions(+), 62 deletions(-) create mode 100644 assets/js/12f8ba17.0be96710.js delete mode 100644 assets/js/12f8ba17.0d1bf780.js create mode 100644 assets/js/2a9ef78c.5c306a53.js delete mode 100644 assets/js/2a9ef78c.d1cda784.js rename assets/js/{4c5555c4.c0a83f77.js => 4c5555c4.aa2b97b0.js} (58%) rename assets/js/{914d3ab3.9f6560a4.js => 914d3ab3.29c23d13.js} (97%) delete mode 100644 assets/js/a66eab3e.3dce092e.js create mode 100644 assets/js/a66eab3e.672ceccf.js rename assets/js/{runtime~main.57504d6b.js => runtime~main.3997fd90.js} (94%) diff --git a/404.html b/404.html index 70c5c1c352..e572f024cd 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Page Not Found | TUnit - + diff --git a/assets/js/12f8ba17.0be96710.js b/assets/js/12f8ba17.0be96710.js new file mode 100644 index 0000000000..57da04879e --- /dev/null +++ b/assets/js/12f8ba17.0be96710.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[8887],{511:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=n(4848),i=n(8453);const r={sidebar_position:7},o="Extensibility / Custom Assertions",a={id:"tutorial-assertions/extensibility",title:"Extensibility / Custom Assertions",description:"The TUnit Assertions can be easily extended so that you can create your own assertions.",source:"@site/docs/tutorial-assertions/extensibility.md",sourceDirName:"tutorial-assertions",slug:"/tutorial-assertions/extensibility",permalink:"/TUnit/docs/tutorial-assertions/extensibility",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Delegates",permalink:"/TUnit/docs/tutorial-assertions/delegates"},next:{title:"Congratulations",permalink:"/TUnit/docs/tutorial-assertions/congratulations"}},l={},c=[];function d(e){const t={code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"extensibility--custom-assertions",children:"Extensibility / Custom Assertions"})}),"\n",(0,s.jsx)(t.p,{children:"The TUnit Assertions can be easily extended so that you can create your own assertions."}),"\n",(0,s.jsx)(t.p,{children:"In TUnit, there are two types of things we can assert on:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Values"}),"\n",(0,s.jsx)(t.li,{children:"Delegates"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Values is what you'd guess, some basic return value, such as a ",(0,s.jsx)(t.code,{children:"string"})," or ",(0,s.jsx)(t.code,{children:"int"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Delegates are bits of code that haven't executed yet - Instead they are passed into the assertion builder, and the TUnit assertion library will execute it. If it throws, then there will be an ",(0,s.jsx)(t.code,{children:"Exception"})," object we can check in our assertion."]}),"\n",(0,s.jsx)(t.p,{children:"So to create a custom assertion:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Create a class that inherits from ",(0,s.jsx)(t.code,{children:"AssertCondition"}),"\n",(0,s.jsx)(t.code,{children:"TActual"})," will the the type of object that is being asserted. For example if I started with ",(0,s.jsx)(t.code,{children:'Assert.That("Some text")'})," then ",(0,s.jsx)(t.code,{children:"TActual"})," would be a ",(0,s.jsx)(t.code,{children:"string"})," because that's what we're asserting on."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"TExpected"})," will be the data (if any) that you receive from your extension method, so you'll be responsible for passing this in. You must pass it to the base class via the base constructor: ",(0,s.jsx)(t.code,{children:"base(expectedValue)"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Override the method:\n",(0,s.jsx)(t.code,{children:"private protected override bool Passes(TActual? actualValue, Exception? exception)"})]}),"\n",(0,s.jsx)(t.p,{children:"If this method returns a bool, then your assertion has passed, if it hasn't, then your exception will throw."}),"\n",(0,s.jsxs)(t.p,{children:["To access ",(0,s.jsx)(t.code,{children:"TExpected"})," here, it's an accessible property called ",(0,s.jsx)(t.code,{children:"ExpectedValue"})]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Exception"})," object will be populated if your assertion is a Delegate type and the delegate threw."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"TActual"})," object will be populated if a value was passed into ",(0,s.jsx)(t.code,{children:"Assert.That(...)"}),", or a delegate with a return value was executed successfully."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Override the ",(0,s.jsx)(t.code,{children:"GetFailureMessage"})," method to return a message when the assertion fails."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Create the extension method!\nThis is where things can start to look daunting because of the generic constraints, but this allows chaining assertions together."}),"\n",(0,s.jsxs)(t.p,{children:["You need to create an extension off of either ",(0,s.jsx)(t.code,{children:"IValueSource"})," or ",(0,s.jsx)(t.code,{children:"IDelegateSource"})," - Depending on what you're planning to write an assertion for. By extending off of the relevant interface we make sure that it won't be shown where it doesn't make sense thanks to the C# typing system."]}),"\n",(0,s.jsxs)(t.p,{children:["Your return type for the extension method should be ",(0,s.jsx)(t.code,{children:"InvokableAssertionBuilder"})]}),"\n",(0,s.jsxs)(t.p,{children:["And then finally, you just new up your custom assert condition class, and then call the extension method ",(0,s.jsx)(t.code,{children:"ChainedTo(source.AssertionBuilder, [...argumentExpression])"})," on it, which will add it to our assertion builder. You don't have to worry what that's doing behind the scenes, it's just building rules that can chain together."]}),"\n",(0,s.jsxs)(t.p,{children:["The argument expression array allows you to pass in ",(0,s.jsx)(t.code,{children:"[CallerArgumentExpression]"})," values so that your assertion errors show you the code executed to give clear exception messages."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Here's a fully fledged assertion in action:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-csharp",children:'public static InvokableAssertionBuilder Contains(this IValueSource valueSource, string expected, StringComparison stringComparison, [CallerArgumentExpression("expected")] string doNotPopulateThisValue1 = "", [CallerArgumentExpression("stringComparison")] string doNotPopulateThisValue2 = "")\n where TAnd : IAnd\n where TOr : IOr\n {\n return new StringContainsAssertCondition(expected, stringComparison)\n .ChainedTo(valueSource.AssertionBuilder, [doNotPopulateThisValue1, doNotPopulateThisValue2]);\n }\n'})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-csharp",children:'public class StringContainsAssertCondition(string expected, StringComparison stringComparison)\n : AssertCondition(expected)\n{\n private protected override bool Passes(string? actualValue, Exception? exception)\n {\n if (actualValue is null)\n {\n OverriddenMessage = "Actual string is null";\n return false;\n }\n \n if (ExpectedValue is null)\n {\n OverriddenMessage = "Expected string is null";\n return false;\n }\n \n return actualValue.Contains(ExpectedValue, stringComparison);\n }\n\n protected internal override string GetFailureMessage() => $"""\n Expected "{ActualValue}" to contain "{ExpectedValue}"\n """;\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>a});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12f8ba17.0d1bf780.js b/assets/js/12f8ba17.0d1bf780.js deleted file mode 100644 index eb582f0d31..0000000000 --- a/assets/js/12f8ba17.0d1bf780.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[8887],{511:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=s(4848),i=s(8453);const r={sidebar_position:7},o="Extensibility / Custom Assertions",a={id:"tutorial-assertions/extensibility",title:"Extensibility / Custom Assertions",description:"The TUnit Assertions can be easily extended so that you can create your own assertions.",source:"@site/docs/tutorial-assertions/extensibility.md",sourceDirName:"tutorial-assertions",slug:"/tutorial-assertions/extensibility",permalink:"/TUnit/docs/tutorial-assertions/extensibility",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Congratulations",permalink:"/TUnit/docs/tutorial-assertions/congratulations"},next:{title:"Test Framework Comparisons",permalink:"/TUnit/docs/category/test-framework-comparisons"}},l={},c=[];function d(e){const t={code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"extensibility--custom-assertions",children:"Extensibility / Custom Assertions"})}),"\n",(0,n.jsx)(t.p,{children:"The TUnit Assertions can be easily extended so that you can create your own assertions."}),"\n",(0,n.jsx)(t.p,{children:"In TUnit, there are two types of things we can assert on:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Values"}),"\n",(0,n.jsx)(t.li,{children:"Delegates"}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Values is what you'd guess, some basic return value, such as a ",(0,n.jsx)(t.code,{children:"string"})," or ",(0,n.jsx)(t.code,{children:"int"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Delegates are bits of code that haven't executed yet - Instead they are passed into the assertion builder, and the TUnit assertion library will execute it. If it throws, then there will be an ",(0,n.jsx)(t.code,{children:"Exception"})," object we can check in our assertion."]}),"\n",(0,n.jsx)(t.p,{children:"So to create a custom assertion:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Create a class that inherits from ",(0,n.jsx)(t.code,{children:"AssertCondition"}),"\n",(0,n.jsx)(t.code,{children:"TActual"})," will the the type of object that is being asserted. For example if I started with ",(0,n.jsx)(t.code,{children:'Assert.That("Some text")'})," then ",(0,n.jsx)(t.code,{children:"TActual"})," would be a ",(0,n.jsx)(t.code,{children:"string"})," because that's what we're asserting on."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"TExpected"})," will be the data (if any) that you receive from your extension method, so you'll be responsible for passing this in. You must pass it to the base class via the base constructor: ",(0,n.jsx)(t.code,{children:"base(expectedValue)"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Override the method:\n",(0,n.jsx)(t.code,{children:"private protected override bool Passes(TActual? actualValue, Exception? exception)"})]}),"\n",(0,n.jsx)(t.p,{children:"If this method returns a bool, then your assertion has passed, if it hasn't, then your exception will throw."}),"\n",(0,n.jsxs)(t.p,{children:["To access ",(0,n.jsx)(t.code,{children:"TExpected"})," here, it's an accessible property called ",(0,n.jsx)(t.code,{children:"ExpectedValue"})]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"Exception"})," object will be populated if your assertion is a Delegate type and the delegate threw."]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"TActual"})," object will be populated if a value was passed into ",(0,n.jsx)(t.code,{children:"Assert.That(...)"}),", or a delegate with a return value was executed successfully."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Override the ",(0,n.jsx)(t.code,{children:"GetFailureMessage"})," method to return a message when the assertion fails."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Create the extension method!\nThis is where things can start to look daunting because of the generic constraints, but this allows chaining assertions together."}),"\n",(0,n.jsxs)(t.p,{children:["You need to create an extension off of either ",(0,n.jsx)(t.code,{children:"IValueSource"})," or ",(0,n.jsx)(t.code,{children:"IDelegateSource"})," - Depending on what you're planning to write an assertion for. By extending off of the relevant interface we make sure that it won't be shown where it doesn't make sense thanks to the C# typing system."]}),"\n",(0,n.jsxs)(t.p,{children:["Your return type for the extension method should be ",(0,n.jsx)(t.code,{children:"InvokableAssertionBuilder"})]}),"\n",(0,n.jsxs)(t.p,{children:["And then finally, you just new up your custom assert condition class, and then call the extension method ",(0,n.jsx)(t.code,{children:"ChainedTo(source.AssertionBuilder, [...argumentExpression])"})," on it, which will add it to our assertion builder. You don't have to worry what that's doing behind the scenes, it's just building rules that can chain together."]}),"\n",(0,n.jsxs)(t.p,{children:["The argument expression array allows you to pass in ",(0,n.jsx)(t.code,{children:"[CallerArgumentExpression]"})," values so that your assertion errors show you the code executed to give clear exception messages."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Here's a fully fledged assertion in action:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-csharp",children:'public static InvokableAssertionBuilder Contains(this IValueSource valueSource, string expected, StringComparison stringComparison, [CallerArgumentExpression("expected")] string doNotPopulateThisValue1 = "", [CallerArgumentExpression("stringComparison")] string doNotPopulateThisValue2 = "")\n where TAnd : IAnd\n where TOr : IOr\n {\n return new StringContainsAssertCondition(expected, stringComparison)\n .ChainedTo(valueSource.AssertionBuilder, [doNotPopulateThisValue1, doNotPopulateThisValue2]);\n }\n'})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a9ef78c.5c306a53.js b/assets/js/2a9ef78c.5c306a53.js new file mode 100644 index 0000000000..bd7cde24ed --- /dev/null +++ b/assets/js/2a9ef78c.5c306a53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[7564],{2381:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var o=n(4848),s=n(8453);const i={sidebar_position:8},r="Congratulations",a={id:"tutorial-assertions/congratulations",title:"Congratulations",description:"That's all you need to know about assertions.",source:"@site/docs/tutorial-assertions/congratulations.md",sourceDirName:"tutorial-assertions",slug:"/tutorial-assertions/congratulations",permalink:"/TUnit/docs/tutorial-assertions/congratulations",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Extensibility / Custom Assertions",permalink:"/TUnit/docs/tutorial-assertions/extensibility"},next:{title:"Test Framework Comparisons",permalink:"/TUnit/docs/category/test-framework-comparisons"}},c={},u=[];function l(t){const e={code:"code",h1:"h1",header:"header",p:"p",...(0,s.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"congratulations",children:"Congratulations"})}),"\n",(0,o.jsx)(e.p,{children:"That's all you need to know about assertions."}),"\n",(0,o.jsxs)(e.p,{children:["There are many out-of-the-box methods for checking things on common object types:\n",(0,o.jsx)(e.code,{children:"DateTime"}),", ",(0,o.jsx)(e.code,{children:"TimeSpan"}),", ",(0,o.jsx)(e.code,{children:"IEnumerable"}),", ",(0,o.jsx)(e.code,{children:"string"}),", ",(0,o.jsx)(e.code,{children:"INumber"})]}),"\n",(0,o.jsx)(e.p,{children:"If something is missing, feel free to raise an issue/suggestion on GitHub."})]})}function d(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>r,x:()=>a});var o=n(6540);const s={},i=o.createContext(s);function r(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a9ef78c.d1cda784.js b/assets/js/2a9ef78c.d1cda784.js deleted file mode 100644 index efe50990dc..0000000000 --- a/assets/js/2a9ef78c.d1cda784.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[7564],{2381:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var s=n(4848),o=n(8453);const i={sidebar_position:7},r="Congratulations",a={id:"tutorial-assertions/congratulations",title:"Congratulations",description:"That's all you need to know about assertions.",source:"@site/docs/tutorial-assertions/congratulations.md",sourceDirName:"tutorial-assertions",slug:"/tutorial-assertions/congratulations",permalink:"/TUnit/docs/tutorial-assertions/congratulations",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Delegates",permalink:"/TUnit/docs/tutorial-assertions/delegates"},next:{title:"Extensibility / Custom Assertions",permalink:"/TUnit/docs/tutorial-assertions/extensibility"}},c={},l=[];function u(t){const e={code:"code",h1:"h1",header:"header",p:"p",...(0,o.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"congratulations",children:"Congratulations"})}),"\n",(0,s.jsx)(e.p,{children:"That's all you need to know about assertions."}),"\n",(0,s.jsxs)(e.p,{children:["There are many out-of-the-box methods for checking things on common object types:\n",(0,s.jsx)(e.code,{children:"DateTime"}),", ",(0,s.jsx)(e.code,{children:"TimeSpan"}),", ",(0,s.jsx)(e.code,{children:"IEnumerable"}),", ",(0,s.jsx)(e.code,{children:"string"}),", ",(0,s.jsx)(e.code,{children:"INumber"})]}),"\n",(0,s.jsx)(e.p,{children:"If something is missing, feel free to raise an issue/suggestion on GitHub."})]})}function d(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(u,{...t})}):u(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>r,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function r(t){const e=s.useContext(i);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),s.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c5555c4.c0a83f77.js b/assets/js/4c5555c4.aa2b97b0.js similarity index 58% rename from assets/js/4c5555c4.c0a83f77.js rename to assets/js/4c5555c4.aa2b97b0.js index d34d2cfba6..6e0c6d3694 100644 --- a/assets/js/4c5555c4.c0a83f77.js +++ b/assets/js/4c5555c4.aa2b97b0.js @@ -1 +1 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[7969],{2550:t=>{t.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Test Framework Comparisons","slug":"/category/test-framework-comparisons","permalink":"/TUnit/docs/category/test-framework-comparisons","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Extensibility / Custom Assertions","permalink":"/TUnit/docs/tutorial-assertions/extensibility"},"next":{"title":"Attributes","permalink":"/TUnit/docs/comparison/attributes"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[7969],{2550:t=>{t.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Test Framework Comparisons","slug":"/category/test-framework-comparisons","permalink":"/TUnit/docs/category/test-framework-comparisons","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Congratulations","permalink":"/TUnit/docs/tutorial-assertions/congratulations"},"next":{"title":"Attributes","permalink":"/TUnit/docs/comparison/attributes"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/914d3ab3.9f6560a4.js b/assets/js/914d3ab3.29c23d13.js similarity index 97% rename from assets/js/914d3ab3.9f6560a4.js rename to assets/js/914d3ab3.29c23d13.js index a1c58a8902..3002b08201 100644 --- a/assets/js/914d3ab3.9f6560a4.js +++ b/assets/js/914d3ab3.29c23d13.js @@ -1 +1 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[6532],{7136:t=>{t.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Intro","href":"/TUnit/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"Tutorial - Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installing TUnit","href":"/TUnit/docs/tutorial-basics/installing","docId":"tutorial-basics/installing","unlisted":false},{"type":"link","label":"Writing your first test","href":"/TUnit/docs/tutorial-basics/writing-your-first-test","docId":"tutorial-basics/writing-your-first-test","unlisted":false},{"type":"link","label":"Running your tests","href":"/TUnit/docs/tutorial-basics/running-your-tests","docId":"tutorial-basics/running-your-tests","unlisted":false},{"type":"link","label":"Data Driven Tests","href":"/TUnit/docs/tutorial-basics/data-driven-tests","docId":"tutorial-basics/data-driven-tests","unlisted":false},{"type":"link","label":"Data Source Driven Tests","href":"/TUnit/docs/tutorial-basics/data-source-driven-tests","docId":"tutorial-basics/data-source-driven-tests","unlisted":false},{"type":"link","label":"Matrix Tests","href":"/TUnit/docs/tutorial-basics/matrix-tests","docId":"tutorial-basics/matrix-tests","unlisted":false},{"type":"link","label":"Things to know","href":"/TUnit/docs/tutorial-basics/things-to-know","docId":"tutorial-basics/things-to-know","unlisted":false},{"type":"link","label":"Congratulations!","href":"/TUnit/docs/tutorial-basics/congratulations","docId":"tutorial-basics/congratulations","unlisted":false}],"href":"/TUnit/docs/category/tutorial---basics"},{"type":"category","label":"Tutorial - Extras","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Test Set Ups","href":"/TUnit/docs/tutorial-extras/setup","docId":"tutorial-extras/setup","unlisted":false},{"type":"link","label":"Test Clean Ups","href":"/TUnit/docs/tutorial-extras/cleanup","docId":"tutorial-extras/cleanup","unlisted":false},{"type":"link","label":"Retrying","href":"/TUnit/docs/tutorial-extras/retrying","docId":"tutorial-extras/retrying","unlisted":false},{"type":"link","label":"Repeating","href":"/TUnit/docs/tutorial-extras/repeating","docId":"tutorial-extras/repeating","unlisted":false},{"type":"link","label":"Timeouts","href":"/TUnit/docs/tutorial-extras/timeouts","docId":"tutorial-extras/timeouts","unlisted":false},{"type":"link","label":"Properties","href":"/TUnit/docs/tutorial-extras/properties","docId":"tutorial-extras/properties","unlisted":false},{"type":"link","label":"Test Context","href":"/TUnit/docs/tutorial-extras/test-context","docId":"tutorial-extras/test-context","unlisted":false},{"type":"link","label":"Test Filters","href":"/TUnit/docs/tutorial-extras/test-filters","docId":"tutorial-extras/test-filters","unlisted":false},{"type":"link","label":"Explicit","href":"/TUnit/docs/tutorial-extras/explicit","docId":"tutorial-extras/explicit","unlisted":false},{"type":"link","label":"Not in Parallel","href":"/TUnit/docs/tutorial-extras/not-in-parallel","docId":"tutorial-extras/not-in-parallel","unlisted":false},{"type":"link","label":"Depends On","href":"/TUnit/docs/tutorial-extras/depends-on","docId":"tutorial-extras/depends-on","unlisted":false},{"type":"link","label":"Ordering Tests","href":"/TUnit/docs/tutorial-extras/order","docId":"tutorial-extras/order","unlisted":false},{"type":"link","label":"Parallel Limiter","href":"/TUnit/docs/tutorial-extras/parallel-limiter","docId":"tutorial-extras/parallel-limiter","unlisted":false},{"type":"link","label":"Executors","href":"/TUnit/docs/tutorial-extras/executors","docId":"tutorial-extras/executors","unlisted":false},{"type":"link","label":"Class Constructor Helpers","href":"/TUnit/docs/tutorial-extras/class-constructors","docId":"tutorial-extras/class-constructors","unlisted":false}],"href":"/TUnit/docs/category/tutorial---extras"},{"type":"category","label":"Tutorial - Assertions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Awaiting","href":"/TUnit/docs/tutorial-assertions/awaiting","docId":"tutorial-assertions/awaiting","unlisted":false},{"type":"link","label":"And Conditions","href":"/TUnit/docs/tutorial-assertions/and-conditions","docId":"tutorial-assertions/and-conditions","unlisted":false},{"type":"link","label":"Assertion Scopes","href":"/TUnit/docs/tutorial-assertions/scopes","docId":"tutorial-assertions/scopes","unlisted":false},{"type":"link","label":"Or Conditions","href":"/TUnit/docs/tutorial-assertions/or-conditions","docId":"tutorial-assertions/or-conditions","unlisted":false},{"type":"link","label":"Type Checking","href":"/TUnit/docs/tutorial-assertions/type-checking","docId":"tutorial-assertions/type-checking","unlisted":false},{"type":"link","label":"Delegates","href":"/TUnit/docs/tutorial-assertions/delegates","docId":"tutorial-assertions/delegates","unlisted":false},{"type":"link","label":"Congratulations","href":"/TUnit/docs/tutorial-assertions/congratulations","docId":"tutorial-assertions/congratulations","unlisted":false},{"type":"link","label":"Extensibility / Custom Assertions","href":"/TUnit/docs/tutorial-assertions/extensibility","docId":"tutorial-assertions/extensibility","unlisted":false}],"href":"/TUnit/docs/category/tutorial---assertions"},{"type":"category","label":"Test Framework Comparisons","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Attributes","href":"/TUnit/docs/comparison/attributes","docId":"comparison/attributes","unlisted":false},{"type":"link","label":"Framework Differences","href":"/TUnit/docs/comparison/framework-differences","docId":"comparison/framework-differences","unlisted":false}],"href":"/TUnit/docs/category/test-framework-comparisons"},{"type":"category","label":"Extensions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Extensions","href":"/TUnit/docs/extensions/","docId":"extensions/extensions","unlisted":false}],"href":"/TUnit/docs/category/extensions"}]},"docs":{"comparison/attributes":{"id":"comparison/attributes","title":"Attributes","description":"Here are TUnit\'s equivalent attributes to other test frameworks.","sidebar":"tutorialSidebar"},"comparison/framework-differences":{"id":"comparison/framework-differences","title":"Framework Differences","description":"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.","sidebar":"tutorialSidebar"},"extensions/extensions":{"id":"extensions/extensions","title":"Extensions","description":"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Intro","description":"TUnit is another testing framework for .NET 8 and up.","sidebar":"tutorialSidebar"},"tutorial-assertions/and-conditions":{"id":"tutorial-assertions/and-conditions","title":"And Conditions","description":"TUnit can chain assertions together, using the And property. This reads very much like English, and aims to keep the test easy to read and understand, and doesn\'t require you repeat boilerplate code such as Assert.That over and over.","sidebar":"tutorialSidebar"},"tutorial-assertions/awaiting":{"id":"tutorial-assertions/awaiting","title":"Awaiting","description":"In TUnit you await your assertions, and this serves two purposes:","sidebar":"tutorialSidebar"},"tutorial-assertions/congratulations":{"id":"tutorial-assertions/congratulations","title":"Congratulations","description":"That\'s all you need to know about assertions.","sidebar":"tutorialSidebar"},"tutorial-assertions/delegates":{"id":"tutorial-assertions/delegates","title":"Delegates","description":"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:","sidebar":"tutorialSidebar"},"tutorial-assertions/extensibility":{"id":"tutorial-assertions/extensibility","title":"Extensibility / Custom Assertions","description":"The TUnit Assertions can be easily extended so that you can create your own assertions.","sidebar":"tutorialSidebar"},"tutorial-assertions/or-conditions":{"id":"tutorial-assertions/or-conditions","title":"Or Conditions","description":"Similar to the And property, there is also the Or property.","sidebar":"tutorialSidebar"},"tutorial-assertions/scopes":{"id":"tutorial-assertions/scopes","title":"Assertion Scopes","description":"In TUnit you can create an assertion scope by calling Assert.Multiple().","sidebar":"tutorialSidebar"},"tutorial-assertions/type-checking":{"id":"tutorial-assertions/type-checking","title":"Type Checking","description":"TUnit assertions try to check the types at compile time.","sidebar":"tutorialSidebar"},"tutorial-basics/congratulations":{"id":"tutorial-basics/congratulations","title":"Congratulations!","description":"You have just learned the basics of writing a test in TUnit.","sidebar":"tutorialSidebar"},"tutorial-basics/data-driven-tests":{"id":"tutorial-basics/data-driven-tests","title":"Data Driven Tests","description":"It\'s common to want to repeat tests but pass in different values on each execution.","sidebar":"tutorialSidebar"},"tutorial-basics/data-source-driven-tests":{"id":"tutorial-basics/data-source-driven-tests","title":"Data Source Driven Tests","description":"A limitation of passing data in with [Arguments(...)] is that the data must be constant values. For example, we can\'t new up an object and pass it into this attribute as an argument. This is a constraint of the language and we can\'t change that.","sidebar":"tutorialSidebar"},"tutorial-basics/installing":{"id":"tutorial-basics/installing","title":"Installing TUnit","description":"First create an empty .NET console application:","sidebar":"tutorialSidebar"},"tutorial-basics/matrix-tests":{"id":"tutorial-basics/matrix-tests","title":"Matrix Tests","description":"Combinative tests can take multiple values for different arguments, and then generate every possible combination of all of those arguments.","sidebar":"tutorialSidebar"},"tutorial-basics/running-your-tests":{"id":"tutorial-basics/running-your-tests","title":"Running your tests","description":"As TUnit is built on-top of the newer Microsoft.Testing.Platform, and combined with the fact that TUnit tests are source generated, running your tests is available in a variety of ways.","sidebar":"tutorialSidebar"},"tutorial-basics/things-to-know":{"id":"tutorial-basics/things-to-know","title":"Things to know","description":"TUnit has made some decisions by design. You may need to know about them:","sidebar":"tutorialSidebar"},"tutorial-basics/writing-your-first-test":{"id":"tutorial-basics/writing-your-first-test","title":"Writing your first test","description":"Start by creating a new class:","sidebar":"tutorialSidebar"},"tutorial-extras/class-constructors":{"id":"tutorial-extras/class-constructors","title":"Class Constructor Helpers","description":"Some test suites might be more complex than others, and a user may want control over \'newing\' up their test classes.","sidebar":"tutorialSidebar"},"tutorial-extras/cleanup":{"id":"tutorial-extras/cleanup","title":"Test Clean Ups","description":"TUnit supports having your test class implement IDisposable or IAsyncDisposable. These will be called after your test has finished executing. However, using the attributes below offers better support for running multiple methods, and without having to implement your own try/catch logic. Every [After] method will be run, and any exceptions will be lazily thrown afterwards.","sidebar":"tutorialSidebar"},"tutorial-extras/depends-on":{"id":"tutorial-extras/depends-on","title":"Depends On","description":"A test can depend on another test. This means that your test will not start unless the other test has finished.","sidebar":"tutorialSidebar"},"tutorial-extras/executors":{"id":"tutorial-extras/executors","title":"Executors","description":"In some advanced cases, you may need to control how a test or hook is executed.","sidebar":"tutorialSidebar"},"tutorial-extras/explicit":{"id":"tutorial-extras/explicit","title":"Explicit","description":"If you want a test to only be run explicitly (and not part of all general tests) then you can add the [ExplicitAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/not-in-parallel":{"id":"tutorial-extras/not-in-parallel","title":"Not in Parallel","description":"By default, TUnit tests will run in parallel.","sidebar":"tutorialSidebar"},"tutorial-extras/order":{"id":"tutorial-extras/order","title":"Ordering Tests","description":"By default, TUnit tests will run in parallel. This means there is no order and it doesn\'t make sense to be able to control that.","sidebar":"tutorialSidebar"},"tutorial-extras/parallel-limiter":{"id":"tutorial-extras/parallel-limiter","title":"Parallel Limiter","description":"TUnit allows the user to control the parallel limit on a test, class or assembly level.","sidebar":"tutorialSidebar"},"tutorial-extras/properties":{"id":"tutorial-extras/properties","title":"Properties","description":"Custom properties can be added to a test using the [PropertyAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/repeating":{"id":"tutorial-extras/repeating","title":"Repeating","description":"If you want to repeat a test, add a [RepeatAttribute] onto your test method or class. This takes an int of how many times you\'d like to repeat. Each repeat will show in the test explorer as a new test.","sidebar":"tutorialSidebar"},"tutorial-extras/retrying":{"id":"tutorial-extras/retrying","title":"Retrying","description":"Unfortunately sometimes our tests hit issues. It could be a blip on the network, but that could cause our entire test suite to fail which is frustrating.","sidebar":"tutorialSidebar"},"tutorial-extras/setup":{"id":"tutorial-extras/setup","title":"Test Set Ups","description":"Most setup for a test can be performed in the constructor (think setting up mocks, assigning fields.)","sidebar":"tutorialSidebar"},"tutorial-extras/test-context":{"id":"tutorial-extras/test-context","title":"Test Context","description":"All tests have a TestContext object available to them.","sidebar":"tutorialSidebar"},"tutorial-extras/test-filters":{"id":"tutorial-extras/test-filters","title":"Test Filters","description":"Running TUnit via dotnet run supports test filters.","sidebar":"tutorialSidebar"},"tutorial-extras/timeouts":{"id":"tutorial-extras/timeouts","title":"Timeouts","description":"If you want to stop a test after a specified amount of time, add a [TimeoutAttribute] onto your test method or class. This takes an int of how many milliseconds a test can execute for.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[6532],{7136:t=>{t.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Intro","href":"/TUnit/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"Tutorial - Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installing TUnit","href":"/TUnit/docs/tutorial-basics/installing","docId":"tutorial-basics/installing","unlisted":false},{"type":"link","label":"Writing your first test","href":"/TUnit/docs/tutorial-basics/writing-your-first-test","docId":"tutorial-basics/writing-your-first-test","unlisted":false},{"type":"link","label":"Running your tests","href":"/TUnit/docs/tutorial-basics/running-your-tests","docId":"tutorial-basics/running-your-tests","unlisted":false},{"type":"link","label":"Data Driven Tests","href":"/TUnit/docs/tutorial-basics/data-driven-tests","docId":"tutorial-basics/data-driven-tests","unlisted":false},{"type":"link","label":"Data Source Driven Tests","href":"/TUnit/docs/tutorial-basics/data-source-driven-tests","docId":"tutorial-basics/data-source-driven-tests","unlisted":false},{"type":"link","label":"Matrix Tests","href":"/TUnit/docs/tutorial-basics/matrix-tests","docId":"tutorial-basics/matrix-tests","unlisted":false},{"type":"link","label":"Things to know","href":"/TUnit/docs/tutorial-basics/things-to-know","docId":"tutorial-basics/things-to-know","unlisted":false},{"type":"link","label":"Congratulations!","href":"/TUnit/docs/tutorial-basics/congratulations","docId":"tutorial-basics/congratulations","unlisted":false}],"href":"/TUnit/docs/category/tutorial---basics"},{"type":"category","label":"Tutorial - Extras","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Test Set Ups","href":"/TUnit/docs/tutorial-extras/setup","docId":"tutorial-extras/setup","unlisted":false},{"type":"link","label":"Test Clean Ups","href":"/TUnit/docs/tutorial-extras/cleanup","docId":"tutorial-extras/cleanup","unlisted":false},{"type":"link","label":"Retrying","href":"/TUnit/docs/tutorial-extras/retrying","docId":"tutorial-extras/retrying","unlisted":false},{"type":"link","label":"Repeating","href":"/TUnit/docs/tutorial-extras/repeating","docId":"tutorial-extras/repeating","unlisted":false},{"type":"link","label":"Timeouts","href":"/TUnit/docs/tutorial-extras/timeouts","docId":"tutorial-extras/timeouts","unlisted":false},{"type":"link","label":"Properties","href":"/TUnit/docs/tutorial-extras/properties","docId":"tutorial-extras/properties","unlisted":false},{"type":"link","label":"Test Context","href":"/TUnit/docs/tutorial-extras/test-context","docId":"tutorial-extras/test-context","unlisted":false},{"type":"link","label":"Test Filters","href":"/TUnit/docs/tutorial-extras/test-filters","docId":"tutorial-extras/test-filters","unlisted":false},{"type":"link","label":"Explicit","href":"/TUnit/docs/tutorial-extras/explicit","docId":"tutorial-extras/explicit","unlisted":false},{"type":"link","label":"Not in Parallel","href":"/TUnit/docs/tutorial-extras/not-in-parallel","docId":"tutorial-extras/not-in-parallel","unlisted":false},{"type":"link","label":"Depends On","href":"/TUnit/docs/tutorial-extras/depends-on","docId":"tutorial-extras/depends-on","unlisted":false},{"type":"link","label":"Ordering Tests","href":"/TUnit/docs/tutorial-extras/order","docId":"tutorial-extras/order","unlisted":false},{"type":"link","label":"Parallel Limiter","href":"/TUnit/docs/tutorial-extras/parallel-limiter","docId":"tutorial-extras/parallel-limiter","unlisted":false},{"type":"link","label":"Executors","href":"/TUnit/docs/tutorial-extras/executors","docId":"tutorial-extras/executors","unlisted":false},{"type":"link","label":"Class Constructor Helpers","href":"/TUnit/docs/tutorial-extras/class-constructors","docId":"tutorial-extras/class-constructors","unlisted":false}],"href":"/TUnit/docs/category/tutorial---extras"},{"type":"category","label":"Tutorial - Assertions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Awaiting","href":"/TUnit/docs/tutorial-assertions/awaiting","docId":"tutorial-assertions/awaiting","unlisted":false},{"type":"link","label":"And Conditions","href":"/TUnit/docs/tutorial-assertions/and-conditions","docId":"tutorial-assertions/and-conditions","unlisted":false},{"type":"link","label":"Assertion Scopes","href":"/TUnit/docs/tutorial-assertions/scopes","docId":"tutorial-assertions/scopes","unlisted":false},{"type":"link","label":"Or Conditions","href":"/TUnit/docs/tutorial-assertions/or-conditions","docId":"tutorial-assertions/or-conditions","unlisted":false},{"type":"link","label":"Type Checking","href":"/TUnit/docs/tutorial-assertions/type-checking","docId":"tutorial-assertions/type-checking","unlisted":false},{"type":"link","label":"Delegates","href":"/TUnit/docs/tutorial-assertions/delegates","docId":"tutorial-assertions/delegates","unlisted":false},{"type":"link","label":"Extensibility / Custom Assertions","href":"/TUnit/docs/tutorial-assertions/extensibility","docId":"tutorial-assertions/extensibility","unlisted":false},{"type":"link","label":"Congratulations","href":"/TUnit/docs/tutorial-assertions/congratulations","docId":"tutorial-assertions/congratulations","unlisted":false}],"href":"/TUnit/docs/category/tutorial---assertions"},{"type":"category","label":"Test Framework Comparisons","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Attributes","href":"/TUnit/docs/comparison/attributes","docId":"comparison/attributes","unlisted":false},{"type":"link","label":"Framework Differences","href":"/TUnit/docs/comparison/framework-differences","docId":"comparison/framework-differences","unlisted":false}],"href":"/TUnit/docs/category/test-framework-comparisons"},{"type":"category","label":"Extensions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Extensions","href":"/TUnit/docs/extensions/","docId":"extensions/extensions","unlisted":false}],"href":"/TUnit/docs/category/extensions"}]},"docs":{"comparison/attributes":{"id":"comparison/attributes","title":"Attributes","description":"Here are TUnit\'s equivalent attributes to other test frameworks.","sidebar":"tutorialSidebar"},"comparison/framework-differences":{"id":"comparison/framework-differences","title":"Framework Differences","description":"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.","sidebar":"tutorialSidebar"},"extensions/extensions":{"id":"extensions/extensions","title":"Extensions","description":"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Intro","description":"TUnit is another testing framework for .NET 8 and up.","sidebar":"tutorialSidebar"},"tutorial-assertions/and-conditions":{"id":"tutorial-assertions/and-conditions","title":"And Conditions","description":"TUnit can chain assertions together, using the And property. This reads very much like English, and aims to keep the test easy to read and understand, and doesn\'t require you repeat boilerplate code such as Assert.That over and over.","sidebar":"tutorialSidebar"},"tutorial-assertions/awaiting":{"id":"tutorial-assertions/awaiting","title":"Awaiting","description":"In TUnit you await your assertions, and this serves two purposes:","sidebar":"tutorialSidebar"},"tutorial-assertions/congratulations":{"id":"tutorial-assertions/congratulations","title":"Congratulations","description":"That\'s all you need to know about assertions.","sidebar":"tutorialSidebar"},"tutorial-assertions/delegates":{"id":"tutorial-assertions/delegates","title":"Delegates","description":"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:","sidebar":"tutorialSidebar"},"tutorial-assertions/extensibility":{"id":"tutorial-assertions/extensibility","title":"Extensibility / Custom Assertions","description":"The TUnit Assertions can be easily extended so that you can create your own assertions.","sidebar":"tutorialSidebar"},"tutorial-assertions/or-conditions":{"id":"tutorial-assertions/or-conditions","title":"Or Conditions","description":"Similar to the And property, there is also the Or property.","sidebar":"tutorialSidebar"},"tutorial-assertions/scopes":{"id":"tutorial-assertions/scopes","title":"Assertion Scopes","description":"In TUnit you can create an assertion scope by calling Assert.Multiple().","sidebar":"tutorialSidebar"},"tutorial-assertions/type-checking":{"id":"tutorial-assertions/type-checking","title":"Type Checking","description":"TUnit assertions try to check the types at compile time.","sidebar":"tutorialSidebar"},"tutorial-basics/congratulations":{"id":"tutorial-basics/congratulations","title":"Congratulations!","description":"You have just learned the basics of writing a test in TUnit.","sidebar":"tutorialSidebar"},"tutorial-basics/data-driven-tests":{"id":"tutorial-basics/data-driven-tests","title":"Data Driven Tests","description":"It\'s common to want to repeat tests but pass in different values on each execution.","sidebar":"tutorialSidebar"},"tutorial-basics/data-source-driven-tests":{"id":"tutorial-basics/data-source-driven-tests","title":"Data Source Driven Tests","description":"A limitation of passing data in with [Arguments(...)] is that the data must be constant values. For example, we can\'t new up an object and pass it into this attribute as an argument. This is a constraint of the language and we can\'t change that.","sidebar":"tutorialSidebar"},"tutorial-basics/installing":{"id":"tutorial-basics/installing","title":"Installing TUnit","description":"First create an empty .NET console application:","sidebar":"tutorialSidebar"},"tutorial-basics/matrix-tests":{"id":"tutorial-basics/matrix-tests","title":"Matrix Tests","description":"Combinative tests can take multiple values for different arguments, and then generate every possible combination of all of those arguments.","sidebar":"tutorialSidebar"},"tutorial-basics/running-your-tests":{"id":"tutorial-basics/running-your-tests","title":"Running your tests","description":"As TUnit is built on-top of the newer Microsoft.Testing.Platform, and combined with the fact that TUnit tests are source generated, running your tests is available in a variety of ways.","sidebar":"tutorialSidebar"},"tutorial-basics/things-to-know":{"id":"tutorial-basics/things-to-know","title":"Things to know","description":"TUnit has made some decisions by design. You may need to know about them:","sidebar":"tutorialSidebar"},"tutorial-basics/writing-your-first-test":{"id":"tutorial-basics/writing-your-first-test","title":"Writing your first test","description":"Start by creating a new class:","sidebar":"tutorialSidebar"},"tutorial-extras/class-constructors":{"id":"tutorial-extras/class-constructors","title":"Class Constructor Helpers","description":"Some test suites might be more complex than others, and a user may want control over \'newing\' up their test classes.","sidebar":"tutorialSidebar"},"tutorial-extras/cleanup":{"id":"tutorial-extras/cleanup","title":"Test Clean Ups","description":"TUnit supports having your test class implement IDisposable or IAsyncDisposable. These will be called after your test has finished executing. However, using the attributes below offers better support for running multiple methods, and without having to implement your own try/catch logic. Every [After] method will be run, and any exceptions will be lazily thrown afterwards.","sidebar":"tutorialSidebar"},"tutorial-extras/depends-on":{"id":"tutorial-extras/depends-on","title":"Depends On","description":"A test can depend on another test. This means that your test will not start unless the other test has finished.","sidebar":"tutorialSidebar"},"tutorial-extras/executors":{"id":"tutorial-extras/executors","title":"Executors","description":"In some advanced cases, you may need to control how a test or hook is executed.","sidebar":"tutorialSidebar"},"tutorial-extras/explicit":{"id":"tutorial-extras/explicit","title":"Explicit","description":"If you want a test to only be run explicitly (and not part of all general tests) then you can add the [ExplicitAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/not-in-parallel":{"id":"tutorial-extras/not-in-parallel","title":"Not in Parallel","description":"By default, TUnit tests will run in parallel.","sidebar":"tutorialSidebar"},"tutorial-extras/order":{"id":"tutorial-extras/order","title":"Ordering Tests","description":"By default, TUnit tests will run in parallel. This means there is no order and it doesn\'t make sense to be able to control that.","sidebar":"tutorialSidebar"},"tutorial-extras/parallel-limiter":{"id":"tutorial-extras/parallel-limiter","title":"Parallel Limiter","description":"TUnit allows the user to control the parallel limit on a test, class or assembly level.","sidebar":"tutorialSidebar"},"tutorial-extras/properties":{"id":"tutorial-extras/properties","title":"Properties","description":"Custom properties can be added to a test using the [PropertyAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/repeating":{"id":"tutorial-extras/repeating","title":"Repeating","description":"If you want to repeat a test, add a [RepeatAttribute] onto your test method or class. This takes an int of how many times you\'d like to repeat. Each repeat will show in the test explorer as a new test.","sidebar":"tutorialSidebar"},"tutorial-extras/retrying":{"id":"tutorial-extras/retrying","title":"Retrying","description":"Unfortunately sometimes our tests hit issues. It could be a blip on the network, but that could cause our entire test suite to fail which is frustrating.","sidebar":"tutorialSidebar"},"tutorial-extras/setup":{"id":"tutorial-extras/setup","title":"Test Set Ups","description":"Most setup for a test can be performed in the constructor (think setting up mocks, assigning fields.)","sidebar":"tutorialSidebar"},"tutorial-extras/test-context":{"id":"tutorial-extras/test-context","title":"Test Context","description":"All tests have a TestContext object available to them.","sidebar":"tutorialSidebar"},"tutorial-extras/test-filters":{"id":"tutorial-extras/test-filters","title":"Test Filters","description":"Running TUnit via dotnet run supports test filters.","sidebar":"tutorialSidebar"},"tutorial-extras/timeouts":{"id":"tutorial-extras/timeouts","title":"Timeouts","description":"If you want to stop a test after a specified amount of time, add a [TimeoutAttribute] onto your test method or class. This takes an int of how many milliseconds a test can execute for.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/a66eab3e.3dce092e.js b/assets/js/a66eab3e.3dce092e.js deleted file mode 100644 index bf24b92924..0000000000 --- a/assets/js/a66eab3e.3dce092e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[9372],{7642:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var s=n(4848),o=n(8453);const r={sidebar_position:6},a="Delegates",i={id:"tutorial-assertions/delegates",title:"Delegates",description:"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:",source:"@site/docs/tutorial-assertions/delegates.md",sourceDirName:"tutorial-assertions",slug:"/tutorial-assertions/delegates",permalink:"/TUnit/docs/tutorial-assertions/delegates",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Type Checking",permalink:"/TUnit/docs/tutorial-assertions/type-checking"},next:{title:"Congratulations",permalink:"/TUnit/docs/tutorial-assertions/congratulations"}},c={},l=[];function u(e){const t={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"delegates",children:"Delegates"})}),"\n",(0,s.jsx)(t.p,{children:"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-csharp",children:" [Test]\n public async Task MyTest()\n {\n await Assert.That(() =>\n {\n // Do something here\n }).ThrowsNothing();\n }\n\n // or\n\n [Test]\n public async Task MyTest()\n {\n await Assert.That(() =>\n {\n // Do something here\n }).ThrowsException().OfType();\n }\n\n // or \n\n [Test]\n public async Task MyTest()\n {\n var argumentNullException = await Assert.ThrowsAsync(() =>\n {\n // Do something here\n return Task.CompletedTask;\n });\n }\n"})})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var s=n(6540);const o={},r=s.createContext(o);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a66eab3e.672ceccf.js b/assets/js/a66eab3e.672ceccf.js new file mode 100644 index 0000000000..9e8b7d2512 --- /dev/null +++ b/assets/js/a66eab3e.672ceccf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[9372],{7642:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var s=n(4848),o=n(8453);const r={sidebar_position:6},a="Delegates",i={id:"tutorial-assertions/delegates",title:"Delegates",description:"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:",source:"@site/docs/tutorial-assertions/delegates.md",sourceDirName:"tutorial-assertions",slug:"/tutorial-assertions/delegates",permalink:"/TUnit/docs/tutorial-assertions/delegates",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Type Checking",permalink:"/TUnit/docs/tutorial-assertions/type-checking"},next:{title:"Extensibility / Custom Assertions",permalink:"/TUnit/docs/tutorial-assertions/extensibility"}},c={},l=[];function u(e){const t={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"delegates",children:"Delegates"})}),"\n",(0,s.jsx)(t.p,{children:"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-csharp",children:" [Test]\n public async Task MyTest()\n {\n await Assert.That(() =>\n {\n // Do something here\n }).ThrowsNothing();\n }\n\n // or\n\n [Test]\n public async Task MyTest()\n {\n await Assert.That(() =>\n {\n // Do something here\n }).ThrowsException().OfType();\n }\n\n // or \n\n [Test]\n public async Task MyTest()\n {\n var argumentNullException = await Assert.ThrowsAsync(() =>\n {\n // Do something here\n return Task.CompletedTask;\n });\n }\n"})})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var s=n(6540);const o={},r=s.createContext(o);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.57504d6b.js b/assets/js/runtime~main.3997fd90.js similarity index 94% rename from assets/js/runtime~main.57504d6b.js rename to assets/js/runtime~main.3997fd90.js index c148e0a4e9..a8e33169df 100644 --- a/assets/js/runtime~main.57504d6b.js +++ b/assets/js/runtime~main.3997fd90.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,t,b,d,r={},c={};function f(e){var a=c[e];if(void 0!==a)return a.exports;var t=c[e]={exports:{}};return r[e].call(t.exports,t,t.exports,f),t.exports}f.m=r,e=[],f.O=(a,t,b,d)=>{if(!t){var r=1/0;for(i=0;i=d)&&Object.keys(f.O).every((e=>f.O[e](t[o])))?t.splice(o--,1):(c=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[t,b,d]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var d=Object.create(null);f.r(d);var r={};a=a||[null,t({}),t([]),t(t)];for(var c=2&b&&e;"object"==typeof c&&!~a.indexOf(c);c=t(c))Object.getOwnPropertyNames(c).forEach((a=>r[a]=()=>e[a]));return r.default=()=>e,f.d(d,r),d},f.d=(e,a)=>{for(var t in a)f.o(a,t)&&!f.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,t)=>(f.f[t](e,a),a)),[])),f.u=e=>"assets/js/"+({570:"91d5c99e",1114:"e322696d",1235:"a7456010",1379:"0b7a5dd9",1647:"b1a8519a",1747:"f7b7b503",2225:"4b18aed1",2321:"ba8db043",2473:"b3030475",2590:"8ff4cdb2",2748:"822bd8ab",2984:"c566dcac",3398:"8b1309c7",3604:"5c580d35",3818:"7c0d1a7d",3976:"0e384e19",4134:"393be207",4298:"13e939a4",4583:"1df93b7f",4761:"13f17bf8",4956:"e10a8de7",5742:"aba21aa0",5770:"6a12013c",5803:"f08d5324",6061:"1f391b9e",6168:"49462f00",6220:"5dbdde90",6458:"58d4c641",6532:"914d3ab3",6538:"a34b2a44",6617:"cb1d92ed",6866:"73e1c817",6969:"14eb3368",7098:"a7bd4aaa",7326:"e1f02bbc",7543:"55c176cd",7564:"2a9ef78c",7846:"be2154f8",7969:"4c5555c4",8401:"17896441",8584:"ba7c896e",8642:"9f69b8de",8715:"d3238b2f",8732:"8b247495",8887:"12f8ba17",9048:"a94703ab",9069:"3609cdcd",9081:"85aaec92",9372:"a66eab3e",9647:"5e95c892",9814:"6a21048e"}[e]||e)+"."+{570:"6039af00",1114:"f4dd2fa6",1235:"1b4d7e11",1379:"85acd131",1647:"53c91cd1",1747:"d0293669",2225:"0c56640f",2237:"c8d6c83b",2321:"bdf9e885",2473:"de698c01",2590:"1a8dddbc",2748:"fe87e631",2984:"125628dc",3398:"5dae8dc5",3604:"f2c6c9a7",3818:"6d6b04e6",3976:"c4e39ac1",4134:"732e1955",4298:"47b824e8",4583:"0ed6c3ce",4761:"5ce21056",4956:"8b2a6440",5742:"f183b5b5",5770:"5f852033",5803:"0d89f896",6061:"15657c49",6168:"fc1eaa9e",6220:"54f64f74",6458:"cde25215",6532:"9f6560a4",6538:"fbd23d73",6617:"0b366f50",6866:"aecc372e",6969:"704ce381",7098:"c8828b34",7326:"dcc4b84a",7543:"e307765c",7564:"d1cda784",7846:"3ee10f1b",7969:"c0a83f77",8401:"6598443e",8584:"3ba96841",8642:"5e8226a8",8715:"c6a41962",8732:"9e3b30b9",8887:"0d1bf780",9048:"f6a389b6",9069:"3bafc862",9081:"7f5e34db",9372:"3dce092e",9408:"c19ac7d6",9647:"897aecb3",9814:"6affd329"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},d="tunit-docs-site:",f.l=(e,a,t,r)=>{if(b[e])b[e].push(a);else{var c,o;if(void 0!==t)for(var n=document.getElementsByTagName("script"),i=0;i{c.onerror=c.onload=null,clearTimeout(s);var d=b[e];if(delete b[e],c.parentNode&&c.parentNode.removeChild(c),d&&d.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=l.bind(null,c.onerror),c.onload=l.bind(null,c.onload),o&&document.head.appendChild(c)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/TUnit/",f.gca=function(e){return e={17896441:"8401","91d5c99e":"570",e322696d:"1114",a7456010:"1235","0b7a5dd9":"1379",b1a8519a:"1647",f7b7b503:"1747","4b18aed1":"2225",ba8db043:"2321",b3030475:"2473","8ff4cdb2":"2590","822bd8ab":"2748",c566dcac:"2984","8b1309c7":"3398","5c580d35":"3604","7c0d1a7d":"3818","0e384e19":"3976","393be207":"4134","13e939a4":"4298","1df93b7f":"4583","13f17bf8":"4761",e10a8de7:"4956",aba21aa0:"5742","6a12013c":"5770",f08d5324:"5803","1f391b9e":"6061","49462f00":"6168","5dbdde90":"6220","58d4c641":"6458","914d3ab3":"6532",a34b2a44:"6538",cb1d92ed:"6617","73e1c817":"6866","14eb3368":"6969",a7bd4aaa:"7098",e1f02bbc:"7326","55c176cd":"7543","2a9ef78c":"7564",be2154f8:"7846","4c5555c4":"7969",ba7c896e:"8584","9f69b8de":"8642",d3238b2f:"8715","8b247495":"8732","12f8ba17":"8887",a94703ab:"9048","3609cdcd":"9069","85aaec92":"9081",a66eab3e:"9372","5e95c892":"9647","6a21048e":"9814"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(a,t)=>{var b=f.o(e,a)?e[a]:void 0;if(0!==b)if(b)t.push(b[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((t,d)=>b=e[a]=[t,d]));t.push(b[2]=d);var r=f.p+f.u(a),c=new Error;f.l(r,(t=>{if(f.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var d=t&&("load"===t.type?"missing":t.type),r=t&&t.target&&t.target.src;c.message="Loading chunk "+a+" failed.\n("+d+": "+r+")",c.name="ChunkLoadError",c.type=d,c.request=r,b[1](c)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,t)=>{var b,d,r=t[0],c=t[1],o=t[2],n=0;if(r.some((a=>0!==e[a]))){for(b in c)f.o(c,b)&&(f.m[b]=c[b]);if(o)var i=o(f)}for(a&&a(t);n{"use strict";var e,a,t,b,d,r={},c={};function f(e){var a=c[e];if(void 0!==a)return a.exports;var t=c[e]={exports:{}};return r[e].call(t.exports,t,t.exports,f),t.exports}f.m=r,e=[],f.O=(a,t,b,d)=>{if(!t){var r=1/0;for(i=0;i=d)&&Object.keys(f.O).every((e=>f.O[e](t[o])))?t.splice(o--,1):(c=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[t,b,d]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var d=Object.create(null);f.r(d);var r={};a=a||[null,t({}),t([]),t(t)];for(var c=2&b&&e;"object"==typeof c&&!~a.indexOf(c);c=t(c))Object.getOwnPropertyNames(c).forEach((a=>r[a]=()=>e[a]));return r.default=()=>e,f.d(d,r),d},f.d=(e,a)=>{for(var t in a)f.o(a,t)&&!f.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,t)=>(f.f[t](e,a),a)),[])),f.u=e=>"assets/js/"+({570:"91d5c99e",1114:"e322696d",1235:"a7456010",1379:"0b7a5dd9",1647:"b1a8519a",1747:"f7b7b503",2225:"4b18aed1",2321:"ba8db043",2473:"b3030475",2590:"8ff4cdb2",2748:"822bd8ab",2984:"c566dcac",3398:"8b1309c7",3604:"5c580d35",3818:"7c0d1a7d",3976:"0e384e19",4134:"393be207",4298:"13e939a4",4583:"1df93b7f",4761:"13f17bf8",4956:"e10a8de7",5742:"aba21aa0",5770:"6a12013c",5803:"f08d5324",6061:"1f391b9e",6168:"49462f00",6220:"5dbdde90",6458:"58d4c641",6532:"914d3ab3",6538:"a34b2a44",6617:"cb1d92ed",6866:"73e1c817",6969:"14eb3368",7098:"a7bd4aaa",7326:"e1f02bbc",7543:"55c176cd",7564:"2a9ef78c",7846:"be2154f8",7969:"4c5555c4",8401:"17896441",8584:"ba7c896e",8642:"9f69b8de",8715:"d3238b2f",8732:"8b247495",8887:"12f8ba17",9048:"a94703ab",9069:"3609cdcd",9081:"85aaec92",9372:"a66eab3e",9647:"5e95c892",9814:"6a21048e"}[e]||e)+"."+{570:"6039af00",1114:"f4dd2fa6",1235:"1b4d7e11",1379:"85acd131",1647:"53c91cd1",1747:"d0293669",2225:"0c56640f",2237:"c8d6c83b",2321:"bdf9e885",2473:"de698c01",2590:"1a8dddbc",2748:"fe87e631",2984:"125628dc",3398:"5dae8dc5",3604:"f2c6c9a7",3818:"6d6b04e6",3976:"c4e39ac1",4134:"732e1955",4298:"47b824e8",4583:"0ed6c3ce",4761:"5ce21056",4956:"8b2a6440",5742:"f183b5b5",5770:"5f852033",5803:"0d89f896",6061:"15657c49",6168:"fc1eaa9e",6220:"54f64f74",6458:"cde25215",6532:"29c23d13",6538:"fbd23d73",6617:"0b366f50",6866:"aecc372e",6969:"704ce381",7098:"c8828b34",7326:"dcc4b84a",7543:"e307765c",7564:"5c306a53",7846:"3ee10f1b",7969:"aa2b97b0",8401:"6598443e",8584:"3ba96841",8642:"5e8226a8",8715:"c6a41962",8732:"9e3b30b9",8887:"0be96710",9048:"f6a389b6",9069:"3bafc862",9081:"7f5e34db",9372:"672ceccf",9408:"c19ac7d6",9647:"897aecb3",9814:"6affd329"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},d="tunit-docs-site:",f.l=(e,a,t,r)=>{if(b[e])b[e].push(a);else{var c,o;if(void 0!==t)for(var n=document.getElementsByTagName("script"),i=0;i{c.onerror=c.onload=null,clearTimeout(s);var d=b[e];if(delete b[e],c.parentNode&&c.parentNode.removeChild(c),d&&d.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=l.bind(null,c.onerror),c.onload=l.bind(null,c.onload),o&&document.head.appendChild(c)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/TUnit/",f.gca=function(e){return e={17896441:"8401","91d5c99e":"570",e322696d:"1114",a7456010:"1235","0b7a5dd9":"1379",b1a8519a:"1647",f7b7b503:"1747","4b18aed1":"2225",ba8db043:"2321",b3030475:"2473","8ff4cdb2":"2590","822bd8ab":"2748",c566dcac:"2984","8b1309c7":"3398","5c580d35":"3604","7c0d1a7d":"3818","0e384e19":"3976","393be207":"4134","13e939a4":"4298","1df93b7f":"4583","13f17bf8":"4761",e10a8de7:"4956",aba21aa0:"5742","6a12013c":"5770",f08d5324:"5803","1f391b9e":"6061","49462f00":"6168","5dbdde90":"6220","58d4c641":"6458","914d3ab3":"6532",a34b2a44:"6538",cb1d92ed:"6617","73e1c817":"6866","14eb3368":"6969",a7bd4aaa:"7098",e1f02bbc:"7326","55c176cd":"7543","2a9ef78c":"7564",be2154f8:"7846","4c5555c4":"7969",ba7c896e:"8584","9f69b8de":"8642",d3238b2f:"8715","8b247495":"8732","12f8ba17":"8887",a94703ab:"9048","3609cdcd":"9069","85aaec92":"9081",a66eab3e:"9372","5e95c892":"9647","6a21048e":"9814"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(a,t)=>{var b=f.o(e,a)?e[a]:void 0;if(0!==b)if(b)t.push(b[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((t,d)=>b=e[a]=[t,d]));t.push(b[2]=d);var r=f.p+f.u(a),c=new Error;f.l(r,(t=>{if(f.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var d=t&&("load"===t.type?"missing":t.type),r=t&&t.target&&t.target.src;c.message="Loading chunk "+a+" failed.\n("+d+": "+r+")",c.name="ChunkLoadError",c.type=d,c.request=r,b[1](c)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,t)=>{var b,d,r=t[0],c=t[1],o=t[2],n=0;if(r.some((a=>0!==e[a]))){for(b in c)f.o(c,b)&&(f.m[b]=c[b]);if(o)var i=o(f)}for(a&&a(t);n Extensions | TUnit - + diff --git a/docs/category/test-framework-comparisons/index.html b/docs/category/test-framework-comparisons/index.html index 476fb33d32..f38314610e 100644 --- a/docs/category/test-framework-comparisons/index.html +++ b/docs/category/test-framework-comparisons/index.html @@ -4,10 +4,10 @@ Test Framework Comparisons | TUnit - + - + \ No newline at end of file diff --git a/docs/category/tutorial---assertions/index.html b/docs/category/tutorial---assertions/index.html index 5922020a04..06944195b2 100644 --- a/docs/category/tutorial---assertions/index.html +++ b/docs/category/tutorial---assertions/index.html @@ -4,10 +4,10 @@ Tutorial - Assertions | TUnit - + - + \ No newline at end of file diff --git a/docs/category/tutorial---basics/index.html b/docs/category/tutorial---basics/index.html index 8d3c2fe125..9ff3726ff2 100644 --- a/docs/category/tutorial---basics/index.html +++ b/docs/category/tutorial---basics/index.html @@ -4,7 +4,7 @@ Tutorial - Basics | TUnit - + diff --git a/docs/category/tutorial---extras/index.html b/docs/category/tutorial---extras/index.html index e497e0d708..11ccc7a284 100644 --- a/docs/category/tutorial---extras/index.html +++ b/docs/category/tutorial---extras/index.html @@ -4,7 +4,7 @@ Tutorial - Extras | TUnit - + diff --git a/docs/comparison/attributes/index.html b/docs/comparison/attributes/index.html index 624e53c5fa..78ff69c777 100644 --- a/docs/comparison/attributes/index.html +++ b/docs/comparison/attributes/index.html @@ -4,7 +4,7 @@ Attributes | TUnit - + diff --git a/docs/comparison/framework-differences/index.html b/docs/comparison/framework-differences/index.html index 4d5b892505..dc114b1e65 100644 --- a/docs/comparison/framework-differences/index.html +++ b/docs/comparison/framework-differences/index.html @@ -4,7 +4,7 @@ Framework Differences | TUnit - + diff --git a/docs/extensions/index.html b/docs/extensions/index.html index 10bcf21b1f..3250eb71ee 100644 --- a/docs/extensions/index.html +++ b/docs/extensions/index.html @@ -4,7 +4,7 @@ Extensions | TUnit - + diff --git a/docs/intro/index.html b/docs/intro/index.html index d91dca7380..5c02bb9a5b 100644 --- a/docs/intro/index.html +++ b/docs/intro/index.html @@ -4,7 +4,7 @@ Intro | TUnit - + diff --git a/docs/tutorial-assertions/and-conditions/index.html b/docs/tutorial-assertions/and-conditions/index.html index 0338efea3f..e544f281f1 100644 --- a/docs/tutorial-assertions/and-conditions/index.html +++ b/docs/tutorial-assertions/and-conditions/index.html @@ -4,11 +4,11 @@ And Conditions | TUnit - + -

And Conditions

+

And Conditions

TUnit can chain assertions together, using the And property. This reads very much like English, and aims to keep the test easy to read and understand, and doesn't require you repeat boilerplate code such as Assert.That over and over.

Every condition must pass when using Ands:

    [Test]
public async Task MyTest()
{
var result = Add(1, 2);

await Assert.That(result)
.IsNotNull()
.And.IsPositive()
.And.IsEqualTo(3);
}
diff --git a/docs/tutorial-assertions/awaiting/index.html b/docs/tutorial-assertions/awaiting/index.html index 58ee7580de..e206a1f2ea 100644 --- a/docs/tutorial-assertions/awaiting/index.html +++ b/docs/tutorial-assertions/awaiting/index.html @@ -4,11 +4,11 @@ Awaiting | TUnit - + -

Awaiting

+

Awaiting

In TUnit you await your assertions, and this serves two purposes:

  • the await keyword is responsible for performing the assertion, before you call await we're building a chain of assertion rules.
  • diff --git a/docs/tutorial-assertions/congratulations/index.html b/docs/tutorial-assertions/congratulations/index.html index ca6831b430..364d9fcce7 100644 --- a/docs/tutorial-assertions/congratulations/index.html +++ b/docs/tutorial-assertions/congratulations/index.html @@ -4,14 +4,14 @@ Congratulations | TUnit - + -

    Congratulations

    +

    Congratulations

    That's all you need to know about assertions.

    There are many out-of-the-box methods for checking things on common object types: DateTime, TimeSpan, IEnumerable, string, INumber

    -

    If something is missing, feel free to raise an issue/suggestion on GitHub.

    +

    If something is missing, feel free to raise an issue/suggestion on GitHub.

    \ No newline at end of file diff --git a/docs/tutorial-assertions/delegates/index.html b/docs/tutorial-assertions/delegates/index.html index a5cf433082..a3dff8fa35 100644 --- a/docs/tutorial-assertions/delegates/index.html +++ b/docs/tutorial-assertions/delegates/index.html @@ -4,12 +4,12 @@ Delegates | TUnit - + -

    Delegates

    +

    Delegates

    TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:

    -
        [Test]
    public async Task MyTest()
    {
    await Assert.That(() =>
    {
    // Do something here
    }).ThrowsNothing();
    }

    // or

    [Test]
    public async Task MyTest()
    {
    await Assert.That(() =>
    {
    // Do something here
    }).ThrowsException().OfType<ArgumentNullException>();
    }

    // or

    [Test]
    public async Task MyTest()
    {
    var argumentNullException = await Assert.ThrowsAsync<ArgumentNullException>(() =>
    {
    // Do something here
    return Task.CompletedTask;
    });
    }
    +
        [Test]
    public async Task MyTest()
    {
    await Assert.That(() =>
    {
    // Do something here
    }).ThrowsNothing();
    }

    // or

    [Test]
    public async Task MyTest()
    {
    await Assert.That(() =>
    {
    // Do something here
    }).ThrowsException().OfType<ArgumentNullException>();
    }

    // or

    [Test]
    public async Task MyTest()
    {
    var argumentNullException = await Assert.ThrowsAsync<ArgumentNullException>(() =>
    {
    // Do something here
    return Task.CompletedTask;
    });
    }
    \ No newline at end of file diff --git a/docs/tutorial-assertions/extensibility/index.html b/docs/tutorial-assertions/extensibility/index.html index 4a9fd174c6..c28d541a81 100644 --- a/docs/tutorial-assertions/extensibility/index.html +++ b/docs/tutorial-assertions/extensibility/index.html @@ -4,11 +4,11 @@ Extensibility / Custom Assertions | TUnit - + -

    Extensibility / Custom Assertions

    +

    Extensibility / Custom Assertions

    The TUnit Assertions can be easily extended so that you can create your own assertions.

    In TUnit, there are two types of things we can assert on:

      @@ -45,6 +45,7 @@

      Here's a fully fledged assertion in action:

      -
      public static InvokableAssertionBuilder<string, TAnd, TOr> Contains<TAnd, TOr>(this IValueSource<string, TAnd, TOr> valueSource, string expected, StringComparison stringComparison, [CallerArgumentExpression("expected")] string doNotPopulateThisValue1 = "", [CallerArgumentExpression("stringComparison")] string doNotPopulateThisValue2 = "")
      where TAnd : IAnd<string, TAnd, TOr>
      where TOr : IOr<string, TAnd, TOr>
      {
      return new StringContainsAssertCondition<TAnd, TOr>(expected, stringComparison)
      .ChainedTo(valueSource.AssertionBuilder, [doNotPopulateThisValue1, doNotPopulateThisValue2]);
      }
    +
    public static InvokableAssertionBuilder<string, TAnd, TOr> Contains<TAnd, TOr>(this IValueSource<string, TAnd, TOr> valueSource, string expected, StringComparison stringComparison, [CallerArgumentExpression("expected")] string doNotPopulateThisValue1 = "", [CallerArgumentExpression("stringComparison")] string doNotPopulateThisValue2 = "")
    where TAnd : IAnd<string, TAnd, TOr>
    where TOr : IOr<string, TAnd, TOr>
    {
    return new StringContainsAssertCondition<TAnd, TOr>(expected, stringComparison)
    .ChainedTo(valueSource.AssertionBuilder, [doNotPopulateThisValue1, doNotPopulateThisValue2]);
    }
    +
    public class StringContainsAssertCondition(string expected, StringComparison stringComparison)
    : AssertCondition<string, string>(expected)
    {
    private protected override bool Passes(string? actualValue, Exception? exception)
    {
    if (actualValue is null)
    {
    OverriddenMessage = "Actual string is null";
    return false;
    }

    if (ExpectedValue is null)
    {
    OverriddenMessage = "Expected string is null";
    return false;
    }

    return actualValue.Contains(ExpectedValue, stringComparison);
    }

    protected internal override string GetFailureMessage() => $"""
    Expected "{ActualValue}" to contain "{ExpectedValue}"
    """;
    }
    \ No newline at end of file diff --git a/docs/tutorial-assertions/or-conditions/index.html b/docs/tutorial-assertions/or-conditions/index.html index 6bece94e03..00f0b15cb4 100644 --- a/docs/tutorial-assertions/or-conditions/index.html +++ b/docs/tutorial-assertions/or-conditions/index.html @@ -4,11 +4,11 @@ Or Conditions | TUnit - + -

    Or Conditions

    +

    Or Conditions

    Similar to the And property, there is also the Or property.

    When using this, only one condition needs to pass:

        [Test]
    public async Task MyTest()
    {
    int[] array = [1, 2];
    var randomValue1 = Random.Shared.GetItems(array, 1).First();
    var randomValue2 = Random.Shared.GetItems(array, 1).First();

    var result = Add(randomValue1, randomValue2);

    await Assert.That(result)
    .IsEqualTo(2)
    .Or.IsEqualTo(3)
    .Or.IsEqualTo(4);
    }
    diff --git a/docs/tutorial-assertions/scopes/index.html b/docs/tutorial-assertions/scopes/index.html index 4d31cc9007..c6a308a9f1 100644 --- a/docs/tutorial-assertions/scopes/index.html +++ b/docs/tutorial-assertions/scopes/index.html @@ -4,11 +4,11 @@ Assertion Scopes | TUnit - + -

    Assertion Scopes

    +

    Assertion Scopes

    In TUnit you can create an assertion scope by calling Assert.Multiple(). This returns an IAsyncDisposable and so should call both await and using. This will make sure that the assertions are executed when the scope is exited.

    If you use an assertion scope, then any assertions that are performed inside of it will not throw an exception immediately. Instead, they will lazily execute their logic, and then aggregate any exceptions together at the end of the scope and throw them together.

    diff --git a/docs/tutorial-assertions/type-checking/index.html b/docs/tutorial-assertions/type-checking/index.html index 0cbc3b484f..5833ac6e0e 100644 --- a/docs/tutorial-assertions/type-checking/index.html +++ b/docs/tutorial-assertions/type-checking/index.html @@ -4,11 +4,11 @@ Type Checking | TUnit - + -

    Type Checking

    +

    Type Checking

    TUnit assertions try to check the types at compile time. This gives faster developer feedback and helps speed up development time. (Ever made a silly mistake on a test, but haven't realised till 15 minutes later after your build pipeline has finally told you? I know I have!)

    diff --git a/docs/tutorial-basics/congratulations/index.html b/docs/tutorial-basics/congratulations/index.html index 349178961d..a2710256b8 100644 --- a/docs/tutorial-basics/congratulations/index.html +++ b/docs/tutorial-basics/congratulations/index.html @@ -4,7 +4,7 @@ Congratulations! | TUnit - + diff --git a/docs/tutorial-basics/data-driven-tests/index.html b/docs/tutorial-basics/data-driven-tests/index.html index dc87ab8a9b..05eb7e40e6 100644 --- a/docs/tutorial-basics/data-driven-tests/index.html +++ b/docs/tutorial-basics/data-driven-tests/index.html @@ -4,7 +4,7 @@ Data Driven Tests | TUnit - + diff --git a/docs/tutorial-basics/data-source-driven-tests/index.html b/docs/tutorial-basics/data-source-driven-tests/index.html index e7f0f3a95c..668e8b4d63 100644 --- a/docs/tutorial-basics/data-source-driven-tests/index.html +++ b/docs/tutorial-basics/data-source-driven-tests/index.html @@ -4,7 +4,7 @@ Data Source Driven Tests | TUnit - + diff --git a/docs/tutorial-basics/installing/index.html b/docs/tutorial-basics/installing/index.html index 6299486fb4..2ad198bcdc 100644 --- a/docs/tutorial-basics/installing/index.html +++ b/docs/tutorial-basics/installing/index.html @@ -4,7 +4,7 @@ Installing TUnit | TUnit - + diff --git a/docs/tutorial-basics/matrix-tests/index.html b/docs/tutorial-basics/matrix-tests/index.html index acb6b0ac15..ba429ae28f 100644 --- a/docs/tutorial-basics/matrix-tests/index.html +++ b/docs/tutorial-basics/matrix-tests/index.html @@ -4,7 +4,7 @@ Matrix Tests | TUnit - + diff --git a/docs/tutorial-basics/running-your-tests/index.html b/docs/tutorial-basics/running-your-tests/index.html index 808fc54d45..a315372d14 100644 --- a/docs/tutorial-basics/running-your-tests/index.html +++ b/docs/tutorial-basics/running-your-tests/index.html @@ -4,7 +4,7 @@ Running your tests | TUnit - + diff --git a/docs/tutorial-basics/things-to-know/index.html b/docs/tutorial-basics/things-to-know/index.html index 48e261da38..42c92545ea 100644 --- a/docs/tutorial-basics/things-to-know/index.html +++ b/docs/tutorial-basics/things-to-know/index.html @@ -4,7 +4,7 @@ Things to know | TUnit - + diff --git a/docs/tutorial-basics/writing-your-first-test/index.html b/docs/tutorial-basics/writing-your-first-test/index.html index fa752c6591..0e86fdb396 100644 --- a/docs/tutorial-basics/writing-your-first-test/index.html +++ b/docs/tutorial-basics/writing-your-first-test/index.html @@ -4,7 +4,7 @@ Writing your first test | TUnit - + diff --git a/docs/tutorial-extras/class-constructors/index.html b/docs/tutorial-extras/class-constructors/index.html index 3f7ea99d98..5edb9f1574 100644 --- a/docs/tutorial-extras/class-constructors/index.html +++ b/docs/tutorial-extras/class-constructors/index.html @@ -4,7 +4,7 @@ Class Constructor Helpers | TUnit - + diff --git a/docs/tutorial-extras/cleanup/index.html b/docs/tutorial-extras/cleanup/index.html index 471846a8fb..364bb662f0 100644 --- a/docs/tutorial-extras/cleanup/index.html +++ b/docs/tutorial-extras/cleanup/index.html @@ -4,7 +4,7 @@ Test Clean Ups | TUnit - + diff --git a/docs/tutorial-extras/depends-on/index.html b/docs/tutorial-extras/depends-on/index.html index e6a4fb09cb..b7f76b4432 100644 --- a/docs/tutorial-extras/depends-on/index.html +++ b/docs/tutorial-extras/depends-on/index.html @@ -4,7 +4,7 @@ Depends On | TUnit - + diff --git a/docs/tutorial-extras/executors/index.html b/docs/tutorial-extras/executors/index.html index 2836b6a4e2..924eba571e 100644 --- a/docs/tutorial-extras/executors/index.html +++ b/docs/tutorial-extras/executors/index.html @@ -4,7 +4,7 @@ Executors | TUnit - + diff --git a/docs/tutorial-extras/explicit/index.html b/docs/tutorial-extras/explicit/index.html index 5f3e6d0cc9..da2a8590ff 100644 --- a/docs/tutorial-extras/explicit/index.html +++ b/docs/tutorial-extras/explicit/index.html @@ -4,7 +4,7 @@ Explicit | TUnit - + diff --git a/docs/tutorial-extras/not-in-parallel/index.html b/docs/tutorial-extras/not-in-parallel/index.html index 3d707e21fa..1a54b50354 100644 --- a/docs/tutorial-extras/not-in-parallel/index.html +++ b/docs/tutorial-extras/not-in-parallel/index.html @@ -4,7 +4,7 @@ Not in Parallel | TUnit - + diff --git a/docs/tutorial-extras/order/index.html b/docs/tutorial-extras/order/index.html index 3a34a5a940..191015b8aa 100644 --- a/docs/tutorial-extras/order/index.html +++ b/docs/tutorial-extras/order/index.html @@ -4,7 +4,7 @@ Ordering Tests | TUnit - + diff --git a/docs/tutorial-extras/parallel-limiter/index.html b/docs/tutorial-extras/parallel-limiter/index.html index 7302c4686c..04ca6a5a43 100644 --- a/docs/tutorial-extras/parallel-limiter/index.html +++ b/docs/tutorial-extras/parallel-limiter/index.html @@ -4,7 +4,7 @@ Parallel Limiter | TUnit - + diff --git a/docs/tutorial-extras/properties/index.html b/docs/tutorial-extras/properties/index.html index 64db3566a9..ed20fc24ca 100644 --- a/docs/tutorial-extras/properties/index.html +++ b/docs/tutorial-extras/properties/index.html @@ -4,7 +4,7 @@ Properties | TUnit - + diff --git a/docs/tutorial-extras/repeating/index.html b/docs/tutorial-extras/repeating/index.html index 2dd177512a..d1cc64680c 100644 --- a/docs/tutorial-extras/repeating/index.html +++ b/docs/tutorial-extras/repeating/index.html @@ -4,7 +4,7 @@ Repeating | TUnit - + diff --git a/docs/tutorial-extras/retrying/index.html b/docs/tutorial-extras/retrying/index.html index a38805caf8..4a4b3a2902 100644 --- a/docs/tutorial-extras/retrying/index.html +++ b/docs/tutorial-extras/retrying/index.html @@ -4,7 +4,7 @@ Retrying | TUnit - + diff --git a/docs/tutorial-extras/setup/index.html b/docs/tutorial-extras/setup/index.html index 2e3e5a2e0a..ba745f447b 100644 --- a/docs/tutorial-extras/setup/index.html +++ b/docs/tutorial-extras/setup/index.html @@ -4,7 +4,7 @@ Test Set Ups | TUnit - + diff --git a/docs/tutorial-extras/test-context/index.html b/docs/tutorial-extras/test-context/index.html index 3f3ca84294..b560a9bbf7 100644 --- a/docs/tutorial-extras/test-context/index.html +++ b/docs/tutorial-extras/test-context/index.html @@ -4,7 +4,7 @@ Test Context | TUnit - + diff --git a/docs/tutorial-extras/test-filters/index.html b/docs/tutorial-extras/test-filters/index.html index 2dbeda7406..64a0438e7d 100644 --- a/docs/tutorial-extras/test-filters/index.html +++ b/docs/tutorial-extras/test-filters/index.html @@ -4,7 +4,7 @@ Test Filters | TUnit - + diff --git a/docs/tutorial-extras/timeouts/index.html b/docs/tutorial-extras/timeouts/index.html index 85611a7f78..168c25b874 100644 --- a/docs/tutorial-extras/timeouts/index.html +++ b/docs/tutorial-extras/timeouts/index.html @@ -4,7 +4,7 @@ Timeouts | TUnit - + diff --git a/index.html b/index.html index 6b9f3f9210..08b02fa280 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ Hello from TUnit | TUnit - + diff --git a/markdown-page/index.html b/markdown-page/index.html index 39c965215f..170128aa5d 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -4,7 +4,7 @@ Markdown page example | TUnit - +