function testBooleans(a, b) {
    var res = 0;
    if (a && b) res += 2;
    if (b || a) res += 1;
    return res;
}
assertEq(testBooleans(false, false), 0);
assertEq(testBooleans(false, true), 1);
assertEq(testBooleans(true, false), 1);
assertEq(testBooleans(true, true), 3);

function testShortCircuit(a) {
    var b = 0;
    ++a && a++;
    a || (b = 100);
    return a + b;
}
assertEq(testShortCircuit(0), 2);
assertEq(testShortCircuit(-2), 100);
assertEq(testShortCircuit(-1), 100);

function testValues(a, b) {
    if (a && b) return 2;
    if (b || a) return 1;
    return 0;
}
assertEq(testValues(false, true), 1);
assertEq(testValues("foo", 22), 2);
assertEq(testValues(null, ""), 0);
assertEq(testValues(Math.PI, undefined), 1);
assertEq(testValues(Math.abs, 2.2), 2);