merge-gitignore.test.mjs 1.65 KB
// 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')
})