(root)/
Python-3.11.7/
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          self.assertEqual(~False, -1)
      62          self.assertEqual(~True, -2)
      63  
      64          self.assertEqual(False+2, 2)
      65          self.assertEqual(True+2, 3)
      66          self.assertEqual(2+False, 2)
      67          self.assertEqual(2+True, 3)
      68  
      69          self.assertEqual(False+False, 0)
      70          self.assertIsNot(False+False, False)
      71          self.assertEqual(False+True, 1)
      72          self.assertIsNot(False+True, True)
      73          self.assertEqual(True+False, 1)
      74          self.assertIsNot(True+False, True)
      75          self.assertEqual(True+True, 2)
      76  
      77          self.assertEqual(True-True, 0)
      78          self.assertIsNot(True-True, False)
      79          self.assertEqual(False-False, 0)
      80          self.assertIsNot(False-False, False)
      81          self.assertEqual(True-False, 1)
      82          self.assertIsNot(True-False, True)
      83          self.assertEqual(False-True, -1)
      84  
      85          self.assertEqual(True*1, 1)
      86          self.assertEqual(False*1, 0)
      87          self.assertIsNot(False*1, False)
      88  
      89          self.assertEqual(True/1, 1)
      90          self.assertIsNot(True/1, True)
      91          self.assertEqual(False/1, 0)
      92          self.assertIsNot(False/1, False)
      93  
      94          self.assertEqual(True%1, 0)
      95          self.assertIsNot(True%1, False)
      96          self.assertEqual(True%2, 1)
      97          self.assertIsNot(True%2, True)
      98          self.assertEqual(False%1, 0)
      99          self.assertIsNot(False%1, False)
     100  
     101          for b in False, True:
     102              for i in 0, 1, 2:
     103                  self.assertEqual(b**i, int(b)**i)
     104                  self.assertIsNot(b**i, bool(int(b)**i))
     105  
     106          for a in False, True:
     107              for b in False, True:
     108                  self.assertIs(a&b, bool(int(a)&int(b)))
     109                  self.assertIs(a|b, bool(int(a)|int(b)))
     110                  self.assertIs(a^b, bool(int(a)^int(b)))
     111                  self.assertEqual(a&int(b), int(a)&int(b))
     112                  self.assertIsNot(a&int(b), bool(int(a)&int(b)))
     113                  self.assertEqual(a|int(b), int(a)|int(b))
     114                  self.assertIsNot(a|int(b), bool(int(a)|int(b)))
     115                  self.assertEqual(a^int(b), int(a)^int(b))
     116                  self.assertIsNot(a^int(b), bool(int(a)^int(b)))
     117                  self.assertEqual(int(a)&b, int(a)&int(b))
     118                  self.assertIsNot(int(a)&b, bool(int(a)&int(b)))
     119                  self.assertEqual(int(a)|b, int(a)|int(b))
     120                  self.assertIsNot(int(a)|b, bool(int(a)|int(b)))
     121                  self.assertEqual(int(a)^b, int(a)^int(b))
     122                  self.assertIsNot(int(a)^b, bool(int(a)^int(b)))
     123  
     124          self.assertIs(1==1, True)
     125          self.assertIs(1==0, False)
     126          self.assertIs(0<1, True)
     127          self.assertIs(1<0, False)
     128          self.assertIs(0<=0, True)
     129          self.assertIs(1<=0, False)
     130          self.assertIs(1>0, True)
     131          self.assertIs(1>1, False)
     132          self.assertIs(1>=1, True)
     133          self.assertIs(0>=1, False)
     134          self.assertIs(0!=1, True)
     135          self.assertIs(0!=0, False)
     136  
     137          x = [1]
     138          self.assertIs(x is x, True)
     139          self.assertIs(x is not x, False)
     140  
     141          self.assertIs(1 in x, True)
     142          self.assertIs(0 in x, False)
     143          self.assertIs(1 not in x, False)
     144          self.assertIs(0 not in x, True)
     145  
     146          x = {1: 2}
     147          self.assertIs(x is x, True)
     148          self.assertIs(x is not x, False)
     149  
     150          self.assertIs(1 in x, True)
     151          self.assertIs(0 in x, False)
     152          self.assertIs(1 not in x, False)
     153          self.assertIs(0 not in x, True)
     154  
     155          self.assertIs(not True, False)
     156          self.assertIs(not False, True)
     157  
     158      def test_convert(self):
     159          self.assertRaises(TypeError, bool, 42, 42)
     160          self.assertIs(bool(10), True)
     161          self.assertIs(bool(1), True)
     162          self.assertIs(bool(-1), True)
     163          self.assertIs(bool(0), False)
     164          self.assertIs(bool("hello"), True)
     165          self.assertIs(bool(""), False)
     166          self.assertIs(bool(), False)
     167  
     168      def test_keyword_args(self):
     169          with self.assertRaisesRegex(TypeError, 'keyword argument'):
     170              bool(x=10)
     171  
     172      def test_format(self):
     173          self.assertEqual("%d" % False, "0")
     174          self.assertEqual("%d" % True, "1")
     175          self.assertEqual("%x" % False, "0")
     176          self.assertEqual("%x" % True, "1")
     177  
     178      def test_hasattr(self):
     179          self.assertIs(hasattr([], "append"), True)
     180          self.assertIs(hasattr([], "wobble"), False)
     181  
     182      def test_callable(self):
     183          self.assertIs(callable(len), True)
     184          self.assertIs(callable(1), False)
     185  
     186      def test_isinstance(self):
     187          self.assertIs(isinstance(True, bool), True)
     188          self.assertIs(isinstance(False, bool), True)
     189          self.assertIs(isinstance(True, int), True)
     190          self.assertIs(isinstance(False, int), True)
     191          self.assertIs(isinstance(1, bool), False)
     192          self.assertIs(isinstance(0, bool), False)
     193  
     194      def test_issubclass(self):
     195          self.assertIs(issubclass(bool, int), True)
     196          self.assertIs(issubclass(int, bool), False)
     197  
     198      def test_contains(self):
     199          self.assertIs(1 in {}, False)
     200          self.assertIs(1 in {1:1}, True)
     201  
     202      def test_string(self):
     203          self.assertIs("xyz".endswith("z"), True)
     204          self.assertIs("xyz".endswith("x"), False)
     205          self.assertIs("xyz0123".isalnum(), True)
     206          self.assertIs("@#$%".isalnum(), False)
     207          self.assertIs("xyz".isalpha(), True)
     208          self.assertIs("@#$%".isalpha(), False)
     209          self.assertIs("0123".isdigit(), True)
     210          self.assertIs("xyz".isdigit(), False)
     211          self.assertIs("xyz".islower(), True)
     212          self.assertIs("XYZ".islower(), False)
     213          self.assertIs("0123".isdecimal(), True)
     214          self.assertIs("xyz".isdecimal(), False)
     215          self.assertIs("0123".isnumeric(), True)
     216          self.assertIs("xyz".isnumeric(), False)
     217          self.assertIs(" ".isspace(), True)
     218          self.assertIs("\xa0".isspace(), True)
     219          self.assertIs("\u3000".isspace(), True)
     220          self.assertIs("XYZ".isspace(), False)
     221          self.assertIs("X".istitle(), True)
     222          self.assertIs("x".istitle(), False)
     223          self.assertIs("XYZ".isupper(), True)
     224          self.assertIs("xyz".isupper(), False)
     225          self.assertIs("xyz".startswith("x"), True)
     226          self.assertIs("xyz".startswith("z"), False)
     227  
     228      def test_boolean(self):
     229          self.assertEqual(True & 1, 1)
     230          self.assertNotIsInstance(True & 1, bool)
     231          self.assertIs(True & True, True)
     232  
     233          self.assertEqual(True | 1, 1)
     234          self.assertNotIsInstance(True | 1, bool)
     235          self.assertIs(True | True, True)
     236  
     237          self.assertEqual(True ^ 1, 0)
     238          self.assertNotIsInstance(True ^ 1, bool)
     239          self.assertIs(True ^ True, False)
     240  
     241      def test_fileclosed(self):
     242          try:
     243              with open(os_helper.TESTFN, "w", encoding="utf-8") as f:
     244                  self.assertIs(f.closed, False)
     245              self.assertIs(f.closed, True)
     246          finally:
     247              os.remove(os_helper.TESTFN)
     248  
     249      def test_types(self):
     250          # types are always true.
     251          for t in [bool, complex, dict, float, int, list, object,
     252                    set, str, tuple, type]:
     253              self.assertIs(bool(t), True)
     254  
     255      def test_operator(self):
     256          import operator
     257          self.assertIs(operator.truth(0), False)
     258          self.assertIs(operator.truth(1), True)
     259          self.assertIs(operator.not_(1), False)
     260          self.assertIs(operator.not_(0), True)
     261          self.assertIs(operator.contains([], 1), False)
     262          self.assertIs(operator.contains([1], 1), True)
     263          self.assertIs(operator.lt(0, 0), False)
     264          self.assertIs(operator.lt(0, 1), True)
     265          self.assertIs(operator.is_(True, True), True)
     266          self.assertIs(operator.is_(True, False), False)
     267          self.assertIs(operator.is_not(True, True), False)
     268          self.assertIs(operator.is_not(True, False), True)
     269  
     270      def test_marshal(self):
     271          import marshal
     272          self.assertIs(marshal.loads(marshal.dumps(True)), True)
     273          self.assertIs(marshal.loads(marshal.dumps(False)), False)
     274  
     275      def test_pickle(self):
     276          import pickle
     277          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     278              self.assertIs(pickle.loads(pickle.dumps(True, proto)), True)
     279              self.assertIs(pickle.loads(pickle.dumps(False, proto)), False)
     280  
     281      def test_picklevalues(self):
     282          # Test for specific backwards-compatible pickle values
     283          import pickle
     284          self.assertEqual(pickle.dumps(True, protocol=0), b"I01\n.")
     285          self.assertEqual(pickle.dumps(False, protocol=0), b"I00\n.")
     286          self.assertEqual(pickle.dumps(True, protocol=1), b"I01\n.")
     287          self.assertEqual(pickle.dumps(False, protocol=1), b"I00\n.")
     288          self.assertEqual(pickle.dumps(True, protocol=2), b'\x80\x02\x88.')
     289          self.assertEqual(pickle.dumps(False, protocol=2), b'\x80\x02\x89.')
     290  
     291      def test_convert_to_bool(self):
     292          # Verify that TypeError occurs when bad things are returned
     293          # from __bool__().  This isn't really a bool test, but
     294          # it's related.
     295          check = lambda o: self.assertRaises(TypeError, bool, o)
     296          class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
     297              def __bool__(self):
     298                  return self
     299          check(Foo())
     300  
     301          class ESC[4;38;5;81mBar(ESC[4;38;5;149mobject):
     302              def __bool__(self):
     303                  return "Yes"
     304          check(Bar())
     305  
     306          class ESC[4;38;5;81mBaz(ESC[4;38;5;149mint):
     307              def __bool__(self):
     308                  return self
     309          check(Baz())
     310  
     311          # __bool__() must return a bool not an int
     312          class ESC[4;38;5;81mSpam(ESC[4;38;5;149mint):
     313              def __bool__(self):
     314                  return 1
     315          check(Spam())
     316  
     317          class ESC[4;38;5;81mEggs:
     318              def __len__(self):
     319                  return -1
     320          self.assertRaises(ValueError, bool, Eggs())
     321  
     322      def test_from_bytes(self):
     323          self.assertIs(bool.from_bytes(b'\x00'*8, 'big'), False)
     324          self.assertIs(bool.from_bytes(b'abcd', 'little'), True)
     325  
     326      def test_sane_len(self):
     327          # this test just tests our assumptions about __len__
     328          # this will start failing if __len__ changes assertions
     329          for badval in ['illegal', -1, 1 << 32]:
     330              class ESC[4;38;5;81mA:
     331                  def __len__(self):
     332                      return badval
     333              try:
     334                  bool(A())
     335              except (Exception) as e_bool:
     336                  try:
     337                      len(A())
     338                  except (Exception) as e_len:
     339                      self.assertEqual(str(e_bool), str(e_len))
     340  
     341      def test_blocked(self):
     342          class ESC[4;38;5;81mA:
     343              __bool__ = None
     344          self.assertRaises(TypeError, bool, A())
     345  
     346          class ESC[4;38;5;81mB:
     347              def __len__(self):
     348                  return 10
     349              __bool__ = None
     350          self.assertRaises(TypeError, bool, B())
     351  
     352      def test_real_and_imag(self):
     353          self.assertEqual(True.real, 1)
     354          self.assertEqual(True.imag, 0)
     355          self.assertIs(type(True.real), int)
     356          self.assertIs(type(True.imag), int)
     357          self.assertEqual(False.real, 0)
     358          self.assertEqual(False.imag, 0)
     359          self.assertIs(type(False.real), int)
     360          self.assertIs(type(False.imag), int)
     361  
     362      def test_bool_called_at_least_once(self):
     363          class ESC[4;38;5;81mX:
     364              def __init__(self):
     365                  self.count = 0
     366              def __bool__(self):
     367                  self.count += 1
     368                  return True
     369  
     370          def f(x):
     371              if x or True:
     372                  pass
     373  
     374          x = X()
     375          f(x)
     376          self.assertGreaterEqual(x.count, 1)
     377  
     378      def test_bool_new(self):
     379          self.assertIs(bool.__new__(bool), False)
     380          self.assertIs(bool.__new__(bool, 1), True)
     381          self.assertIs(bool.__new__(bool, 0), False)
     382          self.assertIs(bool.__new__(bool, False), False)
     383          self.assertIs(bool.__new__(bool, True), True)
     384  
     385  
     386  if __name__ == "__main__":
     387      unittest.main()