@@ -179,5 +179,84 @@ for (const lang of languages) {
179179 assert . equal ( fn . deprecated , 'Async function deprecated' ) ;
180180 } ) ;
181181
182+ test ( 'Overloaded function' , ( { module} ) => {
183+ const exportedFn = module . getResolvedExport ( 'overloaded' ) ;
184+ const fn = module . getDeclaration ( 'overloaded' ) ;
185+ assert . equal ( fn , exportedFn ) ;
186+ assert . ok ( fn ?. isFunctionDeclaration ( ) ) ;
187+ assert . equal ( fn . name , 'overloaded' ) ;
188+ assert . equal (
189+ fn . description ,
190+ 'This signature works with strings or numbers.'
191+ ) ;
192+ assert . equal ( fn . summary , undefined ) ;
193+ assert . equal ( fn . parameters ?. length , 1 ) ;
194+ assert . equal ( fn . parameters ?. [ 0 ] . name , 'x' ) ;
195+ assert . equal (
196+ fn . parameters ?. [ 0 ] . description ,
197+ 'Accepts either a string or a number.'
198+ ) ;
199+ assert . equal ( fn . parameters ?. [ 0 ] . summary , undefined ) ;
200+ assert . equal ( fn . parameters ?. [ 0 ] . type ?. text , 'string | number' ) ;
201+ assert . equal ( fn . parameters ?. [ 0 ] . default , undefined ) ;
202+ assert . equal ( fn . parameters ?. [ 0 ] . rest , false ) ;
203+ assert . equal ( fn . return ?. type ?. text , 'string | number' ) ;
204+ assert . equal (
205+ fn . return ?. description ,
206+ 'Returns either a string or a number.'
207+ ) ;
208+ assert . equal ( fn . deprecated , undefined ) ;
209+
210+ // TODO: Run the same assertions in both languages once TS supports
211+ // `@overload` for JSDoc in JS.
212+ // <https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-rc/#overload-support-in-jsdoc>
213+ if ( lang === 'ts' ) {
214+ assert . ok ( fn . overloads ) ;
215+ assert . equal ( fn . overloads . length , 2 ) ;
216+
217+ assert . equal ( fn . overloads [ 0 ] . name , 'overloaded' ) ;
218+ assert . equal (
219+ fn . overloads [ 0 ] . description ,
220+ 'This signature only works with strings.'
221+ ) ;
222+ assert . equal ( fn . overloads [ 0 ] . summary , undefined ) ;
223+ assert . equal ( fn . overloads [ 0 ] . parameters ?. length , 1 ) ;
224+ assert . equal ( fn . overloads [ 0 ] . parameters ?. [ 0 ] . name , 'x' ) ;
225+ assert . equal (
226+ fn . overloads [ 0 ] . parameters ?. [ 0 ] . description ,
227+ 'Accepts a string.'
228+ ) ;
229+ assert . equal ( fn . overloads [ 0 ] . parameters ?. [ 0 ] . summary , undefined ) ;
230+ assert . equal ( fn . overloads [ 0 ] . parameters ?. [ 0 ] . type ?. text , 'string' ) ;
231+ assert . equal ( fn . overloads [ 0 ] . parameters ?. [ 0 ] . default , undefined ) ;
232+ assert . equal ( fn . overloads [ 0 ] . parameters ?. [ 0 ] . rest , false ) ;
233+ assert . equal ( fn . overloads [ 0 ] . return ?. type ?. text , 'string' ) ;
234+ assert . equal ( fn . overloads [ 0 ] . return ?. description , 'Returns a string.' ) ;
235+ assert . equal ( fn . overloads [ 0 ] . deprecated , undefined ) ;
236+
237+ assert . equal ( fn . overloads [ 1 ] . name , 'overloaded' ) ;
238+ assert . equal (
239+ fn . overloads [ 1 ] . description ,
240+ 'This signature only works with numbers.'
241+ ) ;
242+ assert . equal ( fn . overloads [ 1 ] . summary , undefined ) ;
243+ assert . equal ( fn . overloads [ 1 ] . parameters ?. length , 1 ) ;
244+ assert . equal ( fn . overloads [ 1 ] . parameters ?. [ 0 ] . name , 'x' ) ;
245+ assert . equal (
246+ fn . overloads [ 1 ] . parameters ?. [ 0 ] . description ,
247+ 'Accepts a number.'
248+ ) ;
249+ assert . equal ( fn . overloads [ 1 ] . parameters ?. [ 0 ] . summary , undefined ) ;
250+ assert . equal ( fn . overloads [ 1 ] . parameters ?. [ 0 ] . type ?. text , 'number' ) ;
251+ assert . equal ( fn . overloads [ 1 ] . parameters ?. [ 0 ] . default , undefined ) ;
252+ assert . equal ( fn . overloads [ 1 ] . parameters ?. [ 0 ] . rest , false ) ;
253+ assert . equal ( fn . overloads [ 1 ] . return ?. type ?. text , 'number' ) ;
254+ assert . equal ( fn . overloads [ 1 ] . return ?. description , 'Returns a number.' ) ;
255+ assert . equal ( fn . overloads [ 1 ] . deprecated , undefined ) ;
256+ } else {
257+ assert . equal ( fn . overloads ?. length ?? 0 , 0 ) ;
258+ }
259+ } ) ;
260+
182261 test . run ( ) ;
183262}
0 commit comments