blob: 7a9d06d6ee556a91217106bca0a542e2144b257d [file] [log] [blame]
/**
* @license
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../test/common-test-setup-karma';
import '../gr-diff/gr-diff-group';
import './gr-diff-builder';
import './gr-diff-builder-unified';
import {GrDiffLine, GrDiffLineType} from '../gr-diff/gr-diff-line';
import {GrDiffGroup, GrDiffGroupType} from '../gr-diff/gr-diff-group';
import {GrDiffBuilderUnified} from './gr-diff-builder-unified';
import {DiffPreferencesInfo} from '../../../api/diff';
import {createDefaultDiffPrefs} from '../../../constants/constants';
import {createDiff} from '../../../test/test-data-generators';
import {queryAndAssert} from '../../../utils/common-util';
suite('GrDiffBuilderUnified tests', () => {
let prefs: DiffPreferencesInfo;
let outputEl: HTMLElement;
let diffBuilder: GrDiffBuilderUnified;
setup(() => {
prefs = {
...createDefaultDiffPrefs(),
line_length: 10,
show_tabs: true,
tab_size: 4,
};
outputEl = document.createElement('div');
diffBuilder = new GrDiffBuilderUnified(createDiff(), prefs, outputEl, []);
});
suite('buildSectionElement for BOTH group', () => {
let lines: GrDiffLine[];
let group: GrDiffGroup;
setup(() => {
lines = [
new GrDiffLine(GrDiffLineType.BOTH, 1, 2),
new GrDiffLine(GrDiffLineType.BOTH, 2, 3),
new GrDiffLine(GrDiffLineType.BOTH, 3, 4),
];
lines[0].text = 'def hello_world():';
lines[1].text = ' print "Hello World";';
lines[2].text = ' return True';
group = new GrDiffGroup({type: GrDiffGroupType.BOTH, lines});
});
test('creates the section', () => {
const sectionEl = diffBuilder.buildSectionElement(group);
assert.isTrue(sectionEl.classList.contains('section'));
assert.isTrue(sectionEl.classList.contains('both'));
});
test('creates each unchanged row once', () => {
const sectionEl = diffBuilder.buildSectionElement(group);
const rowEls = sectionEl.querySelectorAll('.diff-row');
assert.equal(rowEls.length, 3);
assert.equal(
queryAndAssert(rowEls[0], '.lineNum.left').textContent,
lines[0].beforeNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[0], '.lineNum.right').textContent,
lines[0].afterNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[0], '.content').textContent,
lines[0].text
);
assert.equal(
queryAndAssert(rowEls[1], '.lineNum.left').textContent,
lines[1].beforeNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[1], '.lineNum.right').textContent,
lines[1].afterNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[1], '.content').textContent,
lines[1].text
);
assert.equal(
queryAndAssert(rowEls[2], '.lineNum.left').textContent,
lines[2].beforeNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[2], '.lineNum.right').textContent,
lines[2].afterNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[2], '.content').textContent,
lines[2].text
);
});
});
suite('buildSectionElement for moved chunks', () => {
test('creates a moved out group', () => {
const lines = [
new GrDiffLine(GrDiffLineType.REMOVE, 15),
new GrDiffLine(GrDiffLineType.REMOVE, 16),
];
lines[0].text = 'def hello_world():';
lines[1].text = ' print "Hello World"';
const group = new GrDiffGroup({
type: GrDiffGroupType.DELTA,
lines,
moveDetails: {changed: false},
});
const sectionEl = diffBuilder.buildSectionElement(group);
const rowEls = sectionEl.querySelectorAll('tr');
const moveControlsRow = rowEls[0];
const cells = moveControlsRow.querySelectorAll('td');
assert.isTrue(sectionEl.classList.contains('dueToMove'));
assert.equal(rowEls.length, 3);
assert.isTrue(moveControlsRow.classList.contains('movedOut'));
assert.equal(cells.length, 3);
assert.isTrue(cells[2].classList.contains('moveHeader'));
assert.equal(cells[2].textContent, 'Moved out');
});
test('creates a moved in group', () => {
const lines = [
new GrDiffLine(GrDiffLineType.ADD, 37),
new GrDiffLine(GrDiffLineType.ADD, 38),
];
lines[0].text = 'def hello_world():';
lines[1].text = ' print "Hello World"';
const group = new GrDiffGroup({
type: GrDiffGroupType.DELTA,
lines,
moveDetails: {changed: false},
});
const sectionEl = diffBuilder.buildSectionElement(group);
const rowEls = sectionEl.querySelectorAll('tr');
const moveControlsRow = rowEls[0];
const cells = moveControlsRow.querySelectorAll('td');
assert.isTrue(sectionEl.classList.contains('dueToMove'));
assert.equal(rowEls.length, 3);
assert.isTrue(moveControlsRow.classList.contains('movedIn'));
assert.equal(cells.length, 3);
assert.isTrue(cells[2].classList.contains('moveHeader'));
assert.equal(cells[2].textContent, 'Moved in');
});
});
suite('buildSectionElement for DELTA group', () => {
let lines: GrDiffLine[];
let group: GrDiffGroup;
setup(() => {
lines = [
new GrDiffLine(GrDiffLineType.REMOVE, 1),
new GrDiffLine(GrDiffLineType.REMOVE, 2),
new GrDiffLine(GrDiffLineType.ADD, 2),
new GrDiffLine(GrDiffLineType.ADD, 3),
];
lines[0].text = 'def hello_world():';
lines[1].text = ' print "Hello World"';
lines[2].text = 'def hello_universe()';
lines[3].text = ' print "Hello Universe"';
});
test('creates the section', () => {
group = new GrDiffGroup({type: GrDiffGroupType.DELTA, lines});
const sectionEl = diffBuilder.buildSectionElement(group);
assert.isTrue(sectionEl.classList.contains('section'));
assert.isTrue(sectionEl.classList.contains('delta'));
});
test('creates the section with class if ignoredWhitespaceOnly', () => {
group = new GrDiffGroup({
type: GrDiffGroupType.DELTA,
lines,
ignoredWhitespaceOnly: true,
});
const sectionEl = diffBuilder.buildSectionElement(group);
assert.isTrue(sectionEl.classList.contains('ignoredWhitespaceOnly'));
});
test('creates the section with class if dueToRebase', () => {
group = new GrDiffGroup({
type: GrDiffGroupType.DELTA,
lines,
dueToRebase: true,
});
const sectionEl = diffBuilder.buildSectionElement(group);
assert.isTrue(sectionEl.classList.contains('dueToRebase'));
});
test('creates first the removed and then the added rows', () => {
group = new GrDiffGroup({type: GrDiffGroupType.DELTA, lines});
const sectionEl = diffBuilder.buildSectionElement(group);
const rowEls = sectionEl.querySelectorAll('.diff-row');
assert.equal(rowEls.length, 4);
assert.equal(
queryAndAssert(rowEls[0], '.lineNum.left').textContent,
lines[0].beforeNumber.toString()
);
assert.isNotOk(rowEls[0].querySelector('.lineNum.right'));
assert.equal(
queryAndAssert(rowEls[0], '.content').textContent,
lines[0].text
);
assert.equal(
queryAndAssert(rowEls[1], '.lineNum.left').textContent,
lines[1].beforeNumber.toString()
);
assert.isNotOk(rowEls[1].querySelector('.lineNum.right'));
assert.equal(
queryAndAssert(rowEls[1], '.content').textContent,
lines[1].text
);
assert.isNotOk(rowEls[2].querySelector('.lineNum.left'));
assert.equal(
queryAndAssert(rowEls[2], '.lineNum.right').textContent,
lines[2].afterNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[2], '.content').textContent,
lines[2].text
);
assert.isNotOk(rowEls[3].querySelector('.lineNum.left'));
assert.equal(
queryAndAssert(rowEls[3], '.lineNum.right').textContent,
lines[3].afterNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[3], '.content').textContent,
lines[3].text
);
});
test('creates only the added rows if only ignored whitespace', () => {
group = new GrDiffGroup({
type: GrDiffGroupType.DELTA,
lines,
ignoredWhitespaceOnly: true,
});
const sectionEl = diffBuilder.buildSectionElement(group);
const rowEls = sectionEl.querySelectorAll('.diff-row');
assert.equal(rowEls.length, 2);
assert.isNotOk(rowEls[0].querySelector('.lineNum.left'));
assert.equal(
queryAndAssert(rowEls[0], '.lineNum.right').textContent,
lines[2].afterNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[0], '.content').textContent,
lines[2].text
);
assert.isNotOk(rowEls[1].querySelector('.lineNum.left'));
assert.equal(
queryAndAssert(rowEls[1], '.lineNum.right').textContent,
lines[3].afterNumber.toString()
);
assert.equal(
queryAndAssert(rowEls[1], '.content').textContent,
lines[3].text
);
});
});
});