/**
 * @license
 * Copyright 2015 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import '../../shared/gr-date-formatter/gr-date-formatter';
import './gr-file-list';
import {FilesExpandedState} from '../gr-file-list-constants';
import {navigationToken} from '../../core/gr-navigation/gr-navigation';
import {
  mockPromise,
  query,
  stubRestApi,
  waitUntil,
  pressKey,
  stubElement,
  waitEventLoop,
} from '../../../test/test-utils';
import {
  BasePatchSetNum,
  CommitId,
  EDIT,
  NumericChangeId,
  PARENT,
  RepoName,
  RevisionPatchSetNum,
  Timestamp,
  UrlEncodedCommentId,
} from '../../../types/common';
import {createCommentThreads} from '../../../utils/comment-util';
import {
  createChangeComments,
  createCommit,
  createDiff,
  createParsedChange,
  createRevision,
} from '../../../test/test-data-generators';
import {
  createDefaultDiffPrefs,
  DiffViewMode,
} from '../../../constants/constants';
import {
  assertIsDefined,
  queryAll,
  queryAndAssert,
} from '../../../utils/common-util';
import {GrFileList, NormalizedFileInfo} from './gr-file-list';
import {FileInfo, PatchSetNumber} from '../../../api/rest-api';
import {GrButton} from '../../shared/gr-button/gr-button';
import {ParsedChangeInfo} from '../../../types/types';
import {normalize} from '../../../models/change/files-model';
import {GrDiffHost} from '../../diff/gr-diff-host/gr-diff-host';
import {GrEditFileControls} from '../../edit/gr-edit-file-controls/gr-edit-file-controls';
import {GrIcon} from '../../shared/gr-icon/gr-icon';
import {fixture, html, assert} from '@open-wc/testing';
import {Modifier} from '../../../utils/dom-util';
import {testResolver} from '../../../test/common-test-setup';
import {FileMode} from '../../../utils/file-util';
import {SinonStubbedMember} from 'sinon';
import {GrDiffCursor} from '../../../embed/diff/gr-diff-cursor/gr-diff-cursor';

suite('gr-diff a11y test', () => {
  test('audit', async () => {
    assert.isAccessible(await fixture(html`<gr-file-list></gr-file-list>`));
  });
});

function createFiles(
  count: number,
  fileInfo: FileInfo = {}
): NormalizedFileInfo[] {
  const files = Array(count).fill({});
  return files.map((_, idx) => normalize(fileInfo, `path/file${idx}`));
}

suite('gr-file-list tests', () => {
  let element: GrFileList;
  let saveStub: sinon.SinonStub;

  suite('basic tests', async () => {
    setup(async () => {
      stubRestApi('getDiffComments').returns(Promise.resolve({}));
      stubRestApi('getDiffRobotComments').returns(Promise.resolve({}));
      stubRestApi('getDiffDrafts').returns(Promise.resolve({}));
      stubRestApi('getAccountCapabilities').returns(Promise.resolve({}));
      stubElement('gr-diff-host', 'reload').callsFake(() => Promise.resolve());
      stubElement('gr-diff-host', 'prefetchDiff').callsFake(() => {});

      element = await fixture(html`<gr-file-list></gr-file-list>`);

      element.diffPrefs = {
        context: 10,
        tab_size: 8,
        font_size: 12,
        line_length: 100,
        cursor_blink_rate: 0,
        line_wrapping: false,
        show_line_endings: true,
        show_tabs: true,
        show_whitespace_errors: true,
        syntax_highlighting: true,
        ignore_whitespace: 'IGNORE_NONE',
      };
      element.numFilesShown = 200;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      saveStub = sinon.stub(element, '_saveReviewedState').resolves();
      element.showSizeBars = true;
      await element.updateComplete;
      // Wait for expandedFilesChanged to complete.
      await waitEventLoop();
    });

    test('renders', () => {
      assert.shadowDom.equal(
        element,
        /* HTML */ `<h3 class="assistive-tech-only">File list</h3>
          <div aria-label="Files list" id="container" role="grid">
            <div class="header-row row" role="row">
              <div class="status" role="gridcell"></div>
              <div class="path" role="columnheader">File</div>
              <div class="comments desktop" role="columnheader">Comments</div>
              <div class="comments mobile" role="columnheader" title="Comments">
                C
              </div>
              <div class="desktop sizeBars" role="columnheader">Size</div>
              <div class="header-stats" role="columnheader">Delta</div>
              <div aria-hidden="true" class="hideOnEdit reviewed"></div>
              <div aria-hidden="true" class="editFileControls showOnEdit"></div>
              <div aria-hidden="true" class="show-hide"></div>
            </div>
          </div>
          <div class="controlRow invisible row">
            <gr-button
              aria-disabled="false"
              class="fileListButton"
              id="incrementButton"
              link=""
              role="button"
              tabindex="0"
            >
              Show -200 more
            </gr-button>
            <gr-tooltip-content title="">
              <gr-button
                aria-disabled="false"
                class="fileListButton"
                id="showAllButton"
                link=""
                role="button"
                tabindex="0"
              >
                Show all 0 files
              </gr-button>
            </gr-tooltip-content>
          </div>
          <gr-diff-preferences-dialog
            id="diffPreferencesDialog"
          ></gr-diff-preferences-dialog>`
      );
    });

    test('renders file row', async () => {
      element.files = createFiles(1, {lines_inserted: 9});
      await element.updateComplete;
      const fileRows = queryAll<HTMLDivElement>(element, '.file-row');
      assert.dom.equal(
        fileRows?.[0],
        /* HTML */ `<div
          class="file-row row"
          data-file='{"path":"path/file0"}'
          role="row"
          tabindex="-1"
          aria-label="path/file0"
        >
          <div class="status" role="gridcell">
            <gr-file-status></gr-file-status>
          </div>
          <span class="path" role="gridcell">
            <a class="pathLink">
              <span class="fullFileName" title="path/file0">
                <span class="newFilePath"> path/ </span>
                <span class="fileName"> file0 </span>
              </span>
              <span class="truncatedFileName" title="path/file0">
                …/file0
              </span>
              <gr-copy-clipboard hideinput=""> </gr-copy-clipboard>
            </a>
          </span>
          <div role="gridcell">
            <div class="comments desktop">
              <span
                ><gr-comments-summary
                  emptywhennocomments=""
                ></gr-comments-summary
              ></span>
              <span class="noCommentsScreenReaderText"> No comments </span>
            </div>
            <div class="comments mobile">
              <span class="drafts"> </span> <span> </span>
              <span class="noCommentsScreenReaderText"> No comments </span>
            </div>
          </div>
          <div class="desktop" role="gridcell">
            <div aria-hidden="true" class="sizeBars">
              <svg><!-- contents asserted separately below --></svg>
            </div>
          </div>
          <div class="stats" role="gridcell">
            <div>
              <span aria-label="0 removed" class="removed" tabindex="0">
                -0
              </span>
              <span aria-label="9 added" class="added" tabindex="0"> +9 </span>
              <span hidden=""> +/-0 B </span>
            </div>
          </div>
          <div class="hideOnEdit reviewed" role="gridcell">
            <span aria-hidden="true" class="reviewedLabel"> Reviewed </span>
            <span
              aria-checked="false"
              aria-label="Reviewed"
              class="reviewedSwitch"
              role="switch"
              tabindex="0"
            >
              <span
                class="markReviewed"
                tabindex="-1"
                title="Mark as reviewed (shortcut: r)"
              >
                MARK REVIEWED
              </span>
            </span>
          </div>
          <div
            aria-hidden="true"
            class="editFileControls showOnEdit"
            role="gridcell"
          ></div>
          <div class="show-hide" role="gridcell">
            <span
              aria-checked="false"
              aria-label="expand"
              aria-description="Expand diff of this file"
              class="show-hide"
              data-expand="true"
              data-path="path/file0"
              role="switch"
              tabindex="0"
            >
              <gr-icon
                icon="expand_more"
                class="show-hide-icon"
                id="icon"
                tabindex="-1"
              ></gr-icon>
            </span>
          </div>
        </div>`
      );
      // <svg> and contents are ignored by assert.dom.equal() above, so we need
      // a separate assert.lightDom.equal() for it here.
      const sizeBarsSVG = queryAndAssert<SVGSVGElement>(
        element,
        '.sizeBars > svg'
      );
      assert.lightDom.equal(
        sizeBarsSVG,
        /* HTML */ `
          <rect
            height="8"
            width="0"
            x="0"
            y="0"
            fill="var(--negative-red-text-color)"
          ></rect>
          <rect
            height="8"
            width="60"
            x="1"
            y="0"
            fill="var(--positive-green-text-color)"
          ></rect>
        `
      );
    });

    test('renders file paths', async () => {
      element.files = createFiles(2, {lines_inserted: 9});
      await element.updateComplete;
      const fileRows = queryAll<HTMLDivElement>(element, '.file-row');

      assert.dom.equal(
        fileRows[0].querySelector('.path'),
        /* HTML */ `
          <span class="path" role="gridcell">
            <a class="pathLink">
              <span class="fullFileName" title="path/file0">
                <span class="newFilePath"> path/ </span>
                <span class="fileName"> file0 </span>
              </span>
              <span class="truncatedFileName" title="path/file0">
                …/file0
              </span>
              <gr-copy-clipboard hideinput=""> </gr-copy-clipboard>
            </a>
          </span>
        `
      );
      // The second row will have a matchingFilePath instead of newFilePath.
      assert.dom.equal(
        fileRows[1].querySelector('.path'),
        /* HTML */ `
          <span class="path" role="gridcell">
            <a class="pathLink">
              <span class="fullFileName" title="path/file1">
                <span class="matchingFilePath"> path/ </span>
                <span class="fileName"> file1 </span>
              </span>
              <span class="truncatedFileName" title="path/file1">
                …/file1
              </span>
              <gr-copy-clipboard hideinput=""> </gr-copy-clipboard>
            </a>
          </span>
        `
      );
    });

    test('renders file status column', async () => {
      element.files = createFiles(1, {lines_inserted: 9});
      element.filesLeftBase = createFiles(1, {lines_inserted: 9});
      await element.updateComplete;
      const fileRows = queryAll<HTMLDivElement>(element, '.file-row');
      const statusCol = queryAndAssert(fileRows?.[0], '.status');
      assert.dom.equal(
        statusCol,
        /* HTML */ `
          <div class="extended status" role="gridcell">
            <gr-file-status></gr-file-status>
            <gr-icon
              aria-label="then"
              class="file-status-arrow"
              icon="arrow_right_alt"
            ></gr-icon>
            <gr-file-status></gr-file-status>
          </div>
        `
      );
    });

    test('renders file mode', async () => {
      element.files = createFiles(1, {
        old_mode: FileMode.REGULAR_FILE,
        new_mode: FileMode.EXECUTABLE_FILE,
      });
      await element.updateComplete;
      const fileRows = queryAll<HTMLDivElement>(element, '.file-row');
      const fileMode = queryAndAssert(
        fileRows?.[0],
        '.path gr-tooltip-content'
      );
      assert.dom.equal(
        fileMode,
        /* HTML */ `
          <gr-tooltip-content
            has-tooltip=""
            title="file mode changed from regular (100644) to executable (100755)"
          >
            <div class="file-mode-content">
              <gr-icon class="file-mode-warning" icon="warning"> </gr-icon>
              (executable)
            </div>
          </gr-tooltip-content>
        `
      );
    });

    test('renders file mode, but not for regular files', async () => {
      element.files = createFiles(3, {
        old_mode: FileMode.REGULAR_FILE,
        new_mode: FileMode.REGULAR_FILE,
      });
      await element.updateComplete;
      const fileRows = queryAll<HTMLDivElement>(element, '.file-row');
      const fileMode = query(fileRows?.[0], '.path gr-tooltip-content');
      assert.notOk(fileMode);
    });

    test('renders file status column header', async () => {
      element.files = createFiles(1, {lines_inserted: 9});
      element.filesLeftBase = createFiles(1, {lines_inserted: 9});
      element.basePatchNum = 1 as PatchSetNumber;
      await element.updateComplete;
      const fileRows = queryAll<HTMLDivElement>(element, '.header-row');
      const statusCol = queryAndAssert(fileRows?.[0], '.status');
      assert.dom.equal(
        statusCol,
        /* HTML */ `
          <div class="extended status" role="gridcell">
            <gr-tooltip-content has-tooltip="" title="Patchset 1">
              <div class="content">1</div>
            </gr-tooltip-content>
            <gr-icon
              aria-label="then"
              class="file-status-arrow"
              icon="arrow_right_alt"
            ></gr-icon>
            <gr-tooltip-content has-tooltip="" title="Patchset 2">
              <div class="content">2</div>
            </gr-tooltip-content>
          </div>
        `
      );
    });

    test('correct number of files are shown', async () => {
      element.fileListIncrement = 100;
      element.files = createFiles(250);
      await element.updateComplete;
      await waitEventLoop();
      assert.equal(200, element.numFilesShown);

      assert.equal(
        queryAll<HTMLDivElement>(element, '.file-row').length,
        element.numFilesShown
      );
      const controlRow = queryAndAssert<HTMLDivElement>(element, '.controlRow');
      assert.isFalse(controlRow.classList.contains('invisible'));
      assert.equal(
        queryAndAssert<GrButton>(
          element,
          '#incrementButton'
        ).textContent!.trim(),
        'Show 50 more'
      );
      assert.equal(
        queryAndAssert<GrButton>(element, '#showAllButton').textContent!.trim(),
        'Show all 250 files'
      );

      queryAndAssert<GrButton>(element, '#showAllButton').click();
      await element.updateComplete;
      await waitEventLoop();

      assert.equal(element.numFilesShown, 250);
      assert.isTrue(controlRow.classList.contains('invisible'));
    });

    test('calculate totals for patch number', async () => {
      element.files = [
        {
          __path: '/COMMIT_MSG',
          lines_inserted: 9,
          size: 0,
          size_delta: 0,
        },
        {
          __path: '/MERGE_LIST',
          lines_inserted: 9,
          size: 0,
          size_delta: 0,
        },
        {
          __path: 'file_added_in_rev2.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size_delta: 10,
          size: 100,
        },
        {
          __path: 'myfile.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size_delta: 10,
          size: 100,
        },
      ];
      await element.updateComplete;

      let patchChange = element.calculatePatchChange();
      assert.deepEqual(patchChange, {
        inserted: 2,
        deleted: 2,
        size_delta_inserted: 0,
        size_delta_deleted: 0,
        total_size: 0,
      });
      assert.isTrue(element.shouldHideBinaryChangeTotals(patchChange));
      assert.isFalse(element.shouldHideChangeTotals(patchChange));

      // Test with a commit message that isn't the first file.
      element.files = [
        {
          __path: 'file_added_in_rev2.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size: 0,
          size_delta: 0,
        },
        {
          __path: '/COMMIT_MSG',
          lines_inserted: 9,
          size: 0,
          size_delta: 0,
        },
        {
          __path: '/MERGE_LIST',
          lines_inserted: 9,
          size: 0,
          size_delta: 0,
        },
        {
          __path: 'myfile.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size: 0,
          size_delta: 0,
        },
      ];
      await element.updateComplete;

      patchChange = element.calculatePatchChange();
      assert.deepEqual(patchChange, {
        inserted: 2,
        deleted: 2,
        size_delta_inserted: 0,
        size_delta_deleted: 0,
        total_size: 0,
      });
      assert.isTrue(element.shouldHideBinaryChangeTotals(patchChange));
      assert.isFalse(element.shouldHideChangeTotals(patchChange));

      // Test with no commit message.
      element.files = [
        {
          __path: 'file_added_in_rev2.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size: 0,
          size_delta: 0,
        },
        {
          __path: 'myfile.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size: 0,
          size_delta: 0,
        },
      ];
      await element.updateComplete;

      patchChange = element.calculatePatchChange();
      assert.deepEqual(patchChange, {
        inserted: 2,
        deleted: 2,
        size_delta_inserted: 0,
        size_delta_deleted: 0,
        total_size: 0,
      });
      assert.isTrue(element.shouldHideBinaryChangeTotals(patchChange));
      assert.isFalse(element.shouldHideChangeTotals(patchChange));

      // Test with files missing either lines_inserted or lines_deleted.
      element.files = [
        {
          __path: 'file_added_in_rev2.txt',
          lines_inserted: 1,
          size: 0,
          size_delta: 0,
        },
        {
          __path: 'myfile.txt',
          lines_deleted: 1,
          size: 0,
          size_delta: 0,
        },
      ];
      await element.updateComplete;

      patchChange = element.calculatePatchChange();
      assert.deepEqual(patchChange, {
        inserted: 1,
        deleted: 1,
        size_delta_inserted: 0,
        size_delta_deleted: 0,
        total_size: 0,
      });
      assert.isTrue(element.shouldHideBinaryChangeTotals(patchChange));
      assert.isFalse(element.shouldHideChangeTotals(patchChange));
    });

    test('binary only files', async () => {
      element.files = [
        {
          __path: '/COMMIT_MSG',
          lines_inserted: 9,
          size: 0,
          size_delta: 0,
        },
        {
          __path: 'file_binary_1',
          binary: true,
          size_delta: 10,
          size: 100,
        },
        {
          __path: 'file_binary_2',
          binary: true,
          size_delta: -5,
          size: 120,
        },
      ];
      await element.updateComplete;

      const patchChange = element.calculatePatchChange();
      assert.deepEqual(patchChange, {
        inserted: 0,
        deleted: 0,
        size_delta_inserted: 10,
        size_delta_deleted: -5,
        total_size: 220,
      });
      assert.isFalse(element.shouldHideBinaryChangeTotals(patchChange));
      assert.isTrue(element.shouldHideChangeTotals(patchChange));
    });

    test('binary and regular files', async () => {
      element.files = [
        {
          __path: '/COMMIT_MSG',
          lines_inserted: 9,
          size: 0,
          size_delta: 0,
        },
        {
          __path: 'file_binary_1',
          binary: true,
          size_delta: 10,
          size: 100,
        },
        {
          __path: 'file_binary_2',
          binary: true,
          size_delta: -5,
          size: 120,
        },
        {
          __path: 'myfile.txt',
          lines_deleted: 5,
          size_delta: -10,
          size: 100,
        },
        {
          __path: 'myfile2.txt',
          lines_inserted: 10,
          size: 0,
          size_delta: 0,
        },
      ];
      await element.updateComplete;

      const patchChange = element.calculatePatchChange();
      assert.deepEqual(patchChange, {
        inserted: 10,
        deleted: 5,
        size_delta_inserted: 10,
        size_delta_deleted: -5,
        total_size: 220,
      });
      assert.isFalse(element.shouldHideBinaryChangeTotals(patchChange));
      assert.isFalse(element.shouldHideChangeTotals(patchChange));
    });

    test('formatBytes function', () => {
      const table = {
        '64': '+64 B',
        '1023': '+1023 B',
        '1024': '+1 KiB',
        '4096': '+4 KiB',
        '1073741824': '+1 GiB',
        '-64': '-64 B',
        '-1023': '-1023 B',
        '-1024': '-1 KiB',
        '-4096': '-4 KiB',
        '-1073741824': '-1 GiB',
        '0': '+/-0 B',
      };
      for (const [bytes, expected] of Object.entries(table)) {
        assert.equal(element.formatBytes(Number(bytes)), expected);
      }
    });

    test('formatPercentage function', () => {
      const table = [
        {size: 100, delta: 100, display: ''},
        {size: 195060, delta: 64, display: '(+0%)'},
        {size: 195060, delta: -64, display: '(-0%)'},
        {size: 394892, delta: -7128, display: '(-2%)'},
        {size: 90, delta: -10, display: '(-10%)'},
        {size: 110, delta: 10, display: '(+10%)'},
      ];

      for (const item of table) {
        assert.equal(
          element.formatPercentage(item.size, item.delta),
          item.display
        );
      }
    });

    test('comment filtering', () => {
      element.changeComments = createChangeComments();

      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: '/COMMIT_MSG',
          size: 0,
          size_delta: 0,
        }),
        '2c'
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: '/COMMIT_MSG',
          size: 0,
          size_delta: 0,
        }),
        '3c'
      );

      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'unresolved.file',
          size: 0,
          size_delta: 0,
        }),
        '1d'
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'unresolved.file',
          size: 0,
          size_delta: 0,
        }),
        '1d'
      );

      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        '1c'
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        '3c'
      );

      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );

      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: 'file_added_in_rev2.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: 'file_added_in_rev2.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );

      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'file_added_in_rev2.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'file_added_in_rev2.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );

      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: '/COMMIT_MSG',
          size: 0,
          size_delta: 0,
        }),
        '1c'
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: '/COMMIT_MSG',
          size: 0,
          size_delta: 0,
        }),
        '3c'
      );

      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: '/COMMIT_MSG',
          size: 0,
          size_delta: 0,
        }),
        '2d'
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: '/COMMIT_MSG',
          size: 0,
          size_delta: 0,
        }),
        '2d'
      );

      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        '2c'
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeCommentsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        '3c'
      );

      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );

      element.basePatchNum = 1 as BasePatchSetNum;
      element.patchNum = 2 as RevisionPatchSetNum;
      assert.equal(
        element.computeDraftsStringMobile({
          __path: 'myfile.txt',
          size: 0,
          size_delta: 0,
        }),
        ''
      );
    });

    suite('keyboard shortcuts', () => {
      setup(async () => {
        element.files = [
          normalize({}, '/COMMIT_MSG'),
          normalize({}, 'file_added_in_rev2.txt'),
          normalize({}, 'myfile.txt'),
        ];
        element.changeNum = 42 as NumericChangeId;
        element.basePatchNum = PARENT;
        element.patchNum = 2 as RevisionPatchSetNum;
        element.change = {
          _number: 42 as NumericChangeId,
          project: 'test-project',
        } as ParsedChangeInfo;
        element.fileCursor.setCursorAtIndex(0);
        await element.updateComplete;
        await waitEventLoop();
      });

      test('toggle left diff via shortcut', () => {
        const toggleLeftDiffStub = sinon.stub();
        // Property getter cannot be stubbed w/ sandbox due to a bug in Sinon.
        // https://github.com/sinonjs/sinon/issues/781
        const diffsStub = sinon
          .stub(element, 'diffs')
          .get(() => [{toggleLeftDiff: toggleLeftDiffStub}]);
        pressKey(element, 'A');
        assert.isTrue(toggleLeftDiffStub.calledOnce);
        diffsStub.restore();
      });

      test('keyboard shortcuts', async () => {
        const items = [...queryAll<HTMLDivElement>(element, '.file-row')];
        element.fileCursor.stops = items;
        element.fileCursor.setCursorAtIndex(0);
        assert.equal(items.length, 3);
        assert.isTrue(items[0].classList.contains('selected'));
        assert.isFalse(items[1].classList.contains('selected'));
        assert.isFalse(items[2].classList.contains('selected'));
        // j with a modifier should not move the cursor.
        pressKey(element, 'J');
        assert.equal(element.fileCursor.index, 0);
        // down should not move the cursor.
        pressKey(element, 'ArrowDown');
        assert.equal(element.fileCursor.index, 0);

        pressKey(element, 'j');
        assert.equal(element.fileCursor.index, 1);
        assert.equal(element.selectedIndex, 1);
        pressKey(element, 'j');

        const setUrlStub = sinon.stub(testResolver(navigationToken), 'setUrl');
        assert.equal(element.fileCursor.index, 2);
        assert.equal(element.selectedIndex, 2);

        // k with a modifier should not move the cursor.
        pressKey(element, 'K');
        assert.equal(element.fileCursor.index, 2);

        // up should not move the cursor.
        pressKey(element, 'ArrowUp');
        assert.equal(element.fileCursor.index, 2);

        pressKey(element, 'k');
        assert.equal(element.fileCursor.index, 1);
        assert.equal(element.selectedIndex, 1);
        pressKey(element, 'o');

        assert.equal(setUrlStub.callCount, 1);
        assert.equal(
          setUrlStub.lastCall.firstArg,
          '/c/test-project/+/42/2/file_added_in_rev2.txt'
        );

        pressKey(element, 'k');
        pressKey(element, 'k');
        pressKey(element, 'k');
        assert.equal(element.fileCursor.index, 1);
        assert.equal(element.selectedIndex, 1);
        assertIsDefined(element.diffCursor);

        const createCommentInPlaceStub = sinon.stub(
          element.diffCursor,
          'createCommentInPlace'
        );
        pressKey(element, 'c');
        assert.isTrue(createCommentInPlaceStub.called);
      });

      test('i key shows/hides selected inline diff', async () => {
        const paths = element.files.map(f => f.__path);
        sinon.stub(element, 'expandedFilesChanged');
        const files = [...queryAll<HTMLDivElement>(element, '.file-row')];
        element.fileCursor.stops = files;
        element.fileCursor.setCursorAtIndex(0);
        await element.updateComplete;
        assert.equal(element.diffs.length, 0);
        assert.equal(element.expandedFiles.length, 0);

        pressKey(element, 'i');
        await element.updateComplete;
        assert.equal(element.diffs.length, 1);
        assert.equal(element.diffs[0].path, paths[0]);
        assert.equal(element.expandedFiles.length, 1);
        assert.equal(element.expandedFiles[0].path, paths[0]);

        pressKey(element, 'i');
        await element.updateComplete;
        assert.equal(element.diffs.length, 0);
        assert.equal(element.expandedFiles.length, 0);

        element.fileCursor.setCursorAtIndex(1);
        pressKey(element, 'i');
        await element.updateComplete;
        assert.equal(element.diffs.length, 1);
        assert.equal(element.diffs[0].path, paths[1]);
        assert.equal(element.expandedFiles.length, 1);
        assert.equal(element.expandedFiles[0].path, paths[1]);

        pressKey(element, 'I');
        await element.updateComplete;
        assert.equal(element.diffs.length, paths.length);
        assert.equal(element.expandedFiles.length, paths.length);
        for (const diff of element.diffs) {
          assert.isTrue(element.expandedFiles.some(f => f.path === diff.path));
        }
        // since _expandedFilesChanged is stubbed
        element.filesExpanded = FilesExpandedState.ALL;
        pressKey(element, 'I');
        await element.updateComplete;
        assert.equal(element.diffs.length, 0);
        assert.equal(element.expandedFiles.length, 0);
      });

      test('r key sets reviewed flag', async () => {
        await element.updateComplete;

        pressKey(element, 'r');
        await element.updateComplete;

        assert.isTrue(saveStub.called);
        assert.isTrue(saveStub.lastCall.calledWithExactly('/COMMIT_MSG', true));
      });

      test('r key clears reviewed flag', async () => {
        element.reviewed = ['/COMMIT_MSG'];
        await element.updateComplete;

        pressKey(element, 'r');
        await element.updateComplete;

        assert.isTrue(saveStub.called);
        assert.isTrue(
          saveStub.lastCall.calledWithExactly('/COMMIT_MSG', false)
        );
      });

      suite('handleOpenFile', () => {
        let interact: Function;

        setup(() => {
          const openCursorStub = sinon.stub(element, 'openCursorFile');
          const openSelectedStub = sinon.stub(element, 'openSelectedFile');
          const expandStub = sinon.stub(element, 'toggleFileExpanded');

          interact = function () {
            openCursorStub.reset();
            openSelectedStub.reset();
            expandStub.reset();
            element.handleOpenFile();
            const result = {} as any;
            if (openCursorStub.called) {
              result.opened_cursor = true;
            }
            if (openSelectedStub.called) {
              result.opened_selected = true;
            }
            if (expandStub.called) {
              result.expanded = true;
            }
            return result;
          };
        });

        test('open from selected file', () => {
          element.filesExpanded = FilesExpandedState.NONE;
          assert.deepEqual(interact(), {opened_selected: true});
        });

        test('open from diff cursor', () => {
          element.filesExpanded = FilesExpandedState.ALL;
          assert.deepEqual(interact(), {opened_cursor: true});
        });

        test('expand when user prefers', () => {
          element.filesExpanded = FilesExpandedState.NONE;
          assert.deepEqual(interact(), {opened_selected: true});
        });
      });

      test('shift+left/shift+right', () => {
        assertIsDefined(element.diffCursor);
        const moveLeftStub = sinon.stub(element.diffCursor, 'moveLeft');
        const moveRightStub = sinon.stub(element.diffCursor, 'moveRight');

        let noDiffsExpanded = true;
        sinon.stub(element, 'noDiffsExpanded').callsFake(() => noDiffsExpanded);

        pressKey(element, 'ArrowLeft', Modifier.SHIFT_KEY);
        assert.isFalse(moveLeftStub.called);
        pressKey(element, 'ArrowRight', Modifier.SHIFT_KEY);
        assert.isFalse(moveRightStub.called);

        noDiffsExpanded = false;

        pressKey(element, 'ArrowLeft', Modifier.SHIFT_KEY);
        assert.isTrue(moveLeftStub.called);
        pressKey(element, 'ArrowRight', Modifier.SHIFT_KEY);
        assert.isTrue(moveRightStub.called);
      });
    });

    test('file review status', async () => {
      element.reviewed = ['/COMMIT_MSG', 'myfile.txt'];
      element.files = [
        normalize({}, '/COMMIT_MSG'),
        normalize({}, 'file_added_in_rev2.txt'),
        normalize({}, 'myfile.txt'),
      ];
      element.changeNum = 42 as NumericChangeId;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      element.fileCursor.setCursorAtIndex(0);

      const reviewSpy = sinon.spy(element, 'reviewFile');
      const toggleExpandSpy = sinon.spy(element, 'toggleFileExpanded');

      await element.updateComplete;

      const fileRows = queryAll(element, '.row:not(.header-row)');
      const checkSelector = 'span.reviewedSwitch[role="switch"]';
      const commitMsg = fileRows[0].querySelector(checkSelector);
      const fileAdded = fileRows[1].querySelector(checkSelector);
      const myFile = fileRows[2].querySelector(checkSelector);

      assert.equal(commitMsg!.getAttribute('aria-checked'), 'true');
      assert.equal(fileAdded!.getAttribute('aria-checked'), 'false');
      assert.equal(myFile!.getAttribute('aria-checked'), 'true');

      const commitReviewLabel = fileRows[0].querySelector('.reviewedLabel');
      assert.isOk(commitReviewLabel);
      const markReviewLabel =
        fileRows[0].querySelector<HTMLSpanElement>('.markReviewed');
      assert.isOk(markReviewLabel);
      assert.isTrue(commitReviewLabel!.classList.contains('isReviewed'));
      assert.equal(markReviewLabel!.textContent, 'MARK UNREVIEWED');

      const clickSpy = sinon.spy(element, 'reviewedClick');
      markReviewLabel!.click();
      await element.updateComplete;

      assert.isTrue(clickSpy.calledOnce);
      assert.isTrue(clickSpy.lastCall.args[0].defaultPrevented);
      assert.isTrue(reviewSpy.calledOnce);
      assert.isTrue(saveStub.lastCall.calledWithExactly('/COMMIT_MSG', false));

      element.reviewed = ['myfile.txt'];
      await element.updateComplete;

      assert.isFalse(commitReviewLabel!.classList.contains('isReviewed'));
      assert.equal(markReviewLabel!.textContent, 'MARK REVIEWED');

      markReviewLabel!.click();
      await element.updateComplete;

      assert.isTrue(saveStub.lastCall.calledWithExactly('/COMMIT_MSG', true));
      assert.isTrue(clickSpy.lastCall.args[0].defaultPrevented);
      assert.isTrue(reviewSpy.calledTwice);
      assert.isFalse(toggleExpandSpy.called);

      element.reviewed = ['/COMMIT_MSG', 'myfile.txt'];
      await element.updateComplete;

      assert.isTrue(commitReviewLabel!.classList.contains('isReviewed'));
      assert.equal(markReviewLabel!.textContent, 'MARK UNREVIEWED');
    });

    test('handleFileListClick', async () => {
      element.files = [
        normalize({}, '/COMMIT_MSG'),
        normalize({}, 'f1.txt'),
        normalize({}, 'f2.txt'),
      ];
      element.changeNum = 42 as NumericChangeId;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      await element.updateComplete;

      const clickSpy = sinon.spy(element, 'handleFileListClick');
      const reviewStub = sinon.stub(element, 'reviewFile');
      const toggleExpandSpy = sinon.spy(element, 'toggleFileExpanded');

      const row = queryAndAssert(
        element,
        '.row[data-file=\'{"path":"f1.txt"}\']'
      );

      // Click on the expand button, resulting in toggleFileExpanded being
      // called and resulting in a call to reviewFile().
      queryAndAssert<HTMLDivElement>(row, 'div.show-hide').click();
      await element.updateComplete;

      assert.isTrue(clickSpy.calledOnce);
      assert.isTrue(toggleExpandSpy.calledOnce);
      await waitUntil(() => reviewStub.calledOnce);

      // Click inside the diff. This should result in no additional calls to
      // toggleFileExpanded or reviewFile.
      queryAndAssert<GrDiffHost>(element, 'gr-diff-host').click();
      await element.updateComplete;
      assert.isTrue(clickSpy.calledTwice);
      assert.isTrue(toggleExpandSpy.calledOnce);
      assert.isTrue(reviewStub.calledOnce);
    });

    test('handleFileListClick editMode', async () => {
      element.files = [
        normalize({}, '/COMMIT_MSG'),
        normalize({}, 'f1.txt'),
        normalize({}, 'f2.txt'),
      ];
      element.changeNum = 42 as NumericChangeId;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      element.editMode = true;
      await element.updateComplete;

      const clickSpy = sinon.spy(element, 'handleFileListClick');
      const toggleExpandSpy = sinon.spy(element, 'toggleFileExpanded');

      // Tap the edit controls. Should be ignored by handleFileListClick.
      queryAndAssert<HTMLDivElement>(element, '.editFileControls').click();
      await element.updateComplete;

      assert.isTrue(clickSpy.calledOnce);
      assert.isFalse(toggleExpandSpy.called);
    });

    test('checkbox shows/hides diff inline', async () => {
      element.files = [normalize({}, 'myfile.txt')];
      element.changeNum = 42 as NumericChangeId;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      element.fileCursor.setCursorAtIndex(0);
      sinon.stub(element, 'expandedFilesChanged');
      await element.updateComplete;
      const fileRows = queryAll(element, '.row:not(.header-row)');
      // Because the label surrounds the input, the tap event is triggered
      // there first.
      const showHideCheck = fileRows[0].querySelector(
        'span.show-hide[role="switch"]'
      );
      const showHideLabel =
        showHideCheck!.querySelector<GrIcon>('.show-hide-icon');
      assert.equal(showHideCheck!.getAttribute('aria-checked'), 'false');
      showHideLabel!.click();
      await element.updateComplete;

      assert.equal(showHideCheck!.getAttribute('aria-checked'), 'true');
      assert.notEqual(
        element.expandedFiles.findIndex(f => f.path === 'myfile.txt'),
        -1
      );
    });

    test('diff mode correctly toggles the diffs', async () => {
      element.files = [normalize({}, 'myfile.txt')];
      element.changeNum = 42 as NumericChangeId;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      const updateDiffPrefSpy = sinon.spy(element, 'updateDiffPreferences');
      element.fileCursor.setCursorAtIndex(0);
      await element.updateComplete;

      // Tap on a file to generate the diff.
      const row = queryAll<HTMLSpanElement>(
        element,
        '.row:not(.header-row) span.show-hide'
      )[0];

      row.click();

      element.diffViewMode = DiffViewMode.UNIFIED;
      await element.updateComplete;

      assert.isTrue(updateDiffPrefSpy.called);
    });

    test('expanded attribute not set on path when not expanded', () => {
      element.files = [normalize({}, '/COMMIT_MSG')];
      assert.isNotOk(query(element, 'expanded'));
    });

    test('tapping row ignores links', async () => {
      element.files = [normalize({}, '/COMMIT_MSG')];
      element.changeNum = 42 as NumericChangeId;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      sinon.stub(element, 'expandedFilesChanged');
      await element.updateComplete;
      const commitMsgFile = queryAll<HTMLAnchorElement>(
        element,
        '.row:not(.header-row) a.pathLink'
      )[0];

      // Remove href attribute so the app doesn't route to a diff view
      commitMsgFile.removeAttribute('href');
      const togglePathSpy = sinon.spy(element, 'toggleFileExpanded');

      commitMsgFile.click();
      await element.updateComplete;
      assert(togglePathSpy.notCalled, 'file is opened as diff view');
      assert.isNotOk(query(element, '.expanded'));
      assert.notEqual(
        getComputedStyle(queryAndAssert(element, '.show-hide')).display,
        'none'
      );
    });

    test('toggleFileExpanded', async () => {
      const path = 'path/to/my/file.txt';
      element.files = [normalize({}, path)];
      await element.updateComplete;
      // Wait for expandedFilesChanged to finish.
      await waitEventLoop();

      const renderSpy = sinon.spy(element, 'renderInOrder');

      assert.equal(
        queryAndAssert<GrIcon>(element, 'gr-icon').icon,
        'expand_more'
      );
      assert.equal(element.expandedFiles.length, 0);
      element.toggleFileExpanded({path});
      await element.updateComplete;
      // Wait for expandedFilesChanged to finish.
      await waitEventLoop();

      assert.equal(
        queryAndAssert<GrIcon>(element, 'gr-icon').icon,
        'expand_less'
      );

      assert.equal(renderSpy.callCount, 1);
      assert.isTrue(element.expandedFiles.some(f => f.path === path));
      element.toggleFileExpanded({path});
      await element.updateComplete;
      // Wait for expandedFilesChanged to finish.
      await waitEventLoop();

      assert.equal(
        queryAndAssert<GrIcon>(element, 'gr-icon').icon,
        'expand_more'
      );
      assert.equal(renderSpy.callCount, 1);
      assert.isFalse(element.expandedFiles.some(f => f.path === path));
    });

    test('expandAllDiffs and collapseAllDiffs', async () => {
      assertIsDefined(element.diffCursor);
      const reInitStub = sinon.stub(element.diffCursor, 'reInitAndUpdateStops');

      const path = 'path/to/my/file.txt';
      element.files = [normalize({}, path)];
      // Wait for diffs to be computed.
      await element.updateComplete;
      await waitEventLoop();
      element.expandAllDiffs();
      await element.updateComplete;
      // Wait for expandedFilesChanged to finish.
      await waitEventLoop();
      assert.equal(element.filesExpanded, FilesExpandedState.ALL);
      assert.isTrue(reInitStub.calledTwice);

      element.collapseAllDiffs();
      await element.updateComplete;
      // Wait for expandedFilesChanged to finish.
      await waitEventLoop();
      assert.equal(element.expandedFiles.length, 0);
      assert.equal(element.filesExpanded, FilesExpandedState.NONE);
    });

    test('expandedFilesChanged', async () => {
      sinon.stub(element, 'reviewFile');
      const path = 'path/to/my/file.txt';
      const promise = mockPromise();
      const diffs = [
        {
          path,
          style: {},
          reload() {
            promise.resolve();
          },
          prefetchDiff() {},
          cancel() {},
          getCursorStops() {
            return [];
          },
          addEventListener(eventName: string, callback: Function) {
            if (
              ['render-start', 'render-content', 'scroll'].indexOf(eventName) >=
              0
            ) {
              callback(new Event(eventName));
            }
          },
        },
      ];
      sinon.stub(element, 'diffs').get(() => diffs);
      element.expandedFiles = element.expandedFiles.concat([{path}]);
      await element.updateComplete;
      await waitEventLoop();
      await promise;
    });

    test('filesExpanded value updates to correct enum', async () => {
      element.files = [normalize({}, 'foo.bar'), normalize({}, 'baz.bar')];
      await element.updateComplete;
      assert.equal(element.filesExpanded, FilesExpandedState.NONE);
      element.expandedFiles.push({path: 'baz.bar'});
      element.expandedFilesChanged([{path: 'baz.bar'}]);
      await element.updateComplete;
      assert.equal(element.filesExpanded, FilesExpandedState.SOME);
      element.expandedFiles.push({path: 'foo.bar'});
      element.expandedFilesChanged([{path: 'foo.bar'}]);
      await element.updateComplete;
      assert.equal(element.filesExpanded, FilesExpandedState.ALL);
      element.collapseAllDiffs();
      await element.updateComplete;
      assert.equal(element.filesExpanded, FilesExpandedState.NONE);
      element.expandAllDiffs();
      await element.updateComplete;
      assert.equal(element.filesExpanded, FilesExpandedState.ALL);
    });

    test('renderInOrder', async () => {
      const reviewStub = sinon.stub(element, 'reviewFile');
      let callCount = 0;
      // Have to type as any because the type is 'GrDiffHost'
      // which would require stubbing so many different
      // methods / properties that it isn't worth it.
      const diffs = [
        {
          path: 'p0',
          style: {},
          prefetchDiff() {},
          reload() {
            assert.equal(callCount++, 2);
            return Promise.resolve();
          },
        },
        {
          path: 'p1',
          style: {},
          prefetchDiff() {},
          reload() {
            assert.equal(callCount++, 1);
            return Promise.resolve();
          },
        },
        {
          path: 'p2',
          style: {},
          prefetchDiff() {},
          reload() {
            assert.equal(callCount++, 0);
            return Promise.resolve();
          },
        },
      ] as any;
      element.renderInOrder([{path: 'p2'}, {path: 'p1'}, {path: 'p0'}], diffs);
      await element.updateComplete;
      assert.isFalse(reviewStub.called);
    });

    test('renderInOrder logged in', async () => {
      const reviewStub = sinon.stub(element, 'reviewFile');
      let callCount = 0;
      // Have to type as any because the type is 'GrDiffHost'
      // which would require stubbing so many different
      // methods / properties that it isn't worth it.
      const diffs = [
        {
          path: 'p2',
          style: {},
          prefetchDiff() {},
          reload() {
            assert.equal(reviewStub.callCount, 0);
            assert.equal(callCount++, 0);
            return Promise.resolve();
          },
        },
      ] as any;
      element.renderInOrder([{path: 'p2'}], diffs);
      await element.updateComplete;
      assert.equal(reviewStub.callCount, 1);
    });

    test('renderInOrder respects diffPrefs.manual_review', async () => {
      element.diffPrefs = {
        context: 10,
        tab_size: 8,
        font_size: 12,
        line_length: 100,
        cursor_blink_rate: 0,
        line_wrapping: false,
        show_line_endings: true,
        show_tabs: true,
        show_whitespace_errors: true,
        syntax_highlighting: true,
        ignore_whitespace: 'IGNORE_NONE',
        manual_review: true,
      };
      const reviewStub = sinon.stub(element, 'reviewFile');
      // Have to type as any because the type is 'GrDiffHost'
      // which would require stubbing so many different
      // methods / properties that it isn't worth it.
      const diffs = [
        {
          path: 'p',
          style: {},
          prefetchDiff() {},
          reload() {
            return Promise.resolve();
          },
        },
      ] as any;

      element.renderInOrder([{path: 'p'}], diffs);
      await element.updateComplete;
      assert.isFalse(reviewStub.called);
      delete element.diffPrefs.manual_review;
      element.renderInOrder([{path: 'p'}], diffs);
      await element.updateComplete;
      // Wait for renderInOrder to finish
      await waitEventLoop();
      assert.isTrue(reviewStub.called);
      assert.isTrue(reviewStub.calledWithExactly('p', true));
    });

    suite('for merge commits', () => {
      let filesStub: sinon.SinonStub;

      setup(async () => {
        element.files = [
          normalize({size: 0, size_delta: 0}, 'conflictingFile.js'),
        ];
        filesStub = stubRestApi('getChangeOrEditFiles')
          .onFirstCall()
          .resolves({
            'conflictingFile.js': {size: 0, size_delta: 0},
            'cleanlyMergedFile.js': {size: 0, size_delta: 0},
          });
        stubRestApi('getReviewedFiles').resolves([]);
        stubRestApi('getDiffPreferences').resolves(createDefaultDiffPrefs());
        const changeWithMultipleParents = {
          ...createParsedChange(),
          revisions: {
            r1: {
              ...createRevision(),
              commit: {
                ...createCommit(),
                parents: [
                  {commit: 'p1' as CommitId, subject: 'subject1'},
                  {commit: 'p2' as CommitId, subject: 'subject2'},
                ],
              },
            },
          },
        };
        element.changeNum = changeWithMultipleParents._number;
        element.change = changeWithMultipleParents;
        element.basePatchNum = PARENT;
        element.patchNum = 1 as RevisionPatchSetNum;
        await element.updateComplete;
        await waitEventLoop();
      });

      test('displays cleanly merged file count', async () => {
        await waitUntil(() => !!query(element, '.cleanlyMergedText'));

        const message = queryAndAssert<HTMLSpanElement>(
          element,
          '.cleanlyMergedText'
        ).textContent!.trim();
        assert.equal(message, '1 file merged cleanly in Parent 1');
      });

      test('displays plural cleanly merged file count', async () => {
        filesStub.restore();
        stubRestApi('getChangeOrEditFiles')
          .onFirstCall()
          .resolves({
            'conflictingFile.js': {size: 0, size_delta: 0},
            'cleanlyMergedFile.js': {size: 0, size_delta: 0},
            'anotherCleanlyMergedFile.js': {size: 0, size_delta: 0},
          });
        await element.updateCleanlyMergedPaths();
        await element.updateComplete;
        await waitUntil(() => !!query(element, '.cleanlyMergedText'));

        const message = queryAndAssert(
          element,
          '.cleanlyMergedText'
        ).textContent!.trim();
        assert.equal(message, '2 files merged cleanly in Parent 1');
      });

      test('displays button for navigating to parent 1 base', async () => {
        await waitUntil(() => !!query(element, '.showParentButton'));

        queryAndAssert(element, '.showParentButton');
      });

      test('computes old paths for cleanly merged files', async () => {
        filesStub.restore();
        stubRestApi('getChangeOrEditFiles')
          .onFirstCall()
          .resolves({
            'conflictingFile.js': {size: 0, size_delta: 0},
            'cleanlyMergedFile.js': {
              old_path: 'cleanlyMergedFileOldName.js',
              size: 0,
              size_delta: 0,
            },
          });
        await element.updateCleanlyMergedPaths();

        assert.deepEqual(element.cleanlyMergedOldPaths, [
          'cleanlyMergedFileOldName.js',
        ]);
      });

      test('not shown for non-Auto Merge base parents', async () => {
        element.basePatchNum = 1 as BasePatchSetNum;
        element.patchNum = 2 as RevisionPatchSetNum;
        await element.updateCleanlyMergedPaths();
        await element.updateComplete;

        assert.notOk(query(element, '.cleanlyMergedText'));
        assert.notOk(query(element, '.showParentButton'));
      });

      test('not shown in edit mode', async () => {
        element.basePatchNum = 1 as BasePatchSetNum;
        element.patchNum = EDIT;
        await element.updateCleanlyMergedPaths();
        await element.updateComplete;

        assert.notOk(query(element, '.cleanlyMergedText'));
        assert.notOk(query(element, '.showParentButton'));
      });
    });
  });

  suite('diff url file list', () => {
    test('diff url', () => {
      element.change = {
        ...createParsedChange(),
        _number: 1 as NumericChangeId,
        project: 'gerrit' as RepoName,
      };
      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      const path = 'index.php';
      element.editMode = false;
      assert.equal(element.computeDiffURL(path), '/c/gerrit/+/1/1/index.php');
    });

    test('diff url commit msg', () => {
      element.change = {
        ...createParsedChange(),
        _number: 1 as NumericChangeId,
        project: 'gerrit' as RepoName,
      };
      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      element.editMode = false;
      const path = '/COMMIT_MSG';
      assert.equal(element.computeDiffURL(path), '/c/gerrit/+/1/1//COMMIT_MSG');
    });

    test('edit url', () => {
      element.change = {
        ...createParsedChange(),
        _number: 1 as NumericChangeId,
        project: 'gerrit' as RepoName,
      };
      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      element.editMode = true;
      const path = 'index.php';
      assert.equal(
        element.computeDiffURL(path),
        '/c/gerrit/+/1/1/index.php,edit'
      );
    });

    test('edit url commit msg', () => {
      element.change = {
        ...createParsedChange(),
        _number: 1 as NumericChangeId,
        project: 'gerrit' as RepoName,
      };
      element.basePatchNum = PARENT;
      element.patchNum = 1 as RevisionPatchSetNum;
      element.editMode = true;
      const path = '/COMMIT_MSG';
      assert.equal(
        element.computeDiffURL(path),
        '/c/gerrit/+/1/1//COMMIT_MSG,edit'
      );
    });
  });

  suite('size bars', () => {
    test('computeSizeBarLayout', async () => {
      const defaultSizeBarLayout = {
        maxInserted: 0,
        maxDeleted: 0,
        maxAdditionWidth: 0,
        maxDeletionWidth: 0,
        additionOffset: 0,
      };

      element.files = [];
      await element.updateComplete;
      assert.deepEqual(element.computeSizeBarLayout(), defaultSizeBarLayout);

      element.files = [
        {
          __path: '/COMMIT_MSG',
          lines_inserted: 10000,
          size_delta: 10000,
          size: 10000,
        },
        {
          __path: 'foo',
          lines_inserted: 4,
          lines_deleted: 10,
          size_delta: 14,
          size: 20,
        },
        {
          __path: 'bar',
          lines_inserted: 5,
          lines_deleted: 8,
          size_delta: 13,
          size: 21,
        },
      ];
      await element.updateComplete;
      const layout = element.computeSizeBarLayout();
      assert.equal(layout.maxInserted, 5);
      assert.equal(layout.maxDeleted, 10);
    });

    test('computeBarAdditionWidth', () => {
      const file = {
        __path: 'foo/bar.baz',
        lines_inserted: 5,
        lines_deleted: 0,
        size: 0,
        size_delta: 0,
      };
      const stats = {
        maxInserted: 10,
        maxDeleted: 0,
        maxAdditionWidth: 60,
        maxDeletionWidth: 0,
        additionOffset: 60,
      };

      // Uses half the space when file is half the largest addition and there
      // are no deletions.
      assert.equal(element.computeBarAdditionWidth(file, stats), 30);

      // If there are no insertions, there is no width.
      stats.maxInserted = 0;
      assert.equal(element.computeBarAdditionWidth(file, stats), 0);

      // If the insertions is not present on the file, there is no width.
      stats.maxInserted = 10;
      file.lines_inserted = 0;
      assert.equal(element.computeBarAdditionWidth(file, stats), 0);

      // If the file is a commit message, returns zero.
      file.lines_inserted = 5;
      file.__path = '/COMMIT_MSG';
      assert.equal(element.computeBarAdditionWidth(file, stats), 0);

      // Width bottoms-out at the minimum width.
      file.__path = 'stuff.txt';
      file.lines_inserted = 1;
      stats.maxInserted = 1000000;
      assert.equal(element.computeBarAdditionWidth(file, stats), 1.5);
    });

    test('computeBarDeletionX', () => {
      const file = {
        __path: 'foo/bar.baz',
        lines_inserted: 0,
        lines_deleted: 5,
        size: 0,
        size_delta: 0,
      };
      const stats = {
        maxInserted: 0,
        maxDeleted: 10,
        maxAdditionWidth: 0,
        maxDeletionWidth: 60,
        additionOffset: 60,
      };
      assert.equal(element.computeBarDeletionX(file, stats), 30);
    });

    test('computeBarAdditionX', () => {
      const stats = {
        maxInserted: 10,
        maxDeleted: 0,
        maxAdditionWidth: 60,
        maxDeletionWidth: 0,
        additionOffset: 60,
      };
      assert.equal(element.computeBarAdditionX(stats), 60);
    });

    test('computeBarDeletionWidth', () => {
      const file = {
        __path: 'foo/bar.baz',
        lines_inserted: 0,
        lines_deleted: 5,
        size: 0,
        size_delta: 0,
      };
      const stats = {
        maxInserted: 10,
        maxDeleted: 10,
        maxAdditionWidth: 30,
        maxDeletionWidth: 30,
        additionOffset: 31,
      };

      // Uses a quarter the space when file is half the largest deletions and
      // there are equal additions.
      assert.equal(element.computeBarDeletionWidth(file, stats), 15);

      // If there are no deletions, there is no width.
      stats.maxDeleted = 0;
      assert.equal(element.computeBarDeletionWidth(file, stats), 0);

      // If the deletions is not present on the file, there is no width.
      stats.maxDeleted = 10;
      file.lines_deleted = 0;
      assert.equal(element.computeBarDeletionWidth(file, stats), 0);

      // If the file is a commit message, returns zero.
      file.lines_deleted = 5;
      file.__path = '/COMMIT_MSG';
      assert.equal(element.computeBarDeletionWidth(file, stats), 0);

      // Width bottoms-out at the minimum width.
      file.__path = 'stuff.txt';
      file.lines_deleted = 1;
      stats.maxDeleted = 1000000;
      assert.equal(element.computeBarDeletionWidth(file, stats), 1.5);
    });

    test('computeSizeBarsClass', () => {
      element.showSizeBars = false;
      assert.equal(
        element.computeSizeBarsClass('foo/bar.baz'),
        'sizeBars hide'
      );
      element.showSizeBars = true;
      assert.equal(
        element.computeSizeBarsClass('/COMMIT_MSG'),
        'sizeBars invisible'
      );
      assert.equal(element.computeSizeBarsClass('foo/bar.baz'), 'sizeBars ');
    });
  });

  suite('gr-file-list inline diff tests', () => {
    let element: GrFileList;
    let reviewFileStub: sinon.SinonStub;

    const commitMsgComments = [
      {
        patch_set: 2 as RevisionPatchSetNum,
        path: '/p',
        id: 'ecf0b9fa_fe1a5f62' as UrlEncodedCommentId,
        line: 20,
        updated: '2018-02-08 18:49:18.000000000' as Timestamp,
        message: 'another comment',
        unresolved: true,
      },
      {
        patch_set: 2 as RevisionPatchSetNum,
        path: '/p',
        id: '503008e2_0ab203ee' as UrlEncodedCommentId,
        line: 10,
        updated: '2018-02-14 22:07:43.000000000' as Timestamp,
        message: 'a comment',
        unresolved: true,
      },
      {
        patch_set: 2 as RevisionPatchSetNum,
        path: '/p',
        id: 'cc788d2c_cb1d728c' as UrlEncodedCommentId,
        line: 20,
        in_reply_to: 'ecf0b9fa_fe1a5f62' as UrlEncodedCommentId,
        updated: '2018-02-13 22:07:43.000000000' as Timestamp,
        message: 'response',
        unresolved: true,
      },
    ];

    async function setupDiff(diff: GrDiffHost) {
      diff.threads =
        diff.path === '/COMMIT_MSG'
          ? createCommentThreads(commitMsgComments)
          : [];
      diff.prefs = {
        context: 10,
        tab_size: 8,
        font_size: 12,
        line_length: 100,
        cursor_blink_rate: 0,
        line_wrapping: false,
        show_line_endings: true,
        show_tabs: true,
        show_whitespace_errors: true,
        syntax_highlighting: true,
        ignore_whitespace: 'IGNORE_NONE',
      };
      await diff.waitForReloadToRender();
    }

    async function renderAndGetNewDiffs(index: number) {
      const diffs = queryAll<GrDiffHost>(element, 'gr-diff-host');

      for (let i = index; i < diffs.length; i++) {
        await setupDiff(diffs[i]);
      }

      assertIsDefined(element.diffCursor);
      element.updateDiffCursor();
      element.diffCursor.reInitCursor();
      return diffs;
    }

    setup(async () => {
      stubRestApi('getPreferences').returns(Promise.resolve(undefined));
      stubRestApi('getDiffComments').returns(Promise.resolve({}));
      stubRestApi('getDiffRobotComments').returns(Promise.resolve({}));
      stubRestApi('getDiffDrafts').returns(Promise.resolve({}));
      stubRestApi('getDiff').callsFake(() => Promise.resolve(createDiff()));
      stubElement('gr-diff-host', 'prefetchDiff').callsFake(() => {});

      element = await fixture(html`<gr-file-list></gr-file-list>`);
      element.diffPrefs = {
        context: 10,
        tab_size: 8,
        font_size: 12,
        line_length: 100,
        cursor_blink_rate: 0,
        line_wrapping: false,
        show_line_endings: true,
        show_tabs: true,
        show_whitespace_errors: true,
        syntax_highlighting: true,
        ignore_whitespace: 'IGNORE_NONE',
      };
      element.change = {
        ...createParsedChange(),
        _number: 42 as NumericChangeId,
        project: 'testRepo' as RepoName,
      };
      reviewFileStub = sinon.stub(element, 'reviewFile');

      element.numFilesShown = 75;
      element.selectedIndex = 0;
      element.files = [
        {__path: '/COMMIT_MSG', lines_inserted: 9, size: 0, size_delta: 0},
        {
          __path: 'file_added_in_rev2.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size_delta: 10,
          size: 100,
        },
        {
          __path: 'myfile.txt',
          lines_inserted: 1,
          lines_deleted: 1,
          size_delta: 10,
          size: 100,
        },
      ];
      element.reviewed = ['/COMMIT_MSG', 'myfile.txt'];
      element.changeNum = 42 as NumericChangeId;
      element.basePatchNum = PARENT;
      element.patchNum = 2 as RevisionPatchSetNum;
      sinon
        .stub(window, 'fetch')
        .callsFake(() => Promise.resolve(new Response()));
      await element.updateComplete;
    });

    test('cursor with individually opened files', async () => {
      await element.updateComplete;
      pressKey(element, 'i');

      await waitUntil(async () => {
        const diffs = await renderAndGetNewDiffs(0);
        return diffs.length > 0;
      });
      let diffs = await renderAndGetNewDiffs(0);
      const diffStops = diffs[0].getCursorStops();

      // 1 diff should be rendered.
      assert.equal(diffs.length, 1);
      assert.isTrue(diffStops.length > 12);

      // No line number is selected.
      assert.isFalse(
        (diffStops[10] as HTMLElement).classList.contains('target-row')
      );

      // Tapping content on a line selects the line number.
      queryAll<HTMLDivElement>(
        diffStops[10] as HTMLElement,
        '.contentText'
      )[0].click();
      await element.updateComplete;
      assert.isTrue(
        (diffStops[10] as HTMLElement).classList.contains('target-row')
      );

      // Keyboard shortcuts are still moving the file cursor, not the diff
      // cursor.
      pressKey(element, 'j');
      await element.updateComplete;
      assert.isTrue(
        (diffStops[10] as HTMLElement).classList.contains('target-row')
      );
      assert.isFalse(
        (diffStops[11] as HTMLElement).classList.contains('target-row')
      );

      // The file cursor is now at 1.
      assert.equal(element.fileCursor.index, 1);

      pressKey(element, 'i');
      await element.updateComplete;
      diffs = await renderAndGetNewDiffs(1);

      // Two diffs should be rendered.
      assert.equal(diffs.length, 2);
      const diffStopsFirst = diffs[0].getCursorStops();
      const diffStopsSecond = diffs[1].getCursorStops();

      // The line on the first diff is still selected
      assert.isTrue(
        (diffStopsFirst[10] as HTMLElement).classList.contains('target-row')
      );
      assert.isFalse(
        (diffStopsSecond[10] as HTMLElement).classList.contains('target-row')
      );
    });

    test('cursor with toggle all files', async () => {
      pressKey(element, 'I');
      await element.updateComplete;

      const diffs = await renderAndGetNewDiffs(0);
      const diffStops = diffs[0].getCursorStops();

      // 1 diff should be rendered.
      assert.equal(diffs.length, 3);
      assert.isTrue(diffStops.length > 12);

      // No line number is selected.
      assert.isFalse(
        (diffStops[10] as HTMLElement).classList.contains('target-row')
      );

      // Tapping content on a line selects the line number.
      queryAll<HTMLDivElement>(
        diffStops[10] as HTMLElement,
        '.contentText'
      )[0].click();
      await element.updateComplete;
      assert.isTrue(
        (diffStops[10] as HTMLElement).classList.contains('target-row')
      );

      // Keyboard shortcuts are still moving the file cursor, not the diff
      // cursor.
      pressKey(element, 'j');
      await element.updateComplete;
      assert.isFalse(
        (diffStops[10] as HTMLElement).classList.contains('target-row')
      );
      assert.isTrue(
        (diffStops[11] as HTMLElement).classList.contains('target-row')
      );

      // The file cursor is still at 0.
      assert.equal(element.fileCursor.index, 0);
    });

    suite('n key presses', () => {
      let nextCommentStub: sinon.SinonStub;
      let nextChunkStub: SinonStubbedMember<GrDiffCursor['moveToNextChunk']>;
      let fileRows: NodeListOf<HTMLDivElement>;

      setup(() => {
        sinon.stub(element, 'renderInOrder').returns(Promise.resolve());
        assertIsDefined(element.diffCursor);
        nextCommentStub = sinon.stub(
          element.diffCursor,
          'moveToNextCommentThread'
        );
        nextChunkStub = sinon.stub(element.diffCursor, 'moveToNextChunk');
        fileRows = queryAll<HTMLDivElement>(element, '.row:not(.header-row)');
      });

      test('correct number of files expanded', async () => {
        pressKey(fileRows[0], 'i');
        await element.updateComplete;
        assert.equal(element.filesExpanded, FilesExpandedState.SOME);

        pressKey(element, 'n');
        await element.updateComplete;
        assert.isTrue(nextChunkStub.calledOnce);
      });

      test('N key with some files expanded', async () => {
        pressKey(fileRows[0], 'i');
        await element.updateComplete;
        assert.equal(element.filesExpanded, FilesExpandedState.SOME);

        pressKey(element, 'N');
        await element.updateComplete;
        assert.isTrue(nextCommentStub.calledOnce);
      });

      test('n key with all files expanded', async () => {
        pressKey(fileRows[0], 'I');
        await element.updateComplete;
        assert.equal(element.filesExpanded, FilesExpandedState.ALL);

        pressKey(element, 'n');
        await element.updateComplete;
        assert.isTrue(nextChunkStub.calledOnce);
      });

      test('N key with all files expanded', async () => {
        pressKey(fileRows[0], 'I');
        await element.updateComplete;
        assert.equal(element.filesExpanded, FilesExpandedState.ALL);

        pressKey(element, 'N');
        await element.updateComplete;
        assert.isTrue(nextCommentStub.called);
      });
    });

    test('openSelectedFile behavior', async () => {
      const files = element.files;
      element.files = [];
      await element.updateComplete;
      const setUrlStub = sinon.stub(testResolver(navigationToken), 'setUrl');
      // Noop when there are no files.
      element.openSelectedFile();
      assert.isFalse(setUrlStub.calledOnce);

      element.files = files;
      await element.updateComplete;
      // Navigates when a file is selected.
      element.openSelectedFile();
      assert.isTrue(setUrlStub.calledOnce);
    });

    suite('editMode behavior', () => {
      test('reviewed checkbox', async () => {
        reviewFileStub.restore();
        const saveReviewStub = sinon.stub(element, '_saveReviewedState');

        element.editMode = false;
        pressKey(element, 'r');
        assert.isTrue(saveReviewStub.calledOnce);

        element.editMode = true;
        await element.updateComplete;

        pressKey(element, 'r');
        assert.isTrue(saveReviewStub.calledOnce);
      });
    });

    test('editing actions', async () => {
      // Edit controls are guarded behind a dom-if initially and not rendered.
      assert.isNotOk(
        query<GrEditFileControls>(element, 'gr-edit-file-controls')
      );

      element.editMode = true;
      await element.updateComplete;

      // Commit message should not have edit controls.
      const editControls = Array.from(
        queryAll(element, '.row:not(.header-row)')
      ).map(row => row.querySelector('gr-edit-file-controls'));
      assert.isTrue(editControls[0]!.classList.contains('invisible'));
    });
  });
});
