import { describe, expect, it } from 'vitest';
import { cluster } from '.';

describe('cluster', () => {
  it('cluster an array into subarrays of a specific size', () => {
    const result = cluster([1, 2, 3, 4, 5, 6, 7, 8], 3);

    expect(result).toEqual([[1, 2, 3], [4, 5, 6], [7, 8]]);
  });

  it('handle arrays that are not perfectly divisible by the size', () => {
    const result = cluster([1, 2, 3, 4, 5], 2);

    expect(result).toEqual([[1, 2], [3, 4], [5]]);
  });

  it('return an array with each element in its own subarray if size is 1', () => {
    const result = cluster([1, 2, 3, 4], 1);

    expect(result).toEqual([[1], [2], [3], [4]]);
  });

  it('return an array with a single subarray if size is greater than the array length', () => {
    const result = cluster([1, 2, 3], 5);

    expect(result).toEqual([[1, 2, 3]]);
  });

  it('return an empty array if size is less than or equal to 0', () => {
    const result = cluster([1, 2, 3, 4], -1);

    expect(result).toEqual([]);
  });

  it('return an empty array if the input array is empty', () => {
    const result = cluster([], 3);

    expect(result).toEqual([]);
  });

  it('not mutate the input and produce copied sub-arrays', () => {
    const input = [1, 2, 3, 4];
    const result = cluster(input, 2);

    result[0]!.push(99);

    expect(input).toEqual([1, 2, 3, 4]);
  });
});
