blob: ff0762e089b87512c46fe010d03219fc74260166 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="../resources/log-pause-location.js"></script>
<script>
// We may want to allow constants to eliminate branches. Use vars for existing tests and have constant specific tests.
var value = 1;
var truthy = true;
var falsey = false;
function a() { return value; }
function b() { return value; }
function entryIfSingleStatement() {
debugger;
if (truthy)
a();
if (falsey)
a();
}
function entryIfMultiStatement() {
debugger;
if (truthy) {
a();
a();
}
if (falsey) {
a();
a();
}
}
function entryIfElse() {
debugger;
if (truthy)
a();
else
a();
if (falsey)
a();
else
a();
}
function entryIfElseChain() {
debugger;
if (falsey)
a();
else if (truthy)
a();
else
a();
if (falsey)
a();
else if (falsey)
a();
else
a();
}
function entryIfWithCall() {
debugger;
if (a() && a())
a();
}
function entryTernary() {
let t = () => truthy;
let f = () => falsey;
debugger;
let x = t() ? a() : b();
let y = f() ? a() : b();
}
function entryIfConstantBranch() {
debugger;
if (true)
a();
if (false)
a();
if (0)
a();
if (null)
a();
}
function entryIfWithLogicalOperation() {
debugger;
if (true && a() && a())
b();
}
function entryIfWithBinaryOperation() {
let i = a();
debugger;
if (i < 2)
b();
}
function entryIfWithNotOperation() {
debugger;
if (!false)
a();
if (!!true)
a();
}
// ---------
function test()
{
let suite = InspectorTest.createAsyncSuite("Debugger.stepping.control-flow");
window.initializeSteppingTestSuite(suite);
addSteppingTestCase({
name: "Debugger.stepping.IfSingleStatement",
description: "Should be able to step through single statement body if statements.",
expression: "setTimeout(entryIfSingleStatement)",
steps: [
"over",
"over", // complete: if (true)
"over", // complete: a() inside if (true)
"over", // complete: if (false) - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfMultiStatement",
description: "Should be able to step through multiple statement body if statements.",
expression: "setTimeout(entryIfMultiStatement)",
steps: [
"over",
"over", // complete: if (true)
"over", // complete: 1st a()
"over", // complete: 2nd a()
"over", // complete: if (false) - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfElse1",
description: "Should be able to step through if/else.",
expression: "setTimeout(entryIfElse)",
steps: [
"over",
"over", // complete: if (true)
"over", // complete: a() inside if
"over", // complete: if (false)
"over", // complete: a() inside else - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfElse2",
description: "Should be able to step through if/else if/else chains.",
expression: "setTimeout(entryIfElseChain)",
steps: [
"over",
"over", // complete: if (false)
"over", // complete: else if (true)
"over", // complete: a() inside block
"over", // complete: if (false)
"over", // complete: else if (false)
"over", // complete: a() inside else - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfWithCall1",
description: "Should be able to step over if conditions with function calls.",
expression: "setTimeout(entryIfWithCall)",
steps: [
"over",
"over", // complete: if (a() && a())
"over", // complete: a() inside block - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfWithCall2",
description: "Should be able to step into calls in if conditions with function calls.",
expression: "setTimeout(entryIfWithCall)",
steps: [
"over",
"in", // into 1st a
"out", // out of a
"in", // into 2nd a
"out", // out of a
"over", // complete: a() inside block - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.TernaryStepOver",
description: "Should be able to step over ternary expressions.",
expression: "setTimeout(entryTernary)",
steps: [
"over",
"over", // complete: t() ? ...
"over", // complete: f() ? ...
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.TernaryStepIn",
description: "Should be able to step into ternary expressions.",
expression: "setTimeout(entryTernary)",
steps: [
"over",
"in", // into t
"out", // out of t - before a()
"in", // into a
"out", // out of a - before next ternary
"in", // into f
"out", // out of f - before b()
"in", // into b
"out", // out of b - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.ConstantBranch",
description: "Should pause for constant branches.",
expression: "setTimeout(entryIfConstantBranch)",
steps: [
"over",
"over", // (true)
"over", // a()
"over", // (false)
"over", // (0)
"over", // (null)
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfWithLogicalOperation",
description: "Should always pause for a condition with logical operations.",
expression: "setTimeout(entryIfWithLogicalOperation)",
steps: [
"over",
"in", // into a()
"out", // out of a() - before a()
"in", // into a()
"out", // out of a() - before b()
"over", // b() - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfWithBinaryOperation",
description: "Should always pause for a condition with logical operations.",
expression: "setTimeout(entryIfWithBinaryOperation)",
steps: [
"over",
"in", // i < 2 [true]
"over", // over b() - leaving entry
"resume",
]
});
addSteppingTestCase({
name: "Debugger.stepping.IfWithNotOperation",
description: "Should always pause for a condition that is a not operation.",
expression: "setTimeout(entryIfWithNotOperation)",
steps: [
"over",
"in", // !false
"over", // a()
"in", // !!truth
"over", // a() - leaving entry
"resume",
]
});
loadMainPageContent().then(() => {
suite.runTestCasesAndFinish();
});
}
</script>
</head>
<body onload="runTest()">
<p>Checking pause locations when stepping in, out, and over if/else control flow.</p>
</body>
</html>