blob: 7c25eeb968a915249ca06cce6578a7c0ebee6352 [file] [log] [blame]
/**
* @license
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../test/common-test-setup';
import '../gr-diff/gr-diff-line';
import './gr-ranged-comment-layer';
import {
CommentRangeLayer,
GrRangedCommentLayer,
} from './gr-ranged-comment-layer';
import {GrDiffLine} from '../gr-diff/gr-diff-line';
import {GrDiffLineType, Side} from '../../../api/diff';
import {SinonStub} from 'sinon';
import {assert} from '@open-wc/testing';
import {GrAnnotationImpl} from '../gr-diff-highlight/gr-annotation';
const rangeA: CommentRangeLayer = {
side: Side.LEFT,
range: {
end_character: 9,
end_line: 39,
start_character: 6,
start_line: 36,
},
id: 'a',
};
const rangeB: CommentRangeLayer = {
side: Side.RIGHT,
range: {
end_character: 22,
end_line: 12,
start_character: 10,
start_line: 10,
},
id: 'b',
};
const rangeC: CommentRangeLayer = {
side: Side.RIGHT,
range: {
end_character: 15,
end_line: 100,
start_character: 5,
start_line: 100,
},
};
const rangeD: CommentRangeLayer = {
side: Side.RIGHT,
range: {
end_character: 2,
end_line: 55,
start_character: 32,
start_line: 55,
},
id: 'd',
};
const rangeE: CommentRangeLayer = {
side: Side.RIGHT,
range: {
end_character: 1,
end_line: 71,
start_character: 1,
start_line: 60,
},
};
const rangeF: CommentRangeLayer = {
side: Side.RIGHT,
range: {
end_character: 0,
end_line: 24,
start_character: 0,
start_line: 23,
},
};
suite('gr-ranged-comment-layer', () => {
let element: GrRangedCommentLayer;
setup(() => {
const initialCommentRanges: CommentRangeLayer[] = [
rangeA,
rangeB,
rangeC,
rangeD,
rangeE,
rangeF,
];
element = new GrRangedCommentLayer();
element.updateRanges(initialCommentRanges);
});
suite('annotate', () => {
let el: HTMLDivElement;
let line: GrDiffLine;
let annotateElementStub: SinonStub;
const lineNumberEl = document.createElement('td');
function assertHasRange(
commentRange: CommentRangeLayer,
hasRange: boolean
) {
assertHasRangeOn(
commentRange.side,
commentRange.range.start_line,
hasRange
);
}
function assertHasRangeOn(
side: Side,
lineNumber: number,
hasRange: boolean
) {
line = new GrDiffLine(GrDiffLineType.BOTH);
if (side === Side.LEFT) line.beforeNumber = lineNumber;
if (side === Side.RIGHT) line.afterNumber = lineNumber;
el.setAttribute('data-side', side);
element.annotate(el, lineNumberEl, line);
assert.equal(annotateElementStub.called, hasRange);
annotateElementStub.reset();
}
setup(() => {
annotateElementStub = sinon.stub(GrAnnotationImpl, 'annotateElement');
el = document.createElement('div');
el.setAttribute('data-side', Side.LEFT);
line = new GrDiffLine(GrDiffLineType.BOTH);
line.text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit,';
});
test('type=Remove no-comment', () => {
line = new GrDiffLine(GrDiffLineType.REMOVE);
line.beforeNumber = 40;
element.annotate(el, lineNumberEl, line);
assert.isFalse(annotateElementStub.called);
});
test('type=Remove has-comment', () => {
line = new GrDiffLine(GrDiffLineType.REMOVE);
line.beforeNumber = 36;
const expectedStart = 6;
const expectedLength = line.text.length - expectedStart;
element.annotate(el, lineNumberEl, line);
assert.isTrue(annotateElementStub.called);
const lastCall = annotateElementStub.lastCall;
assert.equal(lastCall.args[0], el);
assert.equal(lastCall.args[1], expectedStart);
assert.equal(lastCall.args[2], expectedLength);
assert.equal(
lastCall.args[3],
'gr-diff range rangeHighlight generated_a'
);
});
test('type=Both has-comment', () => {
line = new GrDiffLine(GrDiffLineType.BOTH);
line.beforeNumber = 36;
const expectedStart = 6;
const expectedLength = line.text.length - expectedStart;
element.annotate(el, lineNumberEl, line);
assert.isTrue(annotateElementStub.called);
const lastCall = annotateElementStub.lastCall;
assert.equal(lastCall.args[0], el);
assert.equal(lastCall.args[1], expectedStart);
assert.equal(lastCall.args[2], expectedLength);
assert.equal(
lastCall.args[3],
'gr-diff range rangeHighlight generated_a'
);
});
test('type=Both has-comment off side', () => {
line = new GrDiffLine(GrDiffLineType.BOTH);
line.beforeNumber = 36;
el.setAttribute('data-side', Side.RIGHT);
element.annotate(el, lineNumberEl, line);
assert.isFalse(annotateElementStub.called);
});
test('type=Add has-comment', () => {
line = new GrDiffLine(GrDiffLineType.ADD);
line.afterNumber = 12;
el.setAttribute('data-side', Side.RIGHT);
const expectedStart = 0;
const expectedLength = 22;
element.annotate(el, lineNumberEl, line);
assert.isTrue(annotateElementStub.called);
const lastCall = annotateElementStub.lastCall;
assert.equal(lastCall.args[0], el);
assert.equal(lastCall.args[1], expectedStart);
assert.equal(lastCall.args[2], expectedLength);
assert.equal(
lastCall.args[3],
'gr-diff range rangeHighlight generated_b'
);
});
test('long range comment', () => {
line = new GrDiffLine(GrDiffLineType.ADD);
line.afterNumber = 65;
el.setAttribute('data-side', Side.RIGHT);
element.annotate(el, lineNumberEl, line);
assert.isTrue(annotateElementStub.called);
assert.equal(
annotateElementStub.lastCall.args[3],
'gr-diff range generated_right-60-1-71-1'
);
});
test('do not annotate lines with end_character 0', () => {
line = new GrDiffLine(GrDiffLineType.BOTH);
line.afterNumber = 24;
el.setAttribute('data-side', Side.RIGHT);
element.annotate(el, lineNumberEl, line);
assert.isFalse(annotateElementStub.called);
});
test('updateRanges remove all', () => {
assertHasRange(rangeA, true);
assertHasRange(rangeB, true);
assertHasRange(rangeC, true);
assertHasRange(rangeD, true);
assertHasRange(rangeE, true);
element.updateRanges([]);
assertHasRange(rangeA, false);
assertHasRange(rangeB, false);
assertHasRange(rangeC, false);
assertHasRange(rangeD, false);
assertHasRange(rangeE, false);
});
test('updateRanges remove A and C', () => {
assertHasRange(rangeA, true);
assertHasRange(rangeB, true);
assertHasRange(rangeC, true);
assertHasRange(rangeD, true);
assertHasRange(rangeE, true);
element.updateRanges([rangeB, rangeD, rangeE]);
assertHasRange(rangeA, false);
assertHasRange(rangeB, true);
assertHasRange(rangeC, false);
assertHasRange(rangeD, true);
assertHasRange(rangeE, true);
});
test('updateRanges add B and D', () => {
element.updateRanges([]);
assertHasRange(rangeA, false);
assertHasRange(rangeB, false);
assertHasRange(rangeC, false);
assertHasRange(rangeD, false);
assertHasRange(rangeE, false);
element.updateRanges([rangeB, rangeD]);
assertHasRange(rangeA, false);
assertHasRange(rangeB, true);
assertHasRange(rangeC, false);
assertHasRange(rangeD, true);
assertHasRange(rangeE, false);
});
test('updateRanges add A, remove B', () => {
element.updateRanges([rangeB, rangeC]);
assertHasRange(rangeA, false);
assertHasRange(rangeB, true);
assertHasRange(rangeC, true);
element.updateRanges([rangeA, rangeC]);
assertHasRange(rangeA, true);
assertHasRange(rangeB, false);
assertHasRange(rangeC, true);
});
test('_getRangesForLine normalizes invalid ranges', () => {
const line = new GrDiffLine(GrDiffLineType.BOTH);
line.afterNumber = 55;
line.text = 'getRangesForLine normalizes invalid ranges';
const ranges = element.getRangesForLine(line, Side.RIGHT);
assert.equal(ranges.length, 1);
const range = ranges[0];
assert.isTrue(range.start < range.end, 'start and end are normalized');
assert.equal(range.end, line.text.length);
});
});
});