77import sys
88
99
10+ class MyIndexable (object ):
11+ def __init__ (self , value ):
12+ self .value = value
13+ def __index__ (self ):
14+ return self .value
15+
1016def test_find ():
1117 assert "teststring" .find ("test" ) == 0
1218 assert "teststring" .find ("string" ) == 4
@@ -23,6 +29,31 @@ def test_find():
2329 assert "teststring" .find ("tst" , None , 2 ) == - 1
2430 assert "teststring" .find ("st" , None , 4 ) == 2
2531
32+ s = 'ahoj cau nazadar ahoj'
33+ assert s .find ('ahoj' ) == 0
34+ assert s .find ('ahoj' , 4 ) == 17
35+ assert s .find ('ahoj' , - 3 ) == - 1
36+ assert s .find ('ahoj' , - 21 ) == 0
37+ assert s .find ('cau' , - 21 ) == 5
38+ assert s .find ('cau' , - 36 , - 10 ) == 5
39+ assert s .find ('cau' , None ) == 5
40+ assert s .find ('ahoj' , None ) == 0
41+ assert s .find ('cau' , None , 8 ) == 5
42+ assert s .find ('cau' , None , 7 ) == - 1
43+ assert s .find ('u' , 3 ) == 7
44+ assert s .find ('u' , 3 , 7 ) == - 1
45+ assert s .find ('u' , 3 , 8 ) == 7
46+ assert s .find ('u' , - 18 , - 13 ) == 7
47+ assert s .find ('u' , - 18 , - 12 ) == 7
48+ assert s .find ('u' , - 18 , - 14 ) == - 1
49+ assert s .find ('u' , - 14 , - 13 ) == 7
50+ assert s .find ('u' , - 12 , - 13 ) == - 1
51+ assert s .find ('cau' , MyIndexable (4 )) == 5
52+ assert s .find ('cau' , MyIndexable (5 )) == 5
53+ assert s .find ('cau' , MyIndexable (5 ), None ) == 5
54+ assert s .find ('cau' , MyIndexable (5 ), MyIndexable (8 )) == 5
55+ assert s .find ('cau' , None , MyIndexable (8 )) == 5
56+
2657
2758def test_rfind ():
2859 assert "test string test" .rfind ("test" ) == 12
@@ -34,6 +65,20 @@ def test_rfind():
3465 assert "test string test" .rfind ("test" , 4 , 14 ) == - 1
3566 assert "test string test" .rfind ("test" , None , 14 ) == 0
3667
68+ s = 'ahoj cau nazdar ahoj'
69+ assert s .rfind ('cau' , None , None ) == 5
70+ assert s .rfind ('cau' , - 25 , None ) == 5
71+ assert s .rfind ('cau' , - 25 , - 3 ) == 5
72+ assert s .rfind ('cau' , - 25 , - 12 ) == 5
73+ assert s .rfind ('cau' , - 25 , - 13 ) == - 1
74+ assert s .rfind ('cau' , - 15 , - 12 ) == 5
75+ assert s .rfind ('cau' , - 14 , - 12 ) == - 1
76+ assert s .rfind ('ahoj' , - 14 ) == 16
77+ assert s .rfind ('ahoj' , - 4 ) == 16
78+ assert s .rfind ('ahoj' , - 3 ) == - 1
79+ assert s .rfind ('ahoj' , 16 ) == 16
80+ assert s .rfind ('ahoj' , 16 , 20 ) == 16
81+ assert s .rfind ('ahoj' , 16 , 19 ) == - 1
3782
3883def test_format ():
3984 assert "{}.{}" .format ("part1" , "part2" ) == "part1.part2"
@@ -707,13 +752,6 @@ def test_zfill(self):
707752
708753 def test_zfill_specialization (self ):
709754 self .checkequal ('123' , '123' , 'zfill' , True )
710-
711- class MyIndexable (object ):
712- def __init__ (self , value ):
713- self .value = value
714- def __index__ (self ):
715- return self .value
716-
717755 self .checkequal ('0123' , '123' , 'zfill' , MyIndexable (4 ))
718756
719757 def test_title (self ):
@@ -774,6 +812,76 @@ def test_center_uni(self):
774812 self .assertEqual ('x' .center (4 , '\U0010FFFF ' ),
775813 '\U0010FFFF x\U0010FFFF \U0010FFFF ' )
776814
815+ # Whether the "contained items" of the container are integers in
816+ # range(0, 256) (i.e. bytes, bytearray) or strings of length 1
817+ # (str)
818+ contains_bytes = False
819+
820+ def test_count (self ):
821+ self .checkequal (3 , 'aaa' , 'count' , 'a' )
822+ self .checkequal (0 , 'aaa' , 'count' , 'b' )
823+ self .checkequal (3 , 'aaa' , 'count' , 'a' )
824+ self .checkequal (0 , 'aaa' , 'count' , 'b' )
825+ self .checkequal (3 , 'aaa' , 'count' , 'a' )
826+ self .checkequal (0 , 'aaa' , 'count' , 'b' )
827+ self .checkequal (0 , 'aaa' , 'count' , 'b' )
828+ self .checkequal (2 , 'aaa' , 'count' , 'a' , 1 )
829+ self .checkequal (0 , 'aaa' , 'count' , 'a' , 10 )
830+ self .checkequal (1 , 'aaa' , 'count' , 'a' , - 1 )
831+ self .checkequal (3 , 'aaa' , 'count' , 'a' , - 10 )
832+ self .checkequal (1 , 'aaa' , 'count' , 'a' , 0 , 1 )
833+ self .checkequal (3 , 'aaa' , 'count' , 'a' , 0 , 10 )
834+ self .checkequal (2 , 'aaa' , 'count' , 'a' , 0 , - 1 )
835+ self .checkequal (0 , 'aaa' , 'count' , 'a' , 0 , - 10 )
836+ self .checkequal (3 , 'aaa' , 'count' , '' , 1 )
837+ self .checkequal (1 , 'aaa' , 'count' , '' , 3 )
838+ self .checkequal (0 , 'aaa' , 'count' , '' , 10 )
839+ self .checkequal (2 , 'aaa' , 'count' , '' , - 1 )
840+ self .checkequal (4 , 'aaa' , 'count' , '' , - 10 )
841+
842+ self .checkequal (1 , '' , 'count' , '' )
843+ self .checkequal (0 , '' , 'count' , '' , 1 , 1 )
844+ self .checkequal (0 , '' , 'count' , '' , sys .maxsize , 0 )
845+
846+ self .checkequal (0 , '' , 'count' , 'xx' )
847+ self .checkequal (0 , '' , 'count' , 'xx' , 1 , 1 )
848+ self .checkequal (0 , '' , 'count' , 'xx' , sys .maxsize , 0 )
849+
850+ self .checkraises (TypeError , 'hello' , 'count' )
851+
852+ if self .contains_bytes :
853+ self .checkequal (0 , 'hello' , 'count' , 42 )
854+ else :
855+ self .checkraises (TypeError , 'hello' , 'count' , 42 )
856+
857+ # For a variety of combinations,
858+ # verify that str.count() matches an equivalent function
859+ # replacing all occurrences and then differencing the string lengths
860+ charset = ['' , 'a' , 'b' ]
861+ digits = 7
862+ base = len (charset )
863+ teststrings = set ()
864+ for i in range (base ** digits ):
865+ entry = []
866+ for j in range (digits ):
867+ i , m = divmod (i , base )
868+ entry .append (charset [m ])
869+ teststrings .add ('' .join (entry ))
870+ teststrings = [self .fixtype (ts ) for ts in teststrings ]
871+ for i in teststrings :
872+ n = len (i )
873+ for j in teststrings :
874+ r1 = i .count (j )
875+ if j :
876+ r2 , rem = divmod (n - len (i .replace (j , self .fixtype ('' ))),
877+ len (j ))
878+ else :
879+ r2 , rem = len (i )+ 1 , 0
880+ if rem or r1 != r2 :
881+ self .assertEqual (rem , 0 , '%s != 0 for %s' % (rem , i ))
882+ self .assertEqual (r1 , r2 , '%s != %s for %s' % (r1 , r2 , i ))
883+
884+
777885def test_same_id ():
778886 empty_ids = set ([id (str ()) for i in range (100 )])
779887 assert len (empty_ids ) == 1
0 commit comments