xref: /aosp_15_r20/external/llvm-libc/test/src/string/strtok_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for strtok ---------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/string/strtok.h"
10*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
11*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,NoTokenFound)12*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, NoTokenFound) {
13*71db0c75SAndroid Build Coastguard Worker   char empty[] = "";
14*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(empty, ""), nullptr);
15*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(empty, "_"), nullptr);
16*71db0c75SAndroid Build Coastguard Worker 
17*71db0c75SAndroid Build Coastguard Worker   char single[] = "_";
18*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(single, ""), "_");
19*71db0c75SAndroid Build Coastguard Worker 
20*71db0c75SAndroid Build Coastguard Worker   char multiple[] = "1,2";
21*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(multiple, ":"), "1,2");
22*71db0c75SAndroid Build Coastguard Worker }
23*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,DelimiterAsFirstCharacterShouldBeIgnored)24*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, DelimiterAsFirstCharacterShouldBeIgnored) {
25*71db0c75SAndroid Build Coastguard Worker   char src[] = ".123";
26*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, "."), "123");
27*71db0c75SAndroid Build Coastguard Worker }
28*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,DelimiterIsMiddleCharacter)29*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, DelimiterIsMiddleCharacter) {
30*71db0c75SAndroid Build Coastguard Worker   char src[] = "12,34";
31*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ","), "12");
32*71db0c75SAndroid Build Coastguard Worker }
33*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,DelimiterAsLastCharacterShouldBeIgnored)34*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, DelimiterAsLastCharacterShouldBeIgnored) {
35*71db0c75SAndroid Build Coastguard Worker   char src[] = "1234:";
36*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ":"), "1234");
37*71db0c75SAndroid Build Coastguard Worker }
38*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,MultipleDelimiters)39*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, MultipleDelimiters) {
40*71db0c75SAndroid Build Coastguard Worker   char src[] = "12,.34";
41*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, "."), "12,");
42*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ".,"), "12");
43*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ",."), "12");
44*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ":,."), "12");
45*71db0c75SAndroid Build Coastguard Worker }
46*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,ShouldNotGoPastNullTerminator)47*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, ShouldNotGoPastNullTerminator) {
48*71db0c75SAndroid Build Coastguard Worker   char src[] = {'1', '2', '\0', ',', '3'};
49*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ","), "12");
50*71db0c75SAndroid Build Coastguard Worker }
51*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,SubsequentCallsShouldFindFollowingDelimiters)52*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, SubsequentCallsShouldFindFollowingDelimiters) {
53*71db0c75SAndroid Build Coastguard Worker   char src[] = "12,34.56";
54*71db0c75SAndroid Build Coastguard Worker   char *token = LIBC_NAMESPACE::strtok(src, ",.");
55*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, "12");
56*71db0c75SAndroid Build Coastguard Worker   token = LIBC_NAMESPACE::strtok(nullptr, ",.");
57*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, "34");
58*71db0c75SAndroid Build Coastguard Worker   token = LIBC_NAMESPACE::strtok(nullptr, ",.");
59*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, "56");
60*71db0c75SAndroid Build Coastguard Worker   token = LIBC_NAMESPACE::strtok(nullptr, "_:,_");
61*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, nullptr);
62*71db0c75SAndroid Build Coastguard Worker   // Subsequent calls after hitting the end of the string should also return
63*71db0c75SAndroid Build Coastguard Worker   // nullptr.
64*71db0c75SAndroid Build Coastguard Worker   token = LIBC_NAMESPACE::strtok(nullptr, "_:,_");
65*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, nullptr);
66*71db0c75SAndroid Build Coastguard Worker }
67*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrTokTest,DelimitersShouldNotBeIncludedInToken)68*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrTokTest, DelimitersShouldNotBeIncludedInToken) {
69*71db0c75SAndroid Build Coastguard Worker   char src[] = "__ab__:_cd__:__ef__:__";
70*71db0c75SAndroid Build Coastguard Worker   char *token = LIBC_NAMESPACE::strtok(src, "_:");
71*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, "ab");
72*71db0c75SAndroid Build Coastguard Worker   token = LIBC_NAMESPACE::strtok(nullptr, ":_");
73*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, "cd");
74*71db0c75SAndroid Build Coastguard Worker   token = LIBC_NAMESPACE::strtok(nullptr, "_:,");
75*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, "ef");
76*71db0c75SAndroid Build Coastguard Worker   token = LIBC_NAMESPACE::strtok(nullptr, "_:,_");
77*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(token, nullptr);
78*71db0c75SAndroid Build Coastguard Worker }
79