@@ -2945,6 +2945,44 @@ def test_asutf8andsize(self):
29452945 self .assertEqual (unicode_asutf8andsize (nonbmp ), (b'\xf4 \x8f \xbf \xbf ' , 4 ))
29462946 self .assertRaises (UnicodeEncodeError , unicode_asutf8andsize , 'a\ud800 b\udfff c' )
29472947
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+
29482986 # Test PyUnicode_FindChar()
29492987 @support .cpython_only
29502988 @unittest .skipIf (_testcapi is None , 'need _testcapi module' )
0 commit comments