@@ -467,6 +467,46 @@ def test_bug_834676(self):
467467 # Check for bug 834676
468468 unicodedata .normalize ('NFC' , '\ud55c \uae00 ' )
469469
470+ def test_issue129569 (self ):
471+ # subclass of str
472+ class StrSub (str ):
473+ pass
474+
475+ # must always be str
476+ EARLY_RETURN_TYPE = str
477+ RETURN_TYPE = str
478+
479+ def NFC (s : str ):
480+ return unicodedata .normalize ("NFC" , s )
481+
482+ def NFKC (s : str ):
483+ return unicodedata .normalize ("NFKC" , s )
484+
485+ def NFD (s : str ):
486+ return unicodedata .normalize ("NFD" , s )
487+
488+ def NFKD (s : str ):
489+ return unicodedata .normalize ("NFKD" , s )
490+
491+ # normalized strings
492+ empty_str = ""
493+ self .assertEqual (len (StrSub (empty_str )), 0 )
494+ self .assertIs (type (NFKC (StrSub (empty_str ))), EARLY_RETURN_TYPE )
495+
496+ ascii_str = "ascii"
497+ self .assertTrue (StrSub (ascii_str ).isascii ())
498+ self .assertIs (type (NFC (StrSub (ascii_str ))), EARLY_RETURN_TYPE )
499+ self .assertIs (type (NFKC (StrSub (ascii_str ))), EARLY_RETURN_TYPE )
500+ self .assertIs (type (NFD (StrSub (ascii_str ))), EARLY_RETURN_TYPE )
501+ self .assertIs (type (NFKD (StrSub (ascii_str ))), EARLY_RETURN_TYPE )
502+
503+ # unnormalized strings
504+ s1 , s2 , s3 , s4 = "\u1e0b \u0323 " , "\ufb01 " , "\u1e69 " , "\u1e9b \u0323 "
505+ self .assertIs (type (NFC (StrSub (s1 ))), RETURN_TYPE )
506+ self .assertIs (type (NFKC (StrSub (s2 ))), RETURN_TYPE )
507+ self .assertIs (type (NFD (StrSub (s3 ))), RETURN_TYPE )
508+ self .assertIs (type (NFKD (StrSub (s4 ))), RETURN_TYPE )
509+
470510
471511if __name__ == "__main__" :
472512 unittest .main ()
0 commit comments