// Tests of logical AND / logical OR, making sure short-circuit sematics
// are working

proc main()
{
    var
        a, b, c;

    "=== variable logical AND tests ===\n";

    a = 0; b = 0; c = a && b;
    "0 && 0 == ", c, "\n";

    a = 0; b = 3; c = a && b;
    "0 && 3 == ", c, "\n";

    a = 2; b = 0; c = a && b;
    "2 && 0 == ", c, "\n";

    a = 2; b = 3; c = a && b;
    "2 && 3 == ", c, "\n";

    "\n=== variable logical OR tests ===\n";

    a = 0; b = 0; c = a || b;
    "0 || 0 == ", c, "\n";

    a = 0; b = 3; c = a || b;
    "0 || 3 == ", c, "\n";

    a = 2; b = 0; c = a || b;
    "2 || 0 == ", c, "\n";

    a = 2; b = 3; c = a || b;
    "2 || 3 == ", c, "\n";

    "\n=== full constant logical AND tests ===\n";

    c = 0 && (1 / 0);
    "0 && (1 / 0) = ", c, "\n";

    c = 2 && 0;
    "2 && 0 = ", c, "\n";

    "\n=== full constant logical OR tests ===\n";

    c = 2 || (1 / 0);
    "2 || (1 / 0) = ", c, "\n";

    c = 0 || 3;
    "0 || 3 = ", c, "\n";

    "\n=== RHS variable logical tests ===\n";

    b = 3; c = 1 && b;
    "1 && 3 = ", c, "\n";

    b = 2; c = 0 || b;
    "0 || 2 = ", c, "\n";

}