@@ -2945,6 +2945,44 @@ def test_asutf8andsize(self):
2945
2945
self .assertEqual (unicode_asutf8andsize (nonbmp ), (b'\xf4 \x8f \xbf \xbf ' , 4 ))
2946
2946
self .assertRaises (UnicodeEncodeError , unicode_asutf8andsize , 'a\ud800 b\udfff c' )
2947
2947
2948
+ # Test PyUnicode_Count()
2949
+ @support .cpython_only
2950
+ @unittest .skipIf (_testcapi is None , 'need _testcapi module' )
2951
+ def test_count (self ):
2952
+ from _testcapi import unicode_count
2953
+
2954
+ st = 'abcabd'
2955
+ self .assertEqual (unicode_count (st , 'a' , 0 , len (st )), 2 )
2956
+ self .assertEqual (unicode_count (st , 'ab' , 0 , len (st )), 2 )
2957
+ self .assertEqual (unicode_count (st , 'abc' , 0 , len (st )), 1 )
2958
+ self .assertEqual (unicode_count (st , 'а' , 0 , len (st )), 0 ) # cyrillic "a"
2959
+ # start < end
2960
+ self .assertEqual (unicode_count (st , 'a' , 3 , len (st )), 1 )
2961
+ self .assertEqual (unicode_count (st , 'a' , 4 , len (st )), 0 )
2962
+ self .assertEqual (unicode_count (st , 'a' , 0 , sys .maxsize ), 2 )
2963
+ # start >= end
2964
+ self .assertEqual (unicode_count (st , 'abc' , 0 , 0 ), 0 )
2965
+ self .assertEqual (unicode_count (st , 'a' , 3 , 2 ), 0 )
2966
+ self .assertEqual (unicode_count (st , 'a' , sys .maxsize , 5 ), 0 )
2967
+ # negative
2968
+ self .assertEqual (unicode_count (st , 'ab' , - len (st ), - 1 ), 2 )
2969
+ self .assertEqual (unicode_count (st , 'a' , - len (st ), - 3 ), 1 )
2970
+ # wrong args
2971
+ self .assertRaises (TypeError , unicode_count , 'a' , 'a' )
2972
+ self .assertRaises (TypeError , unicode_count , 'a' , 'a' , 1 )
2973
+ self .assertRaises (TypeError , unicode_count , 1 , 'a' , 0 , 1 )
2974
+ self .assertRaises (TypeError , unicode_count , 'a' , 1 , 0 , 1 )
2975
+ # empty string
2976
+ self .assertEqual (unicode_count ('abc' , '' , 0 , 3 ), 4 )
2977
+ self .assertEqual (unicode_count ('abc' , '' , 1 , 3 ), 3 )
2978
+ self .assertEqual (unicode_count ('' , '' , 0 , 1 ), 1 )
2979
+ self .assertEqual (unicode_count ('' , 'a' , 0 , 1 ), 0 )
2980
+ # different unicode kinds
2981
+ for uni in "\xa1 " , "\u8000 \u8080 " , "\ud800 \udc02 " , "\U0001f100 \U0001f1f1 " :
2982
+ for ch in uni :
2983
+ self .assertEqual (unicode_count (uni , ch , 0 , len (uni )), 1 )
2984
+ self .assertEqual (unicode_count (st , ch , 0 , len (st )), 0 )
2985
+
2948
2986
# Test PyUnicode_FindChar()
2949
2987
@support .cpython_only
2950
2988
@unittest .skipIf (_testcapi is None , 'need _testcapi module' )
0 commit comments