import { describe, expect, it } from 'vitest'; import { copyCandidates, selectedTargets, type CopyCandidate } from '../src/core/copy-targets'; const piers: CopyCandidate[] = [ { name: 'P1', type: 'T형', hasModel: true }, { name: 'P2', type: 'T형', hasModel: true }, { name: 'P3', type: 'T형', hasModel: true }, { name: 'P4', type: 'Y형', hasModel: true }, { name: 'P5', type: 'T형', hasModel: false }, ]; describe('copyCandidates (대상 후보)', () => { it('excludes the source pier', () => { expect(copyCandidates(piers, 'P3', false).map((c) => c.name)).not.toContain('P3'); }); it('keeps only the source type when 같은 형식만 is on', () => { expect(copyCandidates(piers, 'P3', true).map((c) => c.name)).toEqual(['P1', 'P2', 'P5']); }); it('marks a pier without a model as not selectable', () => { const p5 = copyCandidates(piers, 'P3', false).find((c) => c.name === 'P5'); expect(p5?.selectable).toBe(false); }); }); describe('selectedTargets (선택한 대상만)', () => { it('is empty when nothing is ticked', () => { expect(selectedTargets(piers, 'P3', false, new Set())).toEqual([]); }); it('returns only ticked, selectable piers', () => { const picked = new Set(['P1', 'P4', 'P5']); expect(selectedTargets(piers, 'P3', false, picked)).toEqual(['P1', 'P4']); }); it('ignores a tick on a pier hidden by the same-type filter', () => { const picked = new Set(['P4']); expect(selectedTargets(piers, 'P3', true, picked)).toEqual([]); }); });