Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

New Project Steward Required!

This project needs a new maintainer or someone to continue taking it forward. I put a lot of effort and passion to deliver not just a functional but also a beautifully designed and written piece of code. Unfortunately other commitments have crept up over the years, thus I hope someone just as passionate can take over.

CLUnit

CLUnit is a Common Lisp unit testing framework. It is designed to be easy to use so that you can quickly start testing.

Author: Tapiwa Gutu

CLUnit provides a rich set of features aimed at improving your unit testing experience:

  • Multiple inheritance for test suites allows you to group tests into hierarchies.
  • Composes the test results of each test run into a single report.
  • Allows redefinition of inline functions and macros without having to redefine your tests.
  • Supports composable test suite fixtures.
  • Allows for an interactive testing process which gives you access to the test environment.
  • Provides visual feedback of the unit test progress.
  • Extensible test reporting. Builtin support for default reporting and TAP output.
  • Released under MIT license

Check out the comprehensive CLUnit Tutorial.

Example

(ql:quickload "clunit")
(use-package:clunit)
;; Test suite for all number operation tests.
(defsuite NumberSuite ())
;; Test suite for floating point operations
(defsuite FloatSuite (NumberSuite))
(defsuite IntegerSuite (NumberSuite))
;; Define a test called TEST-INT1
(deftest test-int1 (IntegerSuite)
(assert-true (=11))
(assert-equalp 4 (+22)))
;; Define a test called TEST-FLOAT1
(deftest test-float1 (FloatSuite)
(assert-true (=1.0-1.0))
(assert-equalp 4.0 (+2.02.0)))
(print (run-suite 'NumberSuite))

which produces the output:

PROGRESS:
=========
NUMBERSUITE: (Test Suite)
INTEGERSUITE: (Test Suite)
TEST-INT1: ..
FLOATSUITE: (Test Suite)
TEST-FLOAT1: F.
FAILURE DETAILS:
================
NUMBERSUITE -> FLOATSUITE: (Test Suite)
TEST-FLOAT1: Expression: (= 1.0 -1.0)
Expected: T
Returned: NIL
SUMMARY:
========
Test functions:
Executed: 2
Skipped: 0
Tested 4 assertions.
Passed: 3/4 ( 75.0%)
Failed: 1/4 ( 25.0%) 

(if you are entering forms in the REPL, the print form is not usually needed).

Tests and assertions

Each test, like test-int1 in the above example, can contain a number of assertions, given in the table below:

AssertionDescription
assert-true EXPRESSIONPasses if the expression EXPRESSION is not NIL
assert-false EXPRESSIONPasses if EXPRESSION is NIL
assert-eq VALUE EXPRESSIONPasses if (EQ VALUE EXPRESSION) returns true
assert-eql VALUE EXPRESSIONPasses if (EQL VALUE EXPRESSION) returns true
assert-equal VALUE EXPRESSIONPasses if (EQUAL VALUE EXPRESSION) returns true
assert-equalp VALUE EXPRESSIONPasses if (EQUALP VALUE EXPRESSION) returns true
assert-equality TEST VALUE EXPRESSIONPasses if (FUNCALL TEST VALUE EXPRESSION) returns true
assert-equality* VALUE EXPRESSIONPasses if (FUNCALL \*clunit-equality-test\* VALUE EXPRESSION) returns true. By default clunit-equality-test is EQUALP
assert-expands EXPANSION EXPRESSIONTests macro expansion, passes if (EQUALP EXPANSION (MACROEXPAND-1 EXPRESSION)) is true
assert-condition CONDITION EXPRESSIONPasses if EXPRESSION signals CONDITION
assert-fails FORMAT-STRINGForce test to fail, giving a format string for the message

All of these tests take optional forms, which are evaluated and printed if the test fails. These can be used to provide test diagnostics or documentation. For example

(deftest test-suiteless ()
(let ((a 1) (b 2) (c 3))
(assert-true (= a b c) "This assertion is meant to fail." a b c )))
(run-test 'test-suiteless :report-progressnil)

produces the output:

FAILURE DETAILS:
================
TEST-SUITELESS: Expression: (= A B C)
Expected: T
Returned: NIL
This assertion is meant to fail.
A => 1
B => 2
C => 3
SUMMARY:
========
Test functions:
Executed: 1
Skipped: 0
Tested 1 assertion.
Passed: 0/1 ( 0.0%)
Failed: 1/1 (100.0%)
Errors: 0/1 ( 0.0%)

(if not in a REPL, you may have to print the return value of run-test).

About

CLUnit: A Common Lisp Unit Testing Framework.

Resources

Stars

24 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages