33import  unicodedata 
44import  unittest 
55import  urllib .parse 
6+ from  urllib .parse  import  urlparse , urlsplit , urlunparse , urlunsplit 
67
78RFC1808_BASE  =  "http://a/b/c/d;p?q#f" 
89RFC2396_BASE  =  "http://a/b/c/d;p?q" 
@@ -119,23 +120,50 @@ def _encode(self, s):
119120            return  tuple (self ._encode (x ) for  x  in  s )
120121        return  s 
121122
122-     def  checkRoundtrips (self , url , parsed , split , url2 = None ,  * ,  allow_none = True ):
123+     def  checkRoundtrips (self , url , parsed , split , url2 = None ):
123124        if  url2  is  None :
124125            url2  =  url 
125-         result  =  urllib .parse .urlparse (url , allow_none = allow_none )
126+         self .checkRoundtrips1 (url , parsed , split , allow_none = True )
127+         empty  =  url [:0 ]
128+         parsed  =  tuple (x  or  empty  for  x  in  parsed )
129+         split  =  tuple (x  or  empty  for  x  in  split )
130+         self .checkRoundtrips1 (url , parsed , split , url2 , allow_none = False )
131+ 
132+         result  =  urlparse (url , allow_none = True )
133+         self .assertEqual (urlunparse (result , keep_empty = False ), url2 )
134+         self .assertEqual (urlunparse (tuple (result ), keep_empty = False ), url2 )
135+         result  =  urlparse (url , allow_none = False )
136+         with  self .assertRaises (ValueError ):
137+             urlunparse (result , keep_empty = True )
138+         urlunparse (tuple (result ), keep_empty = True )
139+ 
140+         result  =  urlsplit (url , allow_none = True )
141+         self .assertEqual (urlunsplit (result , keep_empty = False ), url2 )
142+         self .assertEqual (urlunsplit (tuple (result ), keep_empty = False ), url2 )
143+         result  =  urlsplit (url , allow_none = False )
144+         with  self .assertRaises (ValueError ):
145+             urlunsplit (result , keep_empty = True )
146+         urlunsplit (tuple (result ), keep_empty = True )
147+ 
148+     def  checkRoundtrips1 (self , url , parsed , split , url2 = None , * , allow_none ):
149+         if  url2  is  None :
150+             url2  =  url 
151+         result  =  urlparse (url , allow_none = allow_none )
126152        self .assertSequenceEqual (result , parsed )
127153        t  =  (result .scheme , result .netloc , result .path ,
128-               result .params , result .query , result .fragment )
154+             result .params , result .query , result .fragment )
129155        self .assertSequenceEqual (t , parsed )
130156        # put it back together and it should be the same 
131-         result2  =  urllib .parse .urlunparse (result , keep_empty = allow_none )
132-         self .assertSequenceEqual (result2 , url2 )
133-         self .assertSequenceEqual (result2 , result .geturl (keep_empty = allow_none ))
157+         result2  =  urlunparse (result )
158+         self .assertEqual (result2 , url2 )
159+         self .assertEqual (result2 , result .geturl ())
160+         self .assertEqual (urlunparse (result , keep_empty = allow_none ), url2 )
161+         self .assertEqual (urlunparse (tuple (result ), keep_empty = allow_none ), result2 )
134162
135163        # the result of geturl() is a fixpoint; we can always parse it 
136164        # again to get the same result: 
137-         result3  =  urllib . parse . urlparse (result .geturl (keep_empty = allow_none ), allow_none = allow_none )
138-         self .assertEqual (result3 .geturl (keep_empty = allow_none ), result .geturl (keep_empty = allow_none ))
165+         result3  =  urlparse (result .geturl (), allow_none = allow_none )
166+         self .assertEqual (result3 .geturl (), result .geturl ())
139167        self .assertSequenceEqual (result3 , result )
140168        self .assertEqual (result3 .scheme ,   result .scheme )
141169        self .assertEqual (result3 .netloc ,   result .netloc )
@@ -149,18 +177,19 @@ def checkRoundtrips(self, url, parsed, split, url2=None, *, allow_none=True):
149177        self .assertEqual (result3 .port ,     result .port )
150178
151179        # check the roundtrip using urlsplit() as well 
152-         result  =  urllib . parse . urlsplit (url , allow_none = allow_none )
180+         result  =  urlsplit (url , allow_none = allow_none )
153181        self .assertSequenceEqual (result , split )
154182        t  =  (result .scheme , result .netloc , result .path ,
155-               result .query , result .fragment )
183+             result .query , result .fragment )
156184        self .assertSequenceEqual (t , split )
157-         result2  =  urllib .parse .urlunsplit (result , keep_empty = allow_none )
158-         self .assertSequenceEqual (result2 , url2 )
159-         self .assertSequenceEqual (result2 , result .geturl (keep_empty = allow_none ))
185+         result2  =  urlunsplit (result )
186+         self .assertEqual (result2 , url2 )
187+         self .assertEqual (result2 , result .geturl ())
188+         self .assertEqual (urlunsplit (tuple (result ), keep_empty = allow_none ), result2 )
160189
161190        # check the fixpoint property of re-parsing the result of geturl() 
162-         result3  =  urllib . parse . urlsplit (result .geturl (keep_empty = allow_none ), allow_none = allow_none )
163-         self .assertEqual (result3 .geturl (keep_empty = allow_none ), result .geturl (keep_empty = allow_none ))
191+         result3  =  urlsplit (result .geturl (), allow_none = allow_none )
192+         self .assertEqual (result3 .geturl (), result .geturl ())
164193        self .assertSequenceEqual (result3 , result )
165194        self .assertEqual (result3 .scheme ,   result .scheme )
166195        self .assertEqual (result3 .netloc ,   result .netloc )
@@ -288,32 +317,28 @@ def test_roundtrips(self):
288317            ]
289318        for  url , parsed , split  in  str_cases  +  bytes_cases :
290319            with  self .subTest (url ):
291-                 self .checkRoundtrips (url , parsed , split , allow_none = True )
292-                 empty  =  url [:0 ]
293-                 parsed  =  tuple (x  or  empty  for  x  in  parsed )
294-                 split  =  tuple (x  or  empty  for  x  in  split )
295-                 self .checkRoundtrips (url , parsed , split , allow_none = False )
320+                 self .checkRoundtrips (url , parsed , split )
296321
297322    def  test_roundtrips_normalization (self ):
298323        str_cases  =  [
299324            ('///path/to/file' ,
300-              '/// path/to/file' ,
325+              '/path/to/file' ,
301326             (None , '' , '/path/to/file' , None , None , None ),
302327             (None , '' , '/path/to/file' , None , None )),
303328            ('scheme:///path/to/file' ,
304-              'scheme:/// path/to/file' ,
329+              'scheme:/path/to/file' ,
305330             ('scheme' , '' , '/path/to/file' , None , None , None ),
306331             ('scheme' , '' , '/path/to/file' , None , None )),
307332            ('file:/tmp/junk.txt' ,
308-              'file:/tmp/junk.txt' ,
333+              'file:/// tmp/junk.txt' ,
309334             ('file' , None , '/tmp/junk.txt' , None , None , None ),
310335             ('file' , None , '/tmp/junk.txt' , None , None )),
311336            ('http:/tmp/junk.txt' ,
312-              'http:/tmp/junk.txt' ,
337+              'http:/// tmp/junk.txt' ,
313338             ('http' , None , '/tmp/junk.txt' , None , None , None ),
314339             ('http' , None , '/tmp/junk.txt' , None , None )),
315340            ('https:/tmp/junk.txt' ,
316-              'https:/tmp/junk.txt' ,
341+              'https:/// tmp/junk.txt' ,
317342             ('https' , None , '/tmp/junk.txt' , None , None , None ),
318343             ('https' , None , '/tmp/junk.txt' , None , None )),
319344        ]
@@ -371,9 +396,9 @@ def checkJoin(self, base, relurl, expected, *, relroundtrip=True):
371396                relurlb2  =  urllib .parse .urlunsplit (urllib .parse .urlsplit (relurlb ))
372397                self .assertEqual (urllib .parse .urljoin (baseb , relurlb2 ), expectedb )
373398
374-             relurl3  =  urllib .parse .urlunsplit (urllib .parse .urlsplit (relurl , allow_none = True ),  keep_empty = True )
399+             relurl3  =  urllib .parse .urlunsplit (urllib .parse .urlsplit (relurl , allow_none = True ))
375400            self .assertEqual (urllib .parse .urljoin (base , relurl3 ), expected )
376-             relurlb3  =  urllib .parse .urlunsplit (urllib .parse .urlsplit (relurlb , allow_none = True ),  keep_empty = True )
401+             relurlb3  =  urllib .parse .urlunsplit (urllib .parse .urlsplit (relurlb , allow_none = True ))
377402            self .assertEqual (urllib .parse .urljoin (baseb , relurlb3 ), expectedb )
378403
379404    def  test_unparse_parse (self ):
@@ -796,7 +821,7 @@ def _encode(t):
796821                        url  =  url .rstrip (hash )
797822                        if  frag  is  None :
798823                            frag  =  url [:0 ]
799-                     self .assertEqual (result .geturl (keep_empty = allow_none ), url )
824+                     self .assertEqual (result .geturl (), url )
800825                    self .assertEqual (result , (defrag , frag ))
801826                    self .assertEqual (result .url , defrag )
802827                    self .assertEqual (result .fragment , frag )
0 commit comments