@@ -197,6 +197,25 @@ def test_constructor_common(self):
197197 self .assertEqual (P (P ('a' ), 'b' ), P ('a/b' ))
198198 self .assertEqual (P (P ('a' ), P ('b' )), P ('a/b' ))
199199
200+ def _check_str_subclass (self , * args ):
201+ # Issue #21127: it should be possible to construct a PurePath object
202+ # from an str subclass instance, and it then gets converted to
203+ # a pure str object.
204+ class StrSubclass (str ):
205+ pass
206+ P = self .cls
207+ p = P (* (StrSubclass (x ) for x in args ))
208+ self .assertEqual (p , P (* args ))
209+ for part in p .parts :
210+ self .assertIs (type (part ), str )
211+
212+ def test_str_subclass_common (self ):
213+ self ._check_str_subclass ('' )
214+ self ._check_str_subclass ('.' )
215+ self ._check_str_subclass ('a' )
216+ self ._check_str_subclass ('a/b.txt' )
217+ self ._check_str_subclass ('/a/b.txt' )
218+
200219 def test_join_common (self ):
201220 P = self .cls
202221 p = P ('a/b' )
@@ -690,6 +709,17 @@ def test_str(self):
690709 p = self .cls ('//a/b/c/d' )
691710 self .assertEqual (str (p ), '\\ \\ a\\ b\\ c\\ d' )
692711
712+ def test_str_subclass (self ):
713+ self ._check_str_subclass ('c:' )
714+ self ._check_str_subclass ('c:a' )
715+ self ._check_str_subclass ('c:a\\ b.txt' )
716+ self ._check_str_subclass ('c:\\ ' )
717+ self ._check_str_subclass ('c:\\ a' )
718+ self ._check_str_subclass ('c:\\ a\\ b.txt' )
719+ self ._check_str_subclass ('\\ \\ some\\ share' )
720+ self ._check_str_subclass ('\\ \\ some\\ share\\ a' )
721+ self ._check_str_subclass ('\\ \\ some\\ share\\ a\\ b.txt' )
722+
693723 def test_eq (self ):
694724 P = self .cls
695725 self .assertEqual (P ('c:a/b' ), P ('c:a/b' ))
0 commit comments