blob: 866d9a19cc2b6952a45941dfcd14eb2376262904 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as SourceMapEncoder from './SourceMapEncoder.js';
describe('SourceMapEncoder', () => {
it('translates numbers to Base64 VLQ correctly', () => {
assert.strictEqual(SourceMapEncoder.encodeVlq(0), 'A');
assert.strictEqual(SourceMapEncoder.encodeVlq(-2), 'F');
assert.strictEqual(SourceMapEncoder.encodeVlq(41), 'yC');
assert.strictEqual(SourceMapEncoder.encodeVlq(-25), 'zB');
});
it('translates number lists correctly', () => {
// Let us test the cases we care about in source maps.
// Encoding of column-only mapping.
assert.strictEqual('A', SourceMapEncoder.encodeVlqList([0]));
assert.strictEqual('oG', SourceMapEncoder.encodeVlqList([100]));
// Encoding of column => source:line:column mapping.
assert.strictEqual('w+BoGUwM', SourceMapEncoder.encodeVlqList([1000, 100, 10, 200]));
assert.strictEqual('DFHJ', SourceMapEncoder.encodeVlqList([-1, -2, -3, -4]));
// Encoding of column => source:line:column@name mapping.
assert.strictEqual('CEGIK', SourceMapEncoder.encodeVlqList([1, 2, 3, 4, 5]));
assert.strictEqual('qGsGuGwGyG', SourceMapEncoder.encodeVlqList([101, 102, 103, 104, 105]));
});
it('can encode trivial source maps correctly', () => {
// Test trivial cases.
assert.deepEqual(
{
sources: [],
names: [],
mappings: 'A',
version: 3,
},
SourceMapEncoder.encodeSourceMap(['0:0']));
assert.deepEqual(
{
sources: ['a.js'],
names: [],
mappings: 'AAAA',
version: 3,
},
SourceMapEncoder.encodeSourceMap(['0:0 => a.js:0:0']));
assert.deepEqual(
{
sources: ['a.js'],
names: ['b'],
mappings: 'AAAAA',
version: 3,
},
SourceMapEncoder.encodeSourceMap(['0:0 => a.js:0:0@b']));
});
it('can encode multiple lines correctly', () => {
// Next line encoding.
assert.strictEqual('AAAA;AACA', SourceMapEncoder.encodeSourceMap(['0:0 => a.js:0:0', '1:0 => a.js:1:0']).mappings);
assert.strictEqual('A;A', SourceMapEncoder.encodeSourceMap(['0:0', '1:0']).mappings);
// Skipping lines.
assert.strictEqual(';A;;;A', SourceMapEncoder.encodeSourceMap(['1:0', '4:0']).mappings);
assert.strictEqual(
';AACA;;;AAEA', SourceMapEncoder.encodeSourceMap(['1:0 => a.js:1:0', '4:0 => a.js:3:0']).mappings);
});
it('can encode relative offset mappings correctly', () => {
// Relative columns.
assert.strictEqual(
'AAAA,EAAI,IAAD',
SourceMapEncoder.encodeSourceMap(['0:0 => a.js:0:0', '0:2 => a.js:0:4', '0:6 => a.js:0:3']).mappings);
// Reset after new line.
assert.strictEqual(
'AAAA,EAAC;MAAE',
SourceMapEncoder.encodeSourceMap(['0:0 => a.js:0:0', '0:2 => a.js:0:1', '1:6 => a.js:0:3']).mappings);
// Relative source, source line and source column.
assert.deepEqual(
{
sources: ['a.js', 'b.js', 'c.js'],
names: [],
mappings: 'CACC;CCEC;CCFC;CDAH',
version: 3,
},
SourceMapEncoder.encodeSourceMap(['0:1 => a.js:1:1', '1:1 => b.js:3:2', '2:1 => c.js:1:3', '3:1 => b.js:1:0']));
});
it('can encode names correctly', () => {
assert.deepEqual(
{
sources: ['a.js'],
names: ['a', 'b', 'c'],
mappings: 'AAAAA;AACAC;AACAC;AACAF',
version: 3,
},
SourceMapEncoder.encodeSourceMap(
['0:0 => a.js:0:0@a', '1:0 => a.js:1:0@b', '2:0 => a.js:2:0@c', '3:0 => a.js:3:0@a']));
});
it('can encode small realistic samples correctly', () => {
assert.deepEqual(
{
sources: ['example.js'],
names: ['a', 'b', 'c', 'd'],
mappings: 'AAASA,QAAAA,IAAG,CAACC,CAAD,CAAaC,CAAb,CACZ,CACI,MAAOD,EAAP,CAAoBC,CADxB,CAIA,IAAIC,OAAS;A',
version: 3,
},
SourceMapEncoder.encodeSourceMap([
// clang-format off
'0:0 => example.js:0:9@a',
'0:8 => example.js:0:9@a',
'0:12 => example.js:0:12',
'0:13 => example.js:0:13@b',
'0:14 => example.js:0:12',
'0:15 => example.js:0:25@c',
'0:16 => example.js:0:12',
'0:17 => example.js:1:0',
'0:18 => example.js:2:4',
'0:24 => example.js:2:11@b',
'0:26 => example.js:2:4',
'0:27 => example.js:2:24@c',
'0:28 => example.js:1:0',
'0:29 => example.js:5:0',
'0:33 => example.js:5:4@d',
'0:40 => example.js:5:13',
'1:0',
// clang-format on
]));
assert.deepEqual(
{
sources: ['sourcemap-stepping-source.js'],
names: [],
mappings:
'AAAA,oCAAoC;;AAEpC;GACG;GAAA;GAAA;GACA;GAAA;GAAA;GACA;GAAA;GAAA;;GAEA;AACH;;AAEA;GACG;GACA;GACA;;GAEA;AACH',
version: 3,
},
SourceMapEncoder.encodeSourceMap([
// clang-format off
'0:0 => sourcemap-stepping-source.js:0:0',
'0:36 => sourcemap-stepping-source.js:0:36',
'2:0 => sourcemap-stepping-source.js:2:0',
'3:3 => sourcemap-stepping-source.js:3:3',
'4:3 => sourcemap-stepping-source.js:3:3',
'5:3 => sourcemap-stepping-source.js:3:3',
'6:3 => sourcemap-stepping-source.js:4:3',
'7:3 => sourcemap-stepping-source.js:4:3',
'8:3 => sourcemap-stepping-source.js:4:3',
'9:3 => sourcemap-stepping-source.js:5:3',
'10:3 => sourcemap-stepping-source.js:5:3',
'11:3 => sourcemap-stepping-source.js:5:3',
'13:3 => sourcemap-stepping-source.js:7:3',
'14:0 => sourcemap-stepping-source.js:8:0',
'16:0 => sourcemap-stepping-source.js:10:0',
'17:3 => sourcemap-stepping-source.js:11:3',
'18:3 => sourcemap-stepping-source.js:12:3',
'19:3 => sourcemap-stepping-source.js:13:3',
'21:3 => sourcemap-stepping-source.js:15:3',
'22:0 => sourcemap-stepping-source.js:16:0',
// clang-format on
]));
});
});