blob: c9f4882e61dfd354217cc88516b850760429e31a [file] [log] [blame]
/**
* @license
* Copyright 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../test/common-test-setup';
import {createDiff, createEmptyDiff} from '../../../test/test-data-generators';
import './gr-diff-element';
import {GrDiffElement} from './gr-diff-element';
import {querySelectorAll} from '../../../utils/dom-util';
import '@polymer/paper-button/paper-button';
import {
DiffContent,
DiffInfo,
DiffPreferencesInfo,
DiffViewMode,
IgnoreWhitespaceType,
} from '../../../api/diff';
import {query, queryAndAssert, waitUntil} from '../../../test/test-utils';
import {waitForEventOnce} from '../../../utils/event-util';
import {ImageInfo} from '../../../types/common';
import {fixture, html, assert} from '@open-wc/testing';
import {createDefaultDiffPrefs} from '../../../constants/constants';
import {DiffModel, diffModelToken} from '../gr-diff-model/gr-diff-model';
import {wrapInProvider} from '../../../models/di-provider-element';
const DEFAULT_PREFS = createDefaultDiffPrefs();
suite('gr-diff-element tests', () => {
let element: GrDiffElement;
let model: DiffModel;
const MINIMAL_PREFS: DiffPreferencesInfo = {
tab_size: 2,
line_length: 80,
font_size: 12,
context: 3,
ignore_whitespace: 'IGNORE_NONE',
};
setup(async () => {
model = new DiffModel(document);
element = (
await fixture(
wrapInProvider(
html`<gr-diff-element></gr-diff-element>`,
diffModelToken,
model
)
)
).querySelector('gr-diff-element')!;
});
suite('rendering', () => {
test('empty diff', async () => {
await element.updateComplete;
assert.lightDom.equal(
element,
/* HTML */ `
<div class="diffContainer sideBySide">
<table id="diffTable">
<colgroup>
<col class="left" width="48" />
<col class="left" />
<col class="right" width="48" />
<col class="right" />
</colgroup>
</table>
</div>
`
);
});
test('a unified diff lit', async () => {
model.updateState({
diff: createDiff(),
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.UNIFIED},
});
await element.updateComplete;
await waitForEventOnce(element, 'render');
assert.lightDom.equal(
element,
/* HTML */ `
<div class="diffContainer unified">
<table id="diffTable">
<colgroup>
<col class="left" width="48" />
<col class="right" width="48" />
<col class="right" />
</colgroup>
<tbody class="both section">
<tr
aria-labelledby="left-button-LOST right-button-LOST right-content-LOST"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="LOST"></td>
<td class="lineNum right" data-value="LOST"></td>
<td class="both content lost no-intraline-info right"></td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-FILE right-button-FILE right-content-FILE"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="FILE">
<button
aria-label="Add file comment"
class="left lineNumButton"
data-value="FILE"
id="left-button-FILE"
tabindex="-1"
>
FILE
</button>
</td>
<td class="lineNum right" data-value="FILE">
<button
aria-label="Add file comment"
class="lineNumButton right"
data-value="FILE"
id="right-button-FILE"
tabindex="-1"
>
FILE
</button>
</td>
<td class="both content file no-intraline-info right"></td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-1 right-button-1 right-content-1"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="1">
<button
aria-label="1 unmodified"
class="left lineNumButton"
data-value="1"
id="left-button-1"
tabindex="-1"
>
1
</button>
</td>
<td class="lineNum right" data-value="1">
<button
aria-label="1 unmodified"
class="lineNumButton right"
data-value="1"
id="right-button-1"
tabindex="-1"
>
1
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-1"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-2 right-button-2 right-content-2"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="2">
<button
aria-label="2 unmodified"
class="left lineNumButton"
data-value="2"
id="left-button-2"
tabindex="-1"
>
2
</button>
</td>
<td class="lineNum right" data-value="2">
<button
aria-label="2 unmodified"
class="lineNumButton right"
data-value="2"
id="right-button-2"
tabindex="-1"
>
2
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-2"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-3 right-button-3 right-content-3"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="3">
<button
aria-label="3 unmodified"
class="left lineNumButton"
data-value="3"
id="left-button-3"
tabindex="-1"
>
3
</button>
</td>
<td class="lineNum right" data-value="3">
<button
aria-label="3 unmodified"
class="lineNumButton right"
data-value="3"
id="right-button-3"
tabindex="-1"
>
3
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-3"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-4 right-button-4 right-content-4"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="4">
<button
aria-label="4 unmodified"
class="left lineNumButton"
data-value="4"
id="left-button-4"
tabindex="-1"
>
4
</button>
</td>
<td class="lineNum right" data-value="4">
<button
aria-label="4 unmodified"
class="lineNumButton right"
data-value="4"
id="right-button-4"
tabindex="-1"
>
4
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-4"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section total">
<tr
aria-labelledby="right-button-5 right-content-5"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="5">
<button
aria-label="5 added"
class="lineNumButton right"
data-value="5"
id="right-button-5"
tabindex="-1"
>
5
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-5"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-6 right-content-6"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="6">
<button
aria-label="6 added"
class="lineNumButton right"
data-value="6"
id="right-button-6"
tabindex="-1"
>
6
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-6"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-7 right-content-7"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="7">
<button
aria-label="7 added"
class="lineNumButton right"
data-value="7"
id="right-button-7"
tabindex="-1"
>
7
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-7"
></div>
</td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-5 right-button-8 right-content-8"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="5">
<button
aria-label="5 unmodified"
class="left lineNumButton"
data-value="5"
id="left-button-5"
tabindex="-1"
>
5
</button>
</td>
<td class="lineNum right" data-value="8">
<button
aria-label="8 unmodified"
class="lineNumButton right"
data-value="8"
id="right-button-8"
tabindex="-1"
>
8
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-8"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-6 right-button-9 right-content-9"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="6">
<button
aria-label="6 unmodified"
class="left lineNumButton"
data-value="6"
id="left-button-6"
tabindex="-1"
>
6
</button>
</td>
<td class="lineNum right" data-value="9">
<button
aria-label="9 unmodified"
class="lineNumButton right"
data-value="9"
id="right-button-9"
tabindex="-1"
>
9
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-9"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-7 right-button-10 right-content-10"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="7">
<button
aria-label="7 unmodified"
class="left lineNumButton"
data-value="7"
id="left-button-7"
tabindex="-1"
>
7
</button>
</td>
<td class="lineNum right" data-value="10">
<button
aria-label="10 unmodified"
class="lineNumButton right"
data-value="10"
id="right-button-10"
tabindex="-1"
>
10
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-10"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-8 right-button-11 right-content-11"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="8">
<button
aria-label="8 unmodified"
class="left lineNumButton"
data-value="8"
id="left-button-8"
tabindex="-1"
>
8
</button>
</td>
<td class="lineNum right" data-value="11">
<button
aria-label="11 unmodified"
class="lineNumButton right"
data-value="11"
id="right-button-11"
tabindex="-1"
>
11
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-11"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-9 right-button-12 right-content-12"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="9">
<button
aria-label="9 unmodified"
class="left lineNumButton"
data-value="9"
id="left-button-9"
tabindex="-1"
>
9
</button>
</td>
<td class="lineNum right" data-value="12">
<button
aria-label="12 unmodified"
class="lineNumButton right"
data-value="12"
id="right-button-12"
tabindex="-1"
>
12
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-12"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section total">
<tr
aria-labelledby="left-button-10 left-content-10"
class="diff-row remove unified"
tabindex="-1"
>
<td class="left lineNum" data-value="10">
<button
aria-label="10 removed"
class="left lineNumButton"
data-value="10"
id="left-button-10"
tabindex="-1"
>
10
</button>
</td>
<td class="blankLineNum right"></td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-10"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-11 left-content-11"
class="diff-row remove unified"
tabindex="-1"
>
<td class="left lineNum" data-value="11">
<button
aria-label="11 removed"
class="left lineNumButton"
data-value="11"
id="left-button-11"
tabindex="-1"
>
11
</button>
</td>
<td class="blankLineNum right"></td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-11"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-12 left-content-12"
class="diff-row remove unified"
tabindex="-1"
>
<td class="left lineNum" data-value="12">
<button
aria-label="12 removed"
class="left lineNumButton"
data-value="12"
id="left-button-12"
tabindex="-1"
>
12
</button>
</td>
<td class="blankLineNum right"></td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-12"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-13 left-content-13"
class="diff-row remove unified"
tabindex="-1"
>
<td class="left lineNum" data-value="13">
<button
aria-label="13 removed"
class="left lineNumButton"
data-value="13"
id="left-button-13"
tabindex="-1"
>
13
</button>
</td>
<td class="blankLineNum right"></td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-13"
></div>
</td>
</tr>
</tbody>
<tbody class="delta ignoredWhitespaceOnly section">
<tr
aria-labelledby="right-button-13 right-content-13"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="13">
<button
aria-label="13 added"
class="lineNumButton right"
data-value="13"
id="right-button-13"
tabindex="-1"
>
13
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-13"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-14 right-content-14"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="14">
<button
aria-label="14 added"
class="lineNumButton right"
data-value="14"
id="right-button-14"
tabindex="-1"
>
14
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-14"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section">
<tr
aria-labelledby="left-button-16 left-content-16"
class="diff-row remove unified"
tabindex="-1"
>
<td class="left lineNum" data-value="16">
<button
aria-label="16 removed"
class="left lineNumButton"
data-value="16"
id="left-button-16"
tabindex="-1"
>
16
</button>
</td>
<td class="blankLineNum right"></td>
<td class="content left remove">
<div
class="contentText"
data-side="left"
id="left-content-16"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-15 right-content-15"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="15">
<button
aria-label="15 added"
class="lineNumButton right"
data-value="15"
id="right-button-15"
tabindex="-1"
>
15
</button>
</td>
<td class="add content right">
<div
class="contentText"
data-side="right"
id="right-content-15"
></div>
</td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-17 right-button-16 right-content-16"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="17">
<button
aria-label="17 unmodified"
class="left lineNumButton"
data-value="17"
id="left-button-17"
tabindex="-1"
>
17
</button>
</td>
<td class="lineNum right" data-value="16">
<button
aria-label="16 unmodified"
class="lineNumButton right"
data-value="16"
id="right-button-16"
tabindex="-1"
>
16
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-16"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-18 right-button-17 right-content-17"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="18">
<button
aria-label="18 unmodified"
class="left lineNumButton"
data-value="18"
id="left-button-18"
tabindex="-1"
>
18
</button>
</td>
<td class="lineNum right" data-value="17">
<button
aria-label="17 unmodified"
class="lineNumButton right"
data-value="17"
id="right-button-17"
tabindex="-1"
>
17
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-17"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-19 right-button-18 right-content-18"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="19">
<button
aria-label="19 unmodified"
class="left lineNumButton"
data-value="19"
id="left-button-19"
tabindex="-1"
>
19
</button>
</td>
<td class="lineNum right" data-value="18">
<button
aria-label="18 unmodified"
class="lineNumButton right"
data-value="18"
id="right-button-18"
tabindex="-1"
>
18
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-18"
></div>
</td>
</tr>
</tbody>
<tbody class="contextControl section">
<tr class="above contextBackground unified">
<td class="contextLineNum"></td>
<td class="contextLineNum"></td>
<td></td>
</tr>
<tr class="dividerRow show-both">
<td class="dividerCell" colspan="3">
<gr-context-controls showconfig="both">
</gr-context-controls>
</td>
</tr>
<tr class="below contextBackground unified">
<td class="contextLineNum"></td>
<td class="contextLineNum"></td>
<td></td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-38 right-button-37 right-content-37"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="38">
<button
aria-label="38 unmodified"
class="left lineNumButton"
data-value="38"
id="left-button-38"
tabindex="-1"
>
38
</button>
</td>
<td class="lineNum right" data-value="37">
<button
aria-label="37 unmodified"
class="lineNumButton right"
data-value="37"
id="right-button-37"
tabindex="-1"
>
37
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-37"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-39 right-button-38 right-content-38"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="39">
<button
aria-label="39 unmodified"
class="left lineNumButton"
data-value="39"
id="left-button-39"
tabindex="-1"
>
39
</button>
</td>
<td class="lineNum right" data-value="38">
<button
aria-label="38 unmodified"
class="lineNumButton right"
data-value="38"
id="right-button-38"
tabindex="-1"
>
38
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-38"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-40 right-button-39 right-content-39"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="40">
<button
aria-label="40 unmodified"
class="left lineNumButton"
data-value="40"
id="left-button-40"
tabindex="-1"
>
40
</button>
</td>
<td class="lineNum right" data-value="39">
<button
aria-label="39 unmodified"
class="lineNumButton right"
data-value="39"
id="right-button-39"
tabindex="-1"
>
39
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-39"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section total">
<tr
aria-labelledby="right-button-40 right-content-40"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="40">
<button
aria-label="40 added"
class="lineNumButton right"
data-value="40"
id="right-button-40"
tabindex="-1"
>
40
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-40"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-41 right-content-41"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="41">
<button
aria-label="41 added"
class="lineNumButton right"
data-value="41"
id="right-button-41"
tabindex="-1"
>
41
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-41"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-42 right-content-42"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="42">
<button
aria-label="42 added"
class="lineNumButton right"
data-value="42"
id="right-button-42"
tabindex="-1"
>
42
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-42"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-43 right-content-43"
class="add diff-row unified"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="lineNum right" data-value="43">
<button
aria-label="43 added"
class="lineNumButton right"
data-value="43"
id="right-button-43"
tabindex="-1"
>
43
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-43"
></div>
</td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-41 right-button-44 right-content-44"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="41">
<button
aria-label="41 unmodified"
class="left lineNumButton"
data-value="41"
id="left-button-41"
tabindex="-1"
>
41
</button>
</td>
<td class="lineNum right" data-value="44">
<button
aria-label="44 unmodified"
class="lineNumButton right"
data-value="44"
id="right-button-44"
tabindex="-1"
>
44
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-44"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-42 right-button-45 right-content-45"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="42">
<button
aria-label="42 unmodified"
class="left lineNumButton"
data-value="42"
id="left-button-42"
tabindex="-1"
>
42
</button>
</td>
<td class="lineNum right" data-value="45">
<button
aria-label="45 unmodified"
class="lineNumButton right"
data-value="45"
id="right-button-45"
tabindex="-1"
>
45
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-45"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-43 right-button-46 right-content-46"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="43">
<button
aria-label="43 unmodified"
class="left lineNumButton"
data-value="43"
id="left-button-43"
tabindex="-1"
>
43
</button>
</td>
<td class="lineNum right" data-value="46">
<button
aria-label="46 unmodified"
class="lineNumButton right"
data-value="46"
id="right-button-46"
tabindex="-1"
>
46
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-46"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-44 right-button-47 right-content-47"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="44">
<button
aria-label="44 unmodified"
class="left lineNumButton"
data-value="44"
id="left-button-44"
tabindex="-1"
>
44
</button>
</td>
<td class="lineNum right" data-value="47">
<button
aria-label="47 unmodified"
class="lineNumButton right"
data-value="47"
id="right-button-47"
tabindex="-1"
>
47
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-47"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-45 right-button-48 right-content-48"
class="both diff-row unified"
tabindex="-1"
>
<td class="left lineNum" data-value="45">
<button
aria-label="45 unmodified"
class="left lineNumButton"
data-value="45"
id="left-button-45"
tabindex="-1"
>
45
</button>
</td>
<td class="lineNum right" data-value="48">
<button
aria-label="48 unmodified"
class="lineNumButton right"
data-value="48"
id="right-button-48"
tabindex="-1"
>
48
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-48"
></div>
</td>
</tr>
</tbody>
</table>
</div>
`,
{
ignoreTags: [
'gr-context-controls-section',
'gr-diff-section',
'gr-diff-row',
'gr-diff-text',
'slot',
],
}
);
});
test('a normal diff lit', async () => {
model.updateState({
diff: createDiff(),
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.SIDE_BY_SIDE},
});
await element.updateComplete;
await waitForEventOnce(element, 'render');
assert.lightDom.equal(
element,
/* HTML */ `
<div class="diffContainer sideBySide">
<table id="diffTable">
<colgroup>
<col class="left" width="48" />
<col class="left" />
<col class="right" width="48" />
<col class="right" />
</colgroup>
<tbody class="both section">
<tr
aria-labelledby="left-button-LOST left-content-LOST right-button-LOST right-content-LOST"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="LOST"></td>
<td class="both content left lost no-intraline-info"></td>
<td class="lineNum right" data-value="LOST"></td>
<td class="both content lost no-intraline-info right"></td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-FILE left-content-FILE right-button-FILE right-content-FILE"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="FILE">
<button
aria-label="Add file comment"
class="left lineNumButton"
data-value="FILE"
id="left-button-FILE"
tabindex="-1"
>
FILE
</button>
</td>
<td class="both content file left no-intraline-info"></td>
<td class="lineNum right" data-value="FILE">
<button
aria-label="Add file comment"
class="lineNumButton right"
data-value="FILE"
id="right-button-FILE"
tabindex="-1"
>
FILE
</button>
</td>
<td class="both content file no-intraline-info right"></td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-1 left-content-1 right-button-1 right-content-1"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="1">
<button
aria-label="1 unmodified"
class="left lineNumButton"
data-value="1"
id="left-button-1"
tabindex="-1"
>
1
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-1"
></div>
</td>
<td class="lineNum right" data-value="1">
<button
aria-label="1 unmodified"
class="lineNumButton right"
data-value="1"
id="right-button-1"
tabindex="-1"
>
1
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-1"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-2 left-content-2 right-button-2 right-content-2"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="2">
<button
aria-label="2 unmodified"
class="left lineNumButton"
data-value="2"
id="left-button-2"
tabindex="-1"
>
2
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-2"
></div>
</td>
<td class="lineNum right" data-value="2">
<button
aria-label="2 unmodified"
class="lineNumButton right"
data-value="2"
id="right-button-2"
tabindex="-1"
>
2
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-2"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-3 left-content-3 right-button-3 right-content-3"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="3">
<button
aria-label="3 unmodified"
class="left lineNumButton"
data-value="3"
id="left-button-3"
tabindex="-1"
>
3
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-3"
></div>
</td>
<td class="lineNum right" data-value="3">
<button
aria-label="3 unmodified"
class="lineNumButton right"
data-value="3"
id="right-button-3"
tabindex="-1"
>
3
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-3"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-4 left-content-4 right-button-4 right-content-4"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="4">
<button
aria-label="4 unmodified"
class="left lineNumButton"
data-value="4"
id="left-button-4"
tabindex="-1"
>
4
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-4"
></div>
</td>
<td class="lineNum right" data-value="4">
<button
aria-label="4 unmodified"
class="lineNumButton right"
data-value="4"
id="right-button-4"
tabindex="-1"
>
4
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-4"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section total">
<tr
aria-labelledby="right-button-5 right-content-5"
class="diff-row side-by-side"
left-type="blank"
right-type="add"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="blank left no-intraline-info">
<div class="contentText" data-side="left"></div>
</td>
<td class="lineNum right" data-value="5">
<button
aria-label="5 added"
class="lineNumButton right"
data-value="5"
id="right-button-5"
tabindex="-1"
>
5
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-5"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-6 right-content-6"
class="diff-row side-by-side"
left-type="blank"
right-type="add"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="blank left no-intraline-info">
<div class="contentText" data-side="left"></div>
</td>
<td class="lineNum right" data-value="6">
<button
aria-label="6 added"
class="lineNumButton right"
data-value="6"
id="right-button-6"
tabindex="-1"
>
6
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-6"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-7 right-content-7"
class="diff-row side-by-side"
left-type="blank"
right-type="add"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="blank left no-intraline-info">
<div class="contentText" data-side="left"></div>
</td>
<td class="lineNum right" data-value="7">
<button
aria-label="7 added"
class="lineNumButton right"
data-value="7"
id="right-button-7"
tabindex="-1"
>
7
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-7"
></div>
</td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-5 left-content-5 right-button-8 right-content-8"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="5">
<button
aria-label="5 unmodified"
class="left lineNumButton"
data-value="5"
id="left-button-5"
tabindex="-1"
>
5
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-5"
></div>
</td>
<td class="lineNum right" data-value="8">
<button
aria-label="8 unmodified"
class="lineNumButton right"
data-value="8"
id="right-button-8"
tabindex="-1"
>
8
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-8"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-6 left-content-6 right-button-9 right-content-9"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="6">
<button
aria-label="6 unmodified"
class="left lineNumButton"
data-value="6"
id="left-button-6"
tabindex="-1"
>
6
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-6"
></div>
</td>
<td class="lineNum right" data-value="9">
<button
aria-label="9 unmodified"
class="lineNumButton right"
data-value="9"
id="right-button-9"
tabindex="-1"
>
9
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-9"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-7 left-content-7 right-button-10 right-content-10"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="7">
<button
aria-label="7 unmodified"
class="left lineNumButton"
data-value="7"
id="left-button-7"
tabindex="-1"
>
7
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-7"
></div>
</td>
<td class="lineNum right" data-value="10">
<button
aria-label="10 unmodified"
class="lineNumButton right"
data-value="10"
id="right-button-10"
tabindex="-1"
>
10
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-10"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-8 left-content-8 right-button-11 right-content-11"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="8">
<button
aria-label="8 unmodified"
class="left lineNumButton"
data-value="8"
id="left-button-8"
tabindex="-1"
>
8
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-8"
></div>
</td>
<td class="lineNum right" data-value="11">
<button
aria-label="11 unmodified"
class="lineNumButton right"
data-value="11"
id="right-button-11"
tabindex="-1"
>
11
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-11"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-9 left-content-9 right-button-12 right-content-12"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="9">
<button
aria-label="9 unmodified"
class="left lineNumButton"
data-value="9"
id="left-button-9"
tabindex="-1"
>
9
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-9"
></div>
</td>
<td class="lineNum right" data-value="12">
<button
aria-label="12 unmodified"
class="lineNumButton right"
data-value="12"
id="right-button-12"
tabindex="-1"
>
12
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-12"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section total">
<tr
aria-labelledby="left-button-10 left-content-10"
class="diff-row side-by-side"
left-type="remove"
right-type="blank"
tabindex="-1"
>
<td class="left lineNum" data-value="10">
<button
aria-label="10 removed"
class="left lineNumButton"
data-value="10"
id="left-button-10"
tabindex="-1"
>
10
</button>
</td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-10"
></div>
</td>
<td class="blankLineNum right"></td>
<td class="blank no-intraline-info right">
<div class="contentText" data-side="right"></div>
</td>
</tr>
<tr
aria-labelledby="left-button-11 left-content-11"
class="diff-row side-by-side"
left-type="remove"
right-type="blank"
tabindex="-1"
>
<td class="left lineNum" data-value="11">
<button
aria-label="11 removed"
class="left lineNumButton"
data-value="11"
id="left-button-11"
tabindex="-1"
>
11
</button>
</td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-11"
></div>
</td>
<td class="blankLineNum right"></td>
<td class="blank no-intraline-info right">
<div class="contentText" data-side="right"></div>
</td>
</tr>
<tr
aria-labelledby="left-button-12 left-content-12"
class="diff-row side-by-side"
left-type="remove"
right-type="blank"
tabindex="-1"
>
<td class="left lineNum" data-value="12">
<button
aria-label="12 removed"
class="left lineNumButton"
data-value="12"
id="left-button-12"
tabindex="-1"
>
12
</button>
</td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-12"
></div>
</td>
<td class="blankLineNum right"></td>
<td class="blank no-intraline-info right">
<div class="contentText" data-side="right"></div>
</td>
</tr>
<tr
aria-labelledby="left-button-13 left-content-13"
class="diff-row side-by-side"
left-type="remove"
right-type="blank"
tabindex="-1"
>
<td class="left lineNum" data-value="13">
<button
aria-label="13 removed"
class="left lineNumButton"
data-value="13"
id="left-button-13"
tabindex="-1"
>
13
</button>
</td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-13"
></div>
</td>
<td class="blankLineNum right"></td>
<td class="blank no-intraline-info right">
<div class="contentText" data-side="right"></div>
</td>
</tr>
</tbody>
<tbody class="delta ignoredWhitespaceOnly section">
<tr
aria-labelledby="left-button-14 left-content-14 right-button-13 right-content-13"
class="diff-row side-by-side"
left-type="remove"
right-type="add"
tabindex="-1"
>
<td class="left lineNum" data-value="14">
<button
aria-label="14 removed"
class="left lineNumButton"
data-value="14"
id="left-button-14"
tabindex="-1"
>
14
</button>
</td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-14"
></div>
</td>
<td class="lineNum right" data-value="13">
<button
aria-label="13 added"
class="lineNumButton right"
data-value="13"
id="right-button-13"
tabindex="-1"
>
13
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-13"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-15 left-content-15 right-button-14 right-content-14"
class="diff-row side-by-side"
left-type="remove"
right-type="add"
tabindex="-1"
>
<td class="left lineNum" data-value="15">
<button
aria-label="15 removed"
class="left lineNumButton"
data-value="15"
id="left-button-15"
tabindex="-1"
>
15
</button>
</td>
<td class="content left no-intraline-info remove">
<div
class="contentText"
data-side="left"
id="left-content-15"
></div>
</td>
<td class="lineNum right" data-value="14">
<button
aria-label="14 added"
class="lineNumButton right"
data-value="14"
id="right-button-14"
tabindex="-1"
>
14
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-14"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section">
<tr
aria-labelledby="left-button-16 left-content-16 right-button-15 right-content-15"
class="diff-row side-by-side"
left-type="remove"
right-type="add"
tabindex="-1"
>
<td class="left lineNum" data-value="16">
<button
aria-label="16 removed"
class="left lineNumButton"
data-value="16"
id="left-button-16"
tabindex="-1"
>
16
</button>
</td>
<td class="content left remove">
<div
class="contentText"
data-side="left"
id="left-content-16"
></div>
</td>
<td class="lineNum right" data-value="15">
<button
aria-label="15 added"
class="lineNumButton right"
data-value="15"
id="right-button-15"
tabindex="-1"
>
15
</button>
</td>
<td class="add content right">
<div
class="contentText"
data-side="right"
id="right-content-15"
></div>
</td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-17 left-content-17 right-button-16 right-content-16"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="17">
<button
aria-label="17 unmodified"
class="left lineNumButton"
data-value="17"
id="left-button-17"
tabindex="-1"
>
17
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-17"
></div>
</td>
<td class="lineNum right" data-value="16">
<button
aria-label="16 unmodified"
class="lineNumButton right"
data-value="16"
id="right-button-16"
tabindex="-1"
>
16
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-16"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-18 left-content-18 right-button-17 right-content-17"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="18">
<button
aria-label="18 unmodified"
class="left lineNumButton"
data-value="18"
id="left-button-18"
tabindex="-1"
>
18
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-18"
></div>
</td>
<td class="lineNum right" data-value="17">
<button
aria-label="17 unmodified"
class="lineNumButton right"
data-value="17"
id="right-button-17"
tabindex="-1"
>
17
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-17"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-19 left-content-19 right-button-18 right-content-18"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="19">
<button
aria-label="19 unmodified"
class="left lineNumButton"
data-value="19"
id="left-button-19"
tabindex="-1"
>
19
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-19"
></div>
</td>
<td class="lineNum right" data-value="18">
<button
aria-label="18 unmodified"
class="lineNumButton right"
data-value="18"
id="right-button-18"
tabindex="-1"
>
18
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-18"
></div>
</td>
</tr>
</tbody>
<tbody class="contextControl section">
<tr
class="above contextBackground side-by-side"
left-type="contextControl"
right-type="contextControl"
>
<td class="contextLineNum"></td>
<td></td>
<td class="contextLineNum"></td>
<td></td>
</tr>
<tr class="dividerRow show-both">
<td class="dividerCell" colspan="4">
<gr-context-controls
showconfig="both"
></gr-context-controls>
</td>
</tr>
<tr
class="below contextBackground side-by-side"
left-type="contextControl"
right-type="contextControl"
>
<td class="contextLineNum"></td>
<td></td>
<td class="contextLineNum"></td>
<td></td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-38 left-content-38 right-button-37 right-content-37"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="38">
<button
aria-label="38 unmodified"
class="left lineNumButton"
data-value="38"
id="left-button-38"
tabindex="-1"
>
38
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-38"
></div>
</td>
<td class="lineNum right" data-value="37">
<button
aria-label="37 unmodified"
class="lineNumButton right"
data-value="37"
id="right-button-37"
tabindex="-1"
>
37
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-37"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-39 left-content-39 right-button-38 right-content-38"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="39">
<button
aria-label="39 unmodified"
class="left lineNumButton"
data-value="39"
id="left-button-39"
tabindex="-1"
>
39
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-39"
></div>
</td>
<td class="lineNum right" data-value="38">
<button
aria-label="38 unmodified"
class="lineNumButton right"
data-value="38"
id="right-button-38"
tabindex="-1"
>
38
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-38"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-40 left-content-40 right-button-39 right-content-39"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="40">
<button
aria-label="40 unmodified"
class="left lineNumButton"
data-value="40"
id="left-button-40"
tabindex="-1"
>
40
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-40"
></div>
</td>
<td class="lineNum right" data-value="39">
<button
aria-label="39 unmodified"
class="lineNumButton right"
data-value="39"
id="right-button-39"
tabindex="-1"
>
39
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-39"
></div>
</td>
</tr>
</tbody>
<tbody class="delta section total">
<tr
aria-labelledby="right-button-40 right-content-40"
class="diff-row side-by-side"
left-type="blank"
right-type="add"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="blank left no-intraline-info">
<div class="contentText" data-side="left"></div>
</td>
<td class="lineNum right" data-value="40">
<button
aria-label="40 added"
class="lineNumButton right"
data-value="40"
id="right-button-40"
tabindex="-1"
>
40
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-40"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-41 right-content-41"
class="diff-row side-by-side"
left-type="blank"
right-type="add"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="blank left no-intraline-info">
<div class="contentText" data-side="left"></div>
</td>
<td class="lineNum right" data-value="41">
<button
aria-label="41 added"
class="lineNumButton right"
data-value="41"
id="right-button-41"
tabindex="-1"
>
41
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-41"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-42 right-content-42"
class="diff-row side-by-side"
left-type="blank"
right-type="add"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="blank left no-intraline-info">
<div class="contentText" data-side="left"></div>
</td>
<td class="lineNum right" data-value="42">
<button
aria-label="42 added"
class="lineNumButton right"
data-value="42"
id="right-button-42"
tabindex="-1"
>
42
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-42"
></div>
</td>
</tr>
<tr
aria-labelledby="right-button-43 right-content-43"
class="diff-row side-by-side"
left-type="blank"
right-type="add"
tabindex="-1"
>
<td class="blankLineNum left"></td>
<td class="blank left no-intraline-info">
<div class="contentText" data-side="left"></div>
</td>
<td class="lineNum right" data-value="43">
<button
aria-label="43 added"
class="lineNumButton right"
data-value="43"
id="right-button-43"
tabindex="-1"
>
43
</button>
</td>
<td class="add content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-43"
></div>
</td>
</tr>
</tbody>
<tbody class="both section">
<tr
aria-labelledby="left-button-41 left-content-41 right-button-44 right-content-44"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="41">
<button
aria-label="41 unmodified"
class="left lineNumButton"
data-value="41"
id="left-button-41"
tabindex="-1"
>
41
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-41"
></div>
</td>
<td class="lineNum right" data-value="44">
<button
aria-label="44 unmodified"
class="lineNumButton right"
data-value="44"
id="right-button-44"
tabindex="-1"
>
44
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-44"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-42 left-content-42 right-button-45 right-content-45"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="42">
<button
aria-label="42 unmodified"
class="left lineNumButton"
data-value="42"
id="left-button-42"
tabindex="-1"
>
42
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-42"
></div>
</td>
<td class="lineNum right" data-value="45">
<button
aria-label="45 unmodified"
class="lineNumButton right"
data-value="45"
id="right-button-45"
tabindex="-1"
>
45
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-45"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-43 left-content-43 right-button-46 right-content-46"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="43">
<button
aria-label="43 unmodified"
class="left lineNumButton"
data-value="43"
id="left-button-43"
tabindex="-1"
>
43
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-43"
></div>
</td>
<td class="lineNum right" data-value="46">
<button
aria-label="46 unmodified"
class="lineNumButton right"
data-value="46"
id="right-button-46"
tabindex="-1"
>
46
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-46"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-44 left-content-44 right-button-47 right-content-47"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="44">
<button
aria-label="44 unmodified"
class="left lineNumButton"
data-value="44"
id="left-button-44"
tabindex="-1"
>
44
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-44"
></div>
</td>
<td class="lineNum right" data-value="47">
<button
aria-label="47 unmodified"
class="lineNumButton right"
data-value="47"
id="right-button-47"
tabindex="-1"
>
47
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-47"
></div>
</td>
</tr>
<tr
aria-labelledby="left-button-45 left-content-45 right-button-48 right-content-48"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="45">
<button
aria-label="45 unmodified"
class="left lineNumButton"
data-value="45"
id="left-button-45"
tabindex="-1"
>
45
</button>
</td>
<td class="both content left no-intraline-info">
<div
class="contentText"
data-side="left"
id="left-content-45"
></div>
</td>
<td class="lineNum right" data-value="48">
<button
aria-label="48 unmodified"
class="lineNumButton right"
data-value="48"
id="right-button-48"
tabindex="-1"
>
48
</button>
</td>
<td class="both content no-intraline-info right">
<div
class="contentText"
data-side="right"
id="right-content-48"
></div>
</td>
</tr>
</tbody>
</table>
</div>
`,
{
ignoreTags: [
'gr-context-controls-section',
'gr-diff-section',
'gr-diff-row',
'gr-diff-text',
'slot',
],
}
);
});
});
suite('not logged in', () => {
setup(async () => {
await element.updateComplete;
});
suite('binary diffs', () => {
test('render binary diff', async () => {
model.updateState({
diff: {
meta_a: {name: 'carrot.exe', content_type: 'binary', lines: 0},
meta_b: {name: 'carrot.exe', content_type: 'binary', lines: 0},
change_type: 'MODIFIED',
intraline_status: 'OK',
diff_header: [],
content: [],
binary: true,
},
diffPrefs: {...MINIMAL_PREFS},
});
await waitForEventOnce(element, 'render');
assert.lightDom.equal(
element,
/* HTML */ `
<div class="diffContainer sideBySide">
<gr-diff-section class="left-FILE right-FILE"> </gr-diff-section>
<gr-diff-row class="left-FILE right-FILE"> </gr-diff-row>
<table id="diffTable">
<colgroup>
<col class="left" width="48" />
<col class="left" />
<col class="right" width="48" />
<col class="right" />
</colgroup>
<tbody class="both section">
<tr
aria-labelledby="left-button-FILE left-content-FILE right-button-FILE right-content-FILE"
class="diff-row side-by-side"
left-type="both"
right-type="both"
tabindex="-1"
>
<td class="left lineNum" data-value="FILE">
<button
aria-label="Add file comment"
class="left lineNumButton"
data-value="FILE"
id="left-button-FILE"
tabindex="-1"
>
FILE
</button>
</td>
<td class="both content file left no-intraline-info"></td>
<td class="lineNum right" data-value="FILE">
<button
aria-label="Add file comment"
class="lineNumButton right"
data-value="FILE"
id="right-button-FILE"
tabindex="-1"
>
FILE
</button>
</td>
<td class="both content file no-intraline-info right"></td>
</tr>
</tbody>
<tbody class="binary-diff">
<tr>
<td colspan="4">
<span> Difference in binary files. </span>
</td>
</tr>
</tbody>
</table>
</div>
`
);
});
});
suite('image diffs', () => {
let mockFile1: ImageInfo;
let mockFile2: ImageInfo;
setup(() => {
mockFile1 = {
body:
'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAE' +
'wsAAAAAAAAAAAAAAAAA/w==',
type: 'image/bmp',
};
mockFile2 = {
body:
'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAE' +
'wsAAAAAAAAAAAAA/////w==',
type: 'image/bmp',
};
element.diffPrefs = {
context: 10,
cursor_blink_rate: 0,
font_size: 12,
ignore_whitespace: 'IGNORE_NONE',
line_length: 100,
line_wrapping: false,
show_line_endings: true,
show_tabs: true,
show_whitespace_errors: true,
syntax_highlighting: true,
tab_size: 8,
};
});
test('render image diff', async () => {
model.updateState({
diff: {
meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
meta_b: {
name: 'carrot.jpg',
content_type: 'image/jpeg',
lines: 560,
},
intraline_status: 'OK',
change_type: 'MODIFIED',
diff_header: [
'diff --git a/carrot.jpg b/carrot.jpg',
'index 2adc47d..f9c2f2c 100644',
'--- a/carrot.jpg',
'+++ b/carrot.jpg',
'Binary files differ',
],
content: [{skip: 66}],
binary: true,
},
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.SIDE_BY_SIDE},
baseImage: mockFile1,
revisionImage: mockFile2,
});
await waitForEventOnce(element, 'render');
const imageDiffSection = queryAndAssert(element, 'tbody.image-diff');
assert.lightDom.equal(
imageDiffSection,
/* HTML */ `
<tbody class="image-diff">
<tr>
<td class="blank left lineNum"></td>
<td class="left">
<img
class="gr-diff left"
src="data:image/bmp;base64,${mockFile1.body}"
/>
</td>
<td class="blank lineNum right"></td>
<td class="right">
<img
class="gr-diff right"
src="data:image/bmp;base64,${mockFile2.body}"
/>
</td>
</tr>
<tr>
<td class="blank left lineNum"></td>
<td class="left">
<label class="gr-diff">
<span class="gr-diff label"> 1×1 image/bmp </span>
</label>
</td>
<td class="blank lineNum right"></td>
<td class="right">
<label class="gr-diff">
<span class="gr-diff label"> 1×1 image/bmp </span>
</label>
</td>
</tr>
</tbody>
`
);
const endpoint = queryAndAssert(element, 'tbody.endpoint');
assert.dom.equal(
endpoint,
/* HTML */ `
<tbody class="endpoint">
<tr>
<gr-endpoint-decorator class="gr-diff" name="image-diff">
<gr-endpoint-param class="gr-diff" name="baseImage">
</gr-endpoint-param>
<gr-endpoint-param class="gr-diff" name="revisionImage">
</gr-endpoint-param>
</gr-endpoint-decorator>
</tr>
</tbody>
`
);
});
test('renders image diffs with a different file name', async () => {
model.updateState({
diff: {
meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
meta_b: {
name: 'carrot2.jpg',
content_type: 'image/jpeg',
lines: 560,
},
intraline_status: 'OK',
change_type: 'MODIFIED',
diff_header: [
'diff --git a/carrot.jpg b/carrot2.jpg',
'index 2adc47d..f9c2f2c 100644',
'--- a/carrot.jpg',
'+++ b/carrot2.jpg',
'Binary files differ',
],
content: [{skip: 66}],
binary: true,
},
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.SIDE_BY_SIDE},
baseImage: {...mockFile1, _name: 'carrot.jpg'},
revisionImage: {...mockFile1, _name: 'carrot2.jpg'},
});
await waitForEventOnce(element, 'render');
const imageDiffSection = queryAndAssert(element, 'tbody.image-diff');
const leftLabel = queryAndAssert(imageDiffSection, 'td.left label');
const rightLabel = queryAndAssert(imageDiffSection, 'td.right label');
assert.dom.equal(
leftLabel,
/* HTML */ `
<label class="gr-diff">
<span class="gr-diff name"> carrot.jpg </span>
<br class="gr-diff" />
<span class="gr-diff label"> 1×1 image/bmp </span>
</label>
`
);
assert.dom.equal(
rightLabel,
/* HTML */ `
<label class="gr-diff">
<span class="gr-diff name"> carrot2.jpg </span>
<br class="gr-diff" />
<span class="gr-diff label"> 1×1 image/bmp </span>
</label>
`
);
});
test('renders added image', async () => {
model.updateState({
diff: {
meta_b: {
name: 'carrot.jpg',
content_type: 'image/jpeg',
lines: 560,
},
intraline_status: 'OK',
change_type: 'ADDED',
diff_header: [
'diff --git a/carrot.jpg b/carrot.jpg',
'index 0000000..f9c2f2c 100644',
'--- /dev/null',
'+++ b/carrot.jpg',
'Binary files differ',
],
content: [{skip: 66}],
binary: true,
},
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.SIDE_BY_SIDE},
revisionImage: mockFile2,
});
await waitForEventOnce(element, 'render');
const imageDiffSection = queryAndAssert(element, 'tbody.image-diff');
const leftImage = query(imageDiffSection, 'td.left img');
const rightImage = queryAndAssert(imageDiffSection, 'td.right img');
assert.isNotOk(leftImage);
assert.dom.equal(
rightImage,
/* HTML */ `
<img
class="gr-diff right"
src="data:image/bmp;base64,${mockFile2.body}"
/>
`
);
});
test('renders removed image', async () => {
model.updateState({
diff: {
meta_a: {
name: 'carrot.jpg',
content_type: 'image/jpeg',
lines: 560,
},
intraline_status: 'OK',
change_type: 'DELETED',
diff_header: [
'diff --git a/carrot.jpg b/carrot.jpg',
'index f9c2f2c..0000000 100644',
'--- a/carrot.jpg',
'+++ /dev/null',
'Binary files differ',
],
content: [{skip: 66}],
binary: true,
},
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.SIDE_BY_SIDE},
baseImage: mockFile1,
});
await waitForEventOnce(element, 'render');
const imageDiffSection = queryAndAssert(element, 'tbody.image-diff');
const leftImage = queryAndAssert(imageDiffSection, 'td.left img');
const rightImage = query(imageDiffSection, 'td.right img');
assert.isNotOk(rightImage);
assert.dom.equal(
leftImage,
/* HTML */ `
<img
class="gr-diff left"
src="data:image/bmp;base64,${mockFile1.body}"
/>
`
);
});
test('does not render disallowed image type', async () => {
model.updateState({
diff: {
meta_a: {
name: 'carrot.jpg',
content_type: 'image/jpeg-evil',
lines: 560,
},
intraline_status: 'OK',
change_type: 'DELETED',
diff_header: [
'diff --git a/carrot.jpg b/carrot.jpg',
'index f9c2f2c..0000000 100644',
'--- a/carrot.jpg',
'+++ /dev/null',
'Binary files differ',
],
content: [{skip: 66}],
binary: true,
},
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.SIDE_BY_SIDE},
baseImage: {...mockFile1, type: 'image/jpeg-evil'},
});
await waitForEventOnce(element, 'render');
const imageDiffSection = queryAndAssert(element, 'tbody.image-diff');
const leftImage = query(imageDiffSection, 'td.left img');
assert.isNotOk(leftImage);
});
});
});
suite('diff header', () => {
setup(async () => {
model.updateState({
diff: {
meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 560},
diff_header: [],
intraline_status: 'OK',
change_type: 'MODIFIED',
content: [{skip: 66}],
},
diffPrefs: {...MINIMAL_PREFS},
renderPrefs: {view_mode: DiffViewMode.SIDE_BY_SIDE},
});
await element.updateComplete;
});
test('hidden', async () => {
assert.equal(element.computeDiffHeaderItems().length, 0);
element.diff?.diff_header?.push('diff --git a/test.jpg b/test.jpg');
assert.equal(element.computeDiffHeaderItems().length, 0);
element.diff?.diff_header?.push('index 2adc47d..f9c2f2c 100644');
assert.equal(element.computeDiffHeaderItems().length, 0);
element.diff?.diff_header?.push('--- a/test.jpg');
assert.equal(element.computeDiffHeaderItems().length, 0);
element.diff?.diff_header?.push('+++ b/test.jpg');
assert.equal(element.computeDiffHeaderItems().length, 0);
element.diff?.diff_header?.push('test');
assert.equal(element.computeDiffHeaderItems().length, 1);
element.requestUpdate('diff');
await element.updateComplete;
const header = queryAndAssert(element, '#diffHeader');
assert.equal(header.textContent?.trim(), 'test');
});
test('binary files', () => {
element.diff!.binary = true;
assert.equal(element.computeDiffHeaderItems().length, 0);
element.diff?.diff_header?.push('diff --git a/test.jpg b/test.jpg');
assert.equal(element.computeDiffHeaderItems().length, 0);
element.diff?.diff_header?.push('test');
assert.equal(element.computeDiffHeaderItems().length, 1);
element.diff?.diff_header?.push('Binary files differ');
assert.equal(element.computeDiffHeaderItems().length, 1);
});
});
suite('trailing newline warnings', () => {
const NO_NEWLINE_LEFT = 'No newline at end of left file.';
const NO_NEWLINE_RIGHT = 'No newline at end of right file.';
const getWarning = (element: GrDiffElement) => {
const warningElement = query(element, '.newlineWarning');
return warningElement?.textContent ?? '';
};
test('shows combined warning if both sides set to warn', async () => {
model.updateState({
renderPrefs: {
show_newline_warning_left: true,
show_newline_warning_right: true,
},
});
await element.updateComplete;
assert.include(
getWarning(element),
NO_NEWLINE_LEFT + ' \u2014 ' + NO_NEWLINE_RIGHT
); // \u2014 - '—'
});
suite('showNewlineWarningLeft', () => {
test('show warning if true', async () => {
model.updateState({
renderPrefs: {show_newline_warning_left: true},
});
await element.updateComplete;
assert.include(getWarning(element), NO_NEWLINE_LEFT);
});
test('hide warning if false', async () => {
model.updateState({
renderPrefs: {show_newline_warning_left: false},
});
await element.updateComplete;
assert.notInclude(getWarning(element), NO_NEWLINE_LEFT);
});
});
suite('showNewlineWarningRight', () => {
test('show warning if true', async () => {
model.updateState({
renderPrefs: {show_newline_warning_right: true},
});
await element.updateComplete;
assert.include(getWarning(element), NO_NEWLINE_RIGHT);
});
test('hide warning if false', async () => {
model.updateState({
renderPrefs: {show_newline_warning_right: false},
});
await element.updateComplete;
assert.notInclude(getWarning(element), NO_NEWLINE_RIGHT);
});
});
});
const setupSampleDiff = async function (params: {
content: DiffContent[];
ignore_whitespace?: IgnoreWhitespaceType;
binary?: boolean;
}) {
const {ignore_whitespace, content} = params;
// binary can't be undefined, use false if not set
const binary = params.binary || false;
const diffPrefs = {
ignore_whitespace: ignore_whitespace || 'IGNORE_ALL',
context: 10,
cursor_blink_rate: 0,
font_size: 12,
line_length: 100,
line_wrapping: false,
show_line_endings: true,
show_tabs: true,
show_whitespace_errors: true,
syntax_highlighting: true,
tab_size: 8,
};
const diff: DiffInfo = {
intraline_status: 'OK',
change_type: 'MODIFIED',
diff_header: [
'diff --git a/carrot.js b/carrot.js',
'index 2adc47d..f9c2f2c 100644',
'--- a/carrot.js',
'+++ b/carrot.jjs',
'file differ',
],
content,
binary,
};
model.updateState({diff, diffPrefs});
await waitUntil(() => element.groups.length > 1);
await element.updateComplete;
};
suite('whitespace changes only message', () => {
test('show the message if ignore_whitespace is criteria matches', async () => {
await setupSampleDiff({content: [{skip: 100}]});
element.loading = false;
assert.isTrue(element.showNoChangeMessage());
});
test('do not show the message for binary files', async () => {
await setupSampleDiff({content: [{skip: 100}], binary: true});
element.loading = false;
assert.isFalse(element.showNoChangeMessage());
});
test('do not show the message if still loading', async () => {
await setupSampleDiff({content: [{skip: 100}]});
element.loading = true;
assert.isFalse(element.showNoChangeMessage());
});
test('do not show the message if contains valid changes', async () => {
const content = [
{
a: ['all work and no play make andybons a dull boy'],
b: ['elgoog elgoog elgoog'],
},
{
ab: [
'Non eram nescius, Brute, cum, quae summis ingeniis ',
'exquisitaque doctrina philosophi Graeco sermone tractavissent',
],
},
];
await setupSampleDiff({content});
element.loading = false;
assert.isFalse(element.showNoChangeMessage());
});
test('do not show message if ignore whitespace is disabled', async () => {
const content = [
{
a: ['all work and no play make andybons a dull boy'],
b: ['elgoog elgoog elgoog'],
},
{
ab: [
'Non eram nescius, Brute, cum, quae summis ingeniis ',
'exquisitaque doctrina philosophi Graeco sermone tractavissent',
],
},
];
await setupSampleDiff({ignore_whitespace: 'IGNORE_NONE', content});
element.loading = false;
assert.isFalse(element.showNoChangeMessage());
});
});
suite('rendering text, images and binary files', () => {
let content: DiffContent[] = [];
setup(() => {
element.viewMode = DiffViewMode.SIDE_BY_SIDE;
element.diffPrefs = {
...DEFAULT_PREFS,
context: -1,
syntax_highlighting: true,
};
content = [
{
a: ['all work and no play make andybons a dull boy'],
b: ['elgoog elgoog elgoog'],
},
{
ab: [
'Non eram nescius, Brute, cum, quae summis ingeniis ',
'exquisitaque doctrina philosophi Graeco sermone tractavissent',
],
},
];
});
test('text', async () => {
model.updateState({diff: {...createEmptyDiff(), content}});
await waitUntil(() => element.groups.length > 2);
await element.updateComplete;
const bodies = [...(querySelectorAll(element, 'tbody') ?? [])];
assert.equal(bodies.length, 4);
assert.isTrue(bodies[0].innerHTML.includes('LOST'));
assert.isTrue(bodies[1].innerHTML.includes('FILE'));
assert.isTrue(bodies[2].innerHTML.includes('andybons a dull boy'));
assert.isTrue(bodies[3].innerHTML.includes('Non eram nescius'));
});
test('image', async () => {
model.updateState({
diff: {
...createEmptyDiff(),
content,
binary: true,
meta_a: {name: 'carrot1.jpg', content_type: 'image/jpeg', lines: 0},
meta_b: {name: 'carrot2.jpg', content_type: 'image/jpeg', lines: 0},
},
});
await element.updateComplete;
const body = queryAndAssert(element, 'tbody.image-diff');
assert.lightDom.equal(
body,
/* HTML */ `
<label class="gr-diff">
<span class="gr-diff label"> No image </span>
</label>
<label class="gr-diff">
<span class="gr-diff label"> No image </span>
</label>
`
);
});
test('binary', async () => {
element.diff = {...createEmptyDiff(), content, binary: true};
element.binaryDiffHint = ' Download commit to view (shortcut: d)';
await element.updateComplete;
const body = queryAndAssert(element, 'tbody.binary-diff');
assert.lightDom.equal(
body,
/* HTML */ '<span>Difference in binary files. Download commit to view (shortcut: d)</span>'
);
});
});
});