191 lines
7.9 KiB
HTML
191 lines
7.9 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
|
|
<script>
|
|
function test()
|
|
{
|
|
function outputErrorSourceRange(range) {
|
|
var str = " ".repeat("Source: ".length);
|
|
str += " ".repeat(range.startOffset);
|
|
str += "^";
|
|
str += "~".repeat(Math.max(range.endOffset - range.startOffset - 1, 0));
|
|
InspectorTest.log(str);
|
|
}
|
|
|
|
let suite = InspectorTest.createAsyncSuite("Runtime.parse");
|
|
|
|
suite.addTestCase({
|
|
name: "SyntaxErrorType.None",
|
|
description: "Test source without an issue.",
|
|
test(resolve, reject) {
|
|
function testSource(source) {
|
|
RuntimeAgent.parse(source, (error, result, message, range) => {
|
|
InspectorTest.assert(!error, "Should not be a protocol error.");
|
|
InspectorTest.expectThat(result === InspectorBackend.Enum.Runtime.SyntaxErrorType.None, "Should be SyntaxErrorType None.");
|
|
InspectorTest.log("Source: " + source);
|
|
InspectorTest.assert(!message);
|
|
InspectorTest.assert(!range);
|
|
InspectorTest.log("");
|
|
});
|
|
}
|
|
|
|
// Complete programs without syntax errors (could have runtime errors).
|
|
testSource("");
|
|
testSource(";");
|
|
testSource("myVariable");
|
|
testSource("var x = 1; x");
|
|
testSource("[1,2,3]");
|
|
testSource("({})");
|
|
testSource("({prop:true}).x.x.x");
|
|
testSource("if(1)1");
|
|
InspectorBackend.runAfterPendingDispatches(resolve);
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "SyntaxErrorType.UnterminatedLiteral",
|
|
description: "Test source with an unterminated literal.",
|
|
test(resolve, reject) {
|
|
function testSource(source) {
|
|
RuntimeAgent.parse(source, (error, result, message, range) => {
|
|
InspectorTest.assert(!error, "Should not be a protocol error.");
|
|
InspectorTest.expectThat(result === InspectorBackend.Enum.Runtime.SyntaxErrorType.UnterminatedLiteral, "Should be SyntaxErrorType UnterminatedLiteral.");
|
|
InspectorTest.log("Source: " + source);
|
|
outputErrorSourceRange(range);
|
|
InspectorTest.log("Error Message: " + message);
|
|
InspectorTest.log("Range: " + JSON.stringify(range));
|
|
InspectorTest.log("");
|
|
});
|
|
}
|
|
|
|
// A literal that is not yet complete, but would be a single token.
|
|
testSource("0b"); // binary
|
|
testSource("0o"); // octal
|
|
testSource("0x"); // hex
|
|
testSource("1e"); // scientific notation number
|
|
testSource("'"); // string
|
|
testSource("\""); // string
|
|
testSource("var \\u007"); // identifier unicode escape
|
|
// testSource("/r"); // regexp - Not detected by JavaScriptCore.
|
|
InspectorBackend.runAfterPendingDispatches(resolve);
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "SyntaxErrorType.Recoverable",
|
|
description: "Test source with a recoverable error.",
|
|
test(resolve, reject) {
|
|
function testSource(source) {
|
|
RuntimeAgent.parse(source, (error, result, message, range) => {
|
|
InspectorTest.assert(!error, "Should not be a protocol error.");
|
|
InspectorTest.expectThat(result === InspectorBackend.Enum.Runtime.SyntaxErrorType.Recoverable, "Should be SyntaxErrorType Recoverable.");
|
|
InspectorTest.log("Source: " + source);
|
|
outputErrorSourceRange(range);
|
|
InspectorTest.log("Error Message: " + message);
|
|
InspectorTest.log("Error Range: " + JSON.stringify(range));
|
|
InspectorTest.log("");
|
|
});
|
|
}
|
|
|
|
// Not yet a syntax error, just an incomplete program.
|
|
testSource("(");
|
|
testSource("{");
|
|
testSource("!");
|
|
testSource("-"); // unary
|
|
testSource("+"); // unary
|
|
testSource("~"); // unary
|
|
testSource("1,");
|
|
testSource("var");
|
|
testSource("'use strict'; let"); // When not in strict mode, let is treated as the start of an identifier, not a keyword!
|
|
testSource("const");
|
|
testSource("var {x"); // destructuring
|
|
testSource("var [x"); // destructuring
|
|
testSource("var x,");
|
|
testSource("if(1)");
|
|
testSource("if(1){");
|
|
testSource("if(1){}else");
|
|
testSource("if(1){}else{");
|
|
testSource("while(1)");
|
|
testSource("while(1){");
|
|
testSource("for(;;)");
|
|
testSource("for(;;){");
|
|
testSource("()=>"); // arrow function
|
|
testSource("()=>{"); // arrow function
|
|
testSource("/*"); // comment
|
|
testSource("`"); // template string
|
|
testSource("`${1}"); // template string
|
|
testSource("`${"); // template string
|
|
testSource("function");
|
|
testSource("function foo");
|
|
testSource("function foo(");
|
|
testSource("function foo(){");
|
|
testSource("(function() {");
|
|
testSource("(function() {}");
|
|
testSource("(function() {})(");
|
|
testSource("switch(x)");
|
|
testSource("switch(x){");
|
|
testSource("switch(x){case");
|
|
testSource("switch(x){case 1");
|
|
testSource("switch(x){case 1:");
|
|
testSource("class");
|
|
testSource("class Klass");
|
|
testSource("class Klass {");
|
|
testSource("var x = {");
|
|
testSource("var x = {prop");
|
|
testSource("var x = {prop:");
|
|
testSource("var x = {prop:123");
|
|
testSource("var x = {prop:123 ");
|
|
testSource("var x = {prop:123,");
|
|
testSource("var x = {prop:123, ");
|
|
testSource("var x = {prop:123, 'prop2'");
|
|
testSource("var x = {prop:123, [12");
|
|
testSource("var x = {prop:123, [12]");
|
|
testSource("var x = {prop:123, [12]:");
|
|
testSource("var x = {prop:123, [12]:567");
|
|
testSource("var x = [");
|
|
testSource("var x = [1");
|
|
testSource("var x = [1,");
|
|
testSource("var x = [1,[]");
|
|
testSource("var x = [1,{}");
|
|
InspectorBackend.runAfterPendingDispatches(resolve);
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "SyntaxErrorType.Irrecoverable",
|
|
description: "Test source with an irrecoverable issue.",
|
|
test(resolve, reject) {
|
|
function testSource(source) {
|
|
RuntimeAgent.parse(source, (error, result, message, range) => {
|
|
InspectorTest.assert(!error, "Should not be a protocol error.");
|
|
InspectorTest.expectThat(result === InspectorBackend.Enum.Runtime.SyntaxErrorType.Irrecoverable, "Should be SyntaxErrorType Irrecoverable.");
|
|
InspectorTest.log("Source: " + source);
|
|
outputErrorSourceRange(range);
|
|
InspectorTest.log("Error Message: " + message);
|
|
InspectorTest.log("Error Range: " + JSON.stringify(range));
|
|
InspectorTest.log("");
|
|
});
|
|
}
|
|
|
|
// SyntaxErrors. Any typing after the syntax error is detected does not matter.
|
|
testSource("1$");
|
|
testSource("var x = {}}");
|
|
testSource("({}))");
|
|
testSource("var x = =");
|
|
testSource("const x;");
|
|
testSource("let x = 1; let x = 2;");
|
|
testSource("if x(1)");
|
|
InspectorBackend.runAfterPendingDispatches(resolve);
|
|
}
|
|
});
|
|
|
|
suite.runTestCasesAndFinish();
|
|
}
|
|
</script>
|
|
</head>
|
|
<body onload="runTest()">
|
|
<p>Tests for the Runtime.parse command.</p>
|
|
</body>
|
|
</html>
|