(root)/
Python-3.11.7/
Lib/
test/
test_rlcompleter.py
       1  import unittest
       2  from unittest.mock import patch
       3  import builtins
       4  import rlcompleter
       5  
       6  class ESC[4;38;5;81mCompleteMe:
       7      """ Trivial class used in testing rlcompleter.Completer. """
       8      spam = 1
       9      _ham = 2
      10  
      11  
      12  class ESC[4;38;5;81mTestRlcompleter(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      13      def setUp(self):
      14          self.stdcompleter = rlcompleter.Completer()
      15          self.completer = rlcompleter.Completer(dict(spam=int,
      16                                                      egg=str,
      17                                                      CompleteMe=CompleteMe))
      18  
      19          # forces stdcompleter to bind builtins namespace
      20          self.stdcompleter.complete('', 0)
      21  
      22      def test_namespace(self):
      23          class ESC[4;38;5;81mA(ESC[4;38;5;149mdict):
      24              pass
      25          class ESC[4;38;5;81mB(ESC[4;38;5;149mlist):
      26              pass
      27  
      28          self.assertTrue(self.stdcompleter.use_main_ns)
      29          self.assertFalse(self.completer.use_main_ns)
      30          self.assertFalse(rlcompleter.Completer(A()).use_main_ns)
      31          self.assertRaises(TypeError, rlcompleter.Completer, B((1,)))
      32  
      33      def test_global_matches(self):
      34          # test with builtins namespace
      35          self.assertEqual(sorted(self.stdcompleter.global_matches('di')),
      36                           [x+'(' for x in dir(builtins) if x.startswith('di')])
      37          self.assertEqual(sorted(self.stdcompleter.global_matches('st')),
      38                           [x+'(' for x in dir(builtins) if x.startswith('st')])
      39          self.assertEqual(self.stdcompleter.global_matches('akaksajadhak'), [])
      40  
      41          # test with a customized namespace
      42          self.assertEqual(self.completer.global_matches('CompleteM'),
      43                           ['CompleteMe()'])
      44          self.assertEqual(self.completer.global_matches('eg'),
      45                           ['egg('])
      46          # XXX: see issue5256
      47          self.assertEqual(self.completer.global_matches('CompleteM'),
      48                           ['CompleteMe()'])
      49  
      50      def test_attr_matches(self):
      51          # test with builtins namespace
      52          self.assertEqual(self.stdcompleter.attr_matches('str.s'),
      53                           ['str.{}('.format(x) for x in dir(str)
      54                            if x.startswith('s')])
      55          self.assertEqual(self.stdcompleter.attr_matches('tuple.foospamegg'), [])
      56          expected = sorted({'None.%s%s' % (x, '(' if x != '__doc__' else '')
      57                             for x in dir(None)})
      58          self.assertEqual(self.stdcompleter.attr_matches('None.'), expected)
      59          self.assertEqual(self.stdcompleter.attr_matches('None._'), expected)
      60          self.assertEqual(self.stdcompleter.attr_matches('None.__'), expected)
      61  
      62          # test with a customized namespace
      63          self.assertEqual(self.completer.attr_matches('CompleteMe.sp'),
      64                           ['CompleteMe.spam'])
      65          self.assertEqual(self.completer.attr_matches('Completeme.egg'), [])
      66          self.assertEqual(self.completer.attr_matches('CompleteMe.'),
      67                           ['CompleteMe.mro()', 'CompleteMe.spam'])
      68          self.assertEqual(self.completer.attr_matches('CompleteMe._'),
      69                           ['CompleteMe._ham'])
      70          matches = self.completer.attr_matches('CompleteMe.__')
      71          for x in matches:
      72              self.assertTrue(x.startswith('CompleteMe.__'), x)
      73          self.assertIn('CompleteMe.__name__', matches)
      74          self.assertIn('CompleteMe.__new__(', matches)
      75  
      76          with patch.object(CompleteMe, "me", CompleteMe, create=True):
      77              self.assertEqual(self.completer.attr_matches('CompleteMe.me.me.sp'),
      78                               ['CompleteMe.me.me.spam'])
      79              self.assertEqual(self.completer.attr_matches('egg.s'),
      80                               ['egg.{}('.format(x) for x in dir(str)
      81                                if x.startswith('s')])
      82  
      83      def test_excessive_getattr(self):
      84          """Ensure getattr() is invoked no more than once per attribute"""
      85  
      86          # note the special case for @property methods below; that is why
      87          # we use __dir__ and __getattr__ in class Foo to create a "magic"
      88          # class attribute 'bar'. This forces `getattr` to call __getattr__
      89          # (which is doesn't necessarily do).
      90          class ESC[4;38;5;81mFoo:
      91              calls = 0
      92              bar = ''
      93              def __getattribute__(self, name):
      94                  if name == 'bar':
      95                      self.calls += 1
      96                      return None
      97                  return super().__getattribute__(name)
      98  
      99          f = Foo()
     100          completer = rlcompleter.Completer(dict(f=f))
     101          self.assertEqual(completer.complete('f.b', 0), 'f.bar')
     102          self.assertEqual(f.calls, 1)
     103  
     104      def test_property_method_not_called(self):
     105          class ESC[4;38;5;81mFoo:
     106              _bar = 0
     107              property_called = False
     108  
     109              @property
     110              def bar(self):
     111                  self.property_called = True
     112                  return self._bar
     113  
     114          f = Foo()
     115          completer = rlcompleter.Completer(dict(f=f))
     116          self.assertEqual(completer.complete('f.b', 0), 'f.bar')
     117          self.assertFalse(f.property_called)
     118  
     119  
     120      def test_uncreated_attr(self):
     121          # Attributes like properties and slots should be completed even when
     122          # they haven't been created on an instance
     123          class ESC[4;38;5;81mFoo:
     124              __slots__ = ("bar",)
     125          completer = rlcompleter.Completer(dict(f=Foo()))
     126          self.assertEqual(completer.complete('f.', 0), 'f.bar')
     127  
     128      @unittest.mock.patch('rlcompleter._readline_available', False)
     129      def test_complete(self):
     130          completer = rlcompleter.Completer()
     131          self.assertEqual(completer.complete('', 0), '\t')
     132          self.assertEqual(completer.complete('a', 0), 'and ')
     133          self.assertEqual(completer.complete('a', 1), 'as ')
     134          self.assertEqual(completer.complete('as', 2), 'assert ')
     135          self.assertEqual(completer.complete('an', 0), 'and ')
     136          self.assertEqual(completer.complete('pa', 0), 'pass')
     137          self.assertEqual(completer.complete('Fa', 0), 'False')
     138          self.assertEqual(completer.complete('el', 0), 'elif ')
     139          self.assertEqual(completer.complete('el', 1), 'else')
     140          self.assertEqual(completer.complete('tr', 0), 'try:')
     141          self.assertEqual(completer.complete('_', 0), '_')
     142          self.assertEqual(completer.complete('match', 0), 'match ')
     143          self.assertEqual(completer.complete('case', 0), 'case ')
     144  
     145      def test_duplicate_globals(self):
     146          namespace = {
     147              'False': None,  # Keyword vs builtin vs namespace
     148              'assert': None,  # Keyword vs namespace
     149              'try': lambda: None,  # Keyword vs callable
     150              'memoryview': None,  # Callable builtin vs non-callable
     151              'Ellipsis': lambda: None,  # Non-callable builtin vs callable
     152          }
     153          completer = rlcompleter.Completer(namespace)
     154          self.assertEqual(completer.complete('False', 0), 'False')
     155          self.assertIsNone(completer.complete('False', 1))  # No duplicates
     156          # Space or colon added due to being a reserved keyword
     157          self.assertEqual(completer.complete('assert', 0), 'assert ')
     158          self.assertIsNone(completer.complete('assert', 1))
     159          self.assertEqual(completer.complete('try', 0), 'try:')
     160          self.assertIsNone(completer.complete('try', 1))
     161          # No opening bracket "(" because we overrode the built-in class
     162          self.assertEqual(completer.complete('memoryview', 0), 'memoryview')
     163          self.assertIsNone(completer.complete('memoryview', 1))
     164          self.assertEqual(completer.complete('Ellipsis', 0), 'Ellipsis()')
     165          self.assertIsNone(completer.complete('Ellipsis', 1))
     166  
     167  if __name__ == '__main__':
     168      unittest.main()