Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Continuous Property Testing with F#, FsCheck and Fake

This project is the subject of a lightning talk for Progressive .NET 2017

A few details on property testing:

How to set up Fake and paket from scratch (TBD).

  • Create the .NET core projects with their required dependencies (run CreateProjects.cmd your-project-name)
mkdir %1\src\FizzBuzz
mkdir %1\tests cd %1\src\FizzBuzz dotnet new console -lang F#
cd ..\..\..\%1\tests
dotnet new xunit -lang F# dotnet add package FsCheck
dotnet add package FsCheck.Xunit
dotnet add reference ..\src\FizzBuzz\FizzBuzz.fsproj
cd ..
dotnet new sln dotnet sln add src\FizzBuzz\FizzBuzz.fsproj
dotnet sln add tests\tests.fsproj
dotnet restore
dotnet build 
  • Migrate to paket and install Fake (run InstallPaketAndFake.cmd from the newly created solution folder)
mkdir .paket
cd .paket curl -L -O https://github.com/fsprojects/Paket/releases/download/5.94.0/paket.bootstrapper.exe paket.bootstrapper.exe
.paket\paket.exe convert-from-nuget echo.>> paket.dependencies
echo nuget Fake >> paket.dependencies
.paket\paket.exe install
dir /s fake.exe
dotnet restore
dotnet build
  • The build scrips

Put build.fsx and build.cmd in the solution folder. The first is the Fake build file. build.cmd calls on targets from the build file. Call build.cmd Build to run the build, and build.cmd Watch to run builds and tests continuously.

Talk Outlined

Goal: wire up paket and Fake to do continuous testing and work through a few examples of property based testing with FsCheck.

Get to know the audience: who has used F#? Paket? Fake? Property-based-testing?

Set up the projects as explained above.

Current situation in the industry: example based testing.

Definiton of property testing: what is a property? How does that change our way of thinking when writing tests? Property is a relationship between the input and the output of a function. Why? Generate random input to cover a multitude of scenarios. Examples of properties: adding items to shopping carts, 0 as a neutral element for addition etc.

More involved example: shuffle function!

Coding examples - FizzBuzz, max element of array

About

Project used as support for a lightning talk at Progressive .NET London 2017

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages