@@ -35,40 +35,48 @@ def __test_relative_header_create_source(dir, include1, include2, is_include1_sy
3535
3636@pytest .mark .parametrize ("with_pragma_once" , (False , True ))
3737@pytest .mark .parametrize ("is_sys" , (False , True ))
38- def test_relative_header_1 (tmpdir , with_pragma_once , is_sys ):
38+ def test_relative_header_1 (record_property , tmpdir , with_pragma_once , is_sys ):
3939 _ , double_include_error = __test_relative_header_create_header (tmpdir , with_pragma_once = with_pragma_once )
4040
4141 test_file = __test_relative_header_create_source (tmpdir , "test.h" , "test.h" , is_include1_sys = is_sys , is_include2_sys = is_sys )
4242
4343 args = ([format_include_path_arg (tmpdir )] if is_sys else []) + [test_file ]
4444
45- _ , _ , stderr = simplecpp (args , cwd = tmpdir )
45+ _ , stdout , stderr = simplecpp (args , cwd = tmpdir )
46+ record_property ("stdout" , stdout )
47+ record_property ("stderr" , stderr )
4648
4749 if with_pragma_once :
4850 assert stderr == ''
4951 else :
5052 assert double_include_error in stderr
5153
54+ @pytest .mark .parametrize ("with_pragma_once" , (False , True ))
5255@pytest .mark .parametrize ("inv" , (False , True ))
5356@pytest .mark .parametrize ("source_relative" , (False , True ))
54- def test_relative_header_2 (tmpdir , inv , source_relative ):
55- header_file , _ = __test_relative_header_create_header (tmpdir )
57+ def test_relative_header_2 (record_property , tmpdir , with_pragma_once , inv , source_relative ):
58+ header_file , double_include_error = __test_relative_header_create_header (tmpdir , with_pragma_once = with_pragma_once )
5659
5760 test_file = __test_relative_header_create_source (tmpdir , "test.h" , header_file , inv = inv )
5861
5962 args = ["test.c" if source_relative else test_file ]
6063
6164 _ , stdout , stderr = simplecpp (args , cwd = tmpdir )
62- assert stderr == ''
63- if source_relative and not inv :
64- assert '#line 8 "test.h"' in stdout
65+ record_property ("stdout" , stdout )
66+ record_property ("stderr" , stderr )
67+ if with_pragma_once :
68+ assert stderr == ''
69+ if inv :
70+ assert f'#line 8 "{ pathlib .PurePath (tmpdir ).as_posix ()} /test.h"' in stdout
71+ else :
72+ assert '#line 8 "test.h"' in stdout
6573 else :
66- assert f'#line 8 " { pathlib . PurePath ( tmpdir ). as_posix () } /test.h"' in stdout
74+ assert double_include_error in stderr
6775
6876@pytest .mark .parametrize ("is_sys" , (False , True ))
6977@pytest .mark .parametrize ("inv" , (False , True ))
7078@pytest .mark .parametrize ("source_relative" , (False , True ))
71- def test_relative_header_3 (tmpdir , is_sys , inv , source_relative ):
79+ def test_relative_header_3 (record_property , tmpdir , is_sys , inv , source_relative ):
7280 test_subdir = os .path .join (tmpdir , "test_subdir" )
7381 os .mkdir (test_subdir )
7482 header_file , _ = __test_relative_header_create_header (test_subdir )
@@ -78,20 +86,23 @@ def test_relative_header_3(tmpdir, is_sys, inv, source_relative):
7886 args = ["test.c" if source_relative else test_file ]
7987
8088 _ , stdout , stderr = simplecpp (args , cwd = tmpdir )
89+ record_property ("stdout" , stdout )
90+ record_property ("stderr" , stderr )
8191
8292 if is_sys :
8393 assert "missing header: Header not found" in stderr
8494 else :
8595 assert stderr == ''
86- if source_relative and not inv :
87- assert '#line 8 "test_subdir/test.h"' in stdout
88- else :
96+ if inv :
8997 assert f'#line 8 "{ pathlib .PurePath (test_subdir ).as_posix ()} /test.h"' in stdout
98+ else :
99+ assert '#line 8 "test_subdir/test.h"' in stdout
90100
91101@pytest .mark .parametrize ("use_short_path" , (False , True ))
102+ @pytest .mark .parametrize ("relative_include_dir" , (False , True ))
92103@pytest .mark .parametrize ("is_sys" , (False , True ))
93104@pytest .mark .parametrize ("inv" , (False , True ))
94- def test_relative_header_4 (tmpdir , use_short_path , is_sys , inv ):
105+ def test_relative_header_4 (record_property , tmpdir , use_short_path , relative_include_dir , is_sys , inv ):
95106 test_subdir = os .path .join (tmpdir , "test_subdir" )
96107 os .mkdir (test_subdir )
97108 header_file , _ = __test_relative_header_create_header (test_subdir )
@@ -100,7 +111,69 @@ def test_relative_header_4(tmpdir, use_short_path, is_sys, inv):
100111
101112 test_file = __test_relative_header_create_source (tmpdir , header_file , "test.h" , is_include2_sys = is_sys , inv = inv )
102113
103- args = [format_include_path_arg (test_subdir ), test_file ]
114+ args = [format_include_path_arg ("test_subdir" if relative_include_dir else test_subdir ), test_file ]
104115
105- _ , _ , stderr = simplecpp (args , cwd = tmpdir )
116+ _ , stdout , stderr = simplecpp (args , cwd = tmpdir )
117+ record_property ("stdout" , stdout )
118+ record_property ("stderr" , stderr )
106119 assert stderr == ''
120+ if (use_short_path and not inv ) or (relative_include_dir and inv ):
121+ assert '#line 8 "test_subdir/test.h"' in stdout
122+ else :
123+ assert f'#line 8 "{ pathlib .PurePath (test_subdir ).as_posix ()} /test.h"' in stdout
124+
125+ @pytest .mark .parametrize ("with_pragma_once" , (False , True ))
126+ @pytest .mark .parametrize ("relative_include_dir" , (False , True ))
127+ @pytest .mark .parametrize ("is_sys" , (False , True ))
128+ @pytest .mark .parametrize ("inv" , (False , True ))
129+ def test_relative_header_5 (record_property , tmpdir , with_pragma_once , relative_include_dir , is_sys , inv ): # test relative paths with ..
130+ ## in this test, the subdir role is the opposite then the previous - it contains the test.c file, while the parent tmpdir contains the header file
131+ header_file , double_include_error = __test_relative_header_create_header (tmpdir , with_pragma_once = with_pragma_once )
132+ if is_sys :
133+ header_file_second_path = "test.h"
134+ else :
135+ header_file_second_path = "../test.h"
136+
137+ test_subdir = os .path .join (tmpdir , "test_subdir" )
138+ os .mkdir (test_subdir )
139+ test_file = __test_relative_header_create_source (test_subdir , header_file , header_file_second_path , is_include2_sys = is_sys , inv = inv )
140+
141+ args = ([format_include_path_arg (".." if relative_include_dir else tmpdir )] if is_sys else []) + ["test.c" ]
142+
143+ _ , stdout , stderr = simplecpp (args , cwd = test_subdir )
144+ record_property ("stdout" , stdout )
145+ record_property ("stderr" , stderr )
146+ if with_pragma_once :
147+ assert stderr == ''
148+ if (relative_include_dir or not is_sys ) and inv :
149+ assert '#line 8 "../test.h"' in stdout
150+ else :
151+ assert f'#line 8 "{ pathlib .PurePath (tmpdir ).as_posix ()} /test.h"' in stdout
152+ else :
153+ assert double_include_error in stderr
154+
155+ @pytest .mark .parametrize ("with_pragma_once" , (False , True ))
156+ @pytest .mark .parametrize ("relative_include_dir" , (False , True ))
157+ @pytest .mark .parametrize ("is_sys" , (False , True ))
158+ @pytest .mark .parametrize ("inv" , (False , True ))
159+ def test_relative_header_6 (record_property , tmpdir , with_pragma_once , relative_include_dir , is_sys , inv ): # test relative paths with .. that is resolved only by an include dir
160+ ## in this test, both the header and the source file are at the same dir, but there is a dummy inclusion dir as a subdir
161+ header_file , double_include_error = __test_relative_header_create_header (tmpdir , with_pragma_once = with_pragma_once )
162+
163+ test_subdir = os .path .join (tmpdir , "test_subdir" )
164+ os .mkdir (test_subdir )
165+ test_file = __test_relative_header_create_source (tmpdir , header_file , "../test.h" , is_include2_sys = is_sys , inv = inv )
166+
167+ args = [format_include_path_arg ("test_subdir" if relative_include_dir else test_subdir ), "test.c" ]
168+
169+ _ , stdout , stderr = simplecpp (args , cwd = tmpdir )
170+ record_property ("stdout" , stdout )
171+ record_property ("stderr" , stderr )
172+ if with_pragma_once :
173+ assert stderr == ''
174+ if relative_include_dir and inv :
175+ assert '#line 8 "test.h"' in stdout
176+ else :
177+ assert f'#line 8 "{ pathlib .PurePath (tmpdir ).as_posix ()} /test.h"' in stdout
178+ else :
179+ assert double_include_error in stderr
0 commit comments