@@ -46,25 +46,36 @@ def test_builtins(self):
4646
4747 # Python class that inherits builtin methods
4848 class List (list ): "List() doc"
49+
4950 # Simulate builtin with no docstring for default tip test
5051 class SB : __call__ = None
5152
5253 def gtest (obj , out ):
5354 self .assertEqual (signature (obj ), out )
5455
5556 if List .__doc__ is not None :
56- gtest (List , List .__doc__ )
57+ gtest (List , '(iterable=(), /)' + ct ._argument_positional + '\n ' +
58+ List .__doc__ )
5759 gtest (list .__new__ ,
58- 'Create and return a new object. See help(type) for accurate signature.' )
60+ '(*args, **kwargs) \n Create and return a new object. See help(type) for accurate signature.' )
5961 gtest (list .__init__ ,
62+ '(self, /, *args, **kwargs)' + ct ._argument_positional + '\n ' +
6063 'Initialize self. See help(type(self)) for accurate signature.' )
61- append_doc = "Append object to the end of the list."
62- gtest (list .append , append_doc )
63- gtest ([] .append , append_doc )
64- gtest (List .append , append_doc )
64+ append_doc = ct . _argument_positional + " \n Append object to the end of the list."
65+ gtest (list .append , '(self, object, /)' + append_doc )
66+ gtest (List .append , '(self, object, /)' + append_doc )
67+ gtest ([] .append , '(object, /)' + append_doc )
6568
6669 gtest (types .MethodType , "method(function, instance)" )
6770 gtest (SB (), default_tip )
71+ import re
72+ p = re .compile ('' )
73+ gtest (re .sub , '''(pattern, repl, string, count=0, flags=0)\n Return the string obtained by replacing the leftmost
74+ non-overlapping occurrences of the pattern in string by the
75+ replacement repl. repl can be either a string or a callable;
76+ if a string, backslash escapes in it are processed. If it is
77+ a callable, it's passed the match object and must return''' )
78+ gtest (p .sub , '''(repl, string, count=0)\n Return the string obtained by replacing the leftmost non-overlapping occurrences o...''' )
6879
6980 def test_signature_wrap (self ):
7081 if textwrap .TextWrapper .__doc__ is not None :
@@ -132,12 +143,20 @@ def test_starred_parameter(self):
132143 # test that starred first parameter is *not* removed from argspec
133144 class C :
134145 def m1 (* args ): pass
135- def m2 (** kwds ): pass
136146 c = C ()
137- for meth , mtip in ((C .m1 , '(*args)' ), (c .m1 , "(*args)" ),
138- (C .m2 , "(**kwds)" ), (c .m2 , "(**kwds)" ),):
147+ for meth , mtip in ((C .m1 , '(*args)' ), (c .m1 , "(*args)" ),):
139148 self .assertEqual (signature (meth ), mtip )
140149
150+ def test_invalid_method_signature (self ):
151+ class C :
152+ def m2 (** kwargs ): pass
153+ class Test :
154+ def __call__ (* , a ): pass
155+
156+ mtip = ct ._invalid_method
157+ self .assertEqual (signature (C ().m2 ), mtip )
158+ self .assertEqual (signature (Test ()), mtip )
159+
141160 def test_non_ascii_name (self ):
142161 # test that re works to delete a first parameter name that
143162 # includes non-ascii chars, such as various forms of A.
@@ -156,17 +175,23 @@ def test_attribute_exception(self):
156175 class NoCall :
157176 def __getattr__ (self , name ):
158177 raise BaseException
159- class Call (NoCall ):
178+ class CallA (NoCall ):
179+ def __call__ (oui , a , b , c ):
180+ pass
181+ class CallB (NoCall ):
160182 def __call__ (self , ci ):
161183 pass
162- for meth , mtip in ((NoCall , default_tip ), (Call , default_tip ),
163- (NoCall (), '' ), (Call (), '(ci)' )):
184+
185+ for meth , mtip in ((NoCall , default_tip ), (CallA , default_tip ),
186+ (NoCall (), '' ), (CallA (), '(a, b, c)' ),
187+ (CallB (), '(ci)' )):
164188 self .assertEqual (signature (meth ), mtip )
165189
166190 def test_non_callables (self ):
167191 for obj in (0 , 0.0 , '0' , b'0' , [], {}):
168192 self .assertEqual (signature (obj ), '' )
169193
194+
170195class Get_entityTest (unittest .TestCase ):
171196 def test_bad_entity (self ):
172197 self .assertIsNone (ct .get_entity ('1/0' ))
0 commit comments