From 9dccdb9068ddd0485ea11aed3c56935425b3e7ac Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Fri, 13 Feb 2026 10:26:58 -0800 Subject: [PATCH] test: cover countInFile/grepFile string patterns and validate-commands warnings suffix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Round 79 — untested conditional branches in utils.js and validate-commands.js: - countInFile: exercise typeof pattern === 'string' branch with valid string - grepFile: exercise string pattern branch (not RegExp) - validate-commands: verify (N warnings) suffix in output when warnCount > 0 --- tests/ci/validators.test.js | 22 ++++++++++++++++++++++ tests/lib/utils.test.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/tests/ci/validators.test.js b/tests/ci/validators.test.js index 94937c05..ffc033a6 100644 --- a/tests/ci/validators.test.js +++ b/tests/ci/validators.test.js @@ -2031,6 +2031,28 @@ function runTests() { cleanupTestDir(testDir); })) passed++; else failed++; + // ── Round 79: validate-commands.js warnings count suffix in output ── + console.log('\nRound 79: validate-commands.js (warnings count in output):'); + + if (test('output includes (N warnings) suffix when skill references produce warnings', () => { + const testDir = createTestDir(); + const agentsDir = createTestDir(); + const skillsDir = createTestDir(); + // Create a command that references 2 non-existent skill directories + // Each triggers a WARN (not error) — warnCount should be 2 + fs.writeFileSync(path.join(testDir, 'cmd-warn.md'), + '# Command\nSee skills/fake-skill-a/ and skills/fake-skill-b/ for details.'); + + const result = runValidatorWithDirs('validate-commands', { + COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir + }); + assert.strictEqual(result.code, 0, 'Skill warnings should not cause error exit'); + // The validate-commands output appends "(N warnings)" when warnCount > 0 + assert.ok(result.stdout.includes('(2 warnings)'), + `Output should include "(2 warnings)" suffix, got: ${result.stdout}`); + cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir); + })) passed++; else failed++; + // Summary console.log(`\nResults: Passed: ${passed}, Failed: ${failed}`); process.exit(failed > 0 ? 1 : 0); diff --git a/tests/lib/utils.test.js b/tests/lib/utils.test.js index 698ab7e5..45ac1e24 100644 --- a/tests/lib/utils.test.js +++ b/tests/lib/utils.test.js @@ -1096,6 +1096,41 @@ function runTests() { } })) passed++; else failed++; + // ── Round 79: countInFile with valid string pattern ── + console.log('\nRound 79: countInFile (valid string pattern):'); + + if (test('countInFile counts occurrences using a plain string pattern', () => { + const testFile = path.join(utils.getTempDir(), `utils-test-count-str-${Date.now()}.txt`); + try { + utils.writeFile(testFile, 'apple banana apple cherry apple'); + // Pass a plain string (not RegExp) — exercises typeof pattern === 'string' + // branch at utils.js:441-442 which creates new RegExp(pattern, 'g') + const count = utils.countInFile(testFile, 'apple'); + assert.strictEqual(count, 3, 'String pattern should count all occurrences'); + } finally { + fs.unlinkSync(testFile); + } + })) passed++; else failed++; + + // ── Round 79: grepFile with valid string pattern ── + console.log('\nRound 79: grepFile (valid string pattern):'); + + if (test('grepFile finds matching lines using a plain string pattern', () => { + const testFile = path.join(utils.getTempDir(), `utils-test-grep-str-${Date.now()}.txt`); + try { + utils.writeFile(testFile, 'line1 alpha\nline2 beta\nline3 alpha\nline4 gamma'); + // Pass a plain string (not RegExp) — exercises the else branch + // at utils.js:468-469 which creates new RegExp(pattern) + const matches = utils.grepFile(testFile, 'alpha'); + assert.strictEqual(matches.length, 2, 'String pattern should find 2 matching lines'); + assert.strictEqual(matches[0].lineNumber, 1, 'First match at line 1'); + assert.strictEqual(matches[1].lineNumber, 3, 'Second match at line 3'); + assert.ok(matches[0].content.includes('alpha'), 'Content should include pattern'); + } finally { + fs.unlinkSync(testFile); + } + })) passed++; else failed++; + // Summary console.log('\n=== Test Results ==='); console.log(`Passed: ${passed}`);