jsx
Version:
a faster, safer, easier JavaScript
109 lines (84 loc) • 4.24 kB
JSX
import "js/nodejs.jsx";
import "test-case.jsx";
import "../../src/util.jsx";
import "../../src/jssourcemap.jsx";
import "../../src/jsx-command.jsx";
import "../../src/jsx-node-front.jsx";
import "../util/jslexer.jsx";
class _Test extends TestCase {
function testWithSourceMapConsumer() : void {
if(process.env["JSX_DISABLE_SOURCE_MAP_TEST"]) {
this.diag("skip source-map testing because: JSX_DISABLE_SOURCE_MAP_TEST is true");
return;
}
if ((process.env["JSX_OPTS"] ?: "").match(/\bminify\b/)) {
this.diag("skip source-map testing because: JSX_OPTS includes --minify");
return;
}
function search(a : JSToken[], predicate : (JSToken) -> boolean) : number {
for(var i = 0; i < a.length; ++i) {
if(predicate(a[i])) {
return i;
}
}
return -1;
}
var platform = new NodePlatform(".");
var jsxSourceFile = "t/src/source-map/hello.jsx";
var args = ["--enable-source-map", "--output", jsxSourceFile+".js", jsxSourceFile];
var statusCode = JSXCommand.main(platform, NodePlatform.getEnvOpts().concat(args));
this.expect(statusCode, "status code").toBe(0);
var source = JSLexer.tokenize("hello.jsx.js", platform.load(jsxSourceFile + ".js"));
var mapping = JSON.parse(platform.load(jsxSourceFile+".js.mapping"));
// mapping.file
this.expect(mapping['file'], "mapping.file").toBe("hello.jsx.js");
this.note("mapping.sources: " + JSON.stringify(mapping['sources']));
this.note("mapping.names: " + JSON.stringify(mapping['names']));
// mappping.sources
["hello.jsx", "timer.jsx"].forEach((file) -> {
var sources = mapping['sources'] as string[];
var found = sources.filter((x) -> { return x.slice(x.length - file.length) == file; });
this.expect(found.join(","), "mapping.sources includes " + file).notToBe("");
});
// source-map consumer
var consumer = new SourceMapConsumer(mapping);
var pos, orig;
this.note('search for "Hello, world!"');
pos = search(source, function (t) { return t.token == '"Hello, world!"'; });
this.note("generated (string literal)" + JSON.stringify(source[pos]));
orig = consumer.originalPositionFor(source[pos]);
this.note("original: " + JSON.stringify(orig));
this.expect(orig['line'], "orig.line").toBe(15);
this.expect(orig['column'], "orig.column").toBe(20);
this.expect(orig['name'], "orig.name").toBe(null);
this.expect(platform.fileExists("t/src/source-map/" + orig['source'] as string), orig['source'] as string + " exists").toBe(true);
this.note('search for 42');
pos = search(source, function (t) { return t.token == '42'; });
this.note("generated (number literal)" + JSON.stringify(source[pos]));
orig = consumer.originalPositionFor(source[pos]);
this.note("original: " + JSON.stringify(orig));
this.expect(orig['line'], "orig.line").toBe(7);
this.expect(orig['column'], "orig.column").toBe(14);
this.expect(orig['name'], "orig.name").toBe(null);
this.expect(platform.fileExists("t/src/source-map/" + orig['source'] as string), orig['source'] as string + " exists").toBe(true);
this.note('search for _Main');
pos = search(source, function (t) { return /^_Main\b/.test(t.token); });
this.note("generated (class): " + JSON.stringify(source[pos]));
orig = consumer.originalPositionFor(source[pos]);
this.note("original: " + JSON.stringify(orig));
this.expect(orig['line'], "orig.line").toBe(6);
this.expect(orig['column'], "orig.column").toBe(6);
this.expect(orig['name'], "orig.name").toBe("_Main");
this.expect(platform.fileExists("t/src/source-map/" + orig['source'] as string), orig['source'] as string + " exists").toBe(true);
this.note('search for "getFoo"');
pos = search(source, function (t) { return /\bgetFoo\b/.test(t.token); });
this.note("generated (member function): " + JSON.stringify(source[pos]));
orig = consumer.originalPositionFor(source[pos]);
this.note("original: " + JSON.stringify(orig));
this.expect(orig['line'], "orig.line").toBe(10);
this.expect(orig['column'], "orig.column").toBe(13);
this.expect(orig['name'], "orig.name").toBe("getFoo");
this.expect(platform.fileExists("t/src/source-map/" + orig['source'] as string), orig['source'] as string + " exists").toBe(true);
}
}
// vim: set noexpandtab: