import { describe, it, expect } from 'vitest'; import { generateMutants, MUTATION_OPERATORS } from './mutate-operators.mjs'; describe('generateMutants', () => { it('флип === → !== даёт мутанта, отличного от оригинала', () => { const src = 'export const f = (a, b) => a === b;'; const muts = generateMutants(src); expect(muts.length).toBeGreaterThan(0); expect(muts.every((m) => m.mutated !== src)).toBe(true); expect(muts.some((m) => m.mutated.includes('a !== b'))).toBe(true); }); it('true → false и && → || покрыты', () => { const muts = generateMutants('const x = ok && ready === true;'); expect(muts.some((m) => m.mutated.includes('ready === false'))).toBe(true); expect(muts.some((m) => m.mutated.includes('ok || ready'))).toBe(true); }); it('нет операторных целей → пустой список (нечего мутировать)', () => { expect(generateMutants('const s = "plain string";')).toEqual([]); }); it('детерминирован + dedup + cap (≤ MUTATION_OPERATORS.cap)', () => { const src = 'a === b; c === d; e === f; g === h;'; const a = generateMutants(src); const b = generateMutants(src); expect(a).toEqual(b); expect(new Set(a.map((m) => m.mutated)).size).toBe(a.length); expect(a.length).toBeLessThanOrEqual(MUTATION_OPERATORS.cap); }); });