Skip to content

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

@w3lld1@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(assert): add numeric range assertions by w3lld1 · Pull Request #1037 · TypedDevs/bashunit · GitHub
Skip to content

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

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

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

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

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

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

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

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

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

@w3lld1@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(assert): add numeric range assertions by w3lld1 · Pull Request #1037 · TypedDevs/bashunit · GitHub
Skip to content

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

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

feat(assert): add numeric range assertions - #1037

Merged
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions
Aug 10, 2026
Merged

feat(assert): add numeric range assertions#1037
Chemaclass merged 3 commits into
TypedDevs:mainfrom
w3lld1:feat/1026-numeric-range-assertions

Conversation

@w3lld1

Copy link
Copy Markdown
Contributor

Background

Related #1026

Numeric assertions covered open-ended comparisons but not a single inclusive range check. I added bounded assertions so one logical range check reports one result and one failure message.

Changes

  • I added assert_between <min> <max> <actual> with inclusive bounds and assert_not_between as its exact negation.
  • I reused the fork-free fixed-point comparison path for common integers and decimals, with the existing bc/awk fallback for unsupported precision.
  • I return usage errors for missing arguments, non-numeric values, and reversed bounds.
  • I added coverage for boundaries, decimals, negative values, failure details, assertion counts, arity, and invalid input.
  • I updated the assertion docs, generated CLI snapshot, completions, catalogue counts, and changelog.

Verification

  • make test — 1,789 passed; 32 skipped; 4 incomplete; 2 snapshots; no failures
  • ./bashunit --parallel tests/ — 1,751 passed; 35 skipped; 4 incomplete; 2 snapshots; no failures
  • focused assertion, arity, completion, and fork-budget suites — 85 passed; 1 skipped; no failures
  • make sa
  • make lint
  • git diff --check

Checklist

  • I updated the CHANGELOG.md to reflect the new feature or fix
  • I updated the documentation to reflect the changes

Fixes#1026

@ChemaclassChemaclass added the enhancement New feature or request label Aug 10, 2026
assert_between and assert_not_between accept a leading + on any operand, but
operands wider than the fork-free fixed-point path fall through to bc, which
cannot parse one: it answers with a parse error on stderr and an empty result,
read here as "greater than". assert_within_delta already stripped the sign for
the same reason; is_le now does it for every caller.
Also pins the _is_numeric hardening this branch introduced: 1.2.3 and 5-3 now
report as non-numeric instead of leaking a bc parse error or being evaluated as
an expression.

@ChemaclassChemaclass left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Solid feature. Inclusive bounds, an exact negation, usage errors for reversed and non-numeric input, and a failure message that names which bound broke. Docs, both completion files, the doc snapshot, the arity provider and the CHANGELOG are all updated.

Verified locally: full suite, --parallel, make sa, make lint, and no new shfmt drift against main.

I pushed one fix on top (fb697ec).

assert_between "+1" "+9999999999999999999999" "+5" leaked a raw bc parse error and then reported a bogus expects min <= max usage error. Operands wider than the fork-free fixed-point path fall through to bc, and bc cannot parse a leading +: it returns an empty result, which is_le reads as "greater than". assert_within_delta already strips the sign for exactly this reason, so bashunit::math::is_le now does it for every caller. Regression tests in math_test.sh and numeric_test.sh.

I also pinned the _is_numeric hardening this branch introduces. That is a user-visible fix on its own and it was not recorded: on main, assert_within_delta "1.2.3" "1" "0.5" leaks Parse error: bad expression into the report, and 5-3 is silently evaluated as 2. Two regression tests plus a Fixed entry in the CHANGELOG.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(assert): assert_between / assert_not_between for numeric ranges

2 participants

@w3lld1@Chemaclass