import createGantt, { createSchedule } from './index';

test('create schedule 1', () => {
  const jobsWithOperations = [
    { jobId: 1, t: 4, anc: [] },
    { jobId: 2, t: 6, anc: [1] },
    { jobId: 3, t: 7, anc: [1] },
    { jobId: 4, t: 6, anc: [1] },
    { jobId: 5, t: 4, anc: [2, 3] },
    { jobId: 6, t: 7, anc: [4, 5] },
    { jobId: 7, t: 2, anc: [2, 4, 6] },
  ];

  const schedule = createSchedule(jobsWithOperations, 2);

  expect(schedule.length).toBe(7);
  expect(schedule[0]).toEqual({ jobId: 1, t: 4, c: 4, processor: 1 });
  expect(schedule[1]).toEqual({ jobId: 2, t: 6, c: 10, processor: 1 });
  expect(schedule[2]).toEqual({ jobId: 3, t: 7, c: 17, processor: 1 });
  expect(schedule[3]).toEqual({ jobId: 4, t: 6, c: 6, processor: 2 });
  expect(schedule[4]).toEqual({ jobId: 5, t: 4, c: 10, processor: 2 });
  expect(schedule[5]).toEqual({ jobId: 6, t: 7, c: 17, processor: 2 });
  expect(schedule[6]).toEqual({ jobId: 7, t: 2, c: 19, processor: 2 });
});

test('create schedule 2', () => {
  const jobsWithOperations = [
    { jobId: 1, t: 4, anc: [] },
    { jobId: 2, t: 6, anc: [1] },
    { jobId: 3, t: 7, anc: [1] },
    { jobId: 4, t: 6, anc: [1] },
    { jobId: 5, t: 4, anc: [2, 3] },
    { jobId: 6, t: 7, anc: [4, 5] },
    { jobId: 7, t: 2, anc: [2, 4, 6] },
  ];

  const schedule = createSchedule(jobsWithOperations, 3);

  expect(schedule.length).toBe(7);
  expect(schedule[0]).toEqual({ jobId: 1, t: 4, c: 4, processor: 1 });
  expect(schedule[1]).toEqual({ jobId: 2, t: 6, c: 10, processor: 1 });
  expect(schedule[2]).toEqual({ jobId: 3, t: 7, c: 7, processor: 2 });
  expect(schedule[3]).toEqual({ jobId: 4, t: 6, c: 13, processor: 2 });
  expect(schedule[4]).toEqual({ jobId: 5, t: 4, c: 4, processor: 3 });
  expect(schedule[5]).toEqual({ jobId: 6, t: 7, c: 11, processor: 3 });
  expect(schedule[6]).toEqual({ jobId: 7, t: 2, c: 13, processor: 3 });
});

test('create gantt', () => {
  const jobsWithOperations = [
    { jobId: 1, t: 4, anc: [], name: 'a' },
    { jobId: 2, t: 6, anc: [1], name: 'b' },
    { jobId: 3, t: 7, anc: [1], name: 'c' },
    { jobId: 4, t: 6, anc: [1], name: 'd' },
    { jobId: 5, t: 4, anc: [2, 3], name: 'e' },
    { jobId: 6, t: 7, anc: [4, 5], name: 'f' },
    { jobId: 7, t: 2, anc: [2, 4, 6], name: 'g' },
  ];

  const template = createGantt(jobsWithOperations, 3);

  expect(template.length).toBe(3);
  expect(template[0].length).toBe(2);
  expect(template[1].length).toBe(2);
  expect(template[2].length).toBe(3);

  expect(template[0][0]).toEqual({ processor: 1, startTime: 0, endTime: 4, name: 'a' });
  expect(template[0][1]).toEqual({ processor: 1, startTime: 4, endTime: 10, name: 'b' });

  expect(template[1][0]).toEqual({ processor: 2, startTime: 0, endTime: 7, name: 'c' });
  expect(template[1][1]).toEqual({ processor: 2, startTime: 7, endTime: 13, name: 'd' });

  expect(template[2][0]).toEqual({ processor: 3, startTime: 0, endTime: 4, name: 'e' });
  expect(template[2][1]).toEqual({ processor: 3, startTime: 4, endTime: 11, name: 'f' });
  expect(template[2][2]).toEqual({ processor: 3, startTime: 11, endTime: 13, name: 'g' });
});