@@ -330,6 +330,75 @@ def test_relpath(self):
330330 tester ('ntpath.relpath("/a/b", "/a/b")' , '.' )
331331 tester ('ntpath.relpath("c:/foo", "C:/FOO")' , '.' )
332332
333+ def test_commonpath (self ):
334+ def check (paths , expected ):
335+ tester (('ntpath.commonpath(%r)' % paths ).replace ('\\ \\ ' , '\\ ' ),
336+ expected )
337+ def check_error (exc , paths ):
338+ self .assertRaises (exc , ntpath .commonpath , paths )
339+ self .assertRaises (exc , ntpath .commonpath ,
340+ [os .fsencode (p ) for p in paths ])
341+
342+ self .assertRaises (ValueError , ntpath .commonpath , [])
343+ check_error (ValueError , ['C:\\ Program Files' , 'Program Files' ])
344+ check_error (ValueError , ['C:\\ Program Files' , 'C:Program Files' ])
345+ check_error (ValueError , ['\\ Program Files' , 'Program Files' ])
346+ check_error (ValueError , ['Program Files' , 'C:\\ Program Files' ])
347+ check (['C:\\ Program Files' ], 'C:\\ Program Files' )
348+ check (['C:\\ Program Files' , 'C:\\ Program Files' ], 'C:\\ Program Files' )
349+ check (['C:\\ Program Files\\ ' , 'C:\\ Program Files' ],
350+ 'C:\\ Program Files' )
351+ check (['C:\\ Program Files\\ ' , 'C:\\ Program Files\\ ' ],
352+ 'C:\\ Program Files' )
353+ check (['C:\\ \\ Program Files' , 'C:\\ Program Files\\ \\ ' ],
354+ 'C:\\ Program Files' )
355+ check (['C:\\ .\\ Program Files' , 'C:\\ Program Files\\ .' ],
356+ 'C:\\ Program Files' )
357+ check (['C:\\ ' , 'C:\\ bin' ], 'C:\\ ' )
358+ check (['C:\\ Program Files' , 'C:\\ bin' ], 'C:\\ ' )
359+ check (['C:\\ Program Files' , 'C:\\ Program Files\\ Bar' ],
360+ 'C:\\ Program Files' )
361+ check (['C:\\ Program Files\\ Foo' , 'C:\\ Program Files\\ Bar' ],
362+ 'C:\\ Program Files' )
363+ check (['C:\\ Program Files' , 'C:\\ Projects' ], 'C:\\ ' )
364+ check (['C:\\ Program Files\\ ' , 'C:\\ Projects' ], 'C:\\ ' )
365+
366+ check (['C:\\ Program Files\\ Foo' , 'C:/Program Files/Bar' ],
367+ 'C:\\ Program Files' )
368+ check (['C:\\ Program Files\\ Foo' , 'c:/program files/bar' ],
369+ 'C:\\ Program Files' )
370+ check (['c:/program files/bar' , 'C:\\ Program Files\\ Foo' ],
371+ 'c:\\ program files' )
372+
373+ check_error (ValueError , ['C:\\ Program Files' , 'D:\\ Program Files' ])
374+
375+ check (['spam' ], 'spam' )
376+ check (['spam' , 'spam' ], 'spam' )
377+ check (['spam' , 'alot' ], '' )
378+ check (['and\\ jam' , 'and\\ spam' ], 'and' )
379+ check (['and\\ \\ jam' , 'and\\ spam\\ \\ ' ], 'and' )
380+ check (['and\\ .\\ jam' , '.\\ and\\ spam' ], 'and' )
381+ check (['and\\ jam' , 'and\\ spam' , 'alot' ], '' )
382+ check (['and\\ jam' , 'and\\ spam' , 'and' ], 'and' )
383+ check (['C:and\\ jam' , 'C:and\\ spam' ], 'C:and' )
384+
385+ check (['' ], '' )
386+ check (['' , 'spam\\ alot' ], '' )
387+ check_error (ValueError , ['' , '\\ spam\\ alot' ])
388+
389+ self .assertRaises (TypeError , ntpath .commonpath ,
390+ [b'C:\\ Program Files' , 'C:\\ Program Files\\ Foo' ])
391+ self .assertRaises (TypeError , ntpath .commonpath ,
392+ [b'C:\\ Program Files' , 'Program Files\\ Foo' ])
393+ self .assertRaises (TypeError , ntpath .commonpath ,
394+ [b'Program Files' , 'C:\\ Program Files\\ Foo' ])
395+ self .assertRaises (TypeError , ntpath .commonpath ,
396+ ['C:\\ Program Files' , b'C:\\ Program Files\\ Foo' ])
397+ self .assertRaises (TypeError , ntpath .commonpath ,
398+ ['C:\\ Program Files' , b'Program Files\\ Foo' ])
399+ self .assertRaises (TypeError , ntpath .commonpath ,
400+ ['Program Files' , b'C:\\ Program Files\\ Foo' ])
401+
333402 def test_sameopenfile (self ):
334403 with TemporaryFile () as tf1 , TemporaryFile () as tf2 :
335404 # Make sure the same file is really the same
0 commit comments