blob: 9c2cc9d6c0dd52a44336116864b2ea6c8564c84c [file] [log] [blame]
/**
* @license
* Copyright 2022 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {DiffInfo, GrDiffLineType, Side} from '../../../api/diff';
import '../../../test/common-test-setup-karma';
import {SyntaxLayerLine} from '../../../types/syntax-worker-api';
import {GrDiffLine} from '../gr-diff/gr-diff-line';
import {GrSyntaxLayerWorker} from './gr-syntax-layer-worker';
const diff: DiffInfo = {
meta_a: {
name: 'somepath/somefile.js',
content_type: 'text/javascript',
lines: 3,
language: 'lang-left',
},
meta_b: {
name: 'somepath/somefile.js',
content_type: 'text/javascript',
lines: 4,
language: 'lang-right',
},
change_type: 'MODIFIED',
intraline_status: 'OK',
content: [
{
ab: ['import it;'],
},
{
b: ['b only'],
},
{
ab: [' public static final {', 'ab3'],
},
],
};
const leftRanges: SyntaxLayerLine[] = [
{ranges: [{start: 0, length: 6, className: 'literal'}]},
{ranges: []},
{ranges: []},
];
const rightRanges: SyntaxLayerLine[] = [
{ranges: []},
{ranges: []},
{
ranges: [
{start: 0, length: 2, className: 'not-safe'},
{start: 2, length: 6, className: 'literal'},
{start: 9, length: 6, className: 'keyword'},
{start: 16, length: 5, className: 'name'},
],
},
{ranges: []},
];
suite('gr-syntax-layer-worker tests', () => {
let layer: GrSyntaxLayerWorker;
let listener: sinon.SinonStub;
const annotate = (side: Side, lineNumber: number, text: string) => {
const el = document.createElement('div');
const lineNumberEl = document.createElement('td');
el.setAttribute('data-side', side);
el.innerText = text;
const line = new GrDiffLine(GrDiffLineType.BOTH);
if (side === Side.LEFT) line.beforeNumber = lineNumber;
if (side === Side.RIGHT) line.afterNumber = lineNumber;
layer.annotate(el, lineNumberEl, line);
return el;
};
setup(() => {
layer = new GrSyntaxLayerWorker();
listener = sinon.stub();
layer.addListener(listener);
sinon.stub(layer, 'highlight').callsFake((lang?: string) => {
if (lang === 'lang-left') return Promise.resolve(leftRanges);
if (lang === 'lang-right') return Promise.resolve(rightRanges);
return Promise.resolve([]);
});
layer.init(diff);
});
test('process and annotate line 2 LEFT', async () => {
await layer.process();
const el = annotate(Side.LEFT, 1, 'import it;');
assert.equal(
el.innerHTML,
'<hl class="gr-diff gr-syntax gr-syntax-literal">import</hl> it;'
);
assert.equal(listener.callCount, 2);
assert.equal(listener.getCall(0).args[0], 1);
assert.equal(listener.getCall(0).args[1], 1);
assert.equal(listener.getCall(0).args[2], Side.LEFT);
assert.equal(listener.getCall(1).args[0], 3);
assert.equal(listener.getCall(1).args[1], 3);
assert.equal(listener.getCall(1).args[2], Side.RIGHT);
});
test('process and annotate line 3 RIGHT', async () => {
await layer.process();
const el = annotate(Side.RIGHT, 3, ' public static final {');
assert.equal(
el.innerHTML,
' <hl class="gr-diff gr-syntax gr-syntax-literal">public</hl> ' +
'<hl class="gr-diff gr-syntax gr-syntax-keyword">static</hl> ' +
'<hl class="gr-diff gr-syntax gr-syntax-name">final</hl> {'
);
assert.equal(listener.callCount, 2);
});
});