# Test cases for booleans (compile and run) [case testTrueAndFalse] def t() -> bool: return True def f() -> bool: return False [file driver.py] from native import t, f print(t()) print(f()) [out] True False [case testBoolOps] from typing import Optional, Any MYPY = False if MYPY: from mypy_extensions import i64 def f(x: bool) -> bool: if x: return False else: return True def test_if() -> None: assert f(True) is False assert f(False) is True def test_bitwise_and() -> None: # Use eval() to avoid constand folding t: bool = eval('True') f: bool = eval('False') assert t & t == True assert t & f == False assert f & t == False assert f & f == False t &= t assert t == True t &= f assert t == False def test_bitwise_or() -> None: # Use eval() to avoid constand folding t: bool = eval('True') f: bool = eval('False') assert t | t == True assert t | f == True assert f | t == True assert f | f == False t |= f assert t == True f |= t assert f == True def test_bitwise_xor() -> None: # Use eval() to avoid constand folding t: bool = eval('True') f: bool = eval('False') assert t ^ t == False assert t ^ f == True assert f ^ t == True assert f ^ f == False t ^= f assert t == True t ^= t assert t == False f ^= f assert f == False def test_isinstance_bool() -> None: a = True b = 1.0 c = 1 d = False assert isinstance(a, bool) == True assert isinstance(b, bool) == False assert isinstance(c, bool) == False assert isinstance(d, bool) == True class C: pass class D: def __init__(self, b: bool) -> None: self.b = b def __bool__(self) -> bool: return self.b class E: pass class F(E): def __init__(self, b: bool) -> None: self.b = b def __bool__(self) -> bool: return self.b def optional_to_bool1(o: Optional[C]) -> bool: return bool(o) def optional_to_bool2(o: Optional[D]) -> bool: return bool(o) def optional_to_bool3(o: Optional[E]) -> bool: return bool(o) def test_optional_to_bool() -> None: assert not optional_to_bool1(None) assert optional_to_bool1(C()) assert not optional_to_bool2(None) assert not optional_to_bool2(D(False)) assert optional_to_bool2(D(True)) assert not optional_to_bool3(None) assert optional_to_bool3(E()) assert not optional_to_bool3(F(False)) assert optional_to_bool3(F(True)) def test_any_to_bool() -> None: a: Any = int() b: Any = a + 1 assert not bool(a) assert bool(b) def eq(x: bool, y: bool) -> bool: return x == y def ne(x: bool, y: bool) -> bool: return x != y def lt(x: bool, y: bool) -> bool: return x < y def le(x: bool, y: bool) -> bool: return x <= y def gt(x: bool, y: bool) -> bool: return x > y def ge(x: bool, y: bool) -> bool: return x >= y def test_comparisons() -> None: for x in True, False: for y in True, False: x2: Any = x y2: Any = y assert eq(x, y) == (x2 == y2) assert ne(x, y) == (x2 != y2) assert lt(x, y) == (x2 < y2) assert le(x, y) == (x2 <= y2) assert gt(x, y) == (x2 > y2) assert ge(x, y) == (x2 >= y2) def eq_mixed(x: bool, y: int) -> bool: return x == y def neq_mixed(x: int, y: bool) -> bool: return x != y def lt_mixed(x: bool, y: int) -> bool: return x < y def gt_mixed(x: int, y: bool) -> bool: return x > y def test_mixed_comparisons() -> None: for x in True, False: for n in -(1 << 70), -123, 0, 1, 1753, 1 << 70: assert eq_mixed(x, n) == (int(x) == n) assert neq_mixed(n, x) == (n != int(x)) assert lt_mixed(x, n) == (int(x) < n) assert gt_mixed(n, x) == (n > int(x)) def add(x: bool, y: bool) -> int: return x + y def add_mixed(b: bool, n: int) -> int: return b + n def sub_mixed(n: int, b: bool) -> int: return n - b def test_arithmetic() -> None: for x in True, False: for y in True, False: assert add(x, y) == int(x) + int(y) for n in -(1 << 70), -123, 0, 1, 1753, 1 << 70: assert add_mixed(x, n) == int(x) + n assert sub_mixed(n, x) == n - int(x) def add_mixed_i64(b: bool, n: i64) -> i64: return b + n def sub_mixed_i64(n: i64, b: bool) -> i64: return n - b def test_arithmetic_i64() -> None: for x in True, False: for n in -(1 << 62), -123, 0, 1, 1753, 1 << 62: assert add_mixed_i64(x, n) == int(x) + n assert sub_mixed_i64(n, x) == n - int(x) def eq_mixed_i64(x: bool, y: i64) -> bool: return x == y def neq_mixed_i64(x: i64, y: bool) -> bool: return x != y def lt_mixed_i64(x: bool, y: i64) -> bool: return x < y def gt_mixed_i64(x: i64, y: bool) -> bool: return x > y def test_mixed_comparisons_i64() -> None: for x in True, False: for n in -(1 << 62), -123, 0, 1, 1753, 1 << 62: assert eq_mixed_i64(x, n) == (int(x) == n) assert neq_mixed_i64(n, x) == (n != int(x)) assert lt_mixed_i64(x, n) == (int(x) < n) assert gt_mixed_i64(n, x) == (n > int(x)) [case testBoolMixInt] y = False print((y or 0) and True) [out] 0