Refactor context control to be a group, not a line
This breaks a dependency cycle between GrDiffLine and GrDiffGroup. The line only needed to need to know about groups, if it was of type CONTEXT_CONTROL. But there was not really a need for the context control to be modeled as a line. Moving this logic from line to group meant to re-write the diff builders a little bit such that context control is now handled a bit more explicitly, which is probably an improvement anyway. This change is driven by the desire to convert GrDiffLine and GrDiffGroup to TypeScript and the author did not see a great solution for how to otherwise break the dependency cycle. Change-Id: Id07b0b9b2c4f5caf7bcc99ac20164dd34c14653d
This commit is contained in:
@@ -80,7 +80,7 @@ suite('gr-diff-builder tests', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
suite('context control', () => {
|
suite('context control', () => {
|
||||||
function createContextLine(options) {
|
function createContextGroups(options) {
|
||||||
const offset = options.offset || 0;
|
const offset = options.offset || 0;
|
||||||
const numLines = options.count || 10;
|
const numLines = options.count || 10;
|
||||||
const lines = [];
|
const lines = [];
|
||||||
@@ -92,15 +92,12 @@ suite('gr-diff-builder tests', () => {
|
|||||||
lines.push(line);
|
lines.push(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return [new GrDiffGroup(GrDiffGroup.Type.BOTH, lines)];
|
||||||
contextGroups: [new GrDiffGroup(GrDiffGroup.Type.BOTH, lines)],
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test('no +10 buttons for 10 or less lines', () => {
|
test('no +10 buttons for 10 or less lines', () => {
|
||||||
const contextLine = createContextLine({count: 10});
|
const contextGroups = createContextGroups({count: 10});
|
||||||
|
const td = builder._createContextControl({}, contextGroups);
|
||||||
const td = builder._createContextControl({}, contextLine);
|
|
||||||
const buttons = td.querySelectorAll('gr-button.showContext');
|
const buttons = td.querySelectorAll('gr-button.showContext');
|
||||||
|
|
||||||
assert.equal(buttons.length, 1);
|
assert.equal(buttons.length, 1);
|
||||||
@@ -108,10 +105,9 @@ suite('gr-diff-builder tests', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('context control at the top', () => {
|
test('context control at the top', () => {
|
||||||
const contextLine = createContextLine({offset: 0, count: 20});
|
const contextGroups = createContextGroups({offset: 0, count: 20});
|
||||||
|
|
||||||
builder._numLinesLeft = 50;
|
builder._numLinesLeft = 50;
|
||||||
const td = builder._createContextControl({}, contextLine);
|
const td = builder._createContextControl({}, contextGroups);
|
||||||
const buttons = td.querySelectorAll('gr-button.showContext');
|
const buttons = td.querySelectorAll('gr-button.showContext');
|
||||||
|
|
||||||
assert.equal(buttons.length, 2);
|
assert.equal(buttons.length, 2);
|
||||||
@@ -120,10 +116,9 @@ suite('gr-diff-builder tests', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('context control in the middle', () => {
|
test('context control in the middle', () => {
|
||||||
const contextLine = createContextLine({offset: 10, count: 20});
|
const contextGroups = createContextGroups({offset: 10, count: 20});
|
||||||
|
|
||||||
builder._numLinesLeft = 50;
|
builder._numLinesLeft = 50;
|
||||||
const td = builder._createContextControl({}, contextLine);
|
const td = builder._createContextControl({}, contextGroups);
|
||||||
const buttons = td.querySelectorAll('gr-button.showContext');
|
const buttons = td.querySelectorAll('gr-button.showContext');
|
||||||
|
|
||||||
assert.equal(buttons.length, 3);
|
assert.equal(buttons.length, 3);
|
||||||
@@ -133,10 +128,9 @@ suite('gr-diff-builder tests', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('context control at the top', () => {
|
test('context control at the top', () => {
|
||||||
const contextLine = createContextLine({offset: 30, count: 20});
|
const contextGroups = createContextGroups({offset: 30, count: 20});
|
||||||
|
|
||||||
builder._numLinesLeft = 50;
|
builder._numLinesLeft = 50;
|
||||||
const td = builder._createContextControl({}, contextLine);
|
const td = builder._createContextControl({}, contextGroups);
|
||||||
const buttons = td.querySelectorAll('gr-button.showContext');
|
const buttons = td.querySelectorAll('gr-button.showContext');
|
||||||
|
|
||||||
assert.equal(buttons.length, 2);
|
assert.equal(buttons.length, 2);
|
||||||
@@ -1203,7 +1197,7 @@ suite('gr-diff-builder tests', () => {
|
|||||||
line.beforeNumber = 3;
|
line.beforeNumber = 3;
|
||||||
line.afterNumber = 5;
|
line.afterNumber = 5;
|
||||||
|
|
||||||
const result = builder._createBlameCell(line);
|
const result = builder._createBlameCell(line.beforeNumber);
|
||||||
|
|
||||||
assert.isTrue(getBlameStub.calledWithExactly(3));
|
assert.isTrue(getBlameStub.calledWithExactly(3));
|
||||||
assert.equal(result.getAttribute('data-line-number'), '3');
|
assert.equal(result.getAttribute('data-line-number'), '3');
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {GrDiffBuilder} from './gr-diff-builder.js';
|
import {GrDiffBuilder} from './gr-diff-builder.js';
|
||||||
|
import {GrDiffGroup} from '../gr-diff/gr-diff-group';
|
||||||
|
|
||||||
/** @constructor */
|
/** @constructor */
|
||||||
export function GrDiffBuilderSideBySide(diff, prefs, outputEl, layers) {
|
export function GrDiffBuilderSideBySide(diff, prefs, outputEl, layers) {
|
||||||
@@ -36,6 +37,12 @@ GrDiffBuilderSideBySide.prototype.buildSectionElement = function(group) {
|
|||||||
if (group.ignoredWhitespaceOnly) {
|
if (group.ignoredWhitespaceOnly) {
|
||||||
sectionEl.classList.add('ignoredWhitespaceOnly');
|
sectionEl.classList.add('ignoredWhitespaceOnly');
|
||||||
}
|
}
|
||||||
|
if (group.type === GrDiffGroup.Type.CONTEXT_CONTROL) {
|
||||||
|
sectionEl.appendChild(
|
||||||
|
this._createContextRow(sectionEl, group.contextGroups));
|
||||||
|
return sectionEl;
|
||||||
|
}
|
||||||
|
|
||||||
const pairs = group.getSideBySidePairs();
|
const pairs = group.getSideBySidePairs();
|
||||||
for (let i = 0; i < pairs.length; i++) {
|
for (let i = 0; i < pairs.length; i++) {
|
||||||
sectionEl.appendChild(this._createRow(sectionEl, pairs[i].left,
|
sectionEl.appendChild(this._createRow(sectionEl, pairs[i].left,
|
||||||
@@ -79,7 +86,7 @@ GrDiffBuilderSideBySide.prototype._createRow = function(section, leftLine,
|
|||||||
row.setAttribute('right-type', rightLine.type);
|
row.setAttribute('right-type', rightLine.type);
|
||||||
row.tabIndex = -1;
|
row.tabIndex = -1;
|
||||||
|
|
||||||
row.appendChild(this._createBlameCell(leftLine));
|
row.appendChild(this._createBlameCell(leftLine.beforeNumber));
|
||||||
|
|
||||||
this._appendPair(section, row, leftLine, leftLine.beforeNumber,
|
this._appendPair(section, row, leftLine, leftLine.beforeNumber,
|
||||||
GrDiffBuilder.Side.LEFT);
|
GrDiffBuilder.Side.LEFT);
|
||||||
@@ -92,13 +99,23 @@ GrDiffBuilderSideBySide.prototype._appendPair = function(section, row, line,
|
|||||||
lineNumber, side) {
|
lineNumber, side) {
|
||||||
const lineNumberEl = this._createLineEl(line, lineNumber, line.type, side);
|
const lineNumberEl = this._createLineEl(line, lineNumber, line.type, side);
|
||||||
row.appendChild(lineNumberEl);
|
row.appendChild(lineNumberEl);
|
||||||
const action = this._createContextControl(section, line);
|
row.appendChild(this._createTextEl(lineNumberEl, line, side));
|
||||||
if (action) {
|
};
|
||||||
row.appendChild(action);
|
|
||||||
} else {
|
GrDiffBuilderSideBySide.prototype._createContextRow = function(section,
|
||||||
const textEl = this._createTextEl(lineNumberEl, line, side);
|
contextGroups) {
|
||||||
row.appendChild(textEl);
|
const row = this._createElement('tr');
|
||||||
}
|
row.classList.add('diff-row', 'side-by-side');
|
||||||
|
row.setAttribute('left-type', GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
|
row.setAttribute('right-type', GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
|
row.tabIndex = -1;
|
||||||
|
|
||||||
|
row.appendChild(this._createBlameCell(0));
|
||||||
|
row.appendChild(this._createElement('td', 'contextLineNum'));
|
||||||
|
row.appendChild(this._createContextControl(section, contextGroups));
|
||||||
|
row.appendChild(this._createElement('td', 'contextLineNum'));
|
||||||
|
row.appendChild(this._createContextControl(section, contextGroups));
|
||||||
|
return row;
|
||||||
};
|
};
|
||||||
|
|
||||||
GrDiffBuilderSideBySide.prototype._getNextContentOnSide = function(
|
GrDiffBuilderSideBySide.prototype._getNextContentOnSide = function(
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
import {GrDiffLine} from '../gr-diff/gr-diff-line.js';
|
import {GrDiffLine} from '../gr-diff/gr-diff-line.js';
|
||||||
import {GrDiffBuilder} from './gr-diff-builder.js';
|
import {GrDiffBuilder} from './gr-diff-builder.js';
|
||||||
|
import {GrDiffGroup} from '../gr-diff/gr-diff-group';
|
||||||
|
|
||||||
export function GrDiffBuilderUnified(diff, prefs, outputEl, layers) {
|
export function GrDiffBuilderUnified(diff, prefs, outputEl, layers) {
|
||||||
GrDiffBuilder.call(this, diff, prefs, outputEl, layers);
|
GrDiffBuilder.call(this, diff, prefs, outputEl, layers);
|
||||||
@@ -35,6 +36,11 @@ GrDiffBuilderUnified.prototype.buildSectionElement = function(group) {
|
|||||||
if (group.ignoredWhitespaceOnly) {
|
if (group.ignoredWhitespaceOnly) {
|
||||||
sectionEl.classList.add('ignoredWhitespaceOnly');
|
sectionEl.classList.add('ignoredWhitespaceOnly');
|
||||||
}
|
}
|
||||||
|
if (group.type === GrDiffGroup.Type.CONTEXT_CONTROL) {
|
||||||
|
sectionEl.appendChild(
|
||||||
|
this._createContextRow(sectionEl, group.contextGroups));
|
||||||
|
return sectionEl;
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < group.lines.length; ++i) {
|
for (let i = 0; i < group.lines.length; ++i) {
|
||||||
const line = group.lines[i];
|
const line = group.lines[i];
|
||||||
@@ -76,22 +82,26 @@ GrDiffBuilderUnified.prototype._createRow = function(section, line) {
|
|||||||
const row = this._createElement('tr', line.type);
|
const row = this._createElement('tr', line.type);
|
||||||
row.classList.add('diff-row', 'unified');
|
row.classList.add('diff-row', 'unified');
|
||||||
row.tabIndex = -1;
|
row.tabIndex = -1;
|
||||||
row.appendChild(this._createBlameCell(line));
|
row.appendChild(this._createBlameCell(line.beforeNumber));
|
||||||
|
|
||||||
let lineNumberEl = this._createLineEl(line, line.beforeNumber,
|
let lineNumberEl = this._createLineEl(line, line.beforeNumber,
|
||||||
GrDiffLine.Type.REMOVE, 'left');
|
GrDiffLine.Type.REMOVE, 'left');
|
||||||
row.appendChild(lineNumberEl);
|
row.appendChild(lineNumberEl);
|
||||||
lineNumberEl = this._createLineEl(line, line.afterNumber,
|
lineNumberEl = this._createLineEl(line, line.afterNumber,
|
||||||
GrDiffLine.Type.ADD, 'right');
|
GrDiffLine.Type.ADD, 'right');
|
||||||
row.appendChild(lineNumberEl);
|
row.appendChild(lineNumberEl);
|
||||||
|
row.appendChild(this._createTextEl(lineNumberEl, line));
|
||||||
|
return row;
|
||||||
|
};
|
||||||
|
|
||||||
const action = this._createContextControl(section, line);
|
GrDiffBuilderUnified.prototype._createContextRow = function(section,
|
||||||
if (action) {
|
contextGroups) {
|
||||||
row.appendChild(action);
|
const row = this._createElement('tr', GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
} else {
|
row.classList.add('diff-row', 'unified');
|
||||||
const textEl = this._createTextEl(lineNumberEl, line);
|
row.tabIndex = -1;
|
||||||
row.appendChild(textEl);
|
row.appendChild(this._createBlameCell(0));
|
||||||
}
|
row.appendChild(this._createElement('td', 'contextLineNum'));
|
||||||
|
row.appendChild(this._createElement('td', 'contextLineNum'));
|
||||||
|
row.appendChild(this._createContextControl(section, contextGroups));
|
||||||
return row;
|
return row;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -240,12 +240,13 @@ GrDiffBuilder.prototype.getSectionsByLineRange = function(
|
|||||||
group => group.element);
|
group => group.element);
|
||||||
};
|
};
|
||||||
|
|
||||||
GrDiffBuilder.prototype._createContextControl = function(section, line) {
|
GrDiffBuilder.prototype._createContextControl = function(
|
||||||
if (!line.contextGroups) return null;
|
section, contextGroups) {
|
||||||
|
if (!contextGroups) return null;
|
||||||
|
|
||||||
const leftStart = line.contextGroups[0].lineRange.left.start;
|
const leftStart = contextGroups[0].lineRange.left.start;
|
||||||
const leftEnd =
|
const leftEnd =
|
||||||
line.contextGroups[line.contextGroups.length - 1].lineRange.left.end;
|
contextGroups[contextGroups.length - 1].lineRange.left.end;
|
||||||
|
|
||||||
const numLines = leftEnd - leftStart + 1;
|
const numLines = leftEnd - leftStart + 1;
|
||||||
|
|
||||||
@@ -256,22 +257,24 @@ GrDiffBuilder.prototype._createContextControl = function(section, line) {
|
|||||||
|
|
||||||
if (showPartialLinks && leftStart > 1) {
|
if (showPartialLinks && leftStart > 1) {
|
||||||
td.appendChild(this._createContextButton(
|
td.appendChild(this._createContextButton(
|
||||||
GrDiffBuilder.ContextButtonType.ABOVE, section, line, numLines));
|
GrDiffBuilder.ContextButtonType.ABOVE, section, contextGroups,
|
||||||
|
numLines));
|
||||||
}
|
}
|
||||||
|
|
||||||
td.appendChild(this._createContextButton(
|
td.appendChild(this._createContextButton(
|
||||||
GrDiffBuilder.ContextButtonType.ALL, section, line, numLines));
|
GrDiffBuilder.ContextButtonType.ALL, section, contextGroups, numLines));
|
||||||
|
|
||||||
if (showPartialLinks && leftEnd < this._numLinesLeft) {
|
if (showPartialLinks && leftEnd < this._numLinesLeft) {
|
||||||
td.appendChild(this._createContextButton(
|
td.appendChild(this._createContextButton(
|
||||||
GrDiffBuilder.ContextButtonType.BELOW, section, line, numLines));
|
GrDiffBuilder.ContextButtonType.BELOW, section, contextGroups,
|
||||||
|
numLines));
|
||||||
}
|
}
|
||||||
|
|
||||||
return td;
|
return td;
|
||||||
};
|
};
|
||||||
|
|
||||||
GrDiffBuilder.prototype._createContextButton = function(type, section, line,
|
GrDiffBuilder.prototype._createContextButton = function(
|
||||||
numLines) {
|
type, section, contextGroups, numLines) {
|
||||||
const context = PARTIAL_CONTEXT_AMOUNT;
|
const context = PARTIAL_CONTEXT_AMOUNT;
|
||||||
|
|
||||||
const button = this._createElement('gr-button', 'showContext');
|
const button = this._createElement('gr-button', 'showContext');
|
||||||
@@ -287,15 +290,15 @@ GrDiffBuilder.prototype._createContextButton = function(type, section, line,
|
|||||||
|
|
||||||
text = 'Show ' + numLines + ' common line';
|
text = 'Show ' + numLines + ' common line';
|
||||||
if (numLines > 1) { text += 's'; }
|
if (numLines > 1) { text += 's'; }
|
||||||
groups.push(...line.contextGroups);
|
groups.push(...contextGroups);
|
||||||
} else if (type === GrDiffBuilder.ContextButtonType.ABOVE) {
|
} else if (type === GrDiffBuilder.ContextButtonType.ABOVE) {
|
||||||
text = '+' + context + ' above';
|
text = '+' + context + ' above';
|
||||||
groups = GrDiffGroup.hideInContextControl(line.contextGroups,
|
groups = GrDiffGroup.hideInContextControl(
|
||||||
context, numLines);
|
contextGroups, context, numLines);
|
||||||
} else if (type === GrDiffBuilder.ContextButtonType.BELOW) {
|
} else if (type === GrDiffBuilder.ContextButtonType.BELOW) {
|
||||||
text = '+' + context + ' below';
|
text = '+' + context + ' below';
|
||||||
groups = GrDiffGroup.hideInContextControl(line.contextGroups,
|
groups = GrDiffGroup.hideInContextControl(
|
||||||
0, numLines - context);
|
contextGroups, 0, numLines - context);
|
||||||
}
|
}
|
||||||
const textSpan = this._createElement('span', 'showContext');
|
const textSpan = this._createElement('span', 'showContext');
|
||||||
dom(textSpan).textContent = text;
|
dom(textSpan).textContent = text;
|
||||||
@@ -319,11 +322,6 @@ GrDiffBuilder.prototype._createLineEl = function(
|
|||||||
if (line.type === GrDiffLine.Type.BLANK) {
|
if (line.type === GrDiffLine.Type.BLANK) {
|
||||||
return td;
|
return td;
|
||||||
}
|
}
|
||||||
if (line.type === GrDiffLine.Type.CONTEXT_CONTROL) {
|
|
||||||
td.classList.add('contextLineNum');
|
|
||||||
return td;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (line.type === GrDiffLine.Type.BOTH || line.type === type) {
|
if (line.type === GrDiffLine.Type.BOTH || line.type === type) {
|
||||||
// Both td and button need a number of classes/attributes for various
|
// Both td and button need a number of classes/attributes for various
|
||||||
// selectors to work.
|
// selectors to work.
|
||||||
@@ -638,14 +636,14 @@ ${commit.commit_msg}`;
|
|||||||
* Create a blame cell for the given base line. Blame information will be
|
* Create a blame cell for the given base line. Blame information will be
|
||||||
* included in the cell if available.
|
* included in the cell if available.
|
||||||
*
|
*
|
||||||
* @param {GrDiffLine} line
|
* @param {number} lineNumber
|
||||||
* @return {HTMLTableDataCellElement}
|
* @return {HTMLTableDataCellElement}
|
||||||
*/
|
*/
|
||||||
GrDiffBuilder.prototype._createBlameCell = function(line) {
|
GrDiffBuilder.prototype._createBlameCell = function(lineNumber) {
|
||||||
const blameTd = this._createElement('td', 'blame');
|
const blameTd = this._createElement('td', 'blame');
|
||||||
blameTd.setAttribute('data-line-number', line.beforeNumber);
|
blameTd.setAttribute('data-line-number', lineNumber);
|
||||||
if (line.beforeNumber) {
|
if (lineNumber) {
|
||||||
const content = this._getBlameForBaseLine(line.beforeNumber);
|
const content = this._getBlameForBaseLine(lineNumber);
|
||||||
if (content) {
|
if (content) {
|
||||||
blameTd.appendChild(content);
|
blameTd.appendChild(content);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,9 +156,9 @@ suite('gr-diff-processor tests', () => {
|
|||||||
// group[0] is the file group
|
// group[0] is the file group
|
||||||
|
|
||||||
assert.equal(groups[1].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
assert.equal(groups[1].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
assert.instanceOf(groups[1].lines[0].contextGroups[0], GrDiffGroup);
|
assert.instanceOf(groups[1].contextGroups[0], GrDiffGroup);
|
||||||
assert.equal(groups[1].lines[0].contextGroups[0].lines.length, 90);
|
assert.equal(groups[1].contextGroups[0].lines.length, 90);
|
||||||
for (const l of groups[1].lines[0].contextGroups[0].lines) {
|
for (const l of groups[1].contextGroups[0].lines) {
|
||||||
assert.equal(l.text, 'all work and no play make jack a dull boy');
|
assert.equal(l.text, 'all work and no play make jack a dull boy');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,9 +213,9 @@ suite('gr-diff-processor tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert.equal(groups[3].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
assert.equal(groups[3].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
assert.instanceOf(groups[3].lines[0].contextGroups[0], GrDiffGroup);
|
assert.instanceOf(groups[3].contextGroups[0], GrDiffGroup);
|
||||||
assert.equal(groups[3].lines[0].contextGroups[0].lines.length, 90);
|
assert.equal(groups[3].contextGroups[0].lines.length, 90);
|
||||||
for (const l of groups[3].lines[0].contextGroups[0].lines) {
|
for (const l of groups[3].contextGroups[0].lines) {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
l.text, 'all work and no play make jill a dull girl');
|
l.text, 'all work and no play make jill a dull girl');
|
||||||
}
|
}
|
||||||
@@ -323,26 +323,26 @@ suite('gr-diff-processor tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert.equal(groups[6].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
assert.equal(groups[6].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
assert.equal(groups[6].lines[0].contextGroups.length, 2);
|
assert.equal(groups[6].contextGroups.length, 2);
|
||||||
|
|
||||||
assert.equal(groups[6].lines[0].contextGroups[0].lines.length, 4);
|
assert.equal(groups[6].contextGroups[0].lines.length, 4);
|
||||||
assert.equal(groups[6].lines[0].contextGroups[0].removes.length, 2);
|
assert.equal(groups[6].contextGroups[0].removes.length, 2);
|
||||||
assert.equal(groups[6].lines[0].contextGroups[0].adds.length, 2);
|
assert.equal(groups[6].contextGroups[0].adds.length, 2);
|
||||||
for (const l of groups[6].lines[0].contextGroups[0].removes) {
|
for (const l of groups[6].contextGroups[0].removes) {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
l.text, 'all work and no play make jill a dull girl');
|
l.text, 'all work and no play make jill a dull girl');
|
||||||
}
|
}
|
||||||
for (const l of groups[6].lines[0].contextGroups[0].adds) {
|
for (const l of groups[6].contextGroups[0].adds) {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
l.text, ' all work and no play make jill a dull girl');
|
l.text, ' all work and no play make jill a dull girl');
|
||||||
}
|
}
|
||||||
|
|
||||||
// The final chunk is completely hidden
|
// The final chunk is completely hidden
|
||||||
assert.equal(
|
assert.equal(
|
||||||
groups[6].lines[0].contextGroups[1].type,
|
groups[6].contextGroups[1].type,
|
||||||
GrDiffGroup.Type.BOTH);
|
GrDiffGroup.Type.BOTH);
|
||||||
assert.equal(groups[6].lines[0].contextGroups[1].lines.length, 3);
|
assert.equal(groups[6].contextGroups[1].lines.length, 3);
|
||||||
for (const l of groups[6].lines[0].contextGroups[1].lines) {
|
for (const l of groups[6].contextGroups[1].lines) {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
l.text, 'all work and no play make jill a dull girl');
|
l.text, 'all work and no play make jill a dull girl');
|
||||||
}
|
}
|
||||||
@@ -372,9 +372,9 @@ suite('gr-diff-processor tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert.equal(groups[3].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
assert.equal(groups[3].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
assert.instanceOf(groups[3].lines[0].contextGroups[0], GrDiffGroup);
|
assert.instanceOf(groups[3].contextGroups[0], GrDiffGroup);
|
||||||
assert.equal(groups[3].lines[0].contextGroups[0].lines.length, 80);
|
assert.equal(groups[3].contextGroups[0].lines.length, 80);
|
||||||
for (const l of groups[3].lines[0].contextGroups[0].lines) {
|
for (const l of groups[3].contextGroups[0].lines) {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
l.text, 'all work and no play make jill a dull girl');
|
l.text, 'all work and no play make jill a dull girl');
|
||||||
}
|
}
|
||||||
@@ -680,11 +680,10 @@ suite('gr-diff-processor tests', () => {
|
|||||||
// The first and last are uncollapsed context, whereas the middle has
|
// The first and last are uncollapsed context, whereas the middle has
|
||||||
// a single context-control line.
|
// a single context-control line.
|
||||||
assert.equal(result.groups[0].lines.length, element.context);
|
assert.equal(result.groups[0].lines.length, element.context);
|
||||||
assert.equal(result.groups[1].lines.length, 1);
|
|
||||||
assert.equal(result.groups[2].lines.length, element.context);
|
assert.equal(result.groups[2].lines.length, element.context);
|
||||||
|
|
||||||
// The collapsed group has the hidden lines as its context group.
|
// The collapsed group has the hidden lines as its context group.
|
||||||
assert.equal(result.groups[1].lines[0].contextGroups[0].lines.length,
|
assert.equal(result.groups[1].contextGroups[0].lines.length,
|
||||||
expectedCollapseSize);
|
expectedCollapseSize);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -705,11 +704,10 @@ suite('gr-diff-processor tests', () => {
|
|||||||
assert.equal(result.groups.length, 2, 'Results in two groups');
|
assert.equal(result.groups.length, 2, 'Results in two groups');
|
||||||
|
|
||||||
// Only the first group is collapsed.
|
// Only the first group is collapsed.
|
||||||
assert.equal(result.groups[0].lines.length, 1);
|
|
||||||
assert.equal(result.groups[1].lines.length, element.context);
|
assert.equal(result.groups[1].lines.length, element.context);
|
||||||
|
|
||||||
// The collapsed group has the hidden lines as its context group.
|
// The collapsed group has the hidden lines as its context group.
|
||||||
assert.equal(result.groups[0].lines[0].contextGroups[0].lines.length,
|
assert.equal(result.groups[0].contextGroups[0].lines.length,
|
||||||
expectedCollapseSize);
|
expectedCollapseSize);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -778,9 +776,8 @@ suite('gr-diff-processor tests', () => {
|
|||||||
// 2) The context before the key location.
|
// 2) The context before the key location.
|
||||||
// The key location is not processed in this call to _processNext
|
// The key location is not processed in this call to _processNext
|
||||||
assert.equal(result.groups.length, 2);
|
assert.equal(result.groups.length, 2);
|
||||||
assert.equal(result.groups[0].lines.length, 1);
|
|
||||||
// The collapsed group has the hidden lines as its context group.
|
// The collapsed group has the hidden lines as its context group.
|
||||||
assert.equal(result.groups[0].lines[0].contextGroups[0].lines.length,
|
assert.equal(result.groups[0].contextGroups[0].lines.length,
|
||||||
rows.length - element.context);
|
rows.length - element.context);
|
||||||
assert.equal(result.groups[1].lines.length, element.context);
|
assert.equal(result.groups[1].lines.length, element.context);
|
||||||
});
|
});
|
||||||
@@ -807,9 +804,8 @@ suite('gr-diff-processor tests', () => {
|
|||||||
// key location.
|
// key location.
|
||||||
assert.equal(result.groups.length, 2);
|
assert.equal(result.groups.length, 2);
|
||||||
assert.equal(result.groups[0].lines.length, element.context);
|
assert.equal(result.groups[0].lines.length, element.context);
|
||||||
assert.equal(result.groups[1].lines.length, 1);
|
|
||||||
// The collapsed group has the hidden lines as its context group.
|
// The collapsed group has the hidden lines as its context group.
|
||||||
assert.equal(result.groups[1].lines[0].contextGroups[0].lines.length,
|
assert.equal(result.groups[1].contextGroups[0].lines.length,
|
||||||
rows.length - element.context);
|
rows.length - element.context);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ export function GrDiffGroup(type, opt_lines) {
|
|||||||
this.adds = [];
|
this.adds = [];
|
||||||
/** @type {!Array<!GrDiffLine>} */
|
/** @type {!Array<!GrDiffLine>} */
|
||||||
this.removes = [];
|
this.removes = [];
|
||||||
|
/** @type {?Array<Object>} ?Array<!GrDiffGroup> */
|
||||||
|
this.contextGroups = null;
|
||||||
|
|
||||||
/** Both start and end line are inclusive. */
|
/** Both start and end line are inclusive. */
|
||||||
this.lineRange = {
|
this.lineRange = {
|
||||||
@@ -126,10 +128,9 @@ GrDiffGroup.hideInContextControl = function(groups, hiddenStart, hiddenEnd) {
|
|||||||
|
|
||||||
const result = [...before];
|
const result = [...before];
|
||||||
if (hidden.length) {
|
if (hidden.length) {
|
||||||
const ctxLine = new GrDiffLine(GrDiffLine.Type.CONTEXT_CONTROL);
|
|
||||||
ctxLine.contextGroups = hidden;
|
|
||||||
const ctxGroup = new GrDiffGroup(
|
const ctxGroup = new GrDiffGroup(
|
||||||
GrDiffGroup.Type.CONTEXT_CONTROL, [ctxLine]);
|
GrDiffGroup.Type.CONTEXT_CONTROL, []);
|
||||||
|
ctxGroup.contextGroups = hidden;
|
||||||
result.push(ctxGroup);
|
result.push(ctxGroup);
|
||||||
}
|
}
|
||||||
result.push(...after);
|
result.push(...after);
|
||||||
|
|||||||
@@ -138,13 +138,8 @@ suite('gr-diff-group tests', () => {
|
|||||||
assert.equal(collapsedGroups[0], groups[0]);
|
assert.equal(collapsedGroups[0], groups[0]);
|
||||||
|
|
||||||
assert.equal(collapsedGroups[1].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
assert.equal(collapsedGroups[1].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
assert.equal(collapsedGroups[1].lines.length, 1);
|
assert.equal(collapsedGroups[1].contextGroups.length, 1);
|
||||||
assert.equal(
|
assert.equal(collapsedGroups[1].contextGroups[0], groups[1]);
|
||||||
collapsedGroups[1].lines[0].type, GrDiffLine.Type.CONTEXT_CONTROL);
|
|
||||||
assert.equal(
|
|
||||||
collapsedGroups[1].lines[0].contextGroups.length, 1);
|
|
||||||
assert.equal(
|
|
||||||
collapsedGroups[1].lines[0].contextGroups[0], groups[1]);
|
|
||||||
|
|
||||||
assert.equal(collapsedGroups[2], groups[2]);
|
assert.equal(collapsedGroups[2], groups[2]);
|
||||||
});
|
});
|
||||||
@@ -159,27 +154,23 @@ suite('gr-diff-group tests', () => {
|
|||||||
assert.deepEqual(collapsedGroups[1].removes, [groups[1].removes[0]]);
|
assert.deepEqual(collapsedGroups[1].removes, [groups[1].removes[0]]);
|
||||||
|
|
||||||
assert.equal(collapsedGroups[2].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
assert.equal(collapsedGroups[2].type, GrDiffGroup.Type.CONTEXT_CONTROL);
|
||||||
assert.equal(collapsedGroups[2].lines.length, 1);
|
assert.equal(collapsedGroups[2].contextGroups.length, 2);
|
||||||
assert.equal(
|
|
||||||
collapsedGroups[2].lines[0].type, GrDiffLine.Type.CONTEXT_CONTROL);
|
|
||||||
assert.equal(
|
|
||||||
collapsedGroups[2].lines[0].contextGroups.length, 2);
|
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
collapsedGroups[2].lines[0].contextGroups[0].type,
|
collapsedGroups[2].contextGroups[0].type,
|
||||||
GrDiffGroup.Type.DELTA);
|
GrDiffGroup.Type.DELTA);
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
collapsedGroups[2].lines[0].contextGroups[0].adds,
|
collapsedGroups[2].contextGroups[0].adds,
|
||||||
groups[1].adds.slice(1));
|
groups[1].adds.slice(1));
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
collapsedGroups[2].lines[0].contextGroups[0].removes,
|
collapsedGroups[2].contextGroups[0].removes,
|
||||||
groups[1].removes.slice(1));
|
groups[1].removes.slice(1));
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
collapsedGroups[2].lines[0].contextGroups[1].type,
|
collapsedGroups[2].contextGroups[1].type,
|
||||||
GrDiffGroup.Type.BOTH);
|
GrDiffGroup.Type.BOTH);
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
collapsedGroups[2].lines[0].contextGroups[1].lines,
|
collapsedGroups[2].contextGroups[1].lines,
|
||||||
[groups[2].lines[0]]);
|
[groups[2].lines[0]]);
|
||||||
|
|
||||||
assert.equal(collapsedGroups[3].type, GrDiffGroup.Type.BOTH);
|
assert.equal(collapsedGroups[3].type, GrDiffGroup.Type.BOTH);
|
||||||
|
|||||||
@@ -36,9 +36,6 @@ export function GrDiffLine(type, opt_beforeLine, opt_afterLine) {
|
|||||||
/** @type {!Array<GrDiffLine.Highlights>} */
|
/** @type {!Array<GrDiffLine.Highlights>} */
|
||||||
this.highlights = [];
|
this.highlights = [];
|
||||||
|
|
||||||
/** @type {?Array<Object>} ?Array<!GrDiffGroup> */
|
|
||||||
this.contextGroups = null;
|
|
||||||
|
|
||||||
this.text = '';
|
this.text = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +44,6 @@ GrDiffLine.Type = {
|
|||||||
ADD: 'add',
|
ADD: 'add',
|
||||||
BOTH: 'both',
|
BOTH: 'both',
|
||||||
BLANK: 'blank',
|
BLANK: 'blank',
|
||||||
CONTEXT_CONTROL: 'contextControl',
|
|
||||||
REMOVE: 'remove',
|
REMOVE: 'remove',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user