import './index';

import { ChangelistControlsSk, ChangelistControlsSkChangeEventDetail } from './changelist-controls-sk';
import { ChangelistControlsSkPO  } from './changelist-controls-sk_po';
import { twoPatchsets } from './test_data';
import { setUpElementUnderTest, eventPromise } from '../../../infra-sk/modules/test_util';
import { expect } from 'chai';

describe('changelist-controls-sk', () => {
  const newInstance = setUpElementUnderTest<ChangelistControlsSk>('changelist-controls-sk');

  let changelistControlsSk: ChangelistControlsSk;
  let changelistControlsSkPO: ChangelistControlsSkPO;

  beforeEach(() => {
    changelistControlsSk = newInstance()
    changelistControlsSkPO = new ChangelistControlsSkPO(changelistControlsSk);
  });

  describe('html layout', () => {
    it('is empty with no data', async () => {
      expect(await changelistControlsSkPO.isVisible()).to.be.false;
    });

    it('shows the latest patchset by default', async () => {
      expect(changelistControlsSk.ps_order).to.equal(0);
      expect(changelistControlsSk.include_master).to.equal(false);

      changelistControlsSk.summary = twoPatchsets;
      expect(changelistControlsSk.ps_order).to.equal(4);

      expect(await changelistControlsSkPO.getPatchset()).to.equal('PS 4');
      expect(await changelistControlsSkPO.isExcludeResultsFromPrimaryRadioChecked()).to.be.true;
      expect(await changelistControlsSkPO.isShowAllResultsRadioChecked()).to.be.false;
      expect(await changelistControlsSkPO.getTryJobs()).to.deep.equal([
        'android-marshmallow-arm64-rel',
        'linux-rel',
        'mac-rel',
        'win10_chromium_x64_rel_ng',
      ]);
    });

    it('shows other patchsets when ps_order is changed', async () => {
      changelistControlsSk.summary = twoPatchsets;
      changelistControlsSk.ps_order = 1;

      expect(await changelistControlsSkPO.getPatchset()).to.equal('PS 1');
      expect(await changelistControlsSkPO.getTryJobs()).to.deep.equal(['android-nougat-arm64-rel']);
    });

    it('flips the radio buttons on include_master', async () => {
      changelistControlsSk.summary = twoPatchsets;
      expect(await changelistControlsSkPO.isExcludeResultsFromPrimaryRadioChecked()).to.be.true;
      expect(await changelistControlsSkPO.isShowAllResultsRadioChecked()).to.be.false;

      changelistControlsSk.include_master = true;
      expect(await changelistControlsSkPO.isExcludeResultsFromPrimaryRadioChecked()).to.be.false;
      expect(await changelistControlsSkPO.isShowAllResultsRadioChecked()).to.be.true;
    });
  }); // end describe('html layout')

  describe('events', () => {
    it('generates a cl-control-change event on "include results from primary" toggle', async () => {
      changelistControlsSk.include_master = false;
      changelistControlsSk.ps_order = 4;
      changelistControlsSk.summary = twoPatchsets;

      expect(await changelistControlsSkPO.isExcludeResultsFromPrimaryRadioChecked()).to.be.true;
      expect(await changelistControlsSkPO.isShowAllResultsRadioChecked()).to.be.false;

      const event =
        eventPromise<CustomEvent<ChangelistControlsSkChangeEventDetail>>('cl-control-change');
      await changelistControlsSkPO.clickShowAllResultsRadio();
      const eventDetail = (await event).detail;

      expect(eventDetail.include_master).to.be.true;
      expect(eventDetail.ps_order).to.equal(4);

      expect(changelistControlsSk.include_master).to.equal(true);
      expect(await changelistControlsSkPO.isExcludeResultsFromPrimaryRadioChecked()).to.be.false;
      expect(await changelistControlsSkPO.isShowAllResultsRadioChecked()).to.be.true;
    });

    it('generates a cl-control-change event on patchset change', async () => {
      changelistControlsSk.ps_order = 0; // Use the latest patchset, i.e. 'PS 4'.
      changelistControlsSk.summary = twoPatchsets;

      expect(await changelistControlsSkPO.getPatchset()).to.equal('PS 4');

      const event =
        eventPromise<CustomEvent<ChangelistControlsSkChangeEventDetail>>('cl-control-change');
      await changelistControlsSkPO.setPatchset('PS 1');
      const eventDetail = (await event).detail;

      expect(eventDetail.include_master).to.equal(false);
      expect(eventDetail.ps_order).to.equal(1);

      expect(changelistControlsSk.ps_order).to.equal(1);
      expect(await changelistControlsSkPO.getPatchset()).to.equal('PS 1');
    });
  }); // end describe('events')
});
