load("./driver/driver.js"); function foo() {} function bar() {} function baz() {} function testIf(x) { if (x < 10) { foo(); } else if (x < 20) { bar(); } else { baz() } } testIf(9); // Note, the check will be against the basic block that contains the first matched character. // So in this following case, the block that contains the '{'. checkBasicBlock(testIf, "{ foo", ShouldHaveExecuted); // In this case, it will test the basic block that contains the ' ' character. checkBasicBlock(testIf, " foo", ShouldHaveExecuted); checkBasicBlock(testIf, "} else if", ShouldHaveExecuted); checkBasicBlock(testIf, "else if", ShouldNotHaveExecuted); checkBasicBlock(testIf, "{ bar", ShouldNotHaveExecuted); checkBasicBlock(testIf, " bar", ShouldNotHaveExecuted); checkBasicBlock(testIf, "else {", ShouldNotHaveExecuted); checkBasicBlock(testIf, "{ baz", ShouldNotHaveExecuted); checkBasicBlock(testIf, " baz", ShouldNotHaveExecuted); testIf(21); checkBasicBlock(testIf, "else if (x < 20)", ShouldHaveExecuted); checkBasicBlock(testIf, "{ bar", ShouldNotHaveExecuted); checkBasicBlock(testIf, " bar", ShouldNotHaveExecuted); checkBasicBlock(testIf, "else {", ShouldHaveExecuted); checkBasicBlock(testIf, "{ baz", ShouldHaveExecuted); checkBasicBlock(testIf, " baz", ShouldHaveExecuted); testIf(11); checkBasicBlock(testIf, "{ bar", ShouldHaveExecuted); checkBasicBlock(testIf, " bar", ShouldHaveExecuted); function testForRegular(x) { for (var i = 0; i < x; i++) { foo(); } bar(); } testForRegular(0); checkBasicBlock(testForRegular, "{ foo", ShouldNotHaveExecuted); checkBasicBlock(testForRegular, "} bar", ShouldNotHaveExecuted); checkBasicBlock(testForRegular, " bar", ShouldHaveExecuted); testForRegular(1); checkBasicBlock(testForRegular, "{ foo", ShouldHaveExecuted); checkBasicBlock(testForRegular, "} bar", ShouldHaveExecuted); function testForIn(x) { for (var i in x) { foo(); } bar(); } testForIn({}); checkBasicBlock(testForIn, "{ foo", ShouldNotHaveExecuted); checkBasicBlock(testForIn, "} bar", ShouldNotHaveExecuted); checkBasicBlock(testForIn, " bar", ShouldHaveExecuted); testForIn({foo: 20}); checkBasicBlock(testForIn, "{ foo", ShouldHaveExecuted); checkBasicBlock(testForIn, "} bar", ShouldHaveExecuted); function testForOf(x) { for (var i of x) { foo(); } bar(); } testForOf([]); checkBasicBlock(testForOf, "{ foo", ShouldNotHaveExecuted); checkBasicBlock(testForOf, " foo", ShouldNotHaveExecuted); checkBasicBlock(testForOf, "} bar", ShouldNotHaveExecuted); checkBasicBlock(testForOf, " bar", ShouldHaveExecuted); testForOf([20]); checkBasicBlock(testForOf, "{ foo", ShouldHaveExecuted); checkBasicBlock(testForOf, "} bar", ShouldHaveExecuted); function testWhile(x) { var i = 0; while (i++ < x) { foo(); } bar(); } testWhile(0); checkBasicBlock(testWhile, "{ foo", ShouldNotHaveExecuted); checkBasicBlock(testWhile, " foo", ShouldNotHaveExecuted); checkBasicBlock(testWhile, "} bar", ShouldNotHaveExecuted); checkBasicBlock(testWhile, " bar", ShouldHaveExecuted); testWhile(1); checkBasicBlock(testWhile, "{ foo", ShouldHaveExecuted); checkBasicBlock(testWhile, "} bar", ShouldHaveExecuted); // No braces tests. function testIfNoBraces(x) { if (x < 10) foo(); else if (x < 20) bar(); else baz(); } testIfNoBraces(9); checkBasicBlock(testIfNoBraces, "foo", ShouldHaveExecuted); checkBasicBlock(testIfNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testIfNoBraces, "; else if", ShouldHaveExecuted); checkBasicBlock(testIfNoBraces, " else if", ShouldNotHaveExecuted); checkBasicBlock(testIfNoBraces, " bar", ShouldNotHaveExecuted); checkBasicBlock(testIfNoBraces, "bar", ShouldNotHaveExecuted); checkBasicBlock(testIfNoBraces, "else baz", ShouldNotHaveExecuted); checkBasicBlock(testIfNoBraces, "baz", ShouldNotHaveExecuted); testIfNoBraces(21); checkBasicBlock(testIfNoBraces, "else baz", ShouldHaveExecuted); checkBasicBlock(testIfNoBraces, "baz", ShouldHaveExecuted); checkBasicBlock(testIfNoBraces, "; else baz", ShouldNotHaveExecuted); checkBasicBlock(testIfNoBraces, "else if (x < 20)", ShouldHaveExecuted); // Note that the whitespace preceding bar is part of the previous basic block. // An if statement's if-true basic block text offset begins at the start offset // of the if-true block, in this case, just the expression "bar()". checkBasicBlock(testIfNoBraces, " bar", ShouldHaveExecuted); checkBasicBlock(testIfNoBraces, "bar", ShouldNotHaveExecuted); testIfNoBraces(11); checkBasicBlock(testIfNoBraces, " bar", ShouldHaveExecuted); checkBasicBlock(testIfNoBraces, "bar", ShouldHaveExecuted); function testForRegularNoBraces(x) { for (var i = 0; i < x; i++) foo(); bar(); } testForRegularNoBraces(0); checkBasicBlock(testForRegularNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testForRegularNoBraces, "foo", ShouldNotHaveExecuted); checkBasicBlock(testForRegularNoBraces, "; bar", ShouldNotHaveExecuted); checkBasicBlock(testForRegularNoBraces, " bar", ShouldHaveExecuted); testForRegularNoBraces(1); checkBasicBlock(testForRegularNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testForRegularNoBraces, "foo", ShouldHaveExecuted); checkBasicBlock(testForRegularNoBraces, " bar", ShouldHaveExecuted); function testForInNoBraces(x) { for (var i in x) foo(); bar(); } testForInNoBraces({}); checkBasicBlock(testForInNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testForInNoBraces, "foo", ShouldNotHaveExecuted); checkBasicBlock(testForInNoBraces, "; bar", ShouldNotHaveExecuted); checkBasicBlock(testForInNoBraces, " bar", ShouldHaveExecuted); testForInNoBraces({foo: 20}); checkBasicBlock(testForInNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testForInNoBraces, "foo", ShouldHaveExecuted); checkBasicBlock(testForInNoBraces, "; bar", ShouldHaveExecuted); function testForOfNoBraces(x) { for (var i of x) foo(); bar(); } testForOfNoBraces([]); checkBasicBlock(testForOfNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testForOfNoBraces, "foo", ShouldNotHaveExecuted); checkBasicBlock(testForOfNoBraces, "; bar", ShouldNotHaveExecuted); checkBasicBlock(testForOfNoBraces, " bar", ShouldHaveExecuted); testForOfNoBraces([20]); checkBasicBlock(testForOfNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testForOfNoBraces, "foo", ShouldHaveExecuted); checkBasicBlock(testForOfNoBraces, "; bar", ShouldHaveExecuted); function testWhileNoBraces(x) { var i = 0; while (i++ < x) foo(); bar(); } testWhileNoBraces(0); checkBasicBlock(testWhileNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testWhileNoBraces, "foo", ShouldNotHaveExecuted); checkBasicBlock(testWhileNoBraces, "; bar", ShouldNotHaveExecuted); checkBasicBlock(testWhileNoBraces, " bar", ShouldHaveExecuted); testWhileNoBraces(1); checkBasicBlock(testWhileNoBraces, " foo", ShouldHaveExecuted); checkBasicBlock(testWhileNoBraces, "foo", ShouldHaveExecuted); checkBasicBlock(testWhileNoBraces, "; bar", ShouldHaveExecuted);