chromium/chrome/test/data/pdf/material_elements_test.ts

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf_viewer_wrapper.js';

import {microtasksFinished} from 'chrome://webui-test/test_util.js';

import {createBookmarksForTest} from './test_util.js';

/**
 * Standalone unit tests of the PDF Polymer elements.
 */
const tests = [
  /**
   * Test that viewer-page-selector reacts correctly to text entry. The page
   * selector validates that input is an integer, and does not allow navigation
   * past document bounds.
   */
  function testPageSelectorChange() {
    document.body.innerHTML = '';
    const selector = document.createElement('viewer-page-selector')!;
    selector.docLength = 1234;
    document.body.appendChild(selector);

    const input = selector.$.pageSelector;
    // Simulate entering text into `input` and pressing enter.
    function changeInput(newValue: string) {
      input.value = newValue;
      input.dispatchEvent(new CustomEvent('input'));
      input.dispatchEvent(new CustomEvent('change'));
    }

    const navigatedPages: number[] = [];
    selector.addEventListener('change-page', function(e) {
      navigatedPages.push(e.detail.page);
      // A change-page handler is expected to set the pageNo to the new value.
      selector.pageNo = e.detail.page + 1;
    });

    changeInput('1000');
    changeInput('1234');
    changeInput('abcd');
    changeInput('12pp');
    changeInput('3.14');
    changeInput('3000');

    chrome.test.assertEq(4, navigatedPages.length);
    // The event page number is 0-based.
    chrome.test.assertEq(999, navigatedPages[0]);
    chrome.test.assertEq(1233, navigatedPages[1]);
    chrome.test.assertEq(11, navigatedPages[2]);
    // If the user types 3.14, the . will be ignored but 14 will be captured.
    chrome.test.assertEq(313, navigatedPages[3]);

    chrome.test.succeed();
  },

  /**
   * Test that viewer-page-selector changes in response to setting docLength.
   */
  function testPageSelectorDocLength() {
    document.body.innerHTML = '';
    const selector = document.createElement('viewer-page-selector');
    selector.docLength = 1234;
    document.body.appendChild(selector);
    chrome.test.assertEq(
        '1234', selector.shadowRoot!.querySelector('#pagelength')!.textContent);
    chrome.test.assertEq(
        '4', selector.style.getPropertyValue('--page-length-digits'));
    chrome.test.succeed();
  },

  /**
   * Test that viewer-bookmarks-content creates a bookmark tree with the correct
   * structure and behaviour.
   */
  async function testBookmarkStructure() {
    document.body.innerHTML = '';
    const bookmarkContent = createBookmarksForTest();
    bookmarkContent.bookmarks = [{
      title: 'Test 1',
      page: 1,
      children: [
        {title: 'Test 1a', page: 2, children: []},
        {title: 'Test 1b', page: 3, children: []},
      ],
    }];
    document.body.appendChild(bookmarkContent);

    // Wait for templates to render.
    await microtasksFinished();

    const rootBookmarks =
        bookmarkContent.shadowRoot!.querySelectorAll('viewer-bookmark');
    chrome.test.assertEq(1, rootBookmarks.length, 'one root bookmark');
    const rootBookmark = rootBookmarks[0]!;
    rootBookmark.$.expand.click();

    await microtasksFinished();

    const subBookmarks =
        rootBookmark.shadowRoot!.querySelectorAll('viewer-bookmark');
    chrome.test.assertEq(2, subBookmarks.length, 'two sub bookmarks');
    chrome.test.assertEq(
        1, subBookmarks[1]!.depth, 'sub bookmark depth correct');

    let lastPageChange;
    rootBookmark.addEventListener('change-page', function(e) {
      lastPageChange = e.detail.page;
    });

    rootBookmark.$.item.click();
    await microtasksFinished();
    chrome.test.assertEq(1, lastPageChange);

    subBookmarks[1]!.$.item.click();
    await microtasksFinished();
    chrome.test.assertEq(3, lastPageChange);

    chrome.test.succeed();
  },
];

chrome.test.runTests(tests);