/**
 * @license
 * Copyright 2022 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup-karma';
import './gr-diff-row';
import {GrDiffRow} from './gr-diff-row';
import {html} from 'lit';
import {fixture} from '@open-wc/testing-helpers';
import {GrDiffLine} from '../gr-diff/gr-diff-line';
import {GrDiffLineType} from '../../../api/diff';

suite('gr-diff-row test', () => {
  let element: GrDiffRow;

  setup(async () => {
    element = await fixture<GrDiffRow>(html`<gr-diff-row></gr-diff-row>`);
    element.isVisible = true;
    element.addTableWrapperForTesting = true;
    await element.updateComplete;
  });

  test('both', async () => {
    const line = new GrDiffLine(GrDiffLineType.BOTH, 1, 1);
    line.text = 'lorem ipsum';
    element.left = line;
    element.right = line;
    await element.updateComplete;
    expect(element).lightDom.to.equal(/* HTML */ `
      <table>
        <tbody>
          <tr
            class="diff-row gr-diff side-by-side style-scope"
            left-type="both"
            right-type="both"
            tabindex="-1"
          >
            <td class="blame gr-diff style-scope" data-line-number="1"></td>
            <td class="gr-diff left lineNum style-scope" data-value="1">
              <button
                class="gr-diff left lineNumButton style-scope"
                data-value="1"
                tabindex="-1"
              >
                1
              </button>
            </td>
            <td class="both content gr-diff left no-intraline-info style-scope">
              <div
                aria-label="lorem ipsum"
                class="contentText gr-diff left style-scope"
                data-side="left"
              >
                <gr-diff-text>lorem ipsum</gr-diff-text>
              </div>
              <div class="thread-group" data-side="left">
                <slot name="left-1"> </slot>
              </div>
            </td>
            <td class="gr-diff lineNum right style-scope" data-value="1">
              <button
                class="gr-diff lineNumButton right style-scope"
                data-value="1"
                tabindex="-1"
              >
                1
              </button>
            </td>
            <td
              class="both content gr-diff no-intraline-info right style-scope"
            >
              <div
                aria-label="lorem ipsum"
                class="contentText gr-diff right style-scope"
                data-side="right"
              >
                <gr-diff-text>lorem ipsum</gr-diff-text>
              </div>
              <div class="thread-group" data-side="right">
                <slot name="right-1"> </slot>
              </div>
            </td>
          </tr>
        </tbody>
      </table>
    `);
  });

  test('add', async () => {
    const line = new GrDiffLine(GrDiffLineType.ADD, 0, 1);
    line.text = 'lorem ipsum';
    element.left = new GrDiffLine(GrDiffLineType.BLANK);
    element.right = line;
    await element.updateComplete;
    expect(element).lightDom.to.equal(/* HTML */ `
      <table>
        <tbody>
          <tr
            class="diff-row gr-diff side-by-side style-scope"
            left-type="blank"
            right-type="add"
            tabindex="-1"
          >
            <td class="blame gr-diff style-scope" data-line-number="0"></td>
            <td class="gr-diff left style-scope"></td>
            <td class="blank gr-diff left no-intraline-info style-scope">
              <div
                aria-label=""
                class="contentText gr-diff left style-scope"
                data-side="left"
              ></div>
            </td>
            <td class="gr-diff lineNum right style-scope" data-value="1">
              <button
                aria-label="1 added"
                class="gr-diff lineNumButton right style-scope"
                data-value="1"
                tabindex="-1"
              >
                1
              </button>
            </td>
            <td class="add content gr-diff no-intraline-info right style-scope">
              <div
                aria-label="lorem ipsum"
                class="contentText gr-diff right style-scope"
                data-side="right"
              >
                <gr-diff-text>lorem ipsum</gr-diff-text>
              </div>
              <div class="thread-group" data-side="right">
                <slot name="right-1"> </slot>
              </div>
            </td>
          </tr>
        </tbody>
      </table>
    `);
  });

  test('remove', async () => {
    const line = new GrDiffLine(GrDiffLineType.REMOVE, 1, 0);
    line.text = 'lorem ipsum';
    element.left = line;
    element.right = new GrDiffLine(GrDiffLineType.BLANK);
    await element.updateComplete;
    expect(element).lightDom.to.equal(/* HTML */ `
      <table>
        <tbody>
          <tr
            class="diff-row gr-diff side-by-side style-scope"
            left-type="remove"
            right-type="blank"
            tabindex="-1"
          >
            <td class="blame gr-diff style-scope" data-line-number="1"></td>
            <td class="gr-diff left lineNum style-scope" data-value="1">
              <button
                aria-label="1 removed"
                class="gr-diff left lineNumButton style-scope"
                data-value="1"
                tabindex="-1"
              >
                1
              </button>
            </td>
            <td
              class="content gr-diff left no-intraline-info remove style-scope"
            >
              <div
                aria-label="lorem ipsum"
                class="contentText gr-diff left style-scope"
                data-side="left"
              >
                <gr-diff-text>lorem ipsum</gr-diff-text>
              </div>
              <div class="thread-group" data-side="left">
                <slot name="left-1"> </slot>
              </div>
            </td>
            <td class="gr-diff right style-scope"></td>
            <td class="blank gr-diff no-intraline-info right style-scope">
              <div
                aria-label=""
                class="contentText gr-diff right style-scope"
                data-side="right"
              ></div>
            </td>
          </tr>
        </tbody>
      </table>
    `);
  });
});
