@@ -815,3 +815,94 @@ def test_unicode_range() -> None:
815
815
assert "\u2029 \U0010AAAA\U00104444B\u205F ".strip() == "\U0010AAAA\U00104444B"
816
816
assert " \u3000\u205F ".strip() == ""
817
817
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