@@ -354,6 +354,61 @@ def test_with_suffix(self):
354354 self .assertRaises (ValueError , P ('a/b' ).with_suffix , '.d/.' )
355355 self .assertRaises (TypeError , P ('a/b' ).with_suffix , None )
356356
357+ def test_relative_to (self ):
358+ P = self .cls
359+ p = P ('a/b' )
360+ self .assertEqual (p .relative_to (P ('' )), P ('a' , 'b' ))
361+ self .assertEqual (p .relative_to (P ('a' )), P ('b' ))
362+ self .assertEqual (p .relative_to (P ('a/b' )), P ('' ))
363+ self .assertEqual (p .relative_to (P ('' ), walk_up = True ), P ('a' , 'b' ))
364+ self .assertEqual (p .relative_to (P ('a' ), walk_up = True ), P ('b' ))
365+ self .assertEqual (p .relative_to (P ('a/b' ), walk_up = True ), P ('' ))
366+ self .assertEqual (p .relative_to (P ('a/c' ), walk_up = True ), P ('..' , 'b' ))
367+ self .assertEqual (p .relative_to (P ('a/b/c' ), walk_up = True ), P ('..' ))
368+ self .assertEqual (p .relative_to (P ('c' ), walk_up = True ), P ('..' , 'a' , 'b' ))
369+ self .assertRaises (ValueError , p .relative_to , P ('c' ))
370+ self .assertRaises (ValueError , p .relative_to , P ('a/b/c' ))
371+ self .assertRaises (ValueError , p .relative_to , P ('a/c' ))
372+ self .assertRaises (ValueError , p .relative_to , P ('/a' ))
373+ self .assertRaises (ValueError , p .relative_to , P ('../a' ))
374+ self .assertRaises (ValueError , p .relative_to , P ('a/..' ))
375+ self .assertRaises (ValueError , p .relative_to , P ('/a/..' ))
376+ self .assertRaises (ValueError , p .relative_to , P ('/' ), walk_up = True )
377+ self .assertRaises (ValueError , p .relative_to , P ('/a' ), walk_up = True )
378+ self .assertRaises (ValueError , p .relative_to , P ('../a' ), walk_up = True )
379+ self .assertRaises (ValueError , p .relative_to , P ('a/..' ), walk_up = True )
380+ self .assertRaises (ValueError , p .relative_to , P ('/a/..' ), walk_up = True )
381+ class Q (self .cls ):
382+ __eq__ = object .__eq__
383+ __hash__ = object .__hash__
384+ q = Q ('a/b' )
385+ self .assertTrue (q .relative_to (q ))
386+ self .assertRaises (ValueError , q .relative_to , Q ('' ))
387+ self .assertRaises (ValueError , q .relative_to , Q ('a' ))
388+ self .assertRaises (ValueError , q .relative_to , Q ('a' ), walk_up = True )
389+ self .assertRaises (ValueError , q .relative_to , Q ('a/b' ))
390+ self .assertRaises (ValueError , q .relative_to , Q ('c' ))
391+
392+ def test_is_relative_to (self ):
393+ P = self .cls
394+ p = P ('a/b' )
395+ self .assertTrue (p .is_relative_to (P ('' )))
396+ self .assertTrue (p .is_relative_to (P ('a' )))
397+ self .assertTrue (p .is_relative_to (P ('a/b' )))
398+ self .assertFalse (p .is_relative_to (P ('c' )))
399+ self .assertFalse (p .is_relative_to (P ('a/b/c' )))
400+ self .assertFalse (p .is_relative_to (P ('a/c' )))
401+ self .assertFalse (p .is_relative_to (P ('/a' )))
402+ class Q (self .cls ):
403+ __eq__ = object .__eq__
404+ __hash__ = object .__hash__
405+ q = Q ('a/b' )
406+ self .assertTrue (q .is_relative_to (q ))
407+ self .assertFalse (q .is_relative_to (Q ('' )))
408+ self .assertFalse (q .is_relative_to (Q ('a' )))
409+ self .assertFalse (q .is_relative_to (Q ('a/b' )))
410+ self .assertFalse (q .is_relative_to (Q ('c' )))
411+
357412
358413class LexicalPathJoinTest (JoinTestBase , unittest .TestCase ):
359414 cls = LexicalPath
0 commit comments