(root)/
Python-3.12.0/
Lib/
test/
test_bool.py
       1  # Test properties of bool promised by PEP 285
       2  
       3  import unittest
       4  from test.support import os_helper
       5  
       6  import os
       7  
       8  class ESC[4;38;5;81mBoolTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
       9  
      10      def test_subclass(self):
      11          try:
      12              class ESC[4;38;5;81mC(ESC[4;38;5;149mbool):
      13                  pass
      14          except TypeError:
      15              pass
      16          else:
      17              self.fail("bool should not be subclassable")
      18  
      19          self.assertRaises(TypeError, int.__new__, bool, 0)
      20  
      21      def test_repr(self):
      22          self.assertEqual(repr(False), 'False')
      23          self.assertEqual(repr(True), 'True')
      24          self.assertIs(eval(repr(False)), False)
      25          self.assertIs(eval(repr(True)), True)
      26  
      27      def test_str(self):
      28          self.assertEqual(str(False), 'False')
      29          self.assertEqual(str(True), 'True')
      30  
      31      def test_int(self):
      32          self.assertEqual(int(False), 0)
      33          self.assertIsNot(int(False), False)
      34          self.assertEqual(int(True), 1)
      35          self.assertIsNot(int(True), True)
      36  
      37      def test_float(self):
      38          self.assertEqual(float(False), 0.0)
      39          self.assertIsNot(float(False), False)
      40          self.assertEqual(float(True), 1.0)
      41          self.assertIsNot(float(True), True)
      42  
      43      def test_complex(self):
      44          self.assertEqual(complex(False), 0j)
      45          self.assertEqual(complex(False), False)
      46          self.assertEqual(complex(True), 1+0j)
      47          self.assertEqual(complex(True), True)
      48  
      49      def test_math(self):
      50          self.assertEqual(+False, 0)
      51          self.assertIsNot(+False, False)
      52          self.assertEqual(-False, 0)
      53          self.assertIsNot(-False, False)
      54          self.assertEqual(abs(False), 0)
      55          self.assertIsNot(abs(False), False)
      56          self.assertEqual(+True, 1)
      57          self.assertIsNot(+True, True)
      58          self.assertEqual(-True, -1)
      59          self.assertEqual(abs(True), 1)
      60          self.assertIsNot(abs(True), True)
      61          with self.assertWarns(DeprecationWarning):
      62              # We need to put the bool in a variable, because the constant
      63              # ~False is evaluated at compile time due to constant folding;
      64              # consequently the DeprecationWarning would be issued during
      65              # module loading and not during test execution.
      66              false = False
      67              self.assertEqual(~false, -1)
      68          with self.assertWarns(DeprecationWarning):
      69              # also check that the warning is issued in case of constant
      70              # folding at compile time
      71              self.assertEqual(eval("~False"), -1)
      72          with self.assertWarns(DeprecationWarning):
      73              true = True
      74              self.assertEqual(~true, -2)
      75          with self.assertWarns(DeprecationWarning):
      76              self.assertEqual(eval("~True"), -2)
      77  
      78          self.assertEqual(False+2, 2)
      79          self.assertEqual(True+2, 3)
      80          self.assertEqual(2+False, 2)
      81          self.assertEqual(2+True, 3)
      82  
      83          self.assertEqual(False+False, 0)
      84          self.assertIsNot(False+False, False)
      85          self.assertEqual(False+True, 1)
      86          self.assertIsNot(False+True, True)
      87          self.assertEqual(True+False, 1)
      88          self.assertIsNot(True+False, True)
      89          self.assertEqual(True+True, 2)
      90  
      91          self.assertEqual(True-True, 0)
      92          self.assertIsNot(True-True, False)
      93          self.assertEqual(False-False, 0)
      94          self.assertIsNot(False-False, False)
      95          self.assertEqual(True-False, 1)
      96          self.assertIsNot(True-False, True)
      97          self.assertEqual(False-True, -1)
      98  
      99          self.assertEqual(True*1, 1)
     100          self.assertEqual(False*1, 0)
     101          self.assertIsNot(False*1, False)
     102  
     103          self.assertEqual(True/1, 1)
     104          self.assertIsNot(True/1, True)
     105          self.assertEqual(False/1, 0)
     106          self.assertIsNot(False/1, False)
     107  
     108          self.assertEqual(True%1, 0)
     109          self.assertIsNot(True%1, False)
     110          self.assertEqual(True%2, 1)
     111          self.assertIsNot(True%2, True)
     112          self.assertEqual(False%1, 0)
     113          self.assertIsNot(False%1, False)
     114  
     115          for b in False, True:
     116              for i in 0, 1, 2:
     117                  self.assertEqual(b**i, int(b)**i)
     118                  self.assertIsNot(b**i, bool(int(b)**i))
     119  
     120          for a in False, True:
     121              for b in False, True:
     122                  self.assertIs(a&b, bool(int(a)&int(b)))
     123                  self.assertIs(a|b, bool(int(a)|int(b)))
     124                  self.assertIs(a^b, bool(int(a)^int(b)))
     125                  self.assertEqual(a&int(b), int(a)&int(b))
     126                  self.assertIsNot(a&int(b), bool(int(a)&int(b)))
     127                  self.assertEqual(a|int(b), int(a)|int(b))
     128                  self.assertIsNot(a|int(b), bool(int(a)|int(b)))
     129                  self.assertEqual(a^int(b), int(a)^int(b))
     130                  self.assertIsNot(a^int(b), bool(int(a)^int(b)))
     131                  self.assertEqual(int(a)&b, int(a)&int(b))
     132                  self.assertIsNot(int(a)&b, bool(int(a)&int(b)))
     133                  self.assertEqual(int(a)|b, int(a)|int(b))
     134                  self.assertIsNot(int(a)|b, bool(int(a)|int(b)))
     135                  self.assertEqual(int(a)^b, int(a)^int(b))
     136                  self.assertIsNot(int(a)^b, bool(int(a)^int(b)))
     137  
     138          self.assertIs(1==1, True)
     139          self.assertIs(1==0, False)
     140          self.assertIs(0<1, True)
     141          self.assertIs(1<0, False)
     142          self.assertIs(0<=0, True)
     143          self.assertIs(1<=0, False)
     144          self.assertIs(1>0, True)
     145          self.assertIs(1>1, False)
     146          self.assertIs(1>=1, True)
     147          self.assertIs(0>=1, False)
     148          self.assertIs(0!=1, True)
     149          self.assertIs(0!=0, False)
     150  
     151          x = [1]
     152          self.assertIs(x is x, True)
     153          self.assertIs(x is not x, False)
     154  
     155          self.assertIs(1 in x, True)
     156          self.assertIs(0 in x, False)
     157          self.assertIs(1 not in x, False)
     158          self.assertIs(0 not in x, True)
     159  
     160          x = {1: 2}
     161          self.assertIs(x is x, True)
     162          self.assertIs(x is not x, False)
     163  
     164          self.assertIs(1 in x, True)
     165          self.assertIs(0 in x, False)
     166          self.assertIs(1 not in x, False)
     167          self.assertIs(0 not in x, True)
     168  
     169          self.assertIs(not True, False)
     170          self.assertIs(not False, True)
     171  
     172      def test_convert(self):
     173          self.assertRaises(TypeError, bool, 42, 42)
     174          self.assertIs(bool(10), True)
     175          self.assertIs(bool(1), True)
     176          self.assertIs(bool(-1), True)
     177          self.assertIs(bool(0), False)
     178          self.assertIs(bool("hello"), True)
     179          self.assertIs(bool(""), False)
     180          self.assertIs(bool(), False)
     181  
     182      def test_keyword_args(self):
     183          with self.assertRaisesRegex(TypeError, 'keyword argument'):
     184              bool(x=10)
     185  
     186      def test_format(self):
     187          self.assertEqual("%d" % False, "0")
     188          self.assertEqual("%d" % True, "1")
     189          self.assertEqual("%x" % False, "0")
     190          self.assertEqual("%x" % True, "1")
     191  
     192      def test_hasattr(self):
     193          self.assertIs(hasattr([], "append"), True)
     194          self.assertIs(hasattr([], "wobble"), False)
     195  
     196      def test_callable(self):
     197          self.assertIs(callable(len), True)
     198          self.assertIs(callable(1), False)
     199  
     200      def test_isinstance(self):
     201          self.assertIs(isinstance(True, bool), True)
     202          self.assertIs(isinstance(False, bool), True)
     203          self.assertIs(isinstance(True, int), True)
     204          self.assertIs(isinstance(False, int), True)
     205          self.assertIs(isinstance(1, bool), False)
     206          self.assertIs(isinstance(0, bool), False)
     207  
     208      def test_issubclass(self):
     209          self.assertIs(issubclass(bool, int), True)
     210          self.assertIs(issubclass(int, bool), False)
     211  
     212      def test_contains(self):
     213          self.assertIs(1 in {}, False)
     214          self.assertIs(1 in {1:1}, True)
     215  
     216      def test_string(self):
     217          self.assertIs("xyz".endswith("z"), True)
     218          self.assertIs("xyz".endswith("x"), False)
     219          self.assertIs("xyz0123".isalnum(), True)
     220          self.assertIs("@#$%".isalnum(), False)
     221          self.assertIs("xyz".isalpha(), True)
     222          self.assertIs("@#$%".isalpha(), False)
     223          self.assertIs("0123".isdigit(), True)
     224          self.assertIs("xyz".isdigit(), False)
     225          self.assertIs("xyz".islower(), True)
     226          self.assertIs("XYZ".islower(), False)
     227          self.assertIs("0123".isdecimal(), True)
     228          self.assertIs("xyz".isdecimal(), False)
     229          self.assertIs("0123".isnumeric(), True)
     230          self.assertIs("xyz".isnumeric(), False)
     231          self.assertIs(" ".isspace(), True)
     232          self.assertIs("\xa0".isspace(), True)
     233          self.assertIs("\u3000".isspace(), True)
     234          self.assertIs("XYZ".isspace(), False)
     235          self.assertIs("X".istitle(), True)
     236          self.assertIs("x".istitle(), False)
     237          self.assertIs("XYZ".isupper(), True)
     238          self.assertIs("xyz".isupper(), False)
     239          self.assertIs("xyz".startswith("x"), True)
     240          self.assertIs("xyz".startswith("z"), False)
     241  
     242      def test_boolean(self):
     243          self.assertEqual(True & 1, 1)
     244          self.assertNotIsInstance(True & 1, bool)
     245          self.assertIs(True & True, True)
     246  
     247          self.assertEqual(True | 1, 1)
     248          self.assertNotIsInstance(True | 1, bool)
     249          self.assertIs(True | True, True)
     250  
     251          self.assertEqual(True ^ 1, 0)
     252          self.assertNotIsInstance(True ^ 1, bool)
     253          self.assertIs(True ^ True, False)
     254  
     255      def test_fileclosed(self):
     256          try:
     257              with open(os_helper.TESTFN, "w", encoding="utf-8") as f:
     258                  self.assertIs(f.closed, False)
     259              self.assertIs(f.closed, True)
     260          finally:
     261              os.remove(os_helper.TESTFN)
     262  
     263      def test_types(self):
     264          # types are always true.
     265          for t in [bool, complex, dict, float, int, list, object,
     266                    set, str, tuple, type]:
     267              self.assertIs(bool(t), True)
     268  
     269      def test_operator(self):
     270          import operator
     271          self.assertIs(operator.truth(0), False)
     272          self.assertIs(operator.truth(1), True)
     273          self.assertIs(operator.not_(1), False)
     274          self.assertIs(operator.not_(0), True)
     275          self.assertIs(operator.contains([], 1), False)
     276          self.assertIs(operator.contains([1], 1), True)
     277          self.assertIs(operator.lt(0, 0), False)
     278          self.assertIs(operator.lt(0, 1), True)
     279          self.assertIs(operator.is_(True, True), True)
     280          self.assertIs(operator.is_(True, False), False)
     281          self.assertIs(operator.is_not(True, True), False)
     282          self.assertIs(operator.is_not(True, False), True)
     283  
     284      def test_marshal(self):
     285          import marshal
     286          self.assertIs(marshal.loads(marshal.dumps(True)), True)
     287          self.assertIs(marshal.loads(marshal.dumps(False)), False)
     288  
     289      def test_pickle(self):
     290          import pickle
     291          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     292              self.assertIs(pickle.loads(pickle.dumps(True, proto)), True)
     293              self.assertIs(pickle.loads(pickle.dumps(False, proto)), False)
     294  
     295      def test_picklevalues(self):
     296          # Test for specific backwards-compatible pickle values
     297          import pickle
     298          self.assertEqual(pickle.dumps(True, protocol=0), b"I01\n.")
     299          self.assertEqual(pickle.dumps(False, protocol=0), b"I00\n.")
     300          self.assertEqual(pickle.dumps(True, protocol=1), b"I01\n.")
     301          self.assertEqual(pickle.dumps(False, protocol=1), b"I00\n.")
     302          self.assertEqual(pickle.dumps(True, protocol=2), b'\x80\x02\x88.')
     303          self.assertEqual(pickle.dumps(False, protocol=2), b'\x80\x02\x89.')
     304  
     305      def test_convert_to_bool(self):
     306          # Verify that TypeError occurs when bad things are returned
     307          # from __bool__().  This isn't really a bool test, but
     308          # it's related.
     309          check = lambda o: self.assertRaises(TypeError, bool, o)
     310          class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
     311              def __bool__(self):
     312                  return self
     313          check(Foo())
     314  
     315          class ESC[4;38;5;81mBar(ESC[4;38;5;149mobject):
     316              def __bool__(self):
     317                  return "Yes"
     318          check(Bar())
     319  
     320          class ESC[4;38;5;81mBaz(ESC[4;38;5;149mint):
     321              def __bool__(self):
     322                  return self
     323          check(Baz())
     324  
     325          # __bool__() must return a bool not an int
     326          class ESC[4;38;5;81mSpam(ESC[4;38;5;149mint):
     327              def __bool__(self):
     328                  return 1
     329          check(Spam())
     330  
     331          class ESC[4;38;5;81mEggs:
     332              def __len__(self):
     333                  return -1
     334          self.assertRaises(ValueError, bool, Eggs())
     335  
     336      def test_interpreter_convert_to_bool_raises(self):
     337          class ESC[4;38;5;81mSymbolicBool:
     338              def __bool__(self):
     339                  raise TypeError
     340  
     341          class ESC[4;38;5;81mSymbol:
     342              def __gt__(self, other):
     343                  return SymbolicBool()
     344  
     345          x = Symbol()
     346  
     347          with self.assertRaises(TypeError):
     348              if x > 0:
     349                  msg = "x > 0 was true"
     350              else:
     351                  msg = "x > 0 was false"
     352  
     353          # This used to create negative refcounts, see gh-102250
     354          del x
     355  
     356      def test_from_bytes(self):
     357          self.assertIs(bool.from_bytes(b'\x00'*8, 'big'), False)
     358          self.assertIs(bool.from_bytes(b'abcd', 'little'), True)
     359  
     360      def test_sane_len(self):
     361          # this test just tests our assumptions about __len__
     362          # this will start failing if __len__ changes assertions
     363          for badval in ['illegal', -1, 1 << 32]:
     364              class ESC[4;38;5;81mA:
     365                  def __len__(self):
     366                      return badval
     367              try:
     368                  bool(A())
     369              except (Exception) as e_bool:
     370                  try:
     371                      len(A())
     372                  except (Exception) as e_len:
     373                      self.assertEqual(str(e_bool), str(e_len))
     374  
     375      def test_blocked(self):
     376          class ESC[4;38;5;81mA:
     377              __bool__ = None
     378          self.assertRaises(TypeError, bool, A())
     379  
     380          class ESC[4;38;5;81mB:
     381              def __len__(self):
     382                  return 10
     383              __bool__ = None
     384          self.assertRaises(TypeError, bool, B())
     385  
     386      def test_real_and_imag(self):
     387          self.assertEqual(True.real, 1)
     388          self.assertEqual(True.imag, 0)
     389          self.assertIs(type(True.real), int)
     390          self.assertIs(type(True.imag), int)
     391          self.assertEqual(False.real, 0)
     392          self.assertEqual(False.imag, 0)
     393          self.assertIs(type(False.real), int)
     394          self.assertIs(type(False.imag), int)
     395  
     396      def test_bool_called_at_least_once(self):
     397          class ESC[4;38;5;81mX:
     398              def __init__(self):
     399                  self.count = 0
     400              def __bool__(self):
     401                  self.count += 1
     402                  return True
     403  
     404          def f(x):
     405              if x or True:
     406                  pass
     407  
     408          x = X()
     409          f(x)
     410          self.assertGreaterEqual(x.count, 1)
     411  
     412      def test_bool_new(self):
     413          self.assertIs(bool.__new__(bool), False)
     414          self.assertIs(bool.__new__(bool, 1), True)
     415          self.assertIs(bool.__new__(bool, 0), False)
     416          self.assertIs(bool.__new__(bool, False), False)
     417          self.assertIs(bool.__new__(bool, True), True)
     418  
     419  
     420  if __name__ == "__main__":
     421      unittest.main()