11"""Unit tests for the introspection script."""
22
3+ import sys
34from unittest .mock import MagicMock
45
56from scripts .introspect import (
1314 get_module_contents ,
1415 get_stdlib_modules ,
1516 is_public ,
17+ main ,
1618 should_include_member ,
1719)
1820
@@ -253,37 +255,46 @@ class TestFormatModule:
253255 def test_includes_type_line (self ) -> None :
254256 import collections
255257
256- lines = format_module (collections )
258+ lines = format_module (collections , False )
257259 assert "Type: module" in lines
258260
259261 def test_includes_contents_header (self ) -> None :
260262 import collections
261263
262- lines = format_module (collections )
264+ lines = format_module (collections , False )
263265 assert "Contents:" in lines
264266
265267 def test_includes_module_contents (self ) -> None :
266268 import collections
267269
268- lines = format_module (collections )
270+ lines = format_module (collections , False )
269271 output = "\n " .join (lines )
270272 assert "Counter" in output
271273 assert "deque" in output
272274
275+ def test_brief_outputs_names_only (self ) -> None :
276+ import collections
277+
278+ lines = format_module (collections , True )
279+ output = "\n " .join (lines )
280+ assert "Type: module" not in output
281+ assert "Contents:" not in output
282+ assert "Counter" in output
283+
273284
274285class TestFormatClass :
275286 """Tests for format_class function."""
276287
277288 def test_includes_type_line (self ) -> None :
278- lines = format_class (list )
289+ lines = format_class (list , False )
279290 assert "Type: class" in lines
280291
281292 def test_includes_methods_header (self ) -> None :
282- lines = format_class (list )
293+ lines = format_class (list , False )
283294 assert "Methods:" in lines
284295
285296 def test_includes_class_methods (self ) -> None :
286- lines = format_class (list )
297+ lines = format_class (list , False )
287298 output = "\n " .join (lines )
288299 assert "append" in output
289300 assert "pop" in output
@@ -292,44 +303,110 @@ def test_empty_class_shows_no_members_message(self) -> None:
292303 class EmptyClass :
293304 pass
294305
295- lines = format_class (EmptyClass )
306+ lines = format_class (EmptyClass , False )
296307 assert "(no public direct members)" in lines
297308
309+ def test_brief_outputs_names_only (self ) -> None :
310+ lines = format_class (list , True )
311+ output = "\n " .join (lines )
312+ assert "Type: class" not in output
313+ assert "Methods:" not in output
314+ assert "append" in output
315+
298316
299317class TestFormatItem :
300318 """Tests for format_item function."""
301319
302320 def test_includes_name_header (self ) -> None :
303- output = format_item ("builtins.list" , list , "builtins.locals" )
321+ output = format_item (
322+ "builtins.list" ,
323+ list ,
324+ "builtins.locals" ,
325+ brief = False ,
326+ include_next = True ,
327+ )
304328 assert "=== builtins.list ===" in output
305329
306330 def test_includes_next_line (self ) -> None :
307- output = format_item ("builtins.list" , list , "builtins.locals" )
331+ output = format_item (
332+ "builtins.list" ,
333+ list ,
334+ "builtins.locals" ,
335+ brief = False ,
336+ include_next = True ,
337+ )
308338 assert "Next: builtins.locals" in output
309339
310340 def test_last_item_message (self ) -> None :
311- output = format_item ("builtins.list" , list , None )
341+ output = format_item ("builtins.list" , list , None , brief = False , include_next = True )
312342 assert "This is the last item." in output
313343
314344 def test_formats_module (self ) -> None :
315345 import collections
316346
317- output = format_item ("collections" , collections , "collections.Counter" )
347+ output = format_item (
348+ "collections" ,
349+ collections ,
350+ "collections.Counter" ,
351+ brief = False ,
352+ include_next = True ,
353+ )
318354 assert "Type: module" in output
319355
320356 def test_formats_class (self ) -> None :
321- output = format_item ("builtins.list" , list , "builtins.locals" )
357+ output = format_item (
358+ "builtins.list" ,
359+ list ,
360+ "builtins.locals" ,
361+ brief = False ,
362+ include_next = True ,
363+ )
322364 assert "Type: class" in output
323365 assert "Methods:" in output
324366
325367 def test_formats_function (self ) -> None :
326- output = format_item ("builtins.len" , len , "builtins.license" )
368+ output = format_item (
369+ "builtins.len" ,
370+ len ,
371+ "builtins.license" ,
372+ brief = False ,
373+ include_next = True ,
374+ )
327375 assert "Type: function" in output
328376
329377 def test_formats_other_types (self ) -> None :
330- output = format_item ("builtins.True" , True , "builtins.tuple" )
378+ output = format_item (
379+ "builtins.True" ,
380+ True ,
381+ "builtins.tuple" ,
382+ brief = False ,
383+ include_next = True ,
384+ )
331385 assert "Type: bool" in output
332386
387+ def test_brief_formats_name_only_header (self ) -> None :
388+ output = format_item (
389+ "builtins.list" ,
390+ list ,
391+ "builtins.locals" ,
392+ brief = True ,
393+ include_next = True ,
394+ )
395+ assert output .splitlines ()[0 ] == "builtins.list"
396+ assert "Type:" not in output
397+ assert "Next:" not in output
398+
399+ def test_brief_formats_function_as_name_only (self ) -> None :
400+ output = format_item (
401+ "builtins.len" ,
402+ len ,
403+ "builtins.license" ,
404+ brief = True ,
405+ include_next = True ,
406+ )
407+ assert output .strip () == "builtins.len"
408+ assert "Type:" not in output
409+
333410
334411class TestFindItemIndex :
335412 """Tests for find_item_index function."""
@@ -364,7 +441,13 @@ def test_full_workflow(self) -> None:
364441 # First item should be formattable
365442 first_name , first_obj = items [0 ]
366443 second_name = items [1 ][0 ] if len (items ) > 1 else None
367- output = format_item (first_name , first_obj , second_name )
444+ output = format_item (
445+ first_name ,
446+ first_obj ,
447+ second_name ,
448+ brief = False ,
449+ include_next = True ,
450+ )
368451 assert first_name in output
369452
370453 # Should be able to find items
@@ -373,7 +456,13 @@ def test_full_workflow(self) -> None:
373456
374457 def test_builtins_list_format (self ) -> None :
375458 """Test that builtins.list formats correctly with expected methods."""
376- output = format_item ("builtins.list" , list , "builtins.locals" )
459+ output = format_item (
460+ "builtins.list" ,
461+ list ,
462+ "builtins.locals" ,
463+ brief = False ,
464+ include_next = True ,
465+ )
377466
378467 assert "=== builtins.list ===" in output
379468 assert "Type: class" in output
@@ -390,3 +479,11 @@ def test_builtins_list_format(self) -> None:
390479 assert "reverse" in output
391480 assert "sort" in output
392481 assert "Next: builtins.locals" in output
482+
483+ def test_all_brief_has_no_blank_lines (self , monkeypatch , capsys ) -> None :
484+ monkeypatch .setattr (sys , "argv" , ["introspect.py" , "--all" , "--brief" ])
485+ main ()
486+ output = capsys .readouterr ().out .strip ()
487+ lines = output .splitlines ()
488+ assert len (lines ) > 1
489+ assert "" not in lines
0 commit comments