result-tracker.test.js 4.2 KB
/**
 * Unit Tests — core/result-tracker.js
 */
import { describe, it, expect, beforeEach } from 'vitest';

const { ResultTracker } = require('../../src/core/result-tracker');

const AGENTS = {
  coder:    { type: 'executor', description: 'coder' },
  writer:   { type: 'executor', description: 'writer' },
  verifier: { type: 'validator', description: 'verifier' },
  reviewer: { type: 'validator', description: 'reviewer' },
};

describe('ResultTracker', () => {
  let tracker;

  beforeEach(() => {
    tracker = new ResultTracker(AGENTS);
  });

  describe('isEmpty', () => {
    it('should be empty initially', () => {
      expect(tracker.isEmpty()).toBe(true);
    });

    it('should not be empty after merge', () => {
      tracker.merge([{ agent: 'coder', status: 'DONE', message: 'done' }]);
      expect(tracker.isEmpty()).toBe(false);
    });
  });

  describe('merge', () => {
    it('should merge a batch of results', () => {
      tracker.merge([
        { agent: 'coder', status: 'DONE', message: 'ok' },
        { agent: 'verifier', status: 'PASS', message: 'ok' },
      ]);
      const all = tracker.getAll();
      expect(all).toHaveLength(2);
    });

    it('should overwrite existing results', () => {
      tracker.merge([{ agent: 'coder', status: 'ERROR', message: 'fail' }]);
      tracker.merge([{ agent: 'coder', status: 'DONE', message: 'fixed' }]);
      const all = tracker.getAll();
      expect(all).toHaveLength(1);
      expect(all[0].status).toBe('DONE');
    });
  });

  describe('set', () => {
    it('should set a single result', () => {
      tracker.set('writer', { agent: 'writer', status: 'DONE', message: 'written' });
      const all = tracker.getAll();
      expect(all).toHaveLength(1);
      expect(all[0].agent).toBe('writer');
    });
  });

  describe('history tracking', () => {
    it('should record state changes', () => {
      tracker.merge([{ agent: 'coder', status: 'ERROR', message: 'fail' }], 1);
      tracker.merge([{ agent: 'coder', status: 'DONE', message: 'fixed' }], 2);
      const history = tracker.getHistory('coder');
      expect(history).toHaveLength(2);
      expect(history[0].oldStatus).toBeNull();
      expect(history[0].newStatus).toBe('ERROR');
      expect(history[1].oldStatus).toBe('ERROR');
      expect(history[1].newStatus).toBe('DONE');
    });

    it('should return full history without filter', () => {
      tracker.merge([
        { agent: 'coder', status: 'DONE', message: '' },
        { agent: 'verifier', status: 'PASS', message: '' },
      ]);
      const history = tracker.getHistory();
      expect(history).toHaveLength(2);
    });
  });

  describe('validator queries', () => {
    it('should list all validators', () => {
      expect(tracker.allValidators).toEqual(['verifier', 'reviewer']);
    });

    it('should track passed validators', () => {
      tracker.merge([{ agent: 'verifier', status: 'PASS', message: '' }]);
      expect(tracker.passedValidators).toEqual(['verifier']);
      expect(tracker.unpassedValidators).toEqual(['reviewer']);
    });

    it('should track unpassed validators', () => {
      expect(tracker.unpassedValidators).toEqual(['verifier', 'reviewer']);
    });
  });

  describe('executor queries', () => {
    it('should list all executors', () => {
      expect(tracker.allExecutors).toEqual(['coder', 'writer']);
    });
  });

  describe('isComplete', () => {
    it('should be false when no results', () => {
      expect(tracker.isComplete()).toBe(false);
    });

    it('should be true when all agents are done/pass', () => {
      tracker.merge([
        { agent: 'coder', status: 'DONE', message: '' },
        { agent: 'writer', status: 'DONE', message: '' },
        { agent: 'verifier', status: 'PASS', message: '' },
        { agent: 'reviewer', status: 'PASS', message: '' },
      ]);
      expect(tracker.isComplete()).toBe(true);
    });

    it('should be false when a validator has not passed', () => {
      tracker.merge([
        { agent: 'coder', status: 'DONE', message: '' },
        { agent: 'writer', status: 'DONE', message: '' },
        { agent: 'verifier', status: 'PASS', message: '' },
        { agent: 'reviewer', status: 'FAIL', message: '' },
      ]);
      expect(tracker.isComplete()).toBe(false);
    });
  });
});