// lib/merge-gitignore.test.mjs import { test } from 'node:test' import assert from 'node:assert/strict' import { mergeGitignore } from './merge-gitignore.mjs' test('union dedupes and preserves base order, appends new', () => { const base = 'node_modules\n.env\n' const add = '.env\ndist\n.DS_Store\n' assert.equal(mergeGitignore(base, add), 'node_modules\n.env\ndist\n.DS_Store\n') }) test('blank lines and comments in add are ignored for dedupe but kept once', () => { assert.equal(mergeGitignore('a\n', '\n# c\nb\n'), 'a\n# c\nb\n') }) // 回归:两段不同区块共用同一注释标题(如 `# generated`)时,第二段的标题不应被去重吞掉。 test('cross-section duplicate comment headers are preserved (no global dedupe on comments)', () => { const base = '# generated\na\n' const add = '# generated\nb\n' assert.equal(mergeGitignore(base, add), '# generated\na\n# generated\nb\n') }) // 相邻完全重复的注释会折叠成一行(避免无意义连续重复)。 test('adjacent duplicate comments are folded', () => { assert.equal(mergeGitignore('# x\n# x\n', 'a\n'), '# x\na\n') }) // negation 规则 (!pattern) 按原文比对、顺序保留。 test('negation patterns are deduped by literal and order is preserved', () => { const merged = mergeGitignore('node_modules\n!node_modules/keep\n', '!node_modules/keep\ndist\n') assert.equal(merged, 'node_modules\n!node_modules/keep\ndist\n') }) // 输出始终以单个 \n 结尾,即便 base 末尾无换行。 test('output always ends with exactly one newline', () => { assert.equal(mergeGitignore('a', 'b'), 'a\nb\n') assert.equal(mergeGitignore('a\n\n\n', 'b\n\n'), 'a\nb\n') })