Files
brain/tools/mutate-operators.test.mjs

29 lines
1.4 KiB
JavaScript

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);
});
});