aboutsummaryrefslogtreecommitdiff
path: root/modules/test/test-shell-script.js
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-10-27 17:10:40 +0100
committerAgando <roduccomm@gmail.com>2026-10-27 17:10:40 +0100
commitb78eba08d320a58c4cd793cf4811444e351ffa17 (patch)
treee2b6e880f449708b69e83a5ba6756320357741a2 /modules/test/test-shell-script.js
parent74fd694745650770041ed90141e943f5c237a7f5 (diff)
fix(newos4): `if test …` was always false and `for` items never globbed
Found by running the shipped runner the way a user would, not by re-reading it. - _evalTest() stripped [ ] but not the `test` keyword, so `if test -f /work/alpha.txt` evaluated the word "test" as an operator, returned false, and every such branch took the else arm — measured live: "alpha missing" for a file that exists. Both spellings work now (`test -f x`, `[ -f x ]`), plus `-d`, `-e`, `-z`, `-n`, `!` and the = / != comparisons. - `for f in /work/*.txt` ran ONCE with $f set to the literal pattern, because only command arguments went through _expandGlobs. Loop items are expanded per iteration now, so the body runs once per matched file with the real path. - _expandGlobs() falls back to readDir() when a fs has no ls(), so the helper works against either shape instead of silently returning the literal pattern. Verification, live on v4.6.119: - for+glob: "--- /work/alpha.txt / 3 /work/alpha.txt / --- /work/beta.txt / 1 /work/beta.txt" (6 statements, exit 0) — previously one iteration printing the pattern. - conditionals: "alpha exists", "nope missing", grep + $? intact. - end-to-end /work/report.sh (loop + glob + >> append + test -f) wrote a correct log: "start / file: /work/alpha.txt / 3 /work/alpha.txt / file: /work/beta.txt / 1 /work/beta.txt …". - unknown command still reports "command not found" and never calls the AI. - test-shell-script.js 27 -> 35 asserts. Retracted: I reported `echo x > file` as broken. It was my probe monkey-patching terminal.print, which bypassed the capture stack the redirect uses. Both paths write correctly: direct helper -> "direct-call", prompt -> "prompt-call\n".
Diffstat (limited to 'modules/test/test-shell-script.js')
-rw-r--r--modules/test/test-shell-script.js28
1 files changed, 27 insertions, 1 deletions
diff --git a/modules/test/test-shell-script.js b/modules/test/test-shell-script.js
index 578b186..7b19fa6 100644
--- a/modules/test/test-shell-script.js
+++ b/modules/test/test-shell-script.js
@@ -145,6 +145,32 @@ async function runScript(seed, lines) {
ok('D10 sequential statements all run', r.printed.join('|') === 'a|b', r.printed.join('|'));
}
- if (fails === 0) console.log('test-shell-script: ' + passes + ' passed, 0 failed');
+ // D. if-conditions: the `test` keyword and the bracket form (both were false before v4.6.119)
+{
+ const files = { '/work/alpha.txt': 'one\ntwo' };
+ shell.terminal = {
+ fs: {
+ readFile: (p) => (Object.prototype.hasOwnProperty.call(files, p) ? files[p] : null),
+ readDir: (p) => (p === '/work' ? [{ name: 'alpha.txt', type: 'file' }, { name: 'beta.txt', type: 'file' }] : null),
+ currentPath: ['work'],
+ },
+ };
+ ok('D1 "test -f" is true for an existing file', shell._evalTest('test -f /work/alpha.txt', {}) === true);
+ ok('D2 "test -f" is false for a missing file', shell._evalTest('test -f /work/nope.txt', {}) === false);
+ ok('D3 "[ -f … ]" is true for an existing file', shell._evalTest('[ -f /work/alpha.txt ]', {}) === true);
+ ok('D4 "[ -f … ]" is false for a missing file', shell._evalTest('[ -f /work/nope.txt ]', {}) === false);
+ ok('D5 "test -d" is true for a directory', shell._evalTest('test -d /work', {}) === true);
+ ok('D6 "! test -f" inverts', shell._evalTest('! test -f /work/nope.txt', {}) === true);
+}
+
+// E. for-items go through glob expansion (measured live: the loop ran once with $f = the pattern)
+{
+ const src = fsMod.readFileSync(path.join(ROOT, 'ext/shell.js'), 'utf8');
+ ok('E1 the for branch expands globs per item', /_expandGlobs\(\[expanded\], cwd\)/.test(src), 'for-branch expansion missing');
+ ok('E2 _expandGlobs turns *.txt into the real files', shell._expandGlobs(['*.txt'], ['work']).join(',') === '/work/alpha.txt,/work/beta.txt',
+ JSON.stringify(shell._expandGlobs(['*.txt'], ['work'])));
+}
+
+if (fails === 0) console.log('test-shell-script: ' + passes + ' passed, 0 failed');
else { console.log('test-shell-script: ' + passes + ' passed, ' + fails + ' FAILED'); process.exit(1); }
})();