michael@0: /* michael@0: * WARNING! michael@0: * michael@0: * Do not edit this file directly, it is built from the sources at michael@0: * https://github.com/mozilla/source-map/ michael@0: */ michael@0: michael@0: Components.utils.import('resource://test/Utils.jsm'); michael@0: /* -*- Mode: js; js-indent-level: 2; -*- */ michael@0: /* michael@0: * Copyright 2011 Mozilla Foundation and contributors michael@0: * Licensed under the New BSD license. See LICENSE or: michael@0: * http://opensource.org/licenses/BSD-3-Clause michael@0: */ michael@0: define("test/source-map/test-source-map-consumer", ["require", "exports", "module"], function (require, exports, module) { michael@0: michael@0: var SourceMapConsumer = require('source-map/source-map-consumer').SourceMapConsumer; michael@0: var SourceMapGenerator = require('source-map/source-map-generator').SourceMapGenerator; michael@0: michael@0: exports['test that we can instantiate with a string or an objects'] = function (assert, util) { michael@0: assert.doesNotThrow(function () { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: }); michael@0: assert.doesNotThrow(function () { michael@0: var map = new SourceMapConsumer(JSON.stringify(util.testMap)); michael@0: }); michael@0: }; michael@0: michael@0: exports['test that the `sources` field has the original sources'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: var sources = map.sources; michael@0: michael@0: assert.equal(sources[0], '/the/root/one.js'); michael@0: assert.equal(sources[1], '/the/root/two.js'); michael@0: assert.equal(sources.length, 2); michael@0: }; michael@0: michael@0: exports['test that the source root is reflected in a mapping\'s source field'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: var mapping; michael@0: michael@0: mapping = map.originalPositionFor({ michael@0: line: 2, michael@0: column: 1 michael@0: }); michael@0: assert.equal(mapping.source, '/the/root/two.js'); michael@0: michael@0: mapping = map.originalPositionFor({ michael@0: line: 1, michael@0: column: 1 michael@0: }); michael@0: assert.equal(mapping.source, '/the/root/one.js'); michael@0: }; michael@0: michael@0: exports['test mapping tokens back exactly'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: michael@0: util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, map, assert); michael@0: util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, map, assert); michael@0: util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, map, assert); michael@0: util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', map, assert); michael@0: util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, map, assert); michael@0: util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', map, assert); michael@0: util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', map, assert); michael@0: michael@0: util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, map, assert); michael@0: util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, map, assert); michael@0: util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, map, assert); michael@0: util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', map, assert); michael@0: util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, map, assert); michael@0: util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', map, assert); michael@0: }; michael@0: michael@0: exports['test mapping tokens fuzzy'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: michael@0: // Finding original positions michael@0: util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', map, assert, true); michael@0: util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', map, assert, true); michael@0: util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, map, assert, true); michael@0: michael@0: // Finding generated positions michael@0: util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', map, assert, null, true); michael@0: util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', map, assert, null, true); michael@0: util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, map, assert, null, true); michael@0: }; michael@0: michael@0: exports['test creating source map consumers with )]}\' prefix'] = function (assert, util) { michael@0: assert.doesNotThrow(function () { michael@0: var map = new SourceMapConsumer(")]}'" + JSON.stringify(util.testMap)); michael@0: }); michael@0: }; michael@0: michael@0: exports['test eachMapping'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: var previousLine = -Infinity; michael@0: var previousColumn = -Infinity; michael@0: map.eachMapping(function (mapping) { michael@0: assert.ok(mapping.generatedLine >= previousLine); michael@0: michael@0: if (mapping.source) { michael@0: assert.equal(mapping.source.indexOf(util.testMap.sourceRoot), 0); michael@0: } michael@0: michael@0: if (mapping.generatedLine === previousLine) { michael@0: assert.ok(mapping.generatedColumn >= previousColumn); michael@0: previousColumn = mapping.generatedColumn; michael@0: } michael@0: else { michael@0: previousLine = mapping.generatedLine; michael@0: previousColumn = -Infinity; michael@0: } michael@0: }); michael@0: }; michael@0: michael@0: exports['test iterating over mappings in a different order'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: var previousLine = -Infinity; michael@0: var previousColumn = -Infinity; michael@0: var previousSource = ""; michael@0: map.eachMapping(function (mapping) { michael@0: assert.ok(mapping.source >= previousSource); michael@0: michael@0: if (mapping.source === previousSource) { michael@0: assert.ok(mapping.originalLine >= previousLine); michael@0: michael@0: if (mapping.originalLine === previousLine) { michael@0: assert.ok(mapping.originalColumn >= previousColumn); michael@0: previousColumn = mapping.originalColumn; michael@0: } michael@0: else { michael@0: previousLine = mapping.originalLine; michael@0: previousColumn = -Infinity; michael@0: } michael@0: } michael@0: else { michael@0: previousSource = mapping.source; michael@0: previousLine = -Infinity; michael@0: previousColumn = -Infinity; michael@0: } michael@0: }, null, SourceMapConsumer.ORIGINAL_ORDER); michael@0: }; michael@0: michael@0: exports['test that we can set the context for `this` in eachMapping'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMap); michael@0: var context = {}; michael@0: map.eachMapping(function () { michael@0: assert.equal(this, context); michael@0: }, context); michael@0: }; michael@0: michael@0: exports['test that the `sourcesContent` field has the original sources'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMapWithSourcesContent); michael@0: var sourcesContent = map.sourcesContent; michael@0: michael@0: assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };'); michael@0: assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };'); michael@0: assert.equal(sourcesContent.length, 2); michael@0: }; michael@0: michael@0: exports['test that we can get the original sources for the sources'] = function (assert, util) { michael@0: var map = new SourceMapConsumer(util.testMapWithSourcesContent); michael@0: var sources = map.sources; michael@0: michael@0: assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); michael@0: assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); michael@0: assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); michael@0: assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); michael@0: assert.throws(function () { michael@0: map.sourceContentFor(""); michael@0: }, Error); michael@0: assert.throws(function () { michael@0: map.sourceContentFor("/the/root/three.js"); michael@0: }, Error); michael@0: assert.throws(function () { michael@0: map.sourceContentFor("three.js"); michael@0: }, Error); michael@0: }; michael@0: michael@0: exports['test sourceRoot + generatedPositionFor'] = function (assert, util) { michael@0: var map = new SourceMapGenerator({ michael@0: sourceRoot: 'foo/bar', michael@0: file: 'baz.js' michael@0: }); michael@0: map.addMapping({ michael@0: original: { line: 1, column: 1 }, michael@0: generated: { line: 2, column: 2 }, michael@0: source: 'bang.coffee' michael@0: }); michael@0: map.addMapping({ michael@0: original: { line: 5, column: 5 }, michael@0: generated: { line: 6, column: 6 }, michael@0: source: 'bang.coffee' michael@0: }); michael@0: map = new SourceMapConsumer(map.toString()); michael@0: michael@0: // Should handle without sourceRoot. michael@0: var pos = map.generatedPositionFor({ michael@0: line: 1, michael@0: column: 1, michael@0: source: 'bang.coffee' michael@0: }); michael@0: michael@0: assert.equal(pos.line, 2); michael@0: assert.equal(pos.column, 2); michael@0: michael@0: // Should handle with sourceRoot. michael@0: var pos = map.generatedPositionFor({ michael@0: line: 1, michael@0: column: 1, michael@0: source: 'foo/bar/bang.coffee' michael@0: }); michael@0: michael@0: assert.equal(pos.line, 2); michael@0: assert.equal(pos.column, 2); michael@0: }; michael@0: michael@0: exports['test sourceRoot + originalPositionFor'] = function (assert, util) { michael@0: var map = new SourceMapGenerator({ michael@0: sourceRoot: 'foo/bar', michael@0: file: 'baz.js' michael@0: }); michael@0: map.addMapping({ michael@0: original: { line: 1, column: 1 }, michael@0: generated: { line: 2, column: 2 }, michael@0: source: 'bang.coffee' michael@0: }); michael@0: map = new SourceMapConsumer(map.toString()); michael@0: michael@0: var pos = map.originalPositionFor({ michael@0: line: 2, michael@0: column: 2, michael@0: }); michael@0: michael@0: // Should always have the prepended source root michael@0: assert.equal(pos.source, 'foo/bar/bang.coffee'); michael@0: assert.equal(pos.line, 1); michael@0: assert.equal(pos.column, 1); michael@0: }; michael@0: michael@0: exports['test github issue #56'] = function (assert, util) { michael@0: var map = new SourceMapGenerator({ michael@0: sourceRoot: 'http://', michael@0: file: 'www.example.com/foo.js' michael@0: }); michael@0: map.addMapping({ michael@0: original: { line: 1, column: 1 }, michael@0: generated: { line: 2, column: 2 }, michael@0: source: 'www.example.com/original.js' michael@0: }); michael@0: map = new SourceMapConsumer(map.toString()); michael@0: michael@0: var sources = map.sources; michael@0: assert.equal(sources.length, 1); michael@0: assert.equal(sources[0], 'http://www.example.com/original.js'); michael@0: }; michael@0: michael@0: exports['test github issue #43'] = function (assert, util) { michael@0: var map = new SourceMapGenerator({ michael@0: sourceRoot: 'http://example.com', michael@0: file: 'foo.js' michael@0: }); michael@0: map.addMapping({ michael@0: original: { line: 1, column: 1 }, michael@0: generated: { line: 2, column: 2 }, michael@0: source: 'http://cdn.example.com/original.js' michael@0: }); michael@0: map = new SourceMapConsumer(map.toString()); michael@0: michael@0: var sources = map.sources; michael@0: assert.equal(sources.length, 1, michael@0: 'Should only be one source.'); michael@0: assert.equal(sources[0], 'http://cdn.example.com/original.js', michael@0: 'Should not be joined with the sourceRoot.'); michael@0: }; michael@0: michael@0: exports['test absolute path, but same host sources'] = function (assert, util) { michael@0: var map = new SourceMapGenerator({ michael@0: sourceRoot: 'http://example.com/foo/bar', michael@0: file: 'foo.js' michael@0: }); michael@0: map.addMapping({ michael@0: original: { line: 1, column: 1 }, michael@0: generated: { line: 2, column: 2 }, michael@0: source: '/original.js' michael@0: }); michael@0: map = new SourceMapConsumer(map.toString()); michael@0: michael@0: var sources = map.sources; michael@0: assert.equal(sources.length, 1, michael@0: 'Should only be one source.'); michael@0: assert.equal(sources[0], 'http://example.com/original.js', michael@0: 'Source should be relative the host of the source root.'); michael@0: }; michael@0: michael@0: exports['test github issue #64'] = function (assert, util) { michael@0: var map = new SourceMapConsumer({ michael@0: "version": 3, michael@0: "file": "foo.js", michael@0: "sourceRoot": "http://example.com/", michael@0: "sources": ["/a"], michael@0: "names": [], michael@0: "mappings": "AACA", michael@0: "sourcesContent": ["foo"] michael@0: }); michael@0: michael@0: assert.equal(map.sourceContentFor("a"), "foo"); michael@0: assert.equal(map.sourceContentFor("/a"), "foo"); michael@0: }; michael@0: michael@0: exports['test bug 885597'] = function (assert, util) { michael@0: var map = new SourceMapConsumer({ michael@0: "version": 3, michael@0: "file": "foo.js", michael@0: "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/", michael@0: "sources": ["/a"], michael@0: "names": [], michael@0: "mappings": "AACA", michael@0: "sourcesContent": ["foo"] michael@0: }); michael@0: michael@0: var s = map.sources[0]; michael@0: assert.equal(map.sourceContentFor(s), "foo"); michael@0: }; michael@0: michael@0: exports['test github issue #72, duplicate sources'] = function (assert, util) { michael@0: var map = new SourceMapConsumer({ michael@0: "version": 3, michael@0: "file": "foo.js", michael@0: "sources": ["source1.js", "source1.js", "source3.js"], michael@0: "names": [], michael@0: "mappings": ";EAAC;;IAEE;;MEEE", michael@0: "sourceRoot": "http://example.com" michael@0: }); michael@0: michael@0: var pos = map.originalPositionFor({ michael@0: line: 2, michael@0: column: 2 michael@0: }); michael@0: assert.equal(pos.source, 'http://example.com/source1.js'); michael@0: assert.equal(pos.line, 1); michael@0: assert.equal(pos.column, 1); michael@0: michael@0: var pos = map.originalPositionFor({ michael@0: line: 4, michael@0: column: 4 michael@0: }); michael@0: assert.equal(pos.source, 'http://example.com/source1.js'); michael@0: assert.equal(pos.line, 3); michael@0: assert.equal(pos.column, 3); michael@0: michael@0: var pos = map.originalPositionFor({ michael@0: line: 6, michael@0: column: 6 michael@0: }); michael@0: assert.equal(pos.source, 'http://example.com/source3.js'); michael@0: assert.equal(pos.line, 5); michael@0: assert.equal(pos.column, 5); michael@0: }; michael@0: michael@0: exports['test github issue #72, duplicate names'] = function (assert, util) { michael@0: var map = new SourceMapConsumer({ michael@0: "version": 3, michael@0: "file": "foo.js", michael@0: "sources": ["source.js"], michael@0: "names": ["name1", "name1", "name3"], michael@0: "mappings": ";EAACA;;IAEEA;;MAEEE", michael@0: "sourceRoot": "http://example.com" michael@0: }); michael@0: michael@0: var pos = map.originalPositionFor({ michael@0: line: 2, michael@0: column: 2 michael@0: }); michael@0: assert.equal(pos.name, 'name1'); michael@0: assert.equal(pos.line, 1); michael@0: assert.equal(pos.column, 1); michael@0: michael@0: var pos = map.originalPositionFor({ michael@0: line: 4, michael@0: column: 4 michael@0: }); michael@0: assert.equal(pos.name, 'name1'); michael@0: assert.equal(pos.line, 3); michael@0: assert.equal(pos.column, 3); michael@0: michael@0: var pos = map.originalPositionFor({ michael@0: line: 6, michael@0: column: 6 michael@0: }); michael@0: assert.equal(pos.name, 'name3'); michael@0: assert.equal(pos.line, 5); michael@0: assert.equal(pos.column, 5); michael@0: }; michael@0: michael@0: exports['test SourceMapConsumer.fromSourceMap'] = function (assert, util) { michael@0: var smg = new SourceMapGenerator({ michael@0: sourceRoot: 'http://example.com/', michael@0: file: 'foo.js' michael@0: }); michael@0: smg.addMapping({ michael@0: original: { line: 1, column: 1 }, michael@0: generated: { line: 2, column: 2 }, michael@0: source: 'bar.js' michael@0: }); michael@0: smg.addMapping({ michael@0: original: { line: 2, column: 2 }, michael@0: generated: { line: 4, column: 4 }, michael@0: source: 'baz.js', michael@0: name: 'dirtMcGirt' michael@0: }); michael@0: smg.setSourceContent('baz.js', 'baz.js content'); michael@0: michael@0: var smc = SourceMapConsumer.fromSourceMap(smg); michael@0: assert.equal(smc.file, 'foo.js'); michael@0: assert.equal(smc.sourceRoot, 'http://example.com/'); michael@0: assert.equal(smc.sources.length, 2); michael@0: assert.equal(smc.sources[0], 'http://example.com/bar.js'); michael@0: assert.equal(smc.sources[1], 'http://example.com/baz.js'); michael@0: assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content'); michael@0: michael@0: var pos = smc.originalPositionFor({ michael@0: line: 2, michael@0: column: 2 michael@0: }); michael@0: assert.equal(pos.line, 1); michael@0: assert.equal(pos.column, 1); michael@0: assert.equal(pos.source, 'http://example.com/bar.js'); michael@0: assert.equal(pos.name, null); michael@0: michael@0: pos = smc.generatedPositionFor({ michael@0: line: 1, michael@0: column: 1, michael@0: source: 'http://example.com/bar.js' michael@0: }); michael@0: assert.equal(pos.line, 2); michael@0: assert.equal(pos.column, 2); michael@0: michael@0: pos = smc.originalPositionFor({ michael@0: line: 4, michael@0: column: 4 michael@0: }); michael@0: assert.equal(pos.line, 2); michael@0: assert.equal(pos.column, 2); michael@0: assert.equal(pos.source, 'http://example.com/baz.js'); michael@0: assert.equal(pos.name, 'dirtMcGirt'); michael@0: michael@0: pos = smc.generatedPositionFor({ michael@0: line: 2, michael@0: column: 2, michael@0: source: 'http://example.com/baz.js' michael@0: }); michael@0: assert.equal(pos.line, 4); michael@0: assert.equal(pos.column, 4); michael@0: }; michael@0: }); michael@0: function run_test() { michael@0: runSourceMapTests('test/source-map/test-source-map-consumer', do_throw); michael@0: }