import './index';
import { assert } from 'chai';
import { $$ } from '../../../infra-sk/modules/dom';
import { CheckOrRadio } from '../../../elements-sk/modules/checkbox-sk/checkbox-sk';
import {
  ColumnOrder,
  ColumnTitles,
  MachineTableColumnsDialogSk,
} from './machine-table-columns-dialog-sk';

import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';

describe('machine-table-columns-dialog-sk', () => {
  const newInstance = setUpElementUnderTest<MachineTableColumnsDialogSk>(
    'machine-table-columns-dialog-sk'
  );

  let element: MachineTableColumnsDialogSk;
  beforeEach(() => {
    element = newInstance();
  });

  it('returns undefined on cancel', async () => {
    const promise = element.edit(['Annotation']);
    $$<HTMLButtonElement>('#cancel', element)!.click();
    assert.isUndefined(await promise);
  });

  it('returns original hidden list on OK if no checkboxes are clicked', async () => {
    const startValue: ColumnTitles[] = ['Annotation'];
    const promise = element.edit(startValue);
    $$<HTMLButtonElement>('#ok', element)!.click();
    const result = await promise;
    assert.deepEqual(result, startValue);
  });

  it('returns modified hidden list on OK if a checkbox is clicked', async () => {
    const startValue: ColumnTitles[] = ['Annotation'];
    const promise = element.edit(startValue);

    // Click first checkbox.
    $$<CheckOrRadio>('checkbox-sk')!.click();
    $$<HTMLButtonElement>('#ok', element)!.click();
    const result = await promise;
    const expected = [ColumnOrder[0], ...startValue];
    assert.deepEqual(result, expected);
  });
});
