@@ -759,5 +759,65 @@ public static void Uri_DoesNotLockOnString()
759
759
Assert . True ( Monitor . TryEnter ( uriString , TimeSpan . FromSeconds ( 10 ) ) ) ;
760
760
Assert . False ( timedOut ) ;
761
761
}
762
+
763
+ public static IEnumerable < object [ ] > FilePathHandlesNonAscii_TestData ( )
764
+ {
765
+ if ( PlatformDetection . IsNotWindows )
766
+ {
767
+ // Unix absolute file path
768
+ yield return new object [ ] { "/\u00FC ri/" , "file:///\u00FC ri/" , "/%C3%BCri/" , "file:///%C3%BCri/" , "/\u00FC ri/" } ;
769
+ yield return new object [ ] { "/a/b\uD83D \uDE1F /Foo.cs" , "file:///a/b\uD83D \uDE1F /Foo.cs" , "/a/b%F0%9F%98%9F/Foo.cs" , "file:///a/b%F0%9F%98%9F/Foo.cs" , "/a/b\uD83D \uDE1F /Foo.cs" } ;
770
+ }
771
+
772
+ // Absolute fie path
773
+ yield return new object [ ] { "file:///\u00FC ri/" , "file:///\u00FC ri/" , "/%C3%BCri/" , "file:///%C3%BCri/" , "/\u00FC ri/" } ;
774
+ yield return new object [ ] { "file:///a/b\uD83D \uDE1F /Foo.cs" , "file:///a/b\uD83D \uDE1F /Foo.cs" , "/a/b%F0%9F%98%9F/Foo.cs" , "file:///a/b%F0%9F%98%9F/Foo.cs" , "/a/b\uD83D \uDE1F /Foo.cs" } ;
775
+
776
+ // DOS
777
+ yield return new object [ ] { "file://C:/\u00FC ri/" , "file:///C:/\u00FC ri/" , "C:/%C3%BCri/" , "file:///C:/%C3%BCri/" , "C:\\ \u00FC ri\\ " } ;
778
+ yield return new object [ ] { "file:///C:/\u00FC ri/" , "file:///C:/\u00FC ri/" , "C:/%C3%BCri/" , "file:///C:/%C3%BCri/" , "C:\\ \u00FC ri\\ " } ;
779
+ yield return new object [ ] { "C:/\u00FC ri/" , "file:///C:/\u00FC ri/" , "C:/%C3%BCri/" , "file:///C:/%C3%BCri/" , "C:\\ \u00FC ri\\ " } ;
780
+
781
+ // UNC
782
+ yield return new object [ ] { "\\ \\ \u00FC ri/" , "file://\u00FC ri/" , "/" , "file://\u00FC ri/" , "\\ \\ \u00FC ri\\ " } ;
783
+ yield return new object [ ] { "file://\u00FC ri/" , "file://\u00FC ri/" , "/" , "file://\u00FC ri/" , "\\ \\ \u00FC ri\\ " } ;
784
+
785
+ // ? and # handling
786
+ if ( PlatformDetection . IsWindows )
787
+ {
788
+ yield return new object [ ] { "file:///a/?b/c\u00FC /" , "file:///a/?b/c\u00FC /" , "/a/" , "file:///a/?b/c%C3%BC/" , "/a/" } ;
789
+ yield return new object [ ] { "file:///a/#b/c\u00FC /" , "file:///a/#b/c\u00FC /" , "/a/" , "file:///a/#b/c%C3%BC/" , "/a/" } ;
790
+ yield return new object [ ] { "file:///a/?b/#c/d\u00FC /" , "file:///a/?b/#c/d\u00FC /" , "/a/" , "file:///a/?b/#c/d%C3%BC/" , "/a/" } ;
791
+ }
792
+ else
793
+ {
794
+ yield return new object [ ] { "/a/?b/c\u00FC /" , "file:///a/%3Fb/c\u00FC /" , "/a/%3Fb/c%C3%BC/" , "file:///a/%3Fb/c%C3%BC/" , "/a/?b/c\u00FC /" } ;
795
+ yield return new object [ ] { "/a/#b/c\u00FC /" , "file:///a/%23b/c\u00FC /" , "/a/%23b/c%C3%BC/" , "file:///a/%23b/c%C3%BC/" , "/a/#b/c\u00FC /" } ;
796
+ yield return new object [ ] { "/a/?b/#c/d\u00FC /" , "file:///a/%3Fb/%23c/d\u00FC /" , "/a/%3Fb/%23c/d%C3%BC/" , "file:///a/%3Fb/%23c/d%C3%BC/" , "/a/?b/#c/d\u00FC /" } ;
797
+
798
+ yield return new object [ ] { "file:///a/?b/c\u00FC /" , "file:///a/?b/c\u00FC /" , "/a/" , "file:///a/?b/c%C3%BC/" , "/a/" } ;
799
+ yield return new object [ ] { "file:///a/#b/c\u00FC /" , "file:///a/#b/c\u00FC /" , "/a/" , "file:///a/#b/c%C3%BC/" , "/a/" } ;
800
+ yield return new object [ ] { "file:///a/?b/#c/d\u00FC /" , "file:///a/?b/#c/d\u00FC /" , "/a/" , "file:///a/?b/#c/d%C3%BC/" , "/a/" } ;
801
+ }
802
+ }
803
+
804
+ [ Theory ]
805
+ [ MemberData ( nameof ( FilePathHandlesNonAscii_TestData ) ) ]
806
+ public static void FilePathHandlesNonAscii ( string uriString , string toString , string absolutePath , string absoluteUri , string localPath )
807
+ {
808
+ var uri = new Uri ( uriString ) ;
809
+
810
+ Assert . Equal ( toString , uri . ToString ( ) ) ;
811
+ Assert . Equal ( absolutePath , uri . AbsolutePath ) ;
812
+ Assert . Equal ( absoluteUri , uri . AbsoluteUri ) ;
813
+ Assert . Equal ( localPath , uri . LocalPath ) ;
814
+
815
+ var uri2 = new Uri ( uri . AbsoluteUri ) ;
816
+
817
+ Assert . Equal ( toString , uri2 . ToString ( ) ) ;
818
+ Assert . Equal ( absolutePath , uri2 . AbsolutePath ) ;
819
+ Assert . Equal ( absoluteUri , uri2 . AbsoluteUri ) ;
820
+ Assert . Equal ( localPath , uri2 . LocalPath ) ;
821
+ }
762
822
}
763
823
}
0 commit comments