import { expect } from 'chai';
import {
  addEventListenersToPuppeteerPage,
  loadCachedTestBed,
  takeScreenshot,
  TestBed,
} from '../../../puppeteer-tests/util';
import { END_BUSY_EVENT } from '../codesize-scaffold-sk/events';

describe('binary-page-sk', () => {
  let testBed: TestBed;

  before(async () => {
    testBed = await loadCachedTestBed();
  });

  beforeEach(async () => {
    await testBed.page.setViewport({ width: 1024, height: 768 });
    const eventPromise = await addEventListenersToPuppeteerPage(testBed.page, [
      END_BUSY_EVENT,
    ]);
    const loaded = eventPromise(END_BUSY_EVENT); // Emitted when page is loaded.
    await testBed.page.goto(testBed.baseUrl);
    await loaded;
  });

  it('should render the demo page', async () => {
    expect(await testBed.page.$$('binary-page-sk')).to.have.length(1);
  });

  describe('screenshots', () => {
    it('shows the default view', async () => {
      await takeScreenshot(testBed.page, 'codesize', 'binary-page-sk');
    });

    it('shows a child node', async () => {
      // Hover over the rightmost node in the tree. We use coordinates because the SVG generated
      // by the google.visualization.TreeMap is not amenable to querying.
      const treemap = await testBed.page.$('#treemap');
      const box = await treemap!.boundingBox();
      await testBed.page.mouse.click(
        box!.x + box!.width - 50,
        box!.y + box!.height - 50
      );

      // Give the TreeMap a chance to redraw.
      await new Promise((resolve) => setTimeout(resolve, 1000));

      await takeScreenshot(testBed.page, 'codesize', 'binary-page-sk_node');
    });

    it('shows some suggestions when the user types in letters', async () => {
      // https://stackoverflow.com/a/56772379/1447621
      await testBed.page.focus('.search-bar input');
      await testBed.page.keyboard.type('s');

      await takeScreenshot(
        testBed.page,
        'codesize',
        'binary-page-sk-search_bar'
      );
    });

    it('jumps to the first result when the user types enter', async () => {
      await testBed.page.focus('.search-bar input');
      await testBed.page.keyboard.type('skp');
      await testBed.page.keyboard.press('Enter');

      await takeScreenshot(
        testBed.page,
        'codesize',
        'binary-page-sk-search_bar_enter'
      );
    });
  });
});
