public void Boolean()
{
Interpret(@"var a = true && false;").Equal("a", false);
Interpret(@"a = true && true;").Equal("a", true);
Interpret(@"a = false && false;").Equal("a", false);
Interpret(@"a = true || false;").Equal("a", true);
Interpret(@"a = true || true;").Equal("a", true);
Interpret(@"a = false || false;").Equal("a", false);
Interpret(@"a = null && null;").Null("a");
Interpret(@"a = null || null;").Null("a");
Interpret(@"a = null || 1;").Equal("a", 1);
Interpret(@"a = 1 && 1;").Equal("a", 1);
Interpret(@"a = null;
a = a || {a: 1};").Equal("a.a", 1);
Interpret(@"a = null;
a ||= {a: 1};").Equal("a.a", 1);
Interpret(@"a = null;
a &&= {a: 1};").Equal("a", null);
Interpret(@"a = {};
a &&= {a: 1};").Equal("a.a", 1);
Interpret(@"var called = false;
func f() {called = true}
a = true || f();").Equal("called", false);
Interpret(@"called = false;
a = true;
a ||= f();").Equal("called", false);
Interpret(@"called = false;
a = false && f1();").Equal("called", false);
Interpret(@"called = false;
a = false;
a &&= f1();").Equal("called", false);
}