@@ -815,3 +815,94 @@ def test_unicode_range() -> None:
815815 assert "\u2029 \U0010AAAA\U00104444B\u205F ".strip() == "\U0010AAAA\U00104444B"
816816 assert " \u3000\u205F ".strip() == ""
817817 assert "\u2029 \U00102865\u205F ".rstrip() == "\u2029 \U00102865"
818+
819+ [case testCount]
820+ # mypy: disable-error-code="attr-defined"
821+ def test_count() -> None:
822+ string = "abcbcb"
823+ assert string.count("a") == 1
824+ assert string.count("b") == 3
825+ assert string.count("c") == 2
826+ def test_count_start() -> None:
827+ string = "abcbcb"
828+ assert string.count("a", 2) == string.count("a", -4) == 0, (string.count("a", 2), string.count("a", -4))
829+ assert string.count("b", 2) == string.count("b", -4) == 2, (string.count("b", 2), string.count("b", -4))
830+ assert string.count("c", 2) == string.count("c", -4) == 2, (string.count("c", 2), string.count("c", -4))
831+ # out of bounds
832+ assert string.count("a", 8) == 0
833+ assert string.count("a", -8) == 1
834+ assert string.count("b", 8) == 0
835+ assert string.count("b", -8) == 3
836+ assert string.count("c", 8) == 0
837+ assert string.count("c", -8) == 2
838+ def test_count_start_end() -> None:
839+ string = "abcbcb"
840+ assert string.count("a", 0, 4) == 1, string.count("a", 0, 4)
841+ assert string.count("b", 0, 4) == 2, string.count("b", 0, 4)
842+ assert string.count("c", 0, 4) == 1, string.count("c", 0, 4)
843+ def test_count_multi() -> None:
844+ string = "aaabbbcccbbbcccbbb"
845+ assert string.count("aaa") == 1, string.count("aaa")
846+ assert string.count("bbb") == 3, string.count("bbb")
847+ assert string.count("ccc") == 2, string.count("ccc")
848+ def test_count_multi_start() -> None:
849+ string = "aaabbbcccbbbcccbbb"
850+ assert string.count("aaa", 6) == string.count("aaa", -12) == 0, (string.count("aaa", 6), string.count("aaa", -12))
851+ assert string.count("bbb", 6) == string.count("bbb", -12) == 2, (string.count("bbb", 6), string.count("bbb", -12))
852+ assert string.count("ccc", 6) == string.count("ccc", -12) == 2, (string.count("ccc", 6), string.count("ccc", -12))
853+ # out of bounds
854+ assert string.count("aaa", 20) == 0
855+ assert string.count("aaa", -20) == 1
856+ assert string.count("bbb", 20) == 0
857+ assert string.count("bbb", -20) == 3
858+ assert string.count("ccc", 20) == 0
859+ assert string.count("ccc", -20) == 2
860+ def test_count_multi_start_end() -> None:
861+ string = "aaabbbcccbbbcccbbb"
862+ assert string.count("aaa", 0, 12) == 1, string.count("aaa", 0, 12)
863+ assert string.count("bbb", 0, 12) == 2, string.count("bbb", 0, 12)
864+ assert string.count("ccc", 0, 12) == 1, string.count("ccc", 0, 12)
865+ def test_count_emoji() -> None:
866+ string = "π΄πΓ±πΓ±π"
867+ assert string.count("π΄") == 1, string.count("π΄")
868+ assert string.count("π") == 3, string.count("π")
869+ assert string.count("Γ±") == 2, string.count("Γ±")
870+ def test_count_start_emoji() -> None:
871+ string = "π΄πΓ±πΓ±π"
872+ assert string.count("π΄", 2) == string.count("π΄", -4) == 0, (string.count("π΄", 2), string.count("π΄", -4))
873+ assert string.count("π", 2) == string.count("π", -4) == 2, (string.count("π", 2), string.count("π", -4))
874+ assert string.count("Γ±", 2) == string.count("Γ±", -4) == 2, (string.count("Γ±", 2), string.count("Γ±", -4))
875+ # Out of bounds
876+ assert string.count("π΄", 8) == 0, string.count("π΄", 8)
877+ assert string.count("π΄", -8) == 1, string.count("π΄", -8)
878+ assert string.count("π", 8) == 0, string.count("π", 8)
879+ assert string.count("π", -8) == 3, string.count("π", -8)
880+ assert string.count("Γ±", 8) == 0, string.count("Γ±", 8)
881+ assert string.count("Γ±", -8) == 2, string.count("Γ±", -8)
882+ def test_count_start_end_emoji() -> None:
883+ string = "π΄πΓ±πΓ±π"
884+ assert string.count("π΄", 0, 4) == 1, string.count("π΄", 0, 4)
885+ assert string.count("π", 0, 4) == 2, string.count("π", 0, 4)
886+ assert string.count("Γ±", 0, 4) == 1, string.count("Γ±", 0, 4)
887+ def test_count_multi_emoji() -> None:
888+ string = "π΄π΄π΄πππΓ±Γ±Γ±πππΓ±Γ±Γ±πππ"
889+ assert string.count("π΄π΄π΄") == 1, string.count("π΄π΄π΄")
890+ assert string.count("πππ") == 3, string.count("πππ")
891+ assert string.count("Γ±Γ±Γ±") == 2, string.count("Γ±Γ±Γ±")
892+ def test_count_multi_start_emoji() -> None:
893+ string = "π΄π΄π΄πππΓ±Γ±Γ±πππΓ±Γ±Γ±πππ"
894+ assert string.count("π΄π΄π΄", 6) == string.count("π΄π΄π΄", -12) == 0, (string.count("π΄π΄π΄", 6), string.count("π΄π΄π΄", -12))
895+ assert string.count("πππ", 6) == string.count("πππ", -12) == 2, (string.count("πππ", 6), string.count("πππ", -12))
896+ assert string.count("Γ±Γ±Γ±", 6) == string.count("Γ±Γ±Γ±", -12) == 2, (string.count("Γ±Γ±Γ±", 6), string.count("Γ±Γ±Γ±", -12))
897+ # Out of bounds
898+ assert string.count("π΄π΄π΄", 20) == 0, string.count("π΄π΄π΄", 20)
899+ assert string.count("π΄π΄π΄", -20) == 1, string.count("π΄π΄π΄", -20)
900+ assert string.count("πππ", 20) == 0, string.count("πππ", 20)
901+ assert string.count("πππ", -20) == 3, string.count("πππ", -20)
902+ assert string.count("Γ±Γ±Γ±", 20) == 0, string.count("Γ±Γ±Γ±", 20)
903+ assert string.count("Γ±Γ±Γ±", -20) == 2, string.count("Γ±Γ±Γ±", -20)
904+ def test_count_multi_start_end_emoji() -> None:
905+ string = "π΄π΄π΄πππΓ±Γ±Γ±πππΓ±Γ±Γ±πππ"
906+ assert string.count("π΄π΄π΄", 0, 12) == 1, string.count("π΄π΄π΄", 0, 12)
907+ assert string.count("πππ", 0, 12) == 2, string.count("πππ", 0, 12)
908+ assert string.count("Γ±Γ±Γ±", 0, 12) == 1, string.count("Γ±Γ±Γ±", 0, 12)
0 commit comments