@@ -4,9 +4,15 @@ use bstr::ByteSlice;
44fn parse_and_compare_baseline_urls ( ) {
55 let mut passed = 0 ;
66 let mut failed = 0 ;
7+ let mut expected_failures = 0 ;
78 let total = baseline:: URLS . len ( ) ;
89
910 for ( url, expected) in baseline:: URLS . iter ( ) {
11+ if baseline:: is_expected_failure_on_windows ( url) {
12+ expected_failures += 1 ;
13+ continue ;
14+ }
15+
1016 let result = std:: panic:: catch_unwind ( || {
1117 let actual = gix_url:: parse ( url) . expect ( "url should parse successfully" ) ;
1218 assert_urls_equal ( expected, & actual) ;
@@ -34,7 +40,9 @@ fn parse_and_compare_baseline_urls() {
3440 }
3541 }
3642
37- println ! ( "\n Baseline tests: {passed}/{total} passed, {failed} failed" ) ;
43+ println ! (
44+ "\n Baseline tests: {passed}/{total} passed, {failed} failed, {expected_failures} expected failures (skipped)"
45+ ) ;
3846
3947 if failed > 0 {
4048 panic ! ( "{failed} baseline test(s) failed" ) ;
@@ -147,6 +155,28 @@ mod baseline {
147155 out
148156 } ) ;
149157
158+ /// Known failures on Windows for IPv6 file URLs with paths.
159+ /// On Windows, these URLs fail to parse the path component correctly.
160+ pub fn is_expected_failure_on_windows ( url : & BStr ) -> bool {
161+ #[ cfg( windows) ]
162+ {
163+ const EXPECTED_FAILURES : & [ & str ] = & [
164+ "file://User@[::1]/repo" ,
165+ "file://User@[::1]/~repo" ,
166+ "file://User@[::1]/re:po" ,
167+ "file://User@[::1]/~re:po" ,
168+ "file://User@[::1]/re/po" ,
169+ "file://User@[::1]/~re/po" ,
170+ ] ;
171+ EXPECTED_FAILURES . iter ( ) . any ( |& expected| url == expected)
172+ }
173+ #[ cfg( not( windows) ) ]
174+ {
175+ let _ = url;
176+ false
177+ }
178+ }
179+
150180 #[ derive( Debug ) ]
151181 pub struct GitDiagUrl < ' a > {
152182 pub protocol : & ' a BStr ,
0 commit comments