33 * Licensed under the MIT License. See License.txt in the project root for license information.
44 *--------------------------------------------------------------------------------------------*/
55import * as assert from 'assert' ;
6- import { dirname , basename , distinctParents , joinPath , isEqual , isEqualOrParent , hasToIgnoreCase , normalizePath , isAbsolutePath , isMalformedFileUri } from 'vs/base/common/resources' ;
6+ import { dirname , basename , distinctParents , joinPath , isEqual , isEqualOrParent , hasToIgnoreCase , normalizePath , isAbsolutePath , isMalformedFileUri , relativePath , removeTrailingPathSeparator , hasTrailingPathSeparator } from 'vs/base/common/resources' ;
77import { URI , setUriThrowOnMissingScheme } from 'vs/base/common/uri' ;
88import { isWindows } from 'vs/base/common/platform' ;
99
@@ -166,6 +166,102 @@ suite('Resources', () => {
166166 assert . equal ( isAbsolutePath ( URI . parse ( 'foo://a/foo/.' ) ) , true ) ;
167167 } ) ;
168168
169+ function assertTrailingSeparator ( u1 : URI , expected : boolean ) {
170+ assert . equal ( hasTrailingPathSeparator ( u1 ) , expected , u1 . toString ( ) ) ;
171+ }
172+
173+ function assertRemoveTrailingSeparator ( u1 : URI , expected : URI ) {
174+ assertEqualURI ( removeTrailingPathSeparator ( u1 ) , expected , u1 . toString ( ) ) ;
175+ }
176+
177+ test ( 'trailingPathSeparator' , ( ) => {
178+ assertTrailingSeparator ( URI . parse ( 'foo://a/foo' ) , false ) ;
179+ assertTrailingSeparator ( URI . parse ( 'foo://a/foo/' ) , true ) ;
180+ assertTrailingSeparator ( URI . parse ( 'foo://a/' ) , false ) ;
181+ assertTrailingSeparator ( URI . parse ( 'foo://a' ) , false ) ;
182+
183+ assertRemoveTrailingSeparator ( URI . parse ( 'foo://a/foo' ) , URI . parse ( 'foo://a/foo' ) ) ;
184+ assertRemoveTrailingSeparator ( URI . parse ( 'foo://a/foo/' ) , URI . parse ( 'foo://a/foo' ) ) ;
185+ assertRemoveTrailingSeparator ( URI . parse ( 'foo://a/' ) , URI . parse ( 'foo://a/' ) ) ;
186+ assertRemoveTrailingSeparator ( URI . parse ( 'foo://a' ) , URI . parse ( 'foo://a' ) ) ;
187+
188+ if ( isWindows ) {
189+ assertTrailingSeparator ( URI . file ( 'c:\\a\\foo' ) , false ) ;
190+ assertTrailingSeparator ( URI . file ( 'c:\\a\\foo\\' ) , true ) ;
191+ assertTrailingSeparator ( URI . file ( 'c:\\' ) , false ) ;
192+ assertTrailingSeparator ( URI . file ( '\\\\server\\share\\some\\' ) , true ) ;
193+ assertTrailingSeparator ( URI . file ( '\\\\server\\share\\' ) , false ) ;
194+
195+ assertRemoveTrailingSeparator ( URI . file ( 'c:\\a\\foo' ) , URI . file ( 'c:\\a\\foo' ) ) ;
196+ assertRemoveTrailingSeparator ( URI . file ( 'c:\\a\\foo\\' ) , URI . file ( 'c:\\a\\foo' ) ) ;
197+ assertRemoveTrailingSeparator ( URI . file ( 'c:\\' ) , URI . file ( 'c:\\' ) ) ;
198+ assertRemoveTrailingSeparator ( URI . file ( '\\\\server\\share\\some\\' ) , URI . file ( '\\\\server\\share\\some' ) ) ;
199+ assertRemoveTrailingSeparator ( URI . file ( '\\\\server\\share\\' ) , URI . file ( '\\\\server\\share\\' ) ) ;
200+ } else {
201+ assertTrailingSeparator ( URI . file ( '/foo/bar' ) , false ) ;
202+ assertTrailingSeparator ( URI . file ( '/foo/bar/' ) , true ) ;
203+ assertTrailingSeparator ( URI . file ( '/' ) , false ) ;
204+
205+ assertRemoveTrailingSeparator ( URI . file ( '/foo/bar' ) , URI . file ( '/foo/bar' ) ) ;
206+ assertRemoveTrailingSeparator ( URI . file ( '/foo/bar/' ) , URI . file ( '/foo/bar' ) ) ;
207+ assertRemoveTrailingSeparator ( URI . file ( '/' ) , URI . file ( '/' ) ) ;
208+ }
209+ } ) ;
210+
211+ function assertEqualURI ( actual : URI , expected : URI , message ?: string ) {
212+ if ( ! isEqual ( expected , actual ) ) {
213+ assert . equal ( expected . toString ( ) , actual . toString ( ) , message ) ;
214+ }
215+ }
216+
217+ function assertRelativePath ( u1 : URI , u2 : URI , expectedPath : string | undefined , ignoreJoin ?: boolean ) {
218+ assert . equal ( relativePath ( u1 , u2 ) , expectedPath , `from ${ u1 . toString ( ) } to ${ u2 . toString ( ) } ` ) ;
219+ if ( expectedPath !== undefined && ! ignoreJoin ) {
220+ assertEqualURI ( removeTrailingPathSeparator ( joinPath ( u1 , expectedPath ) ) , removeTrailingPathSeparator ( u2 ) , 'joinPath on relativePath should be equal' ) ;
221+ }
222+ }
223+
224+ test ( 'relativePath' , ( ) => {
225+ assertRelativePath ( URI . parse ( 'foo://a/foo' ) , URI . parse ( 'foo://a/foo/bar' ) , 'bar' ) ;
226+ assertRelativePath ( URI . parse ( 'foo://a/foo' ) , URI . parse ( 'foo://a/foo/bar/' ) , 'bar' ) ;
227+ assertRelativePath ( URI . parse ( 'foo://a/foo' ) , URI . parse ( 'foo://a/foo/bar/goo' ) , 'bar/goo' ) ;
228+ assertRelativePath ( URI . parse ( 'foo://a/' ) , URI . parse ( 'foo://a/foo/bar/goo' ) , 'foo/bar/goo' ) ;
229+ assertRelativePath ( URI . parse ( 'foo://a/foo/xoo' ) , URI . parse ( 'foo://a/foo/bar' ) , '../bar' ) ;
230+ assertRelativePath ( URI . parse ( 'foo://a/foo/xoo/yoo' ) , URI . parse ( 'foo://a' ) , '../../..' ) ;
231+ assertRelativePath ( URI . parse ( 'foo://a/foo' ) , URI . parse ( 'foo://a/foo/' ) , '' ) ;
232+ assertRelativePath ( URI . parse ( 'foo://a/foo/' ) , URI . parse ( 'foo://a/foo' ) , '' ) ;
233+ assertRelativePath ( URI . parse ( 'foo://a/foo/' ) , URI . parse ( 'foo://a/foo/' ) , '' ) ;
234+ assertRelativePath ( URI . parse ( 'foo://a/foo' ) , URI . parse ( 'foo://a/foo' ) , '' ) ;
235+ assertRelativePath ( URI . parse ( 'foo://a' ) , URI . parse ( 'foo://a' ) , '' ) ;
236+ assertRelativePath ( URI . parse ( 'foo://a/' ) , URI . parse ( 'foo://a/' ) , '' ) ;
237+ assertRelativePath ( URI . parse ( 'foo://a/' ) , URI . parse ( 'foo://a' ) , '' ) ;
238+ assertRelativePath ( URI . parse ( 'foo://a/foo?q' ) , URI . parse ( 'foo://a/foo/bar#h' ) , 'bar' ) ;
239+ assertRelativePath ( URI . parse ( 'foo://' ) , URI . parse ( 'foo://a/b' ) , undefined ) ;
240+ assertRelativePath ( URI . parse ( 'foo://a2/b' ) , URI . parse ( 'foo://a/b' ) , undefined ) ;
241+ assertRelativePath ( URI . parse ( 'goo://a/b' ) , URI . parse ( 'foo://a/b' ) , undefined ) ;
242+
243+ if ( isWindows ) {
244+ assertRelativePath ( URI . file ( 'c:\\foo\\bar' ) , URI . file ( 'c:\\foo\\bar' ) , '' ) ;
245+ assertRelativePath ( URI . file ( 'c:\\foo\\bar\\huu' ) , URI . file ( 'c:\\foo\\bar' ) , '..' ) ;
246+ assertRelativePath ( URI . file ( 'c:\\foo\\bar\\a1\\a2' ) , URI . file ( 'c:\\foo\\bar' ) , '../..' ) ;
247+ assertRelativePath ( URI . file ( 'c:\\foo\\bar\\' ) , URI . file ( 'c:\\foo\\bar\\a1\\a2' ) , 'a1/a2' ) ;
248+ assertRelativePath ( URI . file ( 'c:\\foo\\bar\\' ) , URI . file ( 'c:\\foo\\bar\\a1\\a2\\' ) , 'a1/a2' ) ;
249+ assertRelativePath ( URI . file ( 'c:\\' ) , URI . file ( 'c:\\foo\\bar' ) , 'foo/bar' ) ;
250+ assertRelativePath ( URI . file ( '\\\\server\\share\\some\\' ) , URI . file ( '\\\\server\\share\\some\\path' ) , 'path' ) ;
251+ assertRelativePath ( URI . file ( '\\\\server\\share\\some\\' ) , URI . file ( '\\\\server\\share2\\some\\path' ) , '../../share2/some/path' , true ) ; // ignore joinPath assert: path.join is not root aware
252+ } else {
253+ assertRelativePath ( URI . file ( '/a/foo' ) , URI . file ( '/a/foo/bar' ) , 'bar' ) ;
254+ assertRelativePath ( URI . file ( '/a/foo' ) , URI . file ( '/a/foo/bar/' ) , 'bar' ) ;
255+ assertRelativePath ( URI . file ( '/a/foo' ) , URI . file ( '/a/foo/bar/goo' ) , 'bar/goo' ) ;
256+ assertRelativePath ( URI . file ( '/a/' ) , URI . file ( '/a/foo/bar/goo' ) , 'foo/bar/goo' ) ;
257+ assertRelativePath ( URI . file ( '/' ) , URI . file ( '/a/foo/bar/goo' ) , 'a/foo/bar/goo' ) ;
258+ assertRelativePath ( URI . file ( '/a/foo/xoo' ) , URI . file ( '/a/foo/bar' ) , '../bar' ) ;
259+ assertRelativePath ( URI . file ( '/a/foo/xoo/yoo' ) , URI . file ( '/a' ) , '../../..' ) ;
260+ assertRelativePath ( URI . file ( '/a/foo' ) , URI . file ( '/a/foo/' ) , '' ) ;
261+ assertRelativePath ( URI . file ( '/a/foo' ) , URI . file ( '/b/foo/' ) , '../../b/foo' ) ;
262+ }
263+ } ) ;
264+
169265 test ( 'isEqual' , ( ) => {
170266 let fileURI = isWindows ? URI . file ( 'c:\\foo\\bar' ) : URI . file ( '/foo/bar' ) ;
171267 let fileURI2 = isWindows ? URI . file ( 'C:\\foo\\Bar' ) : URI . file ( '/foo/Bar' ) ;
@@ -184,6 +280,8 @@ suite('Resources', () => {
184280 assert . equal ( isEqual ( fileURI3 , fileURI4 , false ) , false ) ;
185281
186282 assert . equal ( isEqual ( fileURI , fileURI3 , true ) , false ) ;
283+
284+ assert . equal ( isEqual ( URI . parse ( 'foo://server' ) , URI . parse ( 'foo://server/' ) ) , true ) ;
187285 } ) ;
188286
189287 test ( 'isEqualOrParent' , ( ) => {
0 commit comments