xref: /llvm-project/libc/test/src/string/strspn_test.cpp (revision b6bc9d72f65a5086f310f321e969d96e9a559e75)
1f3b41502Scgyurgyik //===-- Unittests for strspn ----------------------------------------------===//
2f3b41502Scgyurgyik //
3f3b41502Scgyurgyik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f3b41502Scgyurgyik // See https://llvm.org/LICENSE.txt for license information.
5f3b41502Scgyurgyik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f3b41502Scgyurgyik //
7f3b41502Scgyurgyik //===----------------------------------------------------------------------===//
8f3b41502Scgyurgyik 
9f3b41502Scgyurgyik #include "src/string/strspn.h"
10f3b41502Scgyurgyik 
11af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
12f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,EmptyStringShouldReturnZeroLengthSpan)131df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, EmptyStringShouldReturnZeroLengthSpan) {
14f3b41502Scgyurgyik   // The search should not include the null terminator.
15*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("", ""), size_t{0});
16*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("_", ""), size_t{0});
17*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("", "_"), size_t{0});
18f3b41502Scgyurgyik }
19f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,ShouldNotSpanAnythingAfterNullTerminator)201df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, ShouldNotSpanAnythingAfterNullTerminator) {
21f3b41502Scgyurgyik   const char src[4] = {'a', 'b', '\0', 'c'};
22*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "ab"), size_t{2});
23*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "c"), size_t{0});
24f3b41502Scgyurgyik 
25f3b41502Scgyurgyik   // Same goes for the segment to be searched for.
26f3b41502Scgyurgyik   const char segment[4] = {'1', '2', '\0', '3'};
27*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("123", segment), size_t{2});
28f3b41502Scgyurgyik }
29f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,SpanEachIndividualCharacter)301df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, SpanEachIndividualCharacter) {
31f3b41502Scgyurgyik   const char *src = "12345";
32*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "1"), size_t{1});
33f3b41502Scgyurgyik   // Since '1' is not within the segment, the span
34f3b41502Scgyurgyik   // size should remain zero.
35*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "2"), size_t{0});
36*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "3"), size_t{0});
37*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "4"), size_t{0});
38*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "5"), size_t{0});
39f3b41502Scgyurgyik }
40f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,UnmatchedCharacterShouldNotBeCountedInSpan)411df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, UnmatchedCharacterShouldNotBeCountedInSpan) {
42*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("a", "b"), size_t{0});
43*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("abcdef", "1"), size_t{0});
44*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("123", "4"), size_t{0});
45f3b41502Scgyurgyik }
46f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,SequentialCharactersShouldSpan)471df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, SequentialCharactersShouldSpan) {
48f3b41502Scgyurgyik   const char *src = "abcde";
49*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "a"), size_t{1});
50*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "ab"), size_t{2});
51*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "abc"), size_t{3});
52*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "abcd"), size_t{4});
53*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "abcde"), size_t{5});
54f3b41502Scgyurgyik   // Same thing for when the roles are reversed.
55*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("abcde", src), size_t{5});
56*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("abcd", src), size_t{4});
57*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("abc", src), size_t{3});
58*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("ab", src), size_t{2});
59*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("a", src), size_t{1});
60f3b41502Scgyurgyik }
61f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,NonSequentialCharactersShouldNotSpan)621df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, NonSequentialCharactersShouldNotSpan) {
63f3b41502Scgyurgyik   const char *src = "123456789";
64*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "_1_abc_2_def_3_"), size_t{3});
65f3b41502Scgyurgyik   // Only spans 4 since '5' is not within the span.
66*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn(src, "67__34abc12"), size_t{4});
67f3b41502Scgyurgyik }
68f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,ReverseCharacters)691df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, ReverseCharacters) {
70f3b41502Scgyurgyik   // Since these are still sequential, this should span.
71*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("12345", "54321"), size_t{5});
72f3b41502Scgyurgyik   // Does not span any since '1' is not within the span.
73*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("12345", "432"), size_t{0});
74f3b41502Scgyurgyik   // Only spans 1 since '2' is not within the span.
75*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("12345", "51"), size_t{1});
76f3b41502Scgyurgyik }
77f3b41502Scgyurgyik 
TEST(LlvmLibcStrSpnTest,DuplicatedCharactersToBeSearchedForShouldStillMatch)781df0dbfcSMichael Jones TEST(LlvmLibcStrSpnTest, DuplicatedCharactersToBeSearchedForShouldStillMatch) {
79f3b41502Scgyurgyik   // Only a single character, so only spans 1.
80*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("a", "aa"), size_t{1});
81f3b41502Scgyurgyik   // This should count once for each 'a' in the source string.
82*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("aa", "aa"), size_t{2});
83*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("aaa", "aa"), size_t{3});
84*b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::strspn("aaaa", "aa"), size_t{4});
85f3b41502Scgyurgyik }
86