| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2015-11-28 22:38:24 +00:00
										 |  |  | from unittest.mock import patch | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | import builtins | 
					
						
							|  |  |  | import rlcompleter | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CompleteMe: | 
					
						
							|  |  |  |     """ Trivial class used in testing rlcompleter.Completer. """ | 
					
						
							|  |  |  |     spam = 1 | 
					
						
							| 
									
										
										
										
											2015-09-27 13:43:50 +03:00
										 |  |  |     _ham = 2 | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestRlcompleter(unittest.TestCase): | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.stdcompleter = rlcompleter.Completer() | 
					
						
							|  |  |  |         self.completer = rlcompleter.Completer(dict(spam=int, | 
					
						
							|  |  |  |                                                     egg=str, | 
					
						
							|  |  |  |                                                     CompleteMe=CompleteMe)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # forces stdcompleter to bind builtins namespace | 
					
						
							|  |  |  |         self.stdcompleter.complete('', 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_namespace(self): | 
					
						
							|  |  |  |         class A(dict): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         class B(list): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertTrue(self.stdcompleter.use_main_ns) | 
					
						
							|  |  |  |         self.assertFalse(self.completer.use_main_ns) | 
					
						
							|  |  |  |         self.assertFalse(rlcompleter.Completer(A()).use_main_ns) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, rlcompleter.Completer, B((1,))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_global_matches(self): | 
					
						
							|  |  |  |         # test with builtins namespace | 
					
						
							| 
									
										
										
										
											2010-10-21 07:40:03 +00:00
										 |  |  |         self.assertEqual(sorted(self.stdcompleter.global_matches('di')), | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  |                          [x+'(' for x in dir(builtins) if x.startswith('di')]) | 
					
						
							| 
									
										
										
										
											2010-10-21 07:40:03 +00:00
										 |  |  |         self.assertEqual(sorted(self.stdcompleter.global_matches('st')), | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  |                          [x+'(' for x in dir(builtins) if x.startswith('st')]) | 
					
						
							|  |  |  |         self.assertEqual(self.stdcompleter.global_matches('akaksajadhak'), []) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # test with a customized namespace | 
					
						
							|  |  |  |         self.assertEqual(self.completer.global_matches('CompleteM'), | 
					
						
							|  |  |  |                          ['CompleteMe(']) | 
					
						
							|  |  |  |         self.assertEqual(self.completer.global_matches('eg'), | 
					
						
							|  |  |  |                          ['egg(']) | 
					
						
							|  |  |  |         # XXX: see issue5256 | 
					
						
							|  |  |  |         self.assertEqual(self.completer.global_matches('CompleteM'), | 
					
						
							|  |  |  |                          ['CompleteMe(']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_attr_matches(self): | 
					
						
							|  |  |  |         # test with builtins namespace | 
					
						
							|  |  |  |         self.assertEqual(self.stdcompleter.attr_matches('str.s'), | 
					
						
							|  |  |  |                          ['str.{}('.format(x) for x in dir(str) | 
					
						
							|  |  |  |                           if x.startswith('s')]) | 
					
						
							|  |  |  |         self.assertEqual(self.stdcompleter.attr_matches('tuple.foospamegg'), []) | 
					
						
							| 
									
										
										
										
											2015-09-27 13:43:50 +03:00
										 |  |  |         expected = sorted({'None.%s%s' % (x, '(' if x != '__doc__' else '') | 
					
						
							|  |  |  |                            for x in dir(None)}) | 
					
						
							|  |  |  |         self.assertEqual(self.stdcompleter.attr_matches('None.'), expected) | 
					
						
							|  |  |  |         self.assertEqual(self.stdcompleter.attr_matches('None._'), expected) | 
					
						
							|  |  |  |         self.assertEqual(self.stdcompleter.attr_matches('None.__'), expected) | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # test with a customized namespace | 
					
						
							|  |  |  |         self.assertEqual(self.completer.attr_matches('CompleteMe.sp'), | 
					
						
							|  |  |  |                          ['CompleteMe.spam']) | 
					
						
							|  |  |  |         self.assertEqual(self.completer.attr_matches('Completeme.egg'), []) | 
					
						
							| 
									
										
										
										
											2015-09-27 13:43:50 +03:00
										 |  |  |         self.assertEqual(self.completer.attr_matches('CompleteMe.'), | 
					
						
							|  |  |  |                          ['CompleteMe.mro(', 'CompleteMe.spam']) | 
					
						
							|  |  |  |         self.assertEqual(self.completer.attr_matches('CompleteMe._'), | 
					
						
							|  |  |  |                          ['CompleteMe._ham']) | 
					
						
							|  |  |  |         matches = self.completer.attr_matches('CompleteMe.__') | 
					
						
							|  |  |  |         for x in matches: | 
					
						
							|  |  |  |             self.assertTrue(x.startswith('CompleteMe.__'), x) | 
					
						
							|  |  |  |         self.assertIn('CompleteMe.__name__', matches) | 
					
						
							|  |  |  |         self.assertIn('CompleteMe.__new__(', matches) | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-28 22:38:24 +00:00
										 |  |  |         with patch.object(CompleteMe, "me", CompleteMe, create=True): | 
					
						
							|  |  |  |             self.assertEqual(self.completer.attr_matches('CompleteMe.me.me.sp'), | 
					
						
							|  |  |  |                              ['CompleteMe.me.me.spam']) | 
					
						
							|  |  |  |             self.assertEqual(self.completer.attr_matches('egg.s'), | 
					
						
							|  |  |  |                              ['egg.{}('.format(x) for x in dir(str) | 
					
						
							|  |  |  |                               if x.startswith('s')]) | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-13 22:47:00 +00:00
										 |  |  |     def test_excessive_getattr(self): | 
					
						
							|  |  |  |         # Ensure getattr() is invoked no more than once per attribute | 
					
						
							|  |  |  |         class Foo: | 
					
						
							|  |  |  |             calls = 0 | 
					
						
							|  |  |  |             @property | 
					
						
							|  |  |  |             def bar(self): | 
					
						
							|  |  |  |                 self.calls += 1 | 
					
						
							|  |  |  |                 return None | 
					
						
							|  |  |  |         f = Foo() | 
					
						
							|  |  |  |         completer = rlcompleter.Completer(dict(f=f)) | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('f.b', 0), 'f.bar') | 
					
						
							|  |  |  |         self.assertEqual(f.calls, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-13 23:54:02 +00:00
										 |  |  |     def test_uncreated_attr(self): | 
					
						
							|  |  |  |         # Attributes like properties and slots should be completed even when | 
					
						
							|  |  |  |         # they haven't been created on an instance | 
					
						
							|  |  |  |         class Foo: | 
					
						
							|  |  |  |             __slots__ = ("bar",) | 
					
						
							|  |  |  |         completer = rlcompleter.Completer(dict(f=Foo())) | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('f.', 0), 'f.bar') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-04 14:00:26 -05:00
										 |  |  |     @unittest.mock.patch('rlcompleter._readline_available', False) | 
					
						
							| 
									
										
										
										
											2015-07-28 00:06:31 +03:00
										 |  |  |     def test_complete(self): | 
					
						
							|  |  |  |         completer = rlcompleter.Completer() | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('', 0), '\t') | 
					
						
							| 
									
										
										
										
											2015-09-27 13:26:03 +03:00
										 |  |  |         self.assertEqual(completer.complete('a', 0), 'and ') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('a', 1), 'as ') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('as', 2), 'assert ') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('an', 0), 'and ') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('pa', 0), 'pass') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('Fa', 0), 'False') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('el', 0), 'elif ') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('el', 1), 'else') | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('tr', 0), 'try:') | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-23 23:50:26 +00:00
										 |  |  |     def test_duplicate_globals(self): | 
					
						
							|  |  |  |         namespace = { | 
					
						
							|  |  |  |             'False': None,  # Keyword vs builtin vs namespace | 
					
						
							|  |  |  |             'assert': None,  # Keyword vs namespace | 
					
						
							|  |  |  |             'try': lambda: None,  # Keyword vs callable | 
					
						
							|  |  |  |             'memoryview': None,  # Callable builtin vs non-callable | 
					
						
							|  |  |  |             'Ellipsis': lambda: None,  # Non-callable builtin vs callable | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         completer = rlcompleter.Completer(namespace) | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('False', 0), 'False') | 
					
						
							|  |  |  |         self.assertIsNone(completer.complete('False', 1))  # No duplicates | 
					
						
							| 
									
										
										
										
											2015-11-24 00:20:00 +00:00
										 |  |  |         # Space or colon added due to being a reserved keyword | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('assert', 0), 'assert ') | 
					
						
							| 
									
										
										
										
											2015-11-23 23:50:26 +00:00
										 |  |  |         self.assertIsNone(completer.complete('assert', 1)) | 
					
						
							| 
									
										
										
										
											2015-11-24 00:20:00 +00:00
										 |  |  |         self.assertEqual(completer.complete('try', 0), 'try:') | 
					
						
							| 
									
										
										
										
											2015-11-23 23:50:26 +00:00
										 |  |  |         self.assertIsNone(completer.complete('try', 1)) | 
					
						
							|  |  |  |         # No opening bracket "(" because we overrode the built-in class | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('memoryview', 0), 'memoryview') | 
					
						
							|  |  |  |         self.assertIsNone(completer.complete('memoryview', 1)) | 
					
						
							|  |  |  |         self.assertEqual(completer.complete('Ellipsis', 0), 'Ellipsis(') | 
					
						
							|  |  |  |         self.assertIsNone(completer.complete('Ellipsis', 1)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 15:43:16 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2015-04-13 15:00:43 -05:00
										 |  |  |     unittest.main() |