11import re
22from pathlib import Path
3- from typing import Any , Generator , Tuple , Union
3+ from typing import Any , Generator , NamedTuple , Tuple , Union
44
55import pytest
66
99)
1010
1111
12+ class GeneratedTestData (NamedTuple ):
13+ name : str
14+ line : int
15+ character : int
16+ expression : str
17+
18+
1219def generate_tests_from_source_document (
13- path : str ,
14- ) -> Generator [Union [Tuple [str , str , int , int , str ], Any ], None , None ]:
15- file = Path (path ).relative_to (Path ("." ).parent .absolute ())
16- file_str = str (file ).replace ("\\ " , "/" )
20+ path : Path ,
21+ ) -> Generator [Union [Tuple [Path , GeneratedTestData ], Any ], None , None ]:
22+
1723 current_line = 0
18- for line , text in enumerate (file .read_text ().splitlines ()):
24+ for line , text in enumerate (path .read_text ().splitlines ()):
1925
2026 match = TEST_EXPRESSION_LINE .match (text )
2127 if match :
@@ -26,16 +32,30 @@ def generate_tests_from_source_document(
2632 if name and expression :
2733 if skip :
2834 yield pytest .param (
29- file_str , name , current_line , start , expression , marks = pytest .mark .skip (reason = "TODO" )
35+ path ,
36+ GeneratedTestData (name , current_line , start , expression ),
37+ marks = pytest .mark .skip (reason = "TODO" ),
3038 )
3139 else :
3240 if end - start == 1 :
33- yield file_str , name , current_line , start , expression
41+ yield path , GeneratedTestData ( name , current_line , start , expression )
3442 else :
35- yield file_str , name , current_line , start , expression
43+ yield path , GeneratedTestData ( name , current_line , start , expression )
3644 if end - start > 2 :
37- yield file_str , name , current_line , int (start + (end - start ) / 2 ), expression
45+ yield path , GeneratedTestData (
46+ name , current_line , int (start + (end - start ) / 2 ), expression
47+ )
3848
39- yield file_str , name , current_line , end - 1 , expression
49+ yield path , GeneratedTestData ( name , current_line , end - 1 , expression )
4050 else :
4151 current_line = line
52+
53+
54+ def generate_test_id (params : Any ) -> Any :
55+ if isinstance (params , GeneratedTestData ):
56+ return f"{ params .line } -{ params .character } -{ params .name } "
57+
58+ if isinstance (params , Path ):
59+ return params .name
60+
61+ return params
0 commit comments