import { expect } from 'chai';
import { describe, it } from 'mocha';

import { genFuzzStrings } from '../genFuzzStrings.js';

function expectFuzzStrings(options: {
  allowedChars: ReadonlyArray<string>;
  maxLength: number;
}) {
  return expect([...genFuzzStrings(options)]);
}

describe('genFuzzStrings', () => {
  it('always provide empty string', () => {
    expectFuzzStrings({ allowedChars: [], maxLength: 0 }).to.deep.equal(['']);
    expectFuzzStrings({ allowedChars: [], maxLength: 1 }).to.deep.equal(['']);
    expectFuzzStrings({ allowedChars: ['a'], maxLength: 0 }).to.deep.equal([
      '',
    ]);
  });

  it('generate strings with single character', () => {
    expectFuzzStrings({ allowedChars: ['a'], maxLength: 1 }).to.deep.equal([
      '',
      'a',
    ]);

    expectFuzzStrings({
      allowedChars: ['a', 'b', 'c'],
      maxLength: 1,
    }).to.deep.equal(['', 'a', 'b', 'c']);
  });

  it('generate strings with multiple character', () => {
    expectFuzzStrings({ allowedChars: ['a'], maxLength: 2 }).to.deep.equal([
      '',
      'a',
      'aa',
    ]);

    expectFuzzStrings({
      allowedChars: ['a', 'b', 'c'],
      maxLength: 2,
    }).to.deep.equal([
      '',
      'a',
      'b',
      'c',
      'aa',
      'ab',
      'ac',
      'ba',
      'bb',
      'bc',
      'ca',
      'cb',
      'cc',
    ]);
  });

  it('generate strings longer than possible number of characters', () => {
    expectFuzzStrings({
      allowedChars: ['a', 'b'],
      maxLength: 3,
    }).to.deep.equal([
      '',
      'a',
      'b',
      'aa',
      'ab',
      'ba',
      'bb',
      'aaa',
      'aab',
      'aba',
      'abb',
      'baa',
      'bab',
      'bba',
      'bbb',
    ]);
  });
});