Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@

### Changed
- `bashunit doc <filter>` says `No assertion matches '<filter>'` instead of printing nothing, which was indistinguishable from a broken install. Mirrors the existing `--custom` wording; the exit code stays 0 because `doc` is informational (#1201)
- `install.sh` destination errors no longer advise a `-d` flag that does not exist β€” the script takes positional arguments, so following the advice produced `Invalid arguments`. The one message whose job is to tell you how to recover pointed at a form the parser rejects (#1221)
- The `example/` demo is covered by the suite. `docs/examples.md` and `example/README.md` send new users to `./bashunit example` as their first contact with the framework, and nothing ran it β€” `make test` collects from `tests/` only β€” so it could break while CI stayed green. The dead `EXAMPLE_TEST_SCRIPTS` variable, pointing at a file deleted several releases ago, is gone with it (#1219)
- Docs: an empty entry in the `-e/--env/--boot` file assigns an empty value rather than restoring the built-in default, so blanking a boolean disables it; the guide said it "wipes" the value, which reads as a reset. The rest of the precedence ladder is now covered by tests (#1217)
- Docs: the test-function name rule is stated correctly β€” the prefix is a literal, lowercase `test_`, so the guide's own `testRenderAllTestsPassedWhenNotFailedTests` example and its claim that names are case-insensitive were both wrong, and a function named either way is silently never run (#1215)
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -199,19 +199,19 @@ cd "$(dirname "$0")"
# directory` with no mention of bashunit at all (#1197).
if [ -e "$DIR" ] && [ ! -d "$DIR" ]; then
echo "Error: '$DIR' exists and is not a directory." >&2
echo "Choose another destination with -d, or remove that file." >&2
echo "Choose another destination by passing it as an argument, or remove that file." >&2
exit 1
fi

if [ ! -d "$DIR" ] && ! mkdir -p "$DIR" 2>/dev/null; then
echo "Error: cannot create the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

if [ ! -w "$DIR" ]; then
echo "Error: cannot write to the '$DIR' folder." >&2
echo "Choose another destination with -d, or re-run with sufficient permissions." >&2
echo "Choose another destination by passing it as an argument, or re-run with sufficient permissions." >&2
exit 1
fi

Expand Down
45 changes: 45 additions & 0 deletions tests/acceptance/install_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -344,3 +344,48 @@ function test_install_rejects_a_destination_it_cannot_write() {
assert_general_error "" "" "$ec"
assert_contains "cannot write to" "$output"
}

# The three destination errors above all end with advice on how to recover, and
# the advice named a `-d` flag the script never had -- `install.sh` parses
# positional arguments only, so following it produced "Invalid arguments"
# (#1221). The assertions covered the diagnosis line and stopped there, which is
# exactly how an invented flag survives.
#
# So run the suggested form instead of string-matching it. This needs no network:
# the destination is validated first, and an unparseable argument is rejected
# before that.
function test_the_recovery_advice_names_a_form_the_parser_accepts() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"
printf 'not a dir\n' >"$dir/blocked"

local output
output=$(cd "$dir" && ./install.sh 0.47.0 blocked 2>&1) || true
assert_contains "Choose another destination" "$output"

# The advice must not name a flag. Asserted against the run that actually
# prints it: a flag-shaped argument dies in the parser before any of this,
# so checking the advice there would compare against nothing at all.
assert_not_contains "-d" "$output"

# And what it does tell the reader to do -- pass a different destination as
# an argument -- has to get past argument parsing.
local retry
retry=$(cd "$dir" && ./install.sh 0.47.0 elsewhere 2>&1) || true

assert_not_contains "Invalid arguments" "$retry"
}

# The parser takes positional arguments only, which is what the advice above
# now describes.
function test_a_flag_shaped_destination_is_rejected() {
local dir
dir="$(bashunit::temp_dir)"
cp ./install.sh "$dir/install.sh"

local output
output=$(cd "$dir" && ./install.sh -d somewhere 2>&1) || true

assert_contains "Invalid arguments" "$output"
}
Loading